dsh-tiddlywiki 0.28.1 → 0.28.2
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 +1 -0
- package/docs/CHANGELOG.md +1 -0
- package/lib/client.js +6 -6
- package/package.json +1 -1
- package/src/client/settings-page.ts +74 -0
package/README.md
CHANGED
|
@@ -67,6 +67,7 @@ dsh plugin --profile web add dsh-tiddlywiki
|
|
|
67
67
|
|
|
68
68
|
## 🕘 版本记录
|
|
69
69
|
|
|
70
|
+
- **v0.28.2**(2026-09-28):**设置页去掉重复的「知识库位置」**(作者反馈:多库配置做完后它重复且逻辑冲突)。这一块的语义是「把**唯一的那个库**换到别处」——写的是 wiki 之外的指针文件 `location.json`,措辞也是单库时代的("切换到这个位置" / "恢复为配置默认")。现在**按模式二选一**:**单库模式**保留它(那里它是唯一正确入口);**多库模式整块不渲染**,某个库换目录收到「知识库列表」那一行的**「改目录」**(默认库经 `/admin/wiki/switch` → 改清单 + farm 收敛 + 校验;非默认库直接 `update`)。宿主接口**没有**冲突也**没有**改动:`/admin/wiki/switch|reset` 从 v0.28.0 起就按模式分派。守门:`verify-wiki-focus` 新增"多库模式下不得渲染该块"的断言;farm-boot 补上 location 面接线(22 条),保证藏了界面之后**接口仍按模式正确分派**。
|
|
70
71
|
- **v0.28.1**(2026-09-28):**修「拆库 skill 在 wiki 启动慢 / 起不来时永远装不上」+ 快速笔记的目标库可切换(R7)**。① **真实事故**(作者升级 0.28.0 后重启宿主时发现,测试没拦住):技能安装写在了 `farm.startAll()` **之后**,而那个 wiki 很大、启动要几十秒 —— 于是"技能装没装"取决于"wiki 起得快不快";更糟的是 wiki 若因配置问题**永远起不来**,技能就永远不装,而它跟 wiki 毫无关系(只往 `$DSH_HOME/skills/` 写一个文件)。已挪到启动任务**最前面**并新增**顺序守门**(`verify-skill-install` 断言安装早于 `startAll()`,已反向验证)。② 快速笔记卡片新增「写入」目标库:**默认跟随你在 GUI 里看的那个库**(焦点库),卡片内可临时改、改过后不再被焦点带走。要点是**整张卡片一起换库**:标签建议 / 最近 / 草稿读取 / 附件上传 / 保存 / 随后弹出的 TW 编辑器必须落在同一个库 —— 只改保存那一处会产出"标签列表来自 A、笔记写进 B",比不做还糟(弹窗那条另有一条守门:写入 A、编辑器打开 B(空白)是典型的"看起来成功了"的失败)。目标库没在运行时卡片**先讲清楚**,而不是让你写完一段再失败。单库安装不显示选择器、请求 URL 逐字不变。
|
|
71
72
|
- **v0.28.0**(2026-09-28):**多知识库**——同一进程内可同时运行多个 TiddlyWiki,每个库独立配置、独立 git、按会话选择作用域,且可对 Agent **彻底隐身**。起因是作者自己的库:`书籍` 语料 2468 条与日常笔记挤在一个 800MB 仓库里,Agent 检索/lint/backlink 每天在约 30 倍于工作集的内容上跑。拆库需要**同时在线**——只切换位置的话,你切到语料库翻资料时 Agent 也跟着切过去了。要点:① 三个模块各司其职(`wiki-registry` 清单/模式/动作、`wiki-instance` 单库运行时、`wiki-farm` 谁该在跑 + 会话作用域);② 模式开关 `wikis.json` 的 `mode`(缺省 `single`,升级用户逐字不变);③ 路由按库定向 `/tw/<id>/…`(每个库 seed 自己的同源基址——不区分 id 就会「页面显示 A、读写落在 B」),裸 `/tw/` 仍是默认库别名,为此引入**保留 id 名单**;④ **git 按仓库重构**:多库可共用一个仓库,`git add -A` 只允许一个 committer,pull 后只重启受影响的库;⑤ Agent 侧:会话单选作用域 + `agentVisible`,工具回执在可见库多于一个时**标明库名**,注入提示词**按会话求值**并读作用域库的 `prompt.*`;两条刻意拒绝(隐身库→忽略;没在跑→报错而非静默换库);⑥ GUI:输入框上方的会话选择器、FAB 的知识库分组、设置页「知识库列表」与**显式配置作用域**;⑦ **拆库引导** `docs/wiki-split.md` + 随包 skill(安装时只覆盖带标记的文件)。新增 6 个守门脚本(共约 96 条断言,含**真起两个 TW 子进程**与**真 git 仓库**两类集成验证),全部反向验证;4 个既有守门跟着间接层更新。**未做**:per-wiki 认证(`auth.*` 仍全局)、快速笔记目标切换策略。
|
|
72
73
|
- **v0.27.3**(2026-09-28):**修 v0.27.1 拆文档时打断的 6 个相对链接**(`docs/` 内的链接仍按仓库根写成 `docs/xxx.md`,从 `docs/` 内部点击打不开);新增守门 `scripts/verify-doc-links.mjs`(校验 README + `docs/**` 的全部相对链接,已挂进 `verify:static`,让这类错误下次发不出来);**修 CI 偶发假红**:`verify-wiki-switch` 的回滚断言会抢在 TW 载入 store 之前读取,改为 15s 有界轮询后再断言。**无运行时行为改动。**
|
package/docs/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
> 最近几个主要版本的一句话记录(完整变更见 [Releases](https://github.com/bbqisbbq/dsh-tiddlywiki/releases) / git log)。
|
|
6
6
|
|
|
7
|
+
- **v0.28.2**(2026-09-28):**设置页去掉重复的「知识库位置」**(作者反馈:多库配置做完后它重复且逻辑冲突)。这一块的语义是「把**唯一的那个库**换到别处」——写的是 wiki 之外的指针文件 `location.json`,措辞也是单库时代的("切换到这个位置" / "恢复为配置默认")。现在**按模式二选一**:**单库模式**保留它(那里它是唯一正确入口);**多库模式整块不渲染**,某个库换目录收到「知识库列表」那一行的**「改目录」**(默认库经 `/admin/wiki/switch` → 改清单 + farm 收敛 + 校验;非默认库直接 `update`)。宿主接口**没有**冲突也**没有**改动:`/admin/wiki/switch|reset` 从 v0.28.0 起就按模式分派。守门:`verify-wiki-focus` 新增"多库模式下不得渲染该块"的断言;farm-boot 补上 location 面接线(22 条),保证藏了界面之后**接口仍按模式正确分派**。
|
|
7
8
|
- **v0.28.1**(2026-09-28):**修「拆库 skill 在 wiki 启动慢 / 起不来时永远装不上」+ 快速笔记的目标库可切换(R7)**。① **真实事故**(作者升级 0.28.0 后重启宿主时发现,测试没拦住):技能安装写在了 `farm.startAll()` **之后**,而作者的知识库很大、TW 冷启动要几十秒 —— 于是"技能装没装"取决于"wiki 起得快不快";更糟的是 wiki 若因配置问题**永远起不来**,技能就永远不装,而它跟 wiki 毫无关系(只往 `$DSH_HOME/skills/` 写一个文件)。已挪到启动任务**最前面**,并新增**顺序守门**:`verify-skill-install` 断言 `installSplitSkill()` 出现在 `farm.startAll()` 之前(已反向验证:在安装前插一次 startAll → 该条红)。② **R7 快速笔记目标**:卡片新增「写入」目标库,**默认跟随 GUI 的焦点库**(你在看哪个库,快速笔记就进哪个库),卡片内可临时改且改过之后不再被焦点带走。设计的核心是**整张卡片一起换库** —— 标签建议(memo 以 URL 为键,换库自动重读)/ 最近列表 / 草稿读取 / 附件上传 / 保存 / 随后弹出的 TW 编辑器,六处全部经 `withWikiQuery()`(`?wiki=<id>`)与 `twProxyFor()` 定向;只改保存那一处会产出"标签列表来自 A、笔记写进 B",比不做还糟。目标库没在运行时卡片会**先讲清楚**("先在右下角「知识库」菜单里打开它"),而不是让用户写完一段再失败;这里刻意**不自动启动** —— 启动是「知识库」菜单的职责,保存路由顺手 spawn 进程不该由一次误点触发。单库安装不显示选择器、请求 URL 逐字不变。守门 `verify-wiki-focus` 扩到 16 条(含 `withWikiQuery` 的四条纯逻辑断言与"整张卡片同库"的源码级断言,已反向验证);`verify-tw-origin` 的弹窗接线断言跟着间接层更新(保留强度)。
|
|
8
9
|
- **v0.28.0**(2026-09-28):**多知识库**——同一进程内可同时运行多个 TiddlyWiki,每个库独立配置、独立 git,Agent 侧按**会话**选择作用域,且每个库可对 Agent **彻底隐身**。起因是作者自己的库:`书籍` 语料 2468 条与日常笔记挤在一个 800MB 仓库里,Agent 的检索 / lint / backlink 每天在约 **30 倍于工作集**的内容上跑(「先窄后宽」是缓解不是解法)。而拆库必须**同时在线**——只切换位置的话,你切到语料库翻资料时 Agent 也跟着切过去了。**① 三个模块各司其职**:`host/wiki-registry.ts`(清单 / 模式 / 动作规则,纯函数)、`host/wiki-instance.ts`(**一个**库的运行时:TW 子进程 + REST 客户端 + 配置覆盖层 + fs 监听 + 自身自举)、`host/wiki-farm.ts`(**谁该在跑**:reconcile 规则 + 会话作用域解析);`apply()` 从"抱着一个实例"变成"驱动一个农场"。**② 模式开关**:`wikis.json` 的 `mode: 'single' | 'multi'`,**缺省 `single`** —— 升级用户的行为逐字不变(位置仍由旧指针文件 > cordis 默认决定,registry 此时只记住模式与候选列表)。**③ 路由按库定向**:`/tw/<id>/…`,且每个库把自己那份同源代理基址 seed 进**各自的** `$:/config/tiddlyweb/host`(TW 用它拼**所有** API URL;不区分 id 就会出现"页面显示 A、每次读写落在 B");裸 `/tw/` 保留为默认库别名(旧链接 / 书签 / 已 seed 的值都不失效)。为此引入**保留 id 名单**(`status`/`files`/`recipes`/`render`… 与 TW 自己的根路径撞名时无法区分,一律拒绝注册)。非代理路由统一吃 `?wiki=<id>`。**④ git 按仓库重构**:多个库可以共用**一个**仓库(按文件夹物理划分)。`git add -A` 在子目录执行也作用于整个工作树,所以自动提交必须**按仓库**去重(`host/repo-committers.ts`,提交在仓库根执行;`dir → repo` 只缓存**肯定**结果——否定结果缓存会让全新安装的自动提交永久静默失效);`pull()` 回传改动路径,**只重启内容真的变了的库**("这次 pull 改了东西"与"这个库快照过期了"是两个问题)。**⑤ Agent 侧**:会话级作用域(`$DSH_HOME/dsh-tiddlywiki/sessions.json`,单选,软失败——读不到就只是"没选过")+ `agentVisible`(**彻底隐身**:不进选择器、不进提示词、工具不可达)。工具按会话路由,且**可见库多于一个时每条回执都标明库名**(一处包装实现,不是改 15 个 render);注入提示词改为**按会话求值**(`PromptSection.text` 支持函数,DSH 每次装配传入该会话的 agent)并读**作用域那个库**的 `prompt.*`——单库安装的 slim 仍是 1918 字符,逐字节不变。**两条刻意的拒绝**:作用域指向隐身库 → 忽略(隐身是硬边界,过期选择不能绕过它);指向可见但**没在跑**的库 → **报错并带上库名**,绝不静默落到别的库(静默换库 = 笔记进了用户没指定的知识库而且看起来一切正常,这是本功能唯一真正危险的失败方式)。**⑥ GUI**:`/status` 回传知识库名册;输入框上方的**会话选择器**(只在可见库多于一个时存在);右下角「知识库」菜单的知识库分组(点开一个没在跑的库会**显式 POST** 启动它——代理路由绝不在 GET 里 spawn 子进程);设置页新增「知识库列表」(模式切换、增删改、启停、设为默认、可见性、开局自启、新增;「移出列表」明确写着**不删目录**)与**显式配置作用域**(每个库的配置在它自己的 tiddler 里,不说清就会出现"改了但不生效")。**⑦ 拆库引导**:`docs/wiki-split.md`(人读 + 顶部一整段**可直接复制给 Agent** 的话)+ 随包 skill `skills/wiki-split/SKILL.md`(启动时装到 `$DSH_HOME/skills/`;**只覆盖带标记的文件**,用户自己写的 skill 一个字节都不碰)。**守门**:新增 6 个脚本——`verify-wiki-registry`(18 条)、`verify-wiki-farm`(12 条,注入假实例钉死 reconcile)、`verify-wiki-farm-boot`(**22 条,真起两个 TW 子进程**)、`verify-session-scope`(13 条)、`verify-repo-keying`(11 条,**真 git 仓库**)、`verify-skill-install`(7 条)、`verify-wiki-focus`(13 条,真读 client 源码),**全部反向验证过**;另有 5 个既有守门(drain / language-pin / frame-guards / ready-policy / tw-origin / conflict-config)跟着间接层更新,同样保留强度并反向验证。**未做**:per-wiki `auth.*`(仍是全局)、快速笔记目标切换(目前写默认库也显示默认库,一致但不是最终形态)。
|
|
9
10
|
- **v0.27.0**(2026-09-28):**重新定位:从「AI 记忆工具」改写成「你和 Agent 共用的本地文档中心」——纯元数据 + 文档发布,运行时行为零变化。** 触发原因:生态里「记忆 / 知识库」这一格已挤进 30+ 个插件(最大的 `MemOS` 已 11,603★),而本插件真正的差异从来不是「更自动的记忆」,而是**人机共用同一份纯文本文件**:人能读、能改、能审计、能随时带走,Agent 用同一套工具读写它。本次把这件事搬上门口那块招牌:① `package.json` 的 `description` 由英文功能清单改为双语定位,并明确写出**不是自动记忆插件、不做后台抓取**,`keywords` 补 `knowledge-management` / `local-first` / `journal` / `publishing` / `wechat`;② GitHub topics 同步补位,便于目录站归类;③ 修正 README 一处过时数字(「Agent 用 10 个工具」→ 15 个)。**无代码改动**——「装完空手能用」(自动建库 + 起步 seed + 快速开始 7 步)自 v0.22.0 起就已具备,本次只是把它讲清楚。
|
package/lib/client.js
CHANGED
|
@@ -767,7 +767,7 @@ html[data-dsh-tw-active] .dshDesktopConversationSurface > :not([data-dsh-tw-view
|
|
|
767
767
|
.dsh-tw-note-card,
|
|
768
768
|
.dsh-tw-fab-menu { animation: none; }
|
|
769
769
|
}
|
|
770
|
-
`;function d(){if(typeof document>`u`)return()=>{};let e=document.getElementById(l);e===null?(e=document.createElement(`style`),e.id=l,e.dataset.plugin=`dsh-tiddlywiki`,e.textContent=u,document.head.append(e)):e.textContent!==u&&(e.textContent=u);let t=String(Date.now())+`:`+Math.random().toString(36).slice(2);return e.dataset.instance=t,()=>{e?.dataset.instance===t&&e.remove()}}var f=class{open=!1;listeners=new Set;isOpen(){return this.open}toggle(){this.set(!this.open)}openPanel(){this.set(!0)}closePanel(){this.set(!1)}set(e){if(this.open!==e){this.open=e;for(let t of[...this.listeners])t(e)}}subscribe(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}};const p=`/dsh-tiddlywiki`,m=`${p}/tw/`,h=`${p}/status`,g=`${p}/get`,_=`${p}/render`,v=`${p}/note`,y=`${p}/edit`,b=`${p}/tags`,x=`${p}/recent`,S=`${p}/search`,ee=`${p}/upload`,te=`${p}/sync`,ne=`${p}/restart`,C=`${p}/session/summary`,re=`${p}/admin/state`,ie=`${p}/admin/prompt`,w=`${p}/admin/info`,ae=`${p}/admin/config`,T=`${p}/admin/restart`,E=`${p}/admin/seeds`,oe=`${p}/admin/seeds/run`,se=`${p}/admin/seeds/remove`,ce=`${p}/admin/wiki/location`,le=`${p}/admin/wiki/switch`,ue=`${p}/admin/wiki/reset`,de=`${p}/admin/wikis`,D=`${p}/session/wiki`;function fe(e,t){let n=typeof location>`u`?``:location.protocol,r=typeof location>`u`?void 0:location.origin;return n!==`http:`&&n!==`https:`&&typeof t==`string`&&t.length>0?t:new URL(e,r).href}function pe(e,t,n,r){if(e!==`multi`||typeof t!=`string`||t.length===0)return{relative:n,...r===void 0?{}:{absolute:r}};let i=`${encodeURIComponent(t)}/`;return{relative:`${n}${i}`,...r===void 0?{}:{absolute:`${r}${i}`}}}function me(e,t){return typeof t!=`string`||t.length===0?e:`${e}${e.includes(`?`)?`&`:`?`}wiki=${encodeURIComponent(t)}`}function he(e,t){if(e===null||e.ok!==!0)return{ok:!1,message:e?.error??e?.message??`HTTP ${t}`};let n=``;return typeof e.push==`string`&&e.push.length>0&&e.push!==`nothing to commit`&&(n=`(${e.push})`),e.changed===!0&&(n+=e.restarted===!0?`,TW 已重启`:`,TW 未自动重启`,typeof e.restartError==`string`&&e.restartError.length>0&&(n+=`(${e.restartError})`)),{ok:!0,message:`${e.message??`OK`}${n}`}}let ge;function _e(){if(ge!==void 0&&Date.now()-ge.at<2e3)return ge.value;let e=(async()=>{try{let e=await fetch(h,{signal:AbortSignal.timeout(8e3)});return e.ok?await e.json():null}catch{return null}})();return ge={at:Date.now(),value:e},e.then(t=>{t===null&&ge?.value===e&&(ge=void 0)}),e}function ve(){ge=void 0}const ye={showQuickNoteDock:!0,quickNoteMode:`native`,sidebarLabel:`TiddlyWiki`,tabLabel:`知识库`,showSessionTab:!0,showRightbarTab:!0,showQuickNote:!0,showPanelStatus:!0,showSyncButton:!0};let be;const xe=new Set;function Se(e){return xe.add(e),()=>{xe.delete(e)}}function Ce(){be=void 0,ve();for(let e of[...xe])e()}function we(){if(be!==void 0&&Date.now()-be.at<15e3)return be.value;let e=(async()=>{let e=await _e(),t=e?.ui;return e===null||t===void 0?ye:{showQuickNoteDock:t.showQuickNoteDock!==!1,quickNoteMode:t.quickNoteMode===`card`?`card`:`native`,sidebarLabel:typeof t.sidebarLabel==`string`&&t.sidebarLabel.trim().length>0?t.sidebarLabel.trim():`TiddlyWiki`,tabLabel:typeof t.tabLabel==`string`&&t.tabLabel.trim().length>0?t.tabLabel.trim():`知识库`,showSessionTab:t.showSessionTab!==!1,showRightbarTab:t.showRightbarTab!==!1,showQuickNote:t.showQuickNote!==!1,showPanelStatus:t.showPanelStatus!==!1,showSyncButton:t.showSyncButton!==!1}})();return be={at:Date.now(),value:e},e}function Te(){let e=document.querySelector(`[data-pane="sidebar"], [class*="sidebarCol"], .dshDesktopUpstreamSidebar, .dshDesktopSidebarSurface`);if(e!==null)return e.querySelector(`[class*="logoRow"]`)?.parentElement??e.firstElementChild}function Ee(e){let t=e.querySelector(`button[class*="newSession"]`);if(t!==null)return t;for(let t of e.children)if(t instanceof HTMLButtonElement&&!t.matches(`[data-dsh-tw-entry]`))return t;let n=e.querySelector(`button[aria-label="新建会话"], button[aria-label="New Session"], button[aria-label*="新会话"], button[aria-label*="new session" i]`);return n===null?Array.from(e.querySelectorAll(`button`)).find(e=>!e.matches(`[data-dsh-tw-entry]`)&&/新会话|新建会话|new session/i.test(e.textContent??``)):n}function De(e,t){let n=document.createElement(`button`);n.type=`button`,n.dataset.dshTwEntry=``,n.className=`dsh-tw-entry`,n.setAttribute(`aria-label`,`TiddlyWiki 知识库`);let r=document.createElement(`span`);r.className=`dsh-tw-entry-icon`,r.innerHTML=`<svg viewBox="0 0 16 16" width="14" height="14" fill="none" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 2.5h8a1 1 0 0 1 1 1v9a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1v-9a1 1 0 0 1 1-1z"/><path d="M6 6h4M6 8.5h2.5"/></svg>`;let i=document.createElement(`span`);return i.className=`dsh-tw-entry-label`,i.textContent=t,n.append(r,i),n.addEventListener(`click`,()=>{e.toggle()}),{entry:n,labelEl:i}}function Oe(e,t){try{let n=Ee(e);if(n===void 0)return!1;if(t.parentElement!==e){let r=n.closest(`[class*="logoRow"]`),i=r!==null&&r.parentElement===e?r:n,a=Array.from(e.children).filter(e=>e instanceof HTMLElement&&e.matches(`[data-dsh-tw-entry], [data-dsh-atb-entry], [data-dsh-taskboard-entry], [data-dsh-ssh-entry]`)),o=a.length>0?a[0]??null:i.nextElementSibling;o!==null&&o.parentElement!==e&&(o=null),e.insertBefore(t,o)}return!0}catch(e){return console.error(`[dsh-tiddlywiki] sidebar entry placement failed:`,e),!1}}function ke(e){let{entry:t,labelEl:n}=De(e,`TiddlyWiki`),r=!1,i=async()=>{let e=await we();r||e.sidebarLabel.length===0||(n.textContent=e.sidebarLabel,t.setAttribute(`aria-label`,e.sidebarLabel))};i();let a=Se(()=>{i()}),o,s=!1,c,l=0,u=()=>{c!==void 0&&(clearInterval(c),c=void 0)},d=()=>{c===void 0&&(l=15,c=setInterval(()=>{f(),l--,(s||l<=0)&&u()},2e3))},f=()=>{if(o!==void 0&&!o.isConnected&&(m.disconnect(),o=void 0,s=!1,d()),s){if(document.body.contains(t))return;m.disconnect(),o=void 0,s=!1,d()}o??=Te(),o!==void 0&&(s=Oe(o,t),s&&(u(),m.observe(o,{childList:!0,subtree:!0})))},p=new MutationObserver(()=>{f()});p.observe(document.body,{childList:!0,subtree:!0});let m=new MutationObserver(()=>{if(o===void 0||!o.isConnected){s=!1,d(),f();return}o.contains(t)||(s=Oe(o,t))});d();let h=()=>{e.isOpen()?t.dataset.active=`true`:delete t.dataset.active},g=e.subscribe(h);return h(),f(),()=>{r=!0,clearInterval(c),p.disconnect(),m.disconnect(),g(),a(),t.remove()}}const Ae=`dsh-tiddlywiki.focusWiki`;function je(){try{let e=window.localStorage.getItem(Ae);return e!==null&&e.length>0?e:void 0}catch{return}}let Me=je();const Ne=new Set;function Pe(){return Me}function Fe(e){if(e!==Me){Me=e;try{e===void 0?window.localStorage.removeItem(Ae):window.localStorage.setItem(Ae,e)}catch{}for(let t of[...Ne])t(e)}}function Ie(e){return Ne.add(e),()=>{Ne.delete(e)}}function Le(e,t){return e.length===0||Me!==void 0&&e.some(e=>e.id===Me)?Me:t!==void 0&&e.some(e=>e.id===t)?t:e[0]?.id}const Re=`$:/palettes/CupertinoDark`,ze=`$:/palettes/Vanilla`,Be=`data-ds-dark-theme`,Ve=`$:/palette`,He=new Set,Ue=new WeakSet;let We=``,Ge=!0,Ke=Re;function qe(){try{let e=document.documentElement,t=document.body;if(t!==null&&t.hasAttribute(Be))return!0;if(e!==null){let t=e.style.getPropertyValue(`color-scheme`).trim().toLowerCase();if(t===`dark`)return!0;if(t===`light`)return!1}}catch{}try{return window.matchMedia(`(prefers-color-scheme: dark)`).matches}catch{return!1}}function Je(e){try{let t=e.wiki.getTiddlerText(Ve);return typeof t==`string`&&t.trim().length>0?t.trim():ze}catch{return ze}}function Ye(e){try{let t=e.wiki.getTiddler(Je(e))?.fields;return t!==void 0&&t[`color-scheme`]===`dark`}catch{return!1}}function Xe(e){try{let t=e.syncer;if(t?.tiddlerInfo===void 0)return;let n=e.wiki.getChangeCount(Ve),r=t.tiddlerInfo[Ve];r===void 0?t.tiddlerInfo[Ve]={changeCount:n}:r.changeCount=n}catch{}}function Ze(e){try{let t=e.syncer,n=t?.syncadaptor;if(t===void 0||n===void 0||Ue.has(t))return;let r=n.saveTiddler.bind(n);n.saveTiddler=(e,t)=>{if(Ge&&We.length>0&&e?.fields?.title===Ve&&e?.fields?.text===Ke){t(null,{},0);return}r(e,t)},Ue.add(t)}catch{}}function Qe(e,t){try{if(Je(e)===t)return;e.wiki.setText(Ve,`text`,void 0,t),Xe(e)}catch{}}function $e(e,t){let n=Je(e);if(t){if(Ye(e))return;n!==Ke&&(We=n),Qe(e,Ke)}else Ye(e)&&n===Ke&&We.length>0&&Qe(e,We)}function et(e,t){try{let n=t.contentDocument?.documentElement;if(n==null)return;let r=Ye(e)?`dark`:`light`;n.style.getPropertyValue(`color-scheme`)!==r&&n.style.setProperty(`color-scheme`,r)}catch{}}function tt(e){try{let t=e.contentWindow?.$tw;if(t===void 0||t.wiki===void 0)return;Ze(t),Ge?$e(t,qe()):$e(t,!1),et(t,e)}catch{}}function nt(e){let t=e.enabled!==!1,n=typeof e.darkPalette==`string`&&e.darkPalette.trim().length>0?e.darkPalette.trim():Re,r=t!==Ge||n!==Ke;if(Ge=t,Ke=n,r)for(let e of[...He])e()}function rt(e){if(e===null)return()=>{};let t=()=>tt(e);He.add(t);let n=()=>t();e.addEventListener(`load`,n);let r=window.matchMedia(`(prefers-color-scheme: dark)`),i=()=>t();try{r.addEventListener(`change`,i)}catch{r.addListener?.(i)}let a;try{a=new MutationObserver(()=>t()),document.body!==null&&a.observe(document.body,{attributes:!0,attributeFilter:[Be]}),document.documentElement!==null&&a.observe(document.documentElement,{attributes:!0,attributeFilter:[`style`]})}catch{a=void 0}let o=[150,600,1500,3e3].map(e=>window.setTimeout(t,e));return t(),()=>{He.delete(t),e.removeEventListener(`load`,n);for(let e of o)window.clearTimeout(e);try{r.removeEventListener(`change`,i)}catch{r.removeListener?.(i)}try{a?.disconnect()}catch{}}}const it=`dsh-panel-activate`,at=`dsh-tw-panel-reload`;let ot=`知识库`;function st(e){let t=typeof e==`string`?e.trim():``;t.length>0&&(ot=t)}function ct(){return ot}async function lt(){try{return(await fetch(ne,{method:`POST`,signal:AbortSignal.timeout(8e3)})).ok}catch{return!1}}function ut({size:e=16,className:t}){return c.createElement(`svg`,{width:e,height:e,className:t,viewBox:`0 0 16 16`,fill:`none`,stroke:`currentColor`,strokeWidth:1.3,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":!0},c.createElement(`path`,{d:`M4 2.5h8a1 1 0 0 1 1 1v9a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1v-9a1 1 0 0 1 1-1z`}),c.createElement(`path`,{d:`M6 6h4M6 8.5h2.5`}))}function dt(e){let t=e.loaded;return t===void 0||t.length===0?null:t}function ft(e,t={}){let n=!1,r=!1,i=!1,a,o,s,c,l=new Set,u=0,d=!1,f=null,p,m=()=>{c!==void 0&&(window.clearTimeout(c),c=void 0)},h=e=>{if(o===void 0||s===void 0)return;o.hidden=!0,s.hidden=!1,s.replaceChildren();let t=document.createElement(`div`);t.textContent=`TiddlyWiki 服务不可用`;let n=document.createElement(`code`);n.textContent=e;let r=document.createElement(`button`);r.type=`button`,r.textContent=`重试`,r.addEventListener(`click`,()=>{r.disabled=!0,r.textContent=`重启中…`,lt().finally(()=>{b()})}),s.append(t,n,r)},g=()=>{if(o===void 0||s===void 0)return;o.hidden=!0,s.hidden=!1,s.replaceChildren();let e=document.createElement(`div`);e.textContent=`TiddlyWiki 服务正在启动…`,s.append(e)},_=e=>{o===void 0||s===void 0||(s.hidden=!0,o.hidden=!n,o.dataset.loaded!==e&&(o.dataset.loaded=e,d=!1,o.src=e))},v=()=>{if(f===null||o===void 0||!d)return;let e=f,t=o.contentWindow;if(t===null){y(e);return}let n=r=>{if(i||f!==e)return;let a=!1;try{let e=t;a=typeof e.$tw==`object`&&e.$tw!==null}catch{y(e);return}if(!a){if(r<40){let e=window.setTimeout(()=>{l.delete(e),n(r+1)},150);l.add(e);return}y(e);return}f=null;try{t.location.hash!==e&&(t.location.hash=e)}catch{y(e)}};n(0)},y=e=>{if(i||o===void 0)return;f===e&&(f=null);let t=dt(o.dataset);if(t===null)return;let n=`${t.split(`#`)[0]}${e}`;o.src!==n&&(o.src=n)},b=async()=>{m();let e=await _e();if(!i&&n){if(e===null){h(`无法访问 /dsh-tiddlywiki/status`);return}if(e.ui!==void 0&&(st(e.ui.tabLabel??ot),nt({enabled:e.ui.followDshTheme!==!1,darkPalette:e.ui.darkPalette})),e.status===`running`){if(u=0,typeof e.twProxy==`string`){let n=pe(e.mode,t.wikiId?.(),e.twProxy,e.twProxyAbsolute);_(fe(n.relative,n.absolute))}else typeof e.url==`string`?_(e.url):h(`服务未返回编辑器地址`);return}if(e.status===`starting`){g(),u<30&&(u++,c=window.setTimeout(()=>{b()},1500));return}u=0,h(e.error??`服务状态:${e.status}`)}},x=()=>{if(o===void 0)return;let e=dt(o.dataset);e!==null&&(o.src=e)};document.addEventListener(at,x);let S=Ie(()=>{!i&&n&&b()});return{build:()=>{if(a!==void 0)return a;let t=document.createElement(`div`);if(t.className=e.view,e.viewDataset!==void 0)for(let[n,r]of Object.entries(e.viewDataset))t.dataset[n]=r;let r=document.createElement(`div`);r.className=e.frameWrap,e.frameWrapStyle!==void 0&&(r.style.cssText=e.frameWrapStyle);let i=document.createElement(`iframe`);i.className=e.frame,i.title=`TiddlyWiki`,i.hidden=!0,r.append(i);let c=document.createElement(`div`);return c.className=e.error,c.hidden=!0,t.append(r,c),a=t,o=i,s=c,i.addEventListener(`load`,()=>{d=!0,v()}),p=rt(i),n&&b(),t},setVisible(e){i||(n=e,e&&!r&&(r=!0),o!==void 0&&(o.hidden=!e||dt(o.dataset)===null),e?b():(m(),u=0))},openTiddler(e){return i||!n?!1:(f=`#${encodeURIComponent(e)}`,r?v():(r=!0,b()),!0)},dispose(){if(!i){i=!0,document.removeEventListener(at,x),S(),m();for(let e of l)window.clearTimeout(e);l.clear(),p?.(),a?.remove()}}}}function pt(){return{setVisible(){},openTiddler(){return!1},dispose(){}}}const mt=new Set;function ht(e){for(let t of mt)if(t.openTiddler(e))return!0;return!1}function gt(){_e().then(e=>{e?.ui!==void 0&&st(e.ui.tabLabel??ot)})}const _t={view:`dsh-tw-rightbar-view`,frameWrap:`dsh-tw-rightbar-frame-wrap`,frame:`dsh-tw-rightbar-frame`,error:`dsh-tw-rightbar-error`};function vt(e,t){if(t.aborted)return pt();let n=ft(_t,{wikiId:Pe});e.append(n.build());let r=!1,i=()=>a.dispose();t.addEventListener(`abort`,i,{once:!0});let a={setVisible(e){n.setVisible(e)},openTiddler(e){return n.openTiddler(e)},dispose(){r||(r=!0,mt.delete(a),t.removeEventListener(`abort`,i),n.dispose())}};return mt.add(a),a}const yt=[`[class*="centerCol"]`,`[data-pane="conversation"]`,`.dshDesktopConversationSurface`],bt=`data-dsh-tw-active`,xt=[`data-dsh-atb-active`,`data-dsh-taskboard-active`,`data-dsh-ssh-active`],St=`dsh-tiddlywiki`,Ct=`[data-dsh-panel-host]`,wt={view:`dsh-tw-view`,viewDataset:{dshTwView:``},frameWrap:`dsh-tw-panel-frame-wrap`,frameWrapStyle:`flex:1;min-height:0;display:flex;flex-direction:column`,frame:`dsh-tw-panel-frame`,error:`dsh-tw-panel-error`},Tt=`dsh-tw-open-tiddler`;function Et(e){typeof document>`u`||typeof e!=`string`||e.length===0||document.dispatchEvent(new CustomEvent(Tt,{detail:{title:e}}))}function Dt(){let e=document.querySelector(Ct);if(e===null)return 40;let t=parseInt(getComputedStyle(e).zIndex,10);return Number.isFinite(t)?Math.max(20,Math.min(40,t-1)):40}function Ot(){for(let e of yt){let t=document.querySelector(e);if(t!==null)return t}}function kt(e){let t,n,r=!1,i,a=ft(wt,{wikiId:Pe}),o=()=>{if(!e.isOpen()||t===void 0||n===void 0)return;let r=n.getBoundingClientRect();if(r.width===0&&r.height===0)return;let i=`${r.left}px`,a=`${r.top}px`,o=`${r.width}px`,s=`${r.height}px`;t.style.left!==i&&(t.style.left=i),t.style.top!==a&&(t.style.top=a),t.style.width!==o&&(t.style.width=o),t.style.height!==s&&(t.style.height=s)},s=(n=!1)=>{if(t===void 0)return;let r=document.querySelector(Ct)!==null;!n&&!e.isOpen()&&r===i||(i=r,t.style.zIndex=String(Dt()),r?t.dataset.sidebarHost=`1`:delete t.dataset.sidebarHost)},c=()=>{(n===void 0||!n.isConnected)&&(n=Ot()),t===void 0&&n!==void 0&&(t=a.build(),t.style.position=`fixed`,s(!0),document.body.append(t),o())},l=t=>{let n=t.detail,r=typeof n?.title==`string`&&n.title.length>0?n.title:``;r.length!==0&&(ht(r)||(e.openPanel(),a.openTiddler(r)))},u=()=>{if(e.isOpen()){for(let e of xt)document.documentElement.removeAttribute(e);document.documentElement.setAttribute(bt,``),document.dispatchEvent(new CustomEvent(it,{detail:St})),m()}else document.documentElement.removeAttribute(bt);a.setVisible(e.isOpen())},d=t=>{t.detail!==St&&e.isOpen()&&e.closePanel()},f=t=>{if(!e.isOpen())return;let n=t.target;n!==null&&n.closest(`[data-dsh-tw-entry]`)===null&&n.closest(`[class*="sessionRow"], [class*="projectRow"], [class*="searchResultRow"], [class*="searchResultWorkspace"], [class*="newSession"]`)!==null&&e.closePanel()},p,m=()=>{r||p!==void 0||(p=window.requestAnimationFrame(()=>{p=void 0,!r&&(c(),o(),s())}))},h=new MutationObserver(()=>{m()});h.observe(document.body,{childList:!0,subtree:!0});let g=new ResizeObserver(()=>{m()});g.observe(document.body);let _=window.setInterval(o,2e3),v=()=>{m()};window.addEventListener(`resize`,v);let y=()=>{m()};window.addEventListener(`scroll`,y,!0),document.addEventListener(`click`,f,!0),document.addEventListener(it,d);let b=e.subscribe(u);return c(),u(),document.addEventListener(Tt,l),()=>{r=!0,p!==void 0&&window.cancelAnimationFrame(p),p=void 0,window.clearInterval(_),window.removeEventListener(`resize`,v),window.removeEventListener(`scroll`,y,!0),g.disconnect(),document.removeEventListener(`click`,f,!0),document.removeEventListener(it,d),document.removeEventListener(Tt,l),h.disconnect(),b(),document.documentElement.removeAttribute(bt),a.dispose(),t?.remove()}}function O(e){let t=document.querySelector(`.dsh-tw-toast`);t===null&&(t=document.createElement(`div`),t.className=`dsh-tw-toast`,document.body.append(t)),t.textContent=e,t.classList.add(`dsh-tw-toast-show`),clearTimeout(t.__twToastTimer),t.__twToastTimer=window.setTimeout(()=>{t?.classList.remove(`dsh-tw-toast-show`)},2500)}const At=`dsh-tiddlywiki/editor-popup`;let k,jt,Mt,Nt,Pt,Ft;function It(e,t){Ht(),!(k===void 0||jt===void 0)&&(Mt!==void 0&&(Mt.textContent=`TiddlyWiki 编辑器 · ${t}`),k.style.display=``,document.dispatchEvent(new CustomEvent(it,{detail:At})),(jt.dataset.loaded!==e||Rt())&&(jt.dataset.loaded=e,jt.src=e),zt())}function Lt(){return k!==void 0&&k.style.display!==`none`}function Rt(){if(jt===void 0)return!1;let e=null;try{e=jt.contentDocument}catch{return!1}if(e===null||e.readyState===`loading`)return!1;let t=e.querySelector(`.tc-story-river`);return t===null||t.querySelector(`.tc-tiddler-frame`)===null}function zt(){k!==void 0&&k.querySelector(`button, [href], input, select, textarea, iframe, [tabindex]:not([tabindex="-1"])`)?.focus()}function Bt(){k!==void 0&&(k.style.display=`none`),jt!==void 0&&(jt.dataset.loaded=``)}function Vt(){Nt?.(),Nt=void 0,Pt!==void 0&&(document.removeEventListener(`keydown`,Pt),Pt=void 0),Ft!==void 0&&(document.removeEventListener(it,Ft),Ft=void 0),k?.remove(),k=void 0,jt=void 0,Mt=void 0}function Ht(){if(k!==void 0&&jt!==void 0)return;k=document.createElement(`div`),k.className=`dsh-tw-editor-popup`,k.style.display=`none`,k.setAttribute(`role`,`dialog`),k.setAttribute(`aria-modal`,`true`),k.setAttribute(`aria-label`,`TiddlyWiki 编辑器`);let e=document.createElement(`div`);e.className=`dsh-tw-editor-bar`,Mt=document.createElement(`span`),Mt.className=`dsh-tw-editor-title`,Mt.textContent=`TiddlyWiki 编辑器`;let t=document.createElement(`button`);t.type=`button`,t.className=`dsh-tw-editor-close`,t.textContent=`✕`,t.title=`关闭`,e.append(Mt,t),jt=document.createElement(`iframe`),jt.className=`dsh-tw-editor-frame`,jt.setAttribute(`sandbox`,`allow-scripts allow-same-origin allow-forms allow-popups`),jt.title=`TiddlyWiki 编辑器`,Nt=rt(jt);let n=document.createElement(`div`);n.className=`dsh-tw-editor-resize`,n.title=`拖拽调整大小`,k.append(e,jt,n),document.body.append(k),t.addEventListener(`click`,()=>Bt()),Pt=e=>{e.key===`Escape`&&Lt()&&Bt()},document.addEventListener(`keydown`,Pt),Ft=e=>{e.detail!==At&&Lt()&&Bt()},document.addEventListener(it,Ft),e.addEventListener(`pointerdown`,n=>{if(n.button!==0||k===void 0)return;let r=n.target;if(t.contains(r))return;n.preventDefault(),e.setPointerCapture(n.pointerId);let i=k.getBoundingClientRect(),a=n.clientX,o=n.clientY,s=i.left,c=i.top,l=e=>{k!==void 0&&(k.style.left=`${s+e.clientX-a}px`,k.style.top=`${c+e.clientY-o}px`,k.style.margin=`0`,k.style.right=`auto`,k.style.bottom=`auto`)},u=()=>{e.removeEventListener(`pointermove`,l),e.removeEventListener(`pointerup`,u),e.removeEventListener(`pointercancel`,u)};e.addEventListener(`pointermove`,l),e.addEventListener(`pointerup`,u),e.addEventListener(`pointercancel`,u)}),n.addEventListener(`pointerdown`,e=>{if(e.button!==0||k===void 0)return;e.preventDefault(),e.stopPropagation(),n.setPointerCapture(e.pointerId);let t=k.getBoundingClientRect(),r=e.clientX,i=e.clientY,a=t.width,o=t.height,s=e=>{k!==void 0&&(k.style.width=`${Math.max(360,a+e.clientX-r)}px`,k.style.height=`${Math.max(260,o+e.clientY-i)}px`,k.style.right=`auto`,k.style.bottom=`auto`)},c=()=>{n.removeEventListener(`pointermove`,s),n.removeEventListener(`pointerup`,c),n.removeEventListener(`pointercancel`,c)};n.addEventListener(`pointermove`,s),n.addEventListener(`pointerup`,c),n.addEventListener(`pointercancel`,c)})}let Ut=[],Wt=[];(()=>{let e=`lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,1n,9,16,o,,x,1i,3,,i,,7,a,2,t,3,1k,,,7,2,2,2,3,9,,a,2,q,,2,3,1k,,,5,4,2,2,3,3,,u,2,3,,b,3,1k,,,8,,3,,3,k,2,m,6,,3,1k,,,7,2,2,2,3,7,3,a,2,u,,1n,5,3,3,,4,9,,14,5,1j,,,7,,3,,4,7,2,b,2,t,3,1k,,,7,,3,,4,7,2,b,2,f,,c,4,1j,2,,7,,3,,4,9,,a,2,t,3,1y,,4,6,,,,8,i,2,1p,,,8,c,8,2q,,,a,b,7,21,2,r,,,,,,4,2,1d,k,,2,5,b,,10,9,,2u,b,,6,n,4,4,3,g,4,d,,,3,6,,f,,jj,3,qa,4,s,3,t,2,u,2,1s,w,9,,19,3,,,39,2,y,,3a,c,4,c,63,5,1l,a,,,,,2,o,2,,1c,1a,2,c,k,5,1b,h,12,9,c,3,u,d,1k,e,1c,k,48,3,,l,4,,6,,2,3,5i,1s,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,n,5,4,,2b,2,1e,i,q,i,d,,12,8,p,d,18,4,1b,e,10,,1v,e,c,,8,2,1a,,1f,,,3,2,2,5,2,,,15,5,5,2,6k,8,,2,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,1t,5,8t,2,25,6,1y,b,1d,4,3e,3,1h,f,15,,2,2,a,4,19,b,7,,1p,3,10,e,g,2,18,,c,3,1c,e,8,4,,2,2k,c,6,,2,,4d,c,l,4,1j,2,,7,2,2,2,3,9,,a,2,2,7,3,5,1v,9,,,2,,,4,,5,,,e,2,2a,i,n,,29,k,6j,7,2,9,r,2,2a,h,2y,d,2t,3,2,a,74,f,6t,6,,2,2,4,,,,2,3x,7,2,7,3,,s,a,14,7,,4,8,,9,b,1a,g,5i,8,5j,8,,8,2a,m,,e,3e,6,3,,,2,,7,,,1u,5,,2,,5,9n,4,9,2,,,1c,7,3,5,n,,44l,,6,f,8ug,i,1xc,5,1n,7,t4,,,1j,7,4,29,,b,2,f57,2,3mp,1a,2,n,f2,5,3,6,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,2s,,4g,7,af,,1p,4,e4,4,72,2,6r,,2,,7,2,5,,d6,7,31,7,240,5`.split(`,`).map(e=>e?parseInt(e,36):1);for(let t=0,n=0;t<e.length;t++)(t%2?Wt:Ut).push(n+=e[t])})();function Gt(e){if(e<768)return!1;for(let t=0,n=Ut.length;;){let r=t+n>>1;if(e<Ut[r])n=r;else if(e>=Wt[r])t=r+1;else return!0;if(t==n)return!1}}function Kt(e){return e>=127462&&e<=127487}const qt=8205;function Jt(e,t,n=!0,r=!0){return(n?Yt:Xt)(e,t,r)}function Yt(e,t,n){if(t==e.length)return t;t&&Qt(e.charCodeAt(t))&&$t(e.charCodeAt(t-1))&&t--;let r=Zt(e,t);for(t+=en(r);t<e.length;){let i=Zt(e,t);if(r==qt||i==qt||n&&Gt(i))t+=en(i),r=i;else if(Kt(i)){let n=0,r=t-2;for(;r>=0&&Kt(Zt(e,r));)n++,r-=2;if(n%2==0)break;t+=2}else break}return t}function Xt(e,t,n){for(;t>1;){let r=Yt(e,t-2,n);if(r<t)return r;t--}return 0}function Zt(e,t){let n=e.charCodeAt(t);if(!$t(n)||t+1==e.length)return n;let r=e.charCodeAt(t+1);return Qt(r)?(n-55296<<10)+(r-56320)+65536:n}function Qt(e){return e>=56320&&e<57344}function $t(e){return e>=55296&&e<56320}function en(e){return e<65536?1:2}var A=class e{lineAt(e){if(e<0||e>this.length)throw RangeError(`Invalid position ${e} in document of length ${this.length}`);return this.lineInner(e,!1,1,0)}line(e){if(e<1||e>this.lines)throw RangeError(`Invalid line number ${e} in ${this.lines}-line document`);return this.lineInner(e,!0,1,0)}replace(e,t,n){[e,t]=dn(this,e,t);let r=[];return this.decompose(0,e,r,2),n.length&&n.decompose(0,n.length,r,3),this.decompose(t,this.length,r,1),nn.from(r,this.length-(t-e)+n.length)}append(e){return this.replace(this.length,this.length,e)}slice(e,t=this.length){[e,t]=dn(this,e,t);let n=[];return this.decompose(e,t,n,0),nn.from(n,t-e)}eq(e){if(e==this)return!0;if(e.length!=this.length||e.lines!=this.lines)return!1;let t=this.scanIdentical(e,1),n=this.length-this.scanIdentical(e,-1),r=new sn(this),i=new sn(e);for(let e=t,a=t;;){if(r.next(e),i.next(e),e=0,r.lineBreak!=i.lineBreak||r.done!=i.done||r.value!=i.value)return!1;if(a+=r.value.length,r.done||a>=n)return!0}}iter(e=1){return new sn(this,e)}iterRange(e,t=this.length){return new cn(this,e,t)}iterLines(e,t){let n;if(e==null)n=this.iter();else{t??=this.lines+1;let r=this.line(e).from;n=this.iterRange(r,Math.max(r,t==this.lines+1?this.length:t<=1?0:this.line(t-1).to))}return new ln(n)}toString(){return this.sliceString(0)}toJSON(){let e=[];return this.flatten(e),e}constructor(){}static of(t){if(t.length==0)throw RangeError(`A document must have at least one line`);return t.length==1&&!t[0]?e.empty:t.length<=32?new tn(t):nn.from(tn.split(t,[]))}},tn=class e extends A{constructor(e,t=rn(e)){super(),this.text=e,this.length=t}get lines(){return this.text.length}get children(){return null}lineInner(e,t,n,r){for(let i=0;;i++){let a=this.text[i],o=r+a.length;if((t?n:o)>=e)return new un(r,o,n,a);r=o+1,n++}}decompose(t,n,r,i){let a=t<=0&&n>=this.length?this:new e(on(this.text,t,n),Math.min(n,this.length)-Math.max(0,t));if(i&1){let t=r.pop(),n=an(a.text,t.text.slice(),0,a.length);if(n.length<=32)r.push(new e(n,t.length+a.length));else{let t=n.length>>1;r.push(new e(n.slice(0,t)),new e(n.slice(t)))}}else r.push(a)}replace(t,n,r){if(!(r instanceof e))return super.replace(t,n,r);[t,n]=dn(this,t,n);let i=an(this.text,an(r.text,on(this.text,0,t)),n),a=this.length+r.length-(n-t);return i.length<=32?new e(i,a):nn.from(e.split(i,[]),a)}sliceString(e,t=this.length,n=`
|
|
770
|
+
`;function d(){if(typeof document>`u`)return()=>{};let e=document.getElementById(l);e===null?(e=document.createElement(`style`),e.id=l,e.dataset.plugin=`dsh-tiddlywiki`,e.textContent=u,document.head.append(e)):e.textContent!==u&&(e.textContent=u);let t=String(Date.now())+`:`+Math.random().toString(36).slice(2);return e.dataset.instance=t,()=>{e?.dataset.instance===t&&e.remove()}}var f=class{open=!1;listeners=new Set;isOpen(){return this.open}toggle(){this.set(!this.open)}openPanel(){this.set(!0)}closePanel(){this.set(!1)}set(e){if(this.open!==e){this.open=e;for(let t of[...this.listeners])t(e)}}subscribe(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}};const p=`/dsh-tiddlywiki`,m=`${p}/tw/`,h=`${p}/status`,g=`${p}/get`,_=`${p}/render`,v=`${p}/note`,y=`${p}/edit`,b=`${p}/tags`,x=`${p}/recent`,S=`${p}/search`,ee=`${p}/upload`,te=`${p}/sync`,ne=`${p}/restart`,C=`${p}/session/summary`,re=`${p}/admin/state`,ie=`${p}/admin/prompt`,w=`${p}/admin/info`,ae=`${p}/admin/config`,T=`${p}/admin/restart`,oe=`${p}/admin/seeds`,se=`${p}/admin/seeds/run`,ce=`${p}/admin/seeds/remove`,le=`${p}/admin/wiki/location`,ue=`${p}/admin/wiki/switch`,de=`${p}/admin/wiki/reset`,fe=`${p}/admin/wikis`,E=`${p}/session/wiki`;function pe(e,t){let n=typeof location>`u`?``:location.protocol,r=typeof location>`u`?void 0:location.origin;return n!==`http:`&&n!==`https:`&&typeof t==`string`&&t.length>0?t:new URL(e,r).href}function me(e,t,n,r){if(e!==`multi`||typeof t!=`string`||t.length===0)return{relative:n,...r===void 0?{}:{absolute:r}};let i=`${encodeURIComponent(t)}/`;return{relative:`${n}${i}`,...r===void 0?{}:{absolute:`${r}${i}`}}}function he(e,t){return typeof t!=`string`||t.length===0?e:`${e}${e.includes(`?`)?`&`:`?`}wiki=${encodeURIComponent(t)}`}function ge(e,t){if(e===null||e.ok!==!0)return{ok:!1,message:e?.error??e?.message??`HTTP ${t}`};let n=``;return typeof e.push==`string`&&e.push.length>0&&e.push!==`nothing to commit`&&(n=`(${e.push})`),e.changed===!0&&(n+=e.restarted===!0?`,TW 已重启`:`,TW 未自动重启`,typeof e.restartError==`string`&&e.restartError.length>0&&(n+=`(${e.restartError})`)),{ok:!0,message:`${e.message??`OK`}${n}`}}let _e;function ve(){if(_e!==void 0&&Date.now()-_e.at<2e3)return _e.value;let e=(async()=>{try{let e=await fetch(h,{signal:AbortSignal.timeout(8e3)});return e.ok?await e.json():null}catch{return null}})();return _e={at:Date.now(),value:e},e.then(t=>{t===null&&_e?.value===e&&(_e=void 0)}),e}function ye(){_e=void 0}const be={showQuickNoteDock:!0,quickNoteMode:`native`,sidebarLabel:`TiddlyWiki`,tabLabel:`知识库`,showSessionTab:!0,showRightbarTab:!0,showQuickNote:!0,showPanelStatus:!0,showSyncButton:!0};let xe;const Se=new Set;function Ce(e){return Se.add(e),()=>{Se.delete(e)}}function we(){xe=void 0,ye();for(let e of[...Se])e()}function Te(){if(xe!==void 0&&Date.now()-xe.at<15e3)return xe.value;let e=(async()=>{let e=await ve(),t=e?.ui;return e===null||t===void 0?be:{showQuickNoteDock:t.showQuickNoteDock!==!1,quickNoteMode:t.quickNoteMode===`card`?`card`:`native`,sidebarLabel:typeof t.sidebarLabel==`string`&&t.sidebarLabel.trim().length>0?t.sidebarLabel.trim():`TiddlyWiki`,tabLabel:typeof t.tabLabel==`string`&&t.tabLabel.trim().length>0?t.tabLabel.trim():`知识库`,showSessionTab:t.showSessionTab!==!1,showRightbarTab:t.showRightbarTab!==!1,showQuickNote:t.showQuickNote!==!1,showPanelStatus:t.showPanelStatus!==!1,showSyncButton:t.showSyncButton!==!1}})();return xe={at:Date.now(),value:e},e}function Ee(){let e=document.querySelector(`[data-pane="sidebar"], [class*="sidebarCol"], .dshDesktopUpstreamSidebar, .dshDesktopSidebarSurface`);if(e!==null)return e.querySelector(`[class*="logoRow"]`)?.parentElement??e.firstElementChild}function De(e){let t=e.querySelector(`button[class*="newSession"]`);if(t!==null)return t;for(let t of e.children)if(t instanceof HTMLButtonElement&&!t.matches(`[data-dsh-tw-entry]`))return t;let n=e.querySelector(`button[aria-label="新建会话"], button[aria-label="New Session"], button[aria-label*="新会话"], button[aria-label*="new session" i]`);return n===null?Array.from(e.querySelectorAll(`button`)).find(e=>!e.matches(`[data-dsh-tw-entry]`)&&/新会话|新建会话|new session/i.test(e.textContent??``)):n}function Oe(e,t){let n=document.createElement(`button`);n.type=`button`,n.dataset.dshTwEntry=``,n.className=`dsh-tw-entry`,n.setAttribute(`aria-label`,`TiddlyWiki 知识库`);let r=document.createElement(`span`);r.className=`dsh-tw-entry-icon`,r.innerHTML=`<svg viewBox="0 0 16 16" width="14" height="14" fill="none" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 2.5h8a1 1 0 0 1 1 1v9a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1v-9a1 1 0 0 1 1-1z"/><path d="M6 6h4M6 8.5h2.5"/></svg>`;let i=document.createElement(`span`);return i.className=`dsh-tw-entry-label`,i.textContent=t,n.append(r,i),n.addEventListener(`click`,()=>{e.toggle()}),{entry:n,labelEl:i}}function ke(e,t){try{let n=De(e);if(n===void 0)return!1;if(t.parentElement!==e){let r=n.closest(`[class*="logoRow"]`),i=r!==null&&r.parentElement===e?r:n,a=Array.from(e.children).filter(e=>e instanceof HTMLElement&&e.matches(`[data-dsh-tw-entry], [data-dsh-atb-entry], [data-dsh-taskboard-entry], [data-dsh-ssh-entry]`)),o=a.length>0?a[0]??null:i.nextElementSibling;o!==null&&o.parentElement!==e&&(o=null),e.insertBefore(t,o)}return!0}catch(e){return console.error(`[dsh-tiddlywiki] sidebar entry placement failed:`,e),!1}}function Ae(e){let{entry:t,labelEl:n}=Oe(e,`TiddlyWiki`),r=!1,i=async()=>{let e=await Te();r||e.sidebarLabel.length===0||(n.textContent=e.sidebarLabel,t.setAttribute(`aria-label`,e.sidebarLabel))};i();let a=Ce(()=>{i()}),o,s=!1,c,l=0,u=()=>{c!==void 0&&(clearInterval(c),c=void 0)},d=()=>{c===void 0&&(l=15,c=setInterval(()=>{f(),l--,(s||l<=0)&&u()},2e3))},f=()=>{if(o!==void 0&&!o.isConnected&&(m.disconnect(),o=void 0,s=!1,d()),s){if(document.body.contains(t))return;m.disconnect(),o=void 0,s=!1,d()}o??=Ee(),o!==void 0&&(s=ke(o,t),s&&(u(),m.observe(o,{childList:!0,subtree:!0})))},p=new MutationObserver(()=>{f()});p.observe(document.body,{childList:!0,subtree:!0});let m=new MutationObserver(()=>{if(o===void 0||!o.isConnected){s=!1,d(),f();return}o.contains(t)||(s=ke(o,t))});d();let h=()=>{e.isOpen()?t.dataset.active=`true`:delete t.dataset.active},g=e.subscribe(h);return h(),f(),()=>{r=!0,clearInterval(c),p.disconnect(),m.disconnect(),g(),a(),t.remove()}}const je=`dsh-tiddlywiki.focusWiki`;function Me(){try{let e=window.localStorage.getItem(je);return e!==null&&e.length>0?e:void 0}catch{return}}let Ne=Me();const Pe=new Set;function Fe(){return Ne}function Ie(e){if(e!==Ne){Ne=e;try{e===void 0?window.localStorage.removeItem(je):window.localStorage.setItem(je,e)}catch{}for(let t of[...Pe])t(e)}}function Le(e){return Pe.add(e),()=>{Pe.delete(e)}}function Re(e,t){return e.length===0||Ne!==void 0&&e.some(e=>e.id===Ne)?Ne:t!==void 0&&e.some(e=>e.id===t)?t:e[0]?.id}const ze=`$:/palettes/CupertinoDark`,Be=`$:/palettes/Vanilla`,Ve=`data-ds-dark-theme`,He=`$:/palette`,Ue=new Set,We=new WeakSet;let Ge=``,Ke=!0,qe=ze;function Je(){try{let e=document.documentElement,t=document.body;if(t!==null&&t.hasAttribute(Ve))return!0;if(e!==null){let t=e.style.getPropertyValue(`color-scheme`).trim().toLowerCase();if(t===`dark`)return!0;if(t===`light`)return!1}}catch{}try{return window.matchMedia(`(prefers-color-scheme: dark)`).matches}catch{return!1}}function Ye(e){try{let t=e.wiki.getTiddlerText(He);return typeof t==`string`&&t.trim().length>0?t.trim():Be}catch{return Be}}function Xe(e){try{let t=e.wiki.getTiddler(Ye(e))?.fields;return t!==void 0&&t[`color-scheme`]===`dark`}catch{return!1}}function Ze(e){try{let t=e.syncer;if(t?.tiddlerInfo===void 0)return;let n=e.wiki.getChangeCount(He),r=t.tiddlerInfo[He];r===void 0?t.tiddlerInfo[He]={changeCount:n}:r.changeCount=n}catch{}}function Qe(e){try{let t=e.syncer,n=t?.syncadaptor;if(t===void 0||n===void 0||We.has(t))return;let r=n.saveTiddler.bind(n);n.saveTiddler=(e,t)=>{if(Ke&&Ge.length>0&&e?.fields?.title===He&&e?.fields?.text===qe){t(null,{},0);return}r(e,t)},We.add(t)}catch{}}function $e(e,t){try{if(Ye(e)===t)return;e.wiki.setText(He,`text`,void 0,t),Ze(e)}catch{}}function et(e,t){let n=Ye(e);if(t){if(Xe(e))return;n!==qe&&(Ge=n),$e(e,qe)}else Xe(e)&&n===qe&&Ge.length>0&&$e(e,Ge)}function tt(e,t){try{let n=t.contentDocument?.documentElement;if(n==null)return;let r=Xe(e)?`dark`:`light`;n.style.getPropertyValue(`color-scheme`)!==r&&n.style.setProperty(`color-scheme`,r)}catch{}}function nt(e){try{let t=e.contentWindow?.$tw;if(t===void 0||t.wiki===void 0)return;Qe(t),Ke?et(t,Je()):et(t,!1),tt(t,e)}catch{}}function rt(e){let t=e.enabled!==!1,n=typeof e.darkPalette==`string`&&e.darkPalette.trim().length>0?e.darkPalette.trim():ze,r=t!==Ke||n!==qe;if(Ke=t,qe=n,r)for(let e of[...Ue])e()}function it(e){if(e===null)return()=>{};let t=()=>nt(e);Ue.add(t);let n=()=>t();e.addEventListener(`load`,n);let r=window.matchMedia(`(prefers-color-scheme: dark)`),i=()=>t();try{r.addEventListener(`change`,i)}catch{r.addListener?.(i)}let a;try{a=new MutationObserver(()=>t()),document.body!==null&&a.observe(document.body,{attributes:!0,attributeFilter:[Ve]}),document.documentElement!==null&&a.observe(document.documentElement,{attributes:!0,attributeFilter:[`style`]})}catch{a=void 0}let o=[150,600,1500,3e3].map(e=>window.setTimeout(t,e));return t(),()=>{Ue.delete(t),e.removeEventListener(`load`,n);for(let e of o)window.clearTimeout(e);try{r.removeEventListener(`change`,i)}catch{r.removeListener?.(i)}try{a?.disconnect()}catch{}}}const at=`dsh-panel-activate`,ot=`dsh-tw-panel-reload`;let st=`知识库`;function ct(e){let t=typeof e==`string`?e.trim():``;t.length>0&&(st=t)}function lt(){return st}async function ut(){try{return(await fetch(ne,{method:`POST`,signal:AbortSignal.timeout(8e3)})).ok}catch{return!1}}function dt({size:e=16,className:t}){return c.createElement(`svg`,{width:e,height:e,className:t,viewBox:`0 0 16 16`,fill:`none`,stroke:`currentColor`,strokeWidth:1.3,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":!0},c.createElement(`path`,{d:`M4 2.5h8a1 1 0 0 1 1 1v9a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1v-9a1 1 0 0 1 1-1z`}),c.createElement(`path`,{d:`M6 6h4M6 8.5h2.5`}))}function ft(e){let t=e.loaded;return t===void 0||t.length===0?null:t}function pt(e,t={}){let n=!1,r=!1,i=!1,a,o,s,c,l=new Set,u=0,d=!1,f=null,p,m=()=>{c!==void 0&&(window.clearTimeout(c),c=void 0)},h=e=>{if(o===void 0||s===void 0)return;o.hidden=!0,s.hidden=!1,s.replaceChildren();let t=document.createElement(`div`);t.textContent=`TiddlyWiki 服务不可用`;let n=document.createElement(`code`);n.textContent=e;let r=document.createElement(`button`);r.type=`button`,r.textContent=`重试`,r.addEventListener(`click`,()=>{r.disabled=!0,r.textContent=`重启中…`,ut().finally(()=>{b()})}),s.append(t,n,r)},g=()=>{if(o===void 0||s===void 0)return;o.hidden=!0,s.hidden=!1,s.replaceChildren();let e=document.createElement(`div`);e.textContent=`TiddlyWiki 服务正在启动…`,s.append(e)},_=e=>{o===void 0||s===void 0||(s.hidden=!0,o.hidden=!n,o.dataset.loaded!==e&&(o.dataset.loaded=e,d=!1,o.src=e))},v=()=>{if(f===null||o===void 0||!d)return;let e=f,t=o.contentWindow;if(t===null){y(e);return}let n=r=>{if(i||f!==e)return;let a=!1;try{let e=t;a=typeof e.$tw==`object`&&e.$tw!==null}catch{y(e);return}if(!a){if(r<40){let e=window.setTimeout(()=>{l.delete(e),n(r+1)},150);l.add(e);return}y(e);return}f=null;try{t.location.hash!==e&&(t.location.hash=e)}catch{y(e)}};n(0)},y=e=>{if(i||o===void 0)return;f===e&&(f=null);let t=ft(o.dataset);if(t===null)return;let n=`${t.split(`#`)[0]}${e}`;o.src!==n&&(o.src=n)},b=async()=>{m();let e=await ve();if(!i&&n){if(e===null){h(`无法访问 /dsh-tiddlywiki/status`);return}if(e.ui!==void 0&&(ct(e.ui.tabLabel??st),rt({enabled:e.ui.followDshTheme!==!1,darkPalette:e.ui.darkPalette})),e.status===`running`){if(u=0,typeof e.twProxy==`string`){let n=me(e.mode,t.wikiId?.(),e.twProxy,e.twProxyAbsolute);_(pe(n.relative,n.absolute))}else typeof e.url==`string`?_(e.url):h(`服务未返回编辑器地址`);return}if(e.status===`starting`){g(),u<30&&(u++,c=window.setTimeout(()=>{b()},1500));return}u=0,h(e.error??`服务状态:${e.status}`)}},x=()=>{if(o===void 0)return;let e=ft(o.dataset);e!==null&&(o.src=e)};document.addEventListener(ot,x);let S=Le(()=>{!i&&n&&b()});return{build:()=>{if(a!==void 0)return a;let t=document.createElement(`div`);if(t.className=e.view,e.viewDataset!==void 0)for(let[n,r]of Object.entries(e.viewDataset))t.dataset[n]=r;let r=document.createElement(`div`);r.className=e.frameWrap,e.frameWrapStyle!==void 0&&(r.style.cssText=e.frameWrapStyle);let i=document.createElement(`iframe`);i.className=e.frame,i.title=`TiddlyWiki`,i.hidden=!0,r.append(i);let c=document.createElement(`div`);return c.className=e.error,c.hidden=!0,t.append(r,c),a=t,o=i,s=c,i.addEventListener(`load`,()=>{d=!0,v()}),p=it(i),n&&b(),t},setVisible(e){i||(n=e,e&&!r&&(r=!0),o!==void 0&&(o.hidden=!e||ft(o.dataset)===null),e?b():(m(),u=0))},openTiddler(e){return i||!n?!1:(f=`#${encodeURIComponent(e)}`,r?v():(r=!0,b()),!0)},dispose(){if(!i){i=!0,document.removeEventListener(ot,x),S(),m();for(let e of l)window.clearTimeout(e);l.clear(),p?.(),a?.remove()}}}}function mt(){return{setVisible(){},openTiddler(){return!1},dispose(){}}}const ht=new Set;function gt(e){for(let t of ht)if(t.openTiddler(e))return!0;return!1}function _t(){ve().then(e=>{e?.ui!==void 0&&ct(e.ui.tabLabel??st)})}const vt={view:`dsh-tw-rightbar-view`,frameWrap:`dsh-tw-rightbar-frame-wrap`,frame:`dsh-tw-rightbar-frame`,error:`dsh-tw-rightbar-error`};function yt(e,t){if(t.aborted)return mt();let n=pt(vt,{wikiId:Fe});e.append(n.build());let r=!1,i=()=>a.dispose();t.addEventListener(`abort`,i,{once:!0});let a={setVisible(e){n.setVisible(e)},openTiddler(e){return n.openTiddler(e)},dispose(){r||(r=!0,ht.delete(a),t.removeEventListener(`abort`,i),n.dispose())}};return ht.add(a),a}const bt=[`[class*="centerCol"]`,`[data-pane="conversation"]`,`.dshDesktopConversationSurface`],xt=`data-dsh-tw-active`,St=[`data-dsh-atb-active`,`data-dsh-taskboard-active`,`data-dsh-ssh-active`],Ct=`dsh-tiddlywiki`,wt=`[data-dsh-panel-host]`,Tt={view:`dsh-tw-view`,viewDataset:{dshTwView:``},frameWrap:`dsh-tw-panel-frame-wrap`,frameWrapStyle:`flex:1;min-height:0;display:flex;flex-direction:column`,frame:`dsh-tw-panel-frame`,error:`dsh-tw-panel-error`},Et=`dsh-tw-open-tiddler`;function Dt(e){typeof document>`u`||typeof e!=`string`||e.length===0||document.dispatchEvent(new CustomEvent(Et,{detail:{title:e}}))}function Ot(){let e=document.querySelector(wt);if(e===null)return 40;let t=parseInt(getComputedStyle(e).zIndex,10);return Number.isFinite(t)?Math.max(20,Math.min(40,t-1)):40}function kt(){for(let e of bt){let t=document.querySelector(e);if(t!==null)return t}}function At(e){let t,n,r=!1,i,a=pt(Tt,{wikiId:Fe}),o=()=>{if(!e.isOpen()||t===void 0||n===void 0)return;let r=n.getBoundingClientRect();if(r.width===0&&r.height===0)return;let i=`${r.left}px`,a=`${r.top}px`,o=`${r.width}px`,s=`${r.height}px`;t.style.left!==i&&(t.style.left=i),t.style.top!==a&&(t.style.top=a),t.style.width!==o&&(t.style.width=o),t.style.height!==s&&(t.style.height=s)},s=(n=!1)=>{if(t===void 0)return;let r=document.querySelector(wt)!==null;!n&&!e.isOpen()&&r===i||(i=r,t.style.zIndex=String(Ot()),r?t.dataset.sidebarHost=`1`:delete t.dataset.sidebarHost)},c=()=>{(n===void 0||!n.isConnected)&&(n=kt()),t===void 0&&n!==void 0&&(t=a.build(),t.style.position=`fixed`,s(!0),document.body.append(t),o())},l=t=>{let n=t.detail,r=typeof n?.title==`string`&&n.title.length>0?n.title:``;r.length!==0&&(gt(r)||(e.openPanel(),a.openTiddler(r)))},u=()=>{if(e.isOpen()){for(let e of St)document.documentElement.removeAttribute(e);document.documentElement.setAttribute(xt,``),document.dispatchEvent(new CustomEvent(at,{detail:Ct})),m()}else document.documentElement.removeAttribute(xt);a.setVisible(e.isOpen())},d=t=>{t.detail!==Ct&&e.isOpen()&&e.closePanel()},f=t=>{if(!e.isOpen())return;let n=t.target;n!==null&&n.closest(`[data-dsh-tw-entry]`)===null&&n.closest(`[class*="sessionRow"], [class*="projectRow"], [class*="searchResultRow"], [class*="searchResultWorkspace"], [class*="newSession"]`)!==null&&e.closePanel()},p,m=()=>{r||p!==void 0||(p=window.requestAnimationFrame(()=>{p=void 0,!r&&(c(),o(),s())}))},h=new MutationObserver(()=>{m()});h.observe(document.body,{childList:!0,subtree:!0});let g=new ResizeObserver(()=>{m()});g.observe(document.body);let _=window.setInterval(o,2e3),v=()=>{m()};window.addEventListener(`resize`,v);let y=()=>{m()};window.addEventListener(`scroll`,y,!0),document.addEventListener(`click`,f,!0),document.addEventListener(at,d);let b=e.subscribe(u);return c(),u(),document.addEventListener(Et,l),()=>{r=!0,p!==void 0&&window.cancelAnimationFrame(p),p=void 0,window.clearInterval(_),window.removeEventListener(`resize`,v),window.removeEventListener(`scroll`,y,!0),g.disconnect(),document.removeEventListener(`click`,f,!0),document.removeEventListener(at,d),document.removeEventListener(Et,l),h.disconnect(),b(),document.documentElement.removeAttribute(xt),a.dispose(),t?.remove()}}function D(e){let t=document.querySelector(`.dsh-tw-toast`);t===null&&(t=document.createElement(`div`),t.className=`dsh-tw-toast`,document.body.append(t)),t.textContent=e,t.classList.add(`dsh-tw-toast-show`),clearTimeout(t.__twToastTimer),t.__twToastTimer=window.setTimeout(()=>{t?.classList.remove(`dsh-tw-toast-show`)},2500)}const jt=`dsh-tiddlywiki/editor-popup`;let O,k,Mt,Nt,Pt,Ft;function It(e,t){Ht(),!(O===void 0||k===void 0)&&(Mt!==void 0&&(Mt.textContent=`TiddlyWiki 编辑器 · ${t}`),O.style.display=``,document.dispatchEvent(new CustomEvent(at,{detail:jt})),(k.dataset.loaded!==e||Rt())&&(k.dataset.loaded=e,k.src=e),zt())}function Lt(){return O!==void 0&&O.style.display!==`none`}function Rt(){if(k===void 0)return!1;let e=null;try{e=k.contentDocument}catch{return!1}if(e===null||e.readyState===`loading`)return!1;let t=e.querySelector(`.tc-story-river`);return t===null||t.querySelector(`.tc-tiddler-frame`)===null}function zt(){O!==void 0&&O.querySelector(`button, [href], input, select, textarea, iframe, [tabindex]:not([tabindex="-1"])`)?.focus()}function Bt(){O!==void 0&&(O.style.display=`none`),k!==void 0&&(k.dataset.loaded=``)}function Vt(){Nt?.(),Nt=void 0,Pt!==void 0&&(document.removeEventListener(`keydown`,Pt),Pt=void 0),Ft!==void 0&&(document.removeEventListener(at,Ft),Ft=void 0),O?.remove(),O=void 0,k=void 0,Mt=void 0}function Ht(){if(O!==void 0&&k!==void 0)return;O=document.createElement(`div`),O.className=`dsh-tw-editor-popup`,O.style.display=`none`,O.setAttribute(`role`,`dialog`),O.setAttribute(`aria-modal`,`true`),O.setAttribute(`aria-label`,`TiddlyWiki 编辑器`);let e=document.createElement(`div`);e.className=`dsh-tw-editor-bar`,Mt=document.createElement(`span`),Mt.className=`dsh-tw-editor-title`,Mt.textContent=`TiddlyWiki 编辑器`;let t=document.createElement(`button`);t.type=`button`,t.className=`dsh-tw-editor-close`,t.textContent=`✕`,t.title=`关闭`,e.append(Mt,t),k=document.createElement(`iframe`),k.className=`dsh-tw-editor-frame`,k.setAttribute(`sandbox`,`allow-scripts allow-same-origin allow-forms allow-popups`),k.title=`TiddlyWiki 编辑器`,Nt=it(k);let n=document.createElement(`div`);n.className=`dsh-tw-editor-resize`,n.title=`拖拽调整大小`,O.append(e,k,n),document.body.append(O),t.addEventListener(`click`,()=>Bt()),Pt=e=>{e.key===`Escape`&&Lt()&&Bt()},document.addEventListener(`keydown`,Pt),Ft=e=>{e.detail!==jt&&Lt()&&Bt()},document.addEventListener(at,Ft),e.addEventListener(`pointerdown`,n=>{if(n.button!==0||O===void 0)return;let r=n.target;if(t.contains(r))return;n.preventDefault(),e.setPointerCapture(n.pointerId);let i=O.getBoundingClientRect(),a=n.clientX,o=n.clientY,s=i.left,c=i.top,l=e=>{O!==void 0&&(O.style.left=`${s+e.clientX-a}px`,O.style.top=`${c+e.clientY-o}px`,O.style.margin=`0`,O.style.right=`auto`,O.style.bottom=`auto`)},u=()=>{e.removeEventListener(`pointermove`,l),e.removeEventListener(`pointerup`,u),e.removeEventListener(`pointercancel`,u)};e.addEventListener(`pointermove`,l),e.addEventListener(`pointerup`,u),e.addEventListener(`pointercancel`,u)}),n.addEventListener(`pointerdown`,e=>{if(e.button!==0||O===void 0)return;e.preventDefault(),e.stopPropagation(),n.setPointerCapture(e.pointerId);let t=O.getBoundingClientRect(),r=e.clientX,i=e.clientY,a=t.width,o=t.height,s=e=>{O!==void 0&&(O.style.width=`${Math.max(360,a+e.clientX-r)}px`,O.style.height=`${Math.max(260,o+e.clientY-i)}px`,O.style.right=`auto`,O.style.bottom=`auto`)},c=()=>{n.removeEventListener(`pointermove`,s),n.removeEventListener(`pointerup`,c),n.removeEventListener(`pointercancel`,c)};n.addEventListener(`pointermove`,s),n.addEventListener(`pointerup`,c),n.addEventListener(`pointercancel`,c)})}let Ut=[],Wt=[];(()=>{let e=`lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,1n,9,16,o,,x,1i,3,,i,,7,a,2,t,3,1k,,,7,2,2,2,3,9,,a,2,q,,2,3,1k,,,5,4,2,2,3,3,,u,2,3,,b,3,1k,,,8,,3,,3,k,2,m,6,,3,1k,,,7,2,2,2,3,7,3,a,2,u,,1n,5,3,3,,4,9,,14,5,1j,,,7,,3,,4,7,2,b,2,t,3,1k,,,7,,3,,4,7,2,b,2,f,,c,4,1j,2,,7,,3,,4,9,,a,2,t,3,1y,,4,6,,,,8,i,2,1p,,,8,c,8,2q,,,a,b,7,21,2,r,,,,,,4,2,1d,k,,2,5,b,,10,9,,2u,b,,6,n,4,4,3,g,4,d,,,3,6,,f,,jj,3,qa,4,s,3,t,2,u,2,1s,w,9,,19,3,,,39,2,y,,3a,c,4,c,63,5,1l,a,,,,,2,o,2,,1c,1a,2,c,k,5,1b,h,12,9,c,3,u,d,1k,e,1c,k,48,3,,l,4,,6,,2,3,5i,1s,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,n,5,4,,2b,2,1e,i,q,i,d,,12,8,p,d,18,4,1b,e,10,,1v,e,c,,8,2,1a,,1f,,,3,2,2,5,2,,,15,5,5,2,6k,8,,2,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,1t,5,8t,2,25,6,1y,b,1d,4,3e,3,1h,f,15,,2,2,a,4,19,b,7,,1p,3,10,e,g,2,18,,c,3,1c,e,8,4,,2,2k,c,6,,2,,4d,c,l,4,1j,2,,7,2,2,2,3,9,,a,2,2,7,3,5,1v,9,,,2,,,4,,5,,,e,2,2a,i,n,,29,k,6j,7,2,9,r,2,2a,h,2y,d,2t,3,2,a,74,f,6t,6,,2,2,4,,,,2,3x,7,2,7,3,,s,a,14,7,,4,8,,9,b,1a,g,5i,8,5j,8,,8,2a,m,,e,3e,6,3,,,2,,7,,,1u,5,,2,,5,9n,4,9,2,,,1c,7,3,5,n,,44l,,6,f,8ug,i,1xc,5,1n,7,t4,,,1j,7,4,29,,b,2,f57,2,3mp,1a,2,n,f2,5,3,6,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,2s,,4g,7,af,,1p,4,e4,4,72,2,6r,,2,,7,2,5,,d6,7,31,7,240,5`.split(`,`).map(e=>e?parseInt(e,36):1);for(let t=0,n=0;t<e.length;t++)(t%2?Wt:Ut).push(n+=e[t])})();function Gt(e){if(e<768)return!1;for(let t=0,n=Ut.length;;){let r=t+n>>1;if(e<Ut[r])n=r;else if(e>=Wt[r])t=r+1;else return!0;if(t==n)return!1}}function Kt(e){return e>=127462&&e<=127487}const qt=8205;function Jt(e,t,n=!0,r=!0){return(n?Yt:Xt)(e,t,r)}function Yt(e,t,n){if(t==e.length)return t;t&&Qt(e.charCodeAt(t))&&$t(e.charCodeAt(t-1))&&t--;let r=Zt(e,t);for(t+=en(r);t<e.length;){let i=Zt(e,t);if(r==qt||i==qt||n&&Gt(i))t+=en(i),r=i;else if(Kt(i)){let n=0,r=t-2;for(;r>=0&&Kt(Zt(e,r));)n++,r-=2;if(n%2==0)break;t+=2}else break}return t}function Xt(e,t,n){for(;t>1;){let r=Yt(e,t-2,n);if(r<t)return r;t--}return 0}function Zt(e,t){let n=e.charCodeAt(t);if(!$t(n)||t+1==e.length)return n;let r=e.charCodeAt(t+1);return Qt(r)?(n-55296<<10)+(r-56320)+65536:n}function Qt(e){return e>=56320&&e<57344}function $t(e){return e>=55296&&e<56320}function en(e){return e<65536?1:2}var A=class e{lineAt(e){if(e<0||e>this.length)throw RangeError(`Invalid position ${e} in document of length ${this.length}`);return this.lineInner(e,!1,1,0)}line(e){if(e<1||e>this.lines)throw RangeError(`Invalid line number ${e} in ${this.lines}-line document`);return this.lineInner(e,!0,1,0)}replace(e,t,n){[e,t]=dn(this,e,t);let r=[];return this.decompose(0,e,r,2),n.length&&n.decompose(0,n.length,r,3),this.decompose(t,this.length,r,1),nn.from(r,this.length-(t-e)+n.length)}append(e){return this.replace(this.length,this.length,e)}slice(e,t=this.length){[e,t]=dn(this,e,t);let n=[];return this.decompose(e,t,n,0),nn.from(n,t-e)}eq(e){if(e==this)return!0;if(e.length!=this.length||e.lines!=this.lines)return!1;let t=this.scanIdentical(e,1),n=this.length-this.scanIdentical(e,-1),r=new sn(this),i=new sn(e);for(let e=t,a=t;;){if(r.next(e),i.next(e),e=0,r.lineBreak!=i.lineBreak||r.done!=i.done||r.value!=i.value)return!1;if(a+=r.value.length,r.done||a>=n)return!0}}iter(e=1){return new sn(this,e)}iterRange(e,t=this.length){return new cn(this,e,t)}iterLines(e,t){let n;if(e==null)n=this.iter();else{t??=this.lines+1;let r=this.line(e).from;n=this.iterRange(r,Math.max(r,t==this.lines+1?this.length:t<=1?0:this.line(t-1).to))}return new ln(n)}toString(){return this.sliceString(0)}toJSON(){let e=[];return this.flatten(e),e}constructor(){}static of(t){if(t.length==0)throw RangeError(`A document must have at least one line`);return t.length==1&&!t[0]?e.empty:t.length<=32?new tn(t):nn.from(tn.split(t,[]))}},tn=class e extends A{constructor(e,t=rn(e)){super(),this.text=e,this.length=t}get lines(){return this.text.length}get children(){return null}lineInner(e,t,n,r){for(let i=0;;i++){let a=this.text[i],o=r+a.length;if((t?n:o)>=e)return new un(r,o,n,a);r=o+1,n++}}decompose(t,n,r,i){let a=t<=0&&n>=this.length?this:new e(on(this.text,t,n),Math.min(n,this.length)-Math.max(0,t));if(i&1){let t=r.pop(),n=an(a.text,t.text.slice(),0,a.length);if(n.length<=32)r.push(new e(n,t.length+a.length));else{let t=n.length>>1;r.push(new e(n.slice(0,t)),new e(n.slice(t)))}}else r.push(a)}replace(t,n,r){if(!(r instanceof e))return super.replace(t,n,r);[t,n]=dn(this,t,n);let i=an(this.text,an(r.text,on(this.text,0,t)),n),a=this.length+r.length-(n-t);return i.length<=32?new e(i,a):nn.from(e.split(i,[]),a)}sliceString(e,t=this.length,n=`
|
|
771
771
|
`){[e,t]=dn(this,e,t);let r=``;for(let i=0,a=0;i<=t&&a<this.text.length;a++){let o=this.text[a],s=i+o.length;i>e&&a&&(r+=n),e<s&&t>i&&(r+=o.slice(Math.max(0,e-i),t-i)),i=s+1}return r}flatten(e){for(let t of this.text)e.push(t)}scanIdentical(){return 0}static split(t,n){let r=[],i=-1;for(let a of t)r.push(a),i+=a.length+1,r.length==32&&(n.push(new e(r,i)),r=[],i=-1);return i>-1&&n.push(new e(r,i)),n}},nn=class e extends A{constructor(e,t){super(),this.children=e,this.length=t,this.lines=0;for(let t of e)this.lines+=t.lines}lineInner(e,t,n,r){for(let i=0;;i++){let a=this.children[i],o=r+a.length,s=n+a.lines-1;if((t?s:o)>=e)return a.lineInner(e,t,n,r);r=o+1,n=s+1}}decompose(e,t,n,r){for(let i=0,a=0;a<=t&&i<this.children.length;i++){let o=this.children[i],s=a+o.length;if(e<=s&&t>=a){let i=r&(a<=e|(s>=t?2:0));a>=e&&s<=t&&!i?n.push(o):o.decompose(e-a,t-a,n,i)}a=s+1}}replace(t,n,r){if([t,n]=dn(this,t,n),r.lines<this.lines)for(let i=0,a=0;i<this.children.length;i++){let o=this.children[i],s=a+o.length;if(t>=a&&n<=s){let c=o.replace(t-a,n-a,r),l=this.lines-o.lines+c.lines;if(c.lines<l>>4&&c.lines>l>>6){let a=this.children.slice();return a[i]=c,new e(a,this.length-(n-t)+r.length)}return super.replace(a,s,c)}a=s+1}return super.replace(t,n,r)}sliceString(e,t=this.length,n=`
|
|
772
772
|
`){[e,t]=dn(this,e,t);let r=``;for(let i=0,a=0;i<this.children.length&&a<=t;i++){let o=this.children[i],s=a+o.length;a>e&&i&&(r+=n),e<s&&t>a&&(r+=o.sliceString(e-a,t-a,n)),a=s+1}return r}flatten(e){for(let t of this.children)t.flatten(e)}scanIdentical(t,n){if(!(t instanceof e))return 0;let r=0,[i,a,o,s]=n>0?[0,0,this.children.length,t.children.length]:[this.children.length-1,t.children.length-1,-1,-1];for(;;i+=n,a+=n){if(i==o||a==s)return r;let e=this.children[i],c=t.children[a];if(e!=c)return r+e.scanIdentical(c,n);r+=e.length+1}}static from(t,n=t.reduce((e,t)=>e+t.length+1,-1)){let r=0;for(let e of t)r+=e.lines;if(r<32){let e=[];for(let n of t)n.flatten(e);return new tn(e,n)}let i=Math.max(32,r>>5),a=i<<1,o=i>>1,s=[],c=0,l=-1,u=[];function d(t){let n;if(t.lines>a&&t instanceof e)for(let e of t.children)d(e);else t.lines>o&&(c>o||!c)?(f(),s.push(t)):t instanceof tn&&c&&(n=u[u.length-1])instanceof tn&&t.lines+n.lines<=32?(c+=t.lines,l+=t.length+1,u[u.length-1]=new tn(n.text.concat(t.text),n.length+1+t.length)):(c+t.lines>i&&f(),c+=t.lines,l+=t.length+1,u.push(t))}function f(){c!=0&&(s.push(u.length==1?u[0]:e.from(u,l)),l=-1,c=u.length=0)}for(let e of t)d(e);return f(),s.length==1?s[0]:new e(s,n)}};A.empty=new tn([``],0);function rn(e){let t=-1;for(let n of e)t+=n.length+1;return t}function an(e,t,n=0,r=1e9){for(let i=0,a=0,o=!0;a<e.length&&i<=r;a++){let s=e[a],c=i+s.length;c>=n&&(c>r&&(s=s.slice(0,r-i)),i<n&&(s=s.slice(n-i)),o?(t[t.length-1]+=s,o=!1):t.push(s)),i=c+1}return t}function on(e,t,n){return an(e,[``],t,n)}var sn=class{constructor(e,t=1){this.dir=t,this.done=!1,this.lineBreak=!1,this.value=``,this.nodes=[e],this.offsets=[t>0?1:(e instanceof tn?e.text.length:e.children.length)<<1]}nextInner(e,t){for(this.done=this.lineBreak=!1;;){let n=this.nodes.length-1,r=this.nodes[n],i=this.offsets[n],a=i>>1,o=r instanceof tn?r.text.length:r.children.length;if(a==(t>0?o:0)){if(n==0)return this.done=!0,this.value=``,this;t>0&&this.offsets[n-1]++,this.nodes.pop(),this.offsets.pop()}else if((i&1)==(t>0?0:1)){if(this.offsets[n]+=t,e==0)return this.lineBreak=!0,this.value=`
|
|
773
773
|
`,this;e--}else if(r instanceof tn){let i=r.text[a+(t<0?-1:0)];if(this.offsets[n]+=t,i.length>Math.max(0,e))return this.value=e==0?i:t>0?i.slice(e):i.slice(0,i.length-e),this;e-=i.length}else{let i=r.children[a+(t<0?-1:0)];e>i.length?(e-=i.length,this.offsets[n]+=t):(t<0&&this.offsets[n]--,this.nodes.push(i),this.offsets.push(t>0?1:(i instanceof tn?i.text.length:i.children.length)<<1))}}}next(e=0){return e<0&&(this.nextInner(-e,-this.dir),e=this.value.length),this.nextInner(e,this.dir)}},cn=class{constructor(e,t,n){this.value=``,this.done=!1,this.cursor=new sn(e,t>n?-1:1),this.pos=t>n?e.length:0,this.from=Math.min(t,n),this.to=Math.max(t,n)}nextInner(e,t){if(t<0?this.pos<=this.from:this.pos>=this.to)return this.value=``,this.done=!0,this;e+=Math.max(0,t<0?this.pos-this.to:this.from-this.pos);let n=t<0?this.pos-this.from:this.to-this.pos;e>n&&(e=n),n-=e;let{value:r}=this.cursor.next(e);return this.pos+=(r.length+e)*t,this.value=r.length<=n?r:t<0?r.slice(r.length-n):r.slice(0,n),this.done=!this.value,this}next(e=0){return e<0?e=Math.max(e,this.from-this.pos):e>0&&(e=Math.min(e,this.to-this.pos)),this.nextInner(e,this.cursor.dir)}get lineBreak(){return this.cursor.lineBreak&&this.value!=``}},ln=class{constructor(e){this.inner=e,this.afterBreak=!0,this.value=``,this.done=!1}next(e=0){let{done:t,lineBreak:n,value:r}=this.inner.next(e);return t&&this.afterBreak?(this.value=``,this.afterBreak=!1):t?(this.done=!0,this.value=``):n?this.afterBreak?this.value=``:(this.afterBreak=!0,this.next()):(this.value=r,this.afterBreak=!1),this}get lineBreak(){return!1}};typeof Symbol<`u`&&(A.prototype[Symbol.iterator]=function(){return this.iter()},sn.prototype[Symbol.iterator]=cn.prototype[Symbol.iterator]=ln.prototype[Symbol.iterator]=function(){return this});var un=class{constructor(e,t,n,r){this.from=e,this.to=t,this.number=n,this.text=r}get length(){return this.to-this.from}};function dn(e,t,n){return t=Math.max(0,Math.min(e.length,t)),[t,Math.max(t,Math.min(e.length,n))]}function fn(e,t,n=!0,r=!0){return Jt(e,t,n,r)}function pn(e){return e>=56320&&e<57344}function mn(e){return e>=55296&&e<56320}function hn(e,t){let n=e.charCodeAt(t);if(!mn(n)||t+1==e.length)return n;let r=e.charCodeAt(t+1);return pn(r)?(n-55296<<10)+(r-56320)+65536:n}function gn(e){return e<65536?1:2}const _n=/\r\n?|\n/;var vn=(function(e){return e[e.Simple=0]=`Simple`,e[e.TrackDel=1]=`TrackDel`,e[e.TrackBefore=2]=`TrackBefore`,e[e.TrackAfter=3]=`TrackAfter`,e})(vn||={}),yn=class e{constructor(e){this.sections=e}get length(){let e=0;for(let t=0;t<this.sections.length;t+=2)e+=this.sections[t];return e}get newLength(){let e=0;for(let t=0;t<this.sections.length;t+=2){let n=this.sections[t+1];e+=n<0?this.sections[t]:n}return e}get empty(){return this.sections.length==0||this.sections.length==2&&this.sections[1]<0}iterGaps(e){for(let t=0,n=0,r=0;t<this.sections.length;){let i=this.sections[t++],a=this.sections[t++];a<0?(e(n,r,i),r+=i):r+=a,n+=i}}iterChangedRanges(e,t=!1){Cn(this,e,t)}get invertedDesc(){let t=[];for(let e=0;e<this.sections.length;){let n=this.sections[e++],r=this.sections[e++];r<0?t.push(n,r):t.push(r,n)}return new e(t)}composeDesc(e){return this.empty?e:e.empty?this:Tn(this,e)}mapDesc(e,t=!1){return e.empty?this:wn(this,e,t)}mapPos(e,t=-1,n=vn.Simple){let r=0,i=0;for(let a=0;a<this.sections.length;){let o=this.sections[a++],s=this.sections[a++],c=r+o;if(s<0){if(c>e)return i+(e-r);i+=o}else{if(n!=vn.Simple&&c>=e&&(n==vn.TrackDel&&r<e&&c>e||n==vn.TrackBefore&&r<e||n==vn.TrackAfter&&c>e))return null;if(c>e||c==e&&t<0&&!o)return e==r||t<0?i:i+s;i+=s}r=c}if(e>r)throw RangeError(`Position ${e} is out of range for changeset of length ${r}`);return i}touchesRange(e,t=e){for(let n=0,r=0;n<this.sections.length&&r<=t;){let i=this.sections[n++],a=this.sections[n++],o=r+i;if(a>=0&&r<=t&&o>=e)return r<e&&o>t?`cover`:!0;r=o}return!1}toString(){let e=``;for(let t=0;t<this.sections.length;){let n=this.sections[t++],r=this.sections[t++];e+=(e?` `:``)+n+(r>=0?`:`+r:``)}return e}toJSON(){return this.sections}static fromJSON(t){if(!Array.isArray(t)||t.length%2||t.some(e=>typeof e!=`number`))throw RangeError(`Invalid JSON representation of ChangeDesc`);return new e(t)}static create(t){return new e(t)}},bn=class e extends yn{constructor(e,t){super(e),this.inserted=t}apply(e){if(this.length!=e.length)throw RangeError(`Applying change set to a document with the wrong length`);return Cn(this,(t,n,r,i,a)=>e=e.replace(r,r+(n-t),a),!1),e}mapDesc(e,t=!1){return wn(this,e,t,!0)}invert(t){let n=this.sections.slice(),r=[];for(let e=0,i=0;e<n.length;e+=2){let a=n[e],o=n[e+1];if(o>=0){n[e]=o,n[e+1]=a;let s=e>>1;for(;r.length<s;)r.push(A.empty);r.push(a?t.slice(i,i+a):A.empty)}i+=a}return new e(n,r)}compose(e){return this.empty?e:e.empty?this:Tn(this,e,!0)}map(e,t=!1){return e.empty?this:wn(this,e,t,!0)}iterChanges(e,t=!1){Cn(this,e,t)}get desc(){return yn.create(this.sections)}filter(t){let n=[],r=[],i=[],a=new En(this);done:for(let e=0,o=0;;){let s=e==t.length?1e9:t[e++];for(;o<s||o==s&&a.len==0;){if(a.done)break done;let e=Math.min(a.len,s-o);xn(i,e,-1);let t=a.ins==-1?-1:a.off==0?a.ins:0;xn(n,e,t),t>0&&Sn(r,n,a.text),a.forward(e),o+=e}let c=t[e++];for(;o<c;){if(a.done)break done;let e=Math.min(a.len,c-o);xn(n,e,-1),xn(i,e,a.ins==-1?-1:a.off==0?a.ins:0),a.forward(e),o+=e}}return{changes:new e(n,r),filtered:yn.create(i)}}toJSON(){let e=[];for(let t=0;t<this.sections.length;t+=2){let n=this.sections[t],r=this.sections[t+1];r<0?e.push(n):r==0?e.push([n]):e.push([n].concat(this.inserted[t>>1].toJSON()))}return e}static of(t,n,r){let i=[],a=[],o=0,s=null;function c(t=!1){if(!t&&!i.length)return;o<n&&xn(i,n-o,-1);let r=new e(i,a);s=s?s.compose(r.map(s)):r,i=[],a=[],o=0}function l(t){if(Array.isArray(t))for(let e of t)l(e);else if(t instanceof e){if(t.length!=n)throw RangeError(`Mismatched change set length (got ${t.length}, expected ${n})`);c(),s=s?s.compose(t.map(s)):t}else{let{from:e,to:s=e,insert:l}=t;if(e>s||e<0||s>n)throw RangeError(`Invalid change range ${e} to ${s} (in doc of length ${n})`);let u=l?typeof l==`string`?A.of(l.split(r||_n)):l:A.empty,d=u.length;if(e==s&&d==0)return;e<o&&c(),e>o&&xn(i,e-o,-1),xn(i,s-e,d),Sn(a,i,u),o=s}}return l(t),c(!s),s}static empty(t){return new e(t?[t,-1]:[],[])}static fromJSON(t){if(!Array.isArray(t))throw RangeError(`Invalid JSON representation of ChangeSet`);let n=[],r=[];for(let e=0;e<t.length;e++){let i=t[e];if(typeof i==`number`)n.push(i,-1);else if(!Array.isArray(i)||typeof i[0]!=`number`||i.some((e,t)=>t&&typeof e!=`string`))throw RangeError(`Invalid JSON representation of ChangeSet`);else if(i.length==1)n.push(i[0],0);else{for(;r.length<e;)r.push(A.empty);r[e]=A.of(i.slice(1)),n.push(i[0],r[e].length)}}return new e(n,r)}static createSet(t,n){return new e(t,n)}};function xn(e,t,n,r=!1){if(t==0&&n<=0)return;let i=e.length-2;i>=0&&n<=0&&n==e[i+1]?e[i]+=t:i>=0&&t==0&&e[i]==0?e[i+1]+=n:r?(e[i]+=t,e[i+1]+=n):e.push(t,n)}function Sn(e,t,n){if(n.length==0)return;let r=t.length-2>>1;if(r<e.length)e[e.length-1]=e[e.length-1].append(n);else{for(;e.length<r;)e.push(A.empty);e.push(n)}}function Cn(e,t,n){let r=e.inserted;for(let i=0,a=0,o=0;o<e.sections.length;){let s=e.sections[o++],c=e.sections[o++];if(c<0)i+=s,a+=s;else{let l=i,u=a,d=A.empty;for(;l+=s,u+=c,c&&r&&(d=d.append(r[o-2>>1])),!(n||o==e.sections.length||e.sections[o+1]<0);)s=e.sections[o++],c=e.sections[o++];t(i,l,a,u,d),i=l,a=u}}}function wn(e,t,n,r=!1){let i=[],a=r?[]:null,o=new En(e),s=new En(t);for(let e=-1;;)if(o.done&&s.len||s.done&&o.len)throw Error(`Mismatched change set lengths`);else if(o.ins==-1&&s.ins==-1){let e=Math.min(o.len,s.len);xn(i,e,-1),o.forward(e),s.forward(e)}else if(s.ins>=0&&(o.ins<0||e==o.i||o.off==0&&(s.len<o.len||s.len==o.len&&!n))){let t=s.len;for(xn(i,s.ins,-1);t;){let n=Math.min(o.len,t);o.ins>=0&&e<o.i&&o.len<=n&&(xn(i,0,o.ins),a&&Sn(a,i,o.text),e=o.i),o.forward(n),t-=n}s.next()}else if(o.ins>=0){let t=0,n=o.len;for(;n;)if(s.ins==-1){let e=Math.min(n,s.len);t+=e,n-=e,s.forward(e)}else if(s.ins==0&&s.len<n)n-=s.len,s.next();else break;xn(i,t,e<o.i?o.ins:0),a&&e<o.i&&Sn(a,i,o.text),e=o.i,o.forward(o.len-n)}else if(o.done&&s.done)return a?bn.createSet(i,a):yn.create(i);else throw Error(`Mismatched change set lengths`)}function Tn(e,t,n=!1){let r=[],i=n?[]:null,a=new En(e),o=new En(t);for(let e=!1;;)if(a.done&&o.done)return i?bn.createSet(r,i):yn.create(r);else if(a.ins==0)xn(r,a.len,0,e),a.next();else if(o.len==0&&!o.done)xn(r,0,o.ins,e),i&&Sn(i,r,o.text),o.next();else if(a.done||o.done)throw Error(`Mismatched change set lengths`);else{let t=Math.min(a.len2,o.len),n=r.length;if(a.ins==-1){let n=o.ins==-1?-1:o.off?0:o.ins;xn(r,t,n,e),i&&n&&Sn(i,r,o.text)}else o.ins==-1?(xn(r,a.off?0:a.len,t,e),i&&Sn(i,r,a.textBit(t))):(xn(r,a.off?0:a.len,o.off?0:o.ins,e),i&&!o.off&&Sn(i,r,o.text));e=(a.ins>t||o.ins>=0&&o.len>t)&&(e||r.length>n),a.forward2(t),o.forward(t)}}var En=class{constructor(e){this.set=e,this.i=0,this.next()}next(){let{sections:e}=this.set;this.i<e.length?(this.len=e[this.i++],this.ins=e[this.i++]):(this.len=0,this.ins=-2),this.off=0}get done(){return this.ins==-2}get len2(){return this.ins<0?this.len:this.ins}get text(){let{inserted:e}=this.set,t=this.i-2>>1;return t>=e.length?A.empty:e[t]}textBit(e){let{inserted:t}=this.set,n=this.i-2>>1;return n>=t.length&&!e?A.empty:t[n].slice(this.off,e==null?void 0:this.off+e)}forward(e){e==this.len?this.next():(this.len-=e,this.off+=e)}forward2(e){this.ins==-1?this.forward(e):e==this.ins?this.next():(this.ins-=e,this.off+=e)}},Dn=class e{constructor(e,t,n,r){this.from=e,this.to=t,this.flags=n,this.goalColumn=r}get anchor(){return this.flags&32?this.to:this.from}get head(){return this.flags&32?this.from:this.to}get empty(){return this.from==this.to}get assoc(){return this.flags&8?-1:this.flags&16?1:0}get undirectional(){return(this.flags&64)>0}get bidiLevel(){let e=this.flags&7;return e==7?null:e}map(t,n=-1){let r,i;return this.empty?r=i=t.mapPos(this.from,n):(r=t.mapPos(this.from,1),i=t.mapPos(this.to,-1)),r==this.from&&i==this.to?this:new e(r,i,this.flags,this.goalColumn)}extend(e,t=e,n=0){if(e<=this.anchor&&t>=this.anchor)return j.range(e,t,void 0,void 0,n);let r=Math.abs(e-this.anchor)>Math.abs(t-this.anchor)?e:t;return j.range(this.anchor,r,void 0,void 0,n)}eq(e,t=!1){return this.anchor==e.anchor&&this.head==e.head&&this.goalColumn==e.goalColumn&&(!t||!this.empty||this.assoc==e.assoc)}toJSON(){return{anchor:this.anchor,head:this.head}}static fromJSON(e){if(!e||typeof e.anchor!=`number`||typeof e.head!=`number`)throw RangeError(`Invalid JSON representation for SelectionRange`);return j.range(e.anchor,e.head)}static create(t,n,r,i){return new e(t,n,r,i)}},j=class e{constructor(e,t){this.ranges=e,this.mainIndex=t}map(t,n=-1){return t.empty?this:e.create(this.ranges.map(e=>e.map(t,n)),this.mainIndex)}eq(e,t=!1){if(this.ranges.length!=e.ranges.length||this.mainIndex!=e.mainIndex)return!1;for(let n=0;n<this.ranges.length;n++)if(!this.ranges[n].eq(e.ranges[n],t))return!1;return!0}get main(){return this.ranges[this.mainIndex]}asSingle(){return this.ranges.length==1?this:new e([this.main],0)}addRange(t,n=!0){return e.create([t].concat(this.ranges),n?0:this.mainIndex+1)}replaceRange(t,n=this.mainIndex){let r=this.ranges.slice();return r[n]=t,e.create(r,this.mainIndex)}toJSON(){return{ranges:this.ranges.map(e=>e.toJSON()),main:this.mainIndex}}static fromJSON(t){if(!t||!Array.isArray(t.ranges)||typeof t.main!=`number`||t.main>=t.ranges.length)throw RangeError(`Invalid JSON representation for EditorSelection`);return new e(t.ranges.map(e=>Dn.fromJSON(e)),t.main)}static single(t,n=t){return new e([e.range(t,n)],0)}static create(t,n=0){if(t.length==0)throw RangeError(`A selection needs at least one range`);for(let r=0,i=0;i<t.length;i++){let a=t[i];if(a.empty?a.from<=r:a.from<r)return e.normalized(t.slice(),n);r=a.to}return new e(t,n)}static cursor(e,t=0,n,r){return Dn.create(e,e,(t==0?0:t<0?8:16)|(n==null?7:Math.min(6,n)),r)}static range(e,t,n,r,i){let a=r==null?7:Math.min(6,r);return!i&&e!=t&&(i=t<e?1:-1),i&&(a|=i<0?8:16),t<e?Dn.create(t,e,a|32,n):Dn.create(e,t,a,n)}static undirectionalRange(e,t){return Dn.create(e,t,64,void 0)}static normalized(t,n=0){let r=t[n];t.sort((e,t)=>e.from-t.from),n=t.indexOf(r);for(let r=1;r<t.length;r++){let i=t[r],a=t[r-1];if(i.empty?i.from<=a.to:i.from<a.to){let o=a.from,s=Math.max(i.to,a.to);r<=n&&n--,t.splice(--r,2,i.anchor>i.head?e.range(s,o):e.range(o,s))}}return new e(t,n)}};function On(e,t){for(let n of e.ranges)if(n.to>t)throw RangeError(`Selection points outside of document`)}let kn=0;var M=class e{constructor(e,t,n,r,i){this.combine=e,this.compareInput=t,this.compare=n,this.isStatic=r,this.id=kn++,this.default=e([]),this.extensions=typeof i==`function`?i(this):i}get reader(){return this}static define(t={}){return new e(t.combine||(e=>e),t.compareInput||((e,t)=>e===t),t.compare||(t.combine?(e,t)=>e===t:An),!!t.static,t.enables)}of(e){return new jn([],this,0,e)}compute(e,t){if(this.isStatic)throw Error(`Can't compute a static facet`);return new jn(e,this,1,t)}computeN(e,t){if(this.isStatic)throw Error(`Can't compute a static facet`);return new jn(e,this,2,t)}from(e,t){return t||=e=>e,this.compute([e],n=>t(n.field(e)))}};function An(e,t){return e==t||e.length==t.length&&e.every((e,n)=>e===t[n])}var jn=class{constructor(e,t,n,r){this.dependencies=e,this.facet=t,this.type=n,this.value=r,this.id=kn++}dynamicSlot(e){let t=this.value,n=this.facet.compareInput,r=this.id,i=e[r]>>1,a=this.type==2,o=!1,s=!1,c=[];for(let t of this.dependencies)t==`doc`?o=!0:t==`selection`?s=!0:(e[t.id]??1)&1||c.push(e[t.id]);return{create(e){return e.values[i]=t(e),1},update(e,r){if(o&&r.docChanged||s&&(r.docChanged||r.selection)||Nn(e,c)){let r=t(e);if(a?!Mn(r,e.values[i],n):!n(r,e.values[i]))return e.values[i]=r,1}return 0},reconfigure:(e,o)=>{let s,c=o.config.address[r];if(c!=null){let r=Kn(o,c);if(this.dependencies.every(t=>t instanceof M?o.facet(t)===e.facet(t):t instanceof In?o.field(t,!1)==e.field(t,!1):!0)||(a?Mn(s=t(e),r,n):n(s=t(e),r)))return e.values[i]=r,0}else s=t(e);return e.values[i]=s,1}}}get extension(){return this}};function Mn(e,t,n){if(e.length!=t.length)return!1;for(let r=0;r<e.length;r++)if(!n(e[r],t[r]))return!1;return!0}function Nn(e,t){let n=!1;for(let r of t)Gn(e,r)&1&&(n=!0);return n}function Pn(e,t,n){let r=n.map(t=>e[t.id]),i=n.map(e=>e.type),a=r.filter(e=>!(e&1)),o=e[t.id]>>1;function s(e){let n=[];for(let t=0;t<r.length;t++){let a=Kn(e,r[t]);if(i[t]==2)for(let e of a)n.push(e);else n.push(a)}return t.combine(n)}return{create(e){for(let t of r)Gn(e,t);return e.values[o]=s(e),1},update(e,n){if(!Nn(e,a))return 0;let r=s(e);return t.compare(r,e.values[o])?0:(e.values[o]=r,1)},reconfigure(e,i){let a=Nn(e,r),c=i.config.facets[t.id],l=i.facet(t);if(c&&!a&&An(n,c))return e.values[o]=l,0;let u=s(e);return t.compare(u,l)?(e.values[o]=l,0):(e.values[o]=u,1)}}}const Fn=M.define({static:!0});var In=class e{constructor(e,t,n,r,i){this.id=e,this.createF=t,this.updateF=n,this.compareF=r,this.spec=i,this.provides=void 0}static define(t){let n=new e(kn++,t.create,t.update,t.compare||((e,t)=>e===t),t);return t.provide&&(n.provides=t.provide(n)),n}create(e){return(e.facet(Fn).find(e=>e.field==this)?.create||this.createF)(e)}slot(e){let t=e[this.id]>>1;return{create:e=>(e.values[t]=this.create(e),1),update:(e,n)=>{let r=e.values[t],i=this.updateF(r,n);return this.compareF(r,i)?0:(e.values[t]=i,1)},reconfigure:(e,n)=>{let r=e.facet(Fn),i=n.facet(Fn),a;return(a=r.find(e=>e.field==this))&&a!=i.find(e=>e.field==this)?(e.values[t]=a.create(e),1):n.config.address[this.id]==null?(e.values[t]=this.create(e),1):(e.values[t]=n.field(this),0)}}}init(e){return[this,Fn.of({field:this,create:e})]}get extension(){return this}};const Ln={lowest:4,low:3,default:2,high:1,highest:0};function Rn(e){return t=>new Bn(t,e)}const zn={highest:Rn(Ln.highest),high:Rn(Ln.high),default:Rn(Ln.default),low:Rn(Ln.low),lowest:Rn(Ln.lowest)};var Bn=class{constructor(e,t){this.inner=e,this.prec=t}get extension(){return this}},Vn=class e{of(e){return new Hn(this,e)}reconfigure(t){return e.reconfigure.of({compartment:this,extension:t})}get(e){return e.config.compartments.get(this)}},Hn=class{constructor(e,t){this.compartment=e,this.inner=t}get extension(){return this}},Un=class e{constructor(e,t,n,r,i,a){for(this.base=e,this.compartments=t,this.dynamicSlots=n,this.address=r,this.staticValues=i,this.facets=a,this.statusTemplate=[];this.statusTemplate.length<n.length;)this.statusTemplate.push(0)}staticFacet(e){let t=this.address[e.id];return t==null?e.default:this.staticValues[t>>1]}static resolve(t,n,r){let i=[],a=Object.create(null),o=new Map;for(let e of Wn(t,n,o))e instanceof In?i.push(e):(a[e.facet.id]||(a[e.facet.id]=[])).push(e);let s=Object.create(null),c=[],l=[];for(let e of i)s[e.id]=l.length<<1,l.push(t=>e.slot(t));let u=r?.config.facets;for(let e in a){let t=a[e],n=t[0].facet,i=u&&u[e]||[];if(t.every(e=>e.type==0))if(s[n.id]=c.length<<1|1,An(i,t))c.push(r.facet(n));else{let e=n.combine(t.map(e=>e.value));c.push(r&&n.compare(e,r.facet(n))?r.facet(n):e)}else{for(let e of t)e.type==0?(s[e.id]=c.length<<1|1,c.push(e.value)):(s[e.id]=l.length<<1,l.push(t=>e.dynamicSlot(t)));s[n.id]=l.length<<1,l.push(e=>Pn(e,n,t))}}let d=l.map(e=>e(s));return new e(t,o,d,s,c,a)}};function Wn(e,t,n){let r=[[],[],[],[],[]],i=new Map;function a(e,o){let s=i.get(e);if(s!=null){if(s<=o)return;let t=r[s].indexOf(e);t>-1&&r[s].splice(t,1),e instanceof Hn&&n.delete(e.compartment)}if(i.set(e,o),Array.isArray(e))for(let t of e)a(t,o);else if(e instanceof Hn){if(n.has(e.compartment))throw RangeError(`Duplicate use of compartment in extensions`);let r=t.get(e.compartment)||e.inner;n.set(e.compartment,r),a(r,o)}else if(e instanceof Bn)a(e.inner,e.prec);else if(e instanceof In)r[o].push(e),e.provides&&a(e.provides,o);else if(e instanceof jn)r[o].push(e),e.facet.extensions&&a(e.facet.extensions,Ln.default);else{let t=e.extension;if(!t)throw Error(`Unrecognized extension value in extension set (${e}).`);if(t==e)throw Error(`Unrecognized extension value in extension set (${e}). This sometimes happens because multiple instances of @codemirror/state are loaded, breaking instanceof checks.`);a(t,o)}}return a(e,Ln.default),r.reduce((e,t)=>e.concat(t))}function Gn(e,t){if(t&1)return 2;let n=t>>1,r=e.status[n];if(r==4)throw Error(`Cyclic dependency between fields and/or facets`);if(r&2)return r;e.status[n]=4;let i=e.computeSlot(e,e.config.dynamicSlots[n]);return e.status[n]=2|i}function Kn(e,t){return t&1?e.config.staticValues[t>>1]:e.values[t>>1]}const qn=M.define(),Jn=M.define({combine:e=>e.some(e=>e),static:!0}),Yn=M.define({combine:e=>e.length?e[0]:void 0,static:!0}),Xn=M.define(),Zn=M.define(),Qn=M.define(),$n=M.define({combine:e=>e.length?e[0]:!1});var er=class{constructor(e,t){this.type=e,this.value=t}static define(){return new tr}},tr=class{of(e){return new er(this,e)}},nr=class{constructor(e){this.map=e}of(e){return new N(this,e)}},N=class e{constructor(e,t){this.type=e,this.value=t}map(t){let n=this.type.map(this.value,t);return n===void 0?void 0:n==this.value?this:new e(this.type,n)}is(e){return this.type==e}static define(e={}){return new nr(e.map||(e=>e))}static mapEffects(e,t){if(!e.length)return e;let n=[];for(let r of e){let e=r.map(t);e&&n.push(e)}return n}};N.reconfigure=N.define(),N.appendConfig=N.define();var rr=class e{constructor(t,n,r,i,a,o){this.startState=t,this.changes=n,this.selection=r,this.effects=i,this.annotations=a,this.scrollIntoView=o,this._doc=null,this._state=null,r&&On(r,n.newLength),a.some(t=>t.type==e.time)||(this.annotations=a.concat(e.time.of(Date.now())))}static create(t,n,r,i,a,o){return new e(t,n,r,i,a,o)}get newDoc(){return this._doc||=this.changes.apply(this.startState.doc)}get newSelection(){return this.selection||this.startState.selection.map(this.changes)}get state(){return this._state||this.startState.applyTransaction(this),this._state}annotation(e){for(let t of this.annotations)if(t.type==e)return t.value}get docChanged(){return!this.changes.empty}get reconfigured(){return this.startState.config!=this.state.config}isUserEvent(t){let n=this.annotation(e.userEvent);return!!(n&&(n==t||n.length>t.length&&n.slice(0,t.length)==t&&n[t.length]==`.`))}};rr.time=er.define(),rr.userEvent=er.define(),rr.addToHistory=er.define(),rr.remote=er.define();function ir(e,t){let n=[];for(let r=0,i=0;;){let a,o;if(r<e.length&&(i==t.length||t[i]>=e[r]))a=e[r++],o=e[r++];else if(i<t.length)a=t[i++],o=t[i++];else return n;!n.length||n[n.length-1]<a?n.push(a,o):n[n.length-1]<o&&(n[n.length-1]=o)}}function ar(e,t,n){let r,i,a;return n?(r=t.changes,i=bn.empty(t.changes.length),a=e.changes.compose(t.changes)):(r=t.changes.map(e.changes),i=e.changes.mapDesc(t.changes,!0),a=e.changes.compose(r)),{changes:a,selection:t.selection?t.selection.map(i):e.selection?.map(r),effects:N.mapEffects(e.effects,r).concat(N.mapEffects(t.effects,i)),annotations:e.annotations.length?e.annotations.concat(t.annotations):t.annotations,scrollIntoView:e.scrollIntoView||t.scrollIntoView}}function or(e,t,n){let r=t.selection,i=dr(t.annotations);return t.userEvent&&(i=i.concat(rr.userEvent.of(t.userEvent))),{changes:t.changes instanceof bn?t.changes:bn.of(t.changes||[],n,e.facet(Yn)),selection:r&&(r instanceof j?r:j.single(r.anchor,r.head)),effects:dr(t.effects),annotations:i,scrollIntoView:!!t.scrollIntoView}}function sr(e,t,n){let r=or(e,t.length?t[0]:{},e.doc.length);t.length&&t[0].filter===!1&&(n=!1);for(let i=1;i<t.length;i++){t[i].filter===!1&&(n=!1);let a=!!t[i].sequential;r=ar(r,or(e,t[i],a?r.changes.newLength:e.doc.length),a)}let i=rr.create(e,r.changes,r.selection,r.effects,r.annotations,r.scrollIntoView);return lr(n?cr(i):i)}function cr(e){let t=e.startState,n=!0;for(let r of t.facet(Xn)){let t=r(e);if(t===!1){n=!1;break}Array.isArray(t)&&(n=n===!0?t:ir(n,t))}if(n!==!0){let r,i;if(n===!1)i=e.changes.invertedDesc,r=bn.empty(t.doc.length);else{let t=e.changes.filter(n);r=t.changes,i=t.filtered.mapDesc(t.changes).invertedDesc}e=rr.create(t,r,e.selection&&e.selection.map(i),N.mapEffects(e.effects,i),e.annotations,e.scrollIntoView)}let r=t.facet(Zn);for(let n=r.length-1;n>=0;n--){let i=r[n](e);e=i instanceof rr?i:Array.isArray(i)&&i.length==1&&i[0]instanceof rr?i[0]:sr(t,dr(i),!1)}return e}function lr(e){let t=e.startState,n=t.facet(Qn),r=e;for(let i=n.length-1;i>=0;i--){let a=n[i](e);a&&Object.keys(a).length&&(r=ar(r,or(t,a,e.changes.newLength),!0))}return r==e?e:rr.create(t,e.changes,e.selection,r.effects,r.annotations,r.scrollIntoView)}const ur=[];function dr(e){return e==null?ur:Array.isArray(e)?e:[e]}var fr=(function(e){return e[e.Word=0]=`Word`,e[e.Space=1]=`Space`,e[e.Other=2]=`Other`,e})(fr||={});const pr=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;let mr;try{mr=RegExp(`[\\p{Alphabetic}\\p{Number}_]`,`u`)}catch{}function hr(e){if(mr)return mr.test(e);for(let t=0;t<e.length;t++){let n=e[t];if(/\w/.test(n)||n>``&&(n.toUpperCase()!=n.toLowerCase()||pr.test(n)))return!0}return!1}function gr(e){return t=>{if(!/\S/.test(t))return fr.Space;if(hr(t))return fr.Word;for(let n=0;n<e.length;n++)if(t.indexOf(e[n])>-1)return fr.Word;return fr.Other}}var P=class e{constructor(e,t,n,r,i,a){this.config=e,this.doc=t,this.selection=n,this.values=r,this.status=e.statusTemplate.slice(),this.computeSlot=i,a&&(a._state=this);for(let e=0;e<this.config.dynamicSlots.length;e++)Gn(this,e<<1);this.computeSlot=null}field(e,t=!0){let n=this.config.address[e.id];if(n==null){if(t)throw RangeError(`Field is not present in this state`);return}return Gn(this,n),Kn(this,n)}update(...e){return sr(this,e,!0)}applyTransaction(t){let n=this.config,{base:r,compartments:i}=n;for(let e of t.effects)e.is(Vn.reconfigure)?(n&&=(i=new Map,n.compartments.forEach((e,t)=>i.set(t,e)),null),i.set(e.value.compartment,e.value.extension)):e.is(N.reconfigure)?(n=null,r=e.value):e.is(N.appendConfig)&&(n=null,r=dr(r).concat(e.value));let a;n?a=t.startState.values.slice():(n=Un.resolve(r,i,this),a=new e(n,this.doc,this.selection,n.dynamicSlots.map(()=>null),(e,t)=>t.reconfigure(e,this),null).values);let o=t.startState.facet(Jn)?t.newSelection:t.newSelection.asSingle();new e(n,t.newDoc,o,a,(e,n)=>n.update(e,t),t)}replaceSelection(e){return typeof e==`string`&&(e=this.toText(e)),this.changeByRange(t=>({changes:{from:t.from,to:t.to,insert:e},range:j.cursor(t.from+e.length)}))}changeByRange(e){let t=this.selection,n=e(t.ranges[0]),r=this.changes(n.changes),i=[n.range],a=dr(n.effects);for(let n=1;n<t.ranges.length;n++){let o=e(t.ranges[n]),s=this.changes(o.changes),c=s.map(r);for(let e=0;e<n;e++)i[e]=i[e].map(c);let l=r.mapDesc(s,!0);i.push(o.range.map(l)),r=r.compose(c),a=N.mapEffects(a,c).concat(N.mapEffects(dr(o.effects),l))}return{changes:r,selection:j.create(i,t.mainIndex),effects:a}}changes(t=[]){return t instanceof bn?t:bn.of(t,this.doc.length,this.facet(e.lineSeparator))}toText(t){return A.of(t.split(this.facet(e.lineSeparator)||_n))}sliceDoc(e=0,t=this.doc.length){return this.doc.sliceString(e,t,this.lineBreak)}facet(e){let t=this.config.address[e.id];return t==null?e.default:(Gn(this,t),Kn(this,t))}toJSON(e){let t={doc:this.sliceDoc(),selection:this.selection.toJSON()};if(e)for(let n in e){let r=e[n];r instanceof In&&this.config.address[r.id]!=null&&(t[n]=r.spec.toJSON(this.field(e[n]),this))}return t}static fromJSON(t,n={},r){if(!t||typeof t.doc!=`string`)throw RangeError(`Invalid JSON representation for EditorState`);let i=[];if(r){for(let e in r)if(Object.prototype.hasOwnProperty.call(t,e)){let n=r[e],a=t[e];i.push(n.init(e=>n.spec.fromJSON(a,e)))}}return e.create({doc:t.doc,selection:j.fromJSON(t.selection),extensions:n.extensions?i.concat([n.extensions]):i})}static create(t={}){let n=Un.resolve(t.extensions||[],new Map),r=t.doc instanceof A?t.doc:A.of((t.doc||``).split(n.staticFacet(e.lineSeparator)||_n)),i=t.selection?t.selection instanceof j?t.selection:j.single(t.selection.anchor,t.selection.head):j.single(0);return On(i,r.length),n.staticFacet(Jn)||(i=i.asSingle()),new e(n,r,i,n.dynamicSlots.map(()=>null),(e,t)=>t.create(e),null)}get tabSize(){return this.facet(e.tabSize)}get lineBreak(){return this.facet(e.lineSeparator)||`
|
|
@@ -804,12 +804,12 @@ html[data-dsh-tw-active] .dshDesktopConversationSurface > :not([data-dsh-tw-view
|
|
|
804
804
|
}`,{label:`interface`,detail:`definition`,type:`keyword`}),gf("type ${name} = ${type}",{label:`type`,detail:`definition`,type:`keyword`}),gf(`enum \${name} {
|
|
805
805
|
\${}
|
|
806
806
|
}`,{label:`enum`,detail:`definition`,type:`keyword`})]),Hh=new Yl,Uh=new Set([`Script`,`Block`,`FunctionExpression`,`FunctionDeclaration`,`ArrowFunction`,`MethodDeclaration`,`ForStatement`]);function Wh(e){return(t,n)=>{let r=t.node.getChild(`VariableDefinition`);return r&&n(r,e),!0}}const Gh=[`FunctionDeclaration`],Kh={FunctionDeclaration:Wh(`function`),ClassDeclaration:Wh(`class`),ClassExpression:()=>!0,EnumDeclaration:Wh(`constant`),TypeAliasDeclaration:Wh(`type`),NamespaceDeclaration:Wh(`namespace`),VariableDefinition(e,t){e.matchContext(Gh)||t(e,`variable`)},TypeDefinition(e,t){t(e,`type`)},__proto__:null};function qh(e,t){let n=Hh.get(t);if(n)return n;let r=[],i=!0;function a(t,n){let i=e.sliceString(t.from,t.to);r.push({label:i,type:n})}return t.cursor(G.IncludeAnonymous).iterate(t=>{if(i)i=!1;else if(t.name){let e=Kh[t.name];if(e&&e(t,a)||Uh.has(t.name))return!1}else if(t.to-t.from>8192){for(let n of qh(e,t.node))r.push(n);return!1}}),Hh.set(t,r),r}const Jh=/^[\w$\xa1-\uffff][\w$\d\xa1-\uffff]*$/,Yh=[`TemplateString`,`String`,`RegExp`,`LineComment`,`BlockComment`,`VariableDefinition`,`TypeDefinition`,`Label`,`PropertyDefinition`,`PropertyName`,`PrivatePropertyDefinition`,`PrivatePropertyName`,`JSXText`,`JSXAttributeValue`,`JSXOpenTag`,`JSXCloseTag`,`JSXSelfClosingTag`,`.`,`?.`];function Xh(e){let t=Y(e.state).resolveInner(e.pos,-1);if(Yh.indexOf(t.name)>-1)return null;let n=t.name==`VariableName`||t.to-t.from<20&&Jh.test(e.state.sliceDoc(t.from,t.to));if(!n&&!e.explicit)return null;let r=[];for(let n=t;n;n=n.parent)Uh.has(n.name)&&(r=r.concat(qh(e.state.doc,n)));return{options:r,from:n?t.from:e.pos,validFor:Jh}}const Zh=Ku.define({name:`javascript`,parser:zh.configure({props:[ud.add({IfStatement:Sd({except:/^\s*({|else\b)/}),TryStatement:Sd({except:/^\s*({|catch\b|finally\b)/}),LabeledStatement:xd,SwitchBody:e=>{let t=e.textAfter,n=/^\s*\}/.test(t),r=/^\s*(case|default)\b/.test(t);return e.baseIndent+(n?0:r?1:2)*e.unit},Block:yd({closing:`}`}),ArrowFunction:e=>e.baseIndent+e.unit,"TemplateString BlockComment":()=>null,"Statement Property":Sd({except:/^\s*{/}),JSXElement(e){let t=/^\s*<\//.test(e.textAfter);return e.lineIndent(e.node.from)+(t?0:e.unit)},JSXEscape(e){let t=/\s*\}/.test(e.textAfter);return e.lineIndent(e.node.from)+(t?0:e.unit)},"JSXOpenTag JSXSelfClosingTag"(e){return e.column(e.node.from)+e.unit}}),wd.add({"Block ClassBody SwitchBody EnumBody ObjectExpression ArrayExpression ObjectType":Td,BlockComment(e){return{from:e.from+2,to:e.to-2}},JSXElement(e){let t=e.firstChild;if(!t||t.name==`JSXSelfClosingTag`)return null;let n=e.lastChild;return{from:t.to,to:n.type.isError?e.to:n.from}},"JSXSelfClosingTag JSXOpenTag"(e){let t=e.firstChild?.nextSibling,n=e.lastChild;return!t||t.type.isError?null:{from:t.to,to:n.type.isError?e.to:n.from}}})]}),languageData:{closeBrackets:{brackets:[`(`,`[`,`{`,`'`,`"`,"`"]},commentTokens:{line:`//`,block:{open:`/*`,close:`*/`}},indentOnInput:/^\s*(?:case |default:|\{|\}|<\/)$/,wordChars:`$`}}),Qh={test:e=>/^JSX/.test(e.name),facet:Hu({commentTokens:{block:{open:`{/*`,close:`*/}`}}})},$h=Zh.configure({dialect:`ts`},`typescript`),eg=Zh.configure({dialect:`jsx`,props:[Uu.add(e=>e.isTop?[Qh]:void 0)]}),tg=Zh.configure({dialect:`jsx ts`,props:[Uu.add(e=>e.isTop?[Qh]:void 0)]},`typescript`);let ng=e=>({label:e,type:`keyword`});const rg=`break case const continue default delete export extends false finally in instanceof let new return static super switch this throw true typeof var yield`.split(` `).map(ng),ig=rg.concat([`declare`,`implements`,`private`,`protected`,`public`].map(ng));function ag(e={}){let t=e.jsx?e.typescript?tg:eg:e.typescript?$h:Zh,n=e.typescript?Vh.concat(ig):Bh.concat(rg);return new nd(t,[Zh.data.of({autocomplete:Xd(Yh,Yd(n))}),Zh.data.of({autocomplete:Xh}),e.jsx?lg:[]])}function og(e){for(;;){if(e.name==`JSXOpenTag`||e.name==`JSXSelfClosingTag`||e.name==`JSXFragmentTag`)return e;if(e.name==`JSXEscape`||!e.parent)return null;e=e.parent}}function sg(e,t,n=e.length){for(let r=t?.firstChild;r;r=r.nextSibling)if(r.name==`JSXIdentifier`||r.name==`JSXBuiltin`||r.name==`JSXNamespacedName`||r.name==`JSXMemberExpression`)return e.sliceString(r.from,Math.min(r.to,n));return``}const cg=typeof navigator==`object`&&/Android\b/.test(navigator.userAgent),lg=H.inputHandler.of((e,t,n,r,i)=>{if((cg?e.composing:e.compositionStarted)||e.state.readOnly||t!=n||r!=`>`&&r!=`/`||!Zh.isActiveAt(e.state,t,-1))return!1;let a=i(),{state:o}=a,s=o.changeByRange(e=>{let{head:t}=e,n=Y(o).resolveInner(t-1,-1),i;if(n.name==`JSXStartTag`&&(n=n.parent),!(o.doc.sliceString(t-1,t)!=r||n.name==`JSXAttributeValue`&&n.to>t)){if(r==`>`&&n.name==`JSXFragmentTag`)return{range:e,changes:{from:t,insert:`</>`}};if(r==`/`&&n.name==`JSXStartCloseTag`){let e=n.parent,r=e.parent;if(r&&e.from==t-2&&((i=sg(o.doc,r.firstChild,t))||r.firstChild?.name==`JSXFragmentTag`)){let e=`${i}>`;return{range:j.cursor(t+e.length,-1),changes:{from:t,insert:e}}}}else if(r==`>`){let r=og(n);if(r&&r.name==`JSXOpenTag`&&!/^\/?>|^<\//.test(o.doc.sliceString(t,t+2))&&(i=sg(o.doc,r,t)))return{range:e,changes:{from:t,insert:`</${i}>`}}}}return{range:e}});return s.changes.empty?!1:(e.dispatch([a,o.update(s,{userEvent:`input.complete`,scrollIntoView:!0})]),!0)}),ug=[`_blank`,`_self`,`_top`,`_parent`],dg=[`ascii`,`utf-8`,`utf-16`,`latin1`,`latin1`],fg=[`get`,`post`,`put`,`delete`],pg=[`application/x-www-form-urlencoded`,`multipart/form-data`,`text/plain`],mg=[`true`,`false`],Q={},hg={a:{attrs:{href:null,ping:null,type:null,media:null,target:ug,hreflang:null}},abbr:Q,address:Q,area:{attrs:{alt:null,coords:null,href:null,target:null,ping:null,media:null,hreflang:null,type:null,shape:[`default`,`rect`,`circle`,`poly`]}},article:Q,aside:Q,audio:{attrs:{src:null,mediagroup:null,crossorigin:[`anonymous`,`use-credentials`],preload:[`none`,`metadata`,`auto`],autoplay:[`autoplay`],loop:[`loop`],controls:[`controls`]}},b:Q,base:{attrs:{href:null,target:ug}},bdi:Q,bdo:Q,blockquote:{attrs:{cite:null}},body:Q,br:Q,button:{attrs:{form:null,formaction:null,name:null,value:null,autofocus:[`autofocus`],disabled:[`autofocus`],formenctype:pg,formmethod:fg,formnovalidate:[`novalidate`],formtarget:ug,type:[`submit`,`reset`,`button`]}},canvas:{attrs:{width:null,height:null}},caption:Q,center:Q,cite:Q,code:Q,col:{attrs:{span:null}},colgroup:{attrs:{span:null}},command:{attrs:{type:[`command`,`checkbox`,`radio`],label:null,icon:null,radiogroup:null,command:null,title:null,disabled:[`disabled`],checked:[`checked`]}},data:{attrs:{value:null}},datagrid:{attrs:{disabled:[`disabled`],multiple:[`multiple`]}},datalist:{attrs:{data:null}},dd:Q,del:{attrs:{cite:null,datetime:null}},details:{attrs:{open:[`open`]}},dfn:Q,div:Q,dl:Q,dt:Q,em:Q,embed:{attrs:{src:null,type:null,width:null,height:null}},eventsource:{attrs:{src:null}},fieldset:{attrs:{disabled:[`disabled`],form:null,name:null}},figcaption:Q,figure:Q,footer:Q,form:{attrs:{action:null,name:null,"accept-charset":dg,autocomplete:[`on`,`off`],enctype:pg,method:fg,novalidate:[`novalidate`],target:ug}},h1:Q,h2:Q,h3:Q,h4:Q,h5:Q,h6:Q,head:{children:[`title`,`base`,`link`,`style`,`meta`,`script`,`noscript`,`command`]},header:Q,hgroup:Q,hr:Q,html:{attrs:{manifest:null}},i:Q,iframe:{attrs:{src:null,srcdoc:null,name:null,width:null,height:null,sandbox:[`allow-top-navigation`,`allow-same-origin`,`allow-forms`,`allow-scripts`],seamless:[`seamless`]}},img:{attrs:{alt:null,src:null,ismap:null,usemap:null,width:null,height:null,crossorigin:[`anonymous`,`use-credentials`]}},input:{attrs:{alt:null,dirname:null,form:null,formaction:null,height:null,list:null,max:null,maxlength:null,min:null,name:null,pattern:null,placeholder:null,size:null,src:null,step:null,value:null,width:null,accept:[`audio/*`,`video/*`,`image/*`],autocomplete:[`on`,`off`],autofocus:[`autofocus`],checked:[`checked`],disabled:[`disabled`],formenctype:pg,formmethod:fg,formnovalidate:[`novalidate`],formtarget:ug,multiple:[`multiple`],readonly:[`readonly`],required:[`required`],type:[`hidden`,`text`,`search`,`tel`,`url`,`email`,`password`,`datetime`,`date`,`month`,`week`,`time`,`datetime-local`,`number`,`range`,`color`,`checkbox`,`radio`,`file`,`submit`,`image`,`reset`,`button`]}},ins:{attrs:{cite:null,datetime:null}},kbd:Q,keygen:{attrs:{challenge:null,form:null,name:null,autofocus:[`autofocus`],disabled:[`disabled`],keytype:[`RSA`]}},label:{attrs:{for:null,form:null}},legend:Q,li:{attrs:{value:null}},link:{attrs:{href:null,type:null,hreflang:null,media:null,sizes:[`all`,`16x16`,`16x16 32x32`,`16x16 32x32 64x64`]}},map:{attrs:{name:null}},mark:Q,menu:{attrs:{label:null,type:[`list`,`context`,`toolbar`]}},meta:{attrs:{content:null,charset:dg,name:[`viewport`,`application-name`,`author`,`description`,`generator`,`keywords`],"http-equiv":[`content-language`,`content-type`,`default-style`,`refresh`]}},meter:{attrs:{value:null,min:null,low:null,high:null,max:null,optimum:null}},nav:Q,noscript:Q,object:{attrs:{data:null,type:null,name:null,usemap:null,form:null,width:null,height:null,typemustmatch:[`typemustmatch`]}},ol:{attrs:{reversed:[`reversed`],start:null,type:[`1`,`a`,`A`,`i`,`I`]},children:[`li`,`script`,`template`,`ul`,`ol`]},optgroup:{attrs:{disabled:[`disabled`],label:null}},option:{attrs:{disabled:[`disabled`],label:null,selected:[`selected`],value:null}},output:{attrs:{for:null,form:null,name:null}},p:Q,param:{attrs:{name:null,value:null}},pre:Q,progress:{attrs:{value:null,max:null}},q:{attrs:{cite:null}},rp:Q,rt:Q,ruby:Q,samp:Q,script:{attrs:{type:[`text/javascript`],src:null,async:[`async`],defer:[`defer`],charset:dg}},section:Q,select:{attrs:{form:null,name:null,size:null,autofocus:[`autofocus`],disabled:[`disabled`],multiple:[`multiple`]}},slot:{attrs:{name:null}},small:Q,source:{attrs:{src:null,type:null,media:null}},span:Q,strong:Q,style:{attrs:{type:[`text/css`],media:null,scoped:null}},sub:Q,summary:Q,sup:Q,table:Q,tbody:Q,td:{attrs:{colspan:null,rowspan:null,headers:null}},template:Q,textarea:{attrs:{dirname:null,form:null,maxlength:null,name:null,placeholder:null,rows:null,cols:null,autofocus:[`autofocus`],disabled:[`disabled`],readonly:[`readonly`],required:[`required`],wrap:[`soft`,`hard`]}},tfoot:Q,th:{attrs:{colspan:null,rowspan:null,headers:null,scope:[`row`,`col`,`rowgroup`,`colgroup`]}},thead:Q,time:{attrs:{datetime:null}},title:Q,tr:Q,track:{attrs:{src:null,label:null,default:null,kind:[`subtitles`,`captions`,`descriptions`,`chapters`,`metadata`],srclang:null}},ul:{children:[`li`,`script`,`template`,`ul`,`ol`]},var:Q,video:{attrs:{src:null,poster:null,width:null,height:null,crossorigin:[`anonymous`,`use-credentials`],preload:[`auto`,`metadata`,`none`],autoplay:[`autoplay`],mediagroup:[`movie`],muted:[`muted`],controls:[`controls`]}},wbr:Q},gg={accesskey:null,class:null,contenteditable:mg,contextmenu:null,dir:[`ltr`,`rtl`,`auto`],draggable:[`true`,`false`,`auto`],dropzone:[`copy`,`move`,`link`,`string:`,`file:`],hidden:[`hidden`],id:null,inert:[`inert`],itemid:null,itemprop:null,itemref:null,itemscope:[`itemscope`],itemtype:null,lang:[`ar`,`bn`,`de`,`en-GB`,`en-US`,`es`,`fr`,`hi`,`id`,`ja`,`pa`,`pt`,`ru`,`tr`,`zh`],spellcheck:mg,autocorrect:mg,autocapitalize:mg,style:null,tabindex:null,title:null,translate:[`yes`,`no`],rel:[`stylesheet`,`alternate`,`author`,`bookmark`,`help`,`license`,`next`,`nofollow`,`noreferrer`,`prefetch`,`prev`,`search`,`tag`],role:`alert application article banner button cell checkbox complementary contentinfo dialog document feed figure form grid gridcell heading img list listbox listitem main navigation region row rowgroup search switch tab table tabpanel textbox timer`.split(` `),"aria-activedescendant":null,"aria-atomic":mg,"aria-autocomplete":[`inline`,`list`,`both`,`none`],"aria-busy":mg,"aria-checked":[`true`,`false`,`mixed`,`undefined`],"aria-controls":null,"aria-describedby":null,"aria-disabled":mg,"aria-dropeffect":null,"aria-expanded":[`true`,`false`,`undefined`],"aria-flowto":null,"aria-grabbed":[`true`,`false`,`undefined`],"aria-haspopup":mg,"aria-hidden":mg,"aria-invalid":[`true`,`false`,`grammar`,`spelling`],"aria-label":null,"aria-labelledby":null,"aria-level":null,"aria-live":[`off`,`polite`,`assertive`],"aria-multiline":mg,"aria-multiselectable":mg,"aria-owns":null,"aria-posinset":null,"aria-pressed":[`true`,`false`,`mixed`,`undefined`],"aria-readonly":mg,"aria-relevant":null,"aria-required":mg,"aria-selected":[`true`,`false`,`undefined`],"aria-setsize":null,"aria-sort":[`ascending`,`descending`,`none`,`other`],"aria-valuemax":null,"aria-valuemin":null,"aria-valuenow":null,"aria-valuetext":null},_g=`beforeunload copy cut dragstart dragover dragleave dragenter dragend drag paste focus blur change click load mousedown mouseenter mouseleave mouseup keydown keyup resize scroll unload`.split(` `).map(e=>`on`+e);for(let e of _g)gg[e]=null;var vg=class{constructor(e,t){this.tags={...hg,...e},this.globalAttrs={...gg,...t},this.allTags=Object.keys(this.tags),this.globalAttrNames=Object.keys(this.globalAttrs)}};vg.default=new vg;function yg(e,t,n=e.length){if(!t)return``;let r=t.firstChild,i=r&&r.getChild(`TagName`);return i?e.sliceString(i.from,Math.min(i.to,n)):``}function bg(e,t=!1){for(;e;e=e.parent)if(e.name==`Element`)if(t)t=!1;else return e;return null}function xg(e,t,n){return n.tags[yg(e,bg(t))]?.children||n.allTags}function Sg(e,t){let n=[];for(let r=bg(t);r&&!r.type.isTop;r=bg(r.parent)){let i=yg(e,r);if(i&&r.lastChild.name==`CloseTag`)break;i&&n.indexOf(i)<0&&(t.name==`EndTag`||t.from>=r.firstChild.to)&&n.push(i)}return n}const Cg=/^[:\-\.\w\u00b7-\uffff]*$/;function wg(e,t,n,r,i){let a=/\s*>/.test(e.sliceDoc(i,i+5))?``:`>`,o=bg(n,n.name==`StartTag`||n.name==`TagName`);return{from:r,to:i,options:xg(e.doc,o,t).map(e=>({label:e,type:`type`})).concat(Sg(e.doc,n).map((e,t)=>({label:`/`+e,apply:`/`+e+a,type:`type`,boost:99-t}))),validFor:/^\/?[:\-\.\w\u00b7-\uffff]*$/}}function Tg(e,t,n,r){let i=/\s*>/.test(e.sliceDoc(r,r+5))?``:`>`;return{from:n,to:r,options:Sg(e.doc,t).map((e,t)=>({label:e,apply:e+i,type:`type`,boost:99-t})),validFor:Cg}}function Eg(e,t,n,r){let i=[],a=0;for(let r of xg(e.doc,n,t))i.push({label:`<`+r,type:`type`});for(let t of Sg(e.doc,n))i.push({label:`</`+t+`>`,type:`type`,boost:99-a++});return{from:r,to:r,options:i,validFor:/^<\/?[:\-\.\w\u00b7-\uffff]*$/}}function Dg(e,t,n,r,i){let a=bg(n),o=a?t.tags[yg(e.doc,a)]:null,s=o&&o.attrs?Object.keys(o.attrs):[];return{from:r,to:i,options:(o&&o.globalAttrs===!1?s:s.length?s.concat(t.globalAttrNames):t.globalAttrNames).map(e=>({label:e,type:`property`})),validFor:Cg}}function Og(e,t,n,r,i){let a=n.parent?.getChild(`AttributeName`),o=[],s;if(a){let c=e.sliceDoc(a.from,a.to),l=t.globalAttrs[c];if(!l){let r=bg(n),i=r?t.tags[yg(e.doc,r)]:null;l=i?.attrs&&i.attrs[c]}if(l){let t=e.sliceDoc(r,i).toLowerCase(),n=`"`,a=`"`;/^['"]/.test(t)?(s=t[0]==`"`?/^[^"]*$/:/^[^']*$/,n=``,a=e.sliceDoc(i,i+1)==t[0]?``:t[0],t=t.slice(1),r++):s=/^[^\s<>='"]*$/;for(let e of l)o.push({label:e,apply:n+e+a,type:`constant`})}}return{from:r,to:i,options:o,validFor:s}}function kg(e,t){let{state:n,pos:r}=t,i=Y(n).resolveInner(r,-1),a=i.resolve(r);for(let e=r,t;a==i&&(t=i.childBefore(e));){let n=t.lastChild;if(!n||!n.type.isError||n.from<n.to)break;a=i=t,e=n.from}return i.name==`TagName`?i.parent&&/CloseTag$/.test(i.parent.name)?Tg(n,i,i.from,r):wg(n,e,i,i.from,r):i.name==`StartTag`||i.name==`IncompleteTag`?wg(n,e,i,r,r):i.name==`StartCloseTag`||i.name==`IncompleteCloseTag`?Tg(n,i,r,r):i.name==`OpenTag`||i.name==`SelfClosingTag`||i.name==`AttributeName`?Dg(n,e,i,i.name==`AttributeName`?i.from:r,r):i.name==`Is`||i.name==`AttributeValue`||i.name==`UnquotedAttributeValue`?Og(n,e,i,i.name==`Is`?r:i.from,r):t.explicit&&(a.name==`Element`||a.name==`Text`||a.name==`Document`)?Eg(n,e,i,r):null}function Ag(e){return kg(vg.default,e)}function jg(e){let{extraTags:t,extraGlobalAttributes:n}=e,r=n||t?new vg(t,n):vg.default;return e=>kg(r,e)}const Mg=Zh.parser.configure({top:`SingleExpression`}),Ng=[{tag:`script`,attrs:e=>e.type==`text/typescript`||e.lang==`ts`,parser:$h.parser},{tag:`script`,attrs:e=>e.type==`text/babel`||e.type==`text/jsx`,parser:eg.parser},{tag:`script`,attrs:e=>e.type==`text/typescript-jsx`,parser:tg.parser},{tag:`script`,attrs(e){return/^(importmap|speculationrules|application\/(.+\+)?json)$/i.test(e.type)},parser:Mg},{tag:`script`,attrs(e){return!e.type||/^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^module$|^$/i.test(e.type)},parser:Zh.parser},{tag:`style`,attrs(e){return(!e.lang||e.lang==`css`)&&(!e.type||/^(text\/)?(x-)?(stylesheet|css)$/i.test(e.type))},parser:Th.parser}],Pg=[{name:`style`,parser:Th.parser.configure({top:`Styles`})}].concat(_g.map(e=>({name:e,parser:Zh.parser}))),Fg=Ku.define({name:`html`,parser:Wm.configure({props:[ud.add({Element(e){let t=/^(\s*)(<\/)?/.exec(e.textAfter);return e.node.to<=e.pos+t[0].length?e.continue():e.lineIndent(e.node.from)+(t[2]?0:e.unit)},"OpenTag CloseTag SelfClosingTag"(e){return e.column(e.node.from)+e.unit},Document(e){if(e.pos+/\s*/.exec(e.textAfter)[0].length<e.node.to)return e.continue();let t=null,n;for(let n=e.node;;){let e=n.lastChild;if(!e||e.name!=`Element`||e.to!=n.to)break;t=n=e}return t&&!((n=t.lastChild)&&(n.name==`CloseTag`||n.name==`SelfClosingTag`))?e.lineIndent(t.from)+e.unit:null}}),wd.add({Element(e){let t=e.firstChild,n=e.lastChild;return!t||t.name!=`OpenTag`?null:{from:t.to,to:n.name==`CloseTag`?n.from:e.to}}}),Nd.add({"OpenTag CloseTag":e=>e.getChild(`TagName`)})]}),languageData:{commentTokens:{block:{open:`<!--`,close:`-->`}},indentOnInput:/^\s*<\/\w+\W$/,wordChars:`-_`}}),Ig=Fg.configure({wrap:Jm(Ng,Pg)});function Lg(e={}){let t=``,n;return e.matchClosingTags===!1&&(t=`noMatch`),e.selfClosingTags===!0&&(t=(t?t+` `:``)+`selfClosing`),(e.nestedLanguages&&e.nestedLanguages.length||e.nestedAttributes&&e.nestedAttributes.length)&&(n=Jm((e.nestedLanguages||[]).concat(Ng),(e.nestedAttributes||[]).concat(Pg))),new nd(n?Fg.configure({wrap:n,dialect:t}):t?Ig.configure({dialect:t}):Ig,[Ig.data.of({autocomplete:jg(e)}),e.autoCloseTags===!1?[]:Bg,ag().support,Eh().support])}const Rg=new Set(`area base br col command embed frame hr img input keygen link meta param source track wbr menuitem`.split(` `));function zg(e,t,n){for(;;){if(t.lastChild?.name!=`CloseTag`)return!1;let r=t.parent;if(!r||yg(e,r)!=n)return!0;t=r}}const Bg=H.inputHandler.of((e,t,n,r,i)=>{if(e.composing||e.state.readOnly||t!=n||r!=`>`&&r!=`/`||!Ig.isActiveAt(e.state,t,-1))return!1;let a=i(),{state:o}=a,s=o.changeByRange(e=>{let t=o.doc.sliceString(e.from-1,e.to)==r,{head:n}=e,i=Y(o).resolveInner(n,-1),a;if(t&&r==`>`&&i.name==`EndTag`){let t=i.parent;if((a=yg(o.doc,t.parent,n))&&!Rg.has(a)&&!zg(o.doc,t.parent,a))return{range:e,changes:{from:n,to:n+ +(o.doc.sliceString(n,n+1)===`>`),insert:`</${a}>`}}}else if(t&&r==`/`&&i.name==`IncompleteCloseTag`){let e=i.parent;if(i.from==n-2&&e.lastChild?.name!=`CloseTag`&&(a=yg(o.doc,e,n))&&!Rg.has(a)){let e=n+ +(o.doc.sliceString(n,n+1)===`>`),t=`${a}>`;return{range:j.cursor(n+t.length,-1),changes:{from:n,to:e,insert:t}}}}return{range:e}});return s.changes.empty?!1:(e.dispatch([a,o.update(s,{userEvent:`input.complete`,scrollIntoView:!0})]),!0)}),Vg=Hu({commentTokens:{block:{open:`<!--`,close:`-->`}}}),Hg=new U,Ug=Cp.configure({props:[wd.add(e=>!e.is(`Block`)||e.is(`Document`)||Wg(e)!=null||Gg(e)?void 0:(e,t)=>({from:t.doc.lineAt(e.from).to,to:e.to})),Hg.add(Wg),ud.add({Document:()=>null}),Vu.add({Document:Vg})]});function Wg(e){let t=/^(?:ATX|Setext)Heading(\d)$/.exec(e.name);return t?+t[1]:void 0}function Gg(e){return e.name==`OrderedList`||e.name==`BulletList`}function Kg(e,t){let n=e;for(;;){let e=n.nextSibling,r;if(!e||(r=Wg(e.type))!=null&&r<=t)break;n=e}return n.to}const qg=Cd.of((e,t,n)=>{for(let r=Y(e).resolveInner(n,-1);r&&!(r.from<t);r=r.parent){let e=r.type.prop(Hg);if(e==null)continue;let t=Kg(r,e);if(t>n)return{from:n,to:t}}return null});function Jg(e){return new Wu(Vg,e,[],`markdown`)}const Yg=Jg(Ug),Xg=Jg(Ug.configure([Up,Kp,Gp,qp,{props:[wd.add({Table:(e,t)=>({from:t.doc.lineAt(e.from).to,to:e.to})})]}]));function Zg(e,t){return n=>{if(n&&e){let t=null;if(n=/\S*/.exec(n)[0],t=typeof e==`function`?e(n):rd.matchLanguageName(e,n,!0),t instanceof rd)return t.support?t.support.language.parser:Yu.getSkippingParser(t.load());if(t)return t.parser}return t?t.parser:null}}var Qg=class{constructor(e,t,n,r,i,a,o){this.node=e,this.from=t,this.to=n,this.spaceBefore=r,this.spaceAfter=i,this.type=a,this.item=o}blank(e,t=!0){let n=this.spaceBefore+(this.node.name==`Blockquote`?`>`:``);if(e!=null){for(;n.length<e;)n+=` `;return n}else{for(let e=this.to-this.from-n.length-this.spaceAfter.length;e>0;e--)n+=` `;return n+(t?this.spaceAfter:``)}}marker(e,t){let n=this.node.name==`OrderedList`?String(+e_(this.item,e)[2]+t):``;return this.spaceBefore+n+this.type+this.spaceAfter}};function $g(e,t){let n=[],r=[];for(let t=e;t;t=t.parent){if(t.name==`FencedCode`)return r;(t.name==`ListItem`||t.name==`Blockquote`)&&n.push(t)}for(let e=n.length-1;e>=0;e--){let i=n[e],a,o=t.lineAt(i.from),s=i.from-o.from;if(i.name==`Blockquote`&&(a=/^ *>( ?)/.exec(o.text.slice(s))))r.push(new Qg(i,s,s+a[0].length,``,a[1],`>`,null));else if(i.name==`ListItem`&&i.parent.name==`OrderedList`&&(a=/^( *)\d+([.)])( *)/.exec(o.text.slice(s)))){let e=a[3],t=a[0].length;e.length>=4&&(e=e.slice(0,e.length-4),t-=4),r.push(new Qg(i.parent,s,s+t,a[1],e,a[2],i))}else if(i.name==`ListItem`&&i.parent.name==`BulletList`&&(a=/^( *)([-+*])( {1,4}\[[ xX]\])?( +)/.exec(o.text.slice(s)))){let e=a[4],t=a[0].length;e.length>4&&(e=e.slice(0,e.length-4),t-=4);let n=a[2];a[3]&&(n+=a[3].replace(/[xX]/,` `)),r.push(new Qg(i.parent,s,s+t,a[1],e,n,i))}}return r}function e_(e,t){return/^(\s*)(\d+)(?=[.)])/.exec(t.sliceString(e.from,e.from+10))}function t_(e,t,n,r=0){for(let i=-1,a=e;;){if(a.name==`ListItem`){let e=e_(a,t),o=+e[2];if(i>=0){if(o!=i+1)return;n.push({from:a.from+e[1].length,to:a.from+e[0].length,insert:String(i+2+r)})}i=o}let e=a.nextSibling;if(!e)break;a=e}}function n_(e,t){let n=/^[ \t]*/.exec(e)[0].length;if(!n||t.facet(ad)!=` `)return e;let r=Ir(e,4,n),i=``;for(let e=r;e>0;)e>=4?(i+=` `,e-=4):(i+=` `,e--);return i+e.slice(n)}const r_=((e={})=>({state:t,dispatch:n})=>{let r=Y(t),{doc:i}=t,a=null,o=t.changeByRange(n=>{if(!n.empty||!Xg.isActiveAt(t,n.from,-1)&&!Xg.isActiveAt(t,n.from,1))return a={range:n};let o=n.from,s=i.lineAt(o),c=$g(r.resolveInner(o,-1),i);for(;c.length&&c[c.length-1].from>o-s.from;)c.pop();if(!c.length)return a={range:n};let l=c[c.length-1];if(l.to-l.spaceAfter.length>o-s.from)return a={range:n};let u=o>=l.to-l.spaceAfter.length&&!/\S/.test(s.text.slice(l.to));if(l.item&&u){if(l.item.from<s.from&&!/^[\s>]*$/.test(s.text.slice(0,l.to)))return a={range:n};let r=l.node.firstChild,u=l.node.getChild(`ListItem`,`ListItem`);if(r.to>=o||u&&u.to<o||s.from>0&&!/[^\s>]/.test(i.lineAt(s.from-1).text)||e.nonTightLists===!1){let e=c.length>1?c[c.length-2]:null,t,n=``;e&&e.item?(t=s.from+e.from,n=e.marker(i,1)):t=s.from+(e?e.to:0);let r=[{from:t,to:o,insert:n}];return l.node.name==`OrderedList`&&t_(l.item,i,r,-2),e&&e.node.name==`OrderedList`&&t_(e.item,i,r),{range:j.cursor(t+n.length),changes:r}}else{let e=o_(c,t,s);return{range:j.cursor(o+e.length+1),changes:{from:s.from,insert:e+t.lineBreak}}}}if(l.node.name==`Blockquote`&&u&&s.from){let e=i.lineAt(s.from-1),r=/>\s*$/.exec(e.text);if(r&&r.index==l.from){let i=t.changes([{from:e.from+r.index,to:e.to},{from:s.from+l.from,to:s.to}]);return{range:n.map(i),changes:i}}}let d=[];l.node.name==`OrderedList`&&t_(l.item,i,d);let f=l.item&&l.item.from<s.from,p=``;if(!f||/^[\s\d.)\-+*>]*/.exec(s.text)[0].length>=l.to)for(let e=0,t=c.length-1;e<=t;e++)p+=e==t&&!f?c[e].marker(i,1):c[e].blank(e<t?Ir(s.text,4,c[e+1].from)-p.length:null);let m=o;for(;m>s.from&&/\s/.test(s.text.charAt(m-s.from-1));)m--;return p=n_(p,t),a_(l.node,t.doc)&&(p=o_(c,t,s)+t.lineBreak+p),d.push({from:m,to:o,insert:t.lineBreak+p}),{range:j.cursor(m+p.length+1),changes:d}});return a?!1:(n(t.update(o,{scrollIntoView:!0,userEvent:`input`})),!0)})();function i_(e){return e.name==`QuoteMark`||e.name==`ListMark`}function a_(e,t){if(e.name!=`OrderedList`&&e.name!=`BulletList`)return!1;let n=e.firstChild,r=e.getChild(`ListItem`,`ListItem`);if(!r)return!1;let i=t.lineAt(n.to),a=t.lineAt(r.from),o=/^[\s>]*$/.test(i.text);return i.number+ +!o<a.number}function o_(e,t,n){let r=``;for(let t=0,i=e.length-2;t<=i;t++)r+=e[t].blank(t<i?Ir(n.text,4,e[t+1].from)-r.length:null,t<i);return n_(r,t)}function s_(e,t){let n=e.resolveInner(t,-1),r=t;i_(n)&&(r=n.from,n=n.parent);for(let e;e=n.childBefore(r);)if(i_(e))r=e.from;else if(e.name==`OrderedList`||e.name==`BulletList`)n=e.lastChild,r=n.to;else break;return n}const c_=[{key:`Enter`,run:r_},{key:`Backspace`,run:({state:e,dispatch:t})=>{let n=Y(e),r=null,i=e.changeByRange(t=>{let i=t.from,{doc:a}=e;if(t.empty&&Xg.isActiveAt(e,t.from)){let t=a.lineAt(i),r=$g(s_(n,i),a);if(r.length){let n=r[r.length-1],a=n.to-n.spaceAfter.length+ +!!n.spaceAfter;if(i-t.from>a&&!/\S/.test(t.text.slice(a,i-t.from)))return{range:j.cursor(t.from+a),changes:{from:t.from+a,to:i}};if(i-t.from==a&&(n.item&&t.from<=n.item.from||/^[\s>]*$/.test(t.text.slice(0,n.to)))){let r=t.from+n.from;if(n.item&&n.node.from<n.item.from&&/\S/.test(t.text.slice(n.from,n.to))){let i=n.blank(Ir(t.text,4,n.to)-Ir(t.text,4,n.from));return r==t.from&&(i=n_(i,e)),{range:j.cursor(r+i.length),changes:{from:r,to:t.from+n.to,insert:i}}}if(r<i)return{range:j.cursor(r),changes:{from:r,to:i}}}}}return r={range:t}});return r?!1:(t(e.update(i,{scrollIntoView:!0,userEvent:`delete`})),!0)}}],l_=Lg({matchClosingTags:!1});function u_(e={}){let{codeLanguages:t,defaultCodeLanguage:n,addKeymap:r=!0,base:{parser:i}=Yg,completeHTMLTags:a=!0,pasteURLAsLink:o=!0,htmlTagLanguage:s=l_}=e;if(!(i instanceof Zf))throw RangeError("Base parser provided to `markdown` should be a Markdown parser");let c=e.extensions?[e.extensions]:[],l=[s.support,qg],u;o&&l.push(h_),n instanceof nd?(l.push(n.support),u=n.language):n&&(u=n);let d=t||u?Zg(t,u):void 0;c.push(Tp({codeParser:d,htmlParser:s.language.parser})),r&&l.push(zn.high(Xc.of(c_)));let f=Jg(i.configure(c));return a&&l.push(f.data.of({autocomplete:d_})),new nd(f,l)}function d_(e){let{state:t,pos:n}=e,r=/<[:\-\.\w\u00b7-\uffff]*$/.exec(t.sliceDoc(n-25,n));if(!r)return null;let i=Y(t).resolveInner(n,-1);for(;i&&!i.type.isTop;){if(i.name==`CodeBlock`||i.name==`FencedCode`||i.name==`ProcessingInstructionBlock`||i.name==`CommentBlock`||i.name==`Link`||i.name==`Image`)return null;i=i.parent}return{from:n-r[0].length,to:n,options:p_(),validFor:/^<[:\-\.\w\u00b7-\uffff]*$/}}let f_=null;function p_(){if(f_)return f_;let e=Ag(new Kd(P.create({extensions:l_}),0,!0));return f_=e?e.options:[]}const m_=/code|horizontalrule|html|link|comment|processing|escape|entity|image|mark|url/i,h_=H.domEventHandlers({paste:(e,t)=>{let{main:n}=t.state.selection;if(n.empty)return!1;let r=e.clipboardData?.getData(`text/plain`);if(!r||!/^(https?:\/\/|mailto:|xmpp:|www\.)/.test(r)||(/^www\./.test(r)&&(r=`https://`+r),!Xg.isActiveAt(t.state,n.from,1)))return!1;let i=Y(t.state),a=!1;return i.iterate({from:n.from,to:n.to,enter:e=>{(e.from>n.from||m_.test(e.name))&&(a=!0)},leave:e=>{e.to<n.to&&(a=!0)}}),a?!1:(t.dispatch({changes:[{from:n.from,insert:`[`},{from:n.to,insert:`](${r})`}],userEvent:`input.paste`,scrollIntoView:!0}),!0)}}),g_=e=>{let{state:t}=e,n=t.doc.lineAt(t.selection.main.from),r=x_(e.state,n.from);return r.line?v_(e):r.block?b_(e):!1};function __(e,t){return({state:n,dispatch:r})=>{if(n.readOnly)return!1;let i=e(t,n);return i?(r(n.update(i)),!0):!1}}const v_=__(T_,0),y_=__(w_,0),b_=__((e,t)=>w_(e,t,C_(t)),0);function x_(e,t){let n=e.languageDataAt(`commentTokens`,t,1);return n.length?n[0]:{}}function S_(e,{open:t,close:n},r,i){let a=e.sliceDoc(r-50,r),o=e.sliceDoc(i,i+50),s=/\s*$/.exec(a)[0].length,c=/^\s*/.exec(o)[0].length,l=a.length-s;if(a.slice(l-t.length,l)==t&&o.slice(c,c+n.length)==n)return{open:{pos:r-s,margin:s&&1},close:{pos:i+c,margin:c&&1}};let u,d;i-r<=100?u=d=e.sliceDoc(r,i):(u=e.sliceDoc(r,r+50),d=e.sliceDoc(i-50,i));let f=/^\s*/.exec(u)[0].length,p=/\s*$/.exec(d)[0].length,m=d.length-p-n.length;return u.slice(f,f+t.length)==t&&d.slice(m,m+n.length)==n?{open:{pos:r+f+t.length,margin:+!!/\s/.test(u.charAt(f+t.length))},close:{pos:i-p-n.length,margin:+!!/\s/.test(d.charAt(m-1))}}:null}function C_(e){let t=[];for(let n of e.selection.ranges){let r=e.doc.lineAt(n.from),i=n.to<=r.to?r:e.doc.lineAt(n.to);i.from>r.from&&i.from==n.to&&(i=n.to==r.to+1?r:e.doc.lineAt(n.to-1));let a=t.length-1;a>=0&&t[a].to>r.from?t[a].to=i.to:t.push({from:r.from+/^\s*/.exec(r.text)[0].length,to:i.to})}return t}function w_(e,t,n=t.selection.ranges){let r=n.map(e=>x_(t,e.from).block);if(!r.every(e=>e))return null;let i=n.map((e,n)=>S_(t,r[n],e.from,e.to));if(e!=2&&!i.every(e=>e))return{changes:t.changes(n.map((e,t)=>i[t]?[]:[{from:e.from,insert:r[t].open+` `},{from:e.to,insert:` `+r[t].close}]))};if(e!=1&&i.some(e=>e)){let e=[];for(let t=0,n;t<i.length;t++)if(n=i[t]){let i=r[t],{open:a,close:o}=n;e.push({from:a.pos-i.open.length,to:a.pos+a.margin},{from:o.pos-o.margin,to:o.pos+i.close.length})}return{changes:e}}return null}function T_(e,t,n=t.selection.ranges){let r=[],i=-1;ranges:for(let{from:e,to:a}of n){let n=r.length,o=1e9,s;for(let n=e;n<=a;){let c=t.doc.lineAt(n);if(s==null&&(s=x_(t,c.from).line,!s))continue ranges;if(c.from>i&&(e==a||a>c.from)){i=c.from;let e=/^\s*/.exec(c.text)[0].length,t=e==c.length,n=c.text.slice(e,e+s.length)==s?e:-1;e<c.text.length&&e<o&&(o=e),r.push({line:c,comment:n,token:s,indent:e,empty:t,single:!1})}n=c.to+1}if(o<1e9)for(let e=n;e<r.length;e++)r[e].indent<r[e].line.text.length&&(r[e].indent=o);r.length==n+1&&(r[n].single=!0)}if(e!=2&&r.some(e=>e.comment<0&&(!e.empty||e.single))){let e=[];for(let{line:t,token:n,indent:i,empty:a,single:o}of r)(o||!a)&&e.push({from:t.from+i,insert:n+` `});let n=t.changes(e);return{changes:n,selection:t.selection.map(n,1)}}else if(e!=1&&r.some(e=>e.comment>=0)){let e=[];for(let{line:t,comment:n,token:i}of r)if(n>=0){let r=t.from+n,a=r+i.length;t.text[a-t.from]==` `&&a++,e.push({from:r,to:a})}return{changes:e}}return null}const E_=er.define(),D_=er.define(),O_=M.define(),k_=M.define({combine(e){return _r(e,{minDepth:100,newGroupDelay:500,joinToEvent:(e,t)=>t},{minDepth:Math.max,newGroupDelay:Math.min,joinToEvent:(e,t)=>(n,r)=>e(n,r)||t(n,r)})}}),A_=In.define({create(){return J_.empty},update(e,t){let n=t.state.facet(k_),r=t.annotation(E_);if(r){let i=L_.fromTransaction(t,r.selection),a=r.side,o=a==0?e.undone:e.done;return o=i?R_(o,o.length,n.minDepth,i):U_(o,t.startState.selection),new J_(a==0?r.rest:o,a==0?o:r.rest)}let i=t.annotation(D_);if((i==`full`||i==`before`)&&(e=e.isolate()),t.annotation(rr.addToHistory)===!1)return t.changes.empty?e:e.addMapping(t.changes.desc);let a=L_.fromTransaction(t),o=t.annotation(rr.time),s=t.annotation(rr.userEvent);return a?e=e.addChanges(a,o,s,n,t):t.selection&&(e=e.addSelection(t.startState.selection,o,s,n.newGroupDelay)),(i==`full`||i==`after`)&&(e=e.isolate()),e},toJSON(e){return{done:e.done.map(e=>e.toJSON()),undone:e.undone.map(e=>e.toJSON())}},fromJSON(e){return new J_(e.done.map(L_.fromJSON),e.undone.map(L_.fromJSON))}});function j_(e={}){return[A_,k_.of(e),H.domEventHandlers({beforeinput(e,t){let n=e.inputType==`historyUndo`?N_:e.inputType==`historyRedo`?P_:null;return n?(e.preventDefault(),n(t)):!1}})]}function M_(e,t){return function({state:n,dispatch:r}){if(!t&&n.readOnly)return!1;let i=n.field(A_,!1);if(!i)return!1;let a=i.pop(e,n,t);return a?(r(a),!0):!1}}const N_=M_(0,!1),P_=M_(1,!1),F_=M_(0,!0),I_=M_(1,!0);var L_=class e{constructor(e,t,n,r,i){this.changes=e,this.effects=t,this.mapped=n,this.startSelection=r,this.selectionsAfter=i}setSelAfter(t){return new e(this.changes,this.effects,this.mapped,this.startSelection,t)}toJSON(){return{changes:this.changes?.toJSON(),mapped:this.mapped?.toJSON(),startSelection:this.startSelection?.toJSON(),selectionsAfter:this.selectionsAfter.map(e=>e.toJSON())}}static fromJSON(t){return new e(t.changes&&bn.fromJSON(t.changes),[],t.mapped&&yn.fromJSON(t.mapped),t.startSelection&&j.fromJSON(t.startSelection),t.selectionsAfter.map(j.fromJSON))}static fromTransaction(t,n){let r=H_;for(let e of t.startState.facet(O_)){let n=e(t);n.length&&(r=r.concat(n))}return!r.length&&t.changes.empty?null:new e(t.changes.invert(t.startState.doc),r,void 0,n||t.startState.selection,H_)}static selection(t){return new e(void 0,H_,void 0,void 0,t)}};function R_(e,t,n,r){let i=t+1>n+20?t-n-1:0,a=e.slice(i,t);return a.push(r),a}function z_(e,t){let n=[],r=!1;return e.iterChangedRanges((e,t)=>n.push(e,t)),t.iterChangedRanges((e,t,i,a)=>{for(let e=0;e<n.length;){let t=n[e++],o=n[e++];a>=t&&i<=o&&(r=!0)}}),r}function B_(e,t){return e.ranges.length==t.ranges.length&&e.ranges.filter((e,n)=>e.empty!=t.ranges[n].empty).length===0}function V_(e,t){return e.length?t.length?e.concat(t):e:t}const H_=[];function U_(e,t){if(e.length){let n=e[e.length-1],r=n.selectionsAfter.slice(Math.max(0,n.selectionsAfter.length-200));return r.length&&r[r.length-1].eq(t)?e:(r.push(t),R_(e,e.length-1,1e9,n.setSelAfter(r)))}else return[L_.selection([t])]}function W_(e){let t=e[e.length-1],n=e.slice();return n[e.length-1]=t.setSelAfter(t.selectionsAfter.slice(0,t.selectionsAfter.length-1)),n}function G_(e,t){if(!e.length)return e;let n=e.length,r=H_;for(;n;){let i=K_(e[n-1],t,r);if(i.changes&&!i.changes.empty||i.effects.length){let t=e.slice(0,n);return t[n-1]=i,t}else t=i.mapped,n--,r=i.selectionsAfter}return r.length?[L_.selection(r)]:H_}function K_(e,t,n){let r=V_(e.selectionsAfter.length?e.selectionsAfter.map(e=>e.map(t)):H_,n);if(!e.changes)return L_.selection(r);let i=e.changes.map(t),a=t.mapDesc(e.changes,!0),o=e.mapped?e.mapped.composeDesc(a):a;return new L_(i,N.mapEffects(e.effects,t),o,e.startSelection.map(a),r)}const q_=/^(input\.type|delete)($|\.)/;var J_=class e{constructor(e,t,n=0,r=void 0){this.done=e,this.undone=t,this.prevTime=n,this.prevUserEvent=r}isolate(){return this.prevTime?new e(this.done,this.undone):this}addChanges(t,n,r,i,a){let o=this.done,s=o[o.length-1];return o=s&&s.changes&&!s.changes.empty&&t.changes&&(!r||q_.test(r))&&(!s.selectionsAfter.length&&n-this.prevTime<i.newGroupDelay&&i.joinToEvent(a,z_(s.changes,t.changes))||r==`input.type.compose`)?R_(o,o.length-1,i.minDepth,new L_(t.changes.compose(s.changes),V_(N.mapEffects(t.effects,s.changes),s.effects),s.mapped,s.startSelection,H_)):R_(o,o.length,i.minDepth,t),new e(o,H_,n,r)}addSelection(t,n,r,i){let a=this.done.length?this.done[this.done.length-1].selectionsAfter:H_;return a.length>0&&n-this.prevTime<i&&r==this.prevUserEvent&&r&&/^select($|\.)/.test(r)&&B_(a[a.length-1],t)?this:new e(U_(this.done,t),this.undone,n,r)}addMapping(t){return new e(G_(this.done,t),G_(this.undone,t),this.prevTime,this.prevUserEvent)}pop(e,t,n){let r=e==0?this.done:this.undone;if(r.length==0)return null;let i=r[r.length-1],a=i.selectionsAfter[0]||(i.startSelection?i.startSelection.map(i.changes.invertedDesc,1):t.selection);if(n&&i.selectionsAfter.length)return t.update({selection:i.selectionsAfter[i.selectionsAfter.length-1],annotations:E_.of({side:e,rest:W_(r),selection:a}),userEvent:e==0?`select.undo`:`select.redo`,scrollIntoView:!0});if(i.changes){let n=r.length==1?H_:r.slice(0,r.length-1);return i.mapped&&(n=G_(n,i.mapped)),t.update({changes:i.changes,selection:i.startSelection,effects:i.effects,annotations:E_.of({side:e,rest:n,selection:a}),filter:!1,userEvent:e==0?`undo`:`redo`,scrollIntoView:!0})}else return null}};J_.empty=new J_(H_,H_);const Y_=[{key:`Mod-z`,run:N_,preventDefault:!0},{key:`Mod-y`,mac:`Mod-Shift-z`,run:P_,preventDefault:!0},{linux:`Ctrl-Shift-z`,run:P_,preventDefault:!0},{key:`Mod-u`,run:F_,preventDefault:!0},{key:`Alt-u`,mac:`Mod-Shift-u`,run:I_,preventDefault:!0}];function X_(e,t){return j.create(e.ranges.map(t),e.mainIndex)}function Z_(e,t){return e.update({selection:t,scrollIntoView:!0,userEvent:`select`})}function Q_({state:e,dispatch:t},n){let r=X_(e.selection,n);return r.eq(e.selection,!0)?!1:(t(Z_(e,r)),!0)}function $_(e,t){return j.cursor(t?e.to:e.from)}function ev(e,t){return Q_(e,n=>n.empty?e.moveByChar(n,t):$_(n,t))}function tv(e){return e.textDirectionAt(e.state.selection.main.head)==R.LTR}const nv=e=>ev(e,!tv(e)),rv=e=>ev(e,tv(e));function iv(e,t){return Q_(e,n=>n.empty?e.moveByGroup(n,t):$_(n,t))}const av=e=>iv(e,!tv(e)),ov=e=>iv(e,tv(e));typeof Intl<`u`&&Intl.Segmenter;function sv(e,t,n){if(t.type.prop(n))return!0;let r=t.to-t.from;return r&&(r>2||/[^\s,.;:]/.test(e.sliceDoc(t.from,t.to)))||t.firstChild}function cv(e,t,n){let r=Y(e).resolveInner(t.head),i=n?U.closedBy:U.openedBy;for(let a=t.head;;){let t=n?r.childAfter(a):r.childBefore(a);if(!t)break;sv(e,t,i)?r=t:a=n?t.to:t.from}let a=r.type.prop(i),o,s;return s=a&&(o=n?Id(e,r.from,1):Id(e,r.to,-1))&&o.matched?n?o.end.to:o.end.from:n?r.to:r.from,j.cursor(s,n?-1:1)}const lv=e=>Q_(e,t=>cv(e.state,t,!tv(e))),uv=e=>Q_(e,t=>cv(e.state,t,tv(e)));function dv(e,t){return Q_(e,n=>{if(!n.empty)return $_(n,t);let r=e.moveVertically(n,t);return r.head==n.head?e.moveToLineBoundary(n,t):r})}const fv=e=>dv(e,!1),pv=e=>dv(e,!0);function mv(e){let t=e.scrollDOM.clientHeight<e.scrollDOM.scrollHeight-2,n=0,r=0,i;if(t){for(let t of e.state.facet(H.scrollMargins)){let i=t(e);i?.top&&(n=Math.max(i?.top,n)),i?.bottom&&(r=Math.max(i?.bottom,r))}i=e.scrollDOM.clientHeight-n-r}else i=(e.dom.ownerDocument.defaultView||window).innerHeight;return{marginTop:n,marginBottom:r,selfScroll:t,height:Math.max(e.defaultLineHeight,i-5)}}function hv(e,t){let n=mv(e),{state:r}=e,i=X_(r.selection,r=>r.empty?e.moveVertically(r,t,n.height):$_(r,t));if(i.eq(r.selection))return!1;let a;if(n.selfScroll){let t=e.coordsAtPos(r.selection.main.head),o=e.scrollDOM.getBoundingClientRect(),s=o.top+n.marginTop,c=o.bottom-n.marginBottom;t&&t.top>s&&t.bottom<c&&(a=H.scrollIntoView(i.main.head,{y:`start`,yMargin:t.top-s}))}return e.dispatch(Z_(r,i),{effects:a}),!0}const gv=e=>hv(e,!1),_v=e=>hv(e,!0);function vv(e,t,n){let r=e.lineBlockAt(t.head),i=e.moveToLineBoundary(t,n);if(i.head==t.head&&i.head!=(n?r.to:r.from)&&(i=e.moveToLineBoundary(t,n,!1)),!n&&i.head==r.from&&r.length){let n=/^\s*/.exec(e.state.sliceDoc(r.from,Math.min(r.from+100,r.to)))[0].length;n&&t.head!=r.from+n&&(i=j.cursor(r.from+n))}return i}const yv=e=>Q_(e,t=>vv(e,t,!0)),bv=e=>Q_(e,t=>vv(e,t,!1)),xv=e=>Q_(e,t=>vv(e,t,!tv(e))),Sv=e=>Q_(e,t=>vv(e,t,tv(e))),Cv=e=>Q_(e,t=>j.cursor(e.lineBlockAt(t.head).from,1)),wv=e=>Q_(e,t=>j.cursor(e.lineBlockAt(t.head).to,-1));function Tv(e,t,n){let r=!1,i=X_(e.selection,t=>{let i=Id(e,t.head,-1)||Id(e,t.head,1)||t.head>0&&Id(e,t.head-1,1)||t.head<e.doc.length&&Id(e,t.head+1,-1);if(!i||!i.end)return t;r=!0;let a=i.start.from==t.head?i.end.to:i.end.from;return n?j.range(t.anchor,a):j.cursor(a)});return r?(t(Z_(e,i)),!0):!1}const Ev=({state:e,dispatch:t})=>Tv(e,t,!1);function Dv(e,t,n){let r=X_(e.state.selection,e=>{e.undirectional&&e.head>=e.anchor!=t&&(e=j.range(e.head,e.anchor));let r=n(e);return j.range(e.anchor,r.head,r.goalColumn,r.bidiLevel||void 0,r.assoc)});return r.eq(e.state.selection)?!1:(e.dispatch(Z_(e.state,r)),!0)}function Ov(e,t){return Dv(e,t,n=>e.moveByChar(n,t))}const kv=e=>Ov(e,!tv(e)),Av=e=>Ov(e,tv(e));function jv(e,t){return Dv(e,t,n=>e.moveByGroup(n,t))}const Mv=e=>jv(e,!tv(e)),Nv=e=>jv(e,tv(e)),Pv=e=>{let t=!tv(e);return Dv(e,t,n=>cv(e.state,n,t))},Fv=e=>{let t=tv(e);return Dv(e,t,n=>cv(e.state,n,t))};function Iv(e,t){return Dv(e,t,n=>e.moveVertically(n,t))}const Lv=e=>Iv(e,!1),Rv=e=>Iv(e,!0);function zv(e,t){return Dv(e,t,n=>e.moveVertically(n,t,mv(e).height))}const Bv=e=>zv(e,!1),Vv=e=>zv(e,!0),Hv=e=>Dv(e,!0,t=>vv(e,t,!0)),Uv=e=>Dv(e,!1,t=>vv(e,t,!1)),Wv=e=>{let t=!tv(e);return Dv(e,t,n=>vv(e,n,t))},Gv=e=>{let t=tv(e);return Dv(e,t,n=>vv(e,n,t))},Kv=e=>Dv(e,!1,t=>j.cursor(e.lineBlockAt(t.head).from)),qv=e=>Dv(e,!0,t=>j.cursor(e.lineBlockAt(t.head).to)),Jv=({state:e,dispatch:t})=>(t(Z_(e,{anchor:0})),!0),Yv=({state:e,dispatch:t})=>(t(Z_(e,{anchor:e.doc.length})),!0),Xv=({state:e,dispatch:t})=>(t(Z_(e,{anchor:e.selection.main.anchor,head:0})),!0),Zv=({state:e,dispatch:t})=>(t(Z_(e,{anchor:e.selection.main.anchor,head:e.doc.length})),!0),Qv=({state:e,dispatch:t})=>(t(e.update({selection:{anchor:0,head:e.doc.length},userEvent:`select`})),!0),$v=({state:e,dispatch:t})=>{let n=vy(e).map(({from:t,to:n})=>j.undirectionalRange(t,Math.min(n+1,e.doc.length)));return t(e.update({selection:j.create(n),userEvent:`select`})),!0},ey=({state:e,dispatch:t})=>{let n=X_(e.selection,t=>{let n=Y(e),r=n.resolveStack(t.from,1);if(t.empty){let e=n.resolveStack(t.from,-1);e.node.from>=r.node.from&&e.node.to<=r.node.to&&(r=e)}for(let e=r;e;e=e.next){let{node:n}=e;if((n.from<t.from&&n.to>=t.to||n.to>t.to&&n.from<=t.from)&&e.next)return j.undirectionalRange(n.from,n.to)}return t});return n.eq(e.selection)?!1:(t(Z_(e,n)),!0)};function ty(e,t){let{state:n}=e,r=n.selection,i=n.selection.ranges.slice();for(let r of n.selection.ranges){let a=n.doc.lineAt(r.head);if(t?a.to<e.state.doc.length:a.from>0)for(let n=r;;){let r=e.moveVertically(n,t);if(r.head<a.from||r.head>a.to){i.some(e=>e.head==r.head)||i.push(r);break}else if(r.head==n.head)break;else n=r}}return i.length==r.ranges.length?!1:(e.dispatch(Z_(n,j.create(i,i.length-1))),!0)}const ny=e=>ty(e,!1),ry=e=>ty(e,!0),iy=({state:e,dispatch:t})=>{let n=e.selection,r=null;return n.ranges.length>1?r=j.create([n.main]):n.main.empty||(r=j.create([j.cursor(n.main.head)])),r?(t(Z_(e,r)),!0):!1};function ay(e,t){if(e.state.readOnly)return!1;let n=`delete.selection`,{state:r}=e,i=r.changeByRange(r=>{let{from:i,to:a}=r;if(i==a){let o=t(r);o<i?(n=`delete.backward`,o=oy(e,o,!1)):o>i&&(n=`delete.forward`,o=oy(e,o,!0)),i=Math.min(i,o),a=Math.max(a,o)}else i=oy(e,i,!1),a=oy(e,a,!0);return i==a?{range:r}:{changes:{from:i,to:a},range:j.cursor(i,i<r.head?-1:1)}});return i.changes.empty?!1:(e.dispatch(r.update(i,{scrollIntoView:!0,userEvent:n,effects:n==`delete.selection`?H.announce.of(r.phrase(`Selection deleted`)):void 0})),!0)}function oy(e,t,n){if(e instanceof H)for(let r of e.state.facet(H.atomicRanges).map(t=>t(e)))r.between(t,t,(e,r)=>{e<t&&r>t&&(t=n?r:e)});return t}const sy=(e,t,n)=>ay(e,r=>{let i=r.from,{state:a}=e,o=a.doc.lineAt(i),s,c;if(n&&!t&&i>o.from&&i<o.from+200&&!/[^ \t]/.test(s=o.text.slice(0,i-o.from))){if(s[s.length-1]==` `)return i-1;let e=Ir(s,a.tabSize)%od(a)||od(a);for(let t=0;t<e&&s[s.length-1-t]==` `;t++)i--;c=i}else c=fn(o.text,i-o.from,t,t)+o.from,c==i&&o.number!=(t?a.doc.lines:1)?c+=t?1:-1:!t&&/[\ufe00-\ufe0f]/.test(o.text.slice(c-o.from,i-o.from))&&(c=fn(o.text,c-o.from,!1,!1)+o.from);return c}),cy=e=>sy(e,!1,!0),ly=e=>sy(e,!0,!1),uy=(e,t)=>ay(e,n=>{let r=n.head,{state:i}=e,a=i.doc.lineAt(r),o=i.charCategorizer(r);for(let e=null;;){if(r==(t?a.to:a.from)){r==n.head&&a.number!=(t?i.doc.lines:1)&&(r+=t?1:-1);break}let s=fn(a.text,r-a.from,t)+a.from,c=a.text.slice(Math.min(r,s)-a.from,Math.max(r,s)-a.from),l=o(c);if(e!=null&&l!=e)break;(c!=` `||r!=n.head)&&(e=l),r=s}return r}),dy=e=>uy(e,!1),fy=e=>uy(e,!0),py=e=>ay(e,t=>{let n=e.lineBlockAt(t.head).to;return t.head<n?n:Math.min(e.state.doc.length,t.head+1)}),my=e=>ay(e,t=>{let n=e.moveToLineBoundary(t,!1).head;return t.head>n?n:Math.max(0,t.head-1)}),hy=e=>ay(e,t=>{let n=e.moveToLineBoundary(t,!0).head;return t.head<n?n:Math.min(e.state.doc.length,t.head+1)}),gy=({state:e,dispatch:t})=>{if(e.readOnly)return!1;let n=e.changeByRange(e=>({changes:{from:e.from,to:e.to,insert:A.of([``,``])},range:j.cursor(e.from)}));return t(e.update(n,{scrollIntoView:!0,userEvent:`input`})),!0},_y=({state:e,dispatch:t})=>{if(e.readOnly)return!1;let n=e.changeByRange(t=>{if(!t.empty||t.from==0||t.from==e.doc.length)return{range:t};let n=t.from,r=e.doc.lineAt(n),i=n==r.from?n-1:fn(r.text,n-r.from,!1)+r.from,a=n==r.to?n+1:fn(r.text,n-r.from,!0)+r.from;return{changes:{from:i,to:a,insert:e.doc.slice(n,a).append(e.doc.slice(i,n))},range:j.cursor(a)}});return n.changes.empty?!1:(t(e.update(n,{scrollIntoView:!0,userEvent:`move.character`})),!0)};function vy(e){let t=[],n=-1;for(let r of e.selection.ranges){let i=e.doc.lineAt(r.from),a=e.doc.lineAt(r.to);if(!r.empty&&r.to==a.from&&(a=e.doc.lineAt(r.to-1)),n>=i.number){let e=t[t.length-1];e.to=a.to,e.ranges.push(r)}else t.push({from:i.from,to:a.to,ranges:[r]});n=a.number+1}return t}function yy(e,t,n){if(e.readOnly)return!1;let r=[],i=[];for(let t of vy(e)){if(n?t.to==e.doc.length:t.from==0)continue;let a=e.doc.lineAt(n?t.to+1:t.from-1),o=a.length+1;if(n){r.push({from:t.to,to:a.to},{from:t.from,insert:a.text+e.lineBreak});for(let n of t.ranges)i.push(j.range(Math.min(e.doc.length,n.anchor+o),Math.min(e.doc.length,n.head+o)))}else{r.push({from:a.from,to:t.from},{from:t.to,insert:e.lineBreak+a.text});for(let e of t.ranges)i.push(j.range(e.anchor-o,e.head-o))}}return r.length?(t(e.update({changes:r,scrollIntoView:!0,selection:j.create(i,e.selection.mainIndex),userEvent:`move.line`})),!0):!1}const by=({state:e,dispatch:t})=>yy(e,t,!1),xy=({state:e,dispatch:t})=>yy(e,t,!0);function Sy(e,t,n){if(e.readOnly)return!1;let r=[];for(let t of vy(e))n?r.push({from:t.from,insert:e.doc.slice(t.from,t.to)+e.lineBreak}):r.push({from:t.to,insert:e.lineBreak+e.doc.slice(t.from,t.to)});let i=e.changes(r);return t(e.update({changes:i,selection:e.selection.map(i,n?1:-1),scrollIntoView:!0,userEvent:`input.copyline`})),!0}const Cy=({state:e,dispatch:t})=>Sy(e,t,!1),wy=({state:e,dispatch:t})=>Sy(e,t,!0),Ty=e=>{if(e.state.readOnly)return!1;let{state:t}=e,n=t.changes(vy(t).map(({from:e,to:n})=>(e>0?e--:n<t.doc.length&&n++,{from:e,to:n}))),r=X_(t.selection,t=>{let n;if(e.lineWrapping){let r=e.lineBlockAt(t.head),i=e.coordsAtPos(t.head,t.assoc||1);i&&(n=r.bottom+e.documentTop-i.bottom+e.defaultLineHeight/2)}return e.moveVertically(t,!0,n)}).map(n);return e.dispatch({changes:n,selection:r,scrollIntoView:!0,userEvent:`delete.line`}),!0};function Ey(e,t){if(/\(\)|\[\]|\{\}/.test(e.sliceDoc(t-1,t+1)))return{from:t,to:t};let n=Y(e).resolveInner(t),r=n.childBefore(t),i=n.childAfter(t),a;return r&&i&&r.to<=t&&i.from>=t&&(a=r.type.prop(U.closedBy))&&a.indexOf(i.name)>-1&&e.doc.lineAt(r.to).from==e.doc.lineAt(i.from).from&&!/\S/.test(e.sliceDoc(r.to,i.from))?{from:r.to,to:i.from}:null}const Dy=ky(!1),Oy=ky(!0);function ky(e){return({state:t,dispatch:n})=>{if(t.readOnly)return!1;let r=t.changeByRange(n=>{let{from:r,to:i}=n,a=t.doc.lineAt(r),o=!e&&r==i&&Ey(t,r);e&&(r=i=(i<=a.to?a:t.doc.lineAt(i)).to);let s=new ld(t,{simulateBreak:r,simulateDoubleBreak:!!o}),c=cd(s,r);for(c??=Ir(/^\s*/.exec(t.doc.lineAt(r).text)[0],t.tabSize);i<a.to&&/\s/.test(a.text[i-a.from]);)i++;o?{from:r,to:i}=o:r>a.from&&r<a.from+100&&!/\S/.test(a.text.slice(0,r))&&(r=a.from);let l=[``,sd(t,c)];return o&&l.push(sd(t,s.lineIndent(a.from,-1))),{changes:{from:r,to:i,insert:A.of(l)},range:j.cursor(r+1+l[1].length)}});return n(t.update(r,{scrollIntoView:!0,userEvent:`input`})),!0}}function Ay(e,t){let n=-1;return e.changeByRange(r=>{let i=[];for(let a=r.from;a<=r.to;){let o=e.doc.lineAt(a);o.number>n&&(r.empty||r.to>o.from)&&(t(o,i,r),n=o.number),a=o.to+1}let a=e.changes(i);return{changes:i,range:j.range(a.mapPos(r.anchor,1),a.mapPos(r.head,1))}})}const jy=({state:e,dispatch:t})=>{if(e.readOnly)return!1;let n=Object.create(null),r=new ld(e,{overrideIndentation:e=>n[e]??-1}),i=Ay(e,(t,i,a)=>{let o=cd(r,t.from);if(o==null)return;/\S/.test(t.text)||(o=0);let s=/^\s*/.exec(t.text)[0],c=sd(e,o);(s!=c||a.from<t.from+s.length)&&(n[t.from]=o,i.push({from:t.from,to:t.from+s.length,insert:c}))});return i.changes.empty||t(e.update(i,{userEvent:`indent`})),!0},My=({state:e,dispatch:t})=>e.readOnly?!1:(t(e.update(Ay(e,(t,n)=>{n.push({from:t.from,insert:e.facet(ad)})}),{userEvent:`input.indent`})),!0),Ny=({state:e,dispatch:t})=>e.readOnly?!1:(t(e.update(Ay(e,(t,n)=>{let r=/^\s*/.exec(t.text)[0];if(!r)return;let i=Ir(r,e.tabSize),a=0,o=sd(e,Math.max(0,i-od(e)));for(;a<r.length&&a<o.length&&r.charCodeAt(a)==o.charCodeAt(a);)a++;n.push({from:t.from+a,to:t.from+r.length,insert:o.slice(a)})}),{userEvent:`delete.dedent`})),!0),Py=e=>(e.setTabFocusMode(),!0),Fy=[{key:`Ctrl-b`,run:nv,shift:kv,preventDefault:!0},{key:`Ctrl-f`,run:rv,shift:Av},{key:`Ctrl-p`,run:fv,shift:Lv},{key:`Ctrl-n`,run:pv,shift:Rv},{key:`Ctrl-a`,run:Cv,shift:Kv},{key:`Ctrl-e`,run:wv,shift:qv},{key:`Ctrl-d`,run:ly},{key:`Ctrl-h`,run:cy},{key:`Ctrl-k`,run:py},{key:`Ctrl-Alt-h`,run:dy},{key:`Ctrl-o`,run:gy},{key:`Ctrl-t`,run:_y},{key:`Ctrl-v`,run:_v}],Iy=[{key:`ArrowLeft`,run:nv,shift:kv,preventDefault:!0},{key:`Mod-ArrowLeft`,mac:`Alt-ArrowLeft`,run:av,shift:Mv,preventDefault:!0},{mac:`Cmd-ArrowLeft`,run:xv,shift:Wv,preventDefault:!0},{key:`ArrowRight`,run:rv,shift:Av,preventDefault:!0},{key:`Mod-ArrowRight`,mac:`Alt-ArrowRight`,run:ov,shift:Nv,preventDefault:!0},{mac:`Cmd-ArrowRight`,run:Sv,shift:Gv,preventDefault:!0},{key:`ArrowUp`,run:fv,shift:Lv,preventDefault:!0},{mac:`Cmd-ArrowUp`,run:Jv,shift:Xv},{mac:`Ctrl-ArrowUp`,run:gv,shift:Bv},{key:`ArrowDown`,run:pv,shift:Rv,preventDefault:!0},{mac:`Cmd-ArrowDown`,run:Yv,shift:Zv},{mac:`Ctrl-ArrowDown`,run:_v,shift:Vv},{key:`PageUp`,run:gv,shift:Bv},{key:`PageDown`,run:_v,shift:Vv},{key:`Home`,run:bv,shift:Uv,preventDefault:!0},{key:`Mod-Home`,run:Jv,shift:Xv},{key:`End`,run:yv,shift:Hv,preventDefault:!0},{key:`Mod-End`,run:Yv,shift:Zv},{key:`Enter`,run:Dy,shift:Dy},{key:`Mod-a`,run:Qv},{key:`Backspace`,run:cy,shift:cy,preventDefault:!0},{key:`Delete`,run:ly,preventDefault:!0},{key:`Mod-Backspace`,mac:`Alt-Backspace`,run:dy,preventDefault:!0},{key:`Mod-Delete`,mac:`Alt-Delete`,run:fy,preventDefault:!0},{mac:`Mod-Backspace`,run:my,preventDefault:!0},{mac:`Mod-Delete`,run:hy,preventDefault:!0}].concat(Fy.map(e=>({mac:e.key,run:e.run,shift:e.shift}))),Ly=[{key:`Alt-ArrowLeft`,mac:`Ctrl-ArrowLeft`,run:lv,shift:Pv},{key:`Alt-ArrowRight`,mac:`Ctrl-ArrowRight`,run:uv,shift:Fv},{key:`Alt-ArrowUp`,run:by},{key:`Shift-Alt-ArrowUp`,run:Cy},{key:`Alt-ArrowDown`,run:xy},{key:`Shift-Alt-ArrowDown`,run:wy},{key:`Mod-Alt-ArrowUp`,run:ny},{key:`Mod-Alt-ArrowDown`,run:ry},{key:`Escape`,run:iy},{key:`Mod-Enter`,run:Oy},{key:`Alt-l`,mac:`Ctrl-l`,run:$v},{key:`Mod-i`,run:ey,preventDefault:!0},{key:`Mod-[`,run:Ny},{key:`Mod-]`,run:My},{key:`Mod-Alt-\\`,run:jy},{key:`Shift-Mod-k`,run:Ty},{key:`Shift-Mod-\\`,run:Ev},{key:`Mod-/`,run:g_},{key:`Alt-A`,mac:`Ctrl-A`,run:y_},{key:`Ctrl-m`,mac:`Shift-Alt-m`,run:Py}].concat(Iy),Ry=`var(--dsw-alias-brand-primary, #3e63dd)`,zy=`color-mix(in srgb, var(--dsw-alias-brand-primary, #3e63dd) 55%, transparent)`,By=`var(--dsw-alias-label-dimmed, #999)`,Vy=`ui-monospace, "Cascadia Mono", Consolas, "SF Mono", Menlo, monospace`,Hy=Ed.define([{tag:[J.heading1,J.heading2,J.heading3,J.heading4,J.heading5,J.heading6],color:Ry,fontWeight:`700`},{tag:J.processingInstruction,color:zy},{tag:J.monospace,fontFamily:Vy,backgroundColor:`color-mix(in srgb, var(--dsw-alias-label-secondary, #888) 12%, transparent)`,borderRadius:`4px`,padding:`0 3px`},{tag:J.content,fontFamily:Vy,backgroundColor:`color-mix(in srgb, var(--dsw-alias-label-secondary, #888) 8%, transparent)`},{tag:J.strong,fontWeight:`700`},{tag:J.emphasis,fontStyle:`italic`},{tag:J.strikethrough,textDecoration:`line-through`,opacity:`.75`},{tag:J.link,color:Ry,textDecoration:`underline`},{tag:J.url,color:zy,textDecoration:`underline dotted`},{tag:J.quote,fontStyle:`italic`,color:`var(--dsw-alias-label-secondary, #888)`},{tag:J.contentSeparator,color:By,textDecoration:`line-through`},{tag:J.comment,color:By}]);function Uy(e={}){let t=document.createElement(`div`);t.className=`dsh-tw-note-editor`;let n=new H({parent:t,state:P.create({doc:``,extensions:[H.lineWrapping,j_(),u_({base:Xg}),Ad(Hy),fl(),bl(e.placeholder??``),Xc.of([...Ly,...Y_,{key:`Mod-Enter`,run:()=>(e.onSave?.(),!0)}]),H.updateListener.of(t=>{t.docChanged&&e.onChange?.()})]})});return{el:t,view:n,getValue:()=>n.state.doc.toString(),setValue(e){n.dispatch({changes:{from:0,to:n.state.doc.length,insert:e}})},insertAtCaret(e){let{from:t}=n.state.selection.main,r=`${t===n.state.doc.lineAt(t).from?``:`
|
|
807
|
-
`}${e}\n`;n.dispatch({changes:{from:t,insert:r},selection:{anchor:t+r.length},scrollIntoView:!0}),n.focus()},focus:()=>n.focus()}}const Wy=`dsh-tw-note-state`,Gy=`dsh-tw-note-draft-v1`,Ky=`dsh-tw-note-window-id`,qy=(()=>{try{let e=sessionStorage.getItem(Ky);if(e!==null&&e.length>0)return e;let t=Math.random().toString(36).slice(2,10);return sessionStorage.setItem(Ky,t),t}catch{return Math.random().toString(36).slice(2,10)}})();function Jy(){return`dsh-tw-note-draft-v1:${qy}`}function Yy(e){if(e===null)return null;try{let t=JSON.parse(e);return typeof t.text!=`string`||typeof t.title!=`string`?null:{text:t.text,title:t.title,tags:Array.isArray(t.tags)?t.tags.filter(e=>typeof e==`string`):[],savedAt:typeof t.savedAt==`number`?t.savedAt:0,windowId:typeof t.windowId==`string`?t.windowId:void 0}}catch{return null}}function Xy(e){try{return Yy(localStorage.getItem(e))}catch{return null}}function Zy(){let e=Xy(Jy());if(e!==null)return{draft:e,foreign:e.windowId!==void 0&&e.windowId!==qy};let t=Xy(Gy);if(t===null)return null;let n={...t,windowId:qy};$y(n);try{localStorage.removeItem(Gy)}catch{}return{draft:n,foreign:!0}}function Qy(e){$y({...e,windowId:qy})}function $y(e){try{localStorage.setItem(Jy(),JSON.stringify({...e,windowId:qy}))}catch{}}function eb(){try{localStorage.removeItem(Jy())}catch{}}function tb(e,t,n){return`${e}\u0000${t}\u0000${n.join(``)}`}function nb(e){return e<10?`0${e}`:String(e)}function rb(e=new Date){return`${e.getFullYear()}-${nb(e.getMonth()+1)}-${nb(e.getDate())} ${nb(e.getHours())}:${nb(e.getMinutes())}`}function ib(e){if(e===null)return``;let t=new Date(e).getTime();if(Number.isNaN(t))return``;let n=Date.now()-t,r=Math.floor(n/6e4);if(r<1)return`刚刚`;if(r<60)return`${r}分钟前`;let i=Math.floor(r/60);if(i<24)return`${i}小时前`;let a=Math.floor(i/24);return a<30?`${a}天前`:new Date(t).toLocaleDateString(`zh-CN`)}async function ab(){let e=await _e();return typeof e?.note?.tag==`string`&&e.note.tag.length>0?e.note.tag:`inbox`}function ob(e={}){let t=document.createElement(`div`);t.className=`dsh-tw-note-tags`;let n=document.createElement(`div`);n.className=`dsh-tw-note-chips`;let r=document.createElement(`input`);r.className=`dsh-tw-note-taginput`,r.placeholder=`tag(可多选,自动补全)`;let i=document.createElement(`div`);i.className=`dsh-tw-note-tagsuggest`,i.hidden=!0,t.append(n,r,i);let a=[],o=()=>{i.hidden=!0},s=()=>{e.onChange?.()},c=()=>{n.replaceChildren();for(let e of a){let t=document.createElement(`span`);t.className=`dsh-tw-note-tagchip`,t.textContent=e;let r=document.createElement(`span`);r.className=`dsh-tw-note-tagchip-x`,r.textContent=`×`,r.title=`移除 tag「${e}」`,r.addEventListener(`click`,t=>{t.stopPropagation();let n=a.indexOf(e);n>=0&&(a.splice(n,1),c(),s())}),t.append(r),n.append(t)}},l=e=>{let t=e.trim();t.length===0||a.includes(t)||(a.push(t),r.value=``,c(),o(),r.focus(),s())},u=()=>{for(let e of r.value.split(/\s+/))l(e)},d=[],f,p,m=()=>{let t=e.wikiQuery?.(b)??b;return(f===void 0||p!==t)&&(p=t,f=fetch(t,{signal:AbortSignal.timeout(5e3)}).then(e=>e.ok?e.json():Promise.resolve({})).then(e=>[...e.tags??[]].sort((e,t)=>e.localeCompare(t,`zh`))).catch(()=>[]),f.then(e=>{d=e})),f},h=()=>{let e=r.value.trim().toLowerCase(),t=d.filter(t=>!a.includes(t)&&(e.length===0||t.toLowerCase().includes(e))).slice(0,8);i.replaceChildren();for(let e of t){let t=document.createElement(`div`);t.className=`dsh-tw-note-tagsuggest-item`,t.textContent=e,t.setAttribute(`role`,`button`),t.tabIndex=0,t.setAttribute(`aria-label`,`添加标签「${e}」`),t.addEventListener(`mousedown`,t=>{t.preventDefault(),l(e)}),t.addEventListener(`keydown`,t=>{(t.key===`Enter`||t.key===` `)&&(t.preventDefault(),l(e))}),i.append(t)}i.hidden=t.length===0};r.addEventListener(`focus`,()=>{m().then(h)}),r.addEventListener(`input`,()=>{d.length===0?m().then(h):h()}),r.addEventListener(`keydown`,e=>{e.key===`Enter`||e.key===`,`?(e.preventDefault(),u()):e.key===`Backspace`&&r.value.length===0&&a.length>0?(a.pop(),c(),s()):e.key===`Escape`&&o()});let g=e=>{t.contains(e.target)||o()};return document.addEventListener(`click`,g,!0),{el:t,getTags:()=>(u(),[...a]),peekTags:()=>[...a],setDefault:e=>{if(a.length===0){let t=e.trim();t.length>0&&(a.push(t),c())}},setTags:e=>{a.length=0;for(let t of Array.isArray(e)?e:[]){let e=typeof t==`string`?t.trim():``;e.length>0&&!a.includes(e)&&a.push(e)}r.value=``,c(),o()},dispose:()=>document.removeEventListener(`click`,g,!0)}}async function sb(e,t,n=e=>e){if(e.size>67108864){O(`文件过大(≤ 64MB)`);return}try{let r=await fetch(n(`${ee}?name=${encodeURIComponent(e.name)}`),{method:`POST`,headers:{"content-type":e.type||`application/octet-stream`},body:e,signal:AbortSignal.timeout(12e4)}),i=await r.json().catch(()=>null);if(!r.ok||i?.ok!==!0){O(`上传失败:${i?.error??`HTTP ${r.status}`}`);return}let a=i.name??e.name,o=e.type.startsWith(`image/`)?``:`[${a}](${i.url})`;t.insertAtCaret(o),O(`已上传「${a}」并插入链接`)}catch(e){O(`上传失败:${e instanceof Error?e.message:String(e)}`)}}function cb(){let e,t=!1,n=!1,r=!1,i,a=`inbox`,o,s=!1,c=`single`,l=[],u,d=e=>me(e,o),f,p=!1,m=null,h=null,_=e=>{try{window.dispatchEvent(new CustomEvent(Wy,{detail:{open:e}}))}catch{}},b=t=>{if(e===void 0)return;let n=e.root,r=e.card;if(t!==void 0){let e=t.getBoundingClientRect(),i=r.offsetWidth||340,a=r.offsetHeight||260,o=window.innerWidth,s=window.innerHeight,c=Math.min(Math.max(e.left+e.width/2-i/2,8),Math.max(8,o-i-8)),l=s-e.top+10,u=Math.min(Math.max(8,l),Math.max(8,s-a-8));n.style.right=`auto`,n.style.top=`auto`,n.style.left=`${c}px`,n.style.bottom=`${u}px`}else n.style.right=`24px`,n.style.bottom=`88px`,n.style.left=`auto`,n.style.top=`auto`},S=null,ee=()=>{e!==void 0&&(S=rb(),e.titleInput.value=S)},te=()=>{if(e===void 0)return;let t=e.editor.getValue(),n=e.titleInput.value.trim();if(t.trim().length===0&&(n.length===0||n===S)){eb();return}let r=tb(n,t,e.tagEditor.peekTags());h!==null&&r===h||$y({text:t,title:n,tags:e.tagEditor.peekTags(),savedAt:Date.now()})},ne=()=>{t||!n||e===void 0||(f!==void 0&&(clearTimeout(f),f=void 0),f=window.setTimeout(()=>{f=void 0,te()},500))},C=()=>{e!==void 0&&(e.draftBanner.hidden=!0)},re=async(e,t,n)=>{try{let r=await fetch(d(y),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({title:e,tags:n,text:t}),signal:AbortSignal.timeout(1e4)}),i=await r.json().catch(()=>null);if(!r.ok||i?.ok!==!0)return O(`打开失败:${i?.error??`HTTP ${r.status}`}`),!1;if(typeof i.twUrl!=`string`||typeof i.draftTitle!=`string`)return O(`打开失败:服务未返回编辑器地址`),!1;eb(),C(),h=tb(e,t,n),m=null;let a=pe(c,o,i.twUrl,i.twUrlAbsolute);return It(`${fe(a.relative,a.absolute)}#${encodeURIComponent(i.draftTitle)}`,i.title??e),O(`已在弹出窗口打开「${i.title??e}」编辑器`),!0}catch(e){return O(`打开失败:${e instanceof Error?e.message:String(e)}`),!1}},ie=()=>{p=!1,e!==void 0&&(e.recentWrap.hidden=!0)},w=async t=>{try{let n=await fetch(d(`${g}?title=${encodeURIComponent(t)}`),{signal:AbortSignal.timeout(1e4)}),r=await n.json().catch(()=>null);if(!n.ok||r?.ok!==!0||typeof r.title!=`string`){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??[]),m={title:r.title,...typeof r.modified==`string`&&r.modified.length>0?{modified:r.modified}:{},...typeof r.revision==`number`?{revision:r.revision}:{}},h=tb(r.title,r.text??``,r.tags??[]),C(),ie(),O(`已载入「${r.title}」`),e.editor.focus()}catch(e){O(`读取失败:${e instanceof Error?e.message:String(e)}`)}},ae=()=>{if(e===void 0)return;if(p){ie();return}p=!0,e.recentWrap.hidden=!1,e.recentWrap.textContent=``;let t=document.createElement(`div`);t.className=`dsh-tw-note-recent-muted`,t.textContent=`加载中…`,e.recentWrap.append(t),(async()=>{try{let t=await(await fetch(d(`${x}?limit=15`),{signal:AbortSignal.timeout(1e4)})).json().catch(()=>null);if(!p||e===void 0)return;e.recentWrap.replaceChildren();let n=[];if(t?.ok===!0)for(let e of t.items??[]){if(typeof e!=`object`||!e)continue;let t=e,r=typeof t.title==`string`?t.title:``;r.length!==0&&n.push({title:r,tags:Array.isArray(t.tags)?t.tags.filter(e=>typeof e==`string`):[],modified:typeof t.modified==`string`?t.modified:null,snippet:typeof t.snippet==`string`?t.snippet:``})}if(n.length===0){let n=document.createElement(`div`);n.className=`dsh-tw-note-recent-muted`,n.textContent=t?.ok===!0?`暂无笔记`:`加载失败:${t?.error??`未知`}`,e.recentWrap.append(n);return}for(let t of n){let n=document.createElement(`div`);n.className=`dsh-tw-note-recent-item`,n.title=t.snippet||t.title,n.setAttribute(`role`,`button`),n.tabIndex=0,n.setAttribute(`aria-label`,`载入笔记「${t.title}」`);let r=document.createElement(`span`);r.className=`dsh-tw-note-recent-name`,r.textContent=t.title;let i=document.createElement(`span`);i.className=`dsh-tw-note-recent-meta`;let a=[ib(t.modified)];t.tags.length>0&&a.unshift(t.tags.slice(0,3).join(`,`)),i.textContent=a.join(` · `),n.append(r,i),n.addEventListener(`click`,()=>{w(t.title)}),n.addEventListener(`keydown`,e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),w(t.title))}),e.recentWrap.append(n)}}catch(t){if(!p||e===void 0)return;e.recentWrap.replaceChildren();let n=document.createElement(`div`);n.className=`dsh-tw-note-recent-muted`,n.textContent=`加载失败:${t instanceof Error?t.message:String(t)}`,e.recentWrap.append(n)}})()},T=()=>{if(e!==void 0)return;let r=document.createElement(`div`);r.className=`dsh-tw-note`,r.hidden=!0;let a=document.createElement(`div`);a.className=`dsh-tw-note-card`;let p=document.createElement(`div`);p.className=`dsh-tw-note-head`;let g=document.createElement(`span`);g.className=`dsh-tw-note-label`,g.textContent=`📝 快速笔记`;let y=document.createElement(`button`);y.type=`button`,y.className=`dsh-tw-note-close`,y.title=`收起`,y.textContent=`✕`,p.append(g,y);let b=document.createElement(`div`);b.className=`dsh-tw-note-draft`,b.hidden=!0;let x=document.createElement(`span`);x.className=`dsh-tw-note-draft-text`,x.textContent=`已恢复未保存草稿`;let ee=document.createElement(`button`);ee.type=`button`,ee.className=`dsh-tw-note-draft-discard`,ee.textContent=`丢弃`,b.append(x,ee);let w=document.createElement(`div`);w.className=`dsh-tw-note-fields`;let T=document.createElement(`input`);T.className=`dsh-tw-note-title`,T.placeholder=`标题(默认时间戳)`,T.setAttribute(`aria-label`,`笔记标题(默认时间戳)`);let E=ob({onChange:ne});w.append(T,E.el);let oe=document.createElement(`label`);oe.className=`dsh-tw-note-wiki`,oe.hidden=!0;let se=document.createElement(`span`);se.className=`dsh-tw-note-wiki-label`,se.textContent=`写入`;let ce=document.createElement(`select`);ce.className=`dsh-tw-note-wiki-select`,ce.setAttribute(`aria-label`,`这条笔记写进哪个知识库`),oe.append(se,ce);let le=document.createElement(`span`);le.className=`dsh-tw-note-wiki-hint`,le.hidden=!0,w.append(oe,le);let ue=()=>{let e=l.find(e=>e.id===o),t=e!==void 0&&!e.running;le.hidden=!t,le.textContent=t?`${e.label} 当前没在运行:先在右下角「知识库」菜单里打开它`:``};ce.addEventListener(`change`,()=>{s=!0,o=ce.value.length>0?ce.value:void 0,ue()}),_e().then(e=>{if(t||(c=typeof e?.mode==`string`?e.mode:`single`,l=(Array.isArray(e?.wikis)?e.wikis:[]).map(e=>({id:e.id,label:e.label,running:e.running})),l.length<=1))return;let n=typeof e?.defaultId==`string`?e.defaultId:void 0,r=()=>{s||(o=Le(l,n))};r(),ce.replaceChildren(...l.map(e=>{let t=document.createElement(`option`);return t.value=e.id,t.textContent=e.running?e.label:`${e.label}(未运行)`,t}));let i=document.createElement(`option`);i.value=``,i.textContent=`默认库`,ce.append(i),ce.value=o??``,oe.hidden=!1,ue(),u=Ie(()=>{r(),ce.value=o??``,ue()})}),T.addEventListener(`input`,ne);let de,D=Uy({placeholder:`写点东西… Markdown 高亮,可 📎/拖入文件
|
|
808
|
-
Ctrl+Enter 保存`,onSave:()=>{
|
|
809
|
-
`)},v=()=>{let e=n.getState();o!==void 0&&(o.dataset.state=e.state),a!==void 0&&(a.title=`知识库 · ${e.tooltip}`),_()},y=async()=>{m=await hb(),!r&&(c!==void 0&&(c.textContent=m.text),l!==void 0&&(l.dataset.state=m.state),_())},b=(m,b)=>{if(r)return;if(i=document.createElement(`div`),i.className=`dsh-tw-fab-wrap`,s=document.createElement(`div`),s.className=`dsh-tw-fab-menu`,s.hidden=!0,m.showPanelStatus){let e=document.createElement(`div`);e.className=`dsh-tw-fab-status dsh-tw-fab-status-tiprow`,l=document.createElement(`span`),l.className=`dsh-tw-fab-status-dot`,l.dataset.state=`unknown`,c=document.createElement(`span`),c.className=`dsh-tw-fab-status-text`,c.textContent=`TiddlyWiki 服务…`,e.append(l,c),u=document.createElement(`div`),u.className=`dsh-tw-fab-tip`,u.hidden=!0,e.append(u),e.addEventListener(`mouseenter`,()=>{_(),u!==void 0&&(u.hidden=!1)}),e.addEventListener(`mouseleave`,()=>{u!==void 0&&(u.hidden=!0)}),s.append(e)}if(m.showQuickNote){let e=document.createElement(`button`);e.type=`button`,e.className=`dsh-tw-fab-item`,e.textContent=`📝 快速笔记`,e.title=`ui.quickNoteMode=native 时直接打开 TW 原生编辑器;card 时打开 Markdown 卡片`,e.addEventListener(`click`,()=>{h(),we().then(e=>{e.quickNoteMode===`native`?t.openNative():t.open()})}),s.append(e)}if(m.showPanelStatus){if(b.wikis.length>1){let t=Le(b.wikis,b.defaultId),n=document.createElement(`div`);n.className=`dsh-tw-fab-group`,n.textContent=`知识库`,s.append(n);for(let n of b.wikis){let r=document.createElement(`button`);r.type=`button`,r.className=`dsh-tw-fab-item`,r.dataset.current=n.id===t?`1`:`0`,r.textContent=`${n.id===t?`●`:`○`} ${n.label}`,r.title=`${n.path}${n.running?``:`(未运行,打开会启动)`}`,r.addEventListener(`click`,()=>{h(),Fe(n.id),n.running||fetch(`${p}/admin/wikis`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({action:`start`,id:n.id}),signal:AbortSignal.timeout(12e4)}).catch(()=>void 0),e.openPanel()}),s.append(r)}}d=document.createElement(`span`),d.textContent=`打开 TW 面板`;let t=document.createElement(`button`);t.type=`button`,t.className=`dsh-tw-fab-item`,t.append(document.createTextNode(`🖥 `),d),t.addEventListener(`click`,()=>{h(),e.toggle()}),s.append(t);let n=document.createElement(`button`);n.type=`button`,n.className=`dsh-tw-fab-item`,n.textContent=`🔄 重载 TW 面板`,n.addEventListener(`click`,()=>{h(),document.dispatchEvent(new CustomEvent(at)),y()}),s.append(n)}if(m.showSyncButton){let e=document.createElement(`button`);e.type=`button`,e.className=`dsh-tw-fab-item`,e.textContent=`🔁 同步`,e.addEventListener(`click`,()=>{h(),n.trigger()}),s.append(e)}a=document.createElement(`button`),a.type=`button`,a.className=`dsh-tw-fab`,a.setAttribute(`aria-label`,`TiddlyWiki 知识库`);let x=document.createElement(`span`);x.className=`dsh-tw-fab-icon`,x.innerHTML=`<svg viewBox="0 0 16 16" width="17" height="17" fill="none" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 2.5h8a1 1 0 0 1 1 1v9a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1v-9a1 1 0 0 1 1-1z"/><path d="M6 6h4M6 8.5h2.5"/></svg>`,o=document.createElement(`span`),o.className=`dsh-tw-fab-dot`,o.dataset.state=n.getState().state,a.append(x,o),a.addEventListener(`click`,()=>{if(s!==void 0){if(f){h();return}f=!0,s.hidden=!1,v(),y()}}),i.append(s,a),document.body.append(i),v(),document.addEventListener(`click`,g,!0)},x=e.subscribe(()=>{d!==void 0&&(d.textContent=e.isOpen()?`收起 TW 面板`:`打开 TW 面板`)}),S=n.subscribe(v);return(async()=>{let[e,t]=await Promise.all([mb(),pb()]);r||!e.showQuickNote&&!e.showPanelStatus&&!e.showSyncButton||b(e,t)})(),()=>{r=!0,document.removeEventListener(`click`,g,!0),x(),S(),i?.remove()}}function _b(e){return function(){let[t,n]=c.useState(!1),[r,i]=c.useState(null),a=c.useRef(null),o=c.useRef(null);c.useEffect(()=>{let e=!0,t=e=>{let t=e.detail;n(t?.open===!0)};return window.addEventListener(Wy,t),we().then(t=>{e&&i(t.quickNoteMode)}),()=>{e=!1,window.removeEventListener(Wy,t)}},[]),c.useLayoutEffect(()=>{let e=a.current;if(e===null)return;let t=()=>{let t=null,n=null,r=e;for(;r!==null&&r!==document.documentElement&&(r=r.parentElement,r!==null);){for(let e of r.querySelectorAll(`textarea, [contenteditable]:not([contenteditable="false"]), [role="textbox"]`))if(e.getBoundingClientRect().width>300){t=e,n=r;break}if(n!==null)break}if(t===null||n===null)return null;let i=n.getBoundingClientRect().width,a=t,o=null,s=0;for(;a!==null&&a!==n;){let e=a.getBoundingClientRect().width;e>0&&e<i-8&&e>=s&&(s=e,o=a),a=a.parentElement}return o},n=()=>{let n=e.getBoundingClientRect(),r=t(),i=r===null?n.right:r.getBoundingClientRect().right,a=Math.max(0,n.right-i);return e.style.paddingRight!==`${a}px`&&(e.style.paddingRight=`${a}px`),r!==null};n();let r=new ResizeObserver(n),i=e;for(;i!==null&&i!==document.documentElement&&(r.observe(i),!(i instanceof HTMLElement&&i.hasAttribute(`data-phase`)));)i=i.parentElement;window.addEventListener(`resize`,n),document.addEventListener(`visibilitychange`,n);let o=0,s=0,c=window.setInterval(()=>{if(s++,!n()){s>=20&&window.clearInterval(c);return}o++,o>=3&&window.clearInterval(c)},1500),l=window.setTimeout(n,120),u=window.setTimeout(n,600);return()=>{r.disconnect(),window.removeEventListener(`resize`,n),document.removeEventListener(`visibilitychange`,n),window.clearInterval(c),window.clearTimeout(l),window.clearTimeout(u)}},[]);let s=r===`native`,l=s?`快速笔记`:t?`快速笔记(已打开)`:`快速笔记`,u=s?`快速笔记:直接打开 TiddlyWiki 原生编辑器(再次点击可收起弹窗)`:t?`快速笔记已打开(点此按钮或卡片右上角 ✕ 收起)`:`打开快速笔记(在按钮上方弹出,可拖动标题栏移动)`;return c.createElement(`div`,{ref:a,className:`dsh-tw-dock-note`},c.createElement(`button`,{ref:o,type:`button`,className:t?`dsh-tw-dock-note-btn dsh-tw-dock-note-btn-active`:`dsh-tw-dock-note-btn`,title:u,onClick:()=>{we().then(t=>{t.quickNoteMode===`native`?Lt()&&!Rt()?Bt():e.openNative():e.isOpen()?e.close():e.open(o.current??void 0)})}},c.createElement(`span`,{className:`dsh-tw-dock-note-icon`,"aria-hidden":`true`},`📝`),c.createElement(`span`,{className:`dsh-tw-dock-note-label`},l)))}}function vb(){return function(e){let t=typeof e.sessionId==`string`&&e.sessionId.length>0?e.sessionId:void 0,[n,r]=c.useState([]),[i,a]=c.useState(``),[o,s]=c.useState(void 0),[l,u]=c.useState(!1);if(c.useEffect(()=>{if(t===void 0)return;let e=!0;return(async()=>{let[n,i]=await Promise.all([_e(),fetch(`${D}?session=${encodeURIComponent(t)}`,{signal:AbortSignal.timeout(8e3)}).then(e=>e.ok?e.json():null).catch(()=>null)]);if(!e)return;let o=(n?.wikis??[]).filter(e=>e.agentVisible);r(o.map(e=>({id:e.id,label:e.label,running:e.running}))),a(typeof i?.scope==`string`?i.scope:``),s(typeof i?.reason==`string`?i.reason:void 0)})(),()=>{e=!1}},[t]),t===void 0||n.length<=1)return null;let d=e=>{u(!0),(async()=>{try{let n=await fetch(D,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({session:t,wiki:e.length>0?e:null}),signal:AbortSignal.timeout(12e4)}),r=await n.json().catch(()=>({}));if(!n.ok||r.ok!==!0){s(r.error??`切换失败(HTTP ${n.status})`);return}a(typeof r.scope==`string`?r.scope:e),s(typeof r.reason==`string`?r.reason:void 0)}catch(e){s(e instanceof Error?e.message:String(e))}finally{u(!1)}})()};return c.createElement(`div`,{className:`dsh-tw-scope-dock`},c.createElement(`span`,{className:`dsh-tw-scope-label`},`知识库`),c.createElement(`select`,{className:`dsh-tw-scope-select`,value:i,disabled:l,"aria-label":`本会话使用的知识库`,title:`本会话的 tiddlywiki_* 工具与注入提示词都作用于这个知识库(下一个模型步骤生效)`,onChange:e=>{d(e.target.value)}},c.createElement(`option`,{value:``},`默认库`),...n.map(e=>c.createElement(`option`,{key:e.id,value:e.id},`${e.label}${e.running?``:`(未运行,选中会启动)`}`))),o===void 0?null:c.createElement(`span`,{className:`dsh-tw-scope-note`},o))}}async function yb(e,t=15e3){try{let n=await fetch(_,{method:`POST`,headers:{"content-type":`application/json`,"x-requested-with":`TiddlyWiki`},body:JSON.stringify({title:e}),signal:AbortSignal.timeout(t)});if(!n.ok)return null;let r=await n.text();return r.trim().length>0?r:null}catch{return null}}function bb(){return ct()}async function xb(e){try{let t=await fetch(`${g}?title=${encodeURIComponent(e)}`,{signal:AbortSignal.timeout(8e3)});if(t.status===404)return`no`;if(!t.ok)return`unknown`;let n=await t.json().catch(()=>null);return n===null?`unknown`:n.notFound===!0?`no`:`yes`}catch{return`unknown`}}function Sb(e){let{sessionId:t,viewRequest:n,completeViewRequest:r}=e,[i,a]=c.useState(`loading`),[o,s]=c.useState(null),[l,u]=c.useState(null),[d,f]=c.useState(``),[p,m]=c.useState(!1),h=c.useRef(0),g=c.useRef(!0),_=c.useRef(0),v=c.useRef(0),y=c.useCallback(async e=>{let n=++h.current;if(!g.current)return;let r=e?.silent===!0;r||a(`loading`);let i=e=>{if(_.current++,r){m(!0);return}a(`error`),f(e)};if(typeof t!=`string`||t.length===0){a(`error`),f(`缺少会话 ID`);return}if(_.current>=3){if(r){m(!0);return}a(`error`),f(`连续 3 次生成失败,已停止自动重试,请点「🔄 刷新」`);return}try{let e=await fetch(C,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({session:t}),signal:AbortSignal.timeout(25e3)}),o=await e.json().catch(()=>null);if(!g.current||n!==h.current)return;if(!e.ok||o?.ok!==!0){i(o?.error??`HTTP ${e.status}`);return}if(typeof o.title!=`string`||o.title.length===0){i(`汇总生成失败:缺少标题`);return}u(o.title);let c=await yb(o.title);if(!g.current||n!==h.current)return;if(c===null){let e=await xb(o.title);if(!g.current||n!==h.current)return;if(e===`no`){if(_.current++,_.current<3){y();return}a(`error`),f(`汇总条目不存在,自动重建失败,请重试`);return}if(e===`unknown`){if(r){m(!0);return}a(`error`),f(`渲染失败:wiki 渲染服务不可用(host /render),条目状态未知`);return}i(`渲染失败:wiki 渲染服务不可用(host /render)`);return}_.current=0,v.current=Date.now(),m(!1),s(c),a(`ready`)}catch(e){if(!g.current||n!==h.current)return;i(e instanceof Error?e.message:String(e))}},[t]);c.useEffect(()=>(g.current=!0,_.current=0,v.current=Date.now(),m(!1),y(),()=>{g.current=!1}),[y]),c.useEffect(()=>{if(l===null)return;let e=!0,t=window.setInterval(()=>{(async()=>{if(!e||typeof document<`u`&&document.hidden)return;let t=await xb(l);if(e){if(t===`unknown`){m(!0);return}if(t===`no`){if(_.current++,_.current<3){y();return}a(`error`),f(`汇总条目已失效且自动重建多次失败,请点「🔄 刷新」重试`);return}if(Date.now()-v.current>18e4){y({silent:!0});return}_.current=0,m(!1)}})()},3e4);return()=>{e=!1,window.clearInterval(t)}},[l,y]),c.useEffect(()=>{n!=null&&r?.()},[n,r]);let b=()=>{_.current=0,y()},x;return x=i===`loading`?c.createElement(`div`,{className:`dsh-tw-summary-state`},c.createElement(`div`,{className:`dsh-tw-summary-state-spin`},`⏳`),c.createElement(`div`,null,`正在生成会话 wiki 汇总…`)):i===`error`?c.createElement(`div`,{className:`dsh-tw-summary-state`},c.createElement(`div`,{className:`dsh-tw-summary-state-title`},`知识库汇总暂不可用`),c.createElement(`div`,{className:`dsh-tw-summary-state-detail`},d),c.createElement(`button`,{type:`button`,className:`dsh-tw-summary-btn`,onClick:b},`重试`)):c.createElement(`div`,{className:`dsh-tw-summary-native dsh-tw-toolcard-native`},p?c.createElement(`div`,{className:`dsh-tw-summary-state-detail`},`⚠️ 未能确认最新状态(wiki 查询或刷新失败),以下是上次生成的内容`):null,c.createElement(`div`,{dangerouslySetInnerHTML:{__html:o??``}})),c.createElement(`div`,{className:`dsh-tw-summary`,"data-dsh-tw-summary":`true`},c.createElement(`div`,{className:`dsh-tw-summary-bar`},c.createElement(`span`,{className:`dsh-tw-summary-bar-title`},`📚 本会话知识库`),c.createElement(`span`,{className:`dsh-tw-summary-bar-hint`},`产生 / 读取 / 检索过的笔记(含子代理)`),c.createElement(`span`,{className:`dsh-tw-summary-bar-spacer`}),c.createElement(`button`,{type:`button`,className:`dsh-tw-summary-btn`,onClick:b,disabled:i===`loading`,title:`重新生成并刷新汇总`},`🔄 刷新`)),x)}function Cb(e,t){if(!(e===void 0||t.showSessionTab===!1))return st(t.tabLabel),e.inject(`conversation.view`,()=>e.register({name:`conversation.view`,id:`dsh-tiddlywiki-summary`,order:20,label:bb},Sb))}function $(e,t,n){let r=document.createElement(e);return t!==void 0&&(r.className=t),n!==void 0&&(r.textContent=n),r}function wb(e){let t=$(`div`,`dsh-tw-settings-banner`);return t.dataset.tone=`error`,t.setAttribute(`style`,`border:1px solid #c0392b;background:#fdecea;color:#8c1c13;border-radius:6px;padding:10px 12px;margin:0 0 12px;font-size:12px;line-height:1.6;white-space:pre-wrap;`),t.textContent=e,t}async function Tb(e,t){let n=await fetch(e,{...t,signal:t?.signal??AbortSignal.timeout(15e3)}),r=await n.json().catch(()=>({}));if(!n.ok){let e=r.error??`HTTP ${n.status}`;throw Error(e)}return r}function Eb(e){let t=!1;e.classList.add(`dsh-tw-settings`);let n=$(`div`,`dsh-tw-settings-error`);n.hidden=!0;let r=$(`div`,`dsh-tw-settings-row dsh-tw-settings-status`),i=$(`div`,`dsh-tw-settings-body`);e.append(n,r,i);let a=[],o={},s={},c=!1,l=async()=>{c||i.replaceChildren($(`div`,`dsh-tw-settings-muted`,`加载中…`));try{let e=await Tb(Mb(re));if(t)return;c=!0,n.hidden=!0,n.replaceChildren(),Db(r,e,l),Fb(i,e,l,()=>t,o,s)}catch(e){if(t)return;c||i.replaceChildren($(`div`,`dsh-tw-settings-muted`,`配置尚未加载。`));let r=$(`button`,`dsh-tw-settings-btn`,`重试`);r.type=`button`,r.addEventListener(`click`,()=>{l()}),n.replaceChildren($(`span`,void 0,`加载配置失败:${e instanceof Error?e.message:String(e)} `),r),n.hidden=!1}};return l(),a.push(()=>{t=!0,e.replaceChildren(),e.classList.remove(`dsh-tw-settings`)}),()=>{for(let e of a.splice(0))e()}}function Db(e,t,n){e.replaceChildren();let r=t.server??{},i=r.status??`unknown`,a=$(`span`,`dsh-tw-settings-chip`,i);a.dataset.state=i;let o=$(`span`,`dsh-tw-settings-muted`,[r.url===void 0?``:`TW ${r.url}`,t.git?.branch===void 0?``:`git ${t.git.branch}`,t.git?.lastCommit===void 0?``:t.git.lastCommit,t.git?.conflict===void 0?t.git?.dirty===!0?`有未提交改动`:``:`⚠️ 冲突未解决(${t.git.conflict.files.length} 个文件,已阻止提交)`].filter(Boolean).join(` · `)),s=$(`button`,`dsh-tw-settings-btn`,`同步`);s.type=`button`,s.title=`git 同步(pull → commit → push)`,s.addEventListener(`click`,()=>{s.disabled=!0,s.textContent=`同步中…`,(async()=>{try{let e=await fetch(te,{method:`POST`,signal:AbortSignal.timeout(12e4)}),t=he(await e.json().catch(()=>null),e.status);O(t.ok?`同步完成:${t.message}`:`同步失败:${t.message}`)}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 Tb(T,{method:`POST`,signal:AbortSignal.timeout(12e4)}),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 Ob(e,t,n,r){let i=$(`section`,`dsh-tw-settings-section`);i.append($(`h3`,`dsh-tw-settings-h`,`常规配置`));let a=t.note??{},o=t.git??{},s=t.ui??{},c=[],l=(e,t,n)=>{let r=$(`input`,`dsh-tw-settings-input`);r.autocomplete=`off`,r.value=n;let a=$(`label`,`dsh-tw-settings-field`);a.append($(`span`,`dsh-tw-settings-label`,t),r),c.push({key:e,initial:n,read:()=>r.value.trim(),changed:()=>r.value.trim()!==n}),i.append(a)},u=(e,t,n)=>{let r=$(`input`,`dsh-tw-settings-input`);r.type=`password`,r.value=n,r.autocomplete=`off`;let a=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-chipbtn`,`👁`);a.type=`button`,a.title=`显示 / 隐藏`,a.setAttribute(`aria-label`,`显示 / 隐藏`),a.addEventListener(`click`,e=>{e.preventDefault();let t=r.type===`password`;r.type=t?`text`:`password`,a.textContent=t?`🙈`:`👁`});let o=$(`label`,`dsh-tw-settings-field`);o.append($(`span`,`dsh-tw-settings-label`,t),r,a),c.push({key:e,initial:n,read:()=>r.value.trim(),changed:()=>r.value.trim()!==n}),i.append(o)},d=(e,t,n)=>{let r=$(`input`,`dsh-tw-settings-check`);r.type=`checkbox`,r.checked=n;let a=$(`label`,`dsh-tw-settings-field dsh-tw-settings-field-check`);return a.append(r,$(`span`,`dsh-tw-settings-label`,t)),c.push({key:e,initial:n,read:()=>r.checked,changed:()=>r.checked!==n}),i.append(a),r},f=(e,t,n,r)=>{let a=$(`input`,`dsh-tw-settings-input`);a.type=`number`,a.value=String(n),r?.min!==void 0&&(a.min=String(r.min)),r?.max!==void 0&&(a.max=String(r.max)),r?.step!==void 0&&(a.step=String(r.step));let o=$(`div`,`dsh-tw-settings-error`);o.hidden=!0;let s=()=>{let e=a.value.trim();if(e.length===0)return`不能为空`;let t=Number(e);if(!Number.isFinite(t))return`请输入数字`;if(r?.integer===!0&&!Number.isInteger(t))return`必须是整数`;if(r?.min!==void 0&&t<r.min)return`不能小于 ${r.min}`;if(r?.max!==void 0&&t>r.max)return`不能大于 ${r.max}`},l=()=>{let e=s();o.textContent=e===void 0?``:`⚠️ ${e}(保存会被拒绝)`,o.hidden=e===void 0,e===void 0?a.removeAttribute(`aria-invalid`):a.setAttribute(`aria-invalid`,`true`)};a.addEventListener(`input`,l);let u=()=>{let e=a.value.trim(),t=Number(e);return e.length===0||!Number.isFinite(t)?e:t},d=$(`label`,`dsh-tw-settings-field`);d.append($(`span`,`dsh-tw-settings-label`,t),a,o),c.push({key:e,initial:n,read:u,changed:()=>u()!==n,invalid:s}),l(),i.append(d)},p=(e,t,n,r)=>{let a=$(`select`,`dsh-tw-settings-input`);for(let e of r){let t=document.createElement(`option`);t.value=e.value,t.textContent=e.label,e.value===n&&(t.selected=!0),a.append(t)}let o=$(`label`,`dsh-tw-settings-field`);return o.append($(`span`,`dsh-tw-settings-label`,t),a),c.push({key:e,initial:n,read:()=>a.value,changed:()=>a.value!==n}),i.append(o),a},m=(e,t,n,r)=>{let a=$(`textarea`,`dsh-tw-settings-input dsh-tw-settings-area`);a.rows=r,a.value=n;let o=$(`label`,`dsh-tw-settings-field dsh-tw-settings-field-area`);return o.append($(`span`,`dsh-tw-settings-label`,t),a),c.push({key:e,initial:n,read:()=>a.value.trim(),changed:()=>a.value.trim()!==n}),i.append(o),a};l(`note.tag`,`快速笔记默认 tag`,typeof a.tag==`string`?a.tag:`inbox`),d(`note.workspaceMark`,`新建笔记自动标工作区(ws/<项目名> 标签 + workspace 字段,取自当前会话工作目录)`,a.workspaceMark!==!1),d(`git.autoCommit`,`自动 commit(防抖)`,o.autoCommit!==!1),f(`git.debounceMs`,`自动 commit 防抖(ms;范围 0–3600000)`,typeof o.debounceMs==`number`?o.debounceMs:6e4,{min:0,max:36e5,step:1e3,integer:!0}),l(`git.remote`,`git 远端(空=仅本地;保存后即时生效,但**清空不会删除已配置的 origin**,需要时请用 git 命令处理)`,typeof o.remote==`string`?o.remote:``),l(`git.branch`,`git 分支(**只在仓库首次初始化时生效**;已有仓库请用 git 命令改分支——上面的状态行显示的是真实分支)`,typeof o.branch==`string`?o.branch:`main`);let h=t.startup??{};f(`startup.readyTimeoutMs`,`TW 启动就绪等待(ms;默认 60000,范围 5000–600000,超时上限为其 3 倍,对下次启动/重启生效)`,typeof h.readyTimeoutMs==`number`&&h.readyTimeoutMs>0?h.readyTimeoutMs:6e4,{min:5e3,max:6e5,step:1e3}),d(`ui.showQuickNote`,`显示「知识库」按钮里的「快速笔记」入口`,s.showQuickNote!==!1),d(`ui.showQuickNoteDock`,`显示聊天输入框上方的「快速笔记」快捷按钮`,s.showQuickNoteDock!==!1),p(`ui.quickNoteMode`,`点击「快速笔记」的打开方式`,typeof s.quickNoteMode==`string`&&s.quickNoteMode===`card`?`card`:`native`,[{value:`native`,label:`原生编辑器:直接弹出 TW 原生编辑页(新建/恢复草稿)`},{value:`card`,label:`Markdown 卡片:弹出现有快速笔记卡片(CodeMirror 编辑器)`}]),l(`ui.sidebarLabel`,`侧边栏 TW 入口显示名称`,typeof s.sidebarLabel==`string`&&s.sidebarLabel.trim().length>0?s.sidebarLabel.trim():`TiddlyWiki`),d(`ui.showPanelStatus`,`显示「知识库」按钮里的 TW 面板/重载入口与状态行`,s.showPanelStatus!==!1),d(`ui.showSyncButton`,`显示「知识库」按钮里的「同步」入口与 git 状态点`,s.showSyncButton!==!1),d(`ui.followDshTheme`,`嵌入式 TW 跟随 DSH 深浅主题(暗色时自动切深色 palette,不写回 wiki)`,s.followDshTheme!==!1),l(`ui.darkPalette`,`暗色时 TW palette(tiddler 标题)`,typeof s.darkPalette==`string`&&s.darkPalette.trim().length>0?s.darkPalette.trim():`$:/palettes/CupertinoDark`),l(`ui.tabLabel`,`会话顶部「知识库」Tab 名称`,typeof s.tabLabel==`string`&&s.tabLabel.trim().length>0?s.tabLabel.trim():`知识库`),d(`ui.showSessionTab`,`显示会话顶部「知识库」Tab(本会话相关 wiki 笔记汇总)`,s.showSessionTab!==!1),d(`ui.showRightbarTab`,`在 DSH 右侧边栏提供 TiddlyWiki 入口/Tab(与聊天并排)`,s.showRightbarTab!==!1);let g=s.sendToAgent??{};d(`ui.sendToAgent.enabled`,`启用「发送给 Agent」(TW 笔记 → DSH 会话注入)`,g.enabled!==!1),l(`ui.sendToAgent.endpoint`,`TW 端请求基址(空=自动取当前 DSH origin)`,typeof g.endpoint==`string`?g.endpoint:``),u(`ui.sendToAgent.token`,`共享 token(非空时路由校验 x-send-to-agent-token 头;已设置时显示为 ********,原样保存=不改,清空=删除)`,typeof g.token==`string`?g.token:``);let _=s.allArticles??{};f(`ui.allArticles.pageSize`,`「所有文章」每页条数(1–200)`,typeof _.pageSize==`number`?_.pageSize:10,{min:1,max:200,step:1,integer:!0}),i.append($(`h3`,`dsh-tw-settings-h`,`可选功能:微信公众号发布`)),i.append($(`div`,`dsh-tw-settings-muted`,`把 wiki 笔记一键发到公众号草稿箱(可选点发表)。**需要额外安装**:opencli 与 Browser Bridge 浏览器扩展,并让浏览器登录 mp.weixin.qq.com;adapter 在本仓库 tools/wechat/,安装与排错见 docs/wechat-publish-setup.md。不安装/不开启它,插件其他功能完全不受影响。开启后:注入提示词会多一条「发布前先读发布元数据规范」的约定,并在启动时把「发布元数据规范」与「微信公众号发布指南」(安装/换机还原步骤,等于仓库 docs/wechat-publish-setup.md)两篇文档写进 wiki(同名不覆盖)。`));let v=t.wechat??{},y=d(`wechat.enabled`,`启用微信公众号发布(默认关;需先按 docs/wechat-publish-setup.md 安装 opencli + 浏览器扩展)`,v.enabled===!0);l(`wechat.command`,`opencli 命令(默认 opencli;用别名或绝对路径时填这里。仅在启用微信发布时生效)`,typeof v.command==`string`&&v.command.trim().length>0?v.command.trim():`opencli`),p(`wechat.adapter`,`发布适配器(仅在启用微信发布时生效)`,v.adapter===`publish-note-imgs`?`publish-note-imgs`:`publish-note`,[{value:`publish-note`,label:`publish-note(默认):图文排版,封面单图`},{value:`publish-note-imgs`,label:`publish-note-imgs:正文内嵌图全部上传 CDN(需先重跑 install-wechat-adapters.mjs)`}]),u(`wechat.token`,`发布 token(非空时 /wechat/* 校验 x-wechat-publish-token 头,强烈建议设置,否则任何能打开本页的人都能替你发文;已设置时显示为 ********,原样保存=不改,清空=删除。仅在启用微信发布时生效)`,typeof v.token==`string`?v.token:``),l(`wechat.dsn`,`渲染基址 dsn(adapter 回连 DSH 用,形如 http://127.0.0.1:<端口>/dsh-tiddlywiki;留空=按请求自动推导。仅在启用微信发布时生效)`,typeof v.dsn==`string`?v.dsn:``);let b=t.prompt??{};i.append($(`h3`,`dsh-tw-settings-h`,`系统提示词(注入每个会话)`)),i.append($(`div`,`dsh-tw-settings-muted`,`插件把自己的约定(同步纪律 / 标签约定 / 链接格式等)注入每个会话的系统提示词。保存后**无需重启 dsh web**:section 会即时重新注册,当前会话从下一步起就使用新文本。`));let x=d(`prompt.enabled`,`注入 TiddlyWiki 提示词(关闭后本插件不再注入任何文本)`,b.enabled!==!1),S=p(`prompt.mode`,`内置文本形态`,b.mode===`full`?`full`:`slim`,[{value:`slim`,label:`精简(默认):只保留工具 schema 表达不了的约定`},{value:`full`,label:`完整:额外附一份由工具注册表实时生成的参数索引`}]),ee=m(`prompt.extra`,`附加说明(永远追加在末尾,可放团队/个人规范)`,typeof b.extra==`string`?b.extra:``,5),te=m(`prompt.override`,`整段替换(非空时取代上面的内置文本,附加说明仍会追加)`,typeof b.override==`string`?b.override:``,8),ne=()=>c.some(e=>(e.key.startsWith(`prompt.`)||e.key===`wechat.enabled`)&&e.changed()),C=$(`button`,`dsh-tw-settings-btn`,`预览注入文本(按表单当前值)`);C.type=`button`,C.title=`按表单当前值渲染注入文本(不用先保存);点「保存配置」后这就是实际注入的内容`;let re=$(`pre`,`dsh-tw-settings-prompt-preview`);re.hidden=!0,C.addEventListener(`click`,()=>{if(!re.hidden){re.hidden=!0,re.textContent=``;return}C.disabled=!0,(async()=>{try{let e=await Tb(Mb(ie),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({enabled:x.checked,mode:S.value,extra:ee.value,override:te.value,wechat:y.checked})});if(e.ok!==!0)throw Error(e.error??`获取失败`);re.textContent=e.enabled===!1?`(已关闭:不会注入任何提示词)`:`# 形态 ${e.mode??``} · ${e.length??0} 字符${ne()?`(含未保存的修改,保存后才真正注入)`:``}\n\n${e.text??``}`,re.hidden=!1}catch(e){O(`读取提示词失败:${e instanceof Error?e.message:String(e)}`)}finally{C.disabled=!1}})()}),i.append(C,re);let w=t.bridge??{};d(`bridge.enabled`,`启用「本地剪藏桥」(书签小工具后端监听 127.0.0.1 端口,保存后立即生效)`,w.enabled===!0),f(`bridge.port`,`剪藏桥端口(整数 1–65535;改端口需重启 dsh web 生效)`,typeof w.port==`number`&&w.port>0?w.port:8618,{min:1,max:65535,step:1,integer:!0}),u(`bridge.token`,`剪藏桥 token(非空时校验书签的 x-clip-token 头;强烈建议设置。已设置时显示为 ********,原样保存=不改,清空=删除)`,typeof w.token==`string`?w.token:``),l(`bridge.tag`,`剪藏笔记默认 tag`,typeof w.tag==`string`&&w.tag.trim().length>0?w.tag.trim():`clip`);let T=wb(r.saveError??``);T.hidden=r.saveError===void 0;let E=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`保存配置`);E.type=`button`,E.addEventListener(`click`,()=>{E.disabled=!0,(async()=>{let e=c.filter(e=>e.invalid?.()!==void 0);if(e.length>0){O(`有 ${e.length} 个字段填得不对(见字段旁的红色提示),未保存`),E.disabled=!1;return}let t={};for(let e of c){if(!e.changed())continue;let n=e.key.split(`.`),r=t;for(let t=0;t<n.length;t++){let i=n[t];if(i===void 0)break;if(t===n.length-1)r[i]=e.read();else{let e=r[i]??{};r[i]=e,r=e}}}if(Object.keys(t).length===0){O(`没有改动`),E.disabled=!1;return}try{await Tb(Mb(ae),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(t)}),Ce(),r.saveError=void 0,T.hidden=!0,T.textContent=``,O(`配置已保存`),n()}catch(e){r.saveError=`保存失败:${e instanceof Error?e.message:String(e)}`,T.textContent=r.saveError,T.hidden=!1,n()}finally{E.disabled=!1}})()}),r.isDirty=()=>c.some(e=>e.changed()),i.append(T,E),e.append(i)}function kb(e,t,n,r,i,a){let o=n?.plugins??[],s=n?.themes??[],c=n?.languages??[],l=t?.plugins??[],u=new Set(t?.themes??[]),d=t?.languages??[],f=()=>a.plugins??new Set(l),p=()=>a.themes??new Set(u),m=()=>a.languages??new Set(d),h=new Set(r?.disabled??[]),g=new Set((r?.wikiPlugins??[]).map(e=>e.title)),_=$(`section`,`dsh-tw-settings-section`);_.append($(`h3`,`dsh-tw-settings-h`,`插件管理(自带官方插件)`));let v=$(`div`,`dsh-tw-settings-muted`,`勾选 = 写入 tiddlywiki.info 的启动安装清单(离线、与引擎版本配套),应用后重启 TW。这里只管引擎自带插件;在 TW 控制面板里安装/禁用/卸载的插件见下方「wiki 内插件」。`);_.append(v);let y=$(`input`,`dsh-tw-settings-input dsh-tw-settings-search`);y.placeholder=`搜索插件…`;let b=$(`div`,`dsh-tw-settings-list`),x=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`应用插件(重启 TW)`);x.type=`button`;let S=()=>{x.disabled=a.plugins===void 0},ee=e=>{b.replaceChildren();let t=e.toLowerCase();for(let e of o){if(t.length>0&&!`${e.label} ${e.name} ${e.description}`.toLowerCase().includes(t))continue;let n=$(`input`,`dsh-tw-settings-check`);n.type=`checkbox`,n.checked=f().has(e.name),n.addEventListener(`change`,()=>{let t=f();n.checked?t.add(e.name):t.delete(e.name),a.plugins=t,S()});let i=$(`label`,`dsh-tw-settings-row dsh-tw-settings-plugin`),o=$(`span`,`dsh-tw-settings-name`,e.label);o.title=e.name;let s=$(`span`,`dsh-tw-settings-muted`,e.description||e.name);if(i.append(n,o),r!=null&&h.has(e.title)){let e=$(`span`,`dsh-tw-settings-chip`,`TW 内已禁用`);e.dataset.state=`disabled`,e.title=`该插件在 tiddlywiki.info 里,但已在 TW 控制面板被禁用($:/config/Plugins/Disabled)——去 TW 面板重新启用`,i.append(e)}else if(r!=null&&!l.includes(e.name)&&g.has(e.title)){let e=$(`span`,`dsh-tw-settings-chip`,`wiki 内已装`);e.dataset.state=`update`,e.title=`不在启动清单,但 wiki 里存在同名插件 tiddler(经 TW 原生安装),TW 运行时已在用`,i.append(e)}i.append(s),b.append(i)}};if(y.addEventListener(`input`,()=>ee(y.value)),x.addEventListener(`click`,()=>{a.plugins!==void 0&&(x.disabled=!0,(async()=>{try{await Tb(w,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({plugins:[...f()]})}),a.plugins=void 0,O(`插件已应用,TW 已重启`),i()}catch(e){O(`应用失败:${e instanceof Error?e.message:String(e)}`),S()}})())}),ee(``),S(),_.append(y,b,x),e.append(_),r!=null){let t=new Set(o.map(e=>e.title)),n=(r.wikiPlugins??[]).filter(e=>!t.has(e.title)||h.has(e.title));if(n.length>0){let t=$(`section`,`dsh-tw-settings-section`);t.append($(`h3`,`dsh-tw-settings-h`,`wiki 内插件(经 TW 原生安装,只读)`)),t.append($(`div`,`dsh-tw-settings-muted`,`下列插件以 tiddler 形式随 wiki 文件保存(TW 控制面板 → 插件 安装/导入),不受上面勾选影响。启用 / 禁用 / 卸载请到 TW 控制面板操作。`));let r=$(`div`,`dsh-tw-settings-list`);for(let e of n){let t=$(`div`,`dsh-tw-settings-row dsh-tw-settings-plugin`),n=$(`span`,`dsh-tw-settings-name`,e.name||e.title);if(n.title=e.title,t.append(n),h.has(e.title)){let e=$(`span`,`dsh-tw-settings-chip`,`已禁用`);e.dataset.state=`disabled`,e.title=`该插件已在 TW 控制面板被禁用`,t.append(e)}else if(e.version){let n=$(`span`,`dsh-tw-settings-chip`,`v${e.version}`);n.dataset.state=`ok`,t.append(n)}let i=$(`span`,`dsh-tw-settings-muted`,e.description||e.title);i.title=e.title,t.append(i),r.append(t)}t.append(r),e.append(t)}}let te=$(`section`,`dsh-tw-settings-section`);te.append($(`h3`,`dsh-tw-settings-h`,`主题管理(自带主题)`));let ne=$(`div`,`dsh-tw-settings-muted`,`「加载」= TW 里可用的主题(可多选,依赖链自动带上,如 heavier 会带 snowwhite+vanilla);「活动」= 当前视觉主题(单选,自动加入加载集)。应用后重启 TW。`),C=$(`div`,`dsh-tw-settings-row dsh-tw-settings-head`);C.append($(`span`,`dsh-tw-settings-col`,`加载`),$(`span`,`dsh-tw-settings-col`,`活动`),$(`span`,`dsh-tw-settings-name`,`主题`));let re=t?.themes??[],ie=t?.themeActive,ae=re[re.length-1],T=typeof ie==`string`&&s.some(e=>e.name===ie)?ie:ae??`tiddlywiki/vanilla`,E=()=>a.themeActive??T,oe=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`应用主题(重启 TW)`);oe.type=`button`;let se=()=>{oe.disabled=a.themes===void 0&&a.themeActive===void 0},ce=$(`div`,`dsh-tw-settings-list`);for(let e of s){let t=$(`input`,`dsh-tw-settings-check`);t.type=`checkbox`,t.checked=p().has(e.name),t.title=`加载该主题`,t.addEventListener(`change`,()=>{let n=p();t.checked?n.add(e.name):n.delete(e.name),a.themes=n,se()});let n=$(`input`,`dsh-tw-settings-check`);n.type=`radio`,n.name=`dsh-tw-active-theme`,n.checked=e.name===E(),n.title=`设为活动主题`,n.addEventListener(`change`,()=>{n.checked&&(a.themeActive=e.name),se()});let r=$(`span`,`dsh-tw-settings-name`,e.label);r.title=e.name;let i=$(`span`,`dsh-tw-settings-muted`,e.description||e.name),o=$(`div`,`dsh-tw-settings-row dsh-tw-settings-plugin`);o.append(t,n,r,i),ce.append(o)}oe.addEventListener(`click`,()=>{a.themes===void 0&&a.themeActive===void 0||(oe.disabled=!0,(async()=>{try{await Tb(w,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({themes:[...p()],themeActive:E()})}),a.themes=void 0,a.themeActive=void 0,O(`主题已应用,TW 已重启`),i()}catch(e){O(`应用失败:${e instanceof Error?e.message:String(e)}`),se()}})())}),se(),te.append(ne,C,ce,oe),e.append(te);let le=$(`section`,`dsh-tw-settings-section`);le.append($(`h3`,`dsh-tw-settings-h`,`语言管理(自带官方语言包)`));let ue=$(`div`,`dsh-tw-settings-muted`,`勾选启用语言插件并重启 TW;如中文请选 zh-Hans(简体)或 zh-CN。`),de=$(`div`,`dsh-tw-settings-list`),D=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`应用语言(重启 TW)`);D.type=`button`;let fe=()=>{D.disabled=a.languages===void 0};for(let e of c){let t=$(`input`,`dsh-tw-settings-check`);t.type=`checkbox`,t.checked=m().has(e.name),t.addEventListener(`change`,()=>{let n=m();t.checked?n.add(e.name):n.delete(e.name),a.languages=n,fe()});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),de.append(n)}D.addEventListener(`click`,()=>{a.languages!==void 0&&(D.disabled=!0,(async()=>{try{await Tb(w,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({languages:[...m()]})}),a.languages=void 0,O(`语言已应用,TW 已重启`),i()}catch(e){O(`应用失败:${e instanceof Error?e.message:String(e)}`),fe()}})())}),fe(),le.append(ue,de,D),e.append(le)}function Ab(e,t,n){let r=$(`section`,`dsh-tw-settings-section`);r.append($(`h3`,`dsh-tw-settings-h`,`知识库列表`));let i=$(`div`,`dsh-tw-settings-muted`,`读取中…`),a=$(`div`,`dsh-tw-settings-row`),o=$(`div`),s=$(`input`,`dsh-tw-settings-input`);s.placeholder=`根目录(绝对路径,如 D:\\notes)`;let c=$(`input`,`dsh-tw-settings-input`);c.placeholder=`文件夹名(如 books)`;let l=$(`input`,`dsh-tw-settings-input`);l.placeholder=`显示名(留空用文件夹名)`;let u=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`添加知识库`);u.type=`button`;let d=$(`div`,`dsh-tw-settings-row dsh-tw-settings-field`);d.append(s,c,l,u);let f=$(`div`,`dsh-tw-settings-muted`,`多库模式下每个知识库是一个独立的 TW 子进程(约 150MB):标了「开局自启」的随 DSH 一起起,其余在你打开或选中它时启动。对 Agent 隐身的库不进会话选择器,检索/工具也永远不碰它。`);r.append(i,a,o,d,f),e.append(r);let p=async(e,r)=>{i.textContent=r;try{let r=await Tb(de,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(e),signal:AbortSignal.timeout(18e4)});if(t())return;let i=r.change?.errors??[];i.length>0&&O(`部分操作失败:${i.map(e=>`${e.id}:${e.message}`).join(`;`)}`),m(r),await n()}catch(e){if(t())return;O(`操作失败:${e instanceof Error?e.message:String(e)}`),await h()}},m=e=>{i.textContent=e.error!==void 0&&e.error.length>0?`⚠️ ${e.error}`:``,a.replaceChildren($(`span`,`dsh-tw-settings-label`,`运行模式:`));for(let[t,n]of[[`single`,`单库(只跑默认库)`],[`multi`,`多库(清单里的库都可用)`]]){let r=e.mode===t,i=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-chipbtn${r?` dsh-tw-settings-primary`:``}`,n);i.type=`button`,i.disabled=r,i.addEventListener(`click`,()=>{window.confirm(t===`multi`?`切换到多库模式:清单里标了「开局自启」的知识库都会启动(每个库一个 TW 子进程)。继续?`:`切换到单库模式:除默认库外的知识库会被停掉(内容与清单都不受影响)。继续?`)&&p({action:`set-mode`,mode:t},`切换模式中…`)}),a.append(i)}o.replaceChildren();let t=e.wikis??[];for(let r of t){let i=$(`div`,`dsh-tw-settings-kbrow`),a=r.id===e.defaultId;i.append($(`div`,`dsh-tw-settings-label`,`${a?`★ `:``}${r.label}(${r.id})`)),i.append($(`div`,`dsh-tw-settings-muted`,[r.running?`运行中`:`未运行`,r.agentVisible?`Agent 可见`:`Agent 隐身`,r.autostart?`开局自启`:`按需启动`,r.path].join(` · `)));let s=$(`div`,`dsh-tw-settings-row`),c=jb===r.id,l=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-chipbtn${c?` dsh-tw-settings-primary`:``}`,c?`正在配置`:`配置`);l.type=`button`,l.disabled=c,l.addEventListener(`click`,()=>{jb=r.id,n()});let u=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-chipbtn`,r.running?`停止`:`启动`);u.type=`button`,u.addEventListener(`click`,()=>{p({action:r.running?`stop`:`start`,id:r.id},r.running?`停止中…`:`启动中…`)});let d=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-chipbtn`,`设为默认`);d.type=`button`,d.disabled=a,d.addEventListener(`click`,()=>{p({action:`set-default`,id:r.id},`保存中…`)});let f=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-chipbtn`,r.agentVisible?`对 Agent 隐身`:`对 Agent 可见`);f.type=`button`,f.addEventListener(`click`,()=>{p({action:`update`,wiki:{...r,agentVisible:!r.agentVisible}},`保存中…`)});let m=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-chipbtn`,r.autostart?`取消开局自启`:`开局自启`);m.type=`button`,m.addEventListener(`click`,()=>{p({action:`update`,wiki:{...r,autostart:!r.autostart}},`保存中…`)});let h=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-chipbtn`,`移出列表`);h.type=`button`,h.disabled=t.length<=1,h.addEventListener(`click`,()=>{window.confirm(`把「${r.label}」移出清单?\n\n**目录与内容不会被删除**(仍在 ${r.path}),只是插件不再管理它。`)&&p({action:`remove`,id:r.id},`移出中…`)}),s.append(l,u,d,f,m,h),i.append(s),o.append(i)}s.value.length===0&&typeof t[0]?.root==`string`&&(s.value=t[0].root)};u.addEventListener(`click`,()=>{let e=s.value.trim(),t=c.value.trim();if(e.length===0||t.length===0){O(`请填写根目录与文件夹名`);return}let n={root:e,name:t},r=l.value.trim();r.length>0&&(n.label=r),p({action:`add`,wiki:n},`添加中(新库需要初始化与冷启动,请稍候)…`)});let h=async()=>{if(!t())try{let e=await Tb(de);if(t())return;m(e)}catch(e){if(t())return;i.textContent=`读取知识库列表失败:${e instanceof Error?e.message:String(e)}`}};h()}let jb;function Mb(e){return jb===void 0?e:`${e}?wiki=${encodeURIComponent(jb)}`}function Nb(e,t,n){let r=$(`section`,`dsh-tw-settings-section`);r.append($(`h3`,`dsh-tw-settings-h`,`知识库位置(可切换)`));let i=$(`div`,`dsh-tw-settings-muted`,`读取中…`),a=$(`div`,`dsh-tw-settings-muted`),o=$(`div`,`dsh-tw-settings-muted`),s=$(`div`,`dsh-tw-settings-muted`),c=$(`input`,`dsh-tw-settings-input`),l=$(`input`,`dsh-tw-settings-input`);c.placeholder=`绝对路径,如 D:\\notes 或 $DSH_HOME/tiddlywiki`,l.placeholder=`文件夹名(默认 main;填 . 表示直接用上面这个目录)`;let u=$(`label`,`dsh-tw-settings-field`);u.append($(`span`,`dsh-tw-settings-label`,`根目录(wikiRoot)`),c);let d=$(`label`,`dsh-tw-settings-field`);d.append($(`span`,`dsh-tw-settings-label`,`文件夹名(wiki)`),l);let f=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`切换到这个位置`);f.type=`button`;let p=$(`button`,`dsh-tw-settings-btn`,`恢复为配置默认`);p.type=`button`;let m=$(`div`,`dsh-tw-settings-row`);m.append(f,p);let h=$(`div`,`dsh-tw-settings-row dsh-tw-settings-candidates`),g=$(`div`,`dsh-tw-settings-muted`,"切换会停掉并就地重启 TW 子进程(几秒);新目录若还没有 tiddlywiki.info,插件会自动 `--init server` 初始化一个全新知识库。选中的位置会记在 $DSH_HOME 下的指针文件里(不进 wiki),可用「恢复为配置默认」清除。"),_=(e,t)=>{f.disabled=e,p.disabled=e,f.textContent=e?t:`切换到这个位置`},v=async()=>{if(!t())try{let e=await Tb(ce);if(t())return;if(e.ok!==!0)throw Error(e.error??`获取失败`);let n=e.current??{};i.textContent=`当前:${n.path??`(未知)`}`;let r=n.source===`state`?`来源:指针文件(在设置页切换过)`:n.source===`config`?`来源:cordis 配置(config.wikiRoot / config.wiki)`:`来源:默认值($DSH_HOME/tiddlywiki + main)`;a.textContent=`${r} · 配置默认:${e.default?.path??`(未知)`}`,o.textContent=e.stateFile===void 0?``:`指针文件:${e.stateFile}(不存在=使用配置默认)`,s.textContent=e.error===void 0?``:`⚠️ ${e.error}`,c.value.length===0&&typeof n.root==`string`&&(c.value=n.root),l.value.length===0&&typeof n.name==`string`&&(l.value=n.name),h.replaceChildren();let u=e.candidates??[];if(u.length>0){h.append($(`span`,`dsh-tw-settings-label`,`同目录下可选的 wiki:`));for(let e of u){let t=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-chipbtn`,e===`.`?`(根目录本身)`:e);t.type=`button`,t.title=`填入文件夹名「${e}」`,t.addEventListener(`click`,()=>{l.value=e}),h.append(t)}}}catch(e){if(t())return;i.textContent=`读取位置失败:${e instanceof Error?e.message:String(e)}`}};f.addEventListener(`click`,()=>{let e=c.value.trim(),t=l.value.trim().length>0?l.value.trim():`main`;if(e.length===0){O(`请先填写根目录(绝对路径)`);return}window.confirm(`切换知识库到:\n${e}\\${t}\n\n会停止并重启 TW 子进程;当前对话/工具随后读写的是新知识库。确定继续?`)&&(_(!0,`切换中…(重启 TW)`),(async()=>{try{let r=await Tb(le,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({root:e,name:t}),signal:AbortSignal.timeout(12e4)});r.warning===void 0?O(`已切换到 ${r.path??``}`):O(`已切换到 ${r.path??``}(注意:${r.warning})`),Ce(),await v(),await n()}catch(e){O(`切换失败:${e instanceof Error?e.message:String(e)}`),await v()}finally{_(!1,``)}})())}),p.addEventListener(`click`,()=>{window.confirm(`恢复为配置默认位置?会删除位置指针文件,并(必要时)切回配置里的知识库。`)&&(_(!0,`切换中…(重启 TW)`),(async()=>{try{let e=await Tb(ue,{method:`POST`,headers:{"content-type":`application/json`},body:`{}`,signal:AbortSignal.timeout(12e4)});O(e.warning===void 0?`已恢复为配置默认:${e.path??``}`:`已恢复默认(注意:${e.warning})`),Ce(),await v(),await n()}catch(e){O(`恢复失败:${e instanceof Error?e.message:String(e)}`),await v()}finally{_(!1,``)}})())}),r.append(i,a,o,u,d,m,h,s,g),e.append(r),v()}function Pb(e,t){let n=$(`section`,`dsh-tw-settings-section`);n.append($(`h3`,`dsh-tw-settings-h`,`初始化(一次性预置)`));let r=$(`div`,`dsh-tw-settings-muted`,`这些是插件与 dsh 联动、需要在 wiki 里预置的 tiddler/配置。「发送给 Agent 按钮」和「TW 前端 API 基址」是功能必需项,启动时自动写入(只写缺失,不覆盖你的改动);其余为可选项,默认不自动写入、也不会强绑定——需要时点「重新初始化」写入,不想要了可随时「反初始化」移除。`),i=$(`div`,`dsh-tw-settings-list`),a=$(`div`,`dsh-tw-settings-muted`),o=async()=>{if(!t())try{let e=await Tb(E);if(t())return;if(e.ok!==!0||!Array.isArray(e.items))throw Error(e.error??`获取失败`);i.replaceChildren();let n=0,r=0;for(let t of e.items){t.present&&(n+=1),t.removable&&(r+=1);let e=$(`span`,`dsh-tw-settings-chip`,t.present?`✓`:`✗`);e.dataset.state=t.present?`ok`:`missing`,e.title=t.present?`已存在`:`缺失`;let a=$(`span`,`dsh-tw-settings-name`,t.title);a.title=t.id;let s=$(`span`,`dsh-tw-settings-muted`,t.detail??t.description),c=t.updateAvailable===!0?$(`span`,`dsh-tw-settings-chip`,`⬆ 有更新`):void 0;c!==void 0&&(c.dataset.state=`update`,c.title=`内置内容在本 wiki 预置之后更新过,可点「重新初始化」取用`);let l=t.userModified===!0?$(`span`,`dsh-tw-settings-chip`,`✏️ 本地已修改`):void 0;l!==void 0&&(l.dataset.state=`missing`,l.title=`这篇是你的内容:重新初始化会覆盖它`);let u=$(`button`,`dsh-tw-settings-btn`,t.updateAvailable===!0?`更新到内置版本`:`重新初始化`);u.type=`button`,u.title=`强制重写「${t.title}」的内置内容(会覆盖当前 tiddler)`,u.addEventListener(`click`,()=>{if(t.updateAvailable===!0){let e=t.userModified===!0?`「${t.title}」有你的本地修改,更新会覆盖它。`:t.userModified===void 0?`无法确认「${t.title}」是否被你编辑过(旧格式标记),更新可能覆盖你的改动。`:``;if(!window.confirm(`${e}${e.length>0?`
|
|
807
|
+
`}${e}\n`;n.dispatch({changes:{from:t,insert:r},selection:{anchor:t+r.length},scrollIntoView:!0}),n.focus()},focus:()=>n.focus()}}const Wy=`dsh-tw-note-state`,Gy=`dsh-tw-note-draft-v1`,Ky=`dsh-tw-note-window-id`,qy=(()=>{try{let e=sessionStorage.getItem(Ky);if(e!==null&&e.length>0)return e;let t=Math.random().toString(36).slice(2,10);return sessionStorage.setItem(Ky,t),t}catch{return Math.random().toString(36).slice(2,10)}})();function Jy(){return`dsh-tw-note-draft-v1:${qy}`}function Yy(e){if(e===null)return null;try{let t=JSON.parse(e);return typeof t.text!=`string`||typeof t.title!=`string`?null:{text:t.text,title:t.title,tags:Array.isArray(t.tags)?t.tags.filter(e=>typeof e==`string`):[],savedAt:typeof t.savedAt==`number`?t.savedAt:0,windowId:typeof t.windowId==`string`?t.windowId:void 0}}catch{return null}}function Xy(e){try{return Yy(localStorage.getItem(e))}catch{return null}}function Zy(){let e=Xy(Jy());if(e!==null)return{draft:e,foreign:e.windowId!==void 0&&e.windowId!==qy};let t=Xy(Gy);if(t===null)return null;let n={...t,windowId:qy};$y(n);try{localStorage.removeItem(Gy)}catch{}return{draft:n,foreign:!0}}function Qy(e){$y({...e,windowId:qy})}function $y(e){try{localStorage.setItem(Jy(),JSON.stringify({...e,windowId:qy}))}catch{}}function eb(){try{localStorage.removeItem(Jy())}catch{}}function tb(e,t,n){return`${e}\u0000${t}\u0000${n.join(``)}`}function nb(e){return e<10?`0${e}`:String(e)}function rb(e=new Date){return`${e.getFullYear()}-${nb(e.getMonth()+1)}-${nb(e.getDate())} ${nb(e.getHours())}:${nb(e.getMinutes())}`}function ib(e){if(e===null)return``;let t=new Date(e).getTime();if(Number.isNaN(t))return``;let n=Date.now()-t,r=Math.floor(n/6e4);if(r<1)return`刚刚`;if(r<60)return`${r}分钟前`;let i=Math.floor(r/60);if(i<24)return`${i}小时前`;let a=Math.floor(i/24);return a<30?`${a}天前`:new Date(t).toLocaleDateString(`zh-CN`)}async function ab(){let e=await ve();return typeof e?.note?.tag==`string`&&e.note.tag.length>0?e.note.tag:`inbox`}function ob(e={}){let t=document.createElement(`div`);t.className=`dsh-tw-note-tags`;let n=document.createElement(`div`);n.className=`dsh-tw-note-chips`;let r=document.createElement(`input`);r.className=`dsh-tw-note-taginput`,r.placeholder=`tag(可多选,自动补全)`;let i=document.createElement(`div`);i.className=`dsh-tw-note-tagsuggest`,i.hidden=!0,t.append(n,r,i);let a=[],o=()=>{i.hidden=!0},s=()=>{e.onChange?.()},c=()=>{n.replaceChildren();for(let e of a){let t=document.createElement(`span`);t.className=`dsh-tw-note-tagchip`,t.textContent=e;let r=document.createElement(`span`);r.className=`dsh-tw-note-tagchip-x`,r.textContent=`×`,r.title=`移除 tag「${e}」`,r.addEventListener(`click`,t=>{t.stopPropagation();let n=a.indexOf(e);n>=0&&(a.splice(n,1),c(),s())}),t.append(r),n.append(t)}},l=e=>{let t=e.trim();t.length===0||a.includes(t)||(a.push(t),r.value=``,c(),o(),r.focus(),s())},u=()=>{for(let e of r.value.split(/\s+/))l(e)},d=[],f,p,m=()=>{let t=e.wikiQuery?.(b)??b;return(f===void 0||p!==t)&&(p=t,f=fetch(t,{signal:AbortSignal.timeout(5e3)}).then(e=>e.ok?e.json():Promise.resolve({})).then(e=>[...e.tags??[]].sort((e,t)=>e.localeCompare(t,`zh`))).catch(()=>[]),f.then(e=>{d=e})),f},h=()=>{let e=r.value.trim().toLowerCase(),t=d.filter(t=>!a.includes(t)&&(e.length===0||t.toLowerCase().includes(e))).slice(0,8);i.replaceChildren();for(let e of t){let t=document.createElement(`div`);t.className=`dsh-tw-note-tagsuggest-item`,t.textContent=e,t.setAttribute(`role`,`button`),t.tabIndex=0,t.setAttribute(`aria-label`,`添加标签「${e}」`),t.addEventListener(`mousedown`,t=>{t.preventDefault(),l(e)}),t.addEventListener(`keydown`,t=>{(t.key===`Enter`||t.key===` `)&&(t.preventDefault(),l(e))}),i.append(t)}i.hidden=t.length===0};r.addEventListener(`focus`,()=>{m().then(h)}),r.addEventListener(`input`,()=>{d.length===0?m().then(h):h()}),r.addEventListener(`keydown`,e=>{e.key===`Enter`||e.key===`,`?(e.preventDefault(),u()):e.key===`Backspace`&&r.value.length===0&&a.length>0?(a.pop(),c(),s()):e.key===`Escape`&&o()});let g=e=>{t.contains(e.target)||o()};return document.addEventListener(`click`,g,!0),{el:t,getTags:()=>(u(),[...a]),peekTags:()=>[...a],setDefault:e=>{if(a.length===0){let t=e.trim();t.length>0&&(a.push(t),c())}},setTags:e=>{a.length=0;for(let t of Array.isArray(e)?e:[]){let e=typeof t==`string`?t.trim():``;e.length>0&&!a.includes(e)&&a.push(e)}r.value=``,c(),o()},dispose:()=>document.removeEventListener(`click`,g,!0)}}async function sb(e,t,n=e=>e){if(e.size>67108864){D(`文件过大(≤ 64MB)`);return}try{let r=await fetch(n(`${ee}?name=${encodeURIComponent(e.name)}`),{method:`POST`,headers:{"content-type":e.type||`application/octet-stream`},body:e,signal:AbortSignal.timeout(12e4)}),i=await r.json().catch(()=>null);if(!r.ok||i?.ok!==!0){D(`上传失败:${i?.error??`HTTP ${r.status}`}`);return}let a=i.name??e.name,o=e.type.startsWith(`image/`)?``:`[${a}](${i.url})`;t.insertAtCaret(o),D(`已上传「${a}」并插入链接`)}catch(e){D(`上传失败:${e instanceof Error?e.message:String(e)}`)}}function cb(){let e,t=!1,n=!1,r=!1,i,a=`inbox`,o,s=!1,c=`single`,l=[],u,d=e=>he(e,o),f,p=!1,m=null,h=null,_=e=>{try{window.dispatchEvent(new CustomEvent(Wy,{detail:{open:e}}))}catch{}},b=t=>{if(e===void 0)return;let n=e.root,r=e.card;if(t!==void 0){let e=t.getBoundingClientRect(),i=r.offsetWidth||340,a=r.offsetHeight||260,o=window.innerWidth,s=window.innerHeight,c=Math.min(Math.max(e.left+e.width/2-i/2,8),Math.max(8,o-i-8)),l=s-e.top+10,u=Math.min(Math.max(8,l),Math.max(8,s-a-8));n.style.right=`auto`,n.style.top=`auto`,n.style.left=`${c}px`,n.style.bottom=`${u}px`}else n.style.right=`24px`,n.style.bottom=`88px`,n.style.left=`auto`,n.style.top=`auto`},S=null,ee=()=>{e!==void 0&&(S=rb(),e.titleInput.value=S)},te=()=>{if(e===void 0)return;let t=e.editor.getValue(),n=e.titleInput.value.trim();if(t.trim().length===0&&(n.length===0||n===S)){eb();return}let r=tb(n,t,e.tagEditor.peekTags());h!==null&&r===h||$y({text:t,title:n,tags:e.tagEditor.peekTags(),savedAt:Date.now()})},ne=()=>{t||!n||e===void 0||(f!==void 0&&(clearTimeout(f),f=void 0),f=window.setTimeout(()=>{f=void 0,te()},500))},C=()=>{e!==void 0&&(e.draftBanner.hidden=!0)},re=async(e,t,n)=>{try{let r=await fetch(d(y),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({title:e,tags:n,text:t}),signal:AbortSignal.timeout(1e4)}),i=await r.json().catch(()=>null);if(!r.ok||i?.ok!==!0)return D(`打开失败:${i?.error??`HTTP ${r.status}`}`),!1;if(typeof i.twUrl!=`string`||typeof i.draftTitle!=`string`)return D(`打开失败:服务未返回编辑器地址`),!1;eb(),C(),h=tb(e,t,n),m=null;let a=me(c,o,i.twUrl,i.twUrlAbsolute);return It(`${pe(a.relative,a.absolute)}#${encodeURIComponent(i.draftTitle)}`,i.title??e),D(`已在弹出窗口打开「${i.title??e}」编辑器`),!0}catch(e){return D(`打开失败:${e instanceof Error?e.message:String(e)}`),!1}},ie=()=>{p=!1,e!==void 0&&(e.recentWrap.hidden=!0)},w=async t=>{try{let n=await fetch(d(`${g}?title=${encodeURIComponent(t)}`),{signal:AbortSignal.timeout(1e4)}),r=await n.json().catch(()=>null);if(!n.ok||r?.ok!==!0||typeof r.title!=`string`){D(`读取失败:${r?.notFound===!0?`不存在`:r?.error??`HTTP ${n.status}`}`);return}if(e===void 0)return;e.editor.setValue(r.text??``),e.titleInput.value=r.title,e.tagEditor.setTags(r.tags??[]),m={title:r.title,...typeof r.modified==`string`&&r.modified.length>0?{modified:r.modified}:{},...typeof r.revision==`number`?{revision:r.revision}:{}},h=tb(r.title,r.text??``,r.tags??[]),C(),ie(),D(`已载入「${r.title}」`),e.editor.focus()}catch(e){D(`读取失败:${e instanceof Error?e.message:String(e)}`)}},ae=()=>{if(e===void 0)return;if(p){ie();return}p=!0,e.recentWrap.hidden=!1,e.recentWrap.textContent=``;let t=document.createElement(`div`);t.className=`dsh-tw-note-recent-muted`,t.textContent=`加载中…`,e.recentWrap.append(t),(async()=>{try{let t=await(await fetch(d(`${x}?limit=15`),{signal:AbortSignal.timeout(1e4)})).json().catch(()=>null);if(!p||e===void 0)return;e.recentWrap.replaceChildren();let n=[];if(t?.ok===!0)for(let e of t.items??[]){if(typeof e!=`object`||!e)continue;let t=e,r=typeof t.title==`string`?t.title:``;r.length!==0&&n.push({title:r,tags:Array.isArray(t.tags)?t.tags.filter(e=>typeof e==`string`):[],modified:typeof t.modified==`string`?t.modified:null,snippet:typeof t.snippet==`string`?t.snippet:``})}if(n.length===0){let n=document.createElement(`div`);n.className=`dsh-tw-note-recent-muted`,n.textContent=t?.ok===!0?`暂无笔记`:`加载失败:${t?.error??`未知`}`,e.recentWrap.append(n);return}for(let t of n){let n=document.createElement(`div`);n.className=`dsh-tw-note-recent-item`,n.title=t.snippet||t.title,n.setAttribute(`role`,`button`),n.tabIndex=0,n.setAttribute(`aria-label`,`载入笔记「${t.title}」`);let r=document.createElement(`span`);r.className=`dsh-tw-note-recent-name`,r.textContent=t.title;let i=document.createElement(`span`);i.className=`dsh-tw-note-recent-meta`;let a=[ib(t.modified)];t.tags.length>0&&a.unshift(t.tags.slice(0,3).join(`,`)),i.textContent=a.join(` · `),n.append(r,i),n.addEventListener(`click`,()=>{w(t.title)}),n.addEventListener(`keydown`,e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),w(t.title))}),e.recentWrap.append(n)}}catch(t){if(!p||e===void 0)return;e.recentWrap.replaceChildren();let n=document.createElement(`div`);n.className=`dsh-tw-note-recent-muted`,n.textContent=`加载失败:${t instanceof Error?t.message:String(t)}`,e.recentWrap.append(n)}})()},T=()=>{if(e!==void 0)return;let r=document.createElement(`div`);r.className=`dsh-tw-note`,r.hidden=!0;let a=document.createElement(`div`);a.className=`dsh-tw-note-card`;let p=document.createElement(`div`);p.className=`dsh-tw-note-head`;let g=document.createElement(`span`);g.className=`dsh-tw-note-label`,g.textContent=`📝 快速笔记`;let y=document.createElement(`button`);y.type=`button`,y.className=`dsh-tw-note-close`,y.title=`收起`,y.textContent=`✕`,p.append(g,y);let b=document.createElement(`div`);b.className=`dsh-tw-note-draft`,b.hidden=!0;let x=document.createElement(`span`);x.className=`dsh-tw-note-draft-text`,x.textContent=`已恢复未保存草稿`;let ee=document.createElement(`button`);ee.type=`button`,ee.className=`dsh-tw-note-draft-discard`,ee.textContent=`丢弃`,b.append(x,ee);let w=document.createElement(`div`);w.className=`dsh-tw-note-fields`;let T=document.createElement(`input`);T.className=`dsh-tw-note-title`,T.placeholder=`标题(默认时间戳)`,T.setAttribute(`aria-label`,`笔记标题(默认时间戳)`);let oe=ob({onChange:ne});w.append(T,oe.el);let se=document.createElement(`label`);se.className=`dsh-tw-note-wiki`,se.hidden=!0;let ce=document.createElement(`span`);ce.className=`dsh-tw-note-wiki-label`,ce.textContent=`写入`;let le=document.createElement(`select`);le.className=`dsh-tw-note-wiki-select`,le.setAttribute(`aria-label`,`这条笔记写进哪个知识库`),se.append(ce,le);let ue=document.createElement(`span`);ue.className=`dsh-tw-note-wiki-hint`,ue.hidden=!0,w.append(se,ue);let de=()=>{let e=l.find(e=>e.id===o),t=e!==void 0&&!e.running;ue.hidden=!t,ue.textContent=t?`${e.label} 当前没在运行:先在右下角「知识库」菜单里打开它`:``};le.addEventListener(`change`,()=>{s=!0,o=le.value.length>0?le.value:void 0,de()}),ve().then(e=>{if(t||(c=typeof e?.mode==`string`?e.mode:`single`,l=(Array.isArray(e?.wikis)?e.wikis:[]).map(e=>({id:e.id,label:e.label,running:e.running})),l.length<=1))return;let n=typeof e?.defaultId==`string`?e.defaultId:void 0,r=()=>{s||(o=Re(l,n))};r(),le.replaceChildren(...l.map(e=>{let t=document.createElement(`option`);return t.value=e.id,t.textContent=e.running?e.label:`${e.label}(未运行)`,t}));let i=document.createElement(`option`);i.value=``,i.textContent=`默认库`,le.append(i),le.value=o??``,se.hidden=!1,de(),u=Le(()=>{r(),le.value=o??``,de()})}),T.addEventListener(`input`,ne);let fe,E=Uy({placeholder:`写点东西… Markdown 高亮,可 📎/拖入文件
|
|
808
|
+
Ctrl+Enter 保存`,onSave:()=>{fe?.()},onChange:ne}),pe=document.createElement(`button`);pe.type=`button`,pe.className=`dsh-tw-note-upload`,pe.title=`上传文件到 wiki 并插入 Markdown 链接(也可直接拖入编辑器)`,pe.textContent=`📎 上传`;let me=document.createElement(`input`);me.type=`file`,me.multiple=!0,me.hidden=!0,pe.addEventListener(`click`,()=>{me.click()}),me.addEventListener(`change`,()=>{for(let e of Array.from(me.files??[]))sb(e,E,d);me.value=``});let he=0;E.el.addEventListener(`dragenter`,e=>{e.preventDefault(),he++,E.el.classList.add(`dsh-tw-note-drop`)}),E.el.addEventListener(`dragover`,e=>{e.preventDefault()}),E.el.addEventListener(`dragleave`,e=>{e.preventDefault(),he=Math.max(0,he-1),he===0&&E.el.classList.remove(`dsh-tw-note-drop`)}),E.el.addEventListener(`drop`,e=>{e.preventDefault(),he=0,E.el.classList.remove(`dsh-tw-note-drop`);let t=e.dataTransfer?.files;if(!(t===void 0||t.length===0))for(let e of Array.from(t))sb(e,E,d)});let ge=document.createElement(`div`);ge.className=`dsh-tw-note-foot`;let _e=document.createElement(`div`);_e.className=`dsh-tw-note-foot-left`;let ye=document.createElement(`span`);ye.className=`dsh-tw-note-hint`,ye.textContent=`Ctrl+Enter`;let be=document.createElement(`button`);be.type=`button`,be.className=`dsh-tw-note-recent-btn`,be.title=`最近修改的笔记,点击载入继续编辑`,be.textContent=`🕘 最近`,be.addEventListener(`click`,ae),_e.append(pe,be,ye);let xe=document.createElement(`div`);xe.className=`dsh-tw-note-foot-right`;let Se=document.createElement(`button`);Se.type=`button`,Se.className=`dsh-tw-note-edit`,Se.title=`保存并在 TiddlyWiki 原生编辑器中打开`,Se.textContent=`✏️ 在 TW 中编辑`;let Ce=document.createElement(`button`);Ce.type=`button`,Ce.className=`dsh-tw-note-save`,Ce.textContent=`保存`,xe.append(Se,Ce),ge.append(_e,xe);let we=document.createElement(`div`);we.className=`dsh-tw-note-recent`,we.hidden=!0,a.append(p,b,w,E.el,ge),r.append(a,we),document.body.append(r),e={root:r,card:a,editor:E,titleInput:T,tagEditor:oe,saveBtn:Ce,editBtn:Se,draftBanner:b,bannerText:x,recentWrap:we};let Te=()=>{n=!1,r.hidden=!0,ie(),_(!1)},Ee=()=>{f!==void 0&&(clearTimeout(f),f=void 0),E.setValue(``),T.value=rb(),S=T.value,oe.setTags([]),h=tb(T.value.trim(),``,[])},De=()=>{eb(),C(),h=tb(T.value.trim(),E.getValue(),oe.getTags()),m=null,Ee(),Te()},Oe=!1;fe=async()=>{if(Oe)return;let e=E.getValue().trim();if(e.length===0){D(`内容为空,未保存`);return}Oe=!0,Ce.disabled=!0,Ce.textContent=`保存中…`;try{let t=T.value.trim(),n={title:t,tags:oe.getTags(),text:e};m!==null&&m.title===t&&(m.modified!==void 0&&(n.expectedModified=m.modified),m.revision!==void 0&&(n.expectedRevision=m.revision));let r=await fetch(d(v),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(n),signal:AbortSignal.timeout(1e4)}),i=await r.json().catch(()=>null);if(!r.ok||i?.ok!==!0){if(r.status===409||i?.conflict===!0){D(`保存被拒绝:这篇笔记在你读取之后被改动过。请用「🕘 最近」重新载入后再保存。`);return}D(`保存失败:${i?.error??`HTTP ${r.status}`}`);return}De(),D(`已保存「${i.title??T.value}」`)}catch(e){D(`保存失败:${e instanceof Error?e.message:String(e)}`)}finally{Oe=!1,Ce.disabled=!1,Ce.textContent=`保存`}},Ce.addEventListener(`click`,()=>{fe?.()});let ke=async()=>{let e=T.value.trim().length>0?T.value.trim():rb(),t=E.getValue(),n=oe.getTags();Se.disabled=!0,Se.textContent=`打开中…`;try{await re(e,t,n)}finally{Se.disabled=!1,Se.textContent=`✏️ 在 TW 中编辑`}};Se.addEventListener(`click`,()=>{ke()}),y.addEventListener(`click`,Te);let Ae=null,je=(e,t)=>{let n=window.innerWidth,i=window.innerHeight,o=a.offsetWidth||340,s=a.offsetHeight||260,c=Math.min(Math.max(e,8),Math.max(8,n-o-8)),l=Math.min(Math.max(t,8),Math.max(8,i-s-8));r.style.right=`auto`,r.style.bottom=`auto`,r.style.left=`${c}px`,r.style.top=`${l}px`};p.addEventListener(`pointerdown`,e=>{if(y.contains(e.target))return;e.preventDefault();let t=r.getBoundingClientRect();Ae={startX:e.clientX,startY:e.clientY,origLeft:t.left,origTop:t.top,moved:!1};try{p.setPointerCapture(e.pointerId)}catch{}p.classList.add(`dsh-tw-note-head-dragging`)}),p.addEventListener(`pointermove`,e=>{if(Ae===null)return;let t=e.clientX-Ae.startX,n=e.clientY-Ae.startY;!Ae.moved&&Math.abs(t)<4&&Math.abs(n)<4||(Ae.moved=!0,je(Ae.origLeft+t,Ae.origTop+n))});let Me=e=>{if(Ae!==null){try{p.releasePointerCapture(e.pointerId)}catch{}Ae=null,p.classList.remove(`dsh-tw-note-head-dragging`)}};p.addEventListener(`pointerup`,Me),p.addEventListener(`pointercancel`,Me),ee.addEventListener(`click`,()=>{eb(),C(),Ee(),D(`已丢弃草稿`)}),i=()=>{te()},window.addEventListener(`pagehide`,i)};return{async open(r){if(t||(T(),e===void 0||n))return;n=!0,e.root.hidden=!1,b(r),_(!0);let i=Zy(),o=i?.draft??null;if(o!==null&&(o.text.trim().length>0||o.title.trim().length>0))e.editor.setValue(o.text),e.titleInput.value=o.title,e.tagEditor.setTags(o.tags),e.bannerText.textContent=i?.foreign===!0?`已恢复未保存草稿(来自其它窗口)`:`已恢复未保存草稿`,e.draftBanner.hidden=!1,i?.foreign===!0&&(D(`已恢复其它窗口的未保存草稿`),Qy(o));else{if(ee(),a=await ab(),t||e===void 0)return;e.tagEditor.setDefault(a)}e!==void 0&&e.editor.focus()},close(){e!==void 0&&(n=!1,e.root.hidden=!0,ie(),_(!1))},async openNative(){if(!(t||r)&&!(Lt()&&!Rt())){r=!0;try{let e=Zy(),n=e!==null&&(e.draft.text.trim().length>0||e.draft.title.trim().length>0),r=n&&e.draft.title.trim().length>0?e.draft.title.trim():rb(),i=n?e.draft.text:``,o=[];if(n)o=e.draft.tags;else{if(a=await ab(),t)return;o=[a]}e!==null&&e.foreign&&(e.draft.text.trim().length>0||e.draft.title.trim().length>0)&&(D(`已恢复其它窗口的未保存草稿`),Qy(e.draft)),await re(r,i,o)}finally{r=!1}}},isOpen(){return n},dispose(){t=!0,u?.(),u=void 0,i!==void 0&&(window.removeEventListener(`pagehide`,i),i=void 0),f!==void 0&&(clearTimeout(f),f=void 0),te(),e?.tagEditor.dispose(),e?.editor.view.destroy(),e?.root.remove(),e=void 0}}}function lb(e){return e<10?`0${e}`:String(e)}function ub(e){return`${lb(e.getHours())}:${lb(e.getMinutes())}`}function db(e,t){let n=e?.git,r=[`同步知识库`],i=`offline`;if(n==null||n.exists!==!0)r.push(`git 仓库不可用`);else{r.push(`分支 ${n.branch??`?`}`),typeof n.lastCommit==`string`&&r.push(n.lastCommit);let e=typeof n.behind==`number`?n.behind:0,t=typeof n.ahead==`number`?n.ahead:0;t>0&&r.push(`领先 ${t}`),e>0&&r.push(`落后 ${e}`),n.dirty===!0?(i=`dirty`,r.push(`有 ${n.dirtyFiles?.length??0} 个未提交改动`)):i=e>0?`behind`:`clean`}return t!==void 0&&r.push(`上次同步 ${ub(t)}`),{state:i,tooltip:r.join(` · `)}}function fb(){let e={state:`offline`,tooltip:`同步知识库`},t,n,r=!1,i=!1,a=new Set,o=()=>{for(let e of[...a])e()},s=n=>{if(r)return;let i=db(n,t);(i.state!==e.state||i.tooltip!==e.tooltip)&&(e=i,o())},c=async()=>{if(i)return;let e=await ve();i||s(e)};return c(),n=window.setInterval(()=>{c()},3e4),{getState:()=>e,trigger:async()=>{if(i)return e;if(r)return D(`同步进行中…`),e;r=!0,e={...e,state:`syncing`},o();try{let e=await fetch(te,{method:`POST`,signal:AbortSignal.timeout(12e4)}),n=ge(await e.json().catch(()=>null),e.status);n.ok?(t=new Date,D(`同步完成:${n.message}`)):D(`同步失败:${n.message}`)}catch(e){D(`同步失败:${e instanceof Error?e.message:String(e)}`)}finally{r=!1,await c()}return e},subscribe(e){return a.add(e),()=>{a.delete(e)}},dispose(){i=!0,n!==void 0&&(clearInterval(n),n=void 0),a.clear()}}}async function pb(){let e=await ve(),t=Array.isArray(e?.wikis)?e.wikis.map(e=>({id:e.id,label:e.label,running:e.running,path:e.path})):[];return{mode:typeof e?.mode==`string`?e.mode:`single`,...typeof e?.defaultId==`string`?{defaultId:e.defaultId}:{},wikis:t}}async function mb(){let e=await Te();return{showQuickNote:e.showQuickNote,showPanelStatus:e.showPanelStatus,showSyncButton:e.showSyncButton}}async function hb(){let e=await ve();if(e===null)return{state:`failed`,text:`状态不可达`,logs:[]};let t=Array.isArray(e.logs)?e.logs.filter(e=>typeof e==`string`):[];return e.status===`running`?{state:`running`,text:`TW 在线 · ${e.url??``}`,logs:t}:e.status===`starting`?{state:`starting`,text:`TW 启动中…`,logs:t}:{state:`failed`,text:e.error??`TW 状态:${e.status??`?`}`,logs:t}}function gb(e,t,n){let r=!1,i,a,o,s,c,l,u,d,f=!1,m={state:`unknown`,text:`TiddlyWiki 服务…`,logs:[]},h=()=>{f=!1,s!==void 0&&(s.hidden=!0),u!==void 0&&(u.hidden=!0)},g=e=>{if(!f)return;let t=e.target;i!==void 0&&i.contains(t)||h()},_=()=>{if(u===void 0)return;let e=[`TiddlyWiki 服务:${m.text}`];e.push(`知识库同步:${n.getState().tooltip}`),m.logs.length>0&&(e.push(`最近日志:`),e.push(...m.logs.slice(-3))),u.textContent=e.join(`
|
|
809
|
+
`)},v=()=>{let e=n.getState();o!==void 0&&(o.dataset.state=e.state),a!==void 0&&(a.title=`知识库 · ${e.tooltip}`),_()},y=async()=>{m=await hb(),!r&&(c!==void 0&&(c.textContent=m.text),l!==void 0&&(l.dataset.state=m.state),_())},b=(m,b)=>{if(r)return;if(i=document.createElement(`div`),i.className=`dsh-tw-fab-wrap`,s=document.createElement(`div`),s.className=`dsh-tw-fab-menu`,s.hidden=!0,m.showPanelStatus){let e=document.createElement(`div`);e.className=`dsh-tw-fab-status dsh-tw-fab-status-tiprow`,l=document.createElement(`span`),l.className=`dsh-tw-fab-status-dot`,l.dataset.state=`unknown`,c=document.createElement(`span`),c.className=`dsh-tw-fab-status-text`,c.textContent=`TiddlyWiki 服务…`,e.append(l,c),u=document.createElement(`div`),u.className=`dsh-tw-fab-tip`,u.hidden=!0,e.append(u),e.addEventListener(`mouseenter`,()=>{_(),u!==void 0&&(u.hidden=!1)}),e.addEventListener(`mouseleave`,()=>{u!==void 0&&(u.hidden=!0)}),s.append(e)}if(m.showQuickNote){let e=document.createElement(`button`);e.type=`button`,e.className=`dsh-tw-fab-item`,e.textContent=`📝 快速笔记`,e.title=`ui.quickNoteMode=native 时直接打开 TW 原生编辑器;card 时打开 Markdown 卡片`,e.addEventListener(`click`,()=>{h(),Te().then(e=>{e.quickNoteMode===`native`?t.openNative():t.open()})}),s.append(e)}if(m.showPanelStatus){if(b.wikis.length>1){let t=Re(b.wikis,b.defaultId),n=document.createElement(`div`);n.className=`dsh-tw-fab-group`,n.textContent=`知识库`,s.append(n);for(let n of b.wikis){let r=document.createElement(`button`);r.type=`button`,r.className=`dsh-tw-fab-item`,r.dataset.current=n.id===t?`1`:`0`,r.textContent=`${n.id===t?`●`:`○`} ${n.label}`,r.title=`${n.path}${n.running?``:`(未运行,打开会启动)`}`,r.addEventListener(`click`,()=>{h(),Ie(n.id),n.running||fetch(`${p}/admin/wikis`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({action:`start`,id:n.id}),signal:AbortSignal.timeout(12e4)}).catch(()=>void 0),e.openPanel()}),s.append(r)}}d=document.createElement(`span`),d.textContent=`打开 TW 面板`;let t=document.createElement(`button`);t.type=`button`,t.className=`dsh-tw-fab-item`,t.append(document.createTextNode(`🖥 `),d),t.addEventListener(`click`,()=>{h(),e.toggle()}),s.append(t);let n=document.createElement(`button`);n.type=`button`,n.className=`dsh-tw-fab-item`,n.textContent=`🔄 重载 TW 面板`,n.addEventListener(`click`,()=>{h(),document.dispatchEvent(new CustomEvent(ot)),y()}),s.append(n)}if(m.showSyncButton){let e=document.createElement(`button`);e.type=`button`,e.className=`dsh-tw-fab-item`,e.textContent=`🔁 同步`,e.addEventListener(`click`,()=>{h(),n.trigger()}),s.append(e)}a=document.createElement(`button`),a.type=`button`,a.className=`dsh-tw-fab`,a.setAttribute(`aria-label`,`TiddlyWiki 知识库`);let x=document.createElement(`span`);x.className=`dsh-tw-fab-icon`,x.innerHTML=`<svg viewBox="0 0 16 16" width="17" height="17" fill="none" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 2.5h8a1 1 0 0 1 1 1v9a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1v-9a1 1 0 0 1 1-1z"/><path d="M6 6h4M6 8.5h2.5"/></svg>`,o=document.createElement(`span`),o.className=`dsh-tw-fab-dot`,o.dataset.state=n.getState().state,a.append(x,o),a.addEventListener(`click`,()=>{if(s!==void 0){if(f){h();return}f=!0,s.hidden=!1,v(),y()}}),i.append(s,a),document.body.append(i),v(),document.addEventListener(`click`,g,!0)},x=e.subscribe(()=>{d!==void 0&&(d.textContent=e.isOpen()?`收起 TW 面板`:`打开 TW 面板`)}),S=n.subscribe(v);return(async()=>{let[e,t]=await Promise.all([mb(),pb()]);r||!e.showQuickNote&&!e.showPanelStatus&&!e.showSyncButton||b(e,t)})(),()=>{r=!0,document.removeEventListener(`click`,g,!0),x(),S(),i?.remove()}}function _b(e){return function(){let[t,n]=c.useState(!1),[r,i]=c.useState(null),a=c.useRef(null),o=c.useRef(null);c.useEffect(()=>{let e=!0,t=e=>{let t=e.detail;n(t?.open===!0)};return window.addEventListener(Wy,t),Te().then(t=>{e&&i(t.quickNoteMode)}),()=>{e=!1,window.removeEventListener(Wy,t)}},[]),c.useLayoutEffect(()=>{let e=a.current;if(e===null)return;let t=()=>{let t=null,n=null,r=e;for(;r!==null&&r!==document.documentElement&&(r=r.parentElement,r!==null);){for(let e of r.querySelectorAll(`textarea, [contenteditable]:not([contenteditable="false"]), [role="textbox"]`))if(e.getBoundingClientRect().width>300){t=e,n=r;break}if(n!==null)break}if(t===null||n===null)return null;let i=n.getBoundingClientRect().width,a=t,o=null,s=0;for(;a!==null&&a!==n;){let e=a.getBoundingClientRect().width;e>0&&e<i-8&&e>=s&&(s=e,o=a),a=a.parentElement}return o},n=()=>{let n=e.getBoundingClientRect(),r=t(),i=r===null?n.right:r.getBoundingClientRect().right,a=Math.max(0,n.right-i);return e.style.paddingRight!==`${a}px`&&(e.style.paddingRight=`${a}px`),r!==null};n();let r=new ResizeObserver(n),i=e;for(;i!==null&&i!==document.documentElement&&(r.observe(i),!(i instanceof HTMLElement&&i.hasAttribute(`data-phase`)));)i=i.parentElement;window.addEventListener(`resize`,n),document.addEventListener(`visibilitychange`,n);let o=0,s=0,c=window.setInterval(()=>{if(s++,!n()){s>=20&&window.clearInterval(c);return}o++,o>=3&&window.clearInterval(c)},1500),l=window.setTimeout(n,120),u=window.setTimeout(n,600);return()=>{r.disconnect(),window.removeEventListener(`resize`,n),document.removeEventListener(`visibilitychange`,n),window.clearInterval(c),window.clearTimeout(l),window.clearTimeout(u)}},[]);let s=r===`native`,l=s?`快速笔记`:t?`快速笔记(已打开)`:`快速笔记`,u=s?`快速笔记:直接打开 TiddlyWiki 原生编辑器(再次点击可收起弹窗)`:t?`快速笔记已打开(点此按钮或卡片右上角 ✕ 收起)`:`打开快速笔记(在按钮上方弹出,可拖动标题栏移动)`;return c.createElement(`div`,{ref:a,className:`dsh-tw-dock-note`},c.createElement(`button`,{ref:o,type:`button`,className:t?`dsh-tw-dock-note-btn dsh-tw-dock-note-btn-active`:`dsh-tw-dock-note-btn`,title:u,onClick:()=>{Te().then(t=>{t.quickNoteMode===`native`?Lt()&&!Rt()?Bt():e.openNative():e.isOpen()?e.close():e.open(o.current??void 0)})}},c.createElement(`span`,{className:`dsh-tw-dock-note-icon`,"aria-hidden":`true`},`📝`),c.createElement(`span`,{className:`dsh-tw-dock-note-label`},l)))}}function vb(){return function(e){let t=typeof e.sessionId==`string`&&e.sessionId.length>0?e.sessionId:void 0,[n,r]=c.useState([]),[i,a]=c.useState(``),[o,s]=c.useState(void 0),[l,u]=c.useState(!1);if(c.useEffect(()=>{if(t===void 0)return;let e=!0;return(async()=>{let[n,i]=await Promise.all([ve(),fetch(`${E}?session=${encodeURIComponent(t)}`,{signal:AbortSignal.timeout(8e3)}).then(e=>e.ok?e.json():null).catch(()=>null)]);if(!e)return;let o=(n?.wikis??[]).filter(e=>e.agentVisible);r(o.map(e=>({id:e.id,label:e.label,running:e.running}))),a(typeof i?.scope==`string`?i.scope:``),s(typeof i?.reason==`string`?i.reason:void 0)})(),()=>{e=!1}},[t]),t===void 0||n.length<=1)return null;let d=e=>{u(!0),(async()=>{try{let n=await fetch(E,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({session:t,wiki:e.length>0?e:null}),signal:AbortSignal.timeout(12e4)}),r=await n.json().catch(()=>({}));if(!n.ok||r.ok!==!0){s(r.error??`切换失败(HTTP ${n.status})`);return}a(typeof r.scope==`string`?r.scope:e),s(typeof r.reason==`string`?r.reason:void 0)}catch(e){s(e instanceof Error?e.message:String(e))}finally{u(!1)}})()};return c.createElement(`div`,{className:`dsh-tw-scope-dock`},c.createElement(`span`,{className:`dsh-tw-scope-label`},`知识库`),c.createElement(`select`,{className:`dsh-tw-scope-select`,value:i,disabled:l,"aria-label":`本会话使用的知识库`,title:`本会话的 tiddlywiki_* 工具与注入提示词都作用于这个知识库(下一个模型步骤生效)`,onChange:e=>{d(e.target.value)}},c.createElement(`option`,{value:``},`默认库`),...n.map(e=>c.createElement(`option`,{key:e.id,value:e.id},`${e.label}${e.running?``:`(未运行,选中会启动)`}`))),o===void 0?null:c.createElement(`span`,{className:`dsh-tw-scope-note`},o))}}async function yb(e,t=15e3){try{let n=await fetch(_,{method:`POST`,headers:{"content-type":`application/json`,"x-requested-with":`TiddlyWiki`},body:JSON.stringify({title:e}),signal:AbortSignal.timeout(t)});if(!n.ok)return null;let r=await n.text();return r.trim().length>0?r:null}catch{return null}}function bb(){return lt()}async function xb(e){try{let t=await fetch(`${g}?title=${encodeURIComponent(e)}`,{signal:AbortSignal.timeout(8e3)});if(t.status===404)return`no`;if(!t.ok)return`unknown`;let n=await t.json().catch(()=>null);return n===null?`unknown`:n.notFound===!0?`no`:`yes`}catch{return`unknown`}}function Sb(e){let{sessionId:t,viewRequest:n,completeViewRequest:r}=e,[i,a]=c.useState(`loading`),[o,s]=c.useState(null),[l,u]=c.useState(null),[d,f]=c.useState(``),[p,m]=c.useState(!1),h=c.useRef(0),g=c.useRef(!0),_=c.useRef(0),v=c.useRef(0),y=c.useCallback(async e=>{let n=++h.current;if(!g.current)return;let r=e?.silent===!0;r||a(`loading`);let i=e=>{if(_.current++,r){m(!0);return}a(`error`),f(e)};if(typeof t!=`string`||t.length===0){a(`error`),f(`缺少会话 ID`);return}if(_.current>=3){if(r){m(!0);return}a(`error`),f(`连续 3 次生成失败,已停止自动重试,请点「🔄 刷新」`);return}try{let e=await fetch(C,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({session:t}),signal:AbortSignal.timeout(25e3)}),o=await e.json().catch(()=>null);if(!g.current||n!==h.current)return;if(!e.ok||o?.ok!==!0){i(o?.error??`HTTP ${e.status}`);return}if(typeof o.title!=`string`||o.title.length===0){i(`汇总生成失败:缺少标题`);return}u(o.title);let c=await yb(o.title);if(!g.current||n!==h.current)return;if(c===null){let e=await xb(o.title);if(!g.current||n!==h.current)return;if(e===`no`){if(_.current++,_.current<3){y();return}a(`error`),f(`汇总条目不存在,自动重建失败,请重试`);return}if(e===`unknown`){if(r){m(!0);return}a(`error`),f(`渲染失败:wiki 渲染服务不可用(host /render),条目状态未知`);return}i(`渲染失败:wiki 渲染服务不可用(host /render)`);return}_.current=0,v.current=Date.now(),m(!1),s(c),a(`ready`)}catch(e){if(!g.current||n!==h.current)return;i(e instanceof Error?e.message:String(e))}},[t]);c.useEffect(()=>(g.current=!0,_.current=0,v.current=Date.now(),m(!1),y(),()=>{g.current=!1}),[y]),c.useEffect(()=>{if(l===null)return;let e=!0,t=window.setInterval(()=>{(async()=>{if(!e||typeof document<`u`&&document.hidden)return;let t=await xb(l);if(e){if(t===`unknown`){m(!0);return}if(t===`no`){if(_.current++,_.current<3){y();return}a(`error`),f(`汇总条目已失效且自动重建多次失败,请点「🔄 刷新」重试`);return}if(Date.now()-v.current>18e4){y({silent:!0});return}_.current=0,m(!1)}})()},3e4);return()=>{e=!1,window.clearInterval(t)}},[l,y]),c.useEffect(()=>{n!=null&&r?.()},[n,r]);let b=()=>{_.current=0,y()},x;return x=i===`loading`?c.createElement(`div`,{className:`dsh-tw-summary-state`},c.createElement(`div`,{className:`dsh-tw-summary-state-spin`},`⏳`),c.createElement(`div`,null,`正在生成会话 wiki 汇总…`)):i===`error`?c.createElement(`div`,{className:`dsh-tw-summary-state`},c.createElement(`div`,{className:`dsh-tw-summary-state-title`},`知识库汇总暂不可用`),c.createElement(`div`,{className:`dsh-tw-summary-state-detail`},d),c.createElement(`button`,{type:`button`,className:`dsh-tw-summary-btn`,onClick:b},`重试`)):c.createElement(`div`,{className:`dsh-tw-summary-native dsh-tw-toolcard-native`},p?c.createElement(`div`,{className:`dsh-tw-summary-state-detail`},`⚠️ 未能确认最新状态(wiki 查询或刷新失败),以下是上次生成的内容`):null,c.createElement(`div`,{dangerouslySetInnerHTML:{__html:o??``}})),c.createElement(`div`,{className:`dsh-tw-summary`,"data-dsh-tw-summary":`true`},c.createElement(`div`,{className:`dsh-tw-summary-bar`},c.createElement(`span`,{className:`dsh-tw-summary-bar-title`},`📚 本会话知识库`),c.createElement(`span`,{className:`dsh-tw-summary-bar-hint`},`产生 / 读取 / 检索过的笔记(含子代理)`),c.createElement(`span`,{className:`dsh-tw-summary-bar-spacer`}),c.createElement(`button`,{type:`button`,className:`dsh-tw-summary-btn`,onClick:b,disabled:i===`loading`,title:`重新生成并刷新汇总`},`🔄 刷新`)),x)}function Cb(e,t){if(!(e===void 0||t.showSessionTab===!1))return ct(t.tabLabel),e.inject(`conversation.view`,()=>e.register({name:`conversation.view`,id:`dsh-tiddlywiki-summary`,order:20,label:bb},Sb))}function $(e,t,n){let r=document.createElement(e);return t!==void 0&&(r.className=t),n!==void 0&&(r.textContent=n),r}function wb(e){let t=$(`div`,`dsh-tw-settings-banner`);return t.dataset.tone=`error`,t.setAttribute(`style`,`border:1px solid #c0392b;background:#fdecea;color:#8c1c13;border-radius:6px;padding:10px 12px;margin:0 0 12px;font-size:12px;line-height:1.6;white-space:pre-wrap;`),t.textContent=e,t}async function Tb(e,t){let n=await fetch(e,{...t,signal:t?.signal??AbortSignal.timeout(15e3)}),r=await n.json().catch(()=>({}));if(!n.ok){let e=r.error??`HTTP ${n.status}`;throw Error(e)}return r}function Eb(e){let t=!1;e.classList.add(`dsh-tw-settings`);let n=$(`div`,`dsh-tw-settings-error`);n.hidden=!0;let r=$(`div`,`dsh-tw-settings-row dsh-tw-settings-status`),i=$(`div`,`dsh-tw-settings-body`);e.append(n,r,i);let a=[],o={},s={},c=!1,l=async()=>{c||i.replaceChildren($(`div`,`dsh-tw-settings-muted`,`加载中…`));try{let e=await Tb(Mb(re));if(t)return;c=!0,n.hidden=!0,n.replaceChildren(),Db(r,e,l),Ib(i,e,l,()=>t,o,s)}catch(e){if(t)return;c||i.replaceChildren($(`div`,`dsh-tw-settings-muted`,`配置尚未加载。`));let r=$(`button`,`dsh-tw-settings-btn`,`重试`);r.type=`button`,r.addEventListener(`click`,()=>{l()}),n.replaceChildren($(`span`,void 0,`加载配置失败:${e instanceof Error?e.message:String(e)} `),r),n.hidden=!1}};return l(),a.push(()=>{t=!0,e.replaceChildren(),e.classList.remove(`dsh-tw-settings`)}),()=>{for(let e of a.splice(0))e()}}function Db(e,t,n){e.replaceChildren();let r=t.server??{},i=r.status??`unknown`,a=$(`span`,`dsh-tw-settings-chip`,i);a.dataset.state=i;let o=$(`span`,`dsh-tw-settings-muted`,[r.url===void 0?``:`TW ${r.url}`,t.git?.branch===void 0?``:`git ${t.git.branch}`,t.git?.lastCommit===void 0?``:t.git.lastCommit,t.git?.conflict===void 0?t.git?.dirty===!0?`有未提交改动`:``:`⚠️ 冲突未解决(${t.git.conflict.files.length} 个文件,已阻止提交)`].filter(Boolean).join(` · `)),s=$(`button`,`dsh-tw-settings-btn`,`同步`);s.type=`button`,s.title=`git 同步(pull → commit → push)`,s.addEventListener(`click`,()=>{s.disabled=!0,s.textContent=`同步中…`,(async()=>{try{let e=await fetch(te,{method:`POST`,signal:AbortSignal.timeout(12e4)}),t=ge(await e.json().catch(()=>null),e.status);D(t.ok?`同步完成:${t.message}`:`同步失败:${t.message}`)}catch(e){D(`同步失败:${e instanceof Error?e.message:String(e)}`)}finally{s.disabled=!1,s.textContent=`同步`,n()}})()});let c=$(`button`,`dsh-tw-settings-btn`,`重启 TW`);c.type=`button`,c.addEventListener(`click`,()=>{c.disabled=!0,c.textContent=`重启中…`,(async()=>{try{await Tb(T,{method:`POST`,signal:AbortSignal.timeout(12e4)}),D(`TW 已重启`)}catch(e){D(`重启失败:${e instanceof Error?e.message:String(e)}`)}finally{c.disabled=!1,c.textContent=`重启 TW`,n()}})()}),e.append(a,o,s,c)}function Ob(e,t,n,r){let i=$(`section`,`dsh-tw-settings-section`);i.append($(`h3`,`dsh-tw-settings-h`,`常规配置`));let a=t.note??{},o=t.git??{},s=t.ui??{},c=[],l=(e,t,n)=>{let r=$(`input`,`dsh-tw-settings-input`);r.autocomplete=`off`,r.value=n;let a=$(`label`,`dsh-tw-settings-field`);a.append($(`span`,`dsh-tw-settings-label`,t),r),c.push({key:e,initial:n,read:()=>r.value.trim(),changed:()=>r.value.trim()!==n}),i.append(a)},u=(e,t,n)=>{let r=$(`input`,`dsh-tw-settings-input`);r.type=`password`,r.value=n,r.autocomplete=`off`;let a=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-chipbtn`,`👁`);a.type=`button`,a.title=`显示 / 隐藏`,a.setAttribute(`aria-label`,`显示 / 隐藏`),a.addEventListener(`click`,e=>{e.preventDefault();let t=r.type===`password`;r.type=t?`text`:`password`,a.textContent=t?`🙈`:`👁`});let o=$(`label`,`dsh-tw-settings-field`);o.append($(`span`,`dsh-tw-settings-label`,t),r,a),c.push({key:e,initial:n,read:()=>r.value.trim(),changed:()=>r.value.trim()!==n}),i.append(o)},d=(e,t,n)=>{let r=$(`input`,`dsh-tw-settings-check`);r.type=`checkbox`,r.checked=n;let a=$(`label`,`dsh-tw-settings-field dsh-tw-settings-field-check`);return a.append(r,$(`span`,`dsh-tw-settings-label`,t)),c.push({key:e,initial:n,read:()=>r.checked,changed:()=>r.checked!==n}),i.append(a),r},f=(e,t,n,r)=>{let a=$(`input`,`dsh-tw-settings-input`);a.type=`number`,a.value=String(n),r?.min!==void 0&&(a.min=String(r.min)),r?.max!==void 0&&(a.max=String(r.max)),r?.step!==void 0&&(a.step=String(r.step));let o=$(`div`,`dsh-tw-settings-error`);o.hidden=!0;let s=()=>{let e=a.value.trim();if(e.length===0)return`不能为空`;let t=Number(e);if(!Number.isFinite(t))return`请输入数字`;if(r?.integer===!0&&!Number.isInteger(t))return`必须是整数`;if(r?.min!==void 0&&t<r.min)return`不能小于 ${r.min}`;if(r?.max!==void 0&&t>r.max)return`不能大于 ${r.max}`},l=()=>{let e=s();o.textContent=e===void 0?``:`⚠️ ${e}(保存会被拒绝)`,o.hidden=e===void 0,e===void 0?a.removeAttribute(`aria-invalid`):a.setAttribute(`aria-invalid`,`true`)};a.addEventListener(`input`,l);let u=()=>{let e=a.value.trim(),t=Number(e);return e.length===0||!Number.isFinite(t)?e:t},d=$(`label`,`dsh-tw-settings-field`);d.append($(`span`,`dsh-tw-settings-label`,t),a,o),c.push({key:e,initial:n,read:u,changed:()=>u()!==n,invalid:s}),l(),i.append(d)},p=(e,t,n,r)=>{let a=$(`select`,`dsh-tw-settings-input`);for(let e of r){let t=document.createElement(`option`);t.value=e.value,t.textContent=e.label,e.value===n&&(t.selected=!0),a.append(t)}let o=$(`label`,`dsh-tw-settings-field`);return o.append($(`span`,`dsh-tw-settings-label`,t),a),c.push({key:e,initial:n,read:()=>a.value,changed:()=>a.value!==n}),i.append(o),a},m=(e,t,n,r)=>{let a=$(`textarea`,`dsh-tw-settings-input dsh-tw-settings-area`);a.rows=r,a.value=n;let o=$(`label`,`dsh-tw-settings-field dsh-tw-settings-field-area`);return o.append($(`span`,`dsh-tw-settings-label`,t),a),c.push({key:e,initial:n,read:()=>a.value.trim(),changed:()=>a.value.trim()!==n}),i.append(o),a};l(`note.tag`,`快速笔记默认 tag`,typeof a.tag==`string`?a.tag:`inbox`),d(`note.workspaceMark`,`新建笔记自动标工作区(ws/<项目名> 标签 + workspace 字段,取自当前会话工作目录)`,a.workspaceMark!==!1),d(`git.autoCommit`,`自动 commit(防抖)`,o.autoCommit!==!1),f(`git.debounceMs`,`自动 commit 防抖(ms;范围 0–3600000)`,typeof o.debounceMs==`number`?o.debounceMs:6e4,{min:0,max:36e5,step:1e3,integer:!0}),l(`git.remote`,`git 远端(空=仅本地;保存后即时生效,但**清空不会删除已配置的 origin**,需要时请用 git 命令处理)`,typeof o.remote==`string`?o.remote:``),l(`git.branch`,`git 分支(**只在仓库首次初始化时生效**;已有仓库请用 git 命令改分支——上面的状态行显示的是真实分支)`,typeof o.branch==`string`?o.branch:`main`);let h=t.startup??{};f(`startup.readyTimeoutMs`,`TW 启动就绪等待(ms;默认 60000,范围 5000–600000,超时上限为其 3 倍,对下次启动/重启生效)`,typeof h.readyTimeoutMs==`number`&&h.readyTimeoutMs>0?h.readyTimeoutMs:6e4,{min:5e3,max:6e5,step:1e3}),d(`ui.showQuickNote`,`显示「知识库」按钮里的「快速笔记」入口`,s.showQuickNote!==!1),d(`ui.showQuickNoteDock`,`显示聊天输入框上方的「快速笔记」快捷按钮`,s.showQuickNoteDock!==!1),p(`ui.quickNoteMode`,`点击「快速笔记」的打开方式`,typeof s.quickNoteMode==`string`&&s.quickNoteMode===`card`?`card`:`native`,[{value:`native`,label:`原生编辑器:直接弹出 TW 原生编辑页(新建/恢复草稿)`},{value:`card`,label:`Markdown 卡片:弹出现有快速笔记卡片(CodeMirror 编辑器)`}]),l(`ui.sidebarLabel`,`侧边栏 TW 入口显示名称`,typeof s.sidebarLabel==`string`&&s.sidebarLabel.trim().length>0?s.sidebarLabel.trim():`TiddlyWiki`),d(`ui.showPanelStatus`,`显示「知识库」按钮里的 TW 面板/重载入口与状态行`,s.showPanelStatus!==!1),d(`ui.showSyncButton`,`显示「知识库」按钮里的「同步」入口与 git 状态点`,s.showSyncButton!==!1),d(`ui.followDshTheme`,`嵌入式 TW 跟随 DSH 深浅主题(暗色时自动切深色 palette,不写回 wiki)`,s.followDshTheme!==!1),l(`ui.darkPalette`,`暗色时 TW palette(tiddler 标题)`,typeof s.darkPalette==`string`&&s.darkPalette.trim().length>0?s.darkPalette.trim():`$:/palettes/CupertinoDark`),l(`ui.tabLabel`,`会话顶部「知识库」Tab 名称`,typeof s.tabLabel==`string`&&s.tabLabel.trim().length>0?s.tabLabel.trim():`知识库`),d(`ui.showSessionTab`,`显示会话顶部「知识库」Tab(本会话相关 wiki 笔记汇总)`,s.showSessionTab!==!1),d(`ui.showRightbarTab`,`在 DSH 右侧边栏提供 TiddlyWiki 入口/Tab(与聊天并排)`,s.showRightbarTab!==!1);let g=s.sendToAgent??{};d(`ui.sendToAgent.enabled`,`启用「发送给 Agent」(TW 笔记 → DSH 会话注入)`,g.enabled!==!1),l(`ui.sendToAgent.endpoint`,`TW 端请求基址(空=自动取当前 DSH origin)`,typeof g.endpoint==`string`?g.endpoint:``),u(`ui.sendToAgent.token`,`共享 token(非空时路由校验 x-send-to-agent-token 头;已设置时显示为 ********,原样保存=不改,清空=删除)`,typeof g.token==`string`?g.token:``);let _=s.allArticles??{};f(`ui.allArticles.pageSize`,`「所有文章」每页条数(1–200)`,typeof _.pageSize==`number`?_.pageSize:10,{min:1,max:200,step:1,integer:!0}),i.append($(`h3`,`dsh-tw-settings-h`,`可选功能:微信公众号发布`)),i.append($(`div`,`dsh-tw-settings-muted`,`把 wiki 笔记一键发到公众号草稿箱(可选点发表)。**需要额外安装**:opencli 与 Browser Bridge 浏览器扩展,并让浏览器登录 mp.weixin.qq.com;adapter 在本仓库 tools/wechat/,安装与排错见 docs/wechat-publish-setup.md。不安装/不开启它,插件其他功能完全不受影响。开启后:注入提示词会多一条「发布前先读发布元数据规范」的约定,并在启动时把「发布元数据规范」与「微信公众号发布指南」(安装/换机还原步骤,等于仓库 docs/wechat-publish-setup.md)两篇文档写进 wiki(同名不覆盖)。`));let v=t.wechat??{},y=d(`wechat.enabled`,`启用微信公众号发布(默认关;需先按 docs/wechat-publish-setup.md 安装 opencli + 浏览器扩展)`,v.enabled===!0);l(`wechat.command`,`opencli 命令(默认 opencli;用别名或绝对路径时填这里。仅在启用微信发布时生效)`,typeof v.command==`string`&&v.command.trim().length>0?v.command.trim():`opencli`),p(`wechat.adapter`,`发布适配器(仅在启用微信发布时生效)`,v.adapter===`publish-note-imgs`?`publish-note-imgs`:`publish-note`,[{value:`publish-note`,label:`publish-note(默认):图文排版,封面单图`},{value:`publish-note-imgs`,label:`publish-note-imgs:正文内嵌图全部上传 CDN(需先重跑 install-wechat-adapters.mjs)`}]),u(`wechat.token`,`发布 token(非空时 /wechat/* 校验 x-wechat-publish-token 头,强烈建议设置,否则任何能打开本页的人都能替你发文;已设置时显示为 ********,原样保存=不改,清空=删除。仅在启用微信发布时生效)`,typeof v.token==`string`?v.token:``),l(`wechat.dsn`,`渲染基址 dsn(adapter 回连 DSH 用,形如 http://127.0.0.1:<端口>/dsh-tiddlywiki;留空=按请求自动推导。仅在启用微信发布时生效)`,typeof v.dsn==`string`?v.dsn:``);let b=t.prompt??{};i.append($(`h3`,`dsh-tw-settings-h`,`系统提示词(注入每个会话)`)),i.append($(`div`,`dsh-tw-settings-muted`,`插件把自己的约定(同步纪律 / 标签约定 / 链接格式等)注入每个会话的系统提示词。保存后**无需重启 dsh web**:section 会即时重新注册,当前会话从下一步起就使用新文本。`));let x=d(`prompt.enabled`,`注入 TiddlyWiki 提示词(关闭后本插件不再注入任何文本)`,b.enabled!==!1),S=p(`prompt.mode`,`内置文本形态`,b.mode===`full`?`full`:`slim`,[{value:`slim`,label:`精简(默认):只保留工具 schema 表达不了的约定`},{value:`full`,label:`完整:额外附一份由工具注册表实时生成的参数索引`}]),ee=m(`prompt.extra`,`附加说明(永远追加在末尾,可放团队/个人规范)`,typeof b.extra==`string`?b.extra:``,5),te=m(`prompt.override`,`整段替换(非空时取代上面的内置文本,附加说明仍会追加)`,typeof b.override==`string`?b.override:``,8),ne=()=>c.some(e=>(e.key.startsWith(`prompt.`)||e.key===`wechat.enabled`)&&e.changed()),C=$(`button`,`dsh-tw-settings-btn`,`预览注入文本(按表单当前值)`);C.type=`button`,C.title=`按表单当前值渲染注入文本(不用先保存);点「保存配置」后这就是实际注入的内容`;let re=$(`pre`,`dsh-tw-settings-prompt-preview`);re.hidden=!0,C.addEventListener(`click`,()=>{if(!re.hidden){re.hidden=!0,re.textContent=``;return}C.disabled=!0,(async()=>{try{let e=await Tb(Mb(ie),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({enabled:x.checked,mode:S.value,extra:ee.value,override:te.value,wechat:y.checked})});if(e.ok!==!0)throw Error(e.error??`获取失败`);re.textContent=e.enabled===!1?`(已关闭:不会注入任何提示词)`:`# 形态 ${e.mode??``} · ${e.length??0} 字符${ne()?`(含未保存的修改,保存后才真正注入)`:``}\n\n${e.text??``}`,re.hidden=!1}catch(e){D(`读取提示词失败:${e instanceof Error?e.message:String(e)}`)}finally{C.disabled=!1}})()}),i.append(C,re);let w=t.bridge??{};d(`bridge.enabled`,`启用「本地剪藏桥」(书签小工具后端监听 127.0.0.1 端口,保存后立即生效)`,w.enabled===!0),f(`bridge.port`,`剪藏桥端口(整数 1–65535;改端口需重启 dsh web 生效)`,typeof w.port==`number`&&w.port>0?w.port:8618,{min:1,max:65535,step:1,integer:!0}),u(`bridge.token`,`剪藏桥 token(非空时校验书签的 x-clip-token 头;强烈建议设置。已设置时显示为 ********,原样保存=不改,清空=删除)`,typeof w.token==`string`?w.token:``),l(`bridge.tag`,`剪藏笔记默认 tag`,typeof w.tag==`string`&&w.tag.trim().length>0?w.tag.trim():`clip`);let T=wb(r.saveError??``);T.hidden=r.saveError===void 0;let oe=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`保存配置`);oe.type=`button`,oe.addEventListener(`click`,()=>{oe.disabled=!0,(async()=>{let e=c.filter(e=>e.invalid?.()!==void 0);if(e.length>0){D(`有 ${e.length} 个字段填得不对(见字段旁的红色提示),未保存`),oe.disabled=!1;return}let t={};for(let e of c){if(!e.changed())continue;let n=e.key.split(`.`),r=t;for(let t=0;t<n.length;t++){let i=n[t];if(i===void 0)break;if(t===n.length-1)r[i]=e.read();else{let e=r[i]??{};r[i]=e,r=e}}}if(Object.keys(t).length===0){D(`没有改动`),oe.disabled=!1;return}try{await Tb(Mb(ae),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(t)}),we(),r.saveError=void 0,T.hidden=!0,T.textContent=``,D(`配置已保存`),n()}catch(e){r.saveError=`保存失败:${e instanceof Error?e.message:String(e)}`,T.textContent=r.saveError,T.hidden=!1,n()}finally{oe.disabled=!1}})()}),r.isDirty=()=>c.some(e=>e.changed()),i.append(T,oe),e.append(i)}function kb(e,t,n,r,i,a){let o=n?.plugins??[],s=n?.themes??[],c=n?.languages??[],l=t?.plugins??[],u=new Set(t?.themes??[]),d=t?.languages??[],f=()=>a.plugins??new Set(l),p=()=>a.themes??new Set(u),m=()=>a.languages??new Set(d),h=new Set(r?.disabled??[]),g=new Set((r?.wikiPlugins??[]).map(e=>e.title)),_=$(`section`,`dsh-tw-settings-section`);_.append($(`h3`,`dsh-tw-settings-h`,`插件管理(自带官方插件)`));let v=$(`div`,`dsh-tw-settings-muted`,`勾选 = 写入 tiddlywiki.info 的启动安装清单(离线、与引擎版本配套),应用后重启 TW。这里只管引擎自带插件;在 TW 控制面板里安装/禁用/卸载的插件见下方「wiki 内插件」。`);_.append(v);let y=$(`input`,`dsh-tw-settings-input dsh-tw-settings-search`);y.placeholder=`搜索插件…`;let b=$(`div`,`dsh-tw-settings-list`),x=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`应用插件(重启 TW)`);x.type=`button`;let S=()=>{x.disabled=a.plugins===void 0},ee=e=>{b.replaceChildren();let t=e.toLowerCase();for(let e of o){if(t.length>0&&!`${e.label} ${e.name} ${e.description}`.toLowerCase().includes(t))continue;let n=$(`input`,`dsh-tw-settings-check`);n.type=`checkbox`,n.checked=f().has(e.name),n.addEventListener(`change`,()=>{let t=f();n.checked?t.add(e.name):t.delete(e.name),a.plugins=t,S()});let i=$(`label`,`dsh-tw-settings-row dsh-tw-settings-plugin`),o=$(`span`,`dsh-tw-settings-name`,e.label);o.title=e.name;let s=$(`span`,`dsh-tw-settings-muted`,e.description||e.name);if(i.append(n,o),r!=null&&h.has(e.title)){let e=$(`span`,`dsh-tw-settings-chip`,`TW 内已禁用`);e.dataset.state=`disabled`,e.title=`该插件在 tiddlywiki.info 里,但已在 TW 控制面板被禁用($:/config/Plugins/Disabled)——去 TW 面板重新启用`,i.append(e)}else if(r!=null&&!l.includes(e.name)&&g.has(e.title)){let e=$(`span`,`dsh-tw-settings-chip`,`wiki 内已装`);e.dataset.state=`update`,e.title=`不在启动清单,但 wiki 里存在同名插件 tiddler(经 TW 原生安装),TW 运行时已在用`,i.append(e)}i.append(s),b.append(i)}};if(y.addEventListener(`input`,()=>ee(y.value)),x.addEventListener(`click`,()=>{a.plugins!==void 0&&(x.disabled=!0,(async()=>{try{await Tb(w,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({plugins:[...f()]})}),a.plugins=void 0,D(`插件已应用,TW 已重启`),i()}catch(e){D(`应用失败:${e instanceof Error?e.message:String(e)}`),S()}})())}),ee(``),S(),_.append(y,b,x),e.append(_),r!=null){let t=new Set(o.map(e=>e.title)),n=(r.wikiPlugins??[]).filter(e=>!t.has(e.title)||h.has(e.title));if(n.length>0){let t=$(`section`,`dsh-tw-settings-section`);t.append($(`h3`,`dsh-tw-settings-h`,`wiki 内插件(经 TW 原生安装,只读)`)),t.append($(`div`,`dsh-tw-settings-muted`,`下列插件以 tiddler 形式随 wiki 文件保存(TW 控制面板 → 插件 安装/导入),不受上面勾选影响。启用 / 禁用 / 卸载请到 TW 控制面板操作。`));let r=$(`div`,`dsh-tw-settings-list`);for(let e of n){let t=$(`div`,`dsh-tw-settings-row dsh-tw-settings-plugin`),n=$(`span`,`dsh-tw-settings-name`,e.name||e.title);if(n.title=e.title,t.append(n),h.has(e.title)){let e=$(`span`,`dsh-tw-settings-chip`,`已禁用`);e.dataset.state=`disabled`,e.title=`该插件已在 TW 控制面板被禁用`,t.append(e)}else if(e.version){let n=$(`span`,`dsh-tw-settings-chip`,`v${e.version}`);n.dataset.state=`ok`,t.append(n)}let i=$(`span`,`dsh-tw-settings-muted`,e.description||e.title);i.title=e.title,t.append(i),r.append(t)}t.append(r),e.append(t)}}let te=$(`section`,`dsh-tw-settings-section`);te.append($(`h3`,`dsh-tw-settings-h`,`主题管理(自带主题)`));let ne=$(`div`,`dsh-tw-settings-muted`,`「加载」= TW 里可用的主题(可多选,依赖链自动带上,如 heavier 会带 snowwhite+vanilla);「活动」= 当前视觉主题(单选,自动加入加载集)。应用后重启 TW。`),C=$(`div`,`dsh-tw-settings-row dsh-tw-settings-head`);C.append($(`span`,`dsh-tw-settings-col`,`加载`),$(`span`,`dsh-tw-settings-col`,`活动`),$(`span`,`dsh-tw-settings-name`,`主题`));let re=t?.themes??[],ie=t?.themeActive,ae=re[re.length-1],T=typeof ie==`string`&&s.some(e=>e.name===ie)?ie:ae??`tiddlywiki/vanilla`,oe=()=>a.themeActive??T,se=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`应用主题(重启 TW)`);se.type=`button`;let ce=()=>{se.disabled=a.themes===void 0&&a.themeActive===void 0},le=$(`div`,`dsh-tw-settings-list`);for(let e of s){let t=$(`input`,`dsh-tw-settings-check`);t.type=`checkbox`,t.checked=p().has(e.name),t.title=`加载该主题`,t.addEventListener(`change`,()=>{let n=p();t.checked?n.add(e.name):n.delete(e.name),a.themes=n,ce()});let n=$(`input`,`dsh-tw-settings-check`);n.type=`radio`,n.name=`dsh-tw-active-theme`,n.checked=e.name===oe(),n.title=`设为活动主题`,n.addEventListener(`change`,()=>{n.checked&&(a.themeActive=e.name),ce()});let r=$(`span`,`dsh-tw-settings-name`,e.label);r.title=e.name;let i=$(`span`,`dsh-tw-settings-muted`,e.description||e.name),o=$(`div`,`dsh-tw-settings-row dsh-tw-settings-plugin`);o.append(t,n,r,i),le.append(o)}se.addEventListener(`click`,()=>{a.themes===void 0&&a.themeActive===void 0||(se.disabled=!0,(async()=>{try{await Tb(w,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({themes:[...p()],themeActive:oe()})}),a.themes=void 0,a.themeActive=void 0,D(`主题已应用,TW 已重启`),i()}catch(e){D(`应用失败:${e instanceof Error?e.message:String(e)}`),ce()}})())}),ce(),te.append(ne,C,le,se),e.append(te);let ue=$(`section`,`dsh-tw-settings-section`);ue.append($(`h3`,`dsh-tw-settings-h`,`语言管理(自带官方语言包)`));let de=$(`div`,`dsh-tw-settings-muted`,`勾选启用语言插件并重启 TW;如中文请选 zh-Hans(简体)或 zh-CN。`),fe=$(`div`,`dsh-tw-settings-list`),E=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`应用语言(重启 TW)`);E.type=`button`;let pe=()=>{E.disabled=a.languages===void 0};for(let e of c){let t=$(`input`,`dsh-tw-settings-check`);t.type=`checkbox`,t.checked=m().has(e.name),t.addEventListener(`change`,()=>{let n=m();t.checked?n.add(e.name):n.delete(e.name),a.languages=n,pe()});let n=$(`label`,`dsh-tw-settings-row dsh-tw-settings-plugin`),r=$(`span`,`dsh-tw-settings-name`,e.label);r.title=e.name;let i=$(`span`,`dsh-tw-settings-muted`,e.description||e.name);n.append(t,r,i),fe.append(n)}E.addEventListener(`click`,()=>{a.languages!==void 0&&(E.disabled=!0,(async()=>{try{await Tb(w,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({languages:[...m()]})}),a.languages=void 0,D(`语言已应用,TW 已重启`),i()}catch(e){D(`应用失败:${e instanceof Error?e.message:String(e)}`),pe()}})())}),pe(),ue.append(de,fe,E),e.append(ue)}function Ab(e,t,n){let r=$(`section`,`dsh-tw-settings-section`);r.append($(`h3`,`dsh-tw-settings-h`,`知识库列表`));let i=$(`div`,`dsh-tw-settings-muted`,`读取中…`),a=$(`div`,`dsh-tw-settings-row`),o=$(`div`),s=$(`input`,`dsh-tw-settings-input`);s.placeholder=`根目录(绝对路径,如 D:\\notes)`;let c=$(`input`,`dsh-tw-settings-input`);c.placeholder=`文件夹名(如 books)`;let l=$(`input`,`dsh-tw-settings-input`);l.placeholder=`显示名(留空用文件夹名)`;let u=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`添加知识库`);u.type=`button`;let d=$(`div`,`dsh-tw-settings-row dsh-tw-settings-field`);d.append(s,c,l,u);let f=$(`div`,`dsh-tw-settings-muted`,`多库模式下每个知识库是一个独立的 TW 子进程(约 150MB):标了「开局自启」的随 DSH 一起起,其余在你打开或选中它时启动。对 Agent 隐身的库不进会话选择器,检索/工具也永远不碰它。`);r.append(i,a,o,d,f),e.append(r);let p=async(e,r)=>{i.textContent=r;try{let r=await Tb(fe,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(e),signal:AbortSignal.timeout(18e4)});if(t())return;let i=r.change?.errors??[];i.length>0&&D(`部分操作失败:${i.map(e=>`${e.id}:${e.message}`).join(`;`)}`),h(r),await n()}catch(e){if(t())return;D(`操作失败:${e instanceof Error?e.message:String(e)}`),await g()}},m=async(e,r,a)=>{i.textContent=a;try{let i=await Tb(e,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(r),signal:AbortSignal.timeout(18e4)});if(t())return;i.ok!==!0&&D(`失败:${i.error??`未知错误`}`),await g(),await n()}catch(e){if(t())return;D(`失败:${e instanceof Error?e.message:String(e)}`),await g()}},h=e=>{i.textContent=e.error!==void 0&&e.error.length>0?`⚠️ ${e.error}`:``,a.replaceChildren($(`span`,`dsh-tw-settings-label`,`运行模式:`));for(let[t,n]of[[`single`,`单库(只跑默认库)`],[`multi`,`多库(清单里的库都可用)`]]){let r=e.mode===t,i=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-chipbtn${r?` dsh-tw-settings-primary`:``}`,n);i.type=`button`,i.disabled=r,i.addEventListener(`click`,()=>{window.confirm(t===`multi`?`切换到多库模式:清单里标了「开局自启」的知识库都会启动(每个库一个 TW 子进程)。继续?`:`切换到单库模式:除默认库外的知识库会被停掉(内容与清单都不受影响)。继续?`)&&p({action:`set-mode`,mode:t},`切换模式中…`)}),a.append(i)}o.replaceChildren();let t=e.wikis??[];for(let r of t){let i=$(`div`,`dsh-tw-settings-kbrow`),a=r.id===e.defaultId;i.append($(`div`,`dsh-tw-settings-label`,`${a?`★ `:``}${r.label}(${r.id})`)),i.append($(`div`,`dsh-tw-settings-muted`,[r.running?`运行中`:`未运行`,r.agentVisible?`Agent 可见`:`Agent 隐身`,r.autostart?`开局自启`:`按需启动`,r.path].join(` · `)));let s=$(`div`,`dsh-tw-settings-row`),c=jb===r.id,l=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-chipbtn${c?` dsh-tw-settings-primary`:``}`,c?`正在配置`:`配置`);l.type=`button`,l.disabled=c,l.addEventListener(`click`,()=>{jb=r.id,n()});let u=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-chipbtn`,r.running?`停止`:`启动`);u.type=`button`,u.addEventListener(`click`,()=>{p({action:r.running?`stop`:`start`,id:r.id},r.running?`停止中…`:`启动中…`)});let d=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-chipbtn`,`设为默认`);d.type=`button`,d.disabled=a,d.addEventListener(`click`,()=>{p({action:`set-default`,id:r.id},`保存中…`)});let f=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-chipbtn`,r.agentVisible?`对 Agent 隐身`:`对 Agent 可见`);f.type=`button`,f.addEventListener(`click`,()=>{p({action:`update`,wiki:{...r,agentVisible:!r.agentVisible}},`保存中…`)});let h=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-chipbtn`,r.autostart?`取消开局自启`:`开局自启`);h.type=`button`,h.addEventListener(`click`,()=>{p({action:`update`,wiki:{...r,autostart:!r.autostart}},`保存中…`)});let g=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-chipbtn`,`移出列表`);if(g.type=`button`,g.disabled=t.length<=1,g.addEventListener(`click`,()=>{window.confirm(`把「${r.label}」移出清单?\n\n**目录与内容不会被删除**(仍在 ${r.path}),只是插件不再管理它。`)&&p({action:`remove`,id:r.id},`移出中…`)}),e.mode===`multi`){let e=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-chipbtn`,`改目录`);e.type=`button`,e.addEventListener(`click`,()=>{let e=window.prompt(`把「${r.label}」的根目录换成?\n\n当前:${r.root}`,r.root);if(e===null)return;if(e.trim().length===0){D(`根目录不能为空`);return}let t=window.prompt(`文件夹名(当前:${r.name};填 . 表示直接用上面这个根目录)`,r.name);if(t===null)return;let n={root:e.trim(),name:t.trim().length>0?t.trim():r.name};a?m(ue,n,`搬动中(会停/起这个库)…`):p({action:`update`,wiki:{...r,...n}},`保存中…`)}),s.append(e)}s.append(l,u,d,f,h,g),i.append(s),o.append(i)}s.value.length===0&&typeof t[0]?.root==`string`&&(s.value=t[0].root)};u.addEventListener(`click`,()=>{let e=s.value.trim(),t=c.value.trim();if(e.length===0||t.length===0){D(`请填写根目录与文件夹名`);return}let n={root:e,name:t},r=l.value.trim();r.length>0&&(n.label=r),p({action:`add`,wiki:n},`添加中(新库需要初始化与冷启动,请稍候)…`)});let g=async()=>{if(!t())try{let e=await Tb(fe);if(t())return;h(e)}catch(e){if(t())return;i.textContent=`读取知识库列表失败:${e instanceof Error?e.message:String(e)}`}};g()}let jb;function Mb(e){return jb===void 0?e:`${e}?wiki=${encodeURIComponent(jb)}`}function Nb(e,t,n){(async()=>{try{let e=await Tb(fe);if(t()||e.mode===`multi`)return}catch{}t()||Pb(e,t,n)})()}function Pb(e,t,n){let r=$(`section`,`dsh-tw-settings-section`);r.append($(`h3`,`dsh-tw-settings-h`,`知识库位置(可切换)`));let i=$(`div`,`dsh-tw-settings-muted`,`读取中…`),a=$(`div`,`dsh-tw-settings-muted`),o=$(`div`,`dsh-tw-settings-muted`),s=$(`div`,`dsh-tw-settings-muted`),c=$(`input`,`dsh-tw-settings-input`),l=$(`input`,`dsh-tw-settings-input`);c.placeholder=`绝对路径,如 D:\\notes 或 $DSH_HOME/tiddlywiki`,l.placeholder=`文件夹名(默认 main;填 . 表示直接用上面这个目录)`;let u=$(`label`,`dsh-tw-settings-field`);u.append($(`span`,`dsh-tw-settings-label`,`根目录(wikiRoot)`),c);let d=$(`label`,`dsh-tw-settings-field`);d.append($(`span`,`dsh-tw-settings-label`,`文件夹名(wiki)`),l);let f=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`切换到这个位置`);f.type=`button`;let p=$(`button`,`dsh-tw-settings-btn`,`恢复为配置默认`);p.type=`button`;let m=$(`div`,`dsh-tw-settings-row`);m.append(f,p);let h=$(`div`,`dsh-tw-settings-row dsh-tw-settings-candidates`),g=$(`div`,`dsh-tw-settings-muted`,"切换会停掉并就地重启 TW 子进程(几秒);新目录若还没有 tiddlywiki.info,插件会自动 `--init server` 初始化一个全新知识库。选中的位置会记在 $DSH_HOME 下的指针文件里(不进 wiki),可用「恢复为配置默认」清除。"),_=(e,t)=>{f.disabled=e,p.disabled=e,f.textContent=e?t:`切换到这个位置`},v=async()=>{if(!t())try{let e=await Tb(le);if(t())return;if(e.ok!==!0)throw Error(e.error??`获取失败`);let n=e.current??{};i.textContent=`当前:${n.path??`(未知)`}`;let r=n.source===`state`?`来源:指针文件(在设置页切换过)`:n.source===`config`?`来源:cordis 配置(config.wikiRoot / config.wiki)`:`来源:默认值($DSH_HOME/tiddlywiki + main)`;a.textContent=`${r} · 配置默认:${e.default?.path??`(未知)`}`,o.textContent=e.stateFile===void 0?``:`指针文件:${e.stateFile}(不存在=使用配置默认)`,s.textContent=e.error===void 0?``:`⚠️ ${e.error}`,c.value.length===0&&typeof n.root==`string`&&(c.value=n.root),l.value.length===0&&typeof n.name==`string`&&(l.value=n.name),h.replaceChildren();let u=e.candidates??[];if(u.length>0){h.append($(`span`,`dsh-tw-settings-label`,`同目录下可选的 wiki:`));for(let e of u){let t=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-chipbtn`,e===`.`?`(根目录本身)`:e);t.type=`button`,t.title=`填入文件夹名「${e}」`,t.addEventListener(`click`,()=>{l.value=e}),h.append(t)}}}catch(e){if(t())return;i.textContent=`读取位置失败:${e instanceof Error?e.message:String(e)}`}};f.addEventListener(`click`,()=>{let e=c.value.trim(),t=l.value.trim().length>0?l.value.trim():`main`;if(e.length===0){D(`请先填写根目录(绝对路径)`);return}window.confirm(`切换知识库到:\n${e}\\${t}\n\n会停止并重启 TW 子进程;当前对话/工具随后读写的是新知识库。确定继续?`)&&(_(!0,`切换中…(重启 TW)`),(async()=>{try{let r=await Tb(ue,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({root:e,name:t}),signal:AbortSignal.timeout(12e4)});r.warning===void 0?D(`已切换到 ${r.path??``}`):D(`已切换到 ${r.path??``}(注意:${r.warning})`),we(),await v(),await n()}catch(e){D(`切换失败:${e instanceof Error?e.message:String(e)}`),await v()}finally{_(!1,``)}})())}),p.addEventListener(`click`,()=>{window.confirm(`恢复为配置默认位置?会删除位置指针文件,并(必要时)切回配置里的知识库。`)&&(_(!0,`切换中…(重启 TW)`),(async()=>{try{let e=await Tb(de,{method:`POST`,headers:{"content-type":`application/json`},body:`{}`,signal:AbortSignal.timeout(12e4)});D(e.warning===void 0?`已恢复为配置默认:${e.path??``}`:`已恢复默认(注意:${e.warning})`),we(),await v(),await n()}catch(e){D(`恢复失败:${e instanceof Error?e.message:String(e)}`),await v()}finally{_(!1,``)}})())}),r.append(i,a,o,u,d,m,h,s,g),e.append(r),v()}function Fb(e,t){let n=$(`section`,`dsh-tw-settings-section`);n.append($(`h3`,`dsh-tw-settings-h`,`初始化(一次性预置)`));let r=$(`div`,`dsh-tw-settings-muted`,`这些是插件与 dsh 联动、需要在 wiki 里预置的 tiddler/配置。「发送给 Agent 按钮」和「TW 前端 API 基址」是功能必需项,启动时自动写入(只写缺失,不覆盖你的改动);其余为可选项,默认不自动写入、也不会强绑定——需要时点「重新初始化」写入,不想要了可随时「反初始化」移除。`),i=$(`div`,`dsh-tw-settings-list`),a=$(`div`,`dsh-tw-settings-muted`),o=async()=>{if(!t())try{let e=await Tb(oe);if(t())return;if(e.ok!==!0||!Array.isArray(e.items))throw Error(e.error??`获取失败`);i.replaceChildren();let n=0,r=0;for(let t of e.items){t.present&&(n+=1),t.removable&&(r+=1);let e=$(`span`,`dsh-tw-settings-chip`,t.present?`✓`:`✗`);e.dataset.state=t.present?`ok`:`missing`,e.title=t.present?`已存在`:`缺失`;let a=$(`span`,`dsh-tw-settings-name`,t.title);a.title=t.id;let s=$(`span`,`dsh-tw-settings-muted`,t.detail??t.description),c=t.updateAvailable===!0?$(`span`,`dsh-tw-settings-chip`,`⬆ 有更新`):void 0;c!==void 0&&(c.dataset.state=`update`,c.title=`内置内容在本 wiki 预置之后更新过,可点「重新初始化」取用`);let l=t.userModified===!0?$(`span`,`dsh-tw-settings-chip`,`✏️ 本地已修改`):void 0;l!==void 0&&(l.dataset.state=`missing`,l.title=`这篇是你的内容:重新初始化会覆盖它`);let u=$(`button`,`dsh-tw-settings-btn`,t.updateAvailable===!0?`更新到内置版本`:`重新初始化`);u.type=`button`,u.title=`强制重写「${t.title}」的内置内容(会覆盖当前 tiddler)`,u.addEventListener(`click`,()=>{if(t.updateAvailable===!0){let e=t.userModified===!0?`「${t.title}」有你的本地修改,更新会覆盖它。`:t.userModified===void 0?`无法确认「${t.title}」是否被你编辑过(旧格式标记),更新可能覆盖你的改动。`:``;if(!window.confirm(`${e}${e.length>0?`
|
|
810
810
|
|
|
811
|
-
`:``}用内置版本覆盖?`))return}u.disabled=!0,u.textContent=`执行中…`,(async()=>{try{let e=await fetch(
|
|
812
|
-
`):``}function Hb(e){return typeof e==`string`?e:``}async function Ub(e){try{let t=await fetch(e,{signal:AbortSignal.timeout(1e4)});if(t.status===404){let e=await t.json().catch(()=>null);return typeof e==`object`&&e?e:{notFound:!0}}if(!t.ok)return null;let n=await t.json();return typeof n==`object`&&n?n:null}catch{return null}}async function Wb(e){return yb(e,1e4)}function Gb(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 Kb(e){return t=>{t.defaultPrevented||t.button!==0||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||(t.preventDefault(),t.stopPropagation(),Et(e))}}function qb(e){let t=Lb[e.toolName]??e.toolName,n=c.createElement(`div`,{className:`dsh-tw-toolcard-head`},c.createElement(`span`,{className:`dsh-tw-toolcard-badge`},t),e.title!==void 0&&e.title.length>0?c.createElement(`span`,{className:`dsh-tw-toolcard-title`,title:e.title},e.title):null,e.onOpen===void 0?null:c.createElement(`button`,{type:`button`,className:`dsh-tw-toolcard-open`,onClick:e.onOpen},`在 TW 打开`)),r=e.subtitle!==void 0||e.tags!==void 0&&e.tags.length>0?c.createElement(`div`,{className:`dsh-tw-toolcard-meta`},e.subtitle===void 0?null:c.createElement(`span`,{className:`dsh-tw-toolcard-sub`},e.subtitle),e.tags!==void 0&&e.tags.length>0?c.createElement(`span`,{className:`dsh-tw-toolcard-tags`},...e.tags.map((e,t)=>c.createElement(`span`,{className:`dsh-tw-toolcard-tag`,key:`${t}-${e}`},e))):null):null;return c.createElement(`div`,{className:`dsh-tw-toolcard`},n,r,c.createElement(`div`,{className:`dsh-tw-toolcard-body`},e.children),e.foot!==void 0&&e.foot!==null?c.createElement(`div`,{className:`dsh-tw-toolcard-foot`},e.foot):null)}const Jb=new Map;function Yb(e){let t=Jb.get(e);if(t!==void 0){if(Date.now()-t.at>3e5){Jb.delete(e);return}return Jb.delete(e),Jb.set(e,t),t}}function Xb(e,t){for(Jb.delete(e),Jb.set(e,{at:Date.now(),...t});Jb.size>50;){let e=Jb.keys().next().value;if(e===void 0)break;Jb.delete(e)}}function Zb(e){e.length>0&&Jb.delete(e)}function Qb(e){let t=e.join(`\0`);c.useEffect(()=>{for(let e of t.split(`\0`))Zb(e)},[t])}function $b(e){let{title:t,fresh:n}=e,{loading:r,data:i}=Gb(async()=>{n===!0&&Zb(t);let e=Yb(t);if(e!==void 0)return{get:e.get,html:e.html};let[r,i]=await Promise.all([Ub(`${g}?title=${encodeURIComponent(t)}`),Wb(t)]);return typeof i==`string`&&i.length>0&&Xb(t,{get:r,html:i}),{get:r,html:i}},[t,n]),a=i?.get??null,o=i?.html??null,s;s=r?c.createElement(`div`,{className:`dsh-tw-toolcard-loading`},`渲染中…`):a!==null&&a.notFound===!0?c.createElement(`div`,{className:`dsh-tw-toolcard-empty`},`tiddler「${t}」不存在`):typeof o==`string`&&o.length>0?c.createElement(`div`,{className:`dsh-tw-toolcard-native`,dangerouslySetInnerHTML:{__html:o}}):a!==null&&typeof a.text==`string`&&a.text.length>0?c.createElement(`pre`,{className:`dsh-tw-toolcard-fallback`},a.text):c.createElement(`div`,{className:`dsh-tw-toolcard-empty`},`wiki 服务不可用`);let l=Array.isArray(a?.tags)?a.tags.filter(e=>typeof e==`string`):[],u=typeof a?.modified==`string`?a.modified:void 0;return c.createElement(qb,{toolName:e.toolName,title:t,subtitle:e.subtitle,tags:l,onOpen:Kb(t),foot:u===void 0?void 0:`修改于 ${u}`},s)}function ex(e){let t=c.createElement(`span`,{className:`dsh-tw-toolcard-row-head`},c.createElement(`span`,{className:`dsh-tw-toolcard-row-title`},e.title),e.tags!==void 0&&e.tags.length>0?c.createElement(`span`,{className:`dsh-tw-toolcard-row-tags`},e.tags.slice(0,4).join(` · `)):null,typeof e.modified==`string`&&e.modified.length>0?c.createElement(`span`,{className:`dsh-tw-toolcard-row-meta`},e.modified):null),n=typeof e.snippet==`string`&&e.snippet.trim().length>0?e.snippet:null;return c.createElement(`a`,{className:`dsh-tw-toolcard-row`,href:`${m}#${encodeURIComponent(e.title)}`,onClick:Kb(e.title),title:n===null?e.title:`${e.title}\n${n}`},t,n===null?null:c.createElement(`span`,{className:`dsh-tw-toolcard-row-snippet`},n))}function tx(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(ex,{key:`${e.title}-${t}`,...e}))),c.createElement(qb,{toolName:e.toolName,title:e.title,subtitle:e.subtitle},n)}function nx(e){let t=/工作区\s+(ws\/[^\s((]+)/.exec(e);if(t===null||t[1]===void 0)return null;let n=t[1].slice(3);return n.length>0?n:null}function rx(e){let t=Hb(e.args.query),n=new URLSearchParams;if(t.length>0&&n.set(`query`,t),Array.isArray(e.args.tags))for(let t of e.args.tags)typeof t==`string`&&t.length>0&&n.append(`tags`,t);typeof e.args.tag==`string`&&e.args.tag.length>0&&n.set(`tag`,e.args.tag),typeof e.args.since==`string`&&e.args.since.length>0&&n.set(`since`,e.args.since),typeof e.args.type==`string`&&e.args.type.length>0&&n.set(`type`,e.args.type),typeof e.args.field==`string`&&e.args.field.length>0&&n.set(`field`,e.args.field),typeof e.args.value==`string`&&e.args.value.length>0&&n.set(`value`,e.args.value),typeof e.args.limit==`number`&&n.set(`limit`,String(e.args.limit));let r=nx(e.text);r!==null&&n.set(`workspace`,r);let i=n.toString(),a=Gb(()=>Ub(`${S}?${i}`),[i]).data,o=(Array.isArray(a?.items)?a.items:[]).map(e=>({title:Hb(e.title),tags:Array.isArray(e.tags)?e.tags.filter(e=>typeof e==`string`):[],modified:typeof e.modified==`string`?e.modified:null,snippet:typeof e.snippet==`string`?e.snippet:``})),s=typeof a?.total==`number`?a.total:void 0,l=typeof a?.workspace==`string`&&a.workspace.length>0?a.workspace:null,u=``;l!==null&&a?.scope===`workspace`?u=` · 已在工作区 ws/${l} 内缩小范围`:l!==null&&a?.fellBack===!0&&(u=` · 工作区 ws/${l} 内 0 条,已扩大到全库`);let d=`关键词「${t||`(全部)`}」${s===void 0?``:` · 共 ${s} 条`}${u}`;return c.createElement(tx,{toolName:e.toolName,title:t.length>0?t:`检索`,subtitle:d,rows:o,fallbackText:`没有匹配的笔记`})}function ix(e){let t=e.title.length>0?c.createElement(`div`,{className:`dsh-tw-toolcard-empty`},`附件已保存进 wiki(二进制条目,卡片不内联渲染)。`):c.createElement(`div`,{className:`dsh-tw-toolcard-empty`},`附件已保存。`);return c.createElement(qb,{toolName:e.toolName,title:e.title.length>0?e.title:void 0,...e.title.length>0?{onOpen:Kb(e.title)}:{}},t)}function ax(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=Gb(()=>Ub(`${x}?${n}`),[n]).data,i=(Array.isArray(r?.items)?r.items:[]).map(e=>({title:Hb(e.title),tags:Array.isArray(e.tags)?e.tags.filter(e=>typeof e==`string`):[],modified:typeof e.modified==`string`?e.modified:null,snippet:typeof e.snippet==`string`?e.snippet:``}));return c.createElement(tx,{toolName:e.toolName,title:`最近修改`,subtitle:i.length>0?`最近 ${i.length} 条`:``,rows:i,fallbackText:`暂无笔记`})}function ox(e){let t=(Array.isArray(e.args.items)?e.args.items:[]).map(e=>typeof e==`object`&&e&&typeof e.title==`string`?Hb(e.title):null).filter(e=>e!==null&&e.length>0).map(e=>({title:e}));return Qb(t.map(e=>e.title)),c.createElement(tx,{toolName:e.toolName,title:`批量写入`,subtitle:t.length>0?`写入 ${t.length} 篇`:`(参数中没有可解析的 items)`,rows:t,fallbackText:`没有可展示的笔记`})}function sx(e){let t=Gb(()=>Ub(`${b}?limit=60&sort=count`),[]).data,n=(Array.isArray(t?.items)?t.items:[]).map(e=>({tag:Hb(e.tag),count:typeof e.count==`number`?e.count:0})),r=n.slice(0,60),i=typeof t?.total==`number`?t.total:n.length,a;return a=n.length===0?c.createElement(`div`,{className:`dsh-tw-toolcard-empty`},`暂无标签`):c.createElement(`div`,{className:`dsh-tw-toolcard-tags-wrap`},...r.map(e=>c.createElement(`span`,{className:`dsh-tw-toolcard-tag`,key:e.tag},`${e.tag} · ${e.count}`)),...i>r.length?[c.createElement(`span`,{className:`dsh-tw-toolcard-tag-more`,key:`__more`},`…另有 ${i-r.length} 个`)]:[]),c.createElement(qb,{toolName:e.toolName,title:`标签`,subtitle:`共 ${i} 个`},a)}function cx(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(qb,{toolName:e.toolName},t)}function lx(e){Qb([e.title]);let t=e.title.length>0?c.createElement(`div`,{className:`dsh-tw-toolcard-empty`},`已删除 tiddler「${e.title}」`):c.createElement(`pre`,{className:`dsh-tw-toolcard-fallback`},e.text||`(已删除)`);return c.createElement(qb,{toolName:e.toolName,title:e.title.length>0?e.title:void 0},t)}function ux(e,t){switch(e){case`tiddlywiki_get`:case`tiddlywiki_put`:case`tiddlywiki_append`:case`tiddlywiki_delete`:case`tiddlywiki_attach`:case`tiddlywiki_backlinks`:return Hb(t.title);case`tiddlywiki_rename`:return Hb(t.newTitle);case`tiddlywiki_search`:return Hb(t.query);default:return``}}function dx(e){let t=e.block,n=e.toolName,r=Rb(t),i=zb(t),a=n!==void 0&&n.length>0?n:i?.name??``,o=Bb(i?.argsRaw??``),s=r?Vb(t.content):``;if(i===null)return c.createElement(qb,{toolName:a},c.createElement(`pre`,{className:`dsh-tw-toolcard-fallback`},s||`(无调用信息)`));if(!r)return c.createElement(qb,{toolName:a,title:ux(a,o)},c.createElement(`div`,{className:`dsh-tw-toolcard-pending`},`处理中…`));if(t.isError===!0)return c.createElement(qb,{toolName:a,title:ux(a,o)},c.createElement(`div`,{className:`dsh-tw-toolcard-error`},s||`工具调用失败`));switch(a){case`tiddlywiki_get`:return c.createElement($b,{toolName:a,title:Hb(o.title),subtitle:`读取`});case`tiddlywiki_put`:return c.createElement($b,{toolName:a,title:Hb(o.title),subtitle:`已写入`,fresh:!0});case`tiddlywiki_append`:return c.createElement($b,{toolName:a,title:Hb(o.title),subtitle:`已增量写入`,fresh:!0});case`tiddlywiki_rename`:return c.createElement($b,{toolName:a,title:Hb(o.newTitle),subtitle:`已重命名「${Hb(o.oldTitle)}」→`,fresh:!0});case`tiddlywiki_delete`:return c.createElement(lx,{toolName:a,title:Hb(o.title),text:s});case`tiddlywiki_attach`:return c.createElement(ix,{toolName:a,title:Hb(o.title)});case`tiddlywiki_batch_put`:return c.createElement(ox,{toolName:a,args:o});case`tiddlywiki_search`:return c.createElement(rx,{toolName:a,args:o,text:s});case`tiddlywiki_recent`:return c.createElement(ax,{toolName:a,args:o});case`tiddlywiki_list_tags`:return c.createElement(sx,{toolName:a});case`tiddlywiki_git_sync`:case`tiddlywiki_git_resolve`:return c.createElement(cx,{toolName:a,text:s});default:return c.createElement(qb,{toolName:a,title:ux(a,o)},c.createElement(`pre`,{className:`dsh-tw-toolcard-fallback`},s||`(完成)`))}}const fx=[`tiddlywiki_get`,`tiddlywiki_search`,`tiddlywiki_recent`,`tiddlywiki_list_tags`,`tiddlywiki_put`,`tiddlywiki_batch_put`,`tiddlywiki_append`,`tiddlywiki_rename`,`tiddlywiki_delete`,`tiddlywiki_trash`,`tiddlywiki_backlinks`,`tiddlywiki_attach`,`tiddlywiki_lint`,`tiddlywiki_git_sync`,`tiddlywiki_git_resolve`];function px(e){let t=[];for(let n of fx)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}`},dx));r!==void 0&&t.push(r)}catch(e){console.error(`[dsh-tiddlywiki] register toolview ${n} failed:`,e)}return t}function mx(){let e=e=>{if(e.defaultPrevented||e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)return;let t=e.target;if(!(t instanceof Element))return;let n=t.closest(`a`);if(n===null)return;let r=n.getAttribute(`href`)??``,i=null;try{let e=new URL(r,window.location.origin);e.origin===window.location.origin&&e.pathname===m&&e.hash.length>1&&(i=e.hash.substring(1))}catch{}if(i!==null){e.preventDefault(),e.stopPropagation();try{i=decodeURIComponent(i)}catch{}Et(i)}};return document.addEventListener(`click`,e,!0),()=>document.removeEventListener(`click`,e,!0)}const hx=`dsh-tiddlywiki`,gx=`dsh-tiddlywiki/rightbar`;function _x(e){let{useTabInfo:t}=e,n=t().tab,r=c.useRef(null),i=c.useRef(null);c.useEffect(()=>{let e=r.current;if(e===null)return;let t=vt(e,n.signal);return i.current=t,()=>{t.dispose(),i.current=null}},[n.id,n.signal]),c.useEffect(()=>{i.current?.setVisible(n.visible)},[n.visible]);let a=n.visible,o=n.actions.close;return c.useEffect(()=>{if(!a)return;document.dispatchEvent(new CustomEvent(it,{detail:gx}));let e=e=>{e.detail!==gx&&o()};return document.addEventListener(it,e),()=>document.removeEventListener(it,e)},[a,o]),c.createElement(`div`,{ref:r,className:`dsh-tw-rightbar-tab`})}function vx(){return{id:hx,kind:`dsh-tiddlywiki`,title:()=>ct(),guide:[{order:10,title:()=>`TiddlyWiki 知识库`,description:()=>`在右侧边栏打开 TiddlyWiki 编辑器(与聊天并排)`,icon:ut}]}}function yx(e,t){let n=[];try{n.push(e.register(vx()));let r=t.inject(`sidebar.right.pane.tab`,()=>t.register({name:`sidebar.right.pane.tab`,key:hx},_x));r!==void 0&&n.push(r)}catch(e){for(let e of n.splice(0))e();console.error(`[dsh-tiddlywiki] rightbar tab mount failed:`,e);return}return gt(),()=>{for(let e of n.splice(0))e()}}const bx=[`slots`];function xx(e){try{let t=[],n=!1,r=()=>{n=!0;for(let e of t.splice(0))e()},i=(e,t)=>{try{t()}catch(t){console.error(`[dsh-tiddlywiki] ${e} failed:`,t)}};i(`styles`,()=>t.push(d()));let a=new f,o,s;if(i(`quick-note widget`,()=>{o=cb(),t.push(()=>o?.dispose())}),i(`sync controller`,()=>{s=fb(),t.push(()=>s?.dispose())}),i(`sidebar entry`,()=>t.push(ke(a))),i(`center panel`,()=>t.push(kt(a))),o!==void 0&&s!==void 0){let e=o,n=s;i(`knowledge FAB`,()=>t.push(gb(a,e,n)))}i(`editor popup`,()=>t.push(Vt)),i(`wiki scope dock`,()=>{let n=e.slots?.inject(`conversation.input.dock`,()=>e.slots?.register({name:`conversation.input.dock`,id:`wiki-scope`,order:4,label:`知识库作用域`},vb()));n!==void 0&&t.push(n)}),e.slots!==void 0&&we().then(r=>{if(n)return;let a=o;r.showQuickNoteDock&&a!==void 0&&i(`quick-note dock`,()=>{let n=e.slots?.inject(`conversation.input.dock`,()=>e.slots?.register({name:`conversation.input.dock`,id:`quick-note`,order:8,label:`快速笔记`},_b(a)));n!==void 0&&t.push(n)}),i(`session summary tab`,()=>{let n=Cb(e.slots,r);n!==void 0&&t.push(n)})}).catch(e=>{console.error(`[dsh-tiddlywiki] ui config load failed:`,e)}),i(`rightbar mount`,()=>{let r,i=a=>{let o=e.get?.(`sidebarRightTabs`);if(o===void 0){a<6&&!n&&(r=window.setTimeout(()=>i(a+1),500*(a+1)));return}we().then(r=>{if(n||!r.showRightbarTab)return;let i=yx(o,e.slots);i!==void 0&&t.push(i)}).catch(e=>{console.error(`[dsh-tiddlywiki] rightbar config load failed:`,e)})};t.push(()=>{r!==void 0&&window.clearTimeout(r)}),i(0)}),i(`tool views`,()=>{e.slots!==void 0&&t.push(...px(e.slots))}),i(`wiki link interceptor`,()=>t.push(mx())),i(`settings section`,()=>{let n=e.slots?.inject(`settings.section`,()=>e.slots?.register({name:`settings.section`,id:`dsh-tiddlywiki`,order:50,label:`TiddlyWiki 知识库`},Ib));n!==void 0&&t.push(n)}),e.effect===void 0?window.addEventListener(`pagehide`,r,{once:!0}):e.effect(()=>r,`dsh-tiddlywiki: client mount`)}catch(e){console.error(`[dsh-tiddlywiki] client half failed to start:`,e)}}exports.apply=xx,exports.inject=bx,exports.name=`dsh-tiddlywiki/client`;
|
|
811
|
+
`:``}用内置版本覆盖?`))return}u.disabled=!0,u.textContent=`执行中…`,(async()=>{try{let e=await fetch(se,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({id:t.id,force:!0}),signal:AbortSignal.timeout(3e4)}),n=await e.json().catch(()=>null);!e.ok||n?.ok!==!0?D(`重新初始化失败:${n?.error??n?.results?.[0]?.error??`HTTP ${e.status}`}`):D(`已重新初始化「${t.title}」`),o()}catch(e){D(`重新初始化失败:${e instanceof Error?e.message:String(e)}`)}finally{u.disabled=!1,u.textContent=t.updateAvailable===!0?`更新到内置版本`:`重新初始化`}})()});let d=$(`div`,`dsh-tw-settings-row dsh-tw-settings-plugin`);if(d.append(e,a),c!==void 0&&d.append(c),l!==void 0&&d.append(l),d.append(s,u),t.removable){let e=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-danger`,`反初始化`);e.type=`button`,e.title=`移除「${t.title}」写入的 tiddler 与 marker(恢复未初始化状态)`,e.addEventListener(`click`,()=>{window.confirm(`确定反初始化「${t.title}」?将删除它写入的 tiddler(含其一次性 marker),需要时可用「重新初始化」恢复。`)&&(e.disabled=!0,e.textContent=`移除中…`,(async()=>{try{let e=await fetch(ce,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({id:t.id}),signal:AbortSignal.timeout(3e4)}),n=await e.json().catch(()=>null);!e.ok||n?.ok!==!0?D(`反初始化失败:${n?.error??n?.results?.[0]?.error??`HTTP ${e.status}`}`):D(`已反初始化「${t.title}」`),o()}catch(e){D(`反初始化失败:${e instanceof Error?e.message:String(e)}`)}finally{e.disabled=!1,e.textContent=`反初始化`}})())}),d.append(e)}i.append(d)}a.textContent=`共 ${e.items.length} 项,${n} 项已就绪;可移除 ${r} 项`}catch(e){if(t())return;a.textContent=`加载初始化状态失败:${e instanceof Error?e.message:String(e)}`}},s=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`全部重新初始化`);s.type=`button`,s.title=`强制重写所有一次性预置内容(含可选 seed,会覆盖当前 tiddler/配置)`,s.addEventListener(`click`,()=>{s.disabled=!0,s.textContent=`执行中…`,(async()=>{try{let e=await fetch(se,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({force:!0}),signal:AbortSignal.timeout(6e4)}),t=await e.json().catch(()=>null);!e.ok||t?.ok!==!0?D(`重新初始化失败:${t?.error??`HTTP ${e.status}`}`):D(`全部已重新初始化`),o()}catch(e){D(`重新初始化失败:${e instanceof Error?e.message:String(e)}`)}finally{s.disabled=!1,s.textContent=`全部重新初始化`}})()});let c=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-danger`,`全部反初始化`);c.type=`button`,c.title=`移除所有可选 seed 写入的 tiddler 与 marker(功能必需项保留)`,c.addEventListener(`click`,()=>{window.confirm(`确定全部反初始化?将删除所有可选 seed 写入的 tiddler(含一次性 marker)。功能必需项(发送给 Agent 按钮 / TW 前端 API 基址)会保留。`)&&(c.disabled=!0,c.textContent=`移除中…`,(async()=>{try{let e=await fetch(ce,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({}),signal:AbortSignal.timeout(6e4)}),t=await e.json().catch(()=>null);!e.ok||t?.ok!==!0?D(`反初始化失败:${t?.error??`HTTP ${e.status}`}`):D(`全部可选 seed 已反初始化`),o()}catch(e){D(`反初始化失败:${e instanceof Error?e.message:String(e)}`)}finally{c.disabled=!1,c.textContent=`全部反初始化`}})())}),n.append(r,a,i,s,c),e.append(n),o()}function Ib(e,t,n,r,i,a){e.replaceChildren(),typeof t.configError==`string`&&t.configError.length>0&&e.append(wb(`⚠️ 配置未生效:${t.configError}`));let o=JSON.stringify(t.config??{}),s=i.host!==void 0&&i.signature!==o,c=i.isDirty?.()===!0;if(s&&c&&e.append(wb(`⚠️ 服务器上的配置在别处被改动过(另一个标签页保存 / 语言管理等),当前表单仍是旧值:直接点「保存配置」会以本页内容覆盖那些改动。`)),i.host===void 0||s&&!c){let e=$(`div`,`dsh-tw-settings-confighost`);Ob(e,t.config??{},n,i),i.host=e,i.signature=o}e.append($(`div`,`dsh-tw-settings-muted`,jb===void 0?`配置作用域:默认知识库(在「知识库列表」里点某行的「配置」可切到那个库)`:`配置作用域:${jb}(在「知识库列表」里改;编辑的是该库自己的配置 tiddler)`)),e.append(i.host),Ab(e,r,n),Nb(e,r,n),kb(e,t.info,t.catalog,t.runtimePlugins,n,a),Fb(e,r)}function Lb(){let e=c.useRef(null);return c.useEffect(()=>{let t=e.current;return t===null?void 0:Eb(t)},[]),c.createElement(`div`,{ref:e})}const Rb={tiddlywiki_get:`读取笔记`,tiddlywiki_search:`检索笔记`,tiddlywiki_recent:`最近修改`,tiddlywiki_list_tags:`标签列表`,tiddlywiki_put:`写入笔记`,tiddlywiki_batch_put:`批量写入`,tiddlywiki_append:`增量写入`,tiddlywiki_rename:`重命名笔记`,tiddlywiki_delete:`删除笔记`,tiddlywiki_trash:`回收站`,tiddlywiki_backlinks:`反向链接`,tiddlywiki_attach:`保存附件`,tiddlywiki_lint:`知识库体检`,tiddlywiki_git_sync:`git 同步`,tiddlywiki_git_resolve:`git 冲突解决`};function zb(e){return typeof e==`object`&&!!e&&e.kind===`tool-result`}function Bb(e){if(typeof e!=`object`||!e)return null;let t=e;if(typeof t.call==`object`&&t.call!==null){let e=t.call;if(typeof e.name==`string`&&typeof e.argsRaw==`string`)return e}let n=e;return typeof n.name==`string`&&typeof n.argsRaw==`string`?{name:n.name,argsRaw:n.argsRaw}:null}function Vb(e){try{let t=JSON.parse(e);return typeof t==`object`&&t&&!Array.isArray(t)?t:{}}catch{return{}}}function Hb(e){return Array.isArray(e)?e.filter(e=>typeof e?.text==`string`).map(e=>e.text).join(`
|
|
812
|
+
`):``}function Ub(e){return typeof e==`string`?e:``}async function Wb(e){try{let t=await fetch(e,{signal:AbortSignal.timeout(1e4)});if(t.status===404){let e=await t.json().catch(()=>null);return typeof e==`object`&&e?e:{notFound:!0}}if(!t.ok)return null;let n=await t.json();return typeof n==`object`&&n?n:null}catch{return null}}async function Gb(e){return yb(e,1e4)}function Kb(e,t){let[n,r]=c.useState({loading:!0,data:null});return c.useEffect(()=>{let t=!0;return r({loading:!0,data:null}),Promise.resolve(e()).then(e=>{t&&r({loading:!1,data:e})},()=>{t&&r({loading:!1,data:null})}),()=>{t=!1}},t),n}function qb(e){return t=>{t.defaultPrevented||t.button!==0||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||(t.preventDefault(),t.stopPropagation(),Dt(e))}}function Jb(e){let t=Rb[e.toolName]??e.toolName,n=c.createElement(`div`,{className:`dsh-tw-toolcard-head`},c.createElement(`span`,{className:`dsh-tw-toolcard-badge`},t),e.title!==void 0&&e.title.length>0?c.createElement(`span`,{className:`dsh-tw-toolcard-title`,title:e.title},e.title):null,e.onOpen===void 0?null:c.createElement(`button`,{type:`button`,className:`dsh-tw-toolcard-open`,onClick:e.onOpen},`在 TW 打开`)),r=e.subtitle!==void 0||e.tags!==void 0&&e.tags.length>0?c.createElement(`div`,{className:`dsh-tw-toolcard-meta`},e.subtitle===void 0?null:c.createElement(`span`,{className:`dsh-tw-toolcard-sub`},e.subtitle),e.tags!==void 0&&e.tags.length>0?c.createElement(`span`,{className:`dsh-tw-toolcard-tags`},...e.tags.map((e,t)=>c.createElement(`span`,{className:`dsh-tw-toolcard-tag`,key:`${t}-${e}`},e))):null):null;return c.createElement(`div`,{className:`dsh-tw-toolcard`},n,r,c.createElement(`div`,{className:`dsh-tw-toolcard-body`},e.children),e.foot!==void 0&&e.foot!==null?c.createElement(`div`,{className:`dsh-tw-toolcard-foot`},e.foot):null)}const Yb=new Map;function Xb(e){let t=Yb.get(e);if(t!==void 0){if(Date.now()-t.at>3e5){Yb.delete(e);return}return Yb.delete(e),Yb.set(e,t),t}}function Zb(e,t){for(Yb.delete(e),Yb.set(e,{at:Date.now(),...t});Yb.size>50;){let e=Yb.keys().next().value;if(e===void 0)break;Yb.delete(e)}}function Qb(e){e.length>0&&Yb.delete(e)}function $b(e){let t=e.join(`\0`);c.useEffect(()=>{for(let e of t.split(`\0`))Qb(e)},[t])}function ex(e){let{title:t,fresh:n}=e,{loading:r,data:i}=Kb(async()=>{n===!0&&Qb(t);let e=Xb(t);if(e!==void 0)return{get:e.get,html:e.html};let[r,i]=await Promise.all([Wb(`${g}?title=${encodeURIComponent(t)}`),Gb(t)]);return typeof i==`string`&&i.length>0&&Zb(t,{get:r,html:i}),{get:r,html:i}},[t,n]),a=i?.get??null,o=i?.html??null,s;s=r?c.createElement(`div`,{className:`dsh-tw-toolcard-loading`},`渲染中…`):a!==null&&a.notFound===!0?c.createElement(`div`,{className:`dsh-tw-toolcard-empty`},`tiddler「${t}」不存在`):typeof o==`string`&&o.length>0?c.createElement(`div`,{className:`dsh-tw-toolcard-native`,dangerouslySetInnerHTML:{__html:o}}):a!==null&&typeof a.text==`string`&&a.text.length>0?c.createElement(`pre`,{className:`dsh-tw-toolcard-fallback`},a.text):c.createElement(`div`,{className:`dsh-tw-toolcard-empty`},`wiki 服务不可用`);let l=Array.isArray(a?.tags)?a.tags.filter(e=>typeof e==`string`):[],u=typeof a?.modified==`string`?a.modified:void 0;return c.createElement(Jb,{toolName:e.toolName,title:t,subtitle:e.subtitle,tags:l,onOpen:qb(t),foot:u===void 0?void 0:`修改于 ${u}`},s)}function tx(e){let t=c.createElement(`span`,{className:`dsh-tw-toolcard-row-head`},c.createElement(`span`,{className:`dsh-tw-toolcard-row-title`},e.title),e.tags!==void 0&&e.tags.length>0?c.createElement(`span`,{className:`dsh-tw-toolcard-row-tags`},e.tags.slice(0,4).join(` · `)):null,typeof e.modified==`string`&&e.modified.length>0?c.createElement(`span`,{className:`dsh-tw-toolcard-row-meta`},e.modified):null),n=typeof e.snippet==`string`&&e.snippet.trim().length>0?e.snippet:null;return c.createElement(`a`,{className:`dsh-tw-toolcard-row`,href:`${m}#${encodeURIComponent(e.title)}`,onClick:qb(e.title),title:n===null?e.title:`${e.title}\n${n}`},t,n===null?null:c.createElement(`span`,{className:`dsh-tw-toolcard-row-snippet`},n))}function nx(e){let t=e.rows.slice(0,60),n;return n=t.length===0?c.createElement(`div`,{className:`dsh-tw-toolcard-empty`},e.fallbackText):c.createElement(`div`,{className:`dsh-tw-toolcard-list`},...t.map((e,t)=>c.createElement(tx,{key:`${e.title}-${t}`,...e}))),c.createElement(Jb,{toolName:e.toolName,title:e.title,subtitle:e.subtitle},n)}function rx(e){let t=/工作区\s+(ws\/[^\s((]+)/.exec(e);if(t===null||t[1]===void 0)return null;let n=t[1].slice(3);return n.length>0?n:null}function ix(e){let t=Ub(e.args.query),n=new URLSearchParams;if(t.length>0&&n.set(`query`,t),Array.isArray(e.args.tags))for(let t of e.args.tags)typeof t==`string`&&t.length>0&&n.append(`tags`,t);typeof e.args.tag==`string`&&e.args.tag.length>0&&n.set(`tag`,e.args.tag),typeof e.args.since==`string`&&e.args.since.length>0&&n.set(`since`,e.args.since),typeof e.args.type==`string`&&e.args.type.length>0&&n.set(`type`,e.args.type),typeof e.args.field==`string`&&e.args.field.length>0&&n.set(`field`,e.args.field),typeof e.args.value==`string`&&e.args.value.length>0&&n.set(`value`,e.args.value),typeof e.args.limit==`number`&&n.set(`limit`,String(e.args.limit));let r=rx(e.text);r!==null&&n.set(`workspace`,r);let i=n.toString(),a=Kb(()=>Wb(`${S}?${i}`),[i]).data,o=(Array.isArray(a?.items)?a.items:[]).map(e=>({title:Ub(e.title),tags:Array.isArray(e.tags)?e.tags.filter(e=>typeof e==`string`):[],modified:typeof e.modified==`string`?e.modified:null,snippet:typeof e.snippet==`string`?e.snippet:``})),s=typeof a?.total==`number`?a.total:void 0,l=typeof a?.workspace==`string`&&a.workspace.length>0?a.workspace:null,u=``;l!==null&&a?.scope===`workspace`?u=` · 已在工作区 ws/${l} 内缩小范围`:l!==null&&a?.fellBack===!0&&(u=` · 工作区 ws/${l} 内 0 条,已扩大到全库`);let d=`关键词「${t||`(全部)`}」${s===void 0?``:` · 共 ${s} 条`}${u}`;return c.createElement(nx,{toolName:e.toolName,title:t.length>0?t:`检索`,subtitle:d,rows:o,fallbackText:`没有匹配的笔记`})}function ax(e){let t=e.title.length>0?c.createElement(`div`,{className:`dsh-tw-toolcard-empty`},`附件已保存进 wiki(二进制条目,卡片不内联渲染)。`):c.createElement(`div`,{className:`dsh-tw-toolcard-empty`},`附件已保存。`);return c.createElement(Jb,{toolName:e.toolName,title:e.title.length>0?e.title:void 0,...e.title.length>0?{onOpen:qb(e.title)}:{}},t)}function ox(e){let t=new URLSearchParams;typeof e.args.limit==`number`&&t.set(`limit`,String(e.args.limit)),typeof e.args.since==`string`&&e.args.since.length>0&&t.set(`since`,e.args.since);let n=t.toString(),r=Kb(()=>Wb(`${x}?${n}`),[n]).data,i=(Array.isArray(r?.items)?r.items:[]).map(e=>({title:Ub(e.title),tags:Array.isArray(e.tags)?e.tags.filter(e=>typeof e==`string`):[],modified:typeof e.modified==`string`?e.modified:null,snippet:typeof e.snippet==`string`?e.snippet:``}));return c.createElement(nx,{toolName:e.toolName,title:`最近修改`,subtitle:i.length>0?`最近 ${i.length} 条`:``,rows:i,fallbackText:`暂无笔记`})}function sx(e){let t=(Array.isArray(e.args.items)?e.args.items:[]).map(e=>typeof e==`object`&&e&&typeof e.title==`string`?Ub(e.title):null).filter(e=>e!==null&&e.length>0).map(e=>({title:e}));return $b(t.map(e=>e.title)),c.createElement(nx,{toolName:e.toolName,title:`批量写入`,subtitle:t.length>0?`写入 ${t.length} 篇`:`(参数中没有可解析的 items)`,rows:t,fallbackText:`没有可展示的笔记`})}function cx(e){let t=Kb(()=>Wb(`${b}?limit=60&sort=count`),[]).data,n=(Array.isArray(t?.items)?t.items:[]).map(e=>({tag:Ub(e.tag),count:typeof e.count==`number`?e.count:0})),r=n.slice(0,60),i=typeof t?.total==`number`?t.total:n.length,a;return a=n.length===0?c.createElement(`div`,{className:`dsh-tw-toolcard-empty`},`暂无标签`):c.createElement(`div`,{className:`dsh-tw-toolcard-tags-wrap`},...r.map(e=>c.createElement(`span`,{className:`dsh-tw-toolcard-tag`,key:e.tag},`${e.tag} · ${e.count}`)),...i>r.length?[c.createElement(`span`,{className:`dsh-tw-toolcard-tag-more`,key:`__more`},`…另有 ${i-r.length} 个`)]:[]),c.createElement(Jb,{toolName:e.toolName,title:`标签`,subtitle:`共 ${i} 个`},a)}function lx(e){let t=e.text.trim().length>0?c.createElement(`pre`,{className:`dsh-tw-toolcard-fallback`},e.text):c.createElement(`div`,{className:`dsh-tw-toolcard-empty`},`(无结果)`);return c.createElement(Jb,{toolName:e.toolName},t)}function ux(e){$b([e.title]);let t=e.title.length>0?c.createElement(`div`,{className:`dsh-tw-toolcard-empty`},`已删除 tiddler「${e.title}」`):c.createElement(`pre`,{className:`dsh-tw-toolcard-fallback`},e.text||`(已删除)`);return c.createElement(Jb,{toolName:e.toolName,title:e.title.length>0?e.title:void 0},t)}function dx(e,t){switch(e){case`tiddlywiki_get`:case`tiddlywiki_put`:case`tiddlywiki_append`:case`tiddlywiki_delete`:case`tiddlywiki_attach`:case`tiddlywiki_backlinks`:return Ub(t.title);case`tiddlywiki_rename`:return Ub(t.newTitle);case`tiddlywiki_search`:return Ub(t.query);default:return``}}function fx(e){let t=e.block,n=e.toolName,r=zb(t),i=Bb(t),a=n!==void 0&&n.length>0?n:i?.name??``,o=Vb(i?.argsRaw??``),s=r?Hb(t.content):``;if(i===null)return c.createElement(Jb,{toolName:a},c.createElement(`pre`,{className:`dsh-tw-toolcard-fallback`},s||`(无调用信息)`));if(!r)return c.createElement(Jb,{toolName:a,title:dx(a,o)},c.createElement(`div`,{className:`dsh-tw-toolcard-pending`},`处理中…`));if(t.isError===!0)return c.createElement(Jb,{toolName:a,title:dx(a,o)},c.createElement(`div`,{className:`dsh-tw-toolcard-error`},s||`工具调用失败`));switch(a){case`tiddlywiki_get`:return c.createElement(ex,{toolName:a,title:Ub(o.title),subtitle:`读取`});case`tiddlywiki_put`:return c.createElement(ex,{toolName:a,title:Ub(o.title),subtitle:`已写入`,fresh:!0});case`tiddlywiki_append`:return c.createElement(ex,{toolName:a,title:Ub(o.title),subtitle:`已增量写入`,fresh:!0});case`tiddlywiki_rename`:return c.createElement(ex,{toolName:a,title:Ub(o.newTitle),subtitle:`已重命名「${Ub(o.oldTitle)}」→`,fresh:!0});case`tiddlywiki_delete`:return c.createElement(ux,{toolName:a,title:Ub(o.title),text:s});case`tiddlywiki_attach`:return c.createElement(ax,{toolName:a,title:Ub(o.title)});case`tiddlywiki_batch_put`:return c.createElement(sx,{toolName:a,args:o});case`tiddlywiki_search`:return c.createElement(ix,{toolName:a,args:o,text:s});case`tiddlywiki_recent`:return c.createElement(ox,{toolName:a,args:o});case`tiddlywiki_list_tags`:return c.createElement(cx,{toolName:a});case`tiddlywiki_git_sync`:case`tiddlywiki_git_resolve`:return c.createElement(lx,{toolName:a,text:s});default:return c.createElement(Jb,{toolName:a,title:dx(a,o)},c.createElement(`pre`,{className:`dsh-tw-toolcard-fallback`},s||`(完成)`))}}const px=[`tiddlywiki_get`,`tiddlywiki_search`,`tiddlywiki_recent`,`tiddlywiki_list_tags`,`tiddlywiki_put`,`tiddlywiki_batch_put`,`tiddlywiki_append`,`tiddlywiki_rename`,`tiddlywiki_delete`,`tiddlywiki_trash`,`tiddlywiki_backlinks`,`tiddlywiki_attach`,`tiddlywiki_lint`,`tiddlywiki_git_sync`,`tiddlywiki_git_resolve`];function mx(e){let t=[];for(let n of px)try{let r=e.inject(`tool.call.toolview`,()=>e.register({name:`tool.call.toolview`,id:`dsh-tiddlywiki-toolview-${n}`,key:n,order:20,label:`TiddlyWiki: ${n}`},fx));r!==void 0&&t.push(r)}catch(e){console.error(`[dsh-tiddlywiki] register toolview ${n} failed:`,e)}return t}function hx(){let e=e=>{if(e.defaultPrevented||e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)return;let t=e.target;if(!(t instanceof Element))return;let n=t.closest(`a`);if(n===null)return;let r=n.getAttribute(`href`)??``,i=null;try{let e=new URL(r,window.location.origin);e.origin===window.location.origin&&e.pathname===m&&e.hash.length>1&&(i=e.hash.substring(1))}catch{}if(i!==null){e.preventDefault(),e.stopPropagation();try{i=decodeURIComponent(i)}catch{}Dt(i)}};return document.addEventListener(`click`,e,!0),()=>document.removeEventListener(`click`,e,!0)}const gx=`dsh-tiddlywiki`,_x=`dsh-tiddlywiki/rightbar`;function vx(e){let{useTabInfo:t}=e,n=t().tab,r=c.useRef(null),i=c.useRef(null);c.useEffect(()=>{let e=r.current;if(e===null)return;let t=yt(e,n.signal);return i.current=t,()=>{t.dispose(),i.current=null}},[n.id,n.signal]),c.useEffect(()=>{i.current?.setVisible(n.visible)},[n.visible]);let a=n.visible,o=n.actions.close;return c.useEffect(()=>{if(!a)return;document.dispatchEvent(new CustomEvent(at,{detail:_x}));let e=e=>{e.detail!==_x&&o()};return document.addEventListener(at,e),()=>document.removeEventListener(at,e)},[a,o]),c.createElement(`div`,{ref:r,className:`dsh-tw-rightbar-tab`})}function yx(){return{id:gx,kind:`dsh-tiddlywiki`,title:()=>lt(),guide:[{order:10,title:()=>`TiddlyWiki 知识库`,description:()=>`在右侧边栏打开 TiddlyWiki 编辑器(与聊天并排)`,icon:dt}]}}function bx(e,t){let n=[];try{n.push(e.register(yx()));let r=t.inject(`sidebar.right.pane.tab`,()=>t.register({name:`sidebar.right.pane.tab`,key:gx},vx));r!==void 0&&n.push(r)}catch(e){for(let e of n.splice(0))e();console.error(`[dsh-tiddlywiki] rightbar tab mount failed:`,e);return}return _t(),()=>{for(let e of n.splice(0))e()}}const xx=[`slots`];function Sx(e){try{let t=[],n=!1,r=()=>{n=!0;for(let e of t.splice(0))e()},i=(e,t)=>{try{t()}catch(t){console.error(`[dsh-tiddlywiki] ${e} failed:`,t)}};i(`styles`,()=>t.push(d()));let a=new f,o,s;if(i(`quick-note widget`,()=>{o=cb(),t.push(()=>o?.dispose())}),i(`sync controller`,()=>{s=fb(),t.push(()=>s?.dispose())}),i(`sidebar entry`,()=>t.push(Ae(a))),i(`center panel`,()=>t.push(At(a))),o!==void 0&&s!==void 0){let e=o,n=s;i(`knowledge FAB`,()=>t.push(gb(a,e,n)))}i(`editor popup`,()=>t.push(Vt)),i(`wiki scope dock`,()=>{let n=e.slots?.inject(`conversation.input.dock`,()=>e.slots?.register({name:`conversation.input.dock`,id:`wiki-scope`,order:4,label:`知识库作用域`},vb()));n!==void 0&&t.push(n)}),e.slots!==void 0&&Te().then(r=>{if(n)return;let a=o;r.showQuickNoteDock&&a!==void 0&&i(`quick-note dock`,()=>{let n=e.slots?.inject(`conversation.input.dock`,()=>e.slots?.register({name:`conversation.input.dock`,id:`quick-note`,order:8,label:`快速笔记`},_b(a)));n!==void 0&&t.push(n)}),i(`session summary tab`,()=>{let n=Cb(e.slots,r);n!==void 0&&t.push(n)})}).catch(e=>{console.error(`[dsh-tiddlywiki] ui config load failed:`,e)}),i(`rightbar mount`,()=>{let r,i=a=>{let o=e.get?.(`sidebarRightTabs`);if(o===void 0){a<6&&!n&&(r=window.setTimeout(()=>i(a+1),500*(a+1)));return}Te().then(r=>{if(n||!r.showRightbarTab)return;let i=bx(o,e.slots);i!==void 0&&t.push(i)}).catch(e=>{console.error(`[dsh-tiddlywiki] rightbar config load failed:`,e)})};t.push(()=>{r!==void 0&&window.clearTimeout(r)}),i(0)}),i(`tool views`,()=>{e.slots!==void 0&&t.push(...mx(e.slots))}),i(`wiki link interceptor`,()=>t.push(hx())),i(`settings section`,()=>{let n=e.slots?.inject(`settings.section`,()=>e.slots?.register({name:`settings.section`,id:`dsh-tiddlywiki`,order:50,label:`TiddlyWiki 知识库`},Lb));n!==void 0&&t.push(n)}),e.effect===void 0?window.addEventListener(`pagehide`,r,{once:!0}):e.effect(()=>r,`dsh-tiddlywiki: client mount`)}catch(e){console.error(`[dsh-tiddlywiki] client half failed to start:`,e)}}exports.apply=Sx,exports.inject=xx,exports.name=`dsh-tiddlywiki/client`;
|
|
813
813
|
return module.exports;
|
|
814
814
|
}
|
|
815
815
|
});
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-tiddlywiki",
|
|
3
3
|
"description": "把 TiddlyWiki 5 变成你和 Agent 共用的本地文档中心(纯文本 + git):你在 DSH 界面里阅读、写作、记日记,Agent 用 15 个 tiddlywiki_* 工具读写同一批笔记;每条笔记都是你能读、能改、能审计、能随时带走的文件——不是自动记忆插件,不做后台抓取。可选一键发布到微信公众号草稿箱。 Turn TiddlyWiki 5 into a document center you and your agent share, in plain text under git — a knowledge base you can read, edit, audit and take with you, not an auto-memory plugin. Mounts via the official dsh plugin system; no DSH source changes.",
|
|
4
|
-
"version": "0.28.
|
|
4
|
+
"version": "0.28.2",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"dsh",
|
|
@@ -1014,6 +1014,32 @@ function renderWikiListSection(body: HTMLElement, isDisposed: () => boolean, ref
|
|
|
1014
1014
|
}
|
|
1015
1015
|
}
|
|
1016
1016
|
|
|
1017
|
+
/**
|
|
1018
|
+
* The DEFAULT wiki's folder change goes through `/admin/wiki/switch`, which is
|
|
1019
|
+
* already mode-aware host-side (single → pointer file + restart with rollback;
|
|
1020
|
+
* multi → edit the registry and let the farm reconcile) and refuses a location
|
|
1021
|
+
* that collides with / nests inside another registered wiki.
|
|
1022
|
+
*/
|
|
1023
|
+
const postLocation = async (url: string, body: unknown, busyLabel: string): Promise<void> => {
|
|
1024
|
+
status.textContent = busyLabel
|
|
1025
|
+
try {
|
|
1026
|
+
const data = await fetchJson<{ ok?: boolean; error?: string }>(url, {
|
|
1027
|
+
method: 'POST',
|
|
1028
|
+
headers: { 'content-type': 'application/json' },
|
|
1029
|
+
body: JSON.stringify(body),
|
|
1030
|
+
signal: AbortSignal.timeout(180_000),
|
|
1031
|
+
})
|
|
1032
|
+
if (isDisposed()) return
|
|
1033
|
+
if (data.ok !== true) toast(`失败:${data.error ?? '未知错误'}`)
|
|
1034
|
+
await load()
|
|
1035
|
+
await refresh()
|
|
1036
|
+
} catch (err) {
|
|
1037
|
+
if (isDisposed()) return
|
|
1038
|
+
toast(`失败:${err instanceof Error ? err.message : String(err)}`)
|
|
1039
|
+
await load()
|
|
1040
|
+
}
|
|
1041
|
+
}
|
|
1042
|
+
|
|
1017
1043
|
const render = (view: WikisView): void => {
|
|
1018
1044
|
status.textContent = view.error !== undefined && view.error.length > 0 ? `⚠️ ${view.error}` : ''
|
|
1019
1045
|
modeRow.replaceChildren(make('span', 'dsh-tw-settings-label', '运行模式:'))
|
|
@@ -1085,6 +1111,27 @@ function renderWikiListSection(body: HTMLElement, isDisposed: () => boolean, ref
|
|
|
1085
1111
|
const ok = window.confirm(`把「${wiki.label}」移出清单?\n\n**目录与内容不会被删除**(仍在 ${wiki.path}),只是插件不再管理它。`)
|
|
1086
1112
|
if (ok) void post({ action: 'remove', id: wiki.id }, '移出中…')
|
|
1087
1113
|
})
|
|
1114
|
+
// 「改目录」只在多库模式出现(v0.28.1):单库模式下这件事由「知识库位置」负责
|
|
1115
|
+
// (它写 wiki 之外的指针文件),两处并存会让用户不知道以哪个为准。
|
|
1116
|
+
if (view.mode === 'multi') {
|
|
1117
|
+
const move = make('button', 'dsh-tw-settings-btn dsh-tw-settings-chipbtn', '改目录')
|
|
1118
|
+
move.type = 'button'
|
|
1119
|
+
move.addEventListener('click', () => {
|
|
1120
|
+
const root = window.prompt(`把「${wiki.label}」的根目录换成?\n\n当前:${wiki.root}`, wiki.root)
|
|
1121
|
+
if (root === null) return
|
|
1122
|
+
if (root.trim().length === 0) {
|
|
1123
|
+
toast('根目录不能为空')
|
|
1124
|
+
return
|
|
1125
|
+
}
|
|
1126
|
+
const name = window.prompt(`文件夹名(当前:${wiki.name};填 . 表示直接用上面这个根目录)`, wiki.name)
|
|
1127
|
+
if (name === null) return
|
|
1128
|
+
const target = { root: root.trim(), name: name.trim().length > 0 ? name.trim() : wiki.name }
|
|
1129
|
+
void (isDefault
|
|
1130
|
+
? postLocation(WIKI_SWITCH_ENDPOINT, target, '搬动中(会停/起这个库)…')
|
|
1131
|
+
: post({ action: 'update', wiki: { ...wiki, ...target } }, '保存中…'))
|
|
1132
|
+
})
|
|
1133
|
+
actions.append(move)
|
|
1134
|
+
}
|
|
1088
1135
|
actions.append(configure, power, makeDefault, visibility, autostart, remove)
|
|
1089
1136
|
row.append(actions)
|
|
1090
1137
|
list.append(row)
|
|
@@ -1139,7 +1186,34 @@ function withWiki(url: string): string {
|
|
|
1139
1186
|
return editingWiki === undefined ? url : `${url}?wiki=${encodeURIComponent(editingWiki)}`
|
|
1140
1187
|
}
|
|
1141
1188
|
|
|
1189
|
+
/**
|
|
1190
|
+
* 「知识库位置」只在**单库模式**下渲染(v0.28.1)。
|
|
1191
|
+
*
|
|
1192
|
+
* 为什么按模式二选一,而不是两处并存:这一块的语义是「把唯一的那个库换到别处」——
|
|
1193
|
+
* 它写的是 wiki 之外的指针文件 `location.json`,措辞也是单库时代的("切换到这个位置" /
|
|
1194
|
+
* "恢复为配置默认")。多库模式下每个库的目录属于「知识库列表」里那一行(`改目录`),
|
|
1195
|
+
* 两处都能改同一件事 = 重复,而且这一块读起来像旧时代残留(作者 2026-09-28 反馈)。
|
|
1196
|
+
*
|
|
1197
|
+
* 宿主侧**没有**冲突:`/admin/wiki/switch` 早就按模式分派(single → 指针文件 + 带回滚的
|
|
1198
|
+
* 重启;multi → 改清单 + 让 farm 收敛)。所以这里只是把**界面**收敃到一处,不动接口。
|
|
1199
|
+
*
|
|
1200
|
+
* 读不到模式时按单库渲染(保守:宁可多显示一个"确实能用"的区块,也不要什么都不给)。
|
|
1201
|
+
*/
|
|
1142
1202
|
function renderWikiLocationSection(body: HTMLElement, isDisposed: () => boolean, refresh: () => Promise<void>): void {
|
|
1203
|
+
void (async () => {
|
|
1204
|
+
try {
|
|
1205
|
+
const view = await fetchJson<WikisView>(WIKI_LIST_ENDPOINT)
|
|
1206
|
+
if (isDisposed()) return
|
|
1207
|
+
if (view.mode === 'multi') return
|
|
1208
|
+
} catch {
|
|
1209
|
+
/* 读不到模式:按单库渲染 */
|
|
1210
|
+
}
|
|
1211
|
+
if (isDisposed()) return
|
|
1212
|
+
renderWikiLocationSectionBody(body, isDisposed, refresh)
|
|
1213
|
+
})()
|
|
1214
|
+
}
|
|
1215
|
+
|
|
1216
|
+
function renderWikiLocationSectionBody(body: HTMLElement, isDisposed: () => boolean, refresh: () => Promise<void>): void {
|
|
1143
1217
|
const section = make('section', 'dsh-tw-settings-section')
|
|
1144
1218
|
section.append(make('h3', 'dsh-tw-settings-h', '知识库位置(可切换)'))
|
|
1145
1219
|
const status = make('div', 'dsh-tw-settings-muted', '读取中…')
|