dsh-tiddlywiki 0.16.4 → 0.16.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -22,7 +22,7 @@
22
22
  | 📤 **一键发送给 Agent** | TW 笔记工具栏「**发送给 Agent**」按钮(首次启动自动写入 wiki;**独立加粗纸飞机图标**,遵循核心工具栏图标约定,工具栏设置列表也显示各按钮图标/说明):把当前笔记作为消息注入所选 dsh 会话(按工作区分组选择,可新建工作区/会话,**可选「工作模式」= Agent 预设**、**可选「权限」= 权限预设**(沙箱+审批),**可选附加说明**随消息一起发给 Agent(**位于消息末尾**,作为你的最终补充要求,v0.16.3),已有会话显示其当前模式);**消息自动附加待办说明**——告知 Agent 这是用户提前编辑在 wiki 中的待办事项,不清楚应主动提问 |
23
23
  | 🧭 **内嵌编辑器** | 侧边栏「TiddlyWiki」入口(**显示名可自定义**,`ui.sidebarLabel`)→ 中央列内嵌完整 TW 5 编辑器(**同源代理**,经 DSH origin 访问,Tailscale/内网/域名/HTTPS 均可用) |
24
24
  | 🌗 **跟随 DSH 主题** | 嵌入式 TW(中央面板 +「在 TW 中编辑」弹窗)**自适应 DSH 深浅主题**:暗色自动切深色 palette、浅色恢复原 palette;**纯内存切换,不写回 wiki、不进 git**;设置页可关可换深色 palette |
25
- | 📝 **快速笔记** | 右下角「知识库」悬浮按钮 **或聊天输入框上方的快捷按钮**(`ui.showQuickNoteDock`,与 todo/cost-meter/goal 等插件内容同槽位纵向排列、不重叠)→ 快速笔记卡片:**CodeMirror 6** Markdown 编辑器(语法高亮 + 撤销/重做)、文件上传、多选/自动补全 tag、**草稿自动保存(刷新不丢)**、**「🕘 最近」一键载入旧笔记**,Ctrl+Enter 保存;**卡片只允许点右上角 ✕ 关闭**(点页面其他位置不会误关);可整体隐藏 |
25
+ | 📝 **快速笔记** | 右下角「知识库」悬浮按钮 **或聊天输入框上方的快捷按钮**(`ui.showQuickNoteDock`,与 todo/cost-meter/goal 等插件内容同槽位纵向排列、不重叠;按钮右缘实时贴齐输入框)→ 快速笔记卡片:**CodeMirror 6** Markdown 编辑器(语法高亮 + 撤销/重做)、文件上传、多选/自动补全 tag、**草稿自动保存(刷新不丢)**、**「🕘 最近」一键载入旧笔记**,Ctrl+Enter 保存;**从按钮打开时卡片在按钮上方弹出、按住标题栏可自由拖动**;**卡片只允许点右上角 ✕ 关闭**(点页面其他位置不会误关);可整体隐藏 |
26
26
  | 🔄 **一键同步** | 「知识库」按钮 →「🔁 同步」:pull → commit → push;FAB 上的状态点实时反映 git 状态(已同步/待提交/可更新/离线),菜单里的状态行**悬停弹出详细 tip**(TW 服务 + git 状态 + 最近日志) |
27
27
  | ⚙️ **设置页** | DSH 设置 →「TiddlyWiki 知识库」:插件/主题/语言管理与运行配置,应用后自动重启 TW;**「初始化」区块**列出所有一次性预置项(说明笔记/发送按钮/首页/所有文章/**menubar 顶栏主题自适应**/同源代理基址)的实时状态:**功能必需项**(发送按钮 + 代理基址)启动自动写入,**可选项默认不写入、不强绑定**——每项可手动**重新初始化**,可选项可**反初始化**(移除);**「所有文章」每页条数**可在配置里调整(实时生效,无需重新初始化) |
28
28
  | 🛡 **零摩擦生命周期** | 随 dsh 自动启停;TW 子进程崩溃自动重启(退避);端口/目录/首次 git init 全自动 |
@@ -34,6 +34,8 @@
34
34
 
35
35
  > 最近几个主要版本的一句话更新记录(完整变更见 git log / Releases)。
36
36
 
37
+ - **v0.16.6**(2026-09-06):**快速笔记按钮与输入框对齐 + 卡片在按钮上方弹出 + 卡片可自由拖动**。① dock 按钮 mount 后实时测量 composer 输入框右缘、把按钮右缘贴齐(含窗口/列宽变化重新对齐),不再悬在整列最右端;② 从按钮打开时卡片在**按钮上方跟随弹出**(水平居中、视口内自动收拢;FAB 打开仍走右下角默认位);③ 卡片**按住标题栏可自由拖动**(pointer events + setPointerCapture,触屏可用),✕ 仍是唯一关闭方式。纯客户端改动,刷新页面即生效。
38
+ - **v0.16.5**(2026-09-06):**修:输入框上方「快速笔记」按钮放到横条末尾(右端)**(原为靠左、视觉悬空;改为 `justify-content: flex-end`)。纯客户端样式调整,刷新页面即生效。
37
39
  - **v0.16.4**(2026-09-06):**一批零散界面优化**。① **输入框上方「快速笔记」快捷按钮**(`ui.showQuickNoteDock`,默认开):挂在 DSH 官方 `conversation.input.dock` 槽位,与 todo/cost-meter/goal/queue/git-graph 等插件内容同区纵向排列、**不重叠不遮挡**;② 快速笔记卡片**只能点 ✕ 关闭**(移除「点页面其他位置即收起」,不会误关);③ 侧边栏 TW 入口**显示名可自定义**(`ui.sidebarLabel`,默认「TiddlyWiki」,设置页可改);④ 「知识库」菜单去掉第二行 git 状态行,**第一行(TW 服务状态)悬停弹出详细 tip**(TW 服务 + git 状态 + 最近日志);⑤ **退出/重启 dsh web 时确保 TW 后端子进程真正关闭**——host teardown 现在返回 Promise,随 cordis fiber.dispose 被 await(dsh web 关机控制器最多等 5s),不再 fire-and-forget 遗留孤儿 TW 进程。改动均向后兼容(旧配置无新字段时走默认值)。
38
40
  - **v0.16.3**(2026-09-06):**「发送给 Agent」附加说明移到消息末尾 + 注入提示词补充「想法沉淀」约定**。① bundle v0.3.3:`【附加说明】` 段从「待办说明与正文之间」移到**正文之后、消息最末尾**——作为用户的最终补充要求(指令越靠后越优先遵循);弹层交互不变,在线 wiki 在「知识库」FAB →「🔄 重载 TW 面板」后生效;② 注入提示词(`PROMPT_TEXT`)新增「**想法沉淀**」段落:鼓励 Agent 把「未来可能有用 / 值得做」但不在当前执行范围内的想法,用 `tiddlywiki_put` 写成独立 tiddler,打上 `todo` + `agent-written` 标签(并附当前工作区名),正文说明来源(会话 / 工作区 / 项目背景),由用户决定是否继续;新会话在下次重启 dsh web 后生效。
39
41
  - **v0.16.0**(2026-09-05):**回复流原生 TW 工具卡片 + 可点击 wiki 链接**。新增 seed `render-route`(核心项):TW 内注册 `POST /render` 服务路由把 wiki 文本渲染成原生 HTML 片段,并把内部 wiki 链接改写为同源代理 hash(`tv-wikilink-template`,首次 seed 后自动重启 TW);全部 10 个 `tiddlywiki_*` 工具在回复流里显示**原生 TW 工具卡片**(`tool.call.toolview`):`get`/`put`/`rename` 原生渲染 tiddler、`search`/`recent`/`batch` 列可点击行、`list_tags` 计数 chips、`git`/`delete` 显示文本;**文档级点击拦截**——`[标题](/dsh-tiddlywiki/tw/#标题)` 与渲染片段里的 wiki 链接点击后打开中央 TW 面板并跳转该 tiddler;host 新增 `/search` 路由(关键词 + tags/tag/since/type/limit)、`/tags` 返回带计数的 items、`/get` 返回 modified。
@@ -137,8 +139,10 @@ dsh plugin --profile web add link:/path/to/your/dsh-tiddlywiki
137
139
  - 开关与深色 palette 可在设置页「常规配置」调整。
138
140
 
139
141
  **📝 快速笔记** — 两个入口,同一张卡片:
140
- - **入口一**:聊天输入框上方的**快捷按钮**(v0.16.4,`ui.showQuickNoteDock` 控制、默认开)——挂在 DSH 官方 `conversation.input.dock` 槽位(「输入框上方的全宽条目」,todo/cost-meter/goal/queue/git-graph 等插件内容也在这里),纵向 flex 排列,**天然不重叠**;
142
+ - **入口一**:聊天输入框上方的**快捷按钮**(v0.16.4,`ui.showQuickNoteDock` 控制、默认开)——挂在 DSH 官方 `conversation.input.dock` 槽位(「输入框上方的全宽条目」,todo/cost-meter/goal/queue/git-graph 等插件内容也在这里),纵向 flex 排列,**天然不重叠**;按钮**右缘实时贴齐输入框**(v0.16.6,随窗口/列宽变化自动重对齐),不再悬在整列最右端;
141
143
  - **入口二**:右下角「**知识库**」悬浮按钮 →「📝 快速笔记」;
144
+ - 从**输入框按钮**打开时,卡片在**按钮上方跟随弹出**(水平居中、自动收进视口;v0.16.6);从 FAB 打开走右下角默认位;
145
+ - 卡片**按住标题栏可自由拖动**到页面任意位置(v0.16.6,pointer events,触屏可用),拖动后位置即时生效;
142
146
  - 卡片(可折叠)**只能点右上角 ✕ 关闭**——点页面其他位置不会误关(v0.16.4 起移除「点外部收起」),草稿照常防抖自动保存;
143
147
  - **CodeMirror 6 编辑器**:真正的 Markdown 语法树高亮(标题/列表/代码/链接/表格/任务清单/删除线等,GFM),支持撤销/重做与行内编辑体验;
144
148
  - **草稿自动保存**:正文/标题/标签 500ms 防抖写入本地,关掉卡片或刷新页面都不丢;重开自动恢复,可一键「丢弃」;
@@ -115,7 +115,10 @@ html[data-dsh-tw-active] .dshDesktopConversationSurface > :not([data-dsh-tw-view
115
115
  display: flex; align-items: center; gap: 8px;
116
116
  font-size: 12px; font-weight: 600; letter-spacing: .2px;
117
117
  color: var(--dsw-alias-label-primary, #222);
118
+ /* 标题栏 = 拖动把手(拖卡片移动);touch-action:none 让触屏也能拖动 */
119
+ cursor: move; user-select: none; -webkit-user-select: none; touch-action: none;
118
120
  }
121
+ .dsh-tw-note-head-dragging { cursor: grabbing; opacity: .96; }
119
122
  .dsh-tw-note-head .dsh-tw-note-label { margin-right: auto; display: flex; align-items: center; gap: 6px; }
120
123
  .dsh-tw-note-close {
121
124
  border: none; background: transparent; color: var(--dsw-alias-label-secondary, #888);
@@ -455,10 +458,11 @@ html[data-dsh-tw-active] .dshDesktopConversationSurface > :not([data-dsh-tw-view
455
458
 
456
459
  /* ── input-dock quick-note button(聊天输入框上方,conversation.input.dock)──
457
460
  该槽位渲染为「输入框上方的全宽条目」纵向 flex 排列(todo/cost-meter/goal/
458
- queue/git-graph 等插件同区),此按钮以紧凑小胶囊呈现,不与其他条目重叠。 */
461
+ queue/git-graph 等插件同区),此按钮以紧凑小胶囊呈现,不与其他条目重叠。
462
+ justify-content: flex-end 把按钮放在输入框上方横条的末尾(右端)。 */
459
463
  .dsh-tw-dock-note {
460
- display: flex; align-items: center; gap: 8px;
461
- padding: 4px 6px 0; box-sizing: border-box; width: 100%;
464
+ display: flex; align-items: center; justify-content: flex-end; gap: 8px;
465
+ padding: 4px 8px 0; box-sizing: border-box; width: 100%;
462
466
  }
463
467
  .dsh-tw-dock-note-btn {
464
468
  display: inline-flex; align-items: center; gap: 6px;
@@ -647,7 +651,7 @@ html[data-dsh-tw-active] .dshDesktopConversationSurface > :not([data-dsh-tw-view
647
651
  }`,{label:`interface`,detail:`definition`,type:`keyword`}),ed("type ${name} = ${type}",{label:`type`,detail:`definition`,type:`keyword`}),ed(`enum \${name} {
648
652
  \${}
649
653
  }`,{label:`enum`,detail:`definition`,type:`keyword`})]),Dm=new Pc,Om=new Set([`Script`,`Block`,`FunctionExpression`,`FunctionDeclaration`,`ArrowFunction`,`MethodDeclaration`,`ForStatement`]);function km(e){return(t,n)=>{let r=t.node.getChild(`VariableDefinition`);return r&&n(r,e),!0}}const Am=[`FunctionDeclaration`],jm={FunctionDeclaration:km(`function`),ClassDeclaration:km(`class`),ClassExpression:()=>!0,EnumDeclaration:km(`constant`),TypeAliasDeclaration:km(`type`),NamespaceDeclaration:km(`namespace`),VariableDefinition(e,t){e.matchContext(Am)||t(e,`variable`)},TypeDefinition(e,t){t(e,`type`)},__proto__:null};function Mm(e,t){let n=Dm.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=jm[t.name];if(e&&e(t,a)||Om.has(t.name))return!1}else if(t.to-t.from>8192){for(let n of Mm(e,t.node))r.push(n);return!1}}),Dm.set(t,r),r}const Nm=/^[\w$\xa1-\uffff][\w$\d\xa1-\uffff]*$/,Pm=[`TemplateString`,`String`,`RegExp`,`LineComment`,`BlockComment`,`VariableDefinition`,`TypeDefinition`,`Label`,`PropertyDefinition`,`PropertyName`,`PrivatePropertyDefinition`,`PrivatePropertyName`,`JSXText`,`JSXAttributeValue`,`JSXOpenTag`,`JSXCloseTag`,`JSXSelfClosingTag`,`.`,`?.`];function Fm(e){let t=Y(e.state).resolveInner(e.pos,-1);if(Pm.indexOf(t.name)>-1)return null;let n=t.name==`VariableName`||t.to-t.from<20&&Nm.test(e.state.sliceDoc(t.from,t.to));if(!n&&!e.explicit)return null;let r=[];for(let n=t;n;n=n.parent)Om.has(n.name)&&(r=r.concat(Mm(e.state.doc,n)));return{options:r,from:n?t.from:e.pos,validFor:Nm}}const Im=jl.define({name:`javascript`,parser:wm.configure({props:[Yl.add({IfStatement:su({except:/^\s*({|else\b)/}),TryStatement:su({except:/^\s*({|catch\b|finally\b)/}),LabeledStatement:ou,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:iu({closing:`}`}),ArrowFunction:e=>e.baseIndent+e.unit,"TemplateString BlockComment":()=>null,"Statement Property":su({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}}),lu.add({"Block ClassBody SwitchBody EnumBody ObjectExpression ArrayExpression ObjectType":uu,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:`$`}}),Lm={test:e=>/^JSX/.test(e.name),facet:Dl({commentTokens:{block:{open:`{/*`,close:`*/}`}}})},Rm=Im.configure({dialect:`ts`},`typescript`),zm=Im.configure({dialect:`jsx`,props:[Ol.add(e=>e.isTop?[Lm]:void 0)]}),Bm=Im.configure({dialect:`jsx ts`,props:[Ol.add(e=>e.isTop?[Lm]:void 0)]},`typescript`);let Vm=e=>({label:e,type:`keyword`});const Hm=`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(Vm),Um=Hm.concat([`declare`,`implements`,`private`,`protected`,`public`].map(Vm));function Wm(e={}){let t=e.jsx?e.typescript?Bm:zm:e.typescript?Rm:Im,n=e.typescript?Em.concat(Um):Tm.concat(Hm);return new Vl(t,[Im.data.of({autocomplete:Fu(Pm,Pu(n))}),Im.data.of({autocomplete:Fm}),e.jsx?Jm:[]])}function Gm(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 Km(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 qm=typeof navigator==`object`&&/Android\b/.test(navigator.userAgent),Jm=H.inputHandler.of((e,t,n,r,i)=>{if((qm?e.composing:e.compositionStarted)||e.state.readOnly||t!=n||r!=`>`&&r!=`/`||!Im.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=Km(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=Gm(n);if(r&&r.name==`JSXOpenTag`&&!/^\/?>|^<\//.test(o.doc.sliceString(t,t+2))&&(i=Km(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)}),Ym=[`_blank`,`_self`,`_top`,`_parent`],Xm=[`ascii`,`utf-8`,`utf-16`,`latin1`,`latin1`],Zm=[`get`,`post`,`put`,`delete`],Qm=[`application/x-www-form-urlencoded`,`multipart/form-data`,`text/plain`],$m=[`true`,`false`],Q={},eh={a:{attrs:{href:null,ping:null,type:null,media:null,target:Ym,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:Ym}},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:Qm,formmethod:Zm,formnovalidate:[`novalidate`],formtarget:Ym,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":Xm,autocomplete:[`on`,`off`],enctype:Qm,method:Zm,novalidate:[`novalidate`],target:Ym}},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:Qm,formmethod:Zm,formnovalidate:[`novalidate`],formtarget:Ym,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:Xm,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:Xm}},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},th={accesskey:null,class:null,contenteditable:$m,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:$m,autocorrect:$m,autocapitalize:$m,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":$m,"aria-autocomplete":[`inline`,`list`,`both`,`none`],"aria-busy":$m,"aria-checked":[`true`,`false`,`mixed`,`undefined`],"aria-controls":null,"aria-describedby":null,"aria-disabled":$m,"aria-dropeffect":null,"aria-expanded":[`true`,`false`,`undefined`],"aria-flowto":null,"aria-grabbed":[`true`,`false`,`undefined`],"aria-haspopup":$m,"aria-hidden":$m,"aria-invalid":[`true`,`false`,`grammar`,`spelling`],"aria-label":null,"aria-labelledby":null,"aria-level":null,"aria-live":[`off`,`polite`,`assertive`],"aria-multiline":$m,"aria-multiselectable":$m,"aria-owns":null,"aria-posinset":null,"aria-pressed":[`true`,`false`,`mixed`,`undefined`],"aria-readonly":$m,"aria-relevant":null,"aria-required":$m,"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},nh=`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 nh)th[e]=null;var rh=class{constructor(e,t){this.tags={...eh,...e},this.globalAttrs={...th,...t},this.allTags=Object.keys(this.tags),this.globalAttrNames=Object.keys(this.globalAttrs)}};rh.default=new rh;function ih(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 ah(e,t=!1){for(;e;e=e.parent)if(e.name==`Element`)if(t)t=!1;else return e;return null}function oh(e,t,n){return n.tags[ih(e,ah(t))]?.children||n.allTags}function sh(e,t){let n=[];for(let r=ah(t);r&&!r.type.isTop;r=ah(r.parent)){let i=ih(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 ch=/^[:\-\.\w\u00b7-\uffff]*$/;function lh(e,t,n,r,i){let a=/\s*>/.test(e.sliceDoc(i,i+5))?``:`>`,o=ah(n,n.name==`StartTag`||n.name==`TagName`);return{from:r,to:i,options:oh(e.doc,o,t).map(e=>({label:e,type:`type`})).concat(sh(e.doc,n).map((e,t)=>({label:`/`+e,apply:`/`+e+a,type:`type`,boost:99-t}))),validFor:/^\/?[:\-\.\w\u00b7-\uffff]*$/}}function uh(e,t,n,r){let i=/\s*>/.test(e.sliceDoc(r,r+5))?``:`>`;return{from:n,to:r,options:sh(e.doc,t).map((e,t)=>({label:e,apply:e+i,type:`type`,boost:99-t})),validFor:ch}}function dh(e,t,n,r){let i=[],a=0;for(let r of oh(e.doc,n,t))i.push({label:`<`+r,type:`type`});for(let t of sh(e.doc,n))i.push({label:`</`+t+`>`,type:`type`,boost:99-a++});return{from:r,to:r,options:i,validFor:/^<\/?[:\-\.\w\u00b7-\uffff]*$/}}function fh(e,t,n,r,i){let a=ah(n),o=a?t.tags[ih(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:ch}}function ph(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=ah(n),i=r?t.tags[ih(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)?uh(n,i,i.from,r):lh(n,e,i,i.from,r):i.name==`StartTag`||i.name==`IncompleteTag`?lh(n,e,i,r,r):i.name==`StartCloseTag`||i.name==`IncompleteCloseTag`?uh(n,i,r,r):i.name==`OpenTag`||i.name==`SelfClosingTag`||i.name==`AttributeName`?fh(n,e,i,i.name==`AttributeName`?i.from:r,r):i.name==`Is`||i.name==`AttributeValue`||i.name==`UnquotedAttributeValue`?ph(n,e,i,i.name==`Is`?r:i.from,r):t.explicit&&(a.name==`Element`||a.name==`Text`||a.name==`Document`)?dh(n,e,i,r):null}function hh(e){return mh(rh.default,e)}function gh(e){let{extraTags:t,extraGlobalAttributes:n}=e,r=n||t?new rh(t,n):rh.default;return e=>mh(r,e)}const _h=Im.parser.configure({top:`SingleExpression`}),vh=[{tag:`script`,attrs:e=>e.type==`text/typescript`||e.lang==`ts`,parser:Rm.parser},{tag:`script`,attrs:e=>e.type==`text/babel`||e.type==`text/jsx`,parser:zm.parser},{tag:`script`,attrs:e=>e.type==`text/typescript-jsx`,parser:Bm.parser},{tag:`script`,attrs(e){return/^(importmap|speculationrules|application\/(.+\+)?json)$/i.test(e.type)},parser:_h},{tag:`script`,attrs(e){return!e.type||/^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^module$|^$/i.test(e.type)},parser:Im.parser},{tag:`style`,attrs(e){return(!e.lang||e.lang==`css`)&&(!e.type||/^(text\/)?(x-)?(stylesheet|css)$/i.test(e.type))},parser:um.parser}],yh=[{name:`style`,parser:um.parser.configure({top:`Styles`})}].concat(nh.map(e=>({name:e,parser:Im.parser}))),bh=jl.define({name:`html`,parser:kp.configure({props:[Yl.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}}),lu.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}}}),vu.add({"OpenTag CloseTag":e=>e.getChild(`TagName`)})]}),languageData:{commentTokens:{block:{open:`<!--`,close:`-->`}},indentOnInput:/^\s*<\/\w+\W$/,wordChars:`-_`}}),xh=bh.configure({wrap:Np(vh,yh)});function Sh(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=Np((e.nestedLanguages||[]).concat(vh),(e.nestedAttributes||[]).concat(yh))),new Vl(n?bh.configure({wrap:n,dialect:t}):t?xh.configure({dialect:t}):xh,[xh.data.of({autocomplete:gh(e)}),e.autoCloseTags===!1?[]:Th,Wm().support,dm().support])}const Ch=new Set(`area base br col command embed frame hr img input keygen link meta param source track wbr menuitem`.split(` `));function wh(e,t,n){for(;;){if(t.lastChild?.name!=`CloseTag`)return!1;let r=t.parent;if(!r||ih(e,r)!=n)return!0;t=r}}const Th=H.inputHandler.of((e,t,n,r,i)=>{if(e.composing||e.state.readOnly||t!=n||r!=`>`&&r!=`/`||!xh.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=ih(o.doc,t.parent,n))&&!Ch.has(a)&&!wh(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=ih(o.doc,e,n))&&!Ch.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)}),Eh=Dl({commentTokens:{block:{open:`<!--`,close:`-->`}}}),Dh=new U,Oh=cf.configure({props:[lu.add(e=>!e.is(`Block`)||e.is(`Document`)||kh(e)!=null||Ah(e)?void 0:(e,t)=>({from:t.doc.lineAt(e.from).to,to:e.to})),Dh.add(kh),Yl.add({Document:()=>null}),El.add({Document:Eh})]});function kh(e){let t=/^(?:ATX|Setext)Heading(\d)$/.exec(e.name);return t?+t[1]:void 0}function Ah(e){return e.name==`OrderedList`||e.name==`BulletList`}function jh(e,t){let n=e;for(;;){let e=n.nextSibling,r;if(!e||(r=kh(e.type))!=null&&r<=t)break;n=e}return n.to}const Mh=cu.of((e,t,n)=>{for(let r=Y(e).resolveInner(n,-1);r&&!(r.from<t);r=r.parent){let e=r.type.prop(Dh);if(e==null)continue;let t=jh(r,e);if(t>n)return{from:n,to:t}}return null});function Nh(e){return new kl(Eh,e,[],`markdown`)}const Ph=Nh(Oh),Fh=Nh(Oh.configure([Of,jf,Af,Mf,{props:[lu.add({Table:(e,t)=>({from:t.doc.lineAt(e.from).to,to:e.to})})]}]));function Ih(e,t){return n=>{if(n&&e){let t=null;if(n=/\S*/.exec(n)[0],t=typeof e==`function`?e(n):Hl.matchLanguageName(e,n,!0),t instanceof Hl)return t.support?t.support.language.parser:Pl.getSkippingParser(t.load());if(t)return t.parser}return t?t.parser:null}}var Lh=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(+zh(this.item,e)[2]+t):``;return this.spaceBefore+n+this.type+this.spaceAfter}};function Rh(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 Lh(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 Lh(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 Lh(i.parent,s,s+t,a[1],e,n,i))}}return r}function zh(e,t){return/^(\s*)(\d+)(?=[.)])/.exec(t.sliceString(e.from,e.from+10))}function Bh(e,t,n,r=0){for(let i=-1,a=e;;){if(a.name==`ListItem`){let e=zh(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 Vh(e,t){let n=/^[ \t]*/.exec(e)[0].length;if(!n||t.facet(Wl)!=` `)return e;let r=xn(e,4,n),i=``;for(let e=r;e>0;)e>=4?(i+=` `,e-=4):(i+=` `,e--);return i+e.slice(n)}const Hh=((e={})=>({state:t,dispatch:n})=>{let r=Y(t),{doc:i}=t,a=null,o=t.changeByRange(n=>{if(!n.empty||!Fh.isActiveAt(t,n.from,-1)&&!Fh.isActiveAt(t,n.from,1))return a={range:n};let o=n.from,s=i.lineAt(o),c=Rh(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`&&Bh(l.item,i,r,-2),e&&e.node.name==`OrderedList`&&Bh(e.item,i,r),{range:j.cursor(t+n.length),changes:r}}else{let e=Gh(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`&&Bh(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?xn(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=Vh(p,t),Wh(l.node,t.doc)&&(p=Gh(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 Uh(e){return e.name==`QuoteMark`||e.name==`ListMark`}function Wh(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 Gh(e,t,n){let r=``;for(let t=0,i=e.length-2;t<=i;t++)r+=e[t].blank(t<i?xn(n.text,4,e[t+1].from)-r.length:null,t<i);return Vh(r,t)}function Kh(e,t){let n=e.resolveInner(t,-1),r=t;Uh(n)&&(r=n.from,n=n.parent);for(let e;e=n.childBefore(r);)if(Uh(e))r=e.from;else if(e.name==`OrderedList`||e.name==`BulletList`)n=e.lastChild,r=n.to;else break;return n}const qh=[{key:`Enter`,run:Hh},{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&&Fh.isActiveAt(e,t.from)){let t=a.lineAt(i),r=Rh(Kh(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(xn(t.text,4,n.to)-xn(t.text,4,n.from));return r==t.from&&(i=Vh(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)}}],Jh=Sh({matchClosingTags:!1});function Yh(e={}){let{codeLanguages:t,defaultCodeLanguage:n,addKeymap:r=!0,base:{parser:i}=Ph,completeHTMLTags:a=!0,pasteURLAsLink:o=!0,htmlTagLanguage:s=Jh}=e;if(!(i instanceof Fd))throw RangeError("Base parser provided to `markdown` should be a Markdown parser");let c=e.extensions?[e.extensions]:[],l=[s.support,Mh],u;o&&l.push(eg),n instanceof Vl?(l.push(n.support),u=n.language):n&&(u=n);let d=t||u?Ih(t,u):void 0;c.push(uf({codeParser:d,htmlParser:s.language.parser})),r&&l.push(Ct.high(Fs.of(qh)));let f=Nh(i.configure(c));return a&&l.push(f.data.of({autocomplete:Xh})),new Vl(f,l)}function Xh(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:Qh(),validFor:/^<[:\-\.\w\u00b7-\uffff]*$/}}let Zh=null;function Qh(){if(Zh)return Zh;let e=hh(new ju(P.create({extensions:Jh}),0,!0));return Zh=e?e.options:[]}const $h=/code|horizontalrule|html|link|comment|processing|escape|entity|image|mark|url/i,eg=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),!Fh.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||$h.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)}}),tg=e=>{let{state:t}=e,n=t.doc.lineAt(t.selection.main.from),r=og(e.state,n.from);return r.line?rg(e):r.block?ag(e):!1};function ng(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 rg=ng(ug,0),ig=ng(lg,0),ag=ng((e,t)=>lg(e,t,cg(t)),0);function og(e,t){let n=e.languageDataAt(`commentTokens`,t,1);return n.length?n[0]:{}}function sg(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 cg(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 lg(e,t,n=t.selection.ranges){let r=n.map(e=>og(t,e.from).block);if(!r.every(e=>e))return null;let i=n.map((e,n)=>sg(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 ug(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=og(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 dg=Rt.define(),fg=Rt.define(),pg=M.define(),mg=M.define({combine(e){return tn(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)})}}),hg=bt.define({create(){return Ng.empty},update(e,t){let n=t.state.facet(mg),r=t.annotation(dg);if(r){let i=Sg.fromTransaction(t,r.selection),a=r.side,o=a==0?e.undone:e.done;return o=i?Cg(o,o.length,n.minDepth,i):Og(o,t.startState.selection),new Ng(a==0?r.rest:o,a==0?o:r.rest)}let i=t.annotation(fg);if((i==`full`||i==`before`)&&(e=e.isolate()),t.annotation(Vt.addToHistory)===!1)return t.changes.empty?e:e.addMapping(t.changes.desc);let a=Sg.fromTransaction(t),o=t.annotation(Vt.time),s=t.annotation(Vt.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 Ng(e.done.map(Sg.fromJSON),e.undone.map(Sg.fromJSON))}});function gg(e={}){return[hg,mg.of(e),H.domEventHandlers({beforeinput(e,t){let n=e.inputType==`historyUndo`?vg:e.inputType==`historyRedo`?yg:null;return n?(e.preventDefault(),n(t)):!1}})]}function _g(e,t){return function({state:n,dispatch:r}){if(!t&&n.readOnly)return!1;let i=n.field(hg,!1);if(!i)return!1;let a=i.pop(e,n,t);return a?(r(a),!0):!1}}const vg=_g(0,!1),yg=_g(1,!1),bg=_g(0,!0),xg=_g(1,!0);var Sg=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&&it.fromJSON(t.changes),[],t.mapped&&rt.fromJSON(t.mapped),t.startSelection&&j.fromJSON(t.startSelection),t.selectionsAfter.map(j.fromJSON))}static fromTransaction(t,n){let r=Dg;for(let e of t.startState.facet(pg)){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,Dg)}static selection(t){return new e(void 0,Dg,void 0,void 0,t)}};function Cg(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 wg(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 Tg(e,t){return e.ranges.length==t.ranges.length&&e.ranges.filter((e,n)=>e.empty!=t.ranges[n].empty).length===0}function Eg(e,t){return e.length?t.length?e.concat(t):e:t}const Dg=[];function Og(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),Cg(e,e.length-1,1e9,n.setSelAfter(r)))}else return[Sg.selection([t])]}function kg(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 Ag(e,t){if(!e.length)return e;let n=e.length,r=Dg;for(;n;){let i=jg(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?[Sg.selection(r)]:Dg}function jg(e,t,n){let r=Eg(e.selectionsAfter.length?e.selectionsAfter.map(e=>e.map(t)):Dg,n);if(!e.changes)return Sg.selection(r);let i=e.changes.map(t),a=t.mapDesc(e.changes,!0),o=e.mapped?e.mapped.composeDesc(a):a;return new Sg(i,N.mapEffects(e.effects,t),o,e.startSelection.map(a),r)}const Mg=/^(input\.type|delete)($|\.)/;var Ng=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||Mg.test(r))&&(!s.selectionsAfter.length&&n-this.prevTime<i.newGroupDelay&&i.joinToEvent(a,wg(s.changes,t.changes))||r==`input.type.compose`)?Cg(o,o.length-1,i.minDepth,new Sg(t.changes.compose(s.changes),Eg(N.mapEffects(t.effects,s.changes),s.effects),s.mapped,s.startSelection,Dg)):Cg(o,o.length,i.minDepth,t),new e(o,Dg,n,r)}addSelection(t,n,r,i){let a=this.done.length?this.done[this.done.length-1].selectionsAfter:Dg;return a.length>0&&n-this.prevTime<i&&r==this.prevUserEvent&&r&&/^select($|\.)/.test(r)&&Tg(a[a.length-1],t)?this:new e(Og(this.done,t),this.undone,n,r)}addMapping(t){return new e(Ag(this.done,t),Ag(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:dg.of({side:e,rest:kg(r),selection:a}),userEvent:e==0?`select.undo`:`select.redo`,scrollIntoView:!0});if(i.changes){let n=r.length==1?Dg:r.slice(0,r.length-1);return i.mapped&&(n=Ag(n,i.mapped)),t.update({changes:i.changes,selection:i.startSelection,effects:i.effects,annotations:dg.of({side:e,rest:n,selection:a}),filter:!1,userEvent:e==0?`undo`:`redo`,scrollIntoView:!0})}else return null}};Ng.empty=new Ng(Dg,Dg);const Pg=[{key:`Mod-z`,run:vg,preventDefault:!0},{key:`Mod-y`,mac:`Mod-Shift-z`,run:yg,preventDefault:!0},{linux:`Ctrl-Shift-z`,run:yg,preventDefault:!0},{key:`Mod-u`,run:bg,preventDefault:!0},{key:`Alt-u`,mac:`Mod-Shift-u`,run:xg,preventDefault:!0}];function Fg(e,t){return j.create(e.ranges.map(t),e.mainIndex)}function Ig(e,t){return e.update({selection:t,scrollIntoView:!0,userEvent:`select`})}function Lg({state:e,dispatch:t},n){let r=Fg(e.selection,n);return r.eq(e.selection,!0)?!1:(t(Ig(e,r)),!0)}function Rg(e,t){return j.cursor(t?e.to:e.from)}function zg(e,t){return Lg(e,n=>n.empty?e.moveByChar(n,t):Rg(n,t))}function Bg(e){return e.textDirectionAt(e.state.selection.main.head)==R.LTR}const Vg=e=>zg(e,!Bg(e)),Hg=e=>zg(e,Bg(e));function Ug(e,t){return Lg(e,n=>n.empty?e.moveByGroup(n,t):Rg(n,t))}const Wg=e=>Ug(e,!Bg(e)),Gg=e=>Ug(e,Bg(e));typeof Intl<`u`&&Intl.Segmenter;function Kg(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 qg(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;Kg(e,t,i)?r=t:a=n?t.to:t.from}let a=r.type.prop(i),o,s;return s=a&&(o=n?xu(e,r.from,1):xu(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 Jg=e=>Lg(e,t=>qg(e.state,t,!Bg(e))),Yg=e=>Lg(e,t=>qg(e.state,t,Bg(e)));function Xg(e,t){return Lg(e,n=>{if(!n.empty)return Rg(n,t);let r=e.moveVertically(n,t);return r.head==n.head?e.moveToLineBoundary(n,t):r})}const Zg=e=>Xg(e,!1),Qg=e=>Xg(e,!0);function $g(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 e_(e,t){let n=$g(e),{state:r}=e,i=Fg(r.selection,r=>r.empty?e.moveVertically(r,t,n.height):Rg(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(Ig(r,i),{effects:a}),!0}const t_=e=>e_(e,!1),n_=e=>e_(e,!0);function r_(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 i_=e=>Lg(e,t=>r_(e,t,!0)),a_=e=>Lg(e,t=>r_(e,t,!1)),o_=e=>Lg(e,t=>r_(e,t,!Bg(e))),s_=e=>Lg(e,t=>r_(e,t,Bg(e))),c_=e=>Lg(e,t=>j.cursor(e.lineBlockAt(t.head).from,1)),l_=e=>Lg(e,t=>j.cursor(e.lineBlockAt(t.head).to,-1));function u_(e,t,n){let r=!1,i=Fg(e.selection,t=>{let i=xu(e,t.head,-1)||xu(e,t.head,1)||t.head>0&&xu(e,t.head-1,1)||t.head<e.doc.length&&xu(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(Ig(e,i)),!0):!1}const d_=({state:e,dispatch:t})=>u_(e,t,!1);function f_(e,t,n){let r=Fg(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(Ig(e.state,r)),!0)}function p_(e,t){return f_(e,t,n=>e.moveByChar(n,t))}const m_=e=>p_(e,!Bg(e)),h_=e=>p_(e,Bg(e));function g_(e,t){return f_(e,t,n=>e.moveByGroup(n,t))}const __=e=>g_(e,!Bg(e)),v_=e=>g_(e,Bg(e)),y_=e=>{let t=!Bg(e);return f_(e,t,n=>qg(e.state,n,t))},b_=e=>{let t=Bg(e);return f_(e,t,n=>qg(e.state,n,t))};function x_(e,t){return f_(e,t,n=>e.moveVertically(n,t))}const S_=e=>x_(e,!1),C_=e=>x_(e,!0);function w_(e,t){return f_(e,t,n=>e.moveVertically(n,t,$g(e).height))}const T_=e=>w_(e,!1),E_=e=>w_(e,!0),D_=e=>f_(e,!0,t=>r_(e,t,!0)),O_=e=>f_(e,!1,t=>r_(e,t,!1)),k_=e=>{let t=!Bg(e);return f_(e,t,n=>r_(e,n,t))},A_=e=>{let t=Bg(e);return f_(e,t,n=>r_(e,n,t))},j_=e=>f_(e,!1,t=>j.cursor(e.lineBlockAt(t.head).from)),M_=e=>f_(e,!0,t=>j.cursor(e.lineBlockAt(t.head).to)),N_=({state:e,dispatch:t})=>(t(Ig(e,{anchor:0})),!0),P_=({state:e,dispatch:t})=>(t(Ig(e,{anchor:e.doc.length})),!0),F_=({state:e,dispatch:t})=>(t(Ig(e,{anchor:e.selection.main.anchor,head:0})),!0),I_=({state:e,dispatch:t})=>(t(Ig(e,{anchor:e.selection.main.anchor,head:e.doc.length})),!0),L_=({state:e,dispatch:t})=>(t(e.update({selection:{anchor:0,head:e.doc.length},userEvent:`select`})),!0),R_=({state:e,dispatch:t})=>{let n=rv(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},z_=({state:e,dispatch:t})=>{let n=Fg(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(Ig(e,n)),!0)};function B_(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(Ig(n,j.create(i,i.length-1))),!0)}const V_=e=>B_(e,!1),H_=e=>B_(e,!0),U_=({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(Ig(e,r)),!0):!1};function W_(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=G_(e,o,!1)):o>i&&(n=`delete.forward`,o=G_(e,o,!0)),i=Math.min(i,o),a=Math.max(a,o)}else i=G_(e,i,!1),a=G_(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 G_(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 K_=(e,t,n)=>W_(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=xn(s,a.tabSize)%Gl(a)||Gl(a);for(let t=0;t<e&&s[s.length-1-t]==` `;t++)i--;c=i}else c=Xe(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=Xe(o.text,c-o.from,!1,!1)+o.from);return c}),q_=e=>K_(e,!1,!0),J_=e=>K_(e,!0,!1),Y_=(e,t)=>W_(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=Xe(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}),X_=e=>Y_(e,!1),Z_=e=>Y_(e,!0),Q_=e=>W_(e,t=>{let n=e.lineBlockAt(t.head).to;return t.head<n?n:Math.min(e.state.doc.length,t.head+1)}),$_=e=>W_(e,t=>{let n=e.moveToLineBoundary(t,!1).head;return t.head>n?n:Math.max(0,t.head-1)}),ev=e=>W_(e,t=>{let n=e.moveToLineBoundary(t,!0).head;return t.head<n?n:Math.min(e.state.doc.length,t.head+1)}),tv=({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},nv=({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:Xe(r.text,n-r.from,!1)+r.from,a=n==r.to?n+1:Xe(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 rv(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 iv(e,t,n){if(e.readOnly)return!1;let r=[],i=[];for(let t of rv(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 av=({state:e,dispatch:t})=>iv(e,t,!1),ov=({state:e,dispatch:t})=>iv(e,t,!0);function sv(e,t,n){if(e.readOnly)return!1;let r=[];for(let t of rv(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 cv=({state:e,dispatch:t})=>sv(e,t,!1),lv=({state:e,dispatch:t})=>sv(e,t,!0),uv=e=>{if(e.state.readOnly)return!1;let{state:t}=e,n=t.changes(rv(t).map(({from:e,to:n})=>(e>0?e--:n<t.doc.length&&n++,{from:e,to:n}))),r=Fg(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 dv(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 fv=mv(!1),pv=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&&dv(t,r);e&&(r=i=(i<=a.to?a:t.doc.lineAt(i)).to);let s=new Jl(t,{simulateBreak:r,simulateDoubleBreak:!!o}),c=ql(s,r);for(c??=xn(/^\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=[``,Kl(t,c)];return o&&l.push(Kl(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 hv(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 gv=({state:e,dispatch:t})=>{if(e.readOnly)return!1;let n=Object.create(null),r=new Jl(e,{overrideIndentation:e=>n[e]??-1}),i=hv(e,(t,i,a)=>{let o=ql(r,t.from);if(o==null)return;/\S/.test(t.text)||(o=0);let s=/^\s*/.exec(t.text)[0],c=Kl(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},_v=({state:e,dispatch:t})=>e.readOnly?!1:(t(e.update(hv(e,(t,n)=>{n.push({from:t.from,insert:e.facet(Wl)})}),{userEvent:`input.indent`})),!0),vv=({state:e,dispatch:t})=>e.readOnly?!1:(t(e.update(hv(e,(t,n)=>{let r=/^\s*/.exec(t.text)[0];if(!r)return;let i=xn(r,e.tabSize),a=0,o=Kl(e,Math.max(0,i-Gl(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),yv=e=>(e.setTabFocusMode(),!0),bv=[{key:`Ctrl-b`,run:Vg,shift:m_,preventDefault:!0},{key:`Ctrl-f`,run:Hg,shift:h_},{key:`Ctrl-p`,run:Zg,shift:S_},{key:`Ctrl-n`,run:Qg,shift:C_},{key:`Ctrl-a`,run:c_,shift:j_},{key:`Ctrl-e`,run:l_,shift:M_},{key:`Ctrl-d`,run:J_},{key:`Ctrl-h`,run:q_},{key:`Ctrl-k`,run:Q_},{key:`Ctrl-Alt-h`,run:X_},{key:`Ctrl-o`,run:tv},{key:`Ctrl-t`,run:nv},{key:`Ctrl-v`,run:n_}],xv=[{key:`ArrowLeft`,run:Vg,shift:m_,preventDefault:!0},{key:`Mod-ArrowLeft`,mac:`Alt-ArrowLeft`,run:Wg,shift:__,preventDefault:!0},{mac:`Cmd-ArrowLeft`,run:o_,shift:k_,preventDefault:!0},{key:`ArrowRight`,run:Hg,shift:h_,preventDefault:!0},{key:`Mod-ArrowRight`,mac:`Alt-ArrowRight`,run:Gg,shift:v_,preventDefault:!0},{mac:`Cmd-ArrowRight`,run:s_,shift:A_,preventDefault:!0},{key:`ArrowUp`,run:Zg,shift:S_,preventDefault:!0},{mac:`Cmd-ArrowUp`,run:N_,shift:F_},{mac:`Ctrl-ArrowUp`,run:t_,shift:T_},{key:`ArrowDown`,run:Qg,shift:C_,preventDefault:!0},{mac:`Cmd-ArrowDown`,run:P_,shift:I_},{mac:`Ctrl-ArrowDown`,run:n_,shift:E_},{key:`PageUp`,run:t_,shift:T_},{key:`PageDown`,run:n_,shift:E_},{key:`Home`,run:a_,shift:O_,preventDefault:!0},{key:`Mod-Home`,run:N_,shift:F_},{key:`End`,run:i_,shift:D_,preventDefault:!0},{key:`Mod-End`,run:P_,shift:I_},{key:`Enter`,run:fv,shift:fv},{key:`Mod-a`,run:L_},{key:`Backspace`,run:q_,shift:q_,preventDefault:!0},{key:`Delete`,run:J_,preventDefault:!0},{key:`Mod-Backspace`,mac:`Alt-Backspace`,run:X_,preventDefault:!0},{key:`Mod-Delete`,mac:`Alt-Delete`,run:Z_,preventDefault:!0},{mac:`Mod-Backspace`,run:$_,preventDefault:!0},{mac:`Mod-Delete`,run:ev,preventDefault:!0}].concat(bv.map(e=>({mac:e.key,run:e.run,shift:e.shift}))),Sv=[{key:`Alt-ArrowLeft`,mac:`Ctrl-ArrowLeft`,run:Jg,shift:y_},{key:`Alt-ArrowRight`,mac:`Ctrl-ArrowRight`,run:Yg,shift:b_},{key:`Alt-ArrowUp`,run:av},{key:`Shift-Alt-ArrowUp`,run:cv},{key:`Alt-ArrowDown`,run:ov},{key:`Shift-Alt-ArrowDown`,run:lv},{key:`Mod-Alt-ArrowUp`,run:V_},{key:`Mod-Alt-ArrowDown`,run:H_},{key:`Escape`,run:U_},{key:`Mod-Enter`,run:pv},{key:`Alt-l`,mac:`Ctrl-l`,run:R_},{key:`Mod-i`,run:z_,preventDefault:!0},{key:`Mod-[`,run:vv},{key:`Mod-]`,run:_v},{key:`Mod-Alt-\\`,run:gv},{key:`Shift-Mod-k`,run:uv},{key:`Shift-Mod-\\`,run:d_},{key:`Mod-/`,run:tg},{key:`Alt-A`,mac:`Ctrl-A`,run:ig},{key:`Ctrl-m`,mac:`Shift-Alt-m`,run:yv}].concat(xv),Cv=`var(--dsw-alias-brand-primary, #3e63dd)`,wv=`color-mix(in srgb, var(--dsw-alias-brand-primary, #3e63dd) 55%, transparent)`,Tv=`var(--dsw-alias-label-dimmed, #999)`,Ev=`ui-monospace, "Cascadia Mono", Consolas, "SF Mono", Menlo, monospace`,Dv=du.define([{tag:[J.heading1,J.heading2,J.heading3,J.heading4,J.heading5,J.heading6],color:Cv,fontWeight:`700`},{tag:J.processingInstruction,color:wv},{tag:J.monospace,fontFamily:Ev,backgroundColor:`color-mix(in srgb, var(--dsw-alias-label-secondary, #888) 12%, transparent)`,borderRadius:`4px`,padding:`0 3px`},{tag:J.content,fontFamily:Ev,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:Cv,textDecoration:`underline`},{tag:J.url,color:wv,textDecoration:`underline dotted`},{tag:J.quote,fontStyle:`italic`,color:`var(--dsw-alias-label-secondary, #888)`},{tag:J.contentSeparator,color:Tv,textDecoration:`line-through`},{tag:J.comment,color:Tv}]);function Ov(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,gg(),Yh({base:Fh}),hu(Dv),Zs(),ac(e.placeholder??``),Fs.of([...Sv,...Pg,{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?``:`
650
- `}${e}\n`;n.dispatch({changes:{from:t,insert:r},selection:{anchor:t+r.length},scrollIntoView:!0}),n.focus()},focus:()=>n.focus()}}const kv=`dsh-tw-note-draft-v1`;function Av(){try{let e=localStorage.getItem(kv);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 jv(e){try{localStorage.setItem(kv,JSON.stringify(e))}catch{}}function Mv(){try{localStorage.removeItem(kv)}catch{}}function Nv(e){return e<10?`0${e}`:String(e)}function Pv(e=new Date){return`${e.getFullYear()}-${Nv(e.getMonth()+1)}-${Nv(e.getDate())} ${Nv(e.getHours())}:${Nv(e.getMinutes())}`}function Fv(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 Iv(){let e={showQuickNote:!0,defaultTag:`inbox`};try{let t=await fetch(`/dsh-tiddlywiki/status`,{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 Lv(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};return 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()}),document.addEventListener(`click`,e=>{t.contains(e.target)||o()},!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()}}}async function Rv(e,t){if(e.size>67108864){O(`文件过大(≤ 64MB)`);return}try{let n=await fetch(`/dsh-tiddlywiki/upload?name=${encodeURIComponent(e.name)}`,{method:`POST`,headers:{"content-type":e.type||`application/octet-stream`},body:e,signal:AbortSignal.timeout(12e4)}),r=await n.json().catch(()=>null);if(!n.ok||r?.ok!==!0){O(`上传失败:${r?.error??`HTTP ${n.status}`}`);return}let i=r.name??e.name,a=e.type.startsWith(`image/`)?`![${i}](${r.url})`:`[${i}](${r.url})`;t.insertAtCaret(a),O(`已上传「${i}」并插入链接`)}catch(e){O(`上传失败:${e instanceof Error?e.message:String(e)}`)}}function zv(){let e,t=!1,n=!1,r=`inbox`,i,a=!1,o=e=>{try{window.dispatchEvent(new CustomEvent(`dsh-tw-note-state`,{detail:{open:e}}))}catch{}},s=()=>{e!==void 0&&(e.titleInput.value=Pv())},c=()=>{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){Mv();return}jv({text:t,title:n,tags:e.tagEditor.getTags(),savedAt:Date.now()})},500))},l=()=>{e!==void 0&&(e.draftBanner.hidden=!0)},u=()=>{a=!1,e!==void 0&&(e.recentWrap.hidden=!0)},d=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??[]),l(),u(),O(`已载入「${r.title}」`),e.editor.focus()}catch(e){O(`读取失败:${e instanceof Error?e.message:String(e)}`)}},f=()=>{if(e===void 0)return;if(a){u();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=[Fv(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`,()=>{d(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)}})()},p=()=>{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 d=document.createElement(`div`);d.className=`dsh-tw-note-draft`,d.hidden=!0;let p=document.createElement(`span`);p.className=`dsh-tw-note-draft-text`,p.textContent=`已恢复未保存草稿`;let m=document.createElement(`button`);m.type=`button`,m.className=`dsh-tw-note-draft-discard`,m.textContent=`丢弃`,d.append(p,m);let h=document.createElement(`div`);h.className=`dsh-tw-note-fields`;let g=document.createElement(`input`);g.className=`dsh-tw-note-title`,g.placeholder=`标题(默认时间戳)`;let _=Lv({onChange:c});h.append(g,_.el),g.addEventListener(`input`,c);let v,y=Ov({placeholder:`写点东西… Markdown 高亮,可 📎/拖入文件
651
- Ctrl+Enter 保存`,onSave:()=>{v?.()},onChange:c}),b=document.createElement(`button`);b.type=`button`,b.className=`dsh-tw-note-upload`,b.title=`上传文件到 wiki 并插入 Markdown 链接(也可直接拖入编辑器)`,b.textContent=`📎 上传`;let x=document.createElement(`input`);x.type=`file`,x.multiple=!0,x.hidden=!0,b.addEventListener(`click`,()=>{x.click()}),x.addEventListener(`change`,()=>{for(let e of Array.from(x.files??[]))Rv(e,y);x.value=``});let S=0;y.el.addEventListener(`dragenter`,e=>{e.preventDefault(),S++,y.el.classList.add(`dsh-tw-note-drop`)}),y.el.addEventListener(`dragover`,e=>{e.preventDefault()}),y.el.addEventListener(`dragleave`,e=>{e.preventDefault(),S=Math.max(0,S-1),S===0&&y.el.classList.remove(`dsh-tw-note-drop`)}),y.el.addEventListener(`drop`,e=>{e.preventDefault(),S=0,y.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))Rv(e,y)});let C=document.createElement(`div`);C.className=`dsh-tw-note-foot`;let w=document.createElement(`div`);w.className=`dsh-tw-note-foot-left`;let T=document.createElement(`span`);T.className=`dsh-tw-note-hint`,T.textContent=`Ctrl+Enter`;let ee=document.createElement(`button`);ee.type=`button`,ee.className=`dsh-tw-note-recent-btn`,ee.title=`最近修改的笔记,点击载入继续编辑`,ee.textContent=`🕘 最近`,ee.addEventListener(`click`,f),w.append(b,ee,T);let te=document.createElement(`div`);te.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=`保存`,te.append(E,D),C.append(w,te);let ne=document.createElement(`div`);ne.className=`dsh-tw-note-recent`,ne.hidden=!0,r.append(i,d,h,y.el,C),t.append(r,ne),document.body.append(t),e={root:t,card:r,editor:y,titleInput:g,tagEditor:_,saveBtn:D,editBtn:E,draftBanner:d,recentBtn:ee,recentWrap:ne};let re=()=>{n=!1,t.hidden=!0,u(),o(!1)},ie=()=>{Mv(),l(),y.setValue(``),g.value=Pv(),_.setTags([]),re()};v=async()=>{let e=y.getValue().trim();if(e.length===0){O(`内容为空,未保存`);return}D.disabled=!0,D.textContent=`保存中…`;try{let t=await fetch(`/dsh-tiddlywiki/note`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({title:g.value.trim(),tags:_.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}ie(),O(`已保存「${n.title??g.value}」`)}catch(e){O(`保存失败:${e instanceof Error?e.message:String(e)}`)}finally{D.disabled=!1,D.textContent=`保存`}},D.addEventListener(`click`,()=>{v?.()});let ae=async()=>{let e=g.value.trim().length>0?g.value.trim():Pv(),t=y.getValue(),n=_.getTags();E.disabled=!0,E.textContent=`打开中…`;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);if(!r.ok||i?.ok!==!0){O(`打开失败:${i?.error??`HTTP ${r.status}`}`);return}if(typeof i.twUrl!=`string`||typeof i.draftTitle!=`string`){O(`打开失败:服务未返回编辑器地址`);return}Mv(),l(),Te(`${new URL(i.twUrl,location.origin).href}#${encodeURIComponent(i.draftTitle)}`,i.title??e),O(`已在弹出窗口打开「${i.title??e}」编辑器`)}catch(e){O(`打开失败:${e instanceof Error?e.message:String(e)}`)}finally{E.disabled=!1,E.textContent=`✏️ 在 TW 中编辑`}};E.addEventListener(`click`,()=>{ae()}),s.addEventListener(`click`,re),m.addEventListener(`click`,()=>{Mv(),l(),y.setValue(``),g.value=Pv(),_.setTags([]),O(`已丢弃草稿`)})};return{async open(){if(t||(p(),e===void 0||n))return;n=!0,e.root.hidden=!1,o(!0);let i=Av();i!==null&&(i.text.trim().length>0||i.title.trim().length>0)?(e.editor.setValue(i.text),e.titleInput.value=i.title,e.tagEditor.setTags(i.tags),e.draftBanner.hidden=!1):(s(),r=(await Iv()).defaultTag,e.tagEditor.setDefault(r)),e.editor.focus()},close(){e!==void 0&&(n=!1,e.root.hidden=!0,u(),o(!1))},async toggle(){n?this.close():await this.open()},isOpen(){return n},dispose(){t=!0,i!==void 0&&(clearTimeout(i),i=void 0),e?.editor.view.destroy(),e?.root.remove(),document.querySelector(`.dsh-tw-toast`)?.remove(),e=void 0}}}function Bv(e){return e<10?`0${e}`:String(e)}function Vv(e){return`${Bv(e.getHours())}:${Bv(e.getMinutes())}`}async function Hv(){try{let e=await fetch(`/dsh-tiddlywiki/status`,{signal:AbortSignal.timeout(8e3)});return e.ok?await e.json():null}catch{return null}}function Uv(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(`上次同步 ${Vv(t)}`),{state:i,label:a,tooltip:r.join(` · `),...t===void 0?{}:{lastSync:t}}}function Wv(){let e={state:`offline`,label:`离线`,tooltip:`同步知识库`},t,n,r=!1,i=new Set,a=()=>{for(let e of[...i])e()},o=n=>{let r=Uv(n,t);(r.state!==e.state||r.tooltip!==e.tooltip)&&(e=r,a())},s=async()=>{o(await Hv())};return s(),n=window.setInterval(()=>{s()},3e4),{getState:()=>e,trigger:async()=>{if(r)return e;r=!0,e={...e,state:`syncing`,label:`同步中…`},a();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 s()}catch(e){O(`同步失败:${e instanceof Error?e.message:String(e)}`)}finally{r=!1,await s()}return e},subscribe(e){return i.add(e),()=>{i.delete(e)}},dispose(){n!==void 0&&(clearInterval(n),n=void 0),i.clear()}}}const Gv=`/dsh-tiddlywiki/status`;async function Kv(){try{let e=await fetch(Gv,{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 qv(){try{let e=await fetch(Gv,{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 Jv(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=()=>{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(`
652
- `)},g=()=>{let e=n.getState();o!==void 0&&(o.dataset.state=e.state),a!==void 0&&(a.title=`知识库 · ${e.tooltip}`),h()},_=async()=>{p=await qv(),!r&&(c!==void 0&&(c.textContent=p.text),l!==void 0&&(l.dataset.state=p.state),h())},v=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`,()=>{h(),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.addEventListener(`click`,()=>{m(),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(`dsh-tw-panel-reload`)),_()}),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 v=document.createElement(`span`);v.className=`dsh-tw-fab-icon`,v.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(v,o),a.addEventListener(`click`,()=>{if(s!==void 0){if(f){m();return}f=!0,s.hidden=!1,g(),_()}}),i.append(s,a),document.body.append(i),g(),document.addEventListener(`click`,e=>{if(!f)return;let t=e.target;i!==void 0&&i.contains(t)||m()},!0)},y=e.subscribe(()=>{d!==void 0&&(d.textContent=e.isOpen()?`收起 TW 面板`:`打开 TW 面板`)}),b=n.subscribe(g);return(async()=>{let e=await Kv();r||!e.showQuickNote&&!e.showPanelStatus&&!e.showSyncButton||v(e)})(),()=>{r=!0,y(),b(),i?.remove()}}const Yv=`dsh-tw-note-state`;function Xv(e){return function(){let[t,n]=c.useState(!1);return c.useEffect(()=>{let e=e=>{let t=e.detail;n(t?.open===!0)};return window.addEventListener(Yv,e),()=>window.removeEventListener(Yv,e)},[]),c.createElement(`div`,{className:`dsh-tw-dock-note`},c.createElement(`button`,{type:`button`,className:t?`dsh-tw-dock-note-btn dsh-tw-dock-note-btn-active`:`dsh-tw-dock-note-btn`,title:t?`快速笔记已打开(点卡片右上角 ✕ 收起)`:`打开快速笔记(草稿自动保存,点别处不会关闭)`,onClick:()=>{e.open()}},c.createElement(`span`,{className:`dsh-tw-dock-note-icon`,"aria-hidden":`true`},`📝`),c.createElement(`span`,{className:`dsh-tw-dock-note-label`},t?`快速笔记(已打开)`:`快速笔记`)))}}const Zv={showQuickNoteDock:!0,sidebarLabel:`TiddlyWiki`};async function Qv(){try{let e=await fetch(`/dsh-tiddlywiki/status`,{signal:AbortSignal.timeout(5e3)});if(!e.ok)return Zv;let t=await e.json();return{showQuickNoteDock:t.ui?.showQuickNoteDock!==!1,sidebarLabel:typeof t.ui?.sidebarLabel==`string`&&t.ui.sidebarLabel.trim().length>0?t.ui.sidebarLabel.trim():`TiddlyWiki`}}catch{return Zv}}const $v=`/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 ty(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 ny(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 ty(`/dsh-tiddlywiki/admin/state`);if(t)return;ry(n,e,a),sy(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 ry(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 ty(`/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 iy(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),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.length>0?o.darkPalette:`$:/palettes/CupertinoDark`);let d=o.allArticles??{};u(`ui.allArticles.pageSize`,`「所有文章」每页条数`,typeof d.pageSize==`number`?d.pageSize:10);let f=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`保存配置`);f.type=`button`,f.addEventListener(`click`,()=>{f.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 ty(`/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{f.disabled=!1}})()}),r.append(f),e.append(r)}function ay(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 ty($v,{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 ty($v,{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。`),w=$(`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),w.append(n)}let T=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`应用语言(重启 TW)`);T.type=`button`,T.addEventListener(`click`,()=>{T.disabled=!0,(async()=>{try{await ty($v,{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)}`),T.disabled=!1}})()}),S.append(C,w,T),e.append(S)}function oy(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 ty(`/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 sy(e,t,n){e.replaceChildren(),iy(e,t.config??{},n),ay(e,t.info,t.catalog,n),oy(e)}function cy(){let e=c.useRef(null);return c.useEffect(()=>{let t=e.current;return t===null?void 0:ny(t)},[]),c.createElement(`div`,{ref:e})}const ly={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 uy(e){return typeof e==`object`&&!!e&&e.kind===`tool-result`}function dy(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 fy(e){try{let t=JSON.parse(e);return typeof t==`object`&&t&&!Array.isArray(t)?t:{}}catch{return{}}}function py(e){return Array.isArray(e)?e.filter(e=>typeof e?.text==`string`).map(e=>e.text).join(`
654
+ `}${e}\n`;n.dispatch({changes:{from:t,insert:r},selection:{anchor:t+r.length},scrollIntoView:!0}),n.focus()},focus:()=>n.focus()}}const kv=`dsh-tw-note-draft-v1`;function Av(){try{let e=localStorage.getItem(kv);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 jv(e){try{localStorage.setItem(kv,JSON.stringify(e))}catch{}}function Mv(){try{localStorage.removeItem(kv)}catch{}}function Nv(e){return e<10?`0${e}`:String(e)}function Pv(e=new Date){return`${e.getFullYear()}-${Nv(e.getMonth()+1)}-${Nv(e.getDate())} ${Nv(e.getHours())}:${Nv(e.getMinutes())}`}function Fv(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 Iv(){let e={showQuickNote:!0,defaultTag:`inbox`};try{let t=await fetch(`/dsh-tiddlywiki/status`,{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 Lv(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};return 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()}),document.addEventListener(`click`,e=>{t.contains(e.target)||o()},!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()}}}async function Rv(e,t){if(e.size>67108864){O(`文件过大(≤ 64MB)`);return}try{let n=await fetch(`/dsh-tiddlywiki/upload?name=${encodeURIComponent(e.name)}`,{method:`POST`,headers:{"content-type":e.type||`application/octet-stream`},body:e,signal:AbortSignal.timeout(12e4)}),r=await n.json().catch(()=>null);if(!n.ok||r?.ok!==!0){O(`上传失败:${r?.error??`HTTP ${n.status}`}`);return}let i=r.name??e.name,a=e.type.startsWith(`image/`)?`![${i}](${r.url})`:`[${i}](${r.url})`;t.insertAtCaret(a),O(`已上传「${i}」并插入链接`)}catch(e){O(`上传失败:${e instanceof Error?e.message:String(e)}`)}}function zv(){let e,t=!1,n=!1,r=`inbox`,i,a=!1,o=e=>{try{window.dispatchEvent(new CustomEvent(`dsh-tw-note-state`,{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=Pv())},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){Mv();return}jv({text:t,title:n,tags:e.tagEditor.getTags(),savedAt:Date.now()})},500))},u=()=>{e!==void 0&&(e.draftBanner.hidden=!0)},d=()=>{a=!1,e!==void 0&&(e.recentWrap.hidden=!0)},f=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(),d(),O(`已载入「${r.title}」`),e.editor.focus()}catch(e){O(`读取失败:${e instanceof Error?e.message:String(e)}`)}},p=()=>{if(e===void 0)return;if(a){d();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=[Fv(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`,()=>{f(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)}})()},m=()=>{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 f=document.createElement(`span`);f.className=`dsh-tw-note-draft-text`,f.textContent=`已恢复未保存草稿`;let m=document.createElement(`button`);m.type=`button`,m.className=`dsh-tw-note-draft-discard`,m.textContent=`丢弃`,c.append(f,m);let h=document.createElement(`div`);h.className=`dsh-tw-note-fields`;let g=document.createElement(`input`);g.className=`dsh-tw-note-title`,g.placeholder=`标题(默认时间戳)`;let _=Lv({onChange:l});h.append(g,_.el),g.addEventListener(`input`,l);let v,y=Ov({placeholder:`写点东西… Markdown 高亮,可 📎/拖入文件
655
+ Ctrl+Enter 保存`,onSave:()=>{v?.()},onChange:l}),b=document.createElement(`button`);b.type=`button`,b.className=`dsh-tw-note-upload`,b.title=`上传文件到 wiki 并插入 Markdown 链接(也可直接拖入编辑器)`,b.textContent=`📎 上传`;let x=document.createElement(`input`);x.type=`file`,x.multiple=!0,x.hidden=!0,b.addEventListener(`click`,()=>{x.click()}),x.addEventListener(`change`,()=>{for(let e of Array.from(x.files??[]))Rv(e,y);x.value=``});let S=0;y.el.addEventListener(`dragenter`,e=>{e.preventDefault(),S++,y.el.classList.add(`dsh-tw-note-drop`)}),y.el.addEventListener(`dragover`,e=>{e.preventDefault()}),y.el.addEventListener(`dragleave`,e=>{e.preventDefault(),S=Math.max(0,S-1),S===0&&y.el.classList.remove(`dsh-tw-note-drop`)}),y.el.addEventListener(`drop`,e=>{e.preventDefault(),S=0,y.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))Rv(e,y)});let C=document.createElement(`div`);C.className=`dsh-tw-note-foot`;let w=document.createElement(`div`);w.className=`dsh-tw-note-foot-left`;let T=document.createElement(`span`);T.className=`dsh-tw-note-hint`,T.textContent=`Ctrl+Enter`;let ee=document.createElement(`button`);ee.type=`button`,ee.className=`dsh-tw-note-recent-btn`,ee.title=`最近修改的笔记,点击载入继续编辑`,ee.textContent=`🕘 最近`,ee.addEventListener(`click`,p),w.append(b,ee,T);let te=document.createElement(`div`);te.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=`保存`,te.append(E,D),C.append(w,te);let ne=document.createElement(`div`);ne.className=`dsh-tw-note-recent`,ne.hidden=!0,r.append(i,c,h,y.el,C),t.append(r,ne),document.body.append(t),e={root:t,card:r,editor:y,titleInput:g,tagEditor:_,saveBtn:D,editBtn:E,draftBanner:c,recentBtn:ee,recentWrap:ne};let re=()=>{n=!1,t.hidden=!0,d(),o(!1)},ie=()=>{Mv(),u(),y.setValue(``),g.value=Pv(),_.setTags([]),re()};v=async()=>{let e=y.getValue().trim();if(e.length===0){O(`内容为空,未保存`);return}D.disabled=!0,D.textContent=`保存中…`;try{let t=await fetch(`/dsh-tiddlywiki/note`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({title:g.value.trim(),tags:_.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}ie(),O(`已保存「${n.title??g.value}」`)}catch(e){O(`保存失败:${e instanceof Error?e.message:String(e)}`)}finally{D.disabled=!1,D.textContent=`保存`}},D.addEventListener(`click`,()=>{v?.()});let ae=async()=>{let e=g.value.trim().length>0?g.value.trim():Pv(),t=y.getValue(),n=_.getTags();E.disabled=!0,E.textContent=`打开中…`;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);if(!r.ok||i?.ok!==!0){O(`打开失败:${i?.error??`HTTP ${r.status}`}`);return}if(typeof i.twUrl!=`string`||typeof i.draftTitle!=`string`){O(`打开失败:服务未返回编辑器地址`);return}Mv(),u(),Te(`${new URL(i.twUrl,location.origin).href}#${encodeURIComponent(i.draftTitle)}`,i.title??e),O(`已在弹出窗口打开「${i.title??e}」编辑器`)}catch(e){O(`打开失败:${e instanceof Error?e.message:String(e)}`)}finally{E.disabled=!1,E.textContent=`✏️ 在 TW 中编辑`}};E.addEventListener(`click`,()=>{ae()}),s.addEventListener(`click`,re);let oe=null,se=(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();oe={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(oe===null)return;let t=e.clientX-oe.startX,n=e.clientY-oe.startY;!oe.moved&&Math.abs(t)<4&&Math.abs(n)<4||(oe.moved=!0,se(oe.origLeft+t,oe.origTop+n))});let ce=e=>{if(oe!==null){try{i.releasePointerCapture(e.pointerId)}catch{}oe=null,i.classList.remove(`dsh-tw-note-head-dragging`)}};i.addEventListener(`pointerup`,ce),i.addEventListener(`pointercancel`,ce),m.addEventListener(`click`,()=>{Mv(),u(),y.setValue(``),g.value=Pv(),_.setTags([]),O(`已丢弃草稿`)})};return{async open(i){if(t||(m(),e===void 0||n))return;n=!0,e.root.hidden=!1,s(i),o(!0);let a=Av();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):(c(),r=(await Iv()).defaultTag,e.tagEditor.setDefault(r)),e.editor.focus()},close(){e!==void 0&&(n=!1,e.root.hidden=!0,d(),o(!1))},async toggle(){n?this.close():await this.open()},isOpen(){return n},dispose(){t=!0,i!==void 0&&(clearTimeout(i),i=void 0),e?.editor.view.destroy(),e?.root.remove(),document.querySelector(`.dsh-tw-toast`)?.remove(),e=void 0}}}function Bv(e){return e<10?`0${e}`:String(e)}function Vv(e){return`${Bv(e.getHours())}:${Bv(e.getMinutes())}`}async function Hv(){try{let e=await fetch(`/dsh-tiddlywiki/status`,{signal:AbortSignal.timeout(8e3)});return e.ok?await e.json():null}catch{return null}}function Uv(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(`上次同步 ${Vv(t)}`),{state:i,label:a,tooltip:r.join(` · `),...t===void 0?{}:{lastSync:t}}}function Wv(){let e={state:`offline`,label:`离线`,tooltip:`同步知识库`},t,n,r=!1,i=new Set,a=()=>{for(let e of[...i])e()},o=n=>{let r=Uv(n,t);(r.state!==e.state||r.tooltip!==e.tooltip)&&(e=r,a())},s=async()=>{o(await Hv())};return s(),n=window.setInterval(()=>{s()},3e4),{getState:()=>e,trigger:async()=>{if(r)return e;r=!0,e={...e,state:`syncing`,label:`同步中…`},a();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 s()}catch(e){O(`同步失败:${e instanceof Error?e.message:String(e)}`)}finally{r=!1,await s()}return e},subscribe(e){return i.add(e),()=>{i.delete(e)}},dispose(){n!==void 0&&(clearInterval(n),n=void 0),i.clear()}}}const Gv=`/dsh-tiddlywiki/status`;async function Kv(){try{let e=await fetch(Gv,{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 qv(){try{let e=await fetch(Gv,{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 Jv(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=()=>{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(`
656
+ `)},g=()=>{let e=n.getState();o!==void 0&&(o.dataset.state=e.state),a!==void 0&&(a.title=`知识库 · ${e.tooltip}`),h()},_=async()=>{p=await qv(),!r&&(c!==void 0&&(c.textContent=p.text),l!==void 0&&(l.dataset.state=p.state),h())},v=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`,()=>{h(),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.addEventListener(`click`,()=>{m(),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(`dsh-tw-panel-reload`)),_()}),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 v=document.createElement(`span`);v.className=`dsh-tw-fab-icon`,v.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(v,o),a.addEventListener(`click`,()=>{if(s!==void 0){if(f){m();return}f=!0,s.hidden=!1,g(),_()}}),i.append(s,a),document.body.append(i),g(),document.addEventListener(`click`,e=>{if(!f)return;let t=e.target;i!==void 0&&i.contains(t)||m()},!0)},y=e.subscribe(()=>{d!==void 0&&(d.textContent=e.isOpen()?`收起 TW 面板`:`打开 TW 面板`)}),b=n.subscribe(g);return(async()=>{let e=await Kv();r||!e.showQuickNote&&!e.showPanelStatus&&!e.showSyncButton||v(e)})(),()=>{r=!0,y(),b(),i?.remove()}}const Yv=`dsh-tw-note-state`;function Xv(e){return function(){let[t,n]=c.useState(!1),r=c.useRef(null),i=c.useRef(null);return c.useEffect(()=>{let e=e=>{let t=e.detail;n(t?.open===!0)};return window.addEventListener(Yv,e),()=>window.removeEventListener(Yv,e)},[]),c.useLayoutEffect(()=>{let e=r.current;if(e===null)return;let t=e.parentElement;if(t===null)return;let n=()=>{let n=e.getBoundingClientRect(),r=n.right;for(let e of t.querySelectorAll(`textarea, [contenteditable]:not([contenteditable="false"]), [role="textbox"]`)){let t=e.getBoundingClientRect();if(t.width>40&&t.height>10){r=t.right;break}}e.style.paddingRight=`${Math.max(0,n.right-r)}px`};n();let i=new ResizeObserver(n);i.observe(t),window.addEventListener(`resize`,n);let a=window.setTimeout(n,120),o=window.setTimeout(n,600);return()=>{i.disconnect(),window.removeEventListener(`resize`,n),window.clearTimeout(a),window.clearTimeout(o)}},[]),c.createElement(`div`,{ref:r,className:`dsh-tw-dock-note`},c.createElement(`button`,{ref:i,type:`button`,className:t?`dsh-tw-dock-note-btn dsh-tw-dock-note-btn-active`:`dsh-tw-dock-note-btn`,title:t?`快速笔记已打开(点卡片右上角 ✕ 收起)`:`打开快速笔记(在按钮上方弹出,可拖动标题栏移动)`,onClick:()=>{e.open(i.current??void 0)}},c.createElement(`span`,{className:`dsh-tw-dock-note-icon`,"aria-hidden":`true`},`📝`),c.createElement(`span`,{className:`dsh-tw-dock-note-label`},t?`快速笔记(已打开)`:`快速笔记`)))}}const Zv={showQuickNoteDock:!0,sidebarLabel:`TiddlyWiki`};async function Qv(){try{let e=await fetch(`/dsh-tiddlywiki/status`,{signal:AbortSignal.timeout(5e3)});if(!e.ok)return Zv;let t=await e.json();return{showQuickNoteDock:t.ui?.showQuickNoteDock!==!1,sidebarLabel:typeof t.ui?.sidebarLabel==`string`&&t.ui.sidebarLabel.trim().length>0?t.ui.sidebarLabel.trim():`TiddlyWiki`}}catch{return Zv}}const $v=`/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 ty(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 ny(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 ty(`/dsh-tiddlywiki/admin/state`);if(t)return;ry(n,e,a),sy(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 ry(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 ty(`/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 iy(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),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.length>0?o.darkPalette:`$:/palettes/CupertinoDark`);let d=o.allArticles??{};u(`ui.allArticles.pageSize`,`「所有文章」每页条数`,typeof d.pageSize==`number`?d.pageSize:10);let f=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`保存配置`);f.type=`button`,f.addEventListener(`click`,()=>{f.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 ty(`/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{f.disabled=!1}})()}),r.append(f),e.append(r)}function ay(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 ty($v,{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 ty($v,{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。`),w=$(`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),w.append(n)}let T=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`应用语言(重启 TW)`);T.type=`button`,T.addEventListener(`click`,()=>{T.disabled=!0,(async()=>{try{await ty($v,{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)}`),T.disabled=!1}})()}),S.append(C,w,T),e.append(S)}function oy(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 ty(`/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 sy(e,t,n){e.replaceChildren(),iy(e,t.config??{},n),ay(e,t.info,t.catalog,n),oy(e)}function cy(){let e=c.useRef(null);return c.useEffect(()=>{let t=e.current;return t===null?void 0:ny(t)},[]),c.createElement(`div`,{ref:e})}const ly={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 uy(e){return typeof e==`object`&&!!e&&e.kind===`tool-result`}function dy(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 fy(e){try{let t=JSON.parse(e);return typeof t==`object`&&t&&!Array.isArray(t)?t:{}}catch{return{}}}function py(e){return Array.isArray(e)?e.filter(e=>typeof e?.text==`string`).map(e=>e.text).join(`
653
657
  `):``}function my(e){return typeof e==`string`?e:``}async function hy(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 gy(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 _y(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 vy(e){return t=>{t.preventDefault(),t.stopPropagation(),ge(e)}}function yy(e){let t=ly[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 by(e){let{title:t}=e,{loading:n,data:r}=_y(async()=>{let[e,n]=await Promise.all([hy(`/dsh-tiddlywiki/get?title=${encodeURIComponent(t)}`),gy(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(yy,{toolName:e.toolName,title:t,subtitle:e.subtitle,tags:s,onOpen:vy(t),foot:l===void 0?void 0:`修改于 ${l}`},o)}function xy(e){return c.createElement(`a`,{className:`dsh-tw-toolcard-row`,href:`/dsh-tiddlywiki/tw/#${encodeURIComponent(e.title)}`,onClick:vy(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 Sy(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(xy,{key:`${e.title}-${t}`,...e}))),c.createElement(yy,{toolName:e.toolName,title:e.title,subtitle:e.subtitle},n)}function Cy(e){let t=my(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=_y(()=>hy(`/dsh-tiddlywiki/search?${r}`),[r]).data,a=(Array.isArray(i?.items)?i.items:[]).map(e=>({title:my(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(Sy,{toolName:e.toolName,title:t.length>0?t:`检索`,subtitle:s,rows:a,fallbackText:`没有匹配的笔记`})}function wy(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=_y(()=>hy(`/dsh-tiddlywiki/recent?${n}`),[n]).data,i=(Array.isArray(r?.items)?r.items:[]).map(e=>({title:my(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(Sy,{toolName:e.toolName,title:`最近修改`,subtitle:i.length>0?`最近 ${i.length} 条`:``,rows:i,fallbackText:`暂无笔记`})}function Ty(e){let t=(Array.isArray(e.args.items)?e.args.items:[]).map(e=>typeof e==`object`&&e&&typeof e.title==`string`?my(e.title):null).filter(e=>e!==null&&e.length>0).map(e=>({title:e}));return c.createElement(Sy,{toolName:e.toolName,title:`批量写入`,subtitle:t.length>0?`写入 ${t.length} 篇`:`(参数中没有可解析的 items)`,rows:t,fallbackText:`没有可展示的笔记`})}function Ey(e){let t=_y(()=>hy(`/dsh-tiddlywiki/tags`),[]).data,n=(Array.isArray(t?.items)?t.items:[]).map(e=>({tag:my(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(yy,{toolName:e.toolName,title:`标签`,subtitle:`共 ${n.length} 个`},r)}function Dy(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(yy,{toolName:e.toolName},t)}function Oy(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(yy,{toolName:e.toolName,title:e.title.length>0?e.title:void 0},t)}function ky(e,t){switch(e){case`tiddlywiki_get`:case`tiddlywiki_put`:case`tiddlywiki_delete`:return my(t.title);case`tiddlywiki_rename`:return my(t.newTitle);case`tiddlywiki_search`:return my(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 Ay(e){let t=e.block,n=e.toolName,r=uy(t),i=dy(t),a=n!==void 0&&n.length>0?n:i?.name??``,o=fy(i?.argsRaw??``),s=r?py(t.content):``;if(i===null)return c.createElement(yy,{toolName:a},c.createElement(`pre`,{className:`dsh-tw-toolcard-fallback`},s||`(无调用信息)`));if(!r)return c.createElement(yy,{toolName:a,title:ky(a,o)},c.createElement(`div`,{className:`dsh-tw-toolcard-pending`},`处理中…`));if(t.isError===!0)return c.createElement(yy,{toolName:a,title:ky(a,o)},c.createElement(`div`,{className:`dsh-tw-toolcard-error`},s||`工具调用失败`));switch(a){case`tiddlywiki_get`:return c.createElement(by,{toolName:a,title:my(o.title),subtitle:`读取`});case`tiddlywiki_put`:return c.createElement(by,{toolName:a,title:my(o.title),subtitle:`已写入`});case`tiddlywiki_rename`:return c.createElement(by,{toolName:a,title:my(o.newTitle),subtitle:`已重命名「${my(o.oldTitle)}」→`});case`tiddlywiki_delete`:return c.createElement(Oy,{toolName:a,title:my(o.title),text:s});case`tiddlywiki_batch_put`:return c.createElement(Ty,{toolName:a,args:o,text:s});case`tiddlywiki_search`:return c.createElement(Cy,{toolName:a,args:o,text:s});case`tiddlywiki_recent`:return c.createElement(wy,{toolName:a,args:o,text:s});case`tiddlywiki_list_tags`:return c.createElement(Ey,{toolName:a,text:s});case`tiddlywiki_git_sync`:case`tiddlywiki_git_resolve`:return c.createElement(Dy,{toolName:a,text:s});default:return c.createElement(yy,{toolName:a,title:ky(a,o)},c.createElement(`pre`,{className:`dsh-tw-toolcard-fallback`},s||`(完成)`))}}const jy=[`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 My(e){let t=[];for(let n of jy)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}`},Ay));r!==void 0&&t.push(r)}catch(e){console.error(`[dsh-tiddlywiki] register toolview ${n} failed:`,e)}return t}function Ny(){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{}ge(i)};return document.addEventListener(`click`,e,!0),()=>document.removeEventListener(`click`,e,!0)}const Py=[`slots`];function Fy(e){try{u();let t=new d,n=[],r=!1;try{let i=zv(),a=Wv();n.push(()=>i.dispose()),n.push(()=>a.dispose()),n.push(g(t)),n.push(xe(t)),n.push(Jv(t,i,a)),n.push(Ee),e.slots!==void 0&&Qv().then(t=>{if(r||!t.showQuickNoteDock)return;let a=e.slots?.inject(`conversation.input.dock`,()=>e.slots?.register({name:`conversation.input.dock`,id:`quick-note`,order:8,label:`快速笔记`},Xv(i)));a!==void 0&&n.push(a)})}catch(e){console.error(`[dsh-tiddlywiki] mount failed:`,e)}try{e.slots!==void 0&&n.push(...My(e.slots))}catch(e){console.error(`[dsh-tiddlywiki] tool views failed:`,e)}try{n.push(Ny())}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 知识库`},cy));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=Fy,exports.inject=Py,exports.name=`dsh-tiddlywiki/client`;
package/lib/client.js CHANGED
@@ -121,7 +121,10 @@ html[data-dsh-tw-active] .dshDesktopConversationSurface > :not([data-dsh-tw-view
121
121
  display: flex; align-items: center; gap: 8px;
122
122
  font-size: 12px; font-weight: 600; letter-spacing: .2px;
123
123
  color: var(--dsw-alias-label-primary, #222);
124
+ /* 标题栏 = 拖动把手(拖卡片移动);touch-action:none 让触屏也能拖动 */
125
+ cursor: move; user-select: none; -webkit-user-select: none; touch-action: none;
124
126
  }
127
+ .dsh-tw-note-head-dragging { cursor: grabbing; opacity: .96; }
125
128
  .dsh-tw-note-head .dsh-tw-note-label { margin-right: auto; display: flex; align-items: center; gap: 6px; }
126
129
  .dsh-tw-note-close {
127
130
  border: none; background: transparent; color: var(--dsw-alias-label-secondary, #888);
@@ -461,10 +464,11 @@ html[data-dsh-tw-active] .dshDesktopConversationSurface > :not([data-dsh-tw-view
461
464
 
462
465
  /* ── input-dock quick-note button(聊天输入框上方,conversation.input.dock)──
463
466
  该槽位渲染为「输入框上方的全宽条目」纵向 flex 排列(todo/cost-meter/goal/
464
- queue/git-graph 等插件同区),此按钮以紧凑小胶囊呈现,不与其他条目重叠。 */
467
+ queue/git-graph 等插件同区),此按钮以紧凑小胶囊呈现,不与其他条目重叠。
468
+ justify-content: flex-end 把按钮放在输入框上方横条的末尾(右端)。 */
465
469
  .dsh-tw-dock-note {
466
- display: flex; align-items: center; gap: 8px;
467
- padding: 4px 6px 0; box-sizing: border-box; width: 100%;
470
+ display: flex; align-items: center; justify-content: flex-end; gap: 8px;
471
+ padding: 4px 8px 0; box-sizing: border-box; width: 100%;
468
472
  }
469
473
  .dsh-tw-dock-note-btn {
470
474
  display: inline-flex; align-items: center; gap: 6px;
@@ -653,9 +657,9 @@ html[data-dsh-tw-active] .dshDesktopConversationSurface > :not([data-dsh-tw-view
653
657
  }`,{label:`interface`,detail:`definition`,type:`keyword`}),ed("type ${name} = ${type}",{label:`type`,detail:`definition`,type:`keyword`}),ed(`enum \${name} {
654
658
  \${}
655
659
  }`,{label:`enum`,detail:`definition`,type:`keyword`})]),Dm=new Pc,Om=new Set([`Script`,`Block`,`FunctionExpression`,`FunctionDeclaration`,`ArrowFunction`,`MethodDeclaration`,`ForStatement`]);function km(e){return(t,n)=>{let r=t.node.getChild(`VariableDefinition`);return r&&n(r,e),!0}}const Am=[`FunctionDeclaration`],jm={FunctionDeclaration:km(`function`),ClassDeclaration:km(`class`),ClassExpression:()=>!0,EnumDeclaration:km(`constant`),TypeAliasDeclaration:km(`type`),NamespaceDeclaration:km(`namespace`),VariableDefinition(e,t){e.matchContext(Am)||t(e,`variable`)},TypeDefinition(e,t){t(e,`type`)},__proto__:null};function Mm(e,t){let n=Dm.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=jm[t.name];if(e&&e(t,a)||Om.has(t.name))return!1}else if(t.to-t.from>8192){for(let n of Mm(e,t.node))r.push(n);return!1}}),Dm.set(t,r),r}const Nm=/^[\w$\xa1-\uffff][\w$\d\xa1-\uffff]*$/,Pm=[`TemplateString`,`String`,`RegExp`,`LineComment`,`BlockComment`,`VariableDefinition`,`TypeDefinition`,`Label`,`PropertyDefinition`,`PropertyName`,`PrivatePropertyDefinition`,`PrivatePropertyName`,`JSXText`,`JSXAttributeValue`,`JSXOpenTag`,`JSXCloseTag`,`JSXSelfClosingTag`,`.`,`?.`];function Fm(e){let t=Y(e.state).resolveInner(e.pos,-1);if(Pm.indexOf(t.name)>-1)return null;let n=t.name==`VariableName`||t.to-t.from<20&&Nm.test(e.state.sliceDoc(t.from,t.to));if(!n&&!e.explicit)return null;let r=[];for(let n=t;n;n=n.parent)Om.has(n.name)&&(r=r.concat(Mm(e.state.doc,n)));return{options:r,from:n?t.from:e.pos,validFor:Nm}}const Im=jl.define({name:`javascript`,parser:wm.configure({props:[Yl.add({IfStatement:su({except:/^\s*({|else\b)/}),TryStatement:su({except:/^\s*({|catch\b|finally\b)/}),LabeledStatement:ou,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:iu({closing:`}`}),ArrowFunction:e=>e.baseIndent+e.unit,"TemplateString BlockComment":()=>null,"Statement Property":su({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}}),lu.add({"Block ClassBody SwitchBody EnumBody ObjectExpression ArrayExpression ObjectType":uu,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:`$`}}),Lm={test:e=>/^JSX/.test(e.name),facet:Dl({commentTokens:{block:{open:`{/*`,close:`*/}`}}})},Rm=Im.configure({dialect:`ts`},`typescript`),zm=Im.configure({dialect:`jsx`,props:[Ol.add(e=>e.isTop?[Lm]:void 0)]}),Bm=Im.configure({dialect:`jsx ts`,props:[Ol.add(e=>e.isTop?[Lm]:void 0)]},`typescript`);let Vm=e=>({label:e,type:`keyword`});const Hm=`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(Vm),Um=Hm.concat([`declare`,`implements`,`private`,`protected`,`public`].map(Vm));function Wm(e={}){let t=e.jsx?e.typescript?Bm:zm:e.typescript?Rm:Im,n=e.typescript?Em.concat(Um):Tm.concat(Hm);return new Vl(t,[Im.data.of({autocomplete:Fu(Pm,Pu(n))}),Im.data.of({autocomplete:Fm}),e.jsx?Jm:[]])}function Gm(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 Km(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 qm=typeof navigator==`object`&&/Android\b/.test(navigator.userAgent),Jm=H.inputHandler.of((e,t,n,r,i)=>{if((qm?e.composing:e.compositionStarted)||e.state.readOnly||t!=n||r!=`>`&&r!=`/`||!Im.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=Km(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=Gm(n);if(r&&r.name==`JSXOpenTag`&&!/^\/?>|^<\//.test(o.doc.sliceString(t,t+2))&&(i=Km(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)}),Ym=[`_blank`,`_self`,`_top`,`_parent`],Xm=[`ascii`,`utf-8`,`utf-16`,`latin1`,`latin1`],Zm=[`get`,`post`,`put`,`delete`],Qm=[`application/x-www-form-urlencoded`,`multipart/form-data`,`text/plain`],$m=[`true`,`false`],Q={},eh={a:{attrs:{href:null,ping:null,type:null,media:null,target:Ym,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:Ym}},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:Qm,formmethod:Zm,formnovalidate:[`novalidate`],formtarget:Ym,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":Xm,autocomplete:[`on`,`off`],enctype:Qm,method:Zm,novalidate:[`novalidate`],target:Ym}},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:Qm,formmethod:Zm,formnovalidate:[`novalidate`],formtarget:Ym,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:Xm,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:Xm}},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},th={accesskey:null,class:null,contenteditable:$m,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:$m,autocorrect:$m,autocapitalize:$m,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":$m,"aria-autocomplete":[`inline`,`list`,`both`,`none`],"aria-busy":$m,"aria-checked":[`true`,`false`,`mixed`,`undefined`],"aria-controls":null,"aria-describedby":null,"aria-disabled":$m,"aria-dropeffect":null,"aria-expanded":[`true`,`false`,`undefined`],"aria-flowto":null,"aria-grabbed":[`true`,`false`,`undefined`],"aria-haspopup":$m,"aria-hidden":$m,"aria-invalid":[`true`,`false`,`grammar`,`spelling`],"aria-label":null,"aria-labelledby":null,"aria-level":null,"aria-live":[`off`,`polite`,`assertive`],"aria-multiline":$m,"aria-multiselectable":$m,"aria-owns":null,"aria-posinset":null,"aria-pressed":[`true`,`false`,`mixed`,`undefined`],"aria-readonly":$m,"aria-relevant":null,"aria-required":$m,"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},nh=`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 nh)th[e]=null;var rh=class{constructor(e,t){this.tags={...eh,...e},this.globalAttrs={...th,...t},this.allTags=Object.keys(this.tags),this.globalAttrNames=Object.keys(this.globalAttrs)}};rh.default=new rh;function ih(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 ah(e,t=!1){for(;e;e=e.parent)if(e.name==`Element`)if(t)t=!1;else return e;return null}function oh(e,t,n){return n.tags[ih(e,ah(t))]?.children||n.allTags}function sh(e,t){let n=[];for(let r=ah(t);r&&!r.type.isTop;r=ah(r.parent)){let i=ih(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 ch=/^[:\-\.\w\u00b7-\uffff]*$/;function lh(e,t,n,r,i){let a=/\s*>/.test(e.sliceDoc(i,i+5))?``:`>`,o=ah(n,n.name==`StartTag`||n.name==`TagName`);return{from:r,to:i,options:oh(e.doc,o,t).map(e=>({label:e,type:`type`})).concat(sh(e.doc,n).map((e,t)=>({label:`/`+e,apply:`/`+e+a,type:`type`,boost:99-t}))),validFor:/^\/?[:\-\.\w\u00b7-\uffff]*$/}}function uh(e,t,n,r){let i=/\s*>/.test(e.sliceDoc(r,r+5))?``:`>`;return{from:n,to:r,options:sh(e.doc,t).map((e,t)=>({label:e,apply:e+i,type:`type`,boost:99-t})),validFor:ch}}function dh(e,t,n,r){let i=[],a=0;for(let r of oh(e.doc,n,t))i.push({label:`<`+r,type:`type`});for(let t of sh(e.doc,n))i.push({label:`</`+t+`>`,type:`type`,boost:99-a++});return{from:r,to:r,options:i,validFor:/^<\/?[:\-\.\w\u00b7-\uffff]*$/}}function fh(e,t,n,r,i){let a=ah(n),o=a?t.tags[ih(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:ch}}function ph(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=ah(n),i=r?t.tags[ih(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)?uh(n,i,i.from,r):lh(n,e,i,i.from,r):i.name==`StartTag`||i.name==`IncompleteTag`?lh(n,e,i,r,r):i.name==`StartCloseTag`||i.name==`IncompleteCloseTag`?uh(n,i,r,r):i.name==`OpenTag`||i.name==`SelfClosingTag`||i.name==`AttributeName`?fh(n,e,i,i.name==`AttributeName`?i.from:r,r):i.name==`Is`||i.name==`AttributeValue`||i.name==`UnquotedAttributeValue`?ph(n,e,i,i.name==`Is`?r:i.from,r):t.explicit&&(a.name==`Element`||a.name==`Text`||a.name==`Document`)?dh(n,e,i,r):null}function hh(e){return mh(rh.default,e)}function gh(e){let{extraTags:t,extraGlobalAttributes:n}=e,r=n||t?new rh(t,n):rh.default;return e=>mh(r,e)}const _h=Im.parser.configure({top:`SingleExpression`}),vh=[{tag:`script`,attrs:e=>e.type==`text/typescript`||e.lang==`ts`,parser:Rm.parser},{tag:`script`,attrs:e=>e.type==`text/babel`||e.type==`text/jsx`,parser:zm.parser},{tag:`script`,attrs:e=>e.type==`text/typescript-jsx`,parser:Bm.parser},{tag:`script`,attrs(e){return/^(importmap|speculationrules|application\/(.+\+)?json)$/i.test(e.type)},parser:_h},{tag:`script`,attrs(e){return!e.type||/^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^module$|^$/i.test(e.type)},parser:Im.parser},{tag:`style`,attrs(e){return(!e.lang||e.lang==`css`)&&(!e.type||/^(text\/)?(x-)?(stylesheet|css)$/i.test(e.type))},parser:um.parser}],yh=[{name:`style`,parser:um.parser.configure({top:`Styles`})}].concat(nh.map(e=>({name:e,parser:Im.parser}))),bh=jl.define({name:`html`,parser:kp.configure({props:[Yl.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}}),lu.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}}}),vu.add({"OpenTag CloseTag":e=>e.getChild(`TagName`)})]}),languageData:{commentTokens:{block:{open:`<!--`,close:`-->`}},indentOnInput:/^\s*<\/\w+\W$/,wordChars:`-_`}}),xh=bh.configure({wrap:Np(vh,yh)});function Sh(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=Np((e.nestedLanguages||[]).concat(vh),(e.nestedAttributes||[]).concat(yh))),new Vl(n?bh.configure({wrap:n,dialect:t}):t?xh.configure({dialect:t}):xh,[xh.data.of({autocomplete:gh(e)}),e.autoCloseTags===!1?[]:Th,Wm().support,dm().support])}const Ch=new Set(`area base br col command embed frame hr img input keygen link meta param source track wbr menuitem`.split(` `));function wh(e,t,n){for(;;){if(t.lastChild?.name!=`CloseTag`)return!1;let r=t.parent;if(!r||ih(e,r)!=n)return!0;t=r}}const Th=H.inputHandler.of((e,t,n,r,i)=>{if(e.composing||e.state.readOnly||t!=n||r!=`>`&&r!=`/`||!xh.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=ih(o.doc,t.parent,n))&&!Ch.has(a)&&!wh(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=ih(o.doc,e,n))&&!Ch.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)}),Eh=Dl({commentTokens:{block:{open:`<!--`,close:`-->`}}}),Dh=new U,Oh=cf.configure({props:[lu.add(e=>!e.is(`Block`)||e.is(`Document`)||kh(e)!=null||Ah(e)?void 0:(e,t)=>({from:t.doc.lineAt(e.from).to,to:e.to})),Dh.add(kh),Yl.add({Document:()=>null}),El.add({Document:Eh})]});function kh(e){let t=/^(?:ATX|Setext)Heading(\d)$/.exec(e.name);return t?+t[1]:void 0}function Ah(e){return e.name==`OrderedList`||e.name==`BulletList`}function jh(e,t){let n=e;for(;;){let e=n.nextSibling,r;if(!e||(r=kh(e.type))!=null&&r<=t)break;n=e}return n.to}const Mh=cu.of((e,t,n)=>{for(let r=Y(e).resolveInner(n,-1);r&&!(r.from<t);r=r.parent){let e=r.type.prop(Dh);if(e==null)continue;let t=jh(r,e);if(t>n)return{from:n,to:t}}return null});function Nh(e){return new kl(Eh,e,[],`markdown`)}const Ph=Nh(Oh),Fh=Nh(Oh.configure([Of,jf,Af,Mf,{props:[lu.add({Table:(e,t)=>({from:t.doc.lineAt(e.from).to,to:e.to})})]}]));function Ih(e,t){return n=>{if(n&&e){let t=null;if(n=/\S*/.exec(n)[0],t=typeof e==`function`?e(n):Hl.matchLanguageName(e,n,!0),t instanceof Hl)return t.support?t.support.language.parser:Pl.getSkippingParser(t.load());if(t)return t.parser}return t?t.parser:null}}var Lh=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(+zh(this.item,e)[2]+t):``;return this.spaceBefore+n+this.type+this.spaceAfter}};function Rh(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 Lh(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 Lh(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 Lh(i.parent,s,s+t,a[1],e,n,i))}}return r}function zh(e,t){return/^(\s*)(\d+)(?=[.)])/.exec(t.sliceString(e.from,e.from+10))}function Bh(e,t,n,r=0){for(let i=-1,a=e;;){if(a.name==`ListItem`){let e=zh(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 Vh(e,t){let n=/^[ \t]*/.exec(e)[0].length;if(!n||t.facet(Wl)!=` `)return e;let r=xn(e,4,n),i=``;for(let e=r;e>0;)e>=4?(i+=` `,e-=4):(i+=` `,e--);return i+e.slice(n)}const Hh=((e={})=>({state:t,dispatch:n})=>{let r=Y(t),{doc:i}=t,a=null,o=t.changeByRange(n=>{if(!n.empty||!Fh.isActiveAt(t,n.from,-1)&&!Fh.isActiveAt(t,n.from,1))return a={range:n};let o=n.from,s=i.lineAt(o),c=Rh(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`&&Bh(l.item,i,r,-2),e&&e.node.name==`OrderedList`&&Bh(e.item,i,r),{range:j.cursor(t+n.length),changes:r}}else{let e=Gh(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`&&Bh(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?xn(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=Vh(p,t),Wh(l.node,t.doc)&&(p=Gh(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 Uh(e){return e.name==`QuoteMark`||e.name==`ListMark`}function Wh(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 Gh(e,t,n){let r=``;for(let t=0,i=e.length-2;t<=i;t++)r+=e[t].blank(t<i?xn(n.text,4,e[t+1].from)-r.length:null,t<i);return Vh(r,t)}function Kh(e,t){let n=e.resolveInner(t,-1),r=t;Uh(n)&&(r=n.from,n=n.parent);for(let e;e=n.childBefore(r);)if(Uh(e))r=e.from;else if(e.name==`OrderedList`||e.name==`BulletList`)n=e.lastChild,r=n.to;else break;return n}const qh=[{key:`Enter`,run:Hh},{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&&Fh.isActiveAt(e,t.from)){let t=a.lineAt(i),r=Rh(Kh(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(xn(t.text,4,n.to)-xn(t.text,4,n.from));return r==t.from&&(i=Vh(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)}}],Jh=Sh({matchClosingTags:!1});function Yh(e={}){let{codeLanguages:t,defaultCodeLanguage:n,addKeymap:r=!0,base:{parser:i}=Ph,completeHTMLTags:a=!0,pasteURLAsLink:o=!0,htmlTagLanguage:s=Jh}=e;if(!(i instanceof Fd))throw RangeError("Base parser provided to `markdown` should be a Markdown parser");let c=e.extensions?[e.extensions]:[],l=[s.support,Mh],u;o&&l.push(eg),n instanceof Vl?(l.push(n.support),u=n.language):n&&(u=n);let d=t||u?Ih(t,u):void 0;c.push(uf({codeParser:d,htmlParser:s.language.parser})),r&&l.push(Ct.high(Fs.of(qh)));let f=Nh(i.configure(c));return a&&l.push(f.data.of({autocomplete:Xh})),new Vl(f,l)}function Xh(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:Qh(),validFor:/^<[:\-\.\w\u00b7-\uffff]*$/}}let Zh=null;function Qh(){if(Zh)return Zh;let e=hh(new ju(P.create({extensions:Jh}),0,!0));return Zh=e?e.options:[]}const $h=/code|horizontalrule|html|link|comment|processing|escape|entity|image|mark|url/i,eg=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),!Fh.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||$h.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)}}),tg=e=>{let{state:t}=e,n=t.doc.lineAt(t.selection.main.from),r=og(e.state,n.from);return r.line?rg(e):r.block?ag(e):!1};function ng(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 rg=ng(ug,0),ig=ng(lg,0),ag=ng((e,t)=>lg(e,t,cg(t)),0);function og(e,t){let n=e.languageDataAt(`commentTokens`,t,1);return n.length?n[0]:{}}function sg(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 cg(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 lg(e,t,n=t.selection.ranges){let r=n.map(e=>og(t,e.from).block);if(!r.every(e=>e))return null;let i=n.map((e,n)=>sg(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 ug(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=og(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 dg=Rt.define(),fg=Rt.define(),pg=M.define(),mg=M.define({combine(e){return tn(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)})}}),hg=bt.define({create(){return Ng.empty},update(e,t){let n=t.state.facet(mg),r=t.annotation(dg);if(r){let i=Sg.fromTransaction(t,r.selection),a=r.side,o=a==0?e.undone:e.done;return o=i?Cg(o,o.length,n.minDepth,i):Og(o,t.startState.selection),new Ng(a==0?r.rest:o,a==0?o:r.rest)}let i=t.annotation(fg);if((i==`full`||i==`before`)&&(e=e.isolate()),t.annotation(Vt.addToHistory)===!1)return t.changes.empty?e:e.addMapping(t.changes.desc);let a=Sg.fromTransaction(t),o=t.annotation(Vt.time),s=t.annotation(Vt.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 Ng(e.done.map(Sg.fromJSON),e.undone.map(Sg.fromJSON))}});function gg(e={}){return[hg,mg.of(e),H.domEventHandlers({beforeinput(e,t){let n=e.inputType==`historyUndo`?vg:e.inputType==`historyRedo`?yg:null;return n?(e.preventDefault(),n(t)):!1}})]}function _g(e,t){return function({state:n,dispatch:r}){if(!t&&n.readOnly)return!1;let i=n.field(hg,!1);if(!i)return!1;let a=i.pop(e,n,t);return a?(r(a),!0):!1}}const vg=_g(0,!1),yg=_g(1,!1),bg=_g(0,!0),xg=_g(1,!0);var Sg=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&&it.fromJSON(t.changes),[],t.mapped&&rt.fromJSON(t.mapped),t.startSelection&&j.fromJSON(t.startSelection),t.selectionsAfter.map(j.fromJSON))}static fromTransaction(t,n){let r=Dg;for(let e of t.startState.facet(pg)){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,Dg)}static selection(t){return new e(void 0,Dg,void 0,void 0,t)}};function Cg(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 wg(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 Tg(e,t){return e.ranges.length==t.ranges.length&&e.ranges.filter((e,n)=>e.empty!=t.ranges[n].empty).length===0}function Eg(e,t){return e.length?t.length?e.concat(t):e:t}const Dg=[];function Og(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),Cg(e,e.length-1,1e9,n.setSelAfter(r)))}else return[Sg.selection([t])]}function kg(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 Ag(e,t){if(!e.length)return e;let n=e.length,r=Dg;for(;n;){let i=jg(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?[Sg.selection(r)]:Dg}function jg(e,t,n){let r=Eg(e.selectionsAfter.length?e.selectionsAfter.map(e=>e.map(t)):Dg,n);if(!e.changes)return Sg.selection(r);let i=e.changes.map(t),a=t.mapDesc(e.changes,!0),o=e.mapped?e.mapped.composeDesc(a):a;return new Sg(i,N.mapEffects(e.effects,t),o,e.startSelection.map(a),r)}const Mg=/^(input\.type|delete)($|\.)/;var Ng=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||Mg.test(r))&&(!s.selectionsAfter.length&&n-this.prevTime<i.newGroupDelay&&i.joinToEvent(a,wg(s.changes,t.changes))||r==`input.type.compose`)?Cg(o,o.length-1,i.minDepth,new Sg(t.changes.compose(s.changes),Eg(N.mapEffects(t.effects,s.changes),s.effects),s.mapped,s.startSelection,Dg)):Cg(o,o.length,i.minDepth,t),new e(o,Dg,n,r)}addSelection(t,n,r,i){let a=this.done.length?this.done[this.done.length-1].selectionsAfter:Dg;return a.length>0&&n-this.prevTime<i&&r==this.prevUserEvent&&r&&/^select($|\.)/.test(r)&&Tg(a[a.length-1],t)?this:new e(Og(this.done,t),this.undone,n,r)}addMapping(t){return new e(Ag(this.done,t),Ag(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:dg.of({side:e,rest:kg(r),selection:a}),userEvent:e==0?`select.undo`:`select.redo`,scrollIntoView:!0});if(i.changes){let n=r.length==1?Dg:r.slice(0,r.length-1);return i.mapped&&(n=Ag(n,i.mapped)),t.update({changes:i.changes,selection:i.startSelection,effects:i.effects,annotations:dg.of({side:e,rest:n,selection:a}),filter:!1,userEvent:e==0?`undo`:`redo`,scrollIntoView:!0})}else return null}};Ng.empty=new Ng(Dg,Dg);const Pg=[{key:`Mod-z`,run:vg,preventDefault:!0},{key:`Mod-y`,mac:`Mod-Shift-z`,run:yg,preventDefault:!0},{linux:`Ctrl-Shift-z`,run:yg,preventDefault:!0},{key:`Mod-u`,run:bg,preventDefault:!0},{key:`Alt-u`,mac:`Mod-Shift-u`,run:xg,preventDefault:!0}];function Fg(e,t){return j.create(e.ranges.map(t),e.mainIndex)}function Ig(e,t){return e.update({selection:t,scrollIntoView:!0,userEvent:`select`})}function Lg({state:e,dispatch:t},n){let r=Fg(e.selection,n);return r.eq(e.selection,!0)?!1:(t(Ig(e,r)),!0)}function Rg(e,t){return j.cursor(t?e.to:e.from)}function zg(e,t){return Lg(e,n=>n.empty?e.moveByChar(n,t):Rg(n,t))}function Bg(e){return e.textDirectionAt(e.state.selection.main.head)==R.LTR}const Vg=e=>zg(e,!Bg(e)),Hg=e=>zg(e,Bg(e));function Ug(e,t){return Lg(e,n=>n.empty?e.moveByGroup(n,t):Rg(n,t))}const Wg=e=>Ug(e,!Bg(e)),Gg=e=>Ug(e,Bg(e));typeof Intl<`u`&&Intl.Segmenter;function Kg(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 qg(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;Kg(e,t,i)?r=t:a=n?t.to:t.from}let a=r.type.prop(i),o,s;return s=a&&(o=n?xu(e,r.from,1):xu(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 Jg=e=>Lg(e,t=>qg(e.state,t,!Bg(e))),Yg=e=>Lg(e,t=>qg(e.state,t,Bg(e)));function Xg(e,t){return Lg(e,n=>{if(!n.empty)return Rg(n,t);let r=e.moveVertically(n,t);return r.head==n.head?e.moveToLineBoundary(n,t):r})}const Zg=e=>Xg(e,!1),Qg=e=>Xg(e,!0);function $g(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 e_(e,t){let n=$g(e),{state:r}=e,i=Fg(r.selection,r=>r.empty?e.moveVertically(r,t,n.height):Rg(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(Ig(r,i),{effects:a}),!0}const t_=e=>e_(e,!1),n_=e=>e_(e,!0);function r_(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 i_=e=>Lg(e,t=>r_(e,t,!0)),a_=e=>Lg(e,t=>r_(e,t,!1)),o_=e=>Lg(e,t=>r_(e,t,!Bg(e))),s_=e=>Lg(e,t=>r_(e,t,Bg(e))),c_=e=>Lg(e,t=>j.cursor(e.lineBlockAt(t.head).from,1)),l_=e=>Lg(e,t=>j.cursor(e.lineBlockAt(t.head).to,-1));function u_(e,t,n){let r=!1,i=Fg(e.selection,t=>{let i=xu(e,t.head,-1)||xu(e,t.head,1)||t.head>0&&xu(e,t.head-1,1)||t.head<e.doc.length&&xu(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(Ig(e,i)),!0):!1}const d_=({state:e,dispatch:t})=>u_(e,t,!1);function f_(e,t,n){let r=Fg(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(Ig(e.state,r)),!0)}function p_(e,t){return f_(e,t,n=>e.moveByChar(n,t))}const m_=e=>p_(e,!Bg(e)),h_=e=>p_(e,Bg(e));function g_(e,t){return f_(e,t,n=>e.moveByGroup(n,t))}const __=e=>g_(e,!Bg(e)),v_=e=>g_(e,Bg(e)),y_=e=>{let t=!Bg(e);return f_(e,t,n=>qg(e.state,n,t))},b_=e=>{let t=Bg(e);return f_(e,t,n=>qg(e.state,n,t))};function x_(e,t){return f_(e,t,n=>e.moveVertically(n,t))}const S_=e=>x_(e,!1),C_=e=>x_(e,!0);function w_(e,t){return f_(e,t,n=>e.moveVertically(n,t,$g(e).height))}const T_=e=>w_(e,!1),E_=e=>w_(e,!0),D_=e=>f_(e,!0,t=>r_(e,t,!0)),O_=e=>f_(e,!1,t=>r_(e,t,!1)),k_=e=>{let t=!Bg(e);return f_(e,t,n=>r_(e,n,t))},A_=e=>{let t=Bg(e);return f_(e,t,n=>r_(e,n,t))},j_=e=>f_(e,!1,t=>j.cursor(e.lineBlockAt(t.head).from)),M_=e=>f_(e,!0,t=>j.cursor(e.lineBlockAt(t.head).to)),N_=({state:e,dispatch:t})=>(t(Ig(e,{anchor:0})),!0),P_=({state:e,dispatch:t})=>(t(Ig(e,{anchor:e.doc.length})),!0),F_=({state:e,dispatch:t})=>(t(Ig(e,{anchor:e.selection.main.anchor,head:0})),!0),I_=({state:e,dispatch:t})=>(t(Ig(e,{anchor:e.selection.main.anchor,head:e.doc.length})),!0),L_=({state:e,dispatch:t})=>(t(e.update({selection:{anchor:0,head:e.doc.length},userEvent:`select`})),!0),R_=({state:e,dispatch:t})=>{let n=rv(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},z_=({state:e,dispatch:t})=>{let n=Fg(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(Ig(e,n)),!0)};function B_(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(Ig(n,j.create(i,i.length-1))),!0)}const V_=e=>B_(e,!1),H_=e=>B_(e,!0),U_=({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(Ig(e,r)),!0):!1};function W_(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=G_(e,o,!1)):o>i&&(n=`delete.forward`,o=G_(e,o,!0)),i=Math.min(i,o),a=Math.max(a,o)}else i=G_(e,i,!1),a=G_(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 G_(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 K_=(e,t,n)=>W_(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=xn(s,a.tabSize)%Gl(a)||Gl(a);for(let t=0;t<e&&s[s.length-1-t]==` `;t++)i--;c=i}else c=Xe(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=Xe(o.text,c-o.from,!1,!1)+o.from);return c}),q_=e=>K_(e,!1,!0),J_=e=>K_(e,!0,!1),Y_=(e,t)=>W_(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=Xe(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}),X_=e=>Y_(e,!1),Z_=e=>Y_(e,!0),Q_=e=>W_(e,t=>{let n=e.lineBlockAt(t.head).to;return t.head<n?n:Math.min(e.state.doc.length,t.head+1)}),$_=e=>W_(e,t=>{let n=e.moveToLineBoundary(t,!1).head;return t.head>n?n:Math.max(0,t.head-1)}),ev=e=>W_(e,t=>{let n=e.moveToLineBoundary(t,!0).head;return t.head<n?n:Math.min(e.state.doc.length,t.head+1)}),tv=({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},nv=({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:Xe(r.text,n-r.from,!1)+r.from,a=n==r.to?n+1:Xe(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 rv(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 iv(e,t,n){if(e.readOnly)return!1;let r=[],i=[];for(let t of rv(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 av=({state:e,dispatch:t})=>iv(e,t,!1),ov=({state:e,dispatch:t})=>iv(e,t,!0);function sv(e,t,n){if(e.readOnly)return!1;let r=[];for(let t of rv(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 cv=({state:e,dispatch:t})=>sv(e,t,!1),lv=({state:e,dispatch:t})=>sv(e,t,!0),uv=e=>{if(e.state.readOnly)return!1;let{state:t}=e,n=t.changes(rv(t).map(({from:e,to:n})=>(e>0?e--:n<t.doc.length&&n++,{from:e,to:n}))),r=Fg(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 dv(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 fv=mv(!1),pv=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&&dv(t,r);e&&(r=i=(i<=a.to?a:t.doc.lineAt(i)).to);let s=new Jl(t,{simulateBreak:r,simulateDoubleBreak:!!o}),c=ql(s,r);for(c??=xn(/^\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=[``,Kl(t,c)];return o&&l.push(Kl(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 hv(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 gv=({state:e,dispatch:t})=>{if(e.readOnly)return!1;let n=Object.create(null),r=new Jl(e,{overrideIndentation:e=>n[e]??-1}),i=hv(e,(t,i,a)=>{let o=ql(r,t.from);if(o==null)return;/\S/.test(t.text)||(o=0);let s=/^\s*/.exec(t.text)[0],c=Kl(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},_v=({state:e,dispatch:t})=>e.readOnly?!1:(t(e.update(hv(e,(t,n)=>{n.push({from:t.from,insert:e.facet(Wl)})}),{userEvent:`input.indent`})),!0),vv=({state:e,dispatch:t})=>e.readOnly?!1:(t(e.update(hv(e,(t,n)=>{let r=/^\s*/.exec(t.text)[0];if(!r)return;let i=xn(r,e.tabSize),a=0,o=Kl(e,Math.max(0,i-Gl(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),yv=e=>(e.setTabFocusMode(),!0),bv=[{key:`Ctrl-b`,run:Vg,shift:m_,preventDefault:!0},{key:`Ctrl-f`,run:Hg,shift:h_},{key:`Ctrl-p`,run:Zg,shift:S_},{key:`Ctrl-n`,run:Qg,shift:C_},{key:`Ctrl-a`,run:c_,shift:j_},{key:`Ctrl-e`,run:l_,shift:M_},{key:`Ctrl-d`,run:J_},{key:`Ctrl-h`,run:q_},{key:`Ctrl-k`,run:Q_},{key:`Ctrl-Alt-h`,run:X_},{key:`Ctrl-o`,run:tv},{key:`Ctrl-t`,run:nv},{key:`Ctrl-v`,run:n_}],xv=[{key:`ArrowLeft`,run:Vg,shift:m_,preventDefault:!0},{key:`Mod-ArrowLeft`,mac:`Alt-ArrowLeft`,run:Wg,shift:__,preventDefault:!0},{mac:`Cmd-ArrowLeft`,run:o_,shift:k_,preventDefault:!0},{key:`ArrowRight`,run:Hg,shift:h_,preventDefault:!0},{key:`Mod-ArrowRight`,mac:`Alt-ArrowRight`,run:Gg,shift:v_,preventDefault:!0},{mac:`Cmd-ArrowRight`,run:s_,shift:A_,preventDefault:!0},{key:`ArrowUp`,run:Zg,shift:S_,preventDefault:!0},{mac:`Cmd-ArrowUp`,run:N_,shift:F_},{mac:`Ctrl-ArrowUp`,run:t_,shift:T_},{key:`ArrowDown`,run:Qg,shift:C_,preventDefault:!0},{mac:`Cmd-ArrowDown`,run:P_,shift:I_},{mac:`Ctrl-ArrowDown`,run:n_,shift:E_},{key:`PageUp`,run:t_,shift:T_},{key:`PageDown`,run:n_,shift:E_},{key:`Home`,run:a_,shift:O_,preventDefault:!0},{key:`Mod-Home`,run:N_,shift:F_},{key:`End`,run:i_,shift:D_,preventDefault:!0},{key:`Mod-End`,run:P_,shift:I_},{key:`Enter`,run:fv,shift:fv},{key:`Mod-a`,run:L_},{key:`Backspace`,run:q_,shift:q_,preventDefault:!0},{key:`Delete`,run:J_,preventDefault:!0},{key:`Mod-Backspace`,mac:`Alt-Backspace`,run:X_,preventDefault:!0},{key:`Mod-Delete`,mac:`Alt-Delete`,run:Z_,preventDefault:!0},{mac:`Mod-Backspace`,run:$_,preventDefault:!0},{mac:`Mod-Delete`,run:ev,preventDefault:!0}].concat(bv.map(e=>({mac:e.key,run:e.run,shift:e.shift}))),Sv=[{key:`Alt-ArrowLeft`,mac:`Ctrl-ArrowLeft`,run:Jg,shift:y_},{key:`Alt-ArrowRight`,mac:`Ctrl-ArrowRight`,run:Yg,shift:b_},{key:`Alt-ArrowUp`,run:av},{key:`Shift-Alt-ArrowUp`,run:cv},{key:`Alt-ArrowDown`,run:ov},{key:`Shift-Alt-ArrowDown`,run:lv},{key:`Mod-Alt-ArrowUp`,run:V_},{key:`Mod-Alt-ArrowDown`,run:H_},{key:`Escape`,run:U_},{key:`Mod-Enter`,run:pv},{key:`Alt-l`,mac:`Ctrl-l`,run:R_},{key:`Mod-i`,run:z_,preventDefault:!0},{key:`Mod-[`,run:vv},{key:`Mod-]`,run:_v},{key:`Mod-Alt-\\`,run:gv},{key:`Shift-Mod-k`,run:uv},{key:`Shift-Mod-\\`,run:d_},{key:`Mod-/`,run:tg},{key:`Alt-A`,mac:`Ctrl-A`,run:ig},{key:`Ctrl-m`,mac:`Shift-Alt-m`,run:yv}].concat(xv),Cv=`var(--dsw-alias-brand-primary, #3e63dd)`,wv=`color-mix(in srgb, var(--dsw-alias-brand-primary, #3e63dd) 55%, transparent)`,Tv=`var(--dsw-alias-label-dimmed, #999)`,Ev=`ui-monospace, "Cascadia Mono", Consolas, "SF Mono", Menlo, monospace`,Dv=du.define([{tag:[J.heading1,J.heading2,J.heading3,J.heading4,J.heading5,J.heading6],color:Cv,fontWeight:`700`},{tag:J.processingInstruction,color:wv},{tag:J.monospace,fontFamily:Ev,backgroundColor:`color-mix(in srgb, var(--dsw-alias-label-secondary, #888) 12%, transparent)`,borderRadius:`4px`,padding:`0 3px`},{tag:J.content,fontFamily:Ev,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:Cv,textDecoration:`underline`},{tag:J.url,color:wv,textDecoration:`underline dotted`},{tag:J.quote,fontStyle:`italic`,color:`var(--dsw-alias-label-secondary, #888)`},{tag:J.contentSeparator,color:Tv,textDecoration:`line-through`},{tag:J.comment,color:Tv}]);function Ov(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,gg(),Yh({base:Fh}),hu(Dv),Zs(),ac(e.placeholder??``),Fs.of([...Sv,...Pg,{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?``:`
656
- `}${e}\n`;n.dispatch({changes:{from:t,insert:r},selection:{anchor:t+r.length},scrollIntoView:!0}),n.focus()},focus:()=>n.focus()}}const kv=`dsh-tw-note-draft-v1`;function Av(){try{let e=localStorage.getItem(kv);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 jv(e){try{localStorage.setItem(kv,JSON.stringify(e))}catch{}}function Mv(){try{localStorage.removeItem(kv)}catch{}}function Nv(e){return e<10?`0${e}`:String(e)}function Pv(e=new Date){return`${e.getFullYear()}-${Nv(e.getMonth()+1)}-${Nv(e.getDate())} ${Nv(e.getHours())}:${Nv(e.getMinutes())}`}function Fv(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 Iv(){let e={showQuickNote:!0,defaultTag:`inbox`};try{let t=await fetch(`/dsh-tiddlywiki/status`,{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 Lv(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};return 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()}),document.addEventListener(`click`,e=>{t.contains(e.target)||o()},!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()}}}async function Rv(e,t){if(e.size>67108864){O(`文件过大(≤ 64MB)`);return}try{let n=await fetch(`/dsh-tiddlywiki/upload?name=${encodeURIComponent(e.name)}`,{method:`POST`,headers:{"content-type":e.type||`application/octet-stream`},body:e,signal:AbortSignal.timeout(12e4)}),r=await n.json().catch(()=>null);if(!n.ok||r?.ok!==!0){O(`上传失败:${r?.error??`HTTP ${n.status}`}`);return}let i=r.name??e.name,a=e.type.startsWith(`image/`)?`![${i}](${r.url})`:`[${i}](${r.url})`;t.insertAtCaret(a),O(`已上传「${i}」并插入链接`)}catch(e){O(`上传失败:${e instanceof Error?e.message:String(e)}`)}}function zv(){let e,t=!1,n=!1,r=`inbox`,i,a=!1,o=e=>{try{window.dispatchEvent(new CustomEvent(`dsh-tw-note-state`,{detail:{open:e}}))}catch{}},s=()=>{e!==void 0&&(e.titleInput.value=Pv())},c=()=>{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){Mv();return}jv({text:t,title:n,tags:e.tagEditor.getTags(),savedAt:Date.now()})},500))},l=()=>{e!==void 0&&(e.draftBanner.hidden=!0)},u=()=>{a=!1,e!==void 0&&(e.recentWrap.hidden=!0)},d=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??[]),l(),u(),O(`已载入「${r.title}」`),e.editor.focus()}catch(e){O(`读取失败:${e instanceof Error?e.message:String(e)}`)}},f=()=>{if(e===void 0)return;if(a){u();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=[Fv(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`,()=>{d(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)}})()},p=()=>{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 d=document.createElement(`div`);d.className=`dsh-tw-note-draft`,d.hidden=!0;let p=document.createElement(`span`);p.className=`dsh-tw-note-draft-text`,p.textContent=`已恢复未保存草稿`;let m=document.createElement(`button`);m.type=`button`,m.className=`dsh-tw-note-draft-discard`,m.textContent=`丢弃`,d.append(p,m);let h=document.createElement(`div`);h.className=`dsh-tw-note-fields`;let g=document.createElement(`input`);g.className=`dsh-tw-note-title`,g.placeholder=`标题(默认时间戳)`;let _=Lv({onChange:c});h.append(g,_.el),g.addEventListener(`input`,c);let v,y=Ov({placeholder:`写点东西… Markdown 高亮,可 📎/拖入文件
657
- Ctrl+Enter 保存`,onSave:()=>{v?.()},onChange:c}),b=document.createElement(`button`);b.type=`button`,b.className=`dsh-tw-note-upload`,b.title=`上传文件到 wiki 并插入 Markdown 链接(也可直接拖入编辑器)`,b.textContent=`📎 上传`;let x=document.createElement(`input`);x.type=`file`,x.multiple=!0,x.hidden=!0,b.addEventListener(`click`,()=>{x.click()}),x.addEventListener(`change`,()=>{for(let e of Array.from(x.files??[]))Rv(e,y);x.value=``});let S=0;y.el.addEventListener(`dragenter`,e=>{e.preventDefault(),S++,y.el.classList.add(`dsh-tw-note-drop`)}),y.el.addEventListener(`dragover`,e=>{e.preventDefault()}),y.el.addEventListener(`dragleave`,e=>{e.preventDefault(),S=Math.max(0,S-1),S===0&&y.el.classList.remove(`dsh-tw-note-drop`)}),y.el.addEventListener(`drop`,e=>{e.preventDefault(),S=0,y.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))Rv(e,y)});let C=document.createElement(`div`);C.className=`dsh-tw-note-foot`;let w=document.createElement(`div`);w.className=`dsh-tw-note-foot-left`;let T=document.createElement(`span`);T.className=`dsh-tw-note-hint`,T.textContent=`Ctrl+Enter`;let ee=document.createElement(`button`);ee.type=`button`,ee.className=`dsh-tw-note-recent-btn`,ee.title=`最近修改的笔记,点击载入继续编辑`,ee.textContent=`🕘 最近`,ee.addEventListener(`click`,f),w.append(b,ee,T);let te=document.createElement(`div`);te.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=`保存`,te.append(E,D),C.append(w,te);let ne=document.createElement(`div`);ne.className=`dsh-tw-note-recent`,ne.hidden=!0,r.append(i,d,h,y.el,C),t.append(r,ne),document.body.append(t),e={root:t,card:r,editor:y,titleInput:g,tagEditor:_,saveBtn:D,editBtn:E,draftBanner:d,recentBtn:ee,recentWrap:ne};let re=()=>{n=!1,t.hidden=!0,u(),o(!1)},ie=()=>{Mv(),l(),y.setValue(``),g.value=Pv(),_.setTags([]),re()};v=async()=>{let e=y.getValue().trim();if(e.length===0){O(`内容为空,未保存`);return}D.disabled=!0,D.textContent=`保存中…`;try{let t=await fetch(`/dsh-tiddlywiki/note`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({title:g.value.trim(),tags:_.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}ie(),O(`已保存「${n.title??g.value}」`)}catch(e){O(`保存失败:${e instanceof Error?e.message:String(e)}`)}finally{D.disabled=!1,D.textContent=`保存`}},D.addEventListener(`click`,()=>{v?.()});let ae=async()=>{let e=g.value.trim().length>0?g.value.trim():Pv(),t=y.getValue(),n=_.getTags();E.disabled=!0,E.textContent=`打开中…`;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);if(!r.ok||i?.ok!==!0){O(`打开失败:${i?.error??`HTTP ${r.status}`}`);return}if(typeof i.twUrl!=`string`||typeof i.draftTitle!=`string`){O(`打开失败:服务未返回编辑器地址`);return}Mv(),l(),Te(`${new URL(i.twUrl,location.origin).href}#${encodeURIComponent(i.draftTitle)}`,i.title??e),O(`已在弹出窗口打开「${i.title??e}」编辑器`)}catch(e){O(`打开失败:${e instanceof Error?e.message:String(e)}`)}finally{E.disabled=!1,E.textContent=`✏️ 在 TW 中编辑`}};E.addEventListener(`click`,()=>{ae()}),s.addEventListener(`click`,re),m.addEventListener(`click`,()=>{Mv(),l(),y.setValue(``),g.value=Pv(),_.setTags([]),O(`已丢弃草稿`)})};return{async open(){if(t||(p(),e===void 0||n))return;n=!0,e.root.hidden=!1,o(!0);let i=Av();i!==null&&(i.text.trim().length>0||i.title.trim().length>0)?(e.editor.setValue(i.text),e.titleInput.value=i.title,e.tagEditor.setTags(i.tags),e.draftBanner.hidden=!1):(s(),r=(await Iv()).defaultTag,e.tagEditor.setDefault(r)),e.editor.focus()},close(){e!==void 0&&(n=!1,e.root.hidden=!0,u(),o(!1))},async toggle(){n?this.close():await this.open()},isOpen(){return n},dispose(){t=!0,i!==void 0&&(clearTimeout(i),i=void 0),e?.editor.view.destroy(),e?.root.remove(),document.querySelector(`.dsh-tw-toast`)?.remove(),e=void 0}}}function Bv(e){return e<10?`0${e}`:String(e)}function Vv(e){return`${Bv(e.getHours())}:${Bv(e.getMinutes())}`}async function Hv(){try{let e=await fetch(`/dsh-tiddlywiki/status`,{signal:AbortSignal.timeout(8e3)});return e.ok?await e.json():null}catch{return null}}function Uv(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(`上次同步 ${Vv(t)}`),{state:i,label:a,tooltip:r.join(` · `),...t===void 0?{}:{lastSync:t}}}function Wv(){let e={state:`offline`,label:`离线`,tooltip:`同步知识库`},t,n,r=!1,i=new Set,a=()=>{for(let e of[...i])e()},o=n=>{let r=Uv(n,t);(r.state!==e.state||r.tooltip!==e.tooltip)&&(e=r,a())},s=async()=>{o(await Hv())};return s(),n=window.setInterval(()=>{s()},3e4),{getState:()=>e,trigger:async()=>{if(r)return e;r=!0,e={...e,state:`syncing`,label:`同步中…`},a();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 s()}catch(e){O(`同步失败:${e instanceof Error?e.message:String(e)}`)}finally{r=!1,await s()}return e},subscribe(e){return i.add(e),()=>{i.delete(e)}},dispose(){n!==void 0&&(clearInterval(n),n=void 0),i.clear()}}}const Gv=`/dsh-tiddlywiki/status`;async function Kv(){try{let e=await fetch(Gv,{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 qv(){try{let e=await fetch(Gv,{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 Jv(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=()=>{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(`
658
- `)},g=()=>{let e=n.getState();o!==void 0&&(o.dataset.state=e.state),a!==void 0&&(a.title=`知识库 · ${e.tooltip}`),h()},_=async()=>{p=await qv(),!r&&(c!==void 0&&(c.textContent=p.text),l!==void 0&&(l.dataset.state=p.state),h())},v=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`,()=>{h(),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.addEventListener(`click`,()=>{m(),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(`dsh-tw-panel-reload`)),_()}),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 v=document.createElement(`span`);v.className=`dsh-tw-fab-icon`,v.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(v,o),a.addEventListener(`click`,()=>{if(s!==void 0){if(f){m();return}f=!0,s.hidden=!1,g(),_()}}),i.append(s,a),document.body.append(i),g(),document.addEventListener(`click`,e=>{if(!f)return;let t=e.target;i!==void 0&&i.contains(t)||m()},!0)},y=e.subscribe(()=>{d!==void 0&&(d.textContent=e.isOpen()?`收起 TW 面板`:`打开 TW 面板`)}),b=n.subscribe(g);return(async()=>{let e=await Kv();r||!e.showQuickNote&&!e.showPanelStatus&&!e.showSyncButton||v(e)})(),()=>{r=!0,y(),b(),i?.remove()}}const Yv=`dsh-tw-note-state`;function Xv(e){return function(){let[t,n]=c.useState(!1);return c.useEffect(()=>{let e=e=>{let t=e.detail;n(t?.open===!0)};return window.addEventListener(Yv,e),()=>window.removeEventListener(Yv,e)},[]),c.createElement(`div`,{className:`dsh-tw-dock-note`},c.createElement(`button`,{type:`button`,className:t?`dsh-tw-dock-note-btn dsh-tw-dock-note-btn-active`:`dsh-tw-dock-note-btn`,title:t?`快速笔记已打开(点卡片右上角 ✕ 收起)`:`打开快速笔记(草稿自动保存,点别处不会关闭)`,onClick:()=>{e.open()}},c.createElement(`span`,{className:`dsh-tw-dock-note-icon`,"aria-hidden":`true`},`📝`),c.createElement(`span`,{className:`dsh-tw-dock-note-label`},t?`快速笔记(已打开)`:`快速笔记`)))}}const Zv={showQuickNoteDock:!0,sidebarLabel:`TiddlyWiki`};async function Qv(){try{let e=await fetch(`/dsh-tiddlywiki/status`,{signal:AbortSignal.timeout(5e3)});if(!e.ok)return Zv;let t=await e.json();return{showQuickNoteDock:t.ui?.showQuickNoteDock!==!1,sidebarLabel:typeof t.ui?.sidebarLabel==`string`&&t.ui.sidebarLabel.trim().length>0?t.ui.sidebarLabel.trim():`TiddlyWiki`}}catch{return Zv}}const $v=`/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 ty(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 ny(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 ty(`/dsh-tiddlywiki/admin/state`);if(t)return;ry(n,e,a),sy(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 ry(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 ty(`/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 iy(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),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.length>0?o.darkPalette:`$:/palettes/CupertinoDark`);let d=o.allArticles??{};u(`ui.allArticles.pageSize`,`「所有文章」每页条数`,typeof d.pageSize==`number`?d.pageSize:10);let f=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`保存配置`);f.type=`button`,f.addEventListener(`click`,()=>{f.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 ty(`/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{f.disabled=!1}})()}),r.append(f),e.append(r)}function ay(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 ty($v,{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 ty($v,{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。`),w=$(`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),w.append(n)}let T=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`应用语言(重启 TW)`);T.type=`button`,T.addEventListener(`click`,()=>{T.disabled=!0,(async()=>{try{await ty($v,{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)}`),T.disabled=!1}})()}),S.append(C,w,T),e.append(S)}function oy(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 ty(`/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 sy(e,t,n){e.replaceChildren(),iy(e,t.config??{},n),ay(e,t.info,t.catalog,n),oy(e)}function cy(){let e=c.useRef(null);return c.useEffect(()=>{let t=e.current;return t===null?void 0:ny(t)},[]),c.createElement(`div`,{ref:e})}const ly={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 uy(e){return typeof e==`object`&&!!e&&e.kind===`tool-result`}function dy(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 fy(e){try{let t=JSON.parse(e);return typeof t==`object`&&t&&!Array.isArray(t)?t:{}}catch{return{}}}function py(e){return Array.isArray(e)?e.filter(e=>typeof e?.text==`string`).map(e=>e.text).join(`
660
+ `}${e}\n`;n.dispatch({changes:{from:t,insert:r},selection:{anchor:t+r.length},scrollIntoView:!0}),n.focus()},focus:()=>n.focus()}}const kv=`dsh-tw-note-draft-v1`;function Av(){try{let e=localStorage.getItem(kv);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 jv(e){try{localStorage.setItem(kv,JSON.stringify(e))}catch{}}function Mv(){try{localStorage.removeItem(kv)}catch{}}function Nv(e){return e<10?`0${e}`:String(e)}function Pv(e=new Date){return`${e.getFullYear()}-${Nv(e.getMonth()+1)}-${Nv(e.getDate())} ${Nv(e.getHours())}:${Nv(e.getMinutes())}`}function Fv(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 Iv(){let e={showQuickNote:!0,defaultTag:`inbox`};try{let t=await fetch(`/dsh-tiddlywiki/status`,{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 Lv(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};return 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()}),document.addEventListener(`click`,e=>{t.contains(e.target)||o()},!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()}}}async function Rv(e,t){if(e.size>67108864){O(`文件过大(≤ 64MB)`);return}try{let n=await fetch(`/dsh-tiddlywiki/upload?name=${encodeURIComponent(e.name)}`,{method:`POST`,headers:{"content-type":e.type||`application/octet-stream`},body:e,signal:AbortSignal.timeout(12e4)}),r=await n.json().catch(()=>null);if(!n.ok||r?.ok!==!0){O(`上传失败:${r?.error??`HTTP ${n.status}`}`);return}let i=r.name??e.name,a=e.type.startsWith(`image/`)?`![${i}](${r.url})`:`[${i}](${r.url})`;t.insertAtCaret(a),O(`已上传「${i}」并插入链接`)}catch(e){O(`上传失败:${e instanceof Error?e.message:String(e)}`)}}function zv(){let e,t=!1,n=!1,r=`inbox`,i,a=!1,o=e=>{try{window.dispatchEvent(new CustomEvent(`dsh-tw-note-state`,{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=Pv())},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){Mv();return}jv({text:t,title:n,tags:e.tagEditor.getTags(),savedAt:Date.now()})},500))},u=()=>{e!==void 0&&(e.draftBanner.hidden=!0)},d=()=>{a=!1,e!==void 0&&(e.recentWrap.hidden=!0)},f=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(),d(),O(`已载入「${r.title}」`),e.editor.focus()}catch(e){O(`读取失败:${e instanceof Error?e.message:String(e)}`)}},p=()=>{if(e===void 0)return;if(a){d();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=[Fv(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`,()=>{f(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)}})()},m=()=>{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 f=document.createElement(`span`);f.className=`dsh-tw-note-draft-text`,f.textContent=`已恢复未保存草稿`;let m=document.createElement(`button`);m.type=`button`,m.className=`dsh-tw-note-draft-discard`,m.textContent=`丢弃`,c.append(f,m);let h=document.createElement(`div`);h.className=`dsh-tw-note-fields`;let g=document.createElement(`input`);g.className=`dsh-tw-note-title`,g.placeholder=`标题(默认时间戳)`;let _=Lv({onChange:l});h.append(g,_.el),g.addEventListener(`input`,l);let v,y=Ov({placeholder:`写点东西… Markdown 高亮,可 📎/拖入文件
661
+ Ctrl+Enter 保存`,onSave:()=>{v?.()},onChange:l}),b=document.createElement(`button`);b.type=`button`,b.className=`dsh-tw-note-upload`,b.title=`上传文件到 wiki 并插入 Markdown 链接(也可直接拖入编辑器)`,b.textContent=`📎 上传`;let x=document.createElement(`input`);x.type=`file`,x.multiple=!0,x.hidden=!0,b.addEventListener(`click`,()=>{x.click()}),x.addEventListener(`change`,()=>{for(let e of Array.from(x.files??[]))Rv(e,y);x.value=``});let S=0;y.el.addEventListener(`dragenter`,e=>{e.preventDefault(),S++,y.el.classList.add(`dsh-tw-note-drop`)}),y.el.addEventListener(`dragover`,e=>{e.preventDefault()}),y.el.addEventListener(`dragleave`,e=>{e.preventDefault(),S=Math.max(0,S-1),S===0&&y.el.classList.remove(`dsh-tw-note-drop`)}),y.el.addEventListener(`drop`,e=>{e.preventDefault(),S=0,y.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))Rv(e,y)});let C=document.createElement(`div`);C.className=`dsh-tw-note-foot`;let w=document.createElement(`div`);w.className=`dsh-tw-note-foot-left`;let T=document.createElement(`span`);T.className=`dsh-tw-note-hint`,T.textContent=`Ctrl+Enter`;let ee=document.createElement(`button`);ee.type=`button`,ee.className=`dsh-tw-note-recent-btn`,ee.title=`最近修改的笔记,点击载入继续编辑`,ee.textContent=`🕘 最近`,ee.addEventListener(`click`,p),w.append(b,ee,T);let te=document.createElement(`div`);te.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=`保存`,te.append(E,D),C.append(w,te);let ne=document.createElement(`div`);ne.className=`dsh-tw-note-recent`,ne.hidden=!0,r.append(i,c,h,y.el,C),t.append(r,ne),document.body.append(t),e={root:t,card:r,editor:y,titleInput:g,tagEditor:_,saveBtn:D,editBtn:E,draftBanner:c,recentBtn:ee,recentWrap:ne};let re=()=>{n=!1,t.hidden=!0,d(),o(!1)},ie=()=>{Mv(),u(),y.setValue(``),g.value=Pv(),_.setTags([]),re()};v=async()=>{let e=y.getValue().trim();if(e.length===0){O(`内容为空,未保存`);return}D.disabled=!0,D.textContent=`保存中…`;try{let t=await fetch(`/dsh-tiddlywiki/note`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({title:g.value.trim(),tags:_.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}ie(),O(`已保存「${n.title??g.value}」`)}catch(e){O(`保存失败:${e instanceof Error?e.message:String(e)}`)}finally{D.disabled=!1,D.textContent=`保存`}},D.addEventListener(`click`,()=>{v?.()});let ae=async()=>{let e=g.value.trim().length>0?g.value.trim():Pv(),t=y.getValue(),n=_.getTags();E.disabled=!0,E.textContent=`打开中…`;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);if(!r.ok||i?.ok!==!0){O(`打开失败:${i?.error??`HTTP ${r.status}`}`);return}if(typeof i.twUrl!=`string`||typeof i.draftTitle!=`string`){O(`打开失败:服务未返回编辑器地址`);return}Mv(),u(),Te(`${new URL(i.twUrl,location.origin).href}#${encodeURIComponent(i.draftTitle)}`,i.title??e),O(`已在弹出窗口打开「${i.title??e}」编辑器`)}catch(e){O(`打开失败:${e instanceof Error?e.message:String(e)}`)}finally{E.disabled=!1,E.textContent=`✏️ 在 TW 中编辑`}};E.addEventListener(`click`,()=>{ae()}),s.addEventListener(`click`,re);let oe=null,se=(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();oe={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(oe===null)return;let t=e.clientX-oe.startX,n=e.clientY-oe.startY;!oe.moved&&Math.abs(t)<4&&Math.abs(n)<4||(oe.moved=!0,se(oe.origLeft+t,oe.origTop+n))});let ce=e=>{if(oe!==null){try{i.releasePointerCapture(e.pointerId)}catch{}oe=null,i.classList.remove(`dsh-tw-note-head-dragging`)}};i.addEventListener(`pointerup`,ce),i.addEventListener(`pointercancel`,ce),m.addEventListener(`click`,()=>{Mv(),u(),y.setValue(``),g.value=Pv(),_.setTags([]),O(`已丢弃草稿`)})};return{async open(i){if(t||(m(),e===void 0||n))return;n=!0,e.root.hidden=!1,s(i),o(!0);let a=Av();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):(c(),r=(await Iv()).defaultTag,e.tagEditor.setDefault(r)),e.editor.focus()},close(){e!==void 0&&(n=!1,e.root.hidden=!0,d(),o(!1))},async toggle(){n?this.close():await this.open()},isOpen(){return n},dispose(){t=!0,i!==void 0&&(clearTimeout(i),i=void 0),e?.editor.view.destroy(),e?.root.remove(),document.querySelector(`.dsh-tw-toast`)?.remove(),e=void 0}}}function Bv(e){return e<10?`0${e}`:String(e)}function Vv(e){return`${Bv(e.getHours())}:${Bv(e.getMinutes())}`}async function Hv(){try{let e=await fetch(`/dsh-tiddlywiki/status`,{signal:AbortSignal.timeout(8e3)});return e.ok?await e.json():null}catch{return null}}function Uv(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(`上次同步 ${Vv(t)}`),{state:i,label:a,tooltip:r.join(` · `),...t===void 0?{}:{lastSync:t}}}function Wv(){let e={state:`offline`,label:`离线`,tooltip:`同步知识库`},t,n,r=!1,i=new Set,a=()=>{for(let e of[...i])e()},o=n=>{let r=Uv(n,t);(r.state!==e.state||r.tooltip!==e.tooltip)&&(e=r,a())},s=async()=>{o(await Hv())};return s(),n=window.setInterval(()=>{s()},3e4),{getState:()=>e,trigger:async()=>{if(r)return e;r=!0,e={...e,state:`syncing`,label:`同步中…`},a();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 s()}catch(e){O(`同步失败:${e instanceof Error?e.message:String(e)}`)}finally{r=!1,await s()}return e},subscribe(e){return i.add(e),()=>{i.delete(e)}},dispose(){n!==void 0&&(clearInterval(n),n=void 0),i.clear()}}}const Gv=`/dsh-tiddlywiki/status`;async function Kv(){try{let e=await fetch(Gv,{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 qv(){try{let e=await fetch(Gv,{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 Jv(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=()=>{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(`
662
+ `)},g=()=>{let e=n.getState();o!==void 0&&(o.dataset.state=e.state),a!==void 0&&(a.title=`知识库 · ${e.tooltip}`),h()},_=async()=>{p=await qv(),!r&&(c!==void 0&&(c.textContent=p.text),l!==void 0&&(l.dataset.state=p.state),h())},v=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`,()=>{h(),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.addEventListener(`click`,()=>{m(),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(`dsh-tw-panel-reload`)),_()}),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 v=document.createElement(`span`);v.className=`dsh-tw-fab-icon`,v.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(v,o),a.addEventListener(`click`,()=>{if(s!==void 0){if(f){m();return}f=!0,s.hidden=!1,g(),_()}}),i.append(s,a),document.body.append(i),g(),document.addEventListener(`click`,e=>{if(!f)return;let t=e.target;i!==void 0&&i.contains(t)||m()},!0)},y=e.subscribe(()=>{d!==void 0&&(d.textContent=e.isOpen()?`收起 TW 面板`:`打开 TW 面板`)}),b=n.subscribe(g);return(async()=>{let e=await Kv();r||!e.showQuickNote&&!e.showPanelStatus&&!e.showSyncButton||v(e)})(),()=>{r=!0,y(),b(),i?.remove()}}const Yv=`dsh-tw-note-state`;function Xv(e){return function(){let[t,n]=c.useState(!1),r=c.useRef(null),i=c.useRef(null);return c.useEffect(()=>{let e=e=>{let t=e.detail;n(t?.open===!0)};return window.addEventListener(Yv,e),()=>window.removeEventListener(Yv,e)},[]),c.useLayoutEffect(()=>{let e=r.current;if(e===null)return;let t=e.parentElement;if(t===null)return;let n=()=>{let n=e.getBoundingClientRect(),r=n.right;for(let e of t.querySelectorAll(`textarea, [contenteditable]:not([contenteditable="false"]), [role="textbox"]`)){let t=e.getBoundingClientRect();if(t.width>40&&t.height>10){r=t.right;break}}e.style.paddingRight=`${Math.max(0,n.right-r)}px`};n();let i=new ResizeObserver(n);i.observe(t),window.addEventListener(`resize`,n);let a=window.setTimeout(n,120),o=window.setTimeout(n,600);return()=>{i.disconnect(),window.removeEventListener(`resize`,n),window.clearTimeout(a),window.clearTimeout(o)}},[]),c.createElement(`div`,{ref:r,className:`dsh-tw-dock-note`},c.createElement(`button`,{ref:i,type:`button`,className:t?`dsh-tw-dock-note-btn dsh-tw-dock-note-btn-active`:`dsh-tw-dock-note-btn`,title:t?`快速笔记已打开(点卡片右上角 ✕ 收起)`:`打开快速笔记(在按钮上方弹出,可拖动标题栏移动)`,onClick:()=>{e.open(i.current??void 0)}},c.createElement(`span`,{className:`dsh-tw-dock-note-icon`,"aria-hidden":`true`},`📝`),c.createElement(`span`,{className:`dsh-tw-dock-note-label`},t?`快速笔记(已打开)`:`快速笔记`)))}}const Zv={showQuickNoteDock:!0,sidebarLabel:`TiddlyWiki`};async function Qv(){try{let e=await fetch(`/dsh-tiddlywiki/status`,{signal:AbortSignal.timeout(5e3)});if(!e.ok)return Zv;let t=await e.json();return{showQuickNoteDock:t.ui?.showQuickNoteDock!==!1,sidebarLabel:typeof t.ui?.sidebarLabel==`string`&&t.ui.sidebarLabel.trim().length>0?t.ui.sidebarLabel.trim():`TiddlyWiki`}}catch{return Zv}}const $v=`/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 ty(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 ny(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 ty(`/dsh-tiddlywiki/admin/state`);if(t)return;ry(n,e,a),sy(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 ry(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 ty(`/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 iy(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),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.length>0?o.darkPalette:`$:/palettes/CupertinoDark`);let d=o.allArticles??{};u(`ui.allArticles.pageSize`,`「所有文章」每页条数`,typeof d.pageSize==`number`?d.pageSize:10);let f=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`保存配置`);f.type=`button`,f.addEventListener(`click`,()=>{f.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 ty(`/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{f.disabled=!1}})()}),r.append(f),e.append(r)}function ay(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 ty($v,{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 ty($v,{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。`),w=$(`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),w.append(n)}let T=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`应用语言(重启 TW)`);T.type=`button`,T.addEventListener(`click`,()=>{T.disabled=!0,(async()=>{try{await ty($v,{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)}`),T.disabled=!1}})()}),S.append(C,w,T),e.append(S)}function oy(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 ty(`/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 sy(e,t,n){e.replaceChildren(),iy(e,t.config??{},n),ay(e,t.info,t.catalog,n),oy(e)}function cy(){let e=c.useRef(null);return c.useEffect(()=>{let t=e.current;return t===null?void 0:ny(t)},[]),c.createElement(`div`,{ref:e})}const ly={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 uy(e){return typeof e==`object`&&!!e&&e.kind===`tool-result`}function dy(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 fy(e){try{let t=JSON.parse(e);return typeof t==`object`&&t&&!Array.isArray(t)?t:{}}catch{return{}}}function py(e){return Array.isArray(e)?e.filter(e=>typeof e?.text==`string`).map(e=>e.text).join(`
659
663
  `):``}function my(e){return typeof e==`string`?e:``}async function hy(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 gy(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 _y(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 vy(e){return t=>{t.preventDefault(),t.stopPropagation(),ge(e)}}function yy(e){let t=ly[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 by(e){let{title:t}=e,{loading:n,data:r}=_y(async()=>{let[e,n]=await Promise.all([hy(`/dsh-tiddlywiki/get?title=${encodeURIComponent(t)}`),gy(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(yy,{toolName:e.toolName,title:t,subtitle:e.subtitle,tags:s,onOpen:vy(t),foot:l===void 0?void 0:`修改于 ${l}`},o)}function xy(e){return c.createElement(`a`,{className:`dsh-tw-toolcard-row`,href:`/dsh-tiddlywiki/tw/#${encodeURIComponent(e.title)}`,onClick:vy(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 Sy(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(xy,{key:`${e.title}-${t}`,...e}))),c.createElement(yy,{toolName:e.toolName,title:e.title,subtitle:e.subtitle},n)}function Cy(e){let t=my(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=_y(()=>hy(`/dsh-tiddlywiki/search?${r}`),[r]).data,a=(Array.isArray(i?.items)?i.items:[]).map(e=>({title:my(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(Sy,{toolName:e.toolName,title:t.length>0?t:`检索`,subtitle:s,rows:a,fallbackText:`没有匹配的笔记`})}function wy(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=_y(()=>hy(`/dsh-tiddlywiki/recent?${n}`),[n]).data,i=(Array.isArray(r?.items)?r.items:[]).map(e=>({title:my(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(Sy,{toolName:e.toolName,title:`最近修改`,subtitle:i.length>0?`最近 ${i.length} 条`:``,rows:i,fallbackText:`暂无笔记`})}function Ty(e){let t=(Array.isArray(e.args.items)?e.args.items:[]).map(e=>typeof e==`object`&&e&&typeof e.title==`string`?my(e.title):null).filter(e=>e!==null&&e.length>0).map(e=>({title:e}));return c.createElement(Sy,{toolName:e.toolName,title:`批量写入`,subtitle:t.length>0?`写入 ${t.length} 篇`:`(参数中没有可解析的 items)`,rows:t,fallbackText:`没有可展示的笔记`})}function Ey(e){let t=_y(()=>hy(`/dsh-tiddlywiki/tags`),[]).data,n=(Array.isArray(t?.items)?t.items:[]).map(e=>({tag:my(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(yy,{toolName:e.toolName,title:`标签`,subtitle:`共 ${n.length} 个`},r)}function Dy(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(yy,{toolName:e.toolName},t)}function Oy(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(yy,{toolName:e.toolName,title:e.title.length>0?e.title:void 0},t)}function ky(e,t){switch(e){case`tiddlywiki_get`:case`tiddlywiki_put`:case`tiddlywiki_delete`:return my(t.title);case`tiddlywiki_rename`:return my(t.newTitle);case`tiddlywiki_search`:return my(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 Ay(e){let t=e.block,n=e.toolName,r=uy(t),i=dy(t),a=n!==void 0&&n.length>0?n:i?.name??``,o=fy(i?.argsRaw??``),s=r?py(t.content):``;if(i===null)return c.createElement(yy,{toolName:a},c.createElement(`pre`,{className:`dsh-tw-toolcard-fallback`},s||`(无调用信息)`));if(!r)return c.createElement(yy,{toolName:a,title:ky(a,o)},c.createElement(`div`,{className:`dsh-tw-toolcard-pending`},`处理中…`));if(t.isError===!0)return c.createElement(yy,{toolName:a,title:ky(a,o)},c.createElement(`div`,{className:`dsh-tw-toolcard-error`},s||`工具调用失败`));switch(a){case`tiddlywiki_get`:return c.createElement(by,{toolName:a,title:my(o.title),subtitle:`读取`});case`tiddlywiki_put`:return c.createElement(by,{toolName:a,title:my(o.title),subtitle:`已写入`});case`tiddlywiki_rename`:return c.createElement(by,{toolName:a,title:my(o.newTitle),subtitle:`已重命名「${my(o.oldTitle)}」→`});case`tiddlywiki_delete`:return c.createElement(Oy,{toolName:a,title:my(o.title),text:s});case`tiddlywiki_batch_put`:return c.createElement(Ty,{toolName:a,args:o,text:s});case`tiddlywiki_search`:return c.createElement(Cy,{toolName:a,args:o,text:s});case`tiddlywiki_recent`:return c.createElement(wy,{toolName:a,args:o,text:s});case`tiddlywiki_list_tags`:return c.createElement(Ey,{toolName:a,text:s});case`tiddlywiki_git_sync`:case`tiddlywiki_git_resolve`:return c.createElement(Dy,{toolName:a,text:s});default:return c.createElement(yy,{toolName:a,title:ky(a,o)},c.createElement(`pre`,{className:`dsh-tw-toolcard-fallback`},s||`(完成)`))}}const jy=[`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 My(e){let t=[];for(let n of jy)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}`},Ay));r!==void 0&&t.push(r)}catch(e){console.error(`[dsh-tiddlywiki] register toolview ${n} failed:`,e)}return t}function Ny(){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{}ge(i)};return document.addEventListener(`click`,e,!0),()=>document.removeEventListener(`click`,e,!0)}const Py=[`slots`];function Fy(e){try{u();let t=new d,n=[],r=!1;try{let i=zv(),a=Wv();n.push(()=>i.dispose()),n.push(()=>a.dispose()),n.push(g(t)),n.push(xe(t)),n.push(Jv(t,i,a)),n.push(Ee),e.slots!==void 0&&Qv().then(t=>{if(r||!t.showQuickNoteDock)return;let a=e.slots?.inject(`conversation.input.dock`,()=>e.slots?.register({name:`conversation.input.dock`,id:`quick-note`,order:8,label:`快速笔记`},Xv(i)));a!==void 0&&n.push(a)})}catch(e){console.error(`[dsh-tiddlywiki] mount failed:`,e)}try{e.slots!==void 0&&n.push(...My(e.slots))}catch(e){console.error(`[dsh-tiddlywiki] tool views failed:`,e)}try{n.push(Ny())}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 知识库`},cy));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=Fy,exports.inject=Py,exports.name=`dsh-tiddlywiki/client`;
660
664
  return module.exports;
661
665
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "dsh-tiddlywiki",
3
3
  "description": "TiddlyWiki 5 as the DSH persistent knowledge base: tiddlywiki_* agent tools (search with filters/recent/tags/batch/rename + git sync & conflict resolve), a full TiddlyWiki editor embedded in the GUI center column (same-origin proxy, works over Tailscale/LAN/domain), a quick-note card with draft auto-save & recent-notes picker behind a single knowledge FAB, and git-based sync with auto-commit. Mounts via the official dsh plugin system — no DSH source changes.",
4
- "version": "0.16.4",
4
+ "version": "0.16.6",
5
5
  "type": "module",
6
6
  "keywords": [
7
7
  "dsh",
@@ -1,10 +1,15 @@
1
1
  /**
2
- * Floating quick-note card (design doc §12, D6/D7) — a bottom-right, fixed,
3
- * collapsible card for jotting drafts / scratch notes while waiting for the AI
4
- * or drafting the next prompt. In v0.5 the trigger moved into the "知识库" FAB
2
+ * Floating quick-note card (design doc §12, D6/D7) — a fixed, collapsible card
3
+ * for jotting drafts / scratch notes while waiting for the AI or drafting the
4
+ * next prompt. In v0.5 the trigger moved into the "知识库" FAB
5
5
  * (knowledge-fab.ts); this module ONLY owns the card itself via
6
6
  * `createNoteWidget()` (lazy build — no DOM until first open).
7
7
  *
8
+ * Positioning (v0.16.6): with an anchor (the input-dock quick-note button) the
9
+ * card pops up right ABOVE it (horizontally centered, viewport-clamped);
10
+ * without one it sits in the default bottom-right corner. The card is freely
11
+ * draggable by its title bar (pointer events + setPointerCapture).
12
+ *
8
13
  * Features:
9
14
  * - CodeMirror 6 Markdown editor (see markdown-editor.ts), file upload + drag
10
15
  * & drop, multi-tag chips with autocomplete (GET /dsh-tiddlywiki/tags).
@@ -303,7 +308,12 @@ interface RecentItem { title: string; tags: string[]; modified: string | null; s
303
308
 
304
309
  /** The quick-note card handle the FAB drives. */
305
310
  export interface NoteWidgetHandle {
306
- open(): Promise<void>
311
+ /**
312
+ * Open the card. Pass an optional anchor element (e.g. the input-dock quick-
313
+ * note button) to pop the card up right above it; without an anchor the card
314
+ * falls back to its default bottom-right position.
315
+ */
316
+ open(anchor?: HTMLElement): Promise<void>
307
317
  close(): void
308
318
  toggle(): Promise<void>
309
319
  isOpen(): boolean
@@ -335,6 +345,39 @@ export function createNoteWidget(): NoteWidgetHandle {
335
345
  } catch { /* event dispatch is best-effort */ }
336
346
  }
337
347
 
348
+ /**
349
+ * Place the card: with an anchor (the input-dock button) it pops up right
350
+ * ABOVE the anchor, horizontally centered on it and clamped inside the
351
+ * viewport; without one it returns to the default bottom-right corner.
352
+ * The card is `position: fixed`, so switching between left/top and
353
+ * right/bottom positioning is a matter of which inline offsets are set.
354
+ */
355
+ const positionCard = (anchor?: HTMLElement): void => {
356
+ if (ui === undefined) return
357
+ const root = ui.root
358
+ const card = ui.card
359
+ if (anchor !== undefined) {
360
+ const rect = anchor.getBoundingClientRect()
361
+ const cardW = card.offsetWidth || 340
362
+ const cardH = card.offsetHeight || 260
363
+ const vw = window.innerWidth
364
+ const vh = window.innerHeight
365
+ const gap = 10
366
+ const left = Math.min(Math.max(rect.left + rect.width / 2 - cardW / 2, 8), Math.max(8, vw - cardW - 8))
367
+ const bottomRaw = vh - rect.top + gap
368
+ const bottom = Math.min(Math.max(8, bottomRaw), Math.max(8, vh - cardH - 8))
369
+ root.style.right = 'auto'
370
+ root.style.top = 'auto'
371
+ root.style.left = `${left}px`
372
+ root.style.bottom = `${bottom}px`
373
+ } else {
374
+ root.style.right = '24px'
375
+ root.style.bottom = '88px'
376
+ root.style.left = 'auto'
377
+ root.style.top = 'auto'
378
+ }
379
+ }
380
+
338
381
  const resetTitle = (): void => {
339
382
  if (ui !== undefined) ui.titleInput.value = timestampTitle()
340
383
  }
@@ -663,6 +706,48 @@ export function createNoteWidget(): NoteWidgetHandle {
663
706
  editBtn.addEventListener('click', () => { void doEdit() })
664
707
  closeBtn.addEventListener('click', close)
665
708
 
709
+ // ── 自由拖动(按住标题栏拖动整张卡片;✕ 仍是唯一关闭方式)──────────
710
+ // Pointer events + setPointerCapture: the head keeps receiving moves even
711
+ // when the pointer leaves it. Dragging switches the card from the default
712
+ // right/bottom anchoring to explicit left/top, clamped to the viewport.
713
+ let dragState: { startX: number; startY: number; origLeft: number; origTop: number; moved: boolean } | null = null
714
+ const applyDrag = (left: number, top: number): void => {
715
+ const vw = window.innerWidth
716
+ const vh = window.innerHeight
717
+ const cardW = card.offsetWidth || 340
718
+ const cardH = card.offsetHeight || 260
719
+ const x = Math.min(Math.max(left, 8), Math.max(8, vw - cardW - 8))
720
+ const y = Math.min(Math.max(top, 8), Math.max(8, vh - cardH - 8))
721
+ root.style.right = 'auto'
722
+ root.style.bottom = 'auto'
723
+ root.style.left = `${x}px`
724
+ root.style.top = `${y}px`
725
+ }
726
+ head.addEventListener('pointerdown', (event) => {
727
+ if (closeBtn.contains(event.target as Node)) return
728
+ event.preventDefault()
729
+ const rect = root.getBoundingClientRect()
730
+ dragState = { startX: event.clientX, startY: event.clientY, origLeft: rect.left, origTop: rect.top, moved: false }
731
+ try { head.setPointerCapture(event.pointerId) } catch { /* capture unavailable */ }
732
+ head.classList.add('dsh-tw-note-head-dragging')
733
+ })
734
+ head.addEventListener('pointermove', (event) => {
735
+ if (dragState === null) return
736
+ const dx = event.clientX - dragState.startX
737
+ const dy = event.clientY - dragState.startY
738
+ if (!dragState.moved && Math.abs(dx) < 4 && Math.abs(dy) < 4) return
739
+ dragState.moved = true
740
+ applyDrag(dragState.origLeft + dx, dragState.origTop + dy)
741
+ })
742
+ const endDrag = (event: PointerEvent): void => {
743
+ if (dragState === null) return
744
+ try { head.releasePointerCapture(event.pointerId) } catch { /* already released */ }
745
+ dragState = null
746
+ head.classList.remove('dsh-tw-note-head-dragging')
747
+ }
748
+ head.addEventListener('pointerup', endDrag)
749
+ head.addEventListener('pointercancel', endDrag)
750
+
666
751
  // 快速笔记弹窗只允许「手动点关闭按钮(✕)」关闭:刻意移除「点击卡片外部
667
752
  // 即收起」的监听(用户反馈会误关、丢失正在编辑的内容)。草稿仍会防抖
668
753
  // 自动保存,重开时原样恢复。
@@ -680,12 +765,15 @@ export function createNoteWidget(): NoteWidgetHandle {
680
765
 
681
766
  // ── public handle ────────────────────────────────────────────────────────
682
767
  return {
683
- async open() {
768
+ async open(anchor?: HTMLElement) {
684
769
  if (disposed) return
685
770
  build()
686
771
  if (ui === undefined || opened) return
687
772
  opened = true
688
773
  ui.root.hidden = false
774
+ // With an anchor (input-dock button) the card pops up right above it;
775
+ // without one it sits in the default bottom-right corner.
776
+ positionCard(anchor)
689
777
  emitState(true)
690
778
  const draft = loadDraft()
691
779
  if (draft !== null && (draft.text.trim().length > 0 || draft.title.trim().length > 0)) {
@@ -23,10 +23,16 @@ export const NOTE_STATE_EVENT = 'dsh-tw-note-state'
23
23
  /**
24
24
  * Build the dock entry component bound to one note-widget handle. Called once
25
25
  * per client mount; the returned component is what the slot renders.
26
+ *
27
+ * 与输入框对齐:mount 后(含 resize / 窗口变化 / 卡片延迟挂载)测量 composer
28
+ * 输入框(textarea / contenteditable)的右缘,把横条 paddingRight 设为差值,
29
+ * 让按钮右缘与输入框右缘对齐——而不是悬在整列最右端。
26
30
  */
27
31
  export function createQuickNoteDock(note: NoteWidgetHandle): () => React.ReactElement {
28
32
  return function QuickNoteDock() {
29
33
  const [open, setOpen] = React.useState(false)
34
+ const wrapRef = React.useRef<HTMLDivElement | null>(null)
35
+ const btnRef = React.useRef<HTMLButtonElement | null>(null)
30
36
  React.useEffect(() => {
31
37
  const onState = (event: Event): void => {
32
38
  const detail = (event as CustomEvent<{ open?: boolean }>).detail
@@ -35,16 +41,45 @@ export function createQuickNoteDock(note: NoteWidgetHandle): () => React.ReactEl
35
41
  window.addEventListener(NOTE_STATE_EVENT, onState)
36
42
  return () => window.removeEventListener(NOTE_STATE_EVENT, onState)
37
43
  }, [])
44
+ React.useLayoutEffect(() => {
45
+ const wrap = wrapRef.current
46
+ if (wrap === null) return
47
+ const stack = wrap.parentElement
48
+ if (stack === null) return
49
+ const align = (): void => {
50
+ const wrapRect = wrap.getBoundingClientRect()
51
+ let right = wrapRect.right
52
+ for (const el of stack.querySelectorAll('textarea, [contenteditable]:not([contenteditable="false"]), [role="textbox"]')) {
53
+ const r = el.getBoundingClientRect()
54
+ if (r.width > 40 && r.height > 10) { right = r.right; break }
55
+ }
56
+ wrap.style.paddingRight = `${Math.max(0, wrapRect.right - right)}px`
57
+ }
58
+ align()
59
+ const ro = new ResizeObserver(align)
60
+ ro.observe(stack)
61
+ window.addEventListener('resize', align)
62
+ // The composer card may mount slightly later; re-measure a couple of times.
63
+ const t1 = window.setTimeout(align, 120)
64
+ const t2 = window.setTimeout(align, 600)
65
+ return () => {
66
+ ro.disconnect()
67
+ window.removeEventListener('resize', align)
68
+ window.clearTimeout(t1)
69
+ window.clearTimeout(t2)
70
+ }
71
+ }, [])
38
72
  return React.createElement(
39
73
  'div',
40
- { className: 'dsh-tw-dock-note' },
74
+ { ref: wrapRef, className: 'dsh-tw-dock-note' },
41
75
  React.createElement(
42
76
  'button',
43
77
  {
78
+ ref: btnRef,
44
79
  type: 'button',
45
80
  className: open ? 'dsh-tw-dock-note-btn dsh-tw-dock-note-btn-active' : 'dsh-tw-dock-note-btn',
46
- title: open ? '快速笔记已打开(点卡片右上角 ✕ 收起)' : '打开快速笔记(草稿自动保存,点别处不会关闭)',
47
- onClick: () => { void note.open() },
81
+ title: open ? '快速笔记已打开(点卡片右上角 ✕ 收起)' : '打开快速笔记(在按钮上方弹出,可拖动标题栏移动)',
82
+ onClick: () => { void note.open(btnRef.current ?? undefined) },
48
83
  },
49
84
  React.createElement('span', { className: 'dsh-tw-dock-note-icon', 'aria-hidden': 'true' }, '📝'),
50
85
  React.createElement('span', { className: 'dsh-tw-dock-note-label' }, open ? '快速笔记(已打开)' : '快速笔记'),
@@ -128,7 +128,10 @@ html[data-dsh-tw-active] .dshDesktopConversationSurface > :not([data-dsh-tw-view
128
128
  display: flex; align-items: center; gap: 8px;
129
129
  font-size: 12px; font-weight: 600; letter-spacing: .2px;
130
130
  color: var(--dsw-alias-label-primary, #222);
131
+ /* 标题栏 = 拖动把手(拖卡片移动);touch-action:none 让触屏也能拖动 */
132
+ cursor: move; user-select: none; -webkit-user-select: none; touch-action: none;
131
133
  }
134
+ .dsh-tw-note-head-dragging { cursor: grabbing; opacity: .96; }
132
135
  .dsh-tw-note-head .dsh-tw-note-label { margin-right: auto; display: flex; align-items: center; gap: 6px; }
133
136
  .dsh-tw-note-close {
134
137
  border: none; background: transparent; color: var(--dsw-alias-label-secondary, #888);
@@ -468,10 +471,11 @@ html[data-dsh-tw-active] .dshDesktopConversationSurface > :not([data-dsh-tw-view
468
471
 
469
472
  /* ── input-dock quick-note button(聊天输入框上方,conversation.input.dock)──
470
473
  该槽位渲染为「输入框上方的全宽条目」纵向 flex 排列(todo/cost-meter/goal/
471
- queue/git-graph 等插件同区),此按钮以紧凑小胶囊呈现,不与其他条目重叠。 */
474
+ queue/git-graph 等插件同区),此按钮以紧凑小胶囊呈现,不与其他条目重叠。
475
+ justify-content: flex-end 把按钮放在输入框上方横条的末尾(右端)。 */
472
476
  .dsh-tw-dock-note {
473
- display: flex; align-items: center; gap: 8px;
474
- padding: 4px 6px 0; box-sizing: border-box; width: 100%;
477
+ display: flex; align-items: center; justify-content: flex-end; gap: 8px;
478
+ padding: 4px 8px 0; box-sizing: border-box; width: 100%;
475
479
  }
476
480
  .dsh-tw-dock-note-btn {
477
481
  display: inline-flex; align-items: center; gap: 6px;