dsh-tiddlywiki 0.16.23 → 0.16.24

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
@@ -33,6 +33,7 @@
33
33
  | 🧩 **Better Sidebar Tab** | dsh-better-sidebar 侧边栏:+ 菜单注册 TiddlyWiki tab,与聊天并排;链接点击可直达;未安装该插件自动跳过(v0.16.23) |
34
34
  | 📚 **会话知识库 Tab** | 每个会话顶部汇总本会话读写过的 wiki 笔记,TW 原生渲染(`/tw/render` 片段管线,v0.16.19) |
35
35
  | 📝 **快速笔记** | 输入框上方快捷按钮或右下角「知识库」FAB;原生编辑页或 Markdown 卡片两种模式;首页内置「快速记笔记(完整编辑器)」 |
36
+ | 📌 **本地剪藏桥** | 可选「剪藏桥 + 书签小工具」:DSH 监听 127.0.0.1 端口接收剪藏请求(Host 校验防 rebinding),浏览器书签一键把当前页标题/URL/选中文字写进知识库(配置 `bridge.*`,默认 `clip` 标签,随 wiki 自动进 git) |
36
37
  | ✅ **待办四象限** | 首页看板:任务打 `todo` 标签即收录,拖动即可分类/完成(正文附 `q` 字段),逾期/今日到期自动统计 |
37
38
  | 🌗 **跟随主题** | 内嵌 TW 自适应 DSH 深浅主题(纯内存切换,不进 git) |
38
39
  | 🔄 **一键同步** | FAB「同步」一键 pull→commit→push,状态点实时反映 git 状态 |
@@ -102,6 +103,7 @@ dsh plugin --profile web add link:/path/to/dsh-tiddlywiki
102
103
  - **🗂️ 右侧边栏 Tab**(v0.16.21):DSH 新右侧栏展开后,首页会出现「**TiddlyWiki 知识库**」入口盒,点击即在右侧栏以 tab 形式打开完整 TW 编辑器——**与聊天并排**,适合边聊边查/边记。由 `ui.showRightbarTab` 控制(默认开);老版本 DSH(无右侧栏)自动跳过。
103
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
105
  - **📝 快速笔记**:输入框上方快捷按钮(`ui.showQuickNoteDock`)或 FAB;`ui.quickNoteMode` 选打开方式——**native**(默认,直达 TW 原生编辑页,草稿自动续写)或 **card**(CodeMirror 6 Markdown 高亮、文件上传、多选 tag、草稿自动保存、「🕘 最近」载入、Ctrl+Enter 保存)。
106
+ - **📌 本地剪藏桥**(可选,v0.16.24):DSH 设置 → 常规配置 → 勾选「**启用本地剪藏桥**」(保存后立即生效)——DSH 即监听 `127.0.0.1:8618` 接收剪藏请求。浏览器书签栏新建书签,把设置页/知识库文档里的 JS 代码粘贴为地址,点一下就把**当前页标题 / URL / 选中文字**写进 wiki(默认 `clip` 标签、正文含来源与选中文字、重名自动 `(2)` 去重;随 wiki 自动 git commit)。「📚 插件文档」栏的 `本地剪藏桥(书签小工具)` seed 文档含完整步骤、书签代码、安全说明与 curl 用法。安全:桥只监听 127.0.0.1 + Host 白名单防 DNS rebinding;**强烈建议设 `bridge.token`**(非空时校验书签的 `x-clip-token` 头,防止任意网页往 wiki 里塞内容)。
105
107
  - **🏠 首页(初始化 home-index 后)**:待办四象限(`todo` 标签 + `q` 字段拖放分类)+ 快速记笔记(完整编辑器,勾选「同时加入待办」即建任务)+「所有标签 / 所有文章」入口 +「📚 插件文档」栏(自动收录所有带 `dsh-docs` 标签的 seed 文档)。
106
108
  - **📚 会话知识库 Tab**:会话顶部 Tab(`ui.tabLabel` 改名、`ui.showSessionTab` 关闭),自动汇总本会话读写过的 wiki 笔记(写入 volatile `$:/temp`,不落盘不进 git),**TW 原生渲染**(v0.16.19 起 `/tw/render` 片段管线,与回复流工具卡同链路),链接点击直达中央 TW 面板,不可编辑。
107
109
  - **🌗 跟随 DSH 主题**:内嵌 TW 随 DSH 深浅切换 palette,纯内存不写回 wiki(`ui.followDshTheme`/`ui.darkPalette`)。
@@ -123,6 +125,7 @@ seed 是把「wiki 里预置内容」随插件分发的机制:**ONE-SHOT(只
123
125
  | | `all-articles` | 「所有文章」两列分页总览(🤖 Agent / 👤 人工) | 手动 |
124
126
  | | `ui-styles` | 自定义样式 5 张(编辑器美化 / 窄屏侧栏 / menubar 加高 / 批注弹窗等) | 手动 |
125
127
  | | `menubar-theme` | menubar 顶栏跟随 DSH 主题换色 | 手动 |
128
+ | | `clip-bridge` | 「本地剪藏桥(书签小工具)」使用说明——含书签代码 / 启用步骤 / 安全说明(真功能在插件运行时代码里,此 seed 只预置文档) | 手动 |
126
129
 
127
130
  - **想获得完整插件体验**:核心 3 项首次安装就有;再补 `home-index`(首页)+ `starter-docs`(示例文档)即是一个开箱即用的文档中心。
128
131
  - **一个可选项都不想要**:完全不影响功能——设置页「反初始化」即可,核心项受保护不可移除。
@@ -147,6 +150,11 @@ seed 是把「wiki 里预置内容」随插件分发的机制:**ONE-SHOT(只
147
150
  branch: "main"
148
151
  note:
149
152
  tag: "inbox" # 快速笔记默认 tag
153
+ bridge:
154
+ enabled: false # 本地剪藏桥(书签小工具);保存后立即生效
155
+ port: 8618 # 监听端口(127.0.0.1;改后需重启 dsh web)
156
+ token: "" # 共享口令;非空时校验书签的 x-clip-token 头(强烈建议设置)
157
+ tag: "clip" # 剪藏笔记默认 tag
150
158
  ui:
151
159
  showQuickNote: true # FAB 里显示快速笔记入口
152
160
  showQuickNoteDock: true # 输入框上方快捷按钮
@@ -185,6 +193,7 @@ npm install
185
193
  npm run typecheck # tsc --noEmit
186
194
  npm run build # clean + host tsdown + client tsdown + wrap
187
195
  npm run selftest # headless:spawn TW → REST 读写 → git → 退出回收
196
+ node scripts/verify-clip-bridge.mjs # 剪藏桥 headless 验收(build 后跑)
188
197
  node scripts/verify-seeds-admin.mjs # /admin/seeds 状态与 run 的 E2E
189
198
  ```
190
199
 
@@ -239,11 +248,12 @@ src/
239
248
  │ ├── git.ts # git init/commit/pull/push/sync/status + AutoCommitter
240
249
  │ ├── routes.ts # 全部 DSH 路由 + agent-send/create/modes + session/summary
241
250
  │ ├── http.ts # 共用 HTTP 助手(readBody/json)
251
+ │ ├── clip-bridge.ts # 本地剪藏桥(v0.16.24):127.0.0.1 监听 + POST /clip 写 wiki(Host 校验/token/CORS preflight)
242
252
  │ ├── session-summary.ts # 会话「知识库」Tab 后端
243
253
  │ ├── admin.ts # 设置页后台:tiddlywiki.info 读写 + /admin/*
244
254
  │ ├── config.ts # ConfigStore:cordis config 基底 + 配置 tiddler 覆盖层
245
- │ ├── seeds.ts # 统一 seed 注册表(9 项,三层:核心/起步/可选)
246
- │ ├── seed-*.ts # 各 seed 实现(bundle/首页/ui-styles 常量脚本生成;starter-docs/menubar 手工维护)
255
+ │ ├── seeds.ts # 统一 seed 注册表(10 项,三层:核心/起步/可选)
256
+ │ ├── seed-*.ts # 各 seed 实现(bundle/首页/ui-styles 常量脚本生成;starter-docs/menubar/clip-bridge 手工维护)
247
257
  │ └── tools.ts # 10 个 tiddlywiki_* 工具(列表式注册)
248
258
  └── client/ # 浏览器半部
249
259
  ├── index.ts # client 入口(inject ['slots'],纯 DOM,永不 throw)
@@ -268,6 +278,8 @@ lib/ # 预构建产物(发布含 lib/**,提交入库;
268
278
 
269
279
  > 最近几个主要版本的一句话记录(完整变更见 [Releases](https://github.com/bbqisbbq/dsh-tiddlywiki/releases) / git log)。
270
280
 
281
+ - **v0.16.24**(2026-09-09):**新:本地剪藏桥 + 书签小工具**。DSH 进程内新增只监听 **127.0.0.1** 的 HTTP 桥(配置组 `bridge.*`:`enabled` 默认关、`port` 默认 8618、`token` 可选共享口令、`tag` 默认 `clip`)——浏览器书签(JS 小工具)把当前页标题/URL/选中文字 POST 给它,经唯一写入通道落进 wiki(markdown、重名自动 `(2)` 去重、默认 `clip` 标签、随 wiki 自动 git commit)。安全:Host 头白名单防 DNS rebinding、CORS/PNA 预检放行(https 页面书签可用)、`bridge.token` 强烈建议设置。附**可选 seed** `clip-bridge`:「本地剪藏桥(书签小工具)」说明文档(含书签代码/启用步骤/安全说明/curl 用法,打 `dsh-docs` 标签进「📚 插件文档」栏,可反初始化);设置页新增 4 个配置字段。`enabled`/`token`/`tag` 设置页保存即生效,改端口需重启 dsh web。
282
+
271
283
  - **v0.16.23**(2026-09-09):**新:DSH Better Sidebar(dsh-better-sidebar)集成**。插件通过 `ctx.betterSidebar` 服务注册 TiddlyWiki 为 Better Sidebar 侧边栏的 tab 类型——+ 菜单点击即以 tab 打开完整 TW 编辑器(同源代理 iframe,与聊天并排);TW iframe 机制抽成共享模块(rightbar/better-sidebar 复用:lazy-load / status 轮询 / 主题同步 / hash 导航 / 互斥协议),回复流 wiki 链接在同一处统一路由到任一可见的侧边 TW tab。配置 `ui.showBetterSidebarTab`(默认 true)可开关;未安装 Better Sidebar 自动跳过。**更新后刷新页面**即可看到入口。
272
284
  - **v0.16.22**(2026-09-09):**seed 体系三层化 + 文档中心起步包**。① 分层:**核心**(自动、不可移除:发送按钮/渲染路由/代理基址)+ **起步**(首次安装默认写、可移除:插件说明 + 新增「示例与文档」seed——主题汇总模板/教程/三个示例主题页)+ **可选**(手动:首页/所有文章/新增「自定义样式」seed/顶栏主题);所有种子**安全跳过**(同名 tiddler 已存在绝不覆盖)。② 新增 **`dsh-docs`** 文档合集约定:所有 seed 文档打该标签,首页「📚 插件文档」tabs 栏自动收录。③ seed 版首页改为**通用版**(`gen-seed-home --strip-private`:剥离作者私有人口,注入文档栏)。④ **修**:首页快速记笔记的 tags 筛选器 bug(`then[[todo]]` 操作数双括号导致「筛选器错误」被拆成 6 个 tag → 改为 `then[todo]`)。
273
285
  - **v0.16.21**(2026-09-09):**新:DSH 右侧边栏(rightbar)集成**。注册 TiddlyWiki 为右侧栏 tab 类型——rightbar 首页出现「**TiddlyWiki 知识库**」入口盒,点击即在右侧栏以 tab 形式打开完整 TW 编辑器(同源代理 iframe,跟随 DSH 主题),**与聊天并排**;配置 `ui.showRightbarTab`(默认 true)可开关。**更新后刷新页面**即可看到入口。
@@ -671,5 +671,5 @@ html[data-dsh-tw-active] .dshDesktopConversationSurface > :not([data-dsh-tw-view
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
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=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`保存配置`);p.type=`button`,p.addEventListener(`click`,()=>{p.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{p.disabled=!1}})()}),r.append(p),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(`
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
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`;