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