dsh-tiddlywiki 0.16.28 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -30,7 +30,7 @@
30
30
  | 📤 **发送给 Agent** | TW 笔记工具栏一键把当前笔记注入所选 dsh 会话(可选工作模式/权限/附加说明) |
31
31
  | 🧭 **内嵌编辑器** | 中央列内嵌完整 TW 5 编辑器(同源代理,Tailscale/内网/域名/HTTPS 均可) |
32
32
  | 🗂️ **右侧边栏 Tab** | DSH 新右侧栏(rightbar):首页「TiddlyWiki 知识库」入口一键打开,与聊天并排;链接点击可直达(v0.16.21) |
33
- | 🧩 **Better Sidebar Tab** | dsh-better-sidebar 侧边栏:+ 菜单注册 TiddlyWiki tab,与聊天并排;链接点击可直达;未安装该插件自动跳过(v0.16.23) |
33
+ | 🧩 **Better Sidebar 共存** | 与 dsh-better-sidebar 侧边栏共存(其展开/收起按钮浮在 TW 面板之上);**不再向该侧边栏注册 TW tab**(v0.17.0 移除了 tab 注册,避免 tab kind 冲突) |
34
34
  | 📚 **会话知识库 Tab** | 每个会话顶部汇总本会话读写过的 wiki 笔记,TW 原生渲染(`/tw/render` 片段管线,v0.16.19) |
35
35
  | 📝 **快速笔记** | 输入框上方快捷按钮或右下角「知识库」FAB;原生编辑页或 Markdown 卡片两种模式;首页内置「快速记笔记(完整编辑器)」 |
36
36
  | 📌 **本地剪藏桥** | 可选「剪藏桥 + 书签小工具」:DSH 监听 127.0.0.1 端口接收剪藏请求(Host 校验防 rebinding),点书签弹出浮层——可改标题/编辑选中文字/**勾选图片**,一键写入知识库;文字成笔记(默认 `clip` 标签),图片由桥下载存为**二进制附件**(`type: image/*` + base64,笔记内 `[img[标题]]` 内嵌),随 wiki 自动进 git |
@@ -101,7 +101,7 @@ dsh plugin --profile web add link:/path/to/dsh-tiddlywiki
101
101
  - **📤 发送给 Agent**:TW 工具栏按钮(首次启动自动写入 wiki,ONE-SHOT)。弹层可选**附加说明**(位于消息末尾)、**工作模式**(Agent 预设)、**权限**(权限预设),按工作区分组选会话或新建。消息自带待办说明。
102
102
  - **🧭 中央列编辑器**:侧边栏「TiddlyWiki」开关(显示名可改 `ui.sidebarLabel`)。
103
103
  - **🗂️ 右侧边栏 Tab**(v0.16.21):DSH 新右侧栏展开后,首页会出现「**TiddlyWiki 知识库**」入口盒,点击即在右侧栏以 tab 形式打开完整 TW 编辑器——**与聊天并排**,适合边聊边查/边记。由 `ui.showRightbarTab` 控制(默认开);老版本 DSH(无右侧栏)自动跳过。
104
- - **🧩 Better Sidebar Tab**(v0.16.23):安装了 [dsh-better-sidebar](https://github.com/omdsh-dev/DSH-better-sidebar) 插件时,其侧边栏 **+ 菜单**会出现「TiddlyWiki 知识库」tab,点击即打开完整 TW 编辑器(同一套同源代理 iframe / 主题跟随 / 互斥协议,与右侧栏完全相同),**与聊天并排**。由 `ui.showBetterSidebarTab` 控制(默认开);未安装 Better Sidebar 自动跳过;Better Sidebar 自己的设置页也会为该 tab 提供独立的启用开关。**更新后刷新页面**即可看到入口。
104
+ - **🧩 Better Sidebar 共存**:装了 [dsh-better-sidebar](https://github.com/omdsh-dev/DSH-better-sidebar) 时,插件只做 UI 共存(中央 TW 面板的 z-index 自动压在其侧边栏展开/收起按钮之下,按钮始终可点)。**v0.17.0 起不再向 dsh-better-sidebar 注册「TiddlyWiki 知识库」tab**(旧版可用 `ui.showBetterSidebarTab` 关闭)——该 tab 的 kind 会与其它注册方冲突报 `tab kind "dsh-tiddlywiki" is already registered`。右侧边栏入口请用上面的 **右侧边栏 Tab**(DSH 原生 rightbar)。
105
105
  - **📝 快速笔记**:输入框上方快捷按钮(`ui.showQuickNoteDock`)或 FAB;`ui.quickNoteMode` 选打开方式——**native**(默认,直达 TW 原生编辑页,草稿自动续写)或 **card**(CodeMirror 6 Markdown 高亮、文件上传、多选 tag、草稿自动保存、「🕘 最近」载入、Ctrl+Enter 保存)。
106
106
  - **📌 本地剪藏桥**(可选,v0.16.24+/v0.16.25 支持图片):DSH 设置 → 常规配置 → 勾选「**启用本地剪藏桥**」(保存后立即生效)——DSH 即监听 `127.0.0.1:8618` 接收剪藏请求。浏览器书签栏新建书签,把知识库文档里的 JS 代码粘贴为地址,点一下弹出**浮层**:确认/修改标题与划线文字、勾选页面图片(封面自动标出)→「剪藏」即写入 wiki。文字成笔记(默认 `clip` 标签、正文含来源与选中文字、重名自动 `(2)` 去重);**图片由 DSH 本机下载字节存为二进制附件**(`clip-url`/`clip-note` 溯源字段,笔记内 `[img[标题]]` 内嵌展示;某张下载失败自动降级为链接),全部随 wiki 自动 git commit。「📚 插件文档」栏的 `本地剪藏桥(书签小工具)` seed 文档含完整步骤、书签代码、安全说明与 curl 用法。安全:桥只监听 127.0.0.1 + Host 白名单防 DNS rebinding;**强烈建议设 `bridge.token`**(非空时校验书签的 `x-clip-token` 头,防止任意网页往 wiki 里塞内容)。图片附件按设计不参与 `search`/`recent`(避免刷屏),`get` 只回元数据。
107
107
  - **🏠 首页(初始化 home-index 后)**:待办四象限(`todo` 标签 + `q` 字段拖放分类)+ 快速记笔记(完整编辑器,勾选「同时加入待办」即建任务)+「所有标签 / 所有文章」入口 +「📚 插件文档」栏(自动收录所有带 `dsh-docs` 标签的 seed 文档)。
@@ -265,7 +265,7 @@ src/
265
265
  ├── tool-views.ts # 回复流工具卡片(tool.call.toolview)
266
266
  ├── theme-sync.ts / panel.ts / sidebar-entry.ts / sync-button.ts / rightbar-tab.ts
267
267
  │ # 共享 TW iframe 机制在 tw-frame.ts(v0.16.23:lazy-load/status/主题/互斥/live-frame 路由);
268
- │ # better-sidebar-tab.ts 经 ctx.betterSidebar 注册 DSH Better Sidebar 的 TW tab(v0.16.23)
268
+ │ # TW tab 只注册在 DSH 原生右侧栏(rightbar-tab.ts)
269
269
  └── settings-page.ts / ui-config.ts / state.ts / styles.ts / toast.ts
270
270
  scripts/ # 构建/校验/再生成脚本
271
271
  docs/seed-initialization.md # seed 机制详解(权威)
@@ -278,6 +278,7 @@ lib/ # 预构建产物(发布含 lib/**,提交入库;
278
278
 
279
279
  > 最近几个主要版本的一句话记录(完整变更见 [Releases](https://github.com/bbqisbbq/dsh-tiddlywiki/releases) / git log)。
280
280
 
281
+ - **v0.17.0**(2026-09-10):**移除:DSH Better Sidebar(dsh-better-sidebar)Tab 集成**。旧版通过 `ctx.betterSidebar.registerTab({id:'dsh-tiddlywiki'})` 注册的 tab kind 会与其它注册方冲突,浏览器控制台报 `sidebarRight: tab kind "dsh-tiddlywiki" is already registered (extension)`;本版**整体删除**该注册路径(删除 `better-sidebar-tab.ts`、client 入口的挂载块,以及 `ui.showBetterSidebarTab` 配置项/设置页开关),插件不再引用 `ctx.betterSidebar` 服务。与 dsh-better-sidebar 的**界面共存**(中央面板 z-index 让位于其侧边栏按钮)保留;右侧边栏入口请用 DSH 原生 rightbar(`ui.showRightbarTab`)。**更新后刷新页面**生效;旧版可临时用 `ui.showBetterSidebarTab=false` 规避冲突。
281
282
  - **v0.16.28**(2026-09-10):**修:拖拽版剪藏书签在知乎等真实页面报 `SyntaxError: Unexpected token ';'`**。根因(真实 Chrome 实验证实):0.16.27 把书签 href 做 **HTML 实体转义**(`"`/`&`/`<`),但浏览器的 `a.href` **不做实体还原**——拖拽成书签后存的就是实体文本,执行时即解析失败。修复:href 改为 **percent-encoding**(`CLIP_BRIDGE_DRAG_HREF`,属性里只剩 `%XX`,天然无需任何属性转义);Chrome 执行 `javascript:` URL 前会 percent 解码(实测通过)。浏览器 E2E 升级为**直接以编码 href 走 `location.href` 执行**(完全等价拖拽书签的执行路径)并断言浮层弹出;静态验收改为 `decodeURIComponent(href) === 代码常量` 一致性校验。行为不变——**已拖过旧版书签的用户需重新初始化 seed 后重新拖一次**(旧书签仍然坏的,因为里面的代码是实体文本)。
282
283
  - **v0.16.27**(2026-09-10):**剪藏书签支持「拖拽安装」**。seed 文档新增一个**可拖拽按钮**(markdown 内嵌原始 HTML 锚点,href 即书签代码)——按住拖到浏览器书签栏/地址栏松手即装好,免去复制粘贴;代码 fence 保留作兜底。书签代码抽成单一常量 `CLIP_BRIDGE_BOOKMARKLET`(锚点 href 做 HTML 实体转义),并新增**同步一致性校验**(`verify-clip-bridge.mjs`:href 解码后与代码逐字相等)与**浏览器 E2E**(`verify-clip-bridge-browser.mjs`:真实 TW + 无头 Chrome 渲染真实 seed 文档,断言 javascript: href 原样保留 / draggable / 解码一致 / 真浏览器里执行书签弹出浮层 / 无 JS 异常)。
283
284
  - **v0.16.26**(2026-09-10):**修:剪藏书签在真实页面上崩溃**(`Cannot set properties of null (setting 'value')`)。根因:浮层字段在 `p` 尚未挂到 document 前就用 `document.getElementById` 取值(脱离文档树查不到 → null);同时 `cb_*` id 可能与页面自身元素冲突。修复:所有浮层字段改为 `p.querySelector` 作用域内查找 + 字段赋值挪到 `appendChild` 之后;并把书签放进 **jsdom 真实 DOM 端到端跑通**(浮层/填充/选图/提交载荷/结果态 12 项全过)作为验证,`verify-clip-bridge.mjs` 新增静态回归断言(禁未限定 getElementById + 挂载时序)。行为无变化,仅书签代码(seed 文档)修复。
@@ -670,6 +670,6 @@ html[data-dsh-tw-active] .dshDesktopConversationSurface > :not([data-dsh-tw-view
670
670
  \${}
671
671
  }`,{label:`enum`,detail:`definition`,type:`keyword`})]),Gm=new Qc,Km=new Set([`Script`,`Block`,`FunctionExpression`,`FunctionDeclaration`,`ArrowFunction`,`MethodDeclaration`,`ForStatement`]);function qm(e){return(t,n)=>{let r=t.node.getChild(`VariableDefinition`);return r&&n(r,e),!0}}const Jm=[`FunctionDeclaration`],Ym={FunctionDeclaration:qm(`function`),ClassDeclaration:qm(`class`),ClassExpression:()=>!0,EnumDeclaration:qm(`constant`),TypeAliasDeclaration:qm(`type`),NamespaceDeclaration:qm(`namespace`),VariableDefinition(e,t){e.matchContext(Jm)||t(e,`variable`)},TypeDefinition(e,t){t(e,`type`)},__proto__:null};function Xm(e,t){let n=Gm.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=Ym[t.name];if(e&&e(t,a)||Km.has(t.name))return!1}else if(t.to-t.from>8192){for(let n of Xm(e,t.node))r.push(n);return!1}}),Gm.set(t,r),r}const Zm=/^[\w$\xa1-\uffff][\w$\d\xa1-\uffff]*$/,Qm=[`TemplateString`,`String`,`RegExp`,`LineComment`,`BlockComment`,`VariableDefinition`,`TypeDefinition`,`Label`,`PropertyDefinition`,`PropertyName`,`PrivatePropertyDefinition`,`PrivatePropertyName`,`JSXText`,`JSXAttributeValue`,`JSXOpenTag`,`JSXCloseTag`,`JSXSelfClosingTag`,`.`,`?.`];function $m(e){let t=Y(e.state).resolveInner(e.pos,-1);if(Qm.indexOf(t.name)>-1)return null;let n=t.name==`VariableName`||t.to-t.from<20&&Zm.test(e.state.sliceDoc(t.from,t.to));if(!n&&!e.explicit)return null;let r=[];for(let n=t;n;n=n.parent)Km.has(n.name)&&(r=r.concat(Xm(e.state.doc,n)));return{options:r,from:n?t.from:e.pos,validFor:Zm}}const eh=Yl.define({name:`javascript`,parser:Hm.configure({props:[pu.add({IfStatement:Tu({except:/^\s*({|else\b)/}),TryStatement:Tu({except:/^\s*({|catch\b|finally\b)/}),LabeledStatement:wu,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:Su({closing:`}`}),ArrowFunction:e=>e.baseIndent+e.unit,"TemplateString BlockComment":()=>null,"Statement Property":Tu({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}}),Du.add({"Block ClassBody SwitchBody EnumBody ObjectExpression ArrayExpression ObjectType":Ou,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:`$`}}),th={test:e=>/^JSX/.test(e.name),facet:Gl({commentTokens:{block:{open:`{/*`,close:`*/}`}}})},nh=eh.configure({dialect:`ts`},`typescript`),rh=eh.configure({dialect:`jsx`,props:[Kl.add(e=>e.isTop?[th]:void 0)]}),ih=eh.configure({dialect:`jsx ts`,props:[Kl.add(e=>e.isTop?[th]:void 0)]},`typescript`);let ah=e=>({label:e,type:`keyword`});const oh=`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(ah),sh=oh.concat([`declare`,`implements`,`private`,`protected`,`public`].map(ah));function ch(e={}){let t=e.jsx?e.typescript?ih:rh:e.typescript?nh:eh,n=e.typescript?Wm.concat(sh):Um.concat(oh);return new au(t,[eh.data.of({autocomplete:$u(Qm,Qu(n))}),eh.data.of({autocomplete:$m}),e.jsx?fh:[]])}function lh(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 uh(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 dh=typeof navigator==`object`&&/Android\b/.test(navigator.userAgent),fh=H.inputHandler.of((e,t,n,r,i)=>{if((dh?e.composing:e.compositionStarted)||e.state.readOnly||t!=n||r!=`>`&&r!=`/`||!eh.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=uh(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=lh(n);if(r&&r.name==`JSXOpenTag`&&!/^\/?>|^<\//.test(o.doc.sliceString(t,t+2))&&(i=uh(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)}),ph=[`_blank`,`_self`,`_top`,`_parent`],mh=[`ascii`,`utf-8`,`utf-16`,`latin1`,`latin1`],hh=[`get`,`post`,`put`,`delete`],gh=[`application/x-www-form-urlencoded`,`multipart/form-data`,`text/plain`],_h=[`true`,`false`],Q={},vh={a:{attrs:{href:null,ping:null,type:null,media:null,target:ph,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:ph}},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:gh,formmethod:hh,formnovalidate:[`novalidate`],formtarget:ph,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":mh,autocomplete:[`on`,`off`],enctype:gh,method:hh,novalidate:[`novalidate`],target:ph}},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:gh,formmethod:hh,formnovalidate:[`novalidate`],formtarget:ph,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:mh,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:mh}},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},yh={accesskey:null,class:null,contenteditable:_h,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:_h,autocorrect:_h,autocapitalize:_h,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":_h,"aria-autocomplete":[`inline`,`list`,`both`,`none`],"aria-busy":_h,"aria-checked":[`true`,`false`,`mixed`,`undefined`],"aria-controls":null,"aria-describedby":null,"aria-disabled":_h,"aria-dropeffect":null,"aria-expanded":[`true`,`false`,`undefined`],"aria-flowto":null,"aria-grabbed":[`true`,`false`,`undefined`],"aria-haspopup":_h,"aria-hidden":_h,"aria-invalid":[`true`,`false`,`grammar`,`spelling`],"aria-label":null,"aria-labelledby":null,"aria-level":null,"aria-live":[`off`,`polite`,`assertive`],"aria-multiline":_h,"aria-multiselectable":_h,"aria-owns":null,"aria-posinset":null,"aria-pressed":[`true`,`false`,`mixed`,`undefined`],"aria-readonly":_h,"aria-relevant":null,"aria-required":_h,"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},bh=`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 bh)yh[e]=null;var xh=class{constructor(e,t){this.tags={...vh,...e},this.globalAttrs={...yh,...t},this.allTags=Object.keys(this.tags),this.globalAttrNames=Object.keys(this.globalAttrs)}};xh.default=new xh;function Sh(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 Ch(e,t=!1){for(;e;e=e.parent)if(e.name==`Element`)if(t)t=!1;else return e;return null}function wh(e,t,n){return n.tags[Sh(e,Ch(t))]?.children||n.allTags}function Th(e,t){let n=[];for(let r=Ch(t);r&&!r.type.isTop;r=Ch(r.parent)){let i=Sh(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 Eh=/^[:\-\.\w\u00b7-\uffff]*$/;function Dh(e,t,n,r,i){let a=/\s*>/.test(e.sliceDoc(i,i+5))?``:`>`,o=Ch(n,n.name==`StartTag`||n.name==`TagName`);return{from:r,to:i,options:wh(e.doc,o,t).map(e=>({label:e,type:`type`})).concat(Th(e.doc,n).map((e,t)=>({label:`/`+e,apply:`/`+e+a,type:`type`,boost:99-t}))),validFor:/^\/?[:\-\.\w\u00b7-\uffff]*$/}}function Oh(e,t,n,r){let i=/\s*>/.test(e.sliceDoc(r,r+5))?``:`>`;return{from:n,to:r,options:Th(e.doc,t).map((e,t)=>({label:e,apply:e+i,type:`type`,boost:99-t})),validFor:Eh}}function kh(e,t,n,r){let i=[],a=0;for(let r of wh(e.doc,n,t))i.push({label:`<`+r,type:`type`});for(let t of Th(e.doc,n))i.push({label:`</`+t+`>`,type:`type`,boost:99-a++});return{from:r,to:r,options:i,validFor:/^<\/?[:\-\.\w\u00b7-\uffff]*$/}}function Ah(e,t,n,r,i){let a=Ch(n),o=a?t.tags[Sh(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:Eh}}function jh(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=Ch(n),i=r?t.tags[Sh(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 Mh(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)?Oh(n,i,i.from,r):Dh(n,e,i,i.from,r):i.name==`StartTag`||i.name==`IncompleteTag`?Dh(n,e,i,r,r):i.name==`StartCloseTag`||i.name==`IncompleteCloseTag`?Oh(n,i,r,r):i.name==`OpenTag`||i.name==`SelfClosingTag`||i.name==`AttributeName`?Ah(n,e,i,i.name==`AttributeName`?i.from:r,r):i.name==`Is`||i.name==`AttributeValue`||i.name==`UnquotedAttributeValue`?jh(n,e,i,i.name==`Is`?r:i.from,r):t.explicit&&(a.name==`Element`||a.name==`Text`||a.name==`Document`)?kh(n,e,i,r):null}function Nh(e){return Mh(xh.default,e)}function Ph(e){let{extraTags:t,extraGlobalAttributes:n}=e,r=n||t?new xh(t,n):xh.default;return e=>Mh(r,e)}const Fh=eh.parser.configure({top:`SingleExpression`}),Ih=[{tag:`script`,attrs:e=>e.type==`text/typescript`||e.lang==`ts`,parser:nh.parser},{tag:`script`,attrs:e=>e.type==`text/babel`||e.type==`text/jsx`,parser:rh.parser},{tag:`script`,attrs:e=>e.type==`text/typescript-jsx`,parser:ih.parser},{tag:`script`,attrs(e){return/^(importmap|speculationrules|application\/(.+\+)?json)$/i.test(e.type)},parser:Fh},{tag:`script`,attrs(e){return!e.type||/^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^module$|^$/i.test(e.type)},parser:eh.parser},{tag:`style`,attrs(e){return(!e.lang||e.lang==`css`)&&(!e.type||/^(text\/)?(x-)?(stylesheet|css)$/i.test(e.type))},parser:Om.parser}],Lh=[{name:`style`,parser:Om.parser.configure({top:`Styles`})}].concat(bh.map(e=>({name:e,parser:eh.parser}))),Rh=Yl.define({name:`html`,parser:qp.configure({props:[pu.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}}),Du.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}}}),Iu.add({"OpenTag CloseTag":e=>e.getChild(`TagName`)})]}),languageData:{commentTokens:{block:{open:`<!--`,close:`-->`}},indentOnInput:/^\s*<\/\w+\W$/,wordChars:`-_`}}),zh=Rh.configure({wrap:Zp(Ih,Lh)});function Bh(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=Zp((e.nestedLanguages||[]).concat(Ih),(e.nestedAttributes||[]).concat(Lh))),new au(n?Rh.configure({wrap:n,dialect:t}):t?zh.configure({dialect:t}):zh,[zh.data.of({autocomplete:Ph(e)}),e.autoCloseTags===!1?[]:Uh,ch().support,km().support])}const Vh=new Set(`area base br col command embed frame hr img input keygen link meta param source track wbr menuitem`.split(` `));function Hh(e,t,n){for(;;){if(t.lastChild?.name!=`CloseTag`)return!1;let r=t.parent;if(!r||Sh(e,r)!=n)return!0;t=r}}const Uh=H.inputHandler.of((e,t,n,r,i)=>{if(e.composing||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 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=Sh(o.doc,t.parent,n))&&!Vh.has(a)&&!Hh(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=Sh(o.doc,e,n))&&!Vh.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)}),Wh=Gl({commentTokens:{block:{open:`<!--`,close:`-->`}}}),Gh=new U,Kh=Ef.configure({props:[Du.add(e=>!e.is(`Block`)||e.is(`Document`)||qh(e)!=null||Jh(e)?void 0:(e,t)=>({from:t.doc.lineAt(e.from).to,to:e.to})),Gh.add(qh),pu.add({Document:()=>null}),Wl.add({Document:Wh})]});function qh(e){let t=/^(?:ATX|Setext)Heading(\d)$/.exec(e.name);return t?+t[1]:void 0}function Jh(e){return e.name==`OrderedList`||e.name==`BulletList`}function Yh(e,t){let n=e;for(;;){let e=n.nextSibling,r;if(!e||(r=qh(e.type))!=null&&r<=t)break;n=e}return n.to}const Xh=Eu.of((e,t,n)=>{for(let r=Y(e).resolveInner(n,-1);r&&!(r.from<t);r=r.parent){let e=r.type.prop(Gh);if(e==null)continue;let t=Yh(r,e);if(t>n)return{from:n,to:t}}return null});function Zh(e){return new ql(Wh,e,[],`markdown`)}const Qh=Zh(Kh),$h=Zh(Kh.configure([Kf,Yf,Jf,Xf,{props:[Du.add({Table:(e,t)=>({from:t.doc.lineAt(e.from).to,to:e.to})})]}]));function eg(e,t){return n=>{if(n&&e){let t=null;if(n=/\S*/.exec(n)[0],t=typeof e==`function`?e(n):ou.matchLanguageName(e,n,!0),t instanceof ou)return t.support?t.support.language.parser:Ql.getSkippingParser(t.load());if(t)return t.parser}return t?t.parser:null}}var tg=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(+rg(this.item,e)[2]+t):``;return this.spaceBefore+n+this.type+this.spaceAfter}};function ng(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 tg(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 tg(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 tg(i.parent,s,s+t,a[1],e,n,i))}}return r}function rg(e,t){return/^(\s*)(\d+)(?=[.)])/.exec(t.sliceString(e.from,e.from+10))}function ig(e,t,n,r=0){for(let i=-1,a=e;;){if(a.name==`ListItem`){let e=rg(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 ag(e,t){let n=/^[ \t]*/.exec(e)[0].length;if(!n||t.facet(cu)!=` `)return e;let r=zn(e,4,n),i=``;for(let e=r;e>0;)e>=4?(i+=` `,e-=4):(i+=` `,e--);return i+e.slice(n)}const og=((e={})=>({state:t,dispatch:n})=>{let r=Y(t),{doc:i}=t,a=null,o=t.changeByRange(n=>{if(!n.empty||!$h.isActiveAt(t,n.from,-1)&&!$h.isActiveAt(t,n.from,1))return a={range:n};let o=n.from,s=i.lineAt(o),c=ng(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`&&ig(l.item,i,r,-2),e&&e.node.name==`OrderedList`&&ig(e.item,i,r),{range:j.cursor(t+n.length),changes:r}}else{let e=lg(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`&&ig(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?zn(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=ag(p,t),cg(l.node,t.doc)&&(p=lg(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 sg(e){return e.name==`QuoteMark`||e.name==`ListMark`}function cg(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 lg(e,t,n){let r=``;for(let t=0,i=e.length-2;t<=i;t++)r+=e[t].blank(t<i?zn(n.text,4,e[t+1].from)-r.length:null,t<i);return ag(r,t)}function ug(e,t){let n=e.resolveInner(t,-1),r=t;sg(n)&&(r=n.from,n=n.parent);for(let e;e=n.childBefore(r);)if(sg(e))r=e.from;else if(e.name==`OrderedList`||e.name==`BulletList`)n=e.lastChild,r=n.to;else break;return n}const dg=[{key:`Enter`,run:og},{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&&$h.isActiveAt(e,t.from)){let t=a.lineAt(i),r=ng(ug(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(zn(t.text,4,n.to)-zn(t.text,4,n.from));return r==t.from&&(i=ag(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)}}],fg=Bh({matchClosingTags:!1});function pg(e={}){let{codeLanguages:t,defaultCodeLanguage:n,addKeymap:r=!0,base:{parser:i}=Qh,completeHTMLTags:a=!0,pasteURLAsLink:o=!0,htmlTagLanguage:s=fg}=e;if(!(i instanceof $d))throw RangeError("Base parser provided to `markdown` should be a Markdown parser");let c=e.extensions?[e.extensions]:[],l=[s.support,Xh],u;o&&l.push(vg),n instanceof au?(l.push(n.support),u=n.language):n&&(u=n);let d=t||u?eg(t,u):void 0;c.push(Of({codeParser:d,htmlParser:s.language.parser})),r&&l.push(Vt.high($s.of(dg)));let f=Zh(i.configure(c));return a&&l.push(f.data.of({autocomplete:mg})),new au(f,l)}function mg(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:gg(),validFor:/^<[:\-\.\w\u00b7-\uffff]*$/}}let hg=null;function gg(){if(hg)return hg;let e=Nh(new Yu(P.create({extensions:fg}),0,!0));return hg=e?e.options:[]}const _g=/code|horizontalrule|html|link|comment|processing|escape|entity|image|mark|url/i,vg=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),!$h.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||_g.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)}}),yg=e=>{let{state:t}=e,n=t.doc.lineAt(t.selection.main.from),r=wg(e.state,n.from);return r.line?xg(e):r.block?Cg(e):!1};function bg(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 xg=bg(Og,0),Sg=bg(Dg,0),Cg=bg((e,t)=>Dg(e,t,Eg(t)),0);function wg(e,t){let n=e.languageDataAt(`commentTokens`,t,1);return n.length?n[0]:{}}function Tg(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 Eg(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 Dg(e,t,n=t.selection.ranges){let r=n.map(e=>wg(t,e.from).block);if(!r.every(e=>e))return null;let i=n.map((e,n)=>Tg(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 Og(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=wg(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 kg=nn.define(),Ag=nn.define(),jg=M.define(),Mg=M.define({combine(e){return bn(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)})}}),Ng=Rt.define({create(){return Zg.empty},update(e,t){let n=t.state.facet(Mg),r=t.annotation(kg);if(r){let i=Bg.fromTransaction(t,r.selection),a=r.side,o=a==0?e.undone:e.done;return o=i?Vg(o,o.length,n.minDepth,i):Kg(o,t.startState.selection),new Zg(a==0?r.rest:o,a==0?o:r.rest)}let i=t.annotation(Ag);if((i==`full`||i==`before`)&&(e=e.isolate()),t.annotation(on.addToHistory)===!1)return t.changes.empty?e:e.addMapping(t.changes.desc);let a=Bg.fromTransaction(t),o=t.annotation(on.time),s=t.annotation(on.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 Zg(e.done.map(Bg.fromJSON),e.undone.map(Bg.fromJSON))}});function Pg(e={}){return[Ng,Mg.of(e),H.domEventHandlers({beforeinput(e,t){let n=e.inputType==`historyUndo`?Ig:e.inputType==`historyRedo`?Lg:null;return n?(e.preventDefault(),n(t)):!1}})]}function Fg(e,t){return function({state:n,dispatch:r}){if(!t&&n.readOnly)return!1;let i=n.field(Ng,!1);if(!i)return!1;let a=i.pop(e,n,t);return a?(r(a),!0):!1}}const Ig=Fg(0,!1),Lg=Fg(1,!1),Rg=Fg(0,!0),zg=Fg(1,!0);var Bg=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&&St.fromJSON(t.changes),[],t.mapped&&xt.fromJSON(t.mapped),t.startSelection&&j.fromJSON(t.startSelection),t.selectionsAfter.map(j.fromJSON))}static fromTransaction(t,n){let r=Gg;for(let e of t.startState.facet(jg)){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,Gg)}static selection(t){return new e(void 0,Gg,void 0,void 0,t)}};function Vg(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 Hg(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 Ug(e,t){return e.ranges.length==t.ranges.length&&e.ranges.filter((e,n)=>e.empty!=t.ranges[n].empty).length===0}function Wg(e,t){return e.length?t.length?e.concat(t):e:t}const Gg=[];function Kg(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),Vg(e,e.length-1,1e9,n.setSelAfter(r)))}else return[Bg.selection([t])]}function qg(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 Jg(e,t){if(!e.length)return e;let n=e.length,r=Gg;for(;n;){let i=Yg(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?[Bg.selection(r)]:Gg}function Yg(e,t,n){let r=Wg(e.selectionsAfter.length?e.selectionsAfter.map(e=>e.map(t)):Gg,n);if(!e.changes)return Bg.selection(r);let i=e.changes.map(t),a=t.mapDesc(e.changes,!0),o=e.mapped?e.mapped.composeDesc(a):a;return new Bg(i,N.mapEffects(e.effects,t),o,e.startSelection.map(a),r)}const Xg=/^(input\.type|delete)($|\.)/;var Zg=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||Xg.test(r))&&(!s.selectionsAfter.length&&n-this.prevTime<i.newGroupDelay&&i.joinToEvent(a,Hg(s.changes,t.changes))||r==`input.type.compose`)?Vg(o,o.length-1,i.minDepth,new Bg(t.changes.compose(s.changes),Wg(N.mapEffects(t.effects,s.changes),s.effects),s.mapped,s.startSelection,Gg)):Vg(o,o.length,i.minDepth,t),new e(o,Gg,n,r)}addSelection(t,n,r,i){let a=this.done.length?this.done[this.done.length-1].selectionsAfter:Gg;return a.length>0&&n-this.prevTime<i&&r==this.prevUserEvent&&r&&/^select($|\.)/.test(r)&&Ug(a[a.length-1],t)?this:new e(Kg(this.done,t),this.undone,n,r)}addMapping(t){return new e(Jg(this.done,t),Jg(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:kg.of({side:e,rest:qg(r),selection:a}),userEvent:e==0?`select.undo`:`select.redo`,scrollIntoView:!0});if(i.changes){let n=r.length==1?Gg:r.slice(0,r.length-1);return i.mapped&&(n=Jg(n,i.mapped)),t.update({changes:i.changes,selection:i.startSelection,effects:i.effects,annotations:kg.of({side:e,rest:n,selection:a}),filter:!1,userEvent:e==0?`undo`:`redo`,scrollIntoView:!0})}else return null}};Zg.empty=new Zg(Gg,Gg);const Qg=[{key:`Mod-z`,run:Ig,preventDefault:!0},{key:`Mod-y`,mac:`Mod-Shift-z`,run:Lg,preventDefault:!0},{linux:`Ctrl-Shift-z`,run:Lg,preventDefault:!0},{key:`Mod-u`,run:Rg,preventDefault:!0},{key:`Alt-u`,mac:`Mod-Shift-u`,run:zg,preventDefault:!0}];function $g(e,t){return j.create(e.ranges.map(t),e.mainIndex)}function e_(e,t){return e.update({selection:t,scrollIntoView:!0,userEvent:`select`})}function t_({state:e,dispatch:t},n){let r=$g(e.selection,n);return r.eq(e.selection,!0)?!1:(t(e_(e,r)),!0)}function n_(e,t){return j.cursor(t?e.to:e.from)}function r_(e,t){return t_(e,n=>n.empty?e.moveByChar(n,t):n_(n,t))}function i_(e){return e.textDirectionAt(e.state.selection.main.head)==R.LTR}const a_=e=>r_(e,!i_(e)),o_=e=>r_(e,i_(e));function s_(e,t){return t_(e,n=>n.empty?e.moveByGroup(n,t):n_(n,t))}const c_=e=>s_(e,!i_(e)),l_=e=>s_(e,i_(e));typeof Intl<`u`&&Intl.Segmenter;function u_(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 d_(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;u_(e,t,i)?r=t:a=n?t.to:t.from}let a=r.type.prop(i),o,s;return s=a&&(o=n?zu(e,r.from,1):zu(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 f_=e=>t_(e,t=>d_(e.state,t,!i_(e))),p_=e=>t_(e,t=>d_(e.state,t,i_(e)));function m_(e,t){return t_(e,n=>{if(!n.empty)return n_(n,t);let r=e.moveVertically(n,t);return r.head==n.head?e.moveToLineBoundary(n,t):r})}const h_=e=>m_(e,!1),g_=e=>m_(e,!0);function __(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 v_(e,t){let n=__(e),{state:r}=e,i=$g(r.selection,r=>r.empty?e.moveVertically(r,t,n.height):n_(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(e_(r,i),{effects:a}),!0}const y_=e=>v_(e,!1),b_=e=>v_(e,!0);function x_(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 S_=e=>t_(e,t=>x_(e,t,!0)),C_=e=>t_(e,t=>x_(e,t,!1)),w_=e=>t_(e,t=>x_(e,t,!i_(e))),T_=e=>t_(e,t=>x_(e,t,i_(e))),E_=e=>t_(e,t=>j.cursor(e.lineBlockAt(t.head).from,1)),D_=e=>t_(e,t=>j.cursor(e.lineBlockAt(t.head).to,-1));function O_(e,t,n){let r=!1,i=$g(e.selection,t=>{let i=zu(e,t.head,-1)||zu(e,t.head,1)||t.head>0&&zu(e,t.head-1,1)||t.head<e.doc.length&&zu(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(e_(e,i)),!0):!1}const k_=({state:e,dispatch:t})=>O_(e,t,!1);function A_(e,t,n){let r=$g(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(e_(e.state,r)),!0)}function j_(e,t){return A_(e,t,n=>e.moveByChar(n,t))}const M_=e=>j_(e,!i_(e)),N_=e=>j_(e,i_(e));function P_(e,t){return A_(e,t,n=>e.moveByGroup(n,t))}const F_=e=>P_(e,!i_(e)),I_=e=>P_(e,i_(e)),L_=e=>{let t=!i_(e);return A_(e,t,n=>d_(e.state,n,t))},R_=e=>{let t=i_(e);return A_(e,t,n=>d_(e.state,n,t))};function z_(e,t){return A_(e,t,n=>e.moveVertically(n,t))}const B_=e=>z_(e,!1),V_=e=>z_(e,!0);function H_(e,t){return A_(e,t,n=>e.moveVertically(n,t,__(e).height))}const U_=e=>H_(e,!1),W_=e=>H_(e,!0),G_=e=>A_(e,!0,t=>x_(e,t,!0)),K_=e=>A_(e,!1,t=>x_(e,t,!1)),q_=e=>{let t=!i_(e);return A_(e,t,n=>x_(e,n,t))},J_=e=>{let t=i_(e);return A_(e,t,n=>x_(e,n,t))},Y_=e=>A_(e,!1,t=>j.cursor(e.lineBlockAt(t.head).from)),X_=e=>A_(e,!0,t=>j.cursor(e.lineBlockAt(t.head).to)),Z_=({state:e,dispatch:t})=>(t(e_(e,{anchor:0})),!0),Q_=({state:e,dispatch:t})=>(t(e_(e,{anchor:e.doc.length})),!0),$_=({state:e,dispatch:t})=>(t(e_(e,{anchor:e.selection.main.anchor,head:0})),!0),ev=({state:e,dispatch:t})=>(t(e_(e,{anchor:e.selection.main.anchor,head:e.doc.length})),!0),tv=({state:e,dispatch:t})=>(t(e.update({selection:{anchor:0,head:e.doc.length},userEvent:`select`})),!0),nv=({state:e,dispatch:t})=>{let n=xv(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},rv=({state:e,dispatch:t})=>{let n=$g(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(e_(e,n)),!0)};function iv(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(e_(n,j.create(i,i.length-1))),!0)}const av=e=>iv(e,!1),ov=e=>iv(e,!0),sv=({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(e_(e,r)),!0):!1};function cv(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=lv(e,o,!1)):o>i&&(n=`delete.forward`,o=lv(e,o,!0)),i=Math.min(i,o),a=Math.max(a,o)}else i=lv(e,i,!1),a=lv(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 lv(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 uv=(e,t,n)=>cv(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=zn(s,a.tabSize)%lu(a)||lu(a);for(let t=0;t<e&&s[s.length-1-t]==` `;t++)i--;c=i}else c=mt(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=mt(o.text,c-o.from,!1,!1)+o.from);return c}),dv=e=>uv(e,!1,!0),fv=e=>uv(e,!0,!1),pv=(e,t)=>cv(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=mt(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}),mv=e=>pv(e,!1),hv=e=>pv(e,!0),gv=e=>cv(e,t=>{let n=e.lineBlockAt(t.head).to;return t.head<n?n:Math.min(e.state.doc.length,t.head+1)}),_v=e=>cv(e,t=>{let n=e.moveToLineBoundary(t,!1).head;return t.head>n?n:Math.max(0,t.head-1)}),vv=e=>cv(e,t=>{let n=e.moveToLineBoundary(t,!0).head;return t.head<n?n:Math.min(e.state.doc.length,t.head+1)}),yv=({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},bv=({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:mt(r.text,n-r.from,!1)+r.from,a=n==r.to?n+1:mt(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 xv(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 Sv(e,t,n){if(e.readOnly)return!1;let r=[],i=[];for(let t of xv(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 Cv=({state:e,dispatch:t})=>Sv(e,t,!1),wv=({state:e,dispatch:t})=>Sv(e,t,!0);function Tv(e,t,n){if(e.readOnly)return!1;let r=[];for(let t of xv(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 Ev=({state:e,dispatch:t})=>Tv(e,t,!1),Dv=({state:e,dispatch:t})=>Tv(e,t,!0),Ov=e=>{if(e.state.readOnly)return!1;let{state:t}=e,n=t.changes(xv(t).map(({from:e,to:n})=>(e>0?e--:n<t.doc.length&&n++,{from:e,to:n}))),r=$g(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 kv(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 Av=Mv(!1),jv=Mv(!0);function Mv(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&&kv(t,r);e&&(r=i=(i<=a.to?a:t.doc.lineAt(i)).to);let s=new fu(t,{simulateBreak:r,simulateDoubleBreak:!!o}),c=du(s,r);for(c??=zn(/^\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=[``,uu(t,c)];return o&&l.push(uu(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 Nv(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 Pv=({state:e,dispatch:t})=>{if(e.readOnly)return!1;let n=Object.create(null),r=new fu(e,{overrideIndentation:e=>n[e]??-1}),i=Nv(e,(t,i,a)=>{let o=du(r,t.from);if(o==null)return;/\S/.test(t.text)||(o=0);let s=/^\s*/.exec(t.text)[0],c=uu(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},Fv=({state:e,dispatch:t})=>e.readOnly?!1:(t(e.update(Nv(e,(t,n)=>{n.push({from:t.from,insert:e.facet(cu)})}),{userEvent:`input.indent`})),!0),Iv=({state:e,dispatch:t})=>e.readOnly?!1:(t(e.update(Nv(e,(t,n)=>{let r=/^\s*/.exec(t.text)[0];if(!r)return;let i=zn(r,e.tabSize),a=0,o=uu(e,Math.max(0,i-lu(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),Lv=e=>(e.setTabFocusMode(),!0),Rv=[{key:`Ctrl-b`,run:a_,shift:M_,preventDefault:!0},{key:`Ctrl-f`,run:o_,shift:N_},{key:`Ctrl-p`,run:h_,shift:B_},{key:`Ctrl-n`,run:g_,shift:V_},{key:`Ctrl-a`,run:E_,shift:Y_},{key:`Ctrl-e`,run:D_,shift:X_},{key:`Ctrl-d`,run:fv},{key:`Ctrl-h`,run:dv},{key:`Ctrl-k`,run:gv},{key:`Ctrl-Alt-h`,run:mv},{key:`Ctrl-o`,run:yv},{key:`Ctrl-t`,run:bv},{key:`Ctrl-v`,run:b_}],zv=[{key:`ArrowLeft`,run:a_,shift:M_,preventDefault:!0},{key:`Mod-ArrowLeft`,mac:`Alt-ArrowLeft`,run:c_,shift:F_,preventDefault:!0},{mac:`Cmd-ArrowLeft`,run:w_,shift:q_,preventDefault:!0},{key:`ArrowRight`,run:o_,shift:N_,preventDefault:!0},{key:`Mod-ArrowRight`,mac:`Alt-ArrowRight`,run:l_,shift:I_,preventDefault:!0},{mac:`Cmd-ArrowRight`,run:T_,shift:J_,preventDefault:!0},{key:`ArrowUp`,run:h_,shift:B_,preventDefault:!0},{mac:`Cmd-ArrowUp`,run:Z_,shift:$_},{mac:`Ctrl-ArrowUp`,run:y_,shift:U_},{key:`ArrowDown`,run:g_,shift:V_,preventDefault:!0},{mac:`Cmd-ArrowDown`,run:Q_,shift:ev},{mac:`Ctrl-ArrowDown`,run:b_,shift:W_},{key:`PageUp`,run:y_,shift:U_},{key:`PageDown`,run:b_,shift:W_},{key:`Home`,run:C_,shift:K_,preventDefault:!0},{key:`Mod-Home`,run:Z_,shift:$_},{key:`End`,run:S_,shift:G_,preventDefault:!0},{key:`Mod-End`,run:Q_,shift:ev},{key:`Enter`,run:Av,shift:Av},{key:`Mod-a`,run:tv},{key:`Backspace`,run:dv,shift:dv,preventDefault:!0},{key:`Delete`,run:fv,preventDefault:!0},{key:`Mod-Backspace`,mac:`Alt-Backspace`,run:mv,preventDefault:!0},{key:`Mod-Delete`,mac:`Alt-Delete`,run:hv,preventDefault:!0},{mac:`Mod-Backspace`,run:_v,preventDefault:!0},{mac:`Mod-Delete`,run:vv,preventDefault:!0}].concat(Rv.map(e=>({mac:e.key,run:e.run,shift:e.shift}))),Bv=[{key:`Alt-ArrowLeft`,mac:`Ctrl-ArrowLeft`,run:f_,shift:L_},{key:`Alt-ArrowRight`,mac:`Ctrl-ArrowRight`,run:p_,shift:R_},{key:`Alt-ArrowUp`,run:Cv},{key:`Shift-Alt-ArrowUp`,run:Ev},{key:`Alt-ArrowDown`,run:wv},{key:`Shift-Alt-ArrowDown`,run:Dv},{key:`Mod-Alt-ArrowUp`,run:av},{key:`Mod-Alt-ArrowDown`,run:ov},{key:`Escape`,run:sv},{key:`Mod-Enter`,run:jv},{key:`Alt-l`,mac:`Ctrl-l`,run:nv},{key:`Mod-i`,run:rv,preventDefault:!0},{key:`Mod-[`,run:Iv},{key:`Mod-]`,run:Fv},{key:`Mod-Alt-\\`,run:Pv},{key:`Shift-Mod-k`,run:Ov},{key:`Shift-Mod-\\`,run:k_},{key:`Mod-/`,run:yg},{key:`Alt-A`,mac:`Ctrl-A`,run:Sg},{key:`Ctrl-m`,mac:`Shift-Alt-m`,run:Lv}].concat(zv),Vv=`var(--dsw-alias-brand-primary, #3e63dd)`,Hv=`color-mix(in srgb, var(--dsw-alias-brand-primary, #3e63dd) 55%, transparent)`,Uv=`var(--dsw-alias-label-dimmed, #999)`,Wv=`ui-monospace, "Cascadia Mono", Consolas, "SF Mono", Menlo, monospace`,Gv=ku.define([{tag:[J.heading1,J.heading2,J.heading3,J.heading4,J.heading5,J.heading6],color:Vv,fontWeight:`700`},{tag:J.processingInstruction,color:Hv},{tag:J.monospace,fontFamily:Wv,backgroundColor:`color-mix(in srgb, var(--dsw-alias-label-secondary, #888) 12%, transparent)`,borderRadius:`4px`,padding:`0 3px`},{tag:J.content,fontFamily:Wv,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:Vv,textDecoration:`underline`},{tag:J.url,color:Hv,textDecoration:`underline dotted`},{tag:J.quote,fontStyle:`italic`,color:`var(--dsw-alias-label-secondary, #888)`},{tag:J.contentSeparator,color:Uv,textDecoration:`line-through`},{tag:J.comment,color:Uv}]);function Kv(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,Pg(),pg({base:$h}),Nu(Gv),hc(),Cc(e.placeholder??``),$s.of([...Bv,...Qg,{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?``:`
672
672
  `}${e}\n`;n.dispatch({changes:{from:t,insert:r},selection:{anchor:t+r.length},scrollIntoView:!0}),n.focus()},focus:()=>n.focus()}}const qv=`dsh-tw-note-state`,Jv=`dsh-tw-note-draft-v1`;function Yv(){try{let e=localStorage.getItem(Jv);if(e===null)return null;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}}catch{return null}}function Xv(e){try{localStorage.setItem(Jv,JSON.stringify(e))}catch{}}function Zv(){try{localStorage.removeItem(Jv)}catch{}}function Qv(e){return e<10?`0${e}`:String(e)}function $v(e=new Date){return`${e.getFullYear()}-${Qv(e.getMonth()+1)}-${Qv(e.getDate())} ${Qv(e.getHours())}:${Qv(e.getMinutes())}`}function ey(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 ty(){let e={showQuickNote:!0,defaultTag:`inbox`};try{let t=await fetch(f,{signal:AbortSignal.timeout(5e3)});if(!t.ok)return e;let n=await t.json();return{showQuickNote:n.ui?.showQuickNote!==!1,defaultTag:n.note?.tag??`inbox`}}catch{return e}}function ny(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=()=>(f??=fetch(`/dsh-tiddlywiki/tags`,{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),m=()=>{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.addEventListener(`mousedown`,t=>{t.preventDefault(),l(e)}),i.append(t)}i.hidden=t.length===0};r.addEventListener(`focus`,()=>{p().then(m)}),r.addEventListener(`input`,()=>{d.length===0?p().then(m):m()}),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 h=e=>{t.contains(e.target)||o()};return document.addEventListener(`click`,h,!0),{el:t,getTags:()=>(u(),[...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`,h,!0)}}async function ry(e,t){if(e.size>67108864){O(`文件过大(≤ 64MB)`);return}try{let n=await fetch(`/dsh-tiddlywiki/upload?name=${encodeURIComponent(e.name)}`,{method:`POST`,headers:{"content-type":e.type||`application/octet-stream`},body:e,signal:AbortSignal.timeout(12e4)}),r=await n.json().catch(()=>null);if(!n.ok||r?.ok!==!0){O(`上传失败:${r?.error??`HTTP ${n.status}`}`);return}let i=r.name??e.name,a=e.type.startsWith(`image/`)?`![${i}](${r.url})`:`[${i}](${r.url})`;t.insertAtCaret(a),O(`已上传「${i}」并插入链接`)}catch(e){O(`上传失败:${e instanceof Error?e.message:String(e)}`)}}function iy(){let e,t=!1,n=!1,r=`inbox`,i,a=!1,o=e=>{try{window.dispatchEvent(new CustomEvent(qv,{detail:{open:e}}))}catch{}},s=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`},c=()=>{e!==void 0&&(e.titleInput.value=$v())},l=()=>{t||!n||e===void 0||(i!==void 0&&(clearTimeout(i),i=void 0),i=window.setTimeout(()=>{if(i=void 0,e===void 0)return;let t=e.editor.getValue(),n=e.titleInput.value.trim();if(t.trim().length===0&&n.length===0){Zv();return}Xv({text:t,title:n,tags:e.tagEditor.getTags(),savedAt:Date.now()})},500))},u=()=>{e!==void 0&&(e.draftBanner.hidden=!0)},d=async(e,t,n)=>{try{let r=await fetch(`/dsh-tiddlywiki/edit`,{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);return!r.ok||i?.ok!==!0?(O(`打开失败:${i?.error??`HTTP ${r.status}`}`),!1):typeof i.twUrl!=`string`||typeof i.draftTitle!=`string`?(O(`打开失败:服务未返回编辑器地址`),!1):(Zv(),u(),Ve(`${new URL(i.twUrl,location.origin).href}#${encodeURIComponent(i.draftTitle)}`,i.title??e),O(`已在弹出窗口打开「${i.title??e}」编辑器`),!0)}catch(e){return O(`打开失败:${e instanceof Error?e.message:String(e)}`),!1}},f=()=>{a=!1,e!==void 0&&(e.recentWrap.hidden=!0)},p=async t=>{try{let n=await fetch(`/dsh-tiddlywiki/get?title=${encodeURIComponent(t)}`,{signal:AbortSignal.timeout(1e4)}),r=await n.json().catch(()=>null);if(!n.ok||r?.ok!==!0||typeof r.title!=`string`){O(`读取失败:${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??[]),u(),f(),O(`已载入「${r.title}」`),e.editor.focus()}catch(e){O(`读取失败:${e instanceof Error?e.message:String(e)}`)}},m=()=>{if(e===void 0)return;if(a){f();return}a=!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(`/dsh-tiddlywiki/recent?limit=15`,{signal:AbortSignal.timeout(1e4)})).json().catch(()=>null);if(!a||e===void 0)return;e.recentWrap.replaceChildren();let n=t?.ok===!0?t.items??[]:[];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;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=[ey(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`,()=>{p(t.title)}),e.recentWrap.append(n)}}catch(t){if(!a||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)}})()},h=()=>{if(e!==void 0)return;let t=document.createElement(`div`);t.className=`dsh-tw-note`,t.hidden=!0;let r=document.createElement(`div`);r.className=`dsh-tw-note-card`;let i=document.createElement(`div`);i.className=`dsh-tw-note-head`;let a=document.createElement(`span`);a.className=`dsh-tw-note-label`,a.textContent=`📝 快速笔记`;let s=document.createElement(`button`);s.type=`button`,s.className=`dsh-tw-note-close`,s.title=`收起`,s.textContent=`✕`,i.append(a,s);let c=document.createElement(`div`);c.className=`dsh-tw-note-draft`,c.hidden=!0;let p=document.createElement(`span`);p.className=`dsh-tw-note-draft-text`,p.textContent=`已恢复未保存草稿`;let h=document.createElement(`button`);h.type=`button`,h.className=`dsh-tw-note-draft-discard`,h.textContent=`丢弃`,c.append(p,h);let g=document.createElement(`div`);g.className=`dsh-tw-note-fields`;let _=document.createElement(`input`);_.className=`dsh-tw-note-title`,_.placeholder=`标题(默认时间戳)`;let v=ny({onChange:l});g.append(_,v.el),_.addEventListener(`input`,l);let y,b=Kv({placeholder:`写点东西… Markdown 高亮,可 📎/拖入文件
673
- Ctrl+Enter 保存`,onSave:()=>{y?.()},onChange:l}),x=document.createElement(`button`);x.type=`button`,x.className=`dsh-tw-note-upload`,x.title=`上传文件到 wiki 并插入 Markdown 链接(也可直接拖入编辑器)`,x.textContent=`📎 上传`;let S=document.createElement(`input`);S.type=`file`,S.multiple=!0,S.hidden=!0,x.addEventListener(`click`,()=>{S.click()}),S.addEventListener(`change`,()=>{for(let e of Array.from(S.files??[]))ry(e,b);S.value=``});let C=0;b.el.addEventListener(`dragenter`,e=>{e.preventDefault(),C++,b.el.classList.add(`dsh-tw-note-drop`)}),b.el.addEventListener(`dragover`,e=>{e.preventDefault()}),b.el.addEventListener(`dragleave`,e=>{e.preventDefault(),C=Math.max(0,C-1),C===0&&b.el.classList.remove(`dsh-tw-note-drop`)}),b.el.addEventListener(`drop`,e=>{e.preventDefault(),C=0,b.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))ry(e,b)});let ee=document.createElement(`div`);ee.className=`dsh-tw-note-foot`;let w=document.createElement(`div`);w.className=`dsh-tw-note-foot-left`;let te=document.createElement(`span`);te.className=`dsh-tw-note-hint`,te.textContent=`Ctrl+Enter`;let T=document.createElement(`button`);T.type=`button`,T.className=`dsh-tw-note-recent-btn`,T.title=`最近修改的笔记,点击载入继续编辑`,T.textContent=`🕘 最近`,T.addEventListener(`click`,m),w.append(x,T,te);let ne=document.createElement(`div`);ne.className=`dsh-tw-note-foot-right`;let E=document.createElement(`button`);E.type=`button`,E.className=`dsh-tw-note-edit`,E.title=`保存并在 TiddlyWiki 原生编辑器中打开`,E.textContent=`✏️ 在 TW 中编辑`;let D=document.createElement(`button`);D.type=`button`,D.className=`dsh-tw-note-save`,D.textContent=`保存`,ne.append(E,D),ee.append(w,ne);let re=document.createElement(`div`);re.className=`dsh-tw-note-recent`,re.hidden=!0,r.append(i,c,g,b.el,ee),t.append(r,re),document.body.append(t),e={root:t,card:r,editor:b,titleInput:_,tagEditor:v,saveBtn:D,editBtn:E,draftBanner:c,recentBtn:T,recentWrap:re};let ie=()=>{n=!1,t.hidden=!0,f(),o(!1)},ae=()=>{Zv(),u(),b.setValue(``),_.value=$v(),v.setTags([]),ie()},oe=!1;y=async()=>{if(oe)return;let e=b.getValue().trim();if(e.length===0){O(`内容为空,未保存`);return}oe=!0,D.disabled=!0,D.textContent=`保存中…`;try{let t=await fetch(`/dsh-tiddlywiki/note`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({title:_.value.trim(),tags:v.getTags(),text:e}),signal:AbortSignal.timeout(1e4)}),n=await t.json().catch(()=>null);if(!t.ok||n?.ok!==!0){O(`保存失败:${n?.error??`HTTP ${t.status}`}`);return}ae(),O(`已保存「${n.title??_.value}」`)}catch(e){O(`保存失败:${e instanceof Error?e.message:String(e)}`)}finally{oe=!1,D.disabled=!1,D.textContent=`保存`}},D.addEventListener(`click`,()=>{y?.()});let se=async()=>{let e=_.value.trim().length>0?_.value.trim():$v(),t=b.getValue(),n=v.getTags();E.disabled=!0,E.textContent=`打开中…`;try{await d(e,t,n)}finally{E.disabled=!1,E.textContent=`✏️ 在 TW 中编辑`}};E.addEventListener(`click`,()=>{se()}),s.addEventListener(`click`,ie);let ce=null,le=(e,n)=>{let i=window.innerWidth,a=window.innerHeight,o=r.offsetWidth||340,s=r.offsetHeight||260,c=Math.min(Math.max(e,8),Math.max(8,i-o-8)),l=Math.min(Math.max(n,8),Math.max(8,a-s-8));t.style.right=`auto`,t.style.bottom=`auto`,t.style.left=`${c}px`,t.style.top=`${l}px`};i.addEventListener(`pointerdown`,e=>{if(s.contains(e.target))return;e.preventDefault();let n=t.getBoundingClientRect();ce={startX:e.clientX,startY:e.clientY,origLeft:n.left,origTop:n.top,moved:!1};try{i.setPointerCapture(e.pointerId)}catch{}i.classList.add(`dsh-tw-note-head-dragging`)}),i.addEventListener(`pointermove`,e=>{if(ce===null)return;let t=e.clientX-ce.startX,n=e.clientY-ce.startY;!ce.moved&&Math.abs(t)<4&&Math.abs(n)<4||(ce.moved=!0,le(ce.origLeft+t,ce.origTop+n))});let ue=e=>{if(ce!==null){try{i.releasePointerCapture(e.pointerId)}catch{}ce=null,i.classList.remove(`dsh-tw-note-head-dragging`)}};i.addEventListener(`pointerup`,ue),i.addEventListener(`pointercancel`,ue),h.addEventListener(`click`,()=>{Zv(),u(),b.setValue(``),_.value=$v(),v.setTags([]),O(`已丢弃草稿`)})};return{async open(i){if(t||(h(),e===void 0||n))return;n=!0,e.root.hidden=!1,s(i),o(!0);let a=Yv();if(a!==null&&(a.text.trim().length>0||a.title.trim().length>0))e.editor.setValue(a.text),e.titleInput.value=a.title,e.tagEditor.setTags(a.tags),e.draftBanner.hidden=!1;else{if(c(),r=(await ty()).defaultTag,t||e===void 0)return;e.tagEditor.setDefault(r)}e!==void 0&&e.editor.focus()},close(){e!==void 0&&(n=!1,e.root.hidden=!0,f(),o(!1))},async toggle(){n?this.close():await this.open()},async openNative(){if(t)return;let e=Yv(),n=e!==null&&(e.text.trim().length>0||e.title.trim().length>0),i=n&&e.title.trim().length>0?e.title.trim():$v(),a=n?e.text:``,o=[];if(n)o=e.tags;else{if(r=(await ty()).defaultTag,t)return;o=[r]}d(i,a,o)},isOpen(){return n},dispose(){t=!0,i!==void 0&&(clearTimeout(i),i=void 0),e?.tagEditor.dispose(),e?.editor.view.destroy(),e?.root.remove(),document.querySelector(`.dsh-tw-toast`)?.remove(),e=void 0}}}function ay(e){return e<10?`0${e}`:String(e)}function oy(e){return`${ay(e.getHours())}:${ay(e.getMinutes())}`}async function sy(){try{let e=await fetch(f,{signal:AbortSignal.timeout(8e3)});return e.ok?await e.json():null}catch{return null}}function cy(e,t){let n=e?.git,r=[`同步知识库`],i=`offline`,a=`离线`;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`,a=`待提交`,r.push(`有 ${n.dirtyFiles?.length??0} 个未提交改动`)):e>0?(i=`behind`,a=`可更新`):(i=`clean`,a=`已同步`)}return t!==void 0&&r.push(`上次同步 ${oy(t)}`),{state:i,label:a,tooltip:r.join(` · `),...t===void 0?{}:{lastSync:t}}}function ly(){let e={state:`offline`,label:`离线`,tooltip:`同步知识库`},t,n,r=!1,i=!1,a=new Set,o=()=>{for(let e of[...a])e()},s=n=>{let r=cy(n,t);(r.state!==e.state||r.tooltip!==e.tooltip)&&(e=r,o())},c=async()=>{i||s(await sy())};return c(),n=window.setInterval(()=>{c()},3e4),{getState:()=>e,trigger:async()=>{if(i||r)return e;r=!0,e={...e,state:`syncing`,label:`同步中…`},o();try{let e=await fetch(`/dsh-tiddlywiki/sync`,{method:`POST`,signal:AbortSignal.timeout(12e4)}),n=await e.json().catch(()=>null);if(t=new Date,n===null||n.ok!==!0)O(`同步失败:${n?.error??n?.message??`HTTP ${e.status}`}`);else{let e=``;n.push&&n.push!==`nothing to commit`&&(e=`(${n.push})`),n.changed===!0&&(e+=n.restarted===!0?`,TW 已重启`:`,TW 未自动重启`,n.restartError&&(e+=`(${n.restartError})`)),O(`同步完成:${n.message??`OK`}${e}`)}await c()}catch(e){O(`同步失败:${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()}}}const uy={showQuickNoteDock:!0,quickNoteMode:`native`,sidebarLabel:`TiddlyWiki`,tabLabel:`知识库`,showSessionTab:!0,showRightbarTab:!0,showBetterSidebarTab:!0};let dy;async function fy(e={}){let t=Date.now();if(!e.force&&dy!==void 0&&t-dy.at<15e3)return dy.value;try{let e=await fetch(f,{signal:AbortSignal.timeout(5e3)});if(!e.ok)return uy;let t=await e.json(),n={showQuickNoteDock:t.ui?.showQuickNoteDock!==!1,quickNoteMode:t.ui?.quickNoteMode===`card`?`card`:`native`,sidebarLabel:typeof t.ui?.sidebarLabel==`string`&&t.ui.sidebarLabel.trim().length>0?t.ui.sidebarLabel.trim():`TiddlyWiki`,tabLabel:typeof t.ui?.tabLabel==`string`&&t.ui.tabLabel.trim().length>0?t.ui.tabLabel.trim():`知识库`,showSessionTab:t.ui?.showSessionTab!==!1,showRightbarTab:t.ui?.showRightbarTab!==!1,showBetterSidebarTab:t.ui?.showBetterSidebarTab!==!1};return dy={at:Date.now(),value:n},n}catch{return uy}}async function py(){try{let e=await fetch(f,{signal:AbortSignal.timeout(5e3)});if(!e.ok)return{showQuickNote:!0,showPanelStatus:!0,showSyncButton:!0};let t=await e.json();return{showQuickNote:t.ui?.showQuickNote!==!1,showPanelStatus:t.ui?.showPanelStatus!==!1,showSyncButton:t.ui?.showSyncButton!==!1}}catch{return{showQuickNote:!0,showPanelStatus:!0,showSyncButton:!0}}}async function my(){try{let e=await fetch(f,{signal:AbortSignal.timeout(8e3)});if(!e.ok)return{state:`failed`,text:`状态不可达`,logs:[]};let t=await e.json(),n=Array.isArray(t.logs)?t.logs.filter(e=>typeof e==`string`):[];return t.status===`running`?{state:`running`,text:`TW 在线 · ${t.url??``}`,logs:n}:t.status===`starting`?{state:`starting`,text:`TW 启动中…`,logs:n}:{state:`failed`,text:t.error??`TW 状态:${t.status??`?`}`,logs:n}}catch{return{state:`failed`,text:`状态不可达`,logs:[]}}}function hy(e,t,n){let r=!1,i,a,o,s,c,l,u,d,f=!1,p={state:`unknown`,text:`TiddlyWiki 服务…`,logs:[]},m=()=>{f=!1,s!==void 0&&(s.hidden=!0),u!==void 0&&(u.hidden=!0)},h=e=>{if(!f)return;let t=e.target;i!==void 0&&i.contains(t)||m()},g=()=>{if(u===void 0)return;let e=[`TiddlyWiki 服务:${p.text}`];e.push(`知识库同步:${n.getState().tooltip}`),p.logs.length>0&&(e.push(`最近日志:`),e.push(...p.logs.slice(-3))),u.textContent=e.join(`
674
- `)},_=()=>{let e=n.getState();o!==void 0&&(o.dataset.state=e.state),a!==void 0&&(a.title=`知识库 · ${e.tooltip}`),g()},v=async()=>{p=await my(),!r&&(c!==void 0&&(c.textContent=p.text),l!==void 0&&(l.dataset.state=p.state),g())},y=p=>{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,p.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`,()=>{g(),u!==void 0&&(u.hidden=!1)}),e.addEventListener(`mouseleave`,()=>{u!==void 0&&(u.hidden=!0)}),s.append(e)}if(p.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`,()=>{m(),fy().then(e=>{e.quickNoteMode===`native`?t.openNative():t.open()})}),s.append(e)}if(p.showPanelStatus){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`,()=>{m(),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`,()=>{m(),document.dispatchEvent(new CustomEvent(Ce)),v()}),s.append(n)}if(p.showSyncButton){let e=document.createElement(`button`);e.type=`button`,e.className=`dsh-tw-fab-item`,e.textContent=`🔁 同步`,e.addEventListener(`click`,()=>{m(),n.trigger()}),s.append(e)}a=document.createElement(`button`),a.type=`button`,a.className=`dsh-tw-fab`,a.setAttribute(`aria-label`,`TiddlyWiki 知识库`);let y=document.createElement(`span`);y.className=`dsh-tw-fab-icon`,y.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(y,o),a.addEventListener(`click`,()=>{if(s!==void 0){if(f){m();return}f=!0,s.hidden=!1,_(),v()}}),i.append(s,a),document.body.append(i),_(),document.addEventListener(`click`,h,!0)},b=e.subscribe(()=>{d!==void 0&&(d.textContent=e.isOpen()?`收起 TW 面板`:`打开 TW 面板`)}),x=n.subscribe(_);return(async()=>{let e=await py();r||!e.showQuickNote&&!e.showPanelStatus&&!e.showSyncButton||y(e)})(),()=>{r=!0,document.removeEventListener(`click`,h,!0),b(),x(),i?.remove()}}function gy(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=e=>{let t=e.detail;n(t?.open===!0)};return window.addEventListener(qv,e),fy().then(e=>i(e.quickNoteMode)),()=>window.removeEventListener(qv,e)},[]),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);e.style.paddingRight!==`${a}px`&&(e.style.paddingRight=`${a}px`)};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=window.setInterval(n,1500),s=window.setTimeout(n,120),c=window.setTimeout(n,600);return()=>{r.disconnect(),window.removeEventListener(`resize`,n),document.removeEventListener(`visibilitychange`,n),window.clearInterval(o),window.clearTimeout(s),window.clearTimeout(c)}},[]);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:()=>{fy().then(t=>{t.quickNoteMode===`native`?He()?Ue():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)))}}const _y=`知识库`;let vy=_y;function yy(e){vy=typeof e==`string`&&e.trim().length>0?e.trim():_y}function by(){return vy}async function xy(e){try{let t=await fetch(`/dsh-tiddlywiki/tw/render`,{method:`POST`,headers:{"content-type":`application/json`,"x-requested-with":`TiddlyWiki`},body:JSON.stringify({title:e}),signal:AbortSignal.timeout(15e3)});if(!t.ok)return null;let n=await t.text();return n.length>0?n:null}catch{return null}}async function Sy(e){try{let t=await fetch(`${p}?title=${encodeURIComponent(e)}`,{signal:AbortSignal.timeout(8e3)});return t.status!==404&&(await t.json().catch(()=>null))?.notFound!==!0}catch{return!0}}function Cy(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(``),m=c.useRef(0),h=c.useRef(0),g=c.useRef(!1),_=c.useCallback(async()=>{let e=++m.current;if(a(`loading`),typeof t!=`string`||t.length===0){a(`error`),f(`缺少会话 ID`);return}try{let n=await fetch(`/dsh-tiddlywiki/session/summary`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({session:t}),signal:AbortSignal.timeout(25e3)}),r=await n.json().catch(()=>null);if(e!==m.current)return;if(!n.ok||r?.ok!==!0){a(`error`),f(r?.error??`HTTP ${n.status}`);return}if(typeof r.title!=`string`||r.title.length===0){a(`error`),f(`汇总生成失败:缺少标题`);return}u(r.title);let i=await xy(r.title);if(e!==m.current)return;if(i===null){let t=await Sy(r.title);if(e!==m.current)return;if(!t){if(g.current){a(`error`),f(`汇总条目不存在,自动重建失败,请重试`);return}g.current=!0,h.current++,_();return}a(`error`),f(`渲染失败:wiki 渲染服务不可用(/tw/render)`);return}g.current=!1,h.current=0,s(i),a(`ready`)}catch(t){if(e!==m.current)return;a(`error`),f(t instanceof Error?t.message:String(t))}},[t]);c.useEffect(()=>{_()},[_]),c.useEffect(()=>{if(i!==`ready`||l===null)return;let e=window.setInterval(()=>{(async()=>{let e=!1;try{let t=await fetch(`${p}?title=${encodeURIComponent(l)}`,{signal:AbortSignal.timeout(8e3)}),n=await t.json().catch(()=>null);e=t.status!==404&&n?.notFound!==!0}catch{return}e?h.current=0:(h.current++,h.current<3&&_())})()},3e4);return()=>window.clearInterval(e)},[i,l,_]),c.useEffect(()=>{n!=null&&r?.()},[n,r]);let v=()=>{_()},y;return y=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:v},`重试`)):c.createElement(`div`,{className:`dsh-tw-summary-native dsh-tw-toolcard-native`,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:v,disabled:i===`loading`,title:`重新生成并刷新汇总`},`🔄 刷新`)),y)}function wy(e,t){if(!(e===void 0||t.showSessionTab===!1))return yy(t.tabLabel),e.inject(`conversation.view`,()=>e.register({name:`conversation.view`,id:`dsh-tiddlywiki-summary`,order:20,label:by},Cy))}const Ty=`/dsh-tiddlywiki/admin/info`,Ey=`/dsh-tiddlywiki/admin/seeds/run`;function $(e,t,n){let r=document.createElement(e);return t!==void 0&&(r.className=t),n!==void 0&&(r.textContent=n),r}async function Dy(e,t){let n=await fetch(e,{...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 Oy(e){let t=!1;e.classList.add(`dsh-tw-settings`);let n=$(`div`,`dsh-tw-settings-row dsh-tw-settings-status`),r=$(`div`,`dsh-tw-settings-body`);e.append(n,r);let i=[],a=async()=>{try{let e=await Dy(`/dsh-tiddlywiki/admin/state`);if(t)return;ky(n,e,a),Ny(r,e,a)}catch(e){if(t)return;r.replaceChildren(),n.replaceChildren();let i=$(`div`,`dsh-tw-settings-error`,`加载配置失败:${e instanceof Error?e.message:String(e)}`),o=$(`button`,`dsh-tw-settings-btn`,`重试`);o.type=`button`,o.addEventListener(`click`,()=>{a()}),r.append(i,o)}};return a(),i.push(()=>{t=!0,e.replaceChildren(),e.classList.remove(`dsh-tw-settings`)}),()=>{for(let e of i.splice(0))e()}}function ky(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?.dirty===!0?`有未提交改动`:``].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(`/dsh-tiddlywiki/sync`,{method:`POST`,signal:AbortSignal.timeout(12e4)}),t=await e.json().catch(()=>null);if(!e.ok||t?.ok!==!0)O(`同步失败:${t?.error??t?.message??`HTTP ${e.status}`}`);else{let e=``;t.changed===!0&&(e+=t.restarted===!0?`,TW 已重启`:`,TW 未自动重启`,t.restartError&&(e+=`(${t.restartError})`)),O(`同步完成:${t.message??`OK`}${e}`)}}catch(e){O(`同步失败:${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 Dy(`/dsh-tiddlywiki/admin/restart`,{method:`POST`}),O(`TW 已重启`)}catch(e){O(`重启失败:${e instanceof Error?e.message:String(e)}`)}finally{c.disabled=!1,c.textContent=`重启 TW`,n()}})()}),e.append(a,o,s,c)}function Ay(e,t,n){let r=$(`section`,`dsh-tw-settings-section`);r.append($(`h3`,`dsh-tw-settings-h`,`常规配置`));let i=t.note??{},a=t.git??{},o=t.ui??{},s=[],c=(e,t,n)=>{let i=$(`input`,`dsh-tw-settings-input`);i.value=n;let a=$(`label`,`dsh-tw-settings-field`);a.append($(`span`,`dsh-tw-settings-label`,t),i),s.push({key:e,input:i,initial:n,read:()=>i.value.trim(),changed:()=>i.value.trim()!==n}),r.append(a)},l=(e,t,n)=>{let i=$(`input`,`dsh-tw-settings-check`);i.type=`checkbox`,i.checked=n;let a=$(`label`,`dsh-tw-settings-field dsh-tw-settings-field-check`);a.append(i,$(`span`,`dsh-tw-settings-label`,t)),s.push({key:e,input:i,initial:n,read:()=>i.checked,changed:()=>i.checked!==n}),r.append(a)},u=(e,t,n)=>{let i=$(`input`,`dsh-tw-settings-input`);i.type=`number`,i.value=String(n);let a=$(`label`,`dsh-tw-settings-field`);a.append($(`span`,`dsh-tw-settings-label`,t),i),s.push({key:e,input:i,initial:n,read:()=>Number(i.value)||n,changed:()=>(Number(i.value)||n)!==n}),r.append(a)};c(`note.tag`,`快速笔记默认 tag`,typeof i.tag==`string`?i.tag:`inbox`),l(`git.autoCommit`,`自动 commit(防抖)`,a.autoCommit!==!1),u(`git.debounceMs`,`自动 commit 防抖(ms)`,typeof a.debounceMs==`number`?a.debounceMs:6e4),c(`git.remote`,`git 远端(空=仅本地)`,typeof a.remote==`string`?a.remote:``),c(`git.branch`,`git 分支`,typeof a.branch==`string`?a.branch:`main`),l(`ui.showQuickNote`,`显示「知识库」按钮里的「快速笔记」入口`,o.showQuickNote!==!1),l(`ui.showQuickNoteDock`,`显示聊天输入框上方的「快速笔记」快捷按钮`,o.showQuickNoteDock!==!1),((e,t,n,i)=>{let a=$(`select`,`dsh-tw-settings-input`);for(let e of i){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`);o.append($(`span`,`dsh-tw-settings-label`,t),a),s.push({key:e,input:a,initial:n,read:()=>a.value,changed:()=>a.value!==n}),r.append(o)})(`ui.quickNoteMode`,`点击「快速笔记」的打开方式`,typeof o.quickNoteMode==`string`&&o.quickNoteMode===`card`?`card`:`native`,[{value:`native`,label:`原生编辑器:直接弹出 TW 原生编辑页(新建/恢复草稿)`},{value:`card`,label:`Markdown 卡片:弹出现有快速笔记卡片(CodeMirror 编辑器)`}]),c(`ui.sidebarLabel`,`侧边栏 TW 入口显示名称`,typeof o.sidebarLabel==`string`&&o.sidebarLabel.trim().length>0?o.sidebarLabel.trim():`TiddlyWiki`),l(`ui.showPanelStatus`,`显示「知识库」按钮里的 TW 面板/重载入口与状态行`,o.showPanelStatus!==!1),l(`ui.showSyncButton`,`显示「知识库」按钮里的「同步」入口与 git 状态点`,o.showSyncButton!==!1),l(`ui.followDshTheme`,`嵌入式 TW 跟随 DSH 深浅主题(暗色时自动切深色 palette,不写回 wiki)`,o.followDshTheme!==!1),c(`ui.darkPalette`,`暗色时 TW palette(tiddler 标题)`,typeof o.darkPalette==`string`&&o.darkPalette.trim().length>0?o.darkPalette.trim():`$:/palettes/CupertinoDark`),c(`ui.tabLabel`,`会话顶部「知识库」Tab 名称`,typeof o.tabLabel==`string`&&o.tabLabel.trim().length>0?o.tabLabel.trim():`知识库`),l(`ui.showSessionTab`,`显示会话顶部「知识库」Tab(本会话相关 wiki 笔记汇总)`,o.showSessionTab!==!1),l(`ui.showRightbarTab`,`在 DSH 右侧边栏提供 TiddlyWiki 入口/Tab(与聊天并排)`,o.showRightbarTab!==!1),l(`ui.showBetterSidebarTab`,`在 DSH Better Sidebar 侧边栏提供 TiddlyWiki Tab(与聊天并排)`,o.showBetterSidebarTab!==!1);let d=o.sendToAgent??{};l(`ui.sendToAgent.enabled`,`启用「发送给 Agent」(TW 笔记 → DSH 会话注入)`,d.enabled!==!1),c(`ui.sendToAgent.endpoint`,`TW 端请求基址(空=自动取当前 DSH origin)`,typeof d.endpoint==`string`?d.endpoint:``),c(`ui.sendToAgent.token`,`共享 token(非空时路由校验 x-send-to-agent-token 头)`,typeof d.token==`string`?d.token:``);let f=o.allArticles??{};u(`ui.allArticles.pageSize`,`「所有文章」每页条数`,typeof f.pageSize==`number`?f.pageSize:10);let p=t.bridge??{};l(`bridge.enabled`,`启用「本地剪藏桥」(书签小工具后端监听 127.0.0.1 端口,保存后立即生效)`,p.enabled===!0),u(`bridge.port`,`剪藏桥端口(改端口需重启 dsh web 生效)`,typeof p.port==`number`&&p.port>0?p.port:8618),c(`bridge.token`,`剪藏桥 token(非空时校验书签的 x-clip-token 头;强烈建议设置)`,typeof p.token==`string`?p.token:``),c(`bridge.tag`,`剪藏笔记默认 tag`,typeof p.tag==`string`&&p.tag.trim().length>0?p.tag.trim():`clip`);let m=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`保存配置`);m.type=`button`,m.addEventListener(`click`,()=>{m.disabled=!0,(async()=>{let e={};for(let t of s){if(!t.changed())continue;let n=t.key.split(`.`),r=e;for(let e=0;e<n.length;e++){let i=n[e];if(i===void 0)break;if(e===n.length-1)r[i]=t.read();else{let e=r[i]??{};r[i]=e,r=e}}}try{await Dy(`/dsh-tiddlywiki/admin/config`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(e)}),O(`配置已保存`),n()}catch(e){O(`保存失败:${e instanceof Error?e.message:String(e)}`)}finally{m.disabled=!1}})()}),r.append(m),e.append(r)}function jy(e,t,n,r){let i=n?.plugins??[],a=n?.themes??[],o=n?.languages??[],s=new Set(t?.plugins??[]),c=new Set(t?.themes??[]),l=new Set(t?.languages??[]),u=$(`section`,`dsh-tw-settings-section`);u.append($(`h3`,`dsh-tw-settings-h`,`插件管理(自带官方插件)`));let d=$(`input`,`dsh-tw-settings-input dsh-tw-settings-search`);d.placeholder=`搜索插件…`;let f=$(`div`,`dsh-tw-settings-list`),p=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`应用插件(重启 TW)`);p.type=`button`;let m=e=>{f.replaceChildren();let t=e.toLowerCase();for(let e of i){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=s.has(e.name),n.addEventListener(`change`,()=>{n.checked?s.add(e.name):s.delete(e.name)});let r=$(`label`,`dsh-tw-settings-row dsh-tw-settings-plugin`),i=$(`span`,`dsh-tw-settings-name`,e.label);i.title=e.name;let a=$(`span`,`dsh-tw-settings-muted`,e.description||e.name);r.append(n,i,a),f.append(r)}};d.addEventListener(`input`,()=>m(d.value)),p.addEventListener(`click`,()=>{p.disabled=!0,(async()=>{try{await Dy(Ty,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({plugins:[...s]})}),O(`插件已应用,TW 已重启`),r()}catch(e){O(`应用失败:${e instanceof Error?e.message:String(e)}`),p.disabled=!1}})()}),m(``),u.append(d,f,p),e.append(u);let h=$(`section`,`dsh-tw-settings-section`);h.append($(`h3`,`dsh-tw-settings-h`,`主题管理(自带主题)`));let g=$(`div`,`dsh-tw-settings-muted`,`「加载」= TW 里可用的主题(可多选,依赖链自动带上,如 heavier 会带 snowwhite+vanilla);「活动」= 当前视觉主题(单选,自动加入加载集)。应用后重启 TW。`),_=$(`div`,`dsh-tw-settings-row dsh-tw-settings-head`);_.append($(`span`,`dsh-tw-settings-col`,`加载`),$(`span`,`dsh-tw-settings-col`,`活动`),$(`span`,`dsh-tw-settings-name`,`主题`));let v=t?.themes??[],y=v.length>0?v[v.length-1]:`tiddlywiki/vanilla`,b=$(`div`,`dsh-tw-settings-list`);for(let e of a){let t=$(`input`,`dsh-tw-settings-check`);t.type=`checkbox`,t.checked=c.has(e.name),t.title=`加载该主题`,t.addEventListener(`change`,()=>{t.checked?c.add(e.name):c.delete(e.name)});let n=$(`input`,`dsh-tw-settings-check`);n.type=`radio`,n.name=`dsh-tw-active-theme`,n.checked=e.name===y,n.title=`设为活动主题`,n.addEventListener(`change`,()=>{n.checked&&(y=e.name)});let r=$(`span`,`dsh-tw-settings-name`,e.label);r.title=e.name;let i=$(`span`,`dsh-tw-settings-muted`,e.description||e.name),a=$(`div`,`dsh-tw-settings-row dsh-tw-settings-plugin`);a.append(t,n,r,i),b.append(a)}let x=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`应用主题(重启 TW)`);x.type=`button`,x.addEventListener(`click`,()=>{x.disabled=!0,(async()=>{try{await Dy(Ty,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({themes:[...c],themeActive:y})}),O(`主题已应用,TW 已重启`),r()}catch(e){O(`应用失败:${e instanceof Error?e.message:String(e)}`),x.disabled=!1}})()}),h.append(g,_,b,x),e.append(h);let S=$(`section`,`dsh-tw-settings-section`);S.append($(`h3`,`dsh-tw-settings-h`,`语言管理(自带官方语言包)`));let C=$(`div`,`dsh-tw-settings-muted`,`勾选启用语言插件并重启 TW;如中文请选 zh-Hans(简体)或 zh-CN。`),ee=$(`div`,`dsh-tw-settings-list`);for(let e of o){let t=$(`input`,`dsh-tw-settings-check`);t.type=`checkbox`,t.checked=l.has(e.name),t.addEventListener(`change`,()=>{t.checked?l.add(e.name):l.delete(e.name)});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),ee.append(n)}let w=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`应用语言(重启 TW)`);w.type=`button`,w.addEventListener(`click`,()=>{w.disabled=!0,(async()=>{try{await Dy(Ty,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({languages:[...l]})}),O(`语言已应用,TW 已重启`),r()}catch(e){O(`应用失败:${e instanceof Error?e.message:String(e)}`),w.disabled=!1}})()}),S.append(C,ee,w),e.append(S)}function My(e){let t=$(`section`,`dsh-tw-settings-section`);t.append($(`h3`,`dsh-tw-settings-h`,`初始化(一次性预置)`));let n=$(`div`,`dsh-tw-settings-muted`,`这些是插件与 dsh 联动、需要在 wiki 里预置的 tiddler/配置。「发送给 Agent 按钮」和「TW 前端 API 基址」是功能必需项,启动时自动写入(只写缺失,不覆盖你的改动);其余为可选项,默认不自动写入、也不会强绑定——需要时点「重新初始化」写入,不想要了可随时「反初始化」移除。`),r=$(`div`,`dsh-tw-settings-list`),i=$(`div`,`dsh-tw-settings-muted`),a=`/dsh-tiddlywiki/admin/seeds/remove`,o=async()=>{try{let e=await Dy(`/dsh-tiddlywiki/admin/seeds`);if(e.ok!==!0||!Array.isArray(e.items))throw Error(e.error??`获取失败`);r.replaceChildren();let t=0,n=0;for(let i of e.items){i.present&&(t+=1),i.removable&&(n+=1);let e=$(`span`,`dsh-tw-settings-chip`,i.present?`✓`:`✗`);e.dataset.state=i.present?`ok`:`missing`,e.title=i.present?`已存在`:`缺失`;let s=$(`span`,`dsh-tw-settings-name`,i.title);s.title=i.id;let c=$(`span`,`dsh-tw-settings-muted`,i.detail??i.description),l=$(`button`,`dsh-tw-settings-btn`,`重新初始化`);l.type=`button`,l.title=`强制重写「${i.title}」的内置内容(会覆盖当前 tiddler)`,l.addEventListener(`click`,()=>{l.disabled=!0,l.textContent=`执行中…`,(async()=>{try{let e=await fetch(Ey,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({id:i.id,force:!0}),signal:AbortSignal.timeout(3e4)}),t=await e.json().catch(()=>null);!e.ok||t?.ok!==!0?O(`重新初始化失败:${t?.error??t?.results?.[0]?.error??`HTTP ${e.status}`}`):O(`已重新初始化「${i.title}」`),o()}catch(e){O(`重新初始化失败:${e instanceof Error?e.message:String(e)}`)}finally{l.disabled=!1,l.textContent=`重新初始化`}})()});let u=$(`div`,`dsh-tw-settings-row dsh-tw-settings-plugin`);if(u.append(e,s,c,l),i.removable){let e=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-danger`,`反初始化`);e.type=`button`,e.title=`移除「${i.title}」写入的 tiddler 与 marker(恢复未初始化状态)`,e.addEventListener(`click`,()=>{window.confirm(`确定反初始化「${i.title}」?将删除它写入的 tiddler(含其一次性 marker),需要时可用「重新初始化」恢复。`)&&(e.disabled=!0,e.textContent=`移除中…`,(async()=>{try{let e=await fetch(a,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({id:i.id}),signal:AbortSignal.timeout(3e4)}),t=await e.json().catch(()=>null);!e.ok||t?.ok!==!0?O(`反初始化失败:${t?.error??t?.results?.[0]?.error??`HTTP ${e.status}`}`):O(`已反初始化「${i.title}」`),o()}catch(e){O(`反初始化失败:${e instanceof Error?e.message:String(e)}`)}finally{e.disabled=!1,e.textContent=`反初始化`}})())}),u.append(e)}r.append(u)}i.textContent=`共 ${e.items.length} 项,${t} 项已就绪;可移除 ${n} 项`}catch(e){i.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(Ey,{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?O(`重新初始化失败:${t?.error??`HTTP ${e.status}`}`):O(`全部已重新初始化`),o()}catch(e){O(`重新初始化失败:${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(a,{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?O(`反初始化失败:${t?.error??`HTTP ${e.status}`}`):O(`全部可选 seed 已反初始化`),o()}catch(e){O(`反初始化失败:${e instanceof Error?e.message:String(e)}`)}finally{c.disabled=!1,c.textContent=`全部反初始化`}})())}),t.append(n,i,r,s,c),e.append(t),o()}function Ny(e,t,n){e.replaceChildren(),Ay(e,t.config??{},n),jy(e,t.info,t.catalog,n),My(e)}function Py(){let e=c.useRef(null);return c.useEffect(()=>{let t=e.current;return t===null?void 0:Oy(t)},[]),c.createElement(`div`,{ref:e})}const Fy={tiddlywiki_get:`读取笔记`,tiddlywiki_search:`检索笔记`,tiddlywiki_recent:`最近修改`,tiddlywiki_list_tags:`标签列表`,tiddlywiki_put:`写入笔记`,tiddlywiki_batch_put:`批量写入`,tiddlywiki_rename:`重命名笔记`,tiddlywiki_delete:`删除笔记`,tiddlywiki_git_sync:`git 同步`,tiddlywiki_git_resolve:`git 冲突解决`};function Iy(e){return typeof e==`object`&&!!e&&e.kind===`tool-result`}function Ly(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 Ry(e){try{let t=JSON.parse(e);return typeof t==`object`&&t&&!Array.isArray(t)?t:{}}catch{return{}}}function zy(e){return Array.isArray(e)?e.filter(e=>typeof e?.text==`string`).map(e=>e.text).join(`
675
- `):``}function By(e){return typeof e==`string`?e:``}async function Vy(e){try{let t=await fetch(e,{signal:AbortSignal.timeout(1e4)});if(!t.ok)return null;let n=await t.json();return typeof n==`object`&&n?n:null}catch{return null}}async function Hy(e){try{let t=await fetch(`/dsh-tiddlywiki/tw/render`,{method:`POST`,headers:{"content-type":`application/json`,"x-requested-with":`TiddlyWiki`},body:JSON.stringify({title:e}),signal:AbortSignal.timeout(1e4)});return t.ok?await t.text():null}catch{return null}}function Uy(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 Wy(e){return t=>{t.preventDefault(),t.stopPropagation(),je(e)}}function Gy(e){let t=Fy[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=>c.createElement(`span`,{className:`dsh-tw-toolcard-tag`,key: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)}function Ky(e){let{title:t}=e,{loading:n,data:r}=Uy(async()=>{let[e,n]=await Promise.all([Vy(`/dsh-tiddlywiki/get?title=${encodeURIComponent(t)}`),Hy(t)]);return{get:e,html:n}},[t]),i=r?.get??null,a=r?.html??null,o;o=n?c.createElement(`div`,{className:`dsh-tw-toolcard-loading`},`渲染中…`):i!==null&&i.notFound===!0?c.createElement(`div`,{className:`dsh-tw-toolcard-empty`},`tiddler「${t}」不存在`):typeof a==`string`&&a.length>0?c.createElement(`div`,{className:`dsh-tw-toolcard-native`,dangerouslySetInnerHTML:{__html:a}}):i!==null&&typeof i.text==`string`&&i.text.length>0?c.createElement(`pre`,{className:`dsh-tw-toolcard-fallback`},i.text):c.createElement(`div`,{className:`dsh-tw-toolcard-empty`},`wiki 服务不可用`);let s=Array.isArray(i?.tags)?i.tags.filter(e=>typeof e==`string`):[],l=typeof i?.modified==`string`?i.modified:void 0;return c.createElement(Gy,{toolName:e.toolName,title:t,subtitle:e.subtitle,tags:s,onOpen:Wy(t),foot:l===void 0?void 0:`修改于 ${l}`},o)}function qy(e){return c.createElement(`a`,{className:`dsh-tw-toolcard-row`,href:`/dsh-tiddlywiki/tw/#${encodeURIComponent(e.title)}`,onClick:Wy(e.title),title:e.title},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)}function Jy(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(qy,{key:`${e.title}-${t}`,...e}))),c.createElement(Gy,{toolName:e.toolName,title:e.title,subtitle:e.subtitle},n)}function Yy(e){let t=By(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.limit==`number`&&n.set(`limit`,String(e.args.limit));let r=n.toString(),i=Uy(()=>Vy(`/dsh-tiddlywiki/search?${r}`),[r]).data,a=(Array.isArray(i?.items)?i.items:[]).map(e=>({title:By(e.title),tags:Array.isArray(e.tags)?e.tags.filter(e=>typeof e==`string`):[],modified:typeof e.modified==`string`?e.modified:null})),o=typeof i?.total==`number`?i.total:void 0,s=`关键词「${t||`(全部)`}」${o===void 0?``:` · 共 ${o} 条`}`;return c.createElement(Jy,{toolName:e.toolName,title:t.length>0?t:`检索`,subtitle:s,rows:a,fallbackText:`没有匹配的笔记`})}function Xy(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=Uy(()=>Vy(`/dsh-tiddlywiki/recent?${n}`),[n]).data,i=(Array.isArray(r?.items)?r.items:[]).map(e=>({title:By(e.title),tags:Array.isArray(e.tags)?e.tags.filter(e=>typeof e==`string`):[],modified:typeof e.modified==`string`?e.modified:null}));return c.createElement(Jy,{toolName:e.toolName,title:`最近修改`,subtitle:i.length>0?`最近 ${i.length} 条`:``,rows:i,fallbackText:`暂无笔记`})}function Zy(e){let t=(Array.isArray(e.args.items)?e.args.items:[]).map(e=>typeof e==`object`&&e&&typeof e.title==`string`?By(e.title):null).filter(e=>e!==null&&e.length>0).map(e=>({title:e}));return c.createElement(Jy,{toolName:e.toolName,title:`批量写入`,subtitle:t.length>0?`写入 ${t.length} 篇`:`(参数中没有可解析的 items)`,rows:t,fallbackText:`没有可展示的笔记`})}function Qy(e){let t=Uy(()=>Vy(`/dsh-tiddlywiki/tags`),[]).data,n=(Array.isArray(t?.items)?t.items:[]).map(e=>({tag:By(e.tag),count:typeof e.count==`number`?e.count:0})),r;return r=n.length===0?c.createElement(`div`,{className:`dsh-tw-toolcard-empty`},`暂无标签`):c.createElement(`div`,{className:`dsh-tw-toolcard-tags-wrap`},...n.map(e=>c.createElement(`span`,{className:`dsh-tw-toolcard-tag`,key:e.tag},`${e.tag} · ${e.count}`))),c.createElement(Gy,{toolName:e.toolName,title:`标签`,subtitle:`共 ${n.length} 个`},r)}function $y(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(Gy,{toolName:e.toolName},t)}function eb(e){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(Gy,{toolName:e.toolName,title:e.title.length>0?e.title:void 0},t)}function tb(e,t){switch(e){case`tiddlywiki_get`:case`tiddlywiki_put`:case`tiddlywiki_delete`:return By(t.title);case`tiddlywiki_rename`:return By(t.newTitle);case`tiddlywiki_search`:return By(t.query);case`tiddlywiki_recent`:case`tiddlywiki_list_tags`:case`tiddlywiki_batch_put`:case`tiddlywiki_git_sync`:case`tiddlywiki_git_resolve`:return``;default:return``}}function nb(e){let t=e.block,n=e.toolName,r=Iy(t),i=Ly(t),a=n!==void 0&&n.length>0?n:i?.name??``,o=Ry(i?.argsRaw??``),s=r?zy(t.content):``;if(i===null)return c.createElement(Gy,{toolName:a},c.createElement(`pre`,{className:`dsh-tw-toolcard-fallback`},s||`(无调用信息)`));if(!r)return c.createElement(Gy,{toolName:a,title:tb(a,o)},c.createElement(`div`,{className:`dsh-tw-toolcard-pending`},`处理中…`));if(t.isError===!0)return c.createElement(Gy,{toolName:a,title:tb(a,o)},c.createElement(`div`,{className:`dsh-tw-toolcard-error`},s||`工具调用失败`));switch(a){case`tiddlywiki_get`:return c.createElement(Ky,{toolName:a,title:By(o.title),subtitle:`读取`});case`tiddlywiki_put`:return c.createElement(Ky,{toolName:a,title:By(o.title),subtitle:`已写入`});case`tiddlywiki_rename`:return c.createElement(Ky,{toolName:a,title:By(o.newTitle),subtitle:`已重命名「${By(o.oldTitle)}」→`});case`tiddlywiki_delete`:return c.createElement(eb,{toolName:a,title:By(o.title),text:s});case`tiddlywiki_batch_put`:return c.createElement(Zy,{toolName:a,args:o,text:s});case`tiddlywiki_search`:return c.createElement(Yy,{toolName:a,args:o,text:s});case`tiddlywiki_recent`:return c.createElement(Xy,{toolName:a,args:o,text:s});case`tiddlywiki_list_tags`:return c.createElement(Qy,{toolName:a,text:s});case`tiddlywiki_git_sync`:case`tiddlywiki_git_resolve`:return c.createElement($y,{toolName:a,text:s});default:return c.createElement(Gy,{toolName:a,title:tb(a,o)},c.createElement(`pre`,{className:`dsh-tw-toolcard-fallback`},s||`(完成)`))}}const rb=[`tiddlywiki_get`,`tiddlywiki_search`,`tiddlywiki_recent`,`tiddlywiki_list_tags`,`tiddlywiki_put`,`tiddlywiki_batch_put`,`tiddlywiki_rename`,`tiddlywiki_delete`,`tiddlywiki_git_sync`,`tiddlywiki_git_resolve`];function ib(e){let t=[];for(let n of rb)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}`},nb));r!==void 0&&t.push(r)}catch(e){console.error(`[dsh-tiddlywiki] register toolview ${n} failed:`,e)}return t}function ab(){let e=e=>{let t=e.target;if(!(t instanceof Element))return;let n=t.closest(`a`);if(n===null)return;let r=(n.getAttribute(`href`)??``).match(/^\/dsh-tiddlywiki\/tw\/#(.+)$/);if(r===null||r[1]===void 0)return;e.preventDefault(),e.stopPropagation();let i=r[1];try{i=decodeURIComponent(i)}catch{}je(i)};return document.addEventListener(`click`,e,!0),()=>document.removeEventListener(`click`,e,!0)}const ob=`dsh-tiddlywiki`,sb=`dsh-tiddlywiki/rightbar`;function cb(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=Se(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(de,{detail:sb}));let e=e=>{e.detail!==sb&&o()};return document.addEventListener(de,e),()=>document.removeEventListener(de,e)},[a,o]),c.createElement(`div`,{ref:r,className:`dsh-tw-rightbar-tab`,"data-dsh-tw-rightbar":``})}function lb(){return{id:ob,kind:`dsh-tiddlywiki`,title:()=>he(),guide:[{order:10,title:()=>`TiddlyWiki 知识库`,description:()=>`在右侧边栏打开 TiddlyWiki 编辑器(与聊天并排)`,icon:ve}]}}function ub(e,t){let n=[];try{n.push(e.register(lb()));let r=t.inject(`sidebar.right.pane.tab`,()=>t.register({name:`sidebar.right.pane.tab`,key:ob},cb));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 xe(),()=>{for(let e of n.splice(0))e()}}const db=`dsh-tiddlywiki/bettersidebar`;function fb(e){let{ctx:t,scope:n,tab:r}=e,i=e.visible!==!1,a=c.useRef(null),o=c.useRef(null);return c.useEffect(()=>{let e=a.current;if(e===null)return;let t=new AbortController,n=Se(e,t.signal);return o.current=n,()=>{n.dispose(),t.abort(),o.current=null}},[r.id]),c.useEffect(()=>{o.current?.setVisible(i)},[i]),c.useEffect(()=>{if(!i)return;document.dispatchEvent(new CustomEvent(de,{detail:db}));let e=e=>{e.detail!==db&&(t.get?.(`betterSidebar`))?.closeTab(r.id,n)};return document.addEventListener(de,e),()=>document.removeEventListener(de,e)},[i,r.id,n,t]),c.createElement(`div`,{ref:a,className:`dsh-tw-rightbar-tab`,"data-dsh-tw-bettersidebar":``})}function pb(e){try{let t=e.registerTab({id:`dsh-tiddlywiki`,title:()=>he(),icon:e=>ve({size:e}),single:!0,component:e=>fb(e)});return xe(),t}catch(e){console.error(`[dsh-tiddlywiki] better-sidebar tab mount failed:`,e);return}}const mb=[`slots`];function hb(e){try{u();let t=new d,n=[],r=!1;try{let i=iy(),a=ly();n.push(()=>i.dispose()),n.push(()=>a.dispose()),n.push(v(t)),n.push(Ie(t)),n.push(hy(t,i,a)),n.push(We),e.slots!==void 0&&fy().then(t=>{if(r)return;if(t.showQuickNoteDock){let t=e.slots?.inject(`conversation.input.dock`,()=>e.slots?.register({name:`conversation.input.dock`,id:`quick-note`,order:8,label:`快速笔记`},gy(i)));t!==void 0&&n.push(t)}let a=wy(e.slots,t);a!==void 0&&n.push(a)})}catch(e){console.error(`[dsh-tiddlywiki] mount failed:`,e)}try{let t,i=a=>{let o=e.get?.(`sidebarRightTabs`);if(o===void 0){a<6&&!r&&(t=window.setTimeout(()=>i(a+1),500*(a+1)));return}fy().then(t=>{if(r||!t.showRightbarTab)return;let i=ub(o,e.slots);i!==void 0&&n.push(i)})};i(0),n.push(()=>{t!==void 0&&window.clearTimeout(t)})}catch(e){console.error(`[dsh-tiddlywiki] rightbar mount failed:`,e)}try{let t,i=a=>{let o=e.get?.(`betterSidebar`);if(o===void 0){a<6&&!r&&(t=window.setTimeout(()=>i(a+1),500*(a+1)));return}fy().then(e=>{if(r||!e.showBetterSidebarTab)return;let t=pb(o);t!==void 0&&n.push(t)})};i(0),n.push(()=>{t!==void 0&&window.clearTimeout(t)})}catch(e){console.error(`[dsh-tiddlywiki] better-sidebar mount failed:`,e)}try{e.slots!==void 0&&n.push(...ib(e.slots))}catch(e){console.error(`[dsh-tiddlywiki] tool views failed:`,e)}try{n.push(ab())}catch(e){console.error(`[dsh-tiddlywiki] wiki link interceptor failed:`,e)}try{let t=e.slots?.inject(`settings.section`,()=>e.slots?.register({name:`settings.section`,id:`dsh-tiddlywiki`,order:50,label:`TiddlyWiki 知识库`},Py));t!==void 0&&n.push(t)}catch(e){console.error(`[dsh-tiddlywiki] settings section failed:`,e)}e.effect?.(()=>()=>{r=!0;for(let e of n.splice(0))e()},`dsh-tiddlywiki: client mount`)}catch(e){console.error(`[dsh-tiddlywiki] client half failed to start:`,e)}}exports.apply=hb,exports.inject=mb,exports.name=`dsh-tiddlywiki/client`;
673
+ Ctrl+Enter 保存`,onSave:()=>{y?.()},onChange:l}),x=document.createElement(`button`);x.type=`button`,x.className=`dsh-tw-note-upload`,x.title=`上传文件到 wiki 并插入 Markdown 链接(也可直接拖入编辑器)`,x.textContent=`📎 上传`;let S=document.createElement(`input`);S.type=`file`,S.multiple=!0,S.hidden=!0,x.addEventListener(`click`,()=>{S.click()}),S.addEventListener(`change`,()=>{for(let e of Array.from(S.files??[]))ry(e,b);S.value=``});let C=0;b.el.addEventListener(`dragenter`,e=>{e.preventDefault(),C++,b.el.classList.add(`dsh-tw-note-drop`)}),b.el.addEventListener(`dragover`,e=>{e.preventDefault()}),b.el.addEventListener(`dragleave`,e=>{e.preventDefault(),C=Math.max(0,C-1),C===0&&b.el.classList.remove(`dsh-tw-note-drop`)}),b.el.addEventListener(`drop`,e=>{e.preventDefault(),C=0,b.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))ry(e,b)});let ee=document.createElement(`div`);ee.className=`dsh-tw-note-foot`;let w=document.createElement(`div`);w.className=`dsh-tw-note-foot-left`;let te=document.createElement(`span`);te.className=`dsh-tw-note-hint`,te.textContent=`Ctrl+Enter`;let T=document.createElement(`button`);T.type=`button`,T.className=`dsh-tw-note-recent-btn`,T.title=`最近修改的笔记,点击载入继续编辑`,T.textContent=`🕘 最近`,T.addEventListener(`click`,m),w.append(x,T,te);let ne=document.createElement(`div`);ne.className=`dsh-tw-note-foot-right`;let E=document.createElement(`button`);E.type=`button`,E.className=`dsh-tw-note-edit`,E.title=`保存并在 TiddlyWiki 原生编辑器中打开`,E.textContent=`✏️ 在 TW 中编辑`;let D=document.createElement(`button`);D.type=`button`,D.className=`dsh-tw-note-save`,D.textContent=`保存`,ne.append(E,D),ee.append(w,ne);let re=document.createElement(`div`);re.className=`dsh-tw-note-recent`,re.hidden=!0,r.append(i,c,g,b.el,ee),t.append(r,re),document.body.append(t),e={root:t,card:r,editor:b,titleInput:_,tagEditor:v,saveBtn:D,editBtn:E,draftBanner:c,recentBtn:T,recentWrap:re};let ie=()=>{n=!1,t.hidden=!0,f(),o(!1)},ae=()=>{Zv(),u(),b.setValue(``),_.value=$v(),v.setTags([]),ie()},oe=!1;y=async()=>{if(oe)return;let e=b.getValue().trim();if(e.length===0){O(`内容为空,未保存`);return}oe=!0,D.disabled=!0,D.textContent=`保存中…`;try{let t=await fetch(`/dsh-tiddlywiki/note`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({title:_.value.trim(),tags:v.getTags(),text:e}),signal:AbortSignal.timeout(1e4)}),n=await t.json().catch(()=>null);if(!t.ok||n?.ok!==!0){O(`保存失败:${n?.error??`HTTP ${t.status}`}`);return}ae(),O(`已保存「${n.title??_.value}」`)}catch(e){O(`保存失败:${e instanceof Error?e.message:String(e)}`)}finally{oe=!1,D.disabled=!1,D.textContent=`保存`}},D.addEventListener(`click`,()=>{y?.()});let se=async()=>{let e=_.value.trim().length>0?_.value.trim():$v(),t=b.getValue(),n=v.getTags();E.disabled=!0,E.textContent=`打开中…`;try{await d(e,t,n)}finally{E.disabled=!1,E.textContent=`✏️ 在 TW 中编辑`}};E.addEventListener(`click`,()=>{se()}),s.addEventListener(`click`,ie);let ce=null,le=(e,n)=>{let i=window.innerWidth,a=window.innerHeight,o=r.offsetWidth||340,s=r.offsetHeight||260,c=Math.min(Math.max(e,8),Math.max(8,i-o-8)),l=Math.min(Math.max(n,8),Math.max(8,a-s-8));t.style.right=`auto`,t.style.bottom=`auto`,t.style.left=`${c}px`,t.style.top=`${l}px`};i.addEventListener(`pointerdown`,e=>{if(s.contains(e.target))return;e.preventDefault();let n=t.getBoundingClientRect();ce={startX:e.clientX,startY:e.clientY,origLeft:n.left,origTop:n.top,moved:!1};try{i.setPointerCapture(e.pointerId)}catch{}i.classList.add(`dsh-tw-note-head-dragging`)}),i.addEventListener(`pointermove`,e=>{if(ce===null)return;let t=e.clientX-ce.startX,n=e.clientY-ce.startY;!ce.moved&&Math.abs(t)<4&&Math.abs(n)<4||(ce.moved=!0,le(ce.origLeft+t,ce.origTop+n))});let ue=e=>{if(ce!==null){try{i.releasePointerCapture(e.pointerId)}catch{}ce=null,i.classList.remove(`dsh-tw-note-head-dragging`)}};i.addEventListener(`pointerup`,ue),i.addEventListener(`pointercancel`,ue),h.addEventListener(`click`,()=>{Zv(),u(),b.setValue(``),_.value=$v(),v.setTags([]),O(`已丢弃草稿`)})};return{async open(i){if(t||(h(),e===void 0||n))return;n=!0,e.root.hidden=!1,s(i),o(!0);let a=Yv();if(a!==null&&(a.text.trim().length>0||a.title.trim().length>0))e.editor.setValue(a.text),e.titleInput.value=a.title,e.tagEditor.setTags(a.tags),e.draftBanner.hidden=!1;else{if(c(),r=(await ty()).defaultTag,t||e===void 0)return;e.tagEditor.setDefault(r)}e!==void 0&&e.editor.focus()},close(){e!==void 0&&(n=!1,e.root.hidden=!0,f(),o(!1))},async toggle(){n?this.close():await this.open()},async openNative(){if(t)return;let e=Yv(),n=e!==null&&(e.text.trim().length>0||e.title.trim().length>0),i=n&&e.title.trim().length>0?e.title.trim():$v(),a=n?e.text:``,o=[];if(n)o=e.tags;else{if(r=(await ty()).defaultTag,t)return;o=[r]}d(i,a,o)},isOpen(){return n},dispose(){t=!0,i!==void 0&&(clearTimeout(i),i=void 0),e?.tagEditor.dispose(),e?.editor.view.destroy(),e?.root.remove(),document.querySelector(`.dsh-tw-toast`)?.remove(),e=void 0}}}function ay(e){return e<10?`0${e}`:String(e)}function oy(e){return`${ay(e.getHours())}:${ay(e.getMinutes())}`}async function sy(){try{let e=await fetch(f,{signal:AbortSignal.timeout(8e3)});return e.ok?await e.json():null}catch{return null}}function cy(e,t){let n=e?.git,r=[`同步知识库`],i=`offline`,a=`离线`;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`,a=`待提交`,r.push(`有 ${n.dirtyFiles?.length??0} 个未提交改动`)):e>0?(i=`behind`,a=`可更新`):(i=`clean`,a=`已同步`)}return t!==void 0&&r.push(`上次同步 ${oy(t)}`),{state:i,label:a,tooltip:r.join(` · `),...t===void 0?{}:{lastSync:t}}}function ly(){let e={state:`offline`,label:`离线`,tooltip:`同步知识库`},t,n,r=!1,i=!1,a=new Set,o=()=>{for(let e of[...a])e()},s=n=>{let r=cy(n,t);(r.state!==e.state||r.tooltip!==e.tooltip)&&(e=r,o())},c=async()=>{i||s(await sy())};return c(),n=window.setInterval(()=>{c()},3e4),{getState:()=>e,trigger:async()=>{if(i||r)return e;r=!0,e={...e,state:`syncing`,label:`同步中…`},o();try{let e=await fetch(`/dsh-tiddlywiki/sync`,{method:`POST`,signal:AbortSignal.timeout(12e4)}),n=await e.json().catch(()=>null);if(t=new Date,n===null||n.ok!==!0)O(`同步失败:${n?.error??n?.message??`HTTP ${e.status}`}`);else{let e=``;n.push&&n.push!==`nothing to commit`&&(e=`(${n.push})`),n.changed===!0&&(e+=n.restarted===!0?`,TW 已重启`:`,TW 未自动重启`,n.restartError&&(e+=`(${n.restartError})`)),O(`同步完成:${n.message??`OK`}${e}`)}await c()}catch(e){O(`同步失败:${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()}}}const uy={showQuickNoteDock:!0,quickNoteMode:`native`,sidebarLabel:`TiddlyWiki`,tabLabel:`知识库`,showSessionTab:!0,showRightbarTab:!0};let dy;async function fy(e={}){let t=Date.now();if(!e.force&&dy!==void 0&&t-dy.at<15e3)return dy.value;try{let e=await fetch(f,{signal:AbortSignal.timeout(5e3)});if(!e.ok)return uy;let t=await e.json(),n={showQuickNoteDock:t.ui?.showQuickNoteDock!==!1,quickNoteMode:t.ui?.quickNoteMode===`card`?`card`:`native`,sidebarLabel:typeof t.ui?.sidebarLabel==`string`&&t.ui.sidebarLabel.trim().length>0?t.ui.sidebarLabel.trim():`TiddlyWiki`,tabLabel:typeof t.ui?.tabLabel==`string`&&t.ui.tabLabel.trim().length>0?t.ui.tabLabel.trim():`知识库`,showSessionTab:t.ui?.showSessionTab!==!1,showRightbarTab:t.ui?.showRightbarTab!==!1};return dy={at:Date.now(),value:n},n}catch{return uy}}async function py(){try{let e=await fetch(f,{signal:AbortSignal.timeout(5e3)});if(!e.ok)return{showQuickNote:!0,showPanelStatus:!0,showSyncButton:!0};let t=await e.json();return{showQuickNote:t.ui?.showQuickNote!==!1,showPanelStatus:t.ui?.showPanelStatus!==!1,showSyncButton:t.ui?.showSyncButton!==!1}}catch{return{showQuickNote:!0,showPanelStatus:!0,showSyncButton:!0}}}async function my(){try{let e=await fetch(f,{signal:AbortSignal.timeout(8e3)});if(!e.ok)return{state:`failed`,text:`状态不可达`,logs:[]};let t=await e.json(),n=Array.isArray(t.logs)?t.logs.filter(e=>typeof e==`string`):[];return t.status===`running`?{state:`running`,text:`TW 在线 · ${t.url??``}`,logs:n}:t.status===`starting`?{state:`starting`,text:`TW 启动中…`,logs:n}:{state:`failed`,text:t.error??`TW 状态:${t.status??`?`}`,logs:n}}catch{return{state:`failed`,text:`状态不可达`,logs:[]}}}function hy(e,t,n){let r=!1,i,a,o,s,c,l,u,d,f=!1,p={state:`unknown`,text:`TiddlyWiki 服务…`,logs:[]},m=()=>{f=!1,s!==void 0&&(s.hidden=!0),u!==void 0&&(u.hidden=!0)},h=e=>{if(!f)return;let t=e.target;i!==void 0&&i.contains(t)||m()},g=()=>{if(u===void 0)return;let e=[`TiddlyWiki 服务:${p.text}`];e.push(`知识库同步:${n.getState().tooltip}`),p.logs.length>0&&(e.push(`最近日志:`),e.push(...p.logs.slice(-3))),u.textContent=e.join(`
674
+ `)},_=()=>{let e=n.getState();o!==void 0&&(o.dataset.state=e.state),a!==void 0&&(a.title=`知识库 · ${e.tooltip}`),g()},v=async()=>{p=await my(),!r&&(c!==void 0&&(c.textContent=p.text),l!==void 0&&(l.dataset.state=p.state),g())},y=p=>{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,p.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`,()=>{g(),u!==void 0&&(u.hidden=!1)}),e.addEventListener(`mouseleave`,()=>{u!==void 0&&(u.hidden=!0)}),s.append(e)}if(p.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`,()=>{m(),fy().then(e=>{e.quickNoteMode===`native`?t.openNative():t.open()})}),s.append(e)}if(p.showPanelStatus){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`,()=>{m(),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`,()=>{m(),document.dispatchEvent(new CustomEvent(Ce)),v()}),s.append(n)}if(p.showSyncButton){let e=document.createElement(`button`);e.type=`button`,e.className=`dsh-tw-fab-item`,e.textContent=`🔁 同步`,e.addEventListener(`click`,()=>{m(),n.trigger()}),s.append(e)}a=document.createElement(`button`),a.type=`button`,a.className=`dsh-tw-fab`,a.setAttribute(`aria-label`,`TiddlyWiki 知识库`);let y=document.createElement(`span`);y.className=`dsh-tw-fab-icon`,y.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(y,o),a.addEventListener(`click`,()=>{if(s!==void 0){if(f){m();return}f=!0,s.hidden=!1,_(),v()}}),i.append(s,a),document.body.append(i),_(),document.addEventListener(`click`,h,!0)},b=e.subscribe(()=>{d!==void 0&&(d.textContent=e.isOpen()?`收起 TW 面板`:`打开 TW 面板`)}),x=n.subscribe(_);return(async()=>{let e=await py();r||!e.showQuickNote&&!e.showPanelStatus&&!e.showSyncButton||y(e)})(),()=>{r=!0,document.removeEventListener(`click`,h,!0),b(),x(),i?.remove()}}function gy(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=e=>{let t=e.detail;n(t?.open===!0)};return window.addEventListener(qv,e),fy().then(e=>i(e.quickNoteMode)),()=>window.removeEventListener(qv,e)},[]),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);e.style.paddingRight!==`${a}px`&&(e.style.paddingRight=`${a}px`)};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=window.setInterval(n,1500),s=window.setTimeout(n,120),c=window.setTimeout(n,600);return()=>{r.disconnect(),window.removeEventListener(`resize`,n),document.removeEventListener(`visibilitychange`,n),window.clearInterval(o),window.clearTimeout(s),window.clearTimeout(c)}},[]);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:()=>{fy().then(t=>{t.quickNoteMode===`native`?He()?Ue():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)))}}const _y=`知识库`;let vy=_y;function yy(e){vy=typeof e==`string`&&e.trim().length>0?e.trim():_y}function by(){return vy}async function xy(e){try{let t=await fetch(`/dsh-tiddlywiki/tw/render`,{method:`POST`,headers:{"content-type":`application/json`,"x-requested-with":`TiddlyWiki`},body:JSON.stringify({title:e}),signal:AbortSignal.timeout(15e3)});if(!t.ok)return null;let n=await t.text();return n.length>0?n:null}catch{return null}}async function Sy(e){try{let t=await fetch(`${p}?title=${encodeURIComponent(e)}`,{signal:AbortSignal.timeout(8e3)});return t.status!==404&&(await t.json().catch(()=>null))?.notFound!==!0}catch{return!0}}function Cy(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(``),m=c.useRef(0),h=c.useRef(0),g=c.useRef(!1),_=c.useCallback(async()=>{let e=++m.current;if(a(`loading`),typeof t!=`string`||t.length===0){a(`error`),f(`缺少会话 ID`);return}try{let n=await fetch(`/dsh-tiddlywiki/session/summary`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({session:t}),signal:AbortSignal.timeout(25e3)}),r=await n.json().catch(()=>null);if(e!==m.current)return;if(!n.ok||r?.ok!==!0){a(`error`),f(r?.error??`HTTP ${n.status}`);return}if(typeof r.title!=`string`||r.title.length===0){a(`error`),f(`汇总生成失败:缺少标题`);return}u(r.title);let i=await xy(r.title);if(e!==m.current)return;if(i===null){let t=await Sy(r.title);if(e!==m.current)return;if(!t){if(g.current){a(`error`),f(`汇总条目不存在,自动重建失败,请重试`);return}g.current=!0,h.current++,_();return}a(`error`),f(`渲染失败:wiki 渲染服务不可用(/tw/render)`);return}g.current=!1,h.current=0,s(i),a(`ready`)}catch(t){if(e!==m.current)return;a(`error`),f(t instanceof Error?t.message:String(t))}},[t]);c.useEffect(()=>{_()},[_]),c.useEffect(()=>{if(i!==`ready`||l===null)return;let e=window.setInterval(()=>{(async()=>{let e=!1;try{let t=await fetch(`${p}?title=${encodeURIComponent(l)}`,{signal:AbortSignal.timeout(8e3)}),n=await t.json().catch(()=>null);e=t.status!==404&&n?.notFound!==!0}catch{return}e?h.current=0:(h.current++,h.current<3&&_())})()},3e4);return()=>window.clearInterval(e)},[i,l,_]),c.useEffect(()=>{n!=null&&r?.()},[n,r]);let v=()=>{_()},y;return y=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:v},`重试`)):c.createElement(`div`,{className:`dsh-tw-summary-native dsh-tw-toolcard-native`,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:v,disabled:i===`loading`,title:`重新生成并刷新汇总`},`🔄 刷新`)),y)}function wy(e,t){if(!(e===void 0||t.showSessionTab===!1))return yy(t.tabLabel),e.inject(`conversation.view`,()=>e.register({name:`conversation.view`,id:`dsh-tiddlywiki-summary`,order:20,label:by},Cy))}const Ty=`/dsh-tiddlywiki/admin/info`,Ey=`/dsh-tiddlywiki/admin/seeds/run`;function $(e,t,n){let r=document.createElement(e);return t!==void 0&&(r.className=t),n!==void 0&&(r.textContent=n),r}async function Dy(e,t){let n=await fetch(e,{...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 Oy(e){let t=!1;e.classList.add(`dsh-tw-settings`);let n=$(`div`,`dsh-tw-settings-row dsh-tw-settings-status`),r=$(`div`,`dsh-tw-settings-body`);e.append(n,r);let i=[],a=async()=>{try{let e=await Dy(`/dsh-tiddlywiki/admin/state`);if(t)return;ky(n,e,a),Ny(r,e,a)}catch(e){if(t)return;r.replaceChildren(),n.replaceChildren();let i=$(`div`,`dsh-tw-settings-error`,`加载配置失败:${e instanceof Error?e.message:String(e)}`),o=$(`button`,`dsh-tw-settings-btn`,`重试`);o.type=`button`,o.addEventListener(`click`,()=>{a()}),r.append(i,o)}};return a(),i.push(()=>{t=!0,e.replaceChildren(),e.classList.remove(`dsh-tw-settings`)}),()=>{for(let e of i.splice(0))e()}}function ky(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?.dirty===!0?`有未提交改动`:``].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(`/dsh-tiddlywiki/sync`,{method:`POST`,signal:AbortSignal.timeout(12e4)}),t=await e.json().catch(()=>null);if(!e.ok||t?.ok!==!0)O(`同步失败:${t?.error??t?.message??`HTTP ${e.status}`}`);else{let e=``;t.changed===!0&&(e+=t.restarted===!0?`,TW 已重启`:`,TW 未自动重启`,t.restartError&&(e+=`(${t.restartError})`)),O(`同步完成:${t.message??`OK`}${e}`)}}catch(e){O(`同步失败:${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 Dy(`/dsh-tiddlywiki/admin/restart`,{method:`POST`}),O(`TW 已重启`)}catch(e){O(`重启失败:${e instanceof Error?e.message:String(e)}`)}finally{c.disabled=!1,c.textContent=`重启 TW`,n()}})()}),e.append(a,o,s,c)}function Ay(e,t,n){let r=$(`section`,`dsh-tw-settings-section`);r.append($(`h3`,`dsh-tw-settings-h`,`常规配置`));let i=t.note??{},a=t.git??{},o=t.ui??{},s=[],c=(e,t,n)=>{let i=$(`input`,`dsh-tw-settings-input`);i.value=n;let a=$(`label`,`dsh-tw-settings-field`);a.append($(`span`,`dsh-tw-settings-label`,t),i),s.push({key:e,input:i,initial:n,read:()=>i.value.trim(),changed:()=>i.value.trim()!==n}),r.append(a)},l=(e,t,n)=>{let i=$(`input`,`dsh-tw-settings-check`);i.type=`checkbox`,i.checked=n;let a=$(`label`,`dsh-tw-settings-field dsh-tw-settings-field-check`);a.append(i,$(`span`,`dsh-tw-settings-label`,t)),s.push({key:e,input:i,initial:n,read:()=>i.checked,changed:()=>i.checked!==n}),r.append(a)},u=(e,t,n)=>{let i=$(`input`,`dsh-tw-settings-input`);i.type=`number`,i.value=String(n);let a=$(`label`,`dsh-tw-settings-field`);a.append($(`span`,`dsh-tw-settings-label`,t),i),s.push({key:e,input:i,initial:n,read:()=>Number(i.value)||n,changed:()=>(Number(i.value)||n)!==n}),r.append(a)};c(`note.tag`,`快速笔记默认 tag`,typeof i.tag==`string`?i.tag:`inbox`),l(`git.autoCommit`,`自动 commit(防抖)`,a.autoCommit!==!1),u(`git.debounceMs`,`自动 commit 防抖(ms)`,typeof a.debounceMs==`number`?a.debounceMs:6e4),c(`git.remote`,`git 远端(空=仅本地)`,typeof a.remote==`string`?a.remote:``),c(`git.branch`,`git 分支`,typeof a.branch==`string`?a.branch:`main`),l(`ui.showQuickNote`,`显示「知识库」按钮里的「快速笔记」入口`,o.showQuickNote!==!1),l(`ui.showQuickNoteDock`,`显示聊天输入框上方的「快速笔记」快捷按钮`,o.showQuickNoteDock!==!1),((e,t,n,i)=>{let a=$(`select`,`dsh-tw-settings-input`);for(let e of i){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`);o.append($(`span`,`dsh-tw-settings-label`,t),a),s.push({key:e,input:a,initial:n,read:()=>a.value,changed:()=>a.value!==n}),r.append(o)})(`ui.quickNoteMode`,`点击「快速笔记」的打开方式`,typeof o.quickNoteMode==`string`&&o.quickNoteMode===`card`?`card`:`native`,[{value:`native`,label:`原生编辑器:直接弹出 TW 原生编辑页(新建/恢复草稿)`},{value:`card`,label:`Markdown 卡片:弹出现有快速笔记卡片(CodeMirror 编辑器)`}]),c(`ui.sidebarLabel`,`侧边栏 TW 入口显示名称`,typeof o.sidebarLabel==`string`&&o.sidebarLabel.trim().length>0?o.sidebarLabel.trim():`TiddlyWiki`),l(`ui.showPanelStatus`,`显示「知识库」按钮里的 TW 面板/重载入口与状态行`,o.showPanelStatus!==!1),l(`ui.showSyncButton`,`显示「知识库」按钮里的「同步」入口与 git 状态点`,o.showSyncButton!==!1),l(`ui.followDshTheme`,`嵌入式 TW 跟随 DSH 深浅主题(暗色时自动切深色 palette,不写回 wiki)`,o.followDshTheme!==!1),c(`ui.darkPalette`,`暗色时 TW palette(tiddler 标题)`,typeof o.darkPalette==`string`&&o.darkPalette.trim().length>0?o.darkPalette.trim():`$:/palettes/CupertinoDark`),c(`ui.tabLabel`,`会话顶部「知识库」Tab 名称`,typeof o.tabLabel==`string`&&o.tabLabel.trim().length>0?o.tabLabel.trim():`知识库`),l(`ui.showSessionTab`,`显示会话顶部「知识库」Tab(本会话相关 wiki 笔记汇总)`,o.showSessionTab!==!1),l(`ui.showRightbarTab`,`在 DSH 右侧边栏提供 TiddlyWiki 入口/Tab(与聊天并排)`,o.showRightbarTab!==!1);let d=o.sendToAgent??{};l(`ui.sendToAgent.enabled`,`启用「发送给 Agent」(TW 笔记 → DSH 会话注入)`,d.enabled!==!1),c(`ui.sendToAgent.endpoint`,`TW 端请求基址(空=自动取当前 DSH origin)`,typeof d.endpoint==`string`?d.endpoint:``),c(`ui.sendToAgent.token`,`共享 token(非空时路由校验 x-send-to-agent-token 头)`,typeof d.token==`string`?d.token:``);let f=o.allArticles??{};u(`ui.allArticles.pageSize`,`「所有文章」每页条数`,typeof f.pageSize==`number`?f.pageSize:10);let p=t.bridge??{};l(`bridge.enabled`,`启用「本地剪藏桥」(书签小工具后端监听 127.0.0.1 端口,保存后立即生效)`,p.enabled===!0),u(`bridge.port`,`剪藏桥端口(改端口需重启 dsh web 生效)`,typeof p.port==`number`&&p.port>0?p.port:8618),c(`bridge.token`,`剪藏桥 token(非空时校验书签的 x-clip-token 头;强烈建议设置)`,typeof p.token==`string`?p.token:``),c(`bridge.tag`,`剪藏笔记默认 tag`,typeof p.tag==`string`&&p.tag.trim().length>0?p.tag.trim():`clip`);let m=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`保存配置`);m.type=`button`,m.addEventListener(`click`,()=>{m.disabled=!0,(async()=>{let e={};for(let t of s){if(!t.changed())continue;let n=t.key.split(`.`),r=e;for(let e=0;e<n.length;e++){let i=n[e];if(i===void 0)break;if(e===n.length-1)r[i]=t.read();else{let e=r[i]??{};r[i]=e,r=e}}}try{await Dy(`/dsh-tiddlywiki/admin/config`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(e)}),O(`配置已保存`),n()}catch(e){O(`保存失败:${e instanceof Error?e.message:String(e)}`)}finally{m.disabled=!1}})()}),r.append(m),e.append(r)}function jy(e,t,n,r){let i=n?.plugins??[],a=n?.themes??[],o=n?.languages??[],s=new Set(t?.plugins??[]),c=new Set(t?.themes??[]),l=new Set(t?.languages??[]),u=$(`section`,`dsh-tw-settings-section`);u.append($(`h3`,`dsh-tw-settings-h`,`插件管理(自带官方插件)`));let d=$(`input`,`dsh-tw-settings-input dsh-tw-settings-search`);d.placeholder=`搜索插件…`;let f=$(`div`,`dsh-tw-settings-list`),p=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`应用插件(重启 TW)`);p.type=`button`;let m=e=>{f.replaceChildren();let t=e.toLowerCase();for(let e of i){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=s.has(e.name),n.addEventListener(`change`,()=>{n.checked?s.add(e.name):s.delete(e.name)});let r=$(`label`,`dsh-tw-settings-row dsh-tw-settings-plugin`),i=$(`span`,`dsh-tw-settings-name`,e.label);i.title=e.name;let a=$(`span`,`dsh-tw-settings-muted`,e.description||e.name);r.append(n,i,a),f.append(r)}};d.addEventListener(`input`,()=>m(d.value)),p.addEventListener(`click`,()=>{p.disabled=!0,(async()=>{try{await Dy(Ty,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({plugins:[...s]})}),O(`插件已应用,TW 已重启`),r()}catch(e){O(`应用失败:${e instanceof Error?e.message:String(e)}`),p.disabled=!1}})()}),m(``),u.append(d,f,p),e.append(u);let h=$(`section`,`dsh-tw-settings-section`);h.append($(`h3`,`dsh-tw-settings-h`,`主题管理(自带主题)`));let g=$(`div`,`dsh-tw-settings-muted`,`「加载」= TW 里可用的主题(可多选,依赖链自动带上,如 heavier 会带 snowwhite+vanilla);「活动」= 当前视觉主题(单选,自动加入加载集)。应用后重启 TW。`),_=$(`div`,`dsh-tw-settings-row dsh-tw-settings-head`);_.append($(`span`,`dsh-tw-settings-col`,`加载`),$(`span`,`dsh-tw-settings-col`,`活动`),$(`span`,`dsh-tw-settings-name`,`主题`));let v=t?.themes??[],y=v.length>0?v[v.length-1]:`tiddlywiki/vanilla`,b=$(`div`,`dsh-tw-settings-list`);for(let e of a){let t=$(`input`,`dsh-tw-settings-check`);t.type=`checkbox`,t.checked=c.has(e.name),t.title=`加载该主题`,t.addEventListener(`change`,()=>{t.checked?c.add(e.name):c.delete(e.name)});let n=$(`input`,`dsh-tw-settings-check`);n.type=`radio`,n.name=`dsh-tw-active-theme`,n.checked=e.name===y,n.title=`设为活动主题`,n.addEventListener(`change`,()=>{n.checked&&(y=e.name)});let r=$(`span`,`dsh-tw-settings-name`,e.label);r.title=e.name;let i=$(`span`,`dsh-tw-settings-muted`,e.description||e.name),a=$(`div`,`dsh-tw-settings-row dsh-tw-settings-plugin`);a.append(t,n,r,i),b.append(a)}let x=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`应用主题(重启 TW)`);x.type=`button`,x.addEventListener(`click`,()=>{x.disabled=!0,(async()=>{try{await Dy(Ty,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({themes:[...c],themeActive:y})}),O(`主题已应用,TW 已重启`),r()}catch(e){O(`应用失败:${e instanceof Error?e.message:String(e)}`),x.disabled=!1}})()}),h.append(g,_,b,x),e.append(h);let S=$(`section`,`dsh-tw-settings-section`);S.append($(`h3`,`dsh-tw-settings-h`,`语言管理(自带官方语言包)`));let C=$(`div`,`dsh-tw-settings-muted`,`勾选启用语言插件并重启 TW;如中文请选 zh-Hans(简体)或 zh-CN。`),ee=$(`div`,`dsh-tw-settings-list`);for(let e of o){let t=$(`input`,`dsh-tw-settings-check`);t.type=`checkbox`,t.checked=l.has(e.name),t.addEventListener(`change`,()=>{t.checked?l.add(e.name):l.delete(e.name)});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),ee.append(n)}let w=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`应用语言(重启 TW)`);w.type=`button`,w.addEventListener(`click`,()=>{w.disabled=!0,(async()=>{try{await Dy(Ty,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({languages:[...l]})}),O(`语言已应用,TW 已重启`),r()}catch(e){O(`应用失败:${e instanceof Error?e.message:String(e)}`),w.disabled=!1}})()}),S.append(C,ee,w),e.append(S)}function My(e){let t=$(`section`,`dsh-tw-settings-section`);t.append($(`h3`,`dsh-tw-settings-h`,`初始化(一次性预置)`));let n=$(`div`,`dsh-tw-settings-muted`,`这些是插件与 dsh 联动、需要在 wiki 里预置的 tiddler/配置。「发送给 Agent 按钮」和「TW 前端 API 基址」是功能必需项,启动时自动写入(只写缺失,不覆盖你的改动);其余为可选项,默认不自动写入、也不会强绑定——需要时点「重新初始化」写入,不想要了可随时「反初始化」移除。`),r=$(`div`,`dsh-tw-settings-list`),i=$(`div`,`dsh-tw-settings-muted`),a=`/dsh-tiddlywiki/admin/seeds/remove`,o=async()=>{try{let e=await Dy(`/dsh-tiddlywiki/admin/seeds`);if(e.ok!==!0||!Array.isArray(e.items))throw Error(e.error??`获取失败`);r.replaceChildren();let t=0,n=0;for(let i of e.items){i.present&&(t+=1),i.removable&&(n+=1);let e=$(`span`,`dsh-tw-settings-chip`,i.present?`✓`:`✗`);e.dataset.state=i.present?`ok`:`missing`,e.title=i.present?`已存在`:`缺失`;let s=$(`span`,`dsh-tw-settings-name`,i.title);s.title=i.id;let c=$(`span`,`dsh-tw-settings-muted`,i.detail??i.description),l=$(`button`,`dsh-tw-settings-btn`,`重新初始化`);l.type=`button`,l.title=`强制重写「${i.title}」的内置内容(会覆盖当前 tiddler)`,l.addEventListener(`click`,()=>{l.disabled=!0,l.textContent=`执行中…`,(async()=>{try{let e=await fetch(Ey,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({id:i.id,force:!0}),signal:AbortSignal.timeout(3e4)}),t=await e.json().catch(()=>null);!e.ok||t?.ok!==!0?O(`重新初始化失败:${t?.error??t?.results?.[0]?.error??`HTTP ${e.status}`}`):O(`已重新初始化「${i.title}」`),o()}catch(e){O(`重新初始化失败:${e instanceof Error?e.message:String(e)}`)}finally{l.disabled=!1,l.textContent=`重新初始化`}})()});let u=$(`div`,`dsh-tw-settings-row dsh-tw-settings-plugin`);if(u.append(e,s,c,l),i.removable){let e=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-danger`,`反初始化`);e.type=`button`,e.title=`移除「${i.title}」写入的 tiddler 与 marker(恢复未初始化状态)`,e.addEventListener(`click`,()=>{window.confirm(`确定反初始化「${i.title}」?将删除它写入的 tiddler(含其一次性 marker),需要时可用「重新初始化」恢复。`)&&(e.disabled=!0,e.textContent=`移除中…`,(async()=>{try{let e=await fetch(a,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({id:i.id}),signal:AbortSignal.timeout(3e4)}),t=await e.json().catch(()=>null);!e.ok||t?.ok!==!0?O(`反初始化失败:${t?.error??t?.results?.[0]?.error??`HTTP ${e.status}`}`):O(`已反初始化「${i.title}」`),o()}catch(e){O(`反初始化失败:${e instanceof Error?e.message:String(e)}`)}finally{e.disabled=!1,e.textContent=`反初始化`}})())}),u.append(e)}r.append(u)}i.textContent=`共 ${e.items.length} 项,${t} 项已就绪;可移除 ${n} 项`}catch(e){i.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(Ey,{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?O(`重新初始化失败:${t?.error??`HTTP ${e.status}`}`):O(`全部已重新初始化`),o()}catch(e){O(`重新初始化失败:${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(a,{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?O(`反初始化失败:${t?.error??`HTTP ${e.status}`}`):O(`全部可选 seed 已反初始化`),o()}catch(e){O(`反初始化失败:${e instanceof Error?e.message:String(e)}`)}finally{c.disabled=!1,c.textContent=`全部反初始化`}})())}),t.append(n,i,r,s,c),e.append(t),o()}function Ny(e,t,n){e.replaceChildren(),Ay(e,t.config??{},n),jy(e,t.info,t.catalog,n),My(e)}function Py(){let e=c.useRef(null);return c.useEffect(()=>{let t=e.current;return t===null?void 0:Oy(t)},[]),c.createElement(`div`,{ref:e})}const Fy={tiddlywiki_get:`读取笔记`,tiddlywiki_search:`检索笔记`,tiddlywiki_recent:`最近修改`,tiddlywiki_list_tags:`标签列表`,tiddlywiki_put:`写入笔记`,tiddlywiki_batch_put:`批量写入`,tiddlywiki_rename:`重命名笔记`,tiddlywiki_delete:`删除笔记`,tiddlywiki_git_sync:`git 同步`,tiddlywiki_git_resolve:`git 冲突解决`};function Iy(e){return typeof e==`object`&&!!e&&e.kind===`tool-result`}function Ly(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 Ry(e){try{let t=JSON.parse(e);return typeof t==`object`&&t&&!Array.isArray(t)?t:{}}catch{return{}}}function zy(e){return Array.isArray(e)?e.filter(e=>typeof e?.text==`string`).map(e=>e.text).join(`
675
+ `):``}function By(e){return typeof e==`string`?e:``}async function Vy(e){try{let t=await fetch(e,{signal:AbortSignal.timeout(1e4)});if(!t.ok)return null;let n=await t.json();return typeof n==`object`&&n?n:null}catch{return null}}async function Hy(e){try{let t=await fetch(`/dsh-tiddlywiki/tw/render`,{method:`POST`,headers:{"content-type":`application/json`,"x-requested-with":`TiddlyWiki`},body:JSON.stringify({title:e}),signal:AbortSignal.timeout(1e4)});return t.ok?await t.text():null}catch{return null}}function Uy(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 Wy(e){return t=>{t.preventDefault(),t.stopPropagation(),je(e)}}function Gy(e){let t=Fy[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=>c.createElement(`span`,{className:`dsh-tw-toolcard-tag`,key: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)}function Ky(e){let{title:t}=e,{loading:n,data:r}=Uy(async()=>{let[e,n]=await Promise.all([Vy(`/dsh-tiddlywiki/get?title=${encodeURIComponent(t)}`),Hy(t)]);return{get:e,html:n}},[t]),i=r?.get??null,a=r?.html??null,o;o=n?c.createElement(`div`,{className:`dsh-tw-toolcard-loading`},`渲染中…`):i!==null&&i.notFound===!0?c.createElement(`div`,{className:`dsh-tw-toolcard-empty`},`tiddler「${t}」不存在`):typeof a==`string`&&a.length>0?c.createElement(`div`,{className:`dsh-tw-toolcard-native`,dangerouslySetInnerHTML:{__html:a}}):i!==null&&typeof i.text==`string`&&i.text.length>0?c.createElement(`pre`,{className:`dsh-tw-toolcard-fallback`},i.text):c.createElement(`div`,{className:`dsh-tw-toolcard-empty`},`wiki 服务不可用`);let s=Array.isArray(i?.tags)?i.tags.filter(e=>typeof e==`string`):[],l=typeof i?.modified==`string`?i.modified:void 0;return c.createElement(Gy,{toolName:e.toolName,title:t,subtitle:e.subtitle,tags:s,onOpen:Wy(t),foot:l===void 0?void 0:`修改于 ${l}`},o)}function qy(e){return c.createElement(`a`,{className:`dsh-tw-toolcard-row`,href:`/dsh-tiddlywiki/tw/#${encodeURIComponent(e.title)}`,onClick:Wy(e.title),title:e.title},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)}function Jy(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(qy,{key:`${e.title}-${t}`,...e}))),c.createElement(Gy,{toolName:e.toolName,title:e.title,subtitle:e.subtitle},n)}function Yy(e){let t=By(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.limit==`number`&&n.set(`limit`,String(e.args.limit));let r=n.toString(),i=Uy(()=>Vy(`/dsh-tiddlywiki/search?${r}`),[r]).data,a=(Array.isArray(i?.items)?i.items:[]).map(e=>({title:By(e.title),tags:Array.isArray(e.tags)?e.tags.filter(e=>typeof e==`string`):[],modified:typeof e.modified==`string`?e.modified:null})),o=typeof i?.total==`number`?i.total:void 0,s=`关键词「${t||`(全部)`}」${o===void 0?``:` · 共 ${o} 条`}`;return c.createElement(Jy,{toolName:e.toolName,title:t.length>0?t:`检索`,subtitle:s,rows:a,fallbackText:`没有匹配的笔记`})}function Xy(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=Uy(()=>Vy(`/dsh-tiddlywiki/recent?${n}`),[n]).data,i=(Array.isArray(r?.items)?r.items:[]).map(e=>({title:By(e.title),tags:Array.isArray(e.tags)?e.tags.filter(e=>typeof e==`string`):[],modified:typeof e.modified==`string`?e.modified:null}));return c.createElement(Jy,{toolName:e.toolName,title:`最近修改`,subtitle:i.length>0?`最近 ${i.length} 条`:``,rows:i,fallbackText:`暂无笔记`})}function Zy(e){let t=(Array.isArray(e.args.items)?e.args.items:[]).map(e=>typeof e==`object`&&e&&typeof e.title==`string`?By(e.title):null).filter(e=>e!==null&&e.length>0).map(e=>({title:e}));return c.createElement(Jy,{toolName:e.toolName,title:`批量写入`,subtitle:t.length>0?`写入 ${t.length} 篇`:`(参数中没有可解析的 items)`,rows:t,fallbackText:`没有可展示的笔记`})}function Qy(e){let t=Uy(()=>Vy(`/dsh-tiddlywiki/tags`),[]).data,n=(Array.isArray(t?.items)?t.items:[]).map(e=>({tag:By(e.tag),count:typeof e.count==`number`?e.count:0})),r;return r=n.length===0?c.createElement(`div`,{className:`dsh-tw-toolcard-empty`},`暂无标签`):c.createElement(`div`,{className:`dsh-tw-toolcard-tags-wrap`},...n.map(e=>c.createElement(`span`,{className:`dsh-tw-toolcard-tag`,key:e.tag},`${e.tag} · ${e.count}`))),c.createElement(Gy,{toolName:e.toolName,title:`标签`,subtitle:`共 ${n.length} 个`},r)}function $y(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(Gy,{toolName:e.toolName},t)}function eb(e){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(Gy,{toolName:e.toolName,title:e.title.length>0?e.title:void 0},t)}function tb(e,t){switch(e){case`tiddlywiki_get`:case`tiddlywiki_put`:case`tiddlywiki_delete`:return By(t.title);case`tiddlywiki_rename`:return By(t.newTitle);case`tiddlywiki_search`:return By(t.query);case`tiddlywiki_recent`:case`tiddlywiki_list_tags`:case`tiddlywiki_batch_put`:case`tiddlywiki_git_sync`:case`tiddlywiki_git_resolve`:return``;default:return``}}function nb(e){let t=e.block,n=e.toolName,r=Iy(t),i=Ly(t),a=n!==void 0&&n.length>0?n:i?.name??``,o=Ry(i?.argsRaw??``),s=r?zy(t.content):``;if(i===null)return c.createElement(Gy,{toolName:a},c.createElement(`pre`,{className:`dsh-tw-toolcard-fallback`},s||`(无调用信息)`));if(!r)return c.createElement(Gy,{toolName:a,title:tb(a,o)},c.createElement(`div`,{className:`dsh-tw-toolcard-pending`},`处理中…`));if(t.isError===!0)return c.createElement(Gy,{toolName:a,title:tb(a,o)},c.createElement(`div`,{className:`dsh-tw-toolcard-error`},s||`工具调用失败`));switch(a){case`tiddlywiki_get`:return c.createElement(Ky,{toolName:a,title:By(o.title),subtitle:`读取`});case`tiddlywiki_put`:return c.createElement(Ky,{toolName:a,title:By(o.title),subtitle:`已写入`});case`tiddlywiki_rename`:return c.createElement(Ky,{toolName:a,title:By(o.newTitle),subtitle:`已重命名「${By(o.oldTitle)}」→`});case`tiddlywiki_delete`:return c.createElement(eb,{toolName:a,title:By(o.title),text:s});case`tiddlywiki_batch_put`:return c.createElement(Zy,{toolName:a,args:o,text:s});case`tiddlywiki_search`:return c.createElement(Yy,{toolName:a,args:o,text:s});case`tiddlywiki_recent`:return c.createElement(Xy,{toolName:a,args:o,text:s});case`tiddlywiki_list_tags`:return c.createElement(Qy,{toolName:a,text:s});case`tiddlywiki_git_sync`:case`tiddlywiki_git_resolve`:return c.createElement($y,{toolName:a,text:s});default:return c.createElement(Gy,{toolName:a,title:tb(a,o)},c.createElement(`pre`,{className:`dsh-tw-toolcard-fallback`},s||`(完成)`))}}const rb=[`tiddlywiki_get`,`tiddlywiki_search`,`tiddlywiki_recent`,`tiddlywiki_list_tags`,`tiddlywiki_put`,`tiddlywiki_batch_put`,`tiddlywiki_rename`,`tiddlywiki_delete`,`tiddlywiki_git_sync`,`tiddlywiki_git_resolve`];function ib(e){let t=[];for(let n of rb)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}`},nb));r!==void 0&&t.push(r)}catch(e){console.error(`[dsh-tiddlywiki] register toolview ${n} failed:`,e)}return t}function ab(){let e=e=>{let t=e.target;if(!(t instanceof Element))return;let n=t.closest(`a`);if(n===null)return;let r=(n.getAttribute(`href`)??``).match(/^\/dsh-tiddlywiki\/tw\/#(.+)$/);if(r===null||r[1]===void 0)return;e.preventDefault(),e.stopPropagation();let i=r[1];try{i=decodeURIComponent(i)}catch{}je(i)};return document.addEventListener(`click`,e,!0),()=>document.removeEventListener(`click`,e,!0)}const ob=`dsh-tiddlywiki`,sb=`dsh-tiddlywiki/rightbar`;function cb(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=Se(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(de,{detail:sb}));let e=e=>{e.detail!==sb&&o()};return document.addEventListener(de,e),()=>document.removeEventListener(de,e)},[a,o]),c.createElement(`div`,{ref:r,className:`dsh-tw-rightbar-tab`,"data-dsh-tw-rightbar":``})}function lb(){return{id:ob,kind:`dsh-tiddlywiki`,title:()=>he(),guide:[{order:10,title:()=>`TiddlyWiki 知识库`,description:()=>`在右侧边栏打开 TiddlyWiki 编辑器(与聊天并排)`,icon:ve}]}}function ub(e,t){let n=[];try{n.push(e.register(lb()));let r=t.inject(`sidebar.right.pane.tab`,()=>t.register({name:`sidebar.right.pane.tab`,key:ob},cb));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 xe(),()=>{for(let e of n.splice(0))e()}}const db=[`slots`];function fb(e){try{u();let t=new d,n=[],r=!1;try{let i=iy(),a=ly();n.push(()=>i.dispose()),n.push(()=>a.dispose()),n.push(v(t)),n.push(Ie(t)),n.push(hy(t,i,a)),n.push(We),e.slots!==void 0&&fy().then(t=>{if(r)return;if(t.showQuickNoteDock){let t=e.slots?.inject(`conversation.input.dock`,()=>e.slots?.register({name:`conversation.input.dock`,id:`quick-note`,order:8,label:`快速笔记`},gy(i)));t!==void 0&&n.push(t)}let a=wy(e.slots,t);a!==void 0&&n.push(a)})}catch(e){console.error(`[dsh-tiddlywiki] mount failed:`,e)}try{let t,i=a=>{let o=e.get?.(`sidebarRightTabs`);if(o===void 0){a<6&&!r&&(t=window.setTimeout(()=>i(a+1),500*(a+1)));return}fy().then(t=>{if(r||!t.showRightbarTab)return;let i=ub(o,e.slots);i!==void 0&&n.push(i)})};i(0),n.push(()=>{t!==void 0&&window.clearTimeout(t)})}catch(e){console.error(`[dsh-tiddlywiki] rightbar mount failed:`,e)}try{e.slots!==void 0&&n.push(...ib(e.slots))}catch(e){console.error(`[dsh-tiddlywiki] tool views failed:`,e)}try{n.push(ab())}catch(e){console.error(`[dsh-tiddlywiki] wiki link interceptor failed:`,e)}try{let t=e.slots?.inject(`settings.section`,()=>e.slots?.register({name:`settings.section`,id:`dsh-tiddlywiki`,order:50,label:`TiddlyWiki 知识库`},Py));t!==void 0&&n.push(t)}catch(e){console.error(`[dsh-tiddlywiki] settings section failed:`,e)}e.effect?.(()=>()=>{r=!0;for(let e of n.splice(0))e()},`dsh-tiddlywiki: client mount`)}catch(e){console.error(`[dsh-tiddlywiki] client half failed to start:`,e)}}exports.apply=fb,exports.inject=db,exports.name=`dsh-tiddlywiki/client`;