dsh-tiddlywiki 0.28.4 → 0.28.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -67,6 +67,8 @@ dsh plugin --profile web add dsh-tiddlywiki
67
67
 
68
68
  ## 🕘 版本记录
69
69
 
70
+ - **v0.28.6**(2026-09-28):**修两个多库界面的真机报障**。① **「插件管理 / 主题管理 / 语言包 / 初始化」看起来是混在一起管理的** —— 宿主侧一直是 per-request 解析目标库的(`deps.server(req)`/`config(req)`/`getClient(req)`),缺的是**客户端那一半**:设置页只有 `state`/`config`/`prompt` 三处带上了 `?wiki=`,而**插件信息与初始化 seed 的调用没带**,于是它们永远落在默认库上,「切了库、面板内容却没变」。现在 7 个 per-wiki 端点全部经 `withWiki()`,并有守门逐个断言(去掉任一处的作用域 → 红)。单库(未选库)时 `withWiki` 原样返回 URL,现有用户逐字不变。② **左侧入口点一个却三个都高亮** —— 我上一版把「面板是共享的」错解成「所有行一起高亮」,但面板一次只显示一个库(当前焦点库)。现在只有那一行点亮,并订阅焦点变化重算;单库默认行在面板打开时仍正常高亮。两条守门断言都做了反向验证。
71
+ - **v0.28.5**(2026-09-28):**修「多库模式下侧边栏多出一个没有库名的 `TiddlyWiki` 入口」**(作者报障)。根因是**同一个 CSS 陷阱踩了第 12 次**:`hidden` 属性在 CSS 里只是 `display:none`,而 `.dsh-tw-entry` 有显式 `display:flex` —— **显式 display 盖掉了 hidden**,于是那行让位给每库入口的默认行照样渲染。这次不再给它单独补一条规则,而是**收敃成一条全局兜底** `[hidden] { display: none !important; }`,并删掉本仓库历史上为此在不同元素上各补的 **12 条逐元素规则**(面板 iframe / 错误块 / 快速笔记 / FAB 菜单与提示 / 右侧栏 / 目标库下拉 / 草稿栏 / 最近列表…)。守门同时改为断言「全局兜底存在 + 不允许再出现逐元素版本」,并反向验证(把全局规则改成挂在类名下 → 红)。
70
72
  - **v0.28.4**(2026-09-28):**每库自定义图标 + 修「右键菜单切库后选中项不更新」**。① **右侧「知识库」菜单的选中项停在旧值** —— 根因是选中标记(`●`/`○`)只在**菜单构建时**算了一次,之后无论怎么切都不重画;现在改为从当前焦点重算,并在 `setFocusWiki` 订阅里即时重画、每次打开菜单前再兜一次(切库也可能来自侧边栏入口或快速笔记卡片)。② **每个库的入口图标可自定义**:`wikis.json` 的条目新增可选 `icon` 字段,值可以是内置图形名(book / briefcase / home / notebook / flask / globe / star / archive,各是一枚继承 `currentColor` 的手写 16×16 线性 SVG,两套主题下都对)或**一个短 emoji**(📚 / 💼 / 🏠 …,用来一眼区分四五个库,不用下载任何资源)。设置页「知识库列表」每行多了图标下拉(当前值若不在候选里会保留,不会被抹掉)。校验口径:名字或 ≤8 字符的可打印短串,超长与控制字符一律拒绝;空值 = 清除自定义回落默认。**emoji 用 `textContent` 渲染而不是 `innerHTML`** —— 这个值来自用户可编辑的文件,绝不能变成注入点。缺省不设 = 内置默认图标,升级用户看到的一模一样。
71
73
  - **v0.28.3**(2026-09-28):**修三个真机报障 + 插件说明补「多库 / 升级」两节**(作者拆库实测中发现)。① 单库模式下快速笔记露出一个没有选项的下拉 —— 根因是 **CSS `hidden` 只是 `display:none`,被显式 `display` 盖掉**(修法:显式 `[hidden]{display:none}` + 组件兜底)。② 会话级选择器没和输入框对齐 —— **对齐规则原本只写在 quick-note 条目内部**,已抽成 `client/dock-align.ts` 两处共用。③ 左侧入口按库显示:多库时每个在运行的库一个入口行、用各自显示名,点该行先切焦点库再开面板。④ 插件说明新增「多知识库」与「从旧版本升级上来」两节:明确升级后**不会自动变成多库**、`wikis.json` 在哪、旧指针文件何时还权威。守门扩到 19 条(含反向验证)。
72
74
  - **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 条),保证藏了界面之后**接口仍按模式正确分派**。
package/docs/CHANGELOG.md CHANGED
@@ -4,6 +4,8 @@
4
4
 
5
5
  > 最近几个主要版本的一句话记录(完整变更见 [Releases](https://github.com/bbqisbbq/dsh-tiddlywiki/releases) / git log)。
6
6
 
7
+ - **v0.28.6**(2026-09-28):**修两个多库界面的真机报障**。① **「插件管理 / 主题管理 / 语言包 / 初始化」看起来是混在一起管理的** —— 宿主侧一直是 per-request 解析目标库的(`deps.server(req)`/`config(req)`/`getClient(req)`),缺的是**客户端那一半**:设置页只有 `state`/`config`/`prompt` 三处带上了 `?wiki=`,而**插件信息与初始化 seed 的调用没带**,于是它们永远落在默认库上,「切了库、面板内容却没变」。现在 7 个 per-wiki 端点全部经 `withWiki()`,并有守门逐个断言(去掉任一处的作用域 → 红)。单库(未选库)时 `withWiki` 原样返回 URL,现有用户逐字不变。② **左侧入口点一个却三个都高亮** —— 我上一版把「面板是共享的」错解成「所有行一起高亮」,但面板一次只显示一个库(当前焦点库)。现在只有那一行点亮,并订阅焦点变化重算;单库默认行在面板打开时仍正常高亮。两条守门断言都做了反向验证。
8
+ - **v0.28.5**(2026-09-28):**修「多库模式下侧边栏多出一个没有库名的 `TiddlyWiki` 入口」**(作者报障)。根因是**同一个 CSS 陷阱踩了第 12 次**:`hidden` 属性在 CSS 里只是 `display:none`,而 `.dsh-tw-entry` 有显式 `display:flex` —— **显式 display 盖掉了 hidden**,于是那行让位给每库入口的默认行照样渲染。这次不再给它单独补一条规则,而是**收敃成一条全局兜底** `[hidden] { display: none !important; }`,并删掉本仓库历史上为此在不同元素上各补的 **12 条逐元素规则**(面板 iframe / 错误块 / 快速笔记 / FAB 菜单与提示 / 右侧栏 / 目标库下拉 / 草稿栏 / 最近列表…)。守门同时改为断言「全局兜底存在 + 不允许再出现逐元素版本」,并反向验证(把全局规则改成挂在类名下 → 红)。
7
9
  - **v0.28.4**(2026-09-28):**每库自定义图标 + 修「右键菜单切库后选中项不更新」**。① **右侧「知识库」菜单的选中项停在旧值** —— 根因是选中标记(`●`/`○`)只在**菜单构建时**算了一次,之后无论怎么切都不重画;现在改为从当前焦点重算,并在 `setFocusWiki` 订阅里即时重画、每次打开菜单前再兜一次(切库也可能来自侧边栏入口或快速笔记卡片)。② **每个库的入口图标可自定义**:`wikis.json` 的条目新增可选 `icon` 字段,值可以是内置图形名(book / briefcase / home / notebook / flask / globe / star / archive,各是一枚继承 `currentColor` 的手写 16×16 线性 SVG,两套主题下都对)或**一个短 emoji**(📚 / 💼 / 🏠 …,用来一眼区分四五个库,不用下载任何资源)。设置页「知识库列表」每行多了图标下拉(当前值若不在候选里会保留,不会被抹掉)。校验口径:名字或 ≤8 字符的可打印短串,超长与控制字符一律拒绝;空值 = 清除自定义回落默认。**emoji 用 `textContent` 渲染而不是 `innerHTML`** —— 这个值来自用户可编辑的文件,绝不能变成注入点。缺省不设 = 内置默认图标,升级用户看到的一模一样。
8
10
  - **v0.28.3**(2026-09-28):**修三个真机报障 + 插件说明补「多库 / 升级」两节**(作者拆库实测中发现)。① **单库模式下快速笔记露出一个没有选项的「写入」下拉** —— 根因是 **CSS 的 `hidden` 属性只是 `display:none`,任何显式 `display` 都能盖掉它**:我给 `.dsh-tw-note-wiki` 写了 `display:inline-flex`,于是 `hidden` 失效,那个空下拉照常渲染。修法两层:CSS 显式加 `[hidden]{display:none}`(且必须写在设 `display` 的那条**之后**,同优先级靠后者生效)+ 组件侧兜底(单库时 `disabled` 并直接 `display:none`)。② **会话级知识库选择器没有和输入框对齐** —— 根因是**规则只写在了一个使用者的内部**:找 composer 输入卡片、按差值补 `paddingRight` 的整套测量逻辑原本长在 `quick-note-dock.ts` 里,第二个 dock 条目加进来时没人知道要对齐。已抽成 `client/dock-align.ts`(`alignDockEntry`)两处共用,并守门断言「条目内不得再自带测量实现」。③ **左侧入口按库显示** —— 多库时每个**在运行**的库一个入口行、用各自的显示名;点该行**先切焦点库再开面板**(否则点 A 打开 B);当前焦点库有左侧标线。单库安装仍走原来那一行 + `ui.sidebarLabel`,逐字不变。④ **插件说明新增两节**:升级用户最大的困惑是"装完了不知道有这个东西",所以明确写了——升级后**不会自动变成多库**、行为与升级前一致;想用多库去哪点;`wikis.json` 在哪;旧 `location.json` 在哪些模式下还权威;每个库要有自己的 `tiddlywiki.info`。守门 `verify-wiki-focus` 扩到 19 条(`hidden` 那条已反向验证)。
9
11
  - **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 条),保证藏了界面之后**接口仍按模式正确分派**。
package/lib/client.js CHANGED
@@ -6,6 +6,13 @@ window.__ModuleLoader__.load({
6
6
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
7
7
  Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require("react");c=s(c,1);const l=`dsh-tiddlywiki-styles`,u=`
8
8
  /* ── sidebar entry ───────────────────────────────────────────── */
9
+ /* ⚠️ hidden 属性在 CSS 里只是 display:none,**任何显式 display 都能盖掉它**。
10
+ 这条全局兜底(v0.28.5)盖住全表里所有自带 display 的组件。已经踩过 12 次:
11
+ 面板 iframe、错误块、快速笔记、FAB 菜单/提示、右侧栏、目标库下拉、草稿栏、
12
+ 最近列表 —— 每次都是"某个元素 hidden 了却还显示",然后为它单独补一条规则。
13
+ 多库模式下默认那一行「TiddlyWiki」也是靠 hidden 让位给每库入口行的,没有这条
14
+ 它照样渲染(作者 2026-09-28 报障)。一条全局规则替掉那 12 条逐元素规则。 */
15
+ [hidden] { display: none !important; }
9
16
  .dsh-tw-entry {
10
17
  display: flex; align-items: center; gap: 8px; position: relative;
11
18
  width: calc(100% - 8px); margin: 2px 4px; padding: 6px 10px;
@@ -60,9 +67,6 @@ html[data-dsh-tw-active] .dshDesktopConversationSurface > :not([data-dsh-tw-view
60
67
  /* The iframe background follows the DSH theme so a blank/preload frame never
61
68
  flashes pure white in dark mode (TW paints its own palette once loaded). */
62
69
  .dsh-tw-panel-frame { flex: 1; min-height: 0; border: 0; width: 100%; display: block; background: var(--dsw-alias-bg-layer-1, #fff); }
63
- /* [hidden] must beat the author display rules above (UA hidden is overridden). */
64
- .dsh-tw-panel-frame[hidden],
65
- .dsh-tw-panel-error[hidden] { display: none !important; }
66
70
 
67
71
  .dsh-tw-panel-error {
68
72
  flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center;
@@ -89,8 +93,6 @@ html[data-dsh-tw-active] .dshDesktopConversationSurface > :not([data-dsh-tw-view
89
93
  flex: 1; min-height: 0; border: 0; width: 100%; display: block;
90
94
  background: var(--dsw-alias-bg-layer-1, #fff);
91
95
  }
92
- .dsh-tw-rightbar-frame[hidden],
93
- .dsh-tw-rightbar-error[hidden] { display: none !important; }
94
96
  .dsh-tw-rightbar-error {
95
97
  flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center;
96
98
  gap: 10px; color: var(--dsw-alias-label-secondary, #666); font-size: 13px; text-align: center; padding: 20px;
@@ -113,9 +115,7 @@ html[data-dsh-tw-active] .dshDesktopConversationSurface > :not([data-dsh-tw-view
113
115
  display: flex; flex-direction: column; align-items: flex-end; gap: 10px;
114
116
  font-family: inherit;
115
117
  }
116
- /* The wrapper's display:flex would beat the UA [hidden]{display:none} rule,
117
- so the card's show/hide (root.hidden) needs an explicit rule. */
118
- .dsh-tw-note[hidden] { display: none; }
118
+
119
119
  .dsh-tw-note-card {
120
120
  width: 340px; max-width: calc(100vw - 40px);
121
121
  background: var(--dsw-alias-bg-layer-2, #fff); color: var(--dsw-alias-label-primary, #222);
@@ -126,7 +126,7 @@ html[data-dsh-tw-active] .dshDesktopConversationSurface > :not([data-dsh-tw-view
126
126
  backdrop-filter: blur(14px); -webkit-backdrop-filter: blur(14px);
127
127
  animation: dsh-tw-note-in 180ms ease;
128
128
  }
129
- .dsh-tw-note-card[hidden] { display: none; }
129
+
130
130
  @keyframes dsh-tw-note-in {
131
131
  from { opacity: 0; transform: translateY(8px) scale(.98); }
132
132
  to { opacity: 1; transform: translateY(0) scale(1); }
@@ -451,7 +451,7 @@ html[data-dsh-tw-active] .dshDesktopConversationSurface > :not([data-dsh-tw-view
451
451
  backdrop-filter: blur(14px); -webkit-backdrop-filter: blur(14px);
452
452
  animation: dsh-tw-note-in 160ms ease;
453
453
  }
454
- .dsh-tw-fab-menu[hidden] { display: none; }
454
+
455
455
  .dsh-tw-fab-status {
456
456
  display: flex; align-items: center; gap: 7px;
457
457
  padding: 6px 9px; font-size: 12px; color: var(--dsw-alias-label-secondary, #666);
@@ -473,7 +473,7 @@ html[data-dsh-tw-active] .dshDesktopConversationSurface > :not([data-dsh-tw-view
473
473
  font-size: 11px; line-height: 1.6; white-space: pre-line; word-break: break-word;
474
474
  text-align: left;
475
475
  }
476
- .dsh-tw-fab-tip[hidden] { display: none; }
476
+
477
477
  .dsh-tw-fab-tip::after {
478
478
  content: ''; position: absolute; right: 16px; bottom: -5px;
479
479
  width: 10px; height: 10px; transform: rotate(45deg);
@@ -528,7 +528,7 @@ html[data-dsh-tw-active] .dshDesktopConversationSurface > :not([data-dsh-tw-view
528
528
  上面那条 display:inline-flex 就盖掉了,于是单库模式下这个空下拉照样显示出来
529
529
  (作者 2026-09-28 报障:"有个写入下拉,但是没有选项")。显式尊重 hidden,
530
530
  并把这一条写在后面(同优先级靠后者生效)。 */
531
- .dsh-tw-note-wiki[hidden] { display: none; }
531
+
532
532
  .dsh-tw-note-wiki-label { opacity: .7; }
533
533
  .dsh-tw-note-wiki-select {
534
534
  border: 1px solid var(--dsw-alias-border-l2, rgba(0,0,0,.18));
@@ -536,7 +536,7 @@ html[data-dsh-tw-active] .dshDesktopConversationSurface > :not([data-dsh-tw-view
536
536
  padding: 2px 6px; border-radius: 999px; max-width: 220px;
537
537
  }
538
538
  .dsh-tw-note-wiki-hint { font-size: 12px; opacity: .75; }
539
- .dsh-tw-note-wiki-hint[hidden] { display: none; }
539
+
540
540
 
541
541
  /* ── input-dock quick-note button(聊天输入框上方,conversation.input.dock)──
542
542
  该槽位渲染为「输入框上方的全宽条目」纵向 flex 排列(todo/cost-meter/goal/
@@ -570,7 +570,7 @@ html[data-dsh-tw-active] .dshDesktopConversationSurface > :not([data-dsh-tw-view
570
570
  background: color-mix(in srgb, var(--dsw-alias-state-warning-primary, #d9822b) 12%, transparent);
571
571
  color: var(--dsw-alias-label-primary, #222);
572
572
  }
573
- .dsh-tw-note-draft[hidden] { display: none; }
573
+
574
574
  .dsh-tw-note-draft-text { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
575
575
  .dsh-tw-note-draft-discard {
576
576
  border: 1px solid var(--dsw-alias-border-l2, rgba(0,0,0,.18));
@@ -589,7 +589,7 @@ html[data-dsh-tw-active] .dshDesktopConversationSurface > :not([data-dsh-tw-view
589
589
  box-shadow: var(--dsw-shadow-lv3, 0 8px 30px rgba(0,0,0,.22));
590
590
  font-size: 13px;
591
591
  }
592
- .dsh-tw-note-recent[hidden] { display: none; }
592
+
593
593
  .dsh-tw-note-recent-item {
594
594
  display: flex; align-items: baseline; justify-content: space-between; gap: 10px;
595
595
  padding: 6px 8px; border-radius: 7px; cursor: pointer;
@@ -791,7 +791,7 @@ html[data-dsh-tw-active] .dshDesktopConversationSurface > :not([data-dsh-tw-view
791
791
  .dsh-tw-note-card,
792
792
  .dsh-tw-fab-menu { animation: none; }
793
793
  }
794
- `;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`,C=`${p}/upload`,ee=`${p}/sync`,te=`${p}/restart`,w=`${p}/session/summary`,ne=`${p}/admin/state`,re=`${p}/admin/prompt`,T=`${p}/admin/info`,ie=`${p}/admin/config`,E=`${p}/admin/restart`,ae=`${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}const Te=`dsh-tiddlywiki.focusWiki`;function Ee(){try{let e=window.localStorage.getItem(Te);return e!==null&&e.length>0?e:void 0}catch{return}}let De=Ee();const Oe=new Set;function ke(){return De}function Ae(e){if(e!==De){De=e;try{e===void 0?window.localStorage.removeItem(Te):window.localStorage.setItem(Te,e)}catch{}for(let t of[...Oe])t(e)}}function je(e){return Oe.add(e),()=>{Oe.delete(e)}}function Me(e,t){return e.length===0||De!==void 0&&e.some(e=>e.id===De)?De:t!==void 0&&e.some(e=>e.id===t)?t:e[0]?.id}const Ne={book:`<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="M3.5 3h9v10h-9z"/><path d="M6.5 3v10"/><path d="M8.5 6h2.5M8.5 8.5h2"/></svg>`,briefcase:`<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="M2.5 5.5h11v7h-11z"/><path d="M6 5.5V4a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v1.5"/><path d="M2.5 8.5h11"/></svg>`,home:`<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="M2.5 7.5 8 3l5.5 4.5"/><path d="M4 7v6h8V7"/></svg>`,notebook:`<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.5h7.5v11H4z"/><path d="M6 2.5v11"/><path d="M8 6h2M8 8.5h2"/></svg>`,flask:`<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="M6.5 2.5v4L3.5 12a1 1 0 0 0 .9 1.5h7.2A1 1 0 0 0 12.5 12L9.5 6.5v-4"/><path d="M5.5 2.5h5"/><path d="M4.8 10h6.4"/></svg>`,globe:`<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"><circle cx="8" cy="8" r="5.5"/><path d="M2.5 8h11"/><path d="M8 2.5c1.6 1.6 2.4 3.5 2.4 5.5S9.6 12 8 13.5C6.4 12 5.6 10 5.6 8s.8-3.9 2.4-5.5z"/></svg>`,star:`<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="m8 2.5 1.7 3.6 3.8.5-2.8 2.7.7 3.9L8 11.4l-3.4 1.8.7-3.9-2.8-2.7 3.8-.5z"/></svg>`,archive:`<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="M2.5 3.5h11v3h-11z"/><path d="M3.5 6.5v6h9v-6"/><path d="M6.5 9h3"/></svg>`},Pe=Object.keys(Ne);function Fe(e){return Object.prototype.hasOwnProperty.call(Ne,e)}function Ie(e,t){if(t!==void 0&&Fe(t)){e.innerHTML=Ne[t]??`<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>`,e.classList.remove(`dsh-tw-entry-emoji`);return}if(t!==void 0&&t.trim().length>0){e.textContent=t.trim(),e.classList.add(`dsh-tw-entry-emoji`);return}e.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>`,e.classList.remove(`dsh-tw-entry-emoji`)}function Le(){let e=document.querySelector(`[data-pane="sidebar"], [class*="sidebarCol"], .dshDesktopUpstreamSidebar, .dshDesktopSidebarSurface`);if(e!==null)return e.querySelector(`[class*="logoRow"]`)?.parentElement??e.firstElementChild}function Re(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 ze(e,t,n,r){let i=document.createElement(`button`);i.type=`button`,i.dataset.dshTwEntry=``,i.className=`dsh-tw-entry`,n!==void 0&&(i.dataset.wiki=n),i.setAttribute(`aria-label`,`TiddlyWiki 知识库:${t}`);let a=document.createElement(`span`);a.className=`dsh-tw-entry-icon`,Ie(a,r);let o=document.createElement(`span`);return o.className=`dsh-tw-entry-label`,o.textContent=t,i.append(a,o),i.addEventListener(`click`,()=>{n!==void 0&&Ae(n),e.toggle()}),{entry:i,labelEl:o,iconEl:a}}function Be(e,t){try{let n=Re(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 Ve(e){let t=new Map,{entry:n,labelEl:r,iconEl:i}=ze(e,`TiddlyWiki`);t.set(``,{entry:n,labelEl:r,iconEl:i});let a=!1,o=async()=>{let e=await we();a||e.sidebarLabel.length===0||(r.textContent=e.sidebarLabel,n.setAttribute(`aria-label`,e.sidebarLabel))};o();let s=Se(()=>{o()}),c=async()=>{let r=await _e();if(a)return;let i=(Array.isArray(r?.wikis)?r.wikis:[]).filter(e=>e.running);if(i.length<=1){for(let[e,n]of t)e!==``&&(n.entry.remove(),t.delete(e));n.hidden=!1;return}n.hidden=!0;let o=new Set(i.map(e=>e.id));for(let[e,n]of t)e===``||o.has(e)||(n.entry.remove(),t.delete(e));for(let n of i){let a=t.get(n.id);a===void 0&&(a=ze(e,n.label,n.id,n.icon),t.set(n.id,a)),a.labelEl.textContent=n.label,Ie(a.iconEl,n.icon),a.entry.setAttribute(`aria-label`,`TiddlyWiki 知识库:${n.label}`),Me(i,r?.defaultId)===n.id?a.entry.dataset.focus=`true`:delete a.entry.dataset.focus}d!==void 0&&(f=!1,v())};c();let l=je(()=>{c()}),u=window.setInterval(()=>{c()},1e4),d,f=!1,p,m=0,h=()=>{p!==void 0&&(clearInterval(p),p=void 0)},g=()=>{p===void 0&&(m=15,p=setInterval(()=>{v(),m--,(f||m<=0)&&h()},2e3))},_=()=>[...t.values()].map(e=>e.entry).filter(e=>!e.hidden),v=()=>{if(d!==void 0&&!d.isConnected&&(b.disconnect(),d=void 0,f=!1,g()),f){if(_().every(e=>document.body.contains(e)))return;b.disconnect(),d=void 0,f=!1,g()}if(d??=Le(),d===void 0)return;let e=!1;for(let t of _())Be(d,t)&&(e=!0);f=e,f&&(h(),b.observe(d,{childList:!0,subtree:!0}))},y=new MutationObserver(()=>{v()});y.observe(document.body,{childList:!0,subtree:!0});let b=new MutationObserver(()=>{if(d===void 0||!d.isConnected){f=!1,g(),v();return}for(let e of _())d.contains(e)||Be(d,e)});g();let x=()=>{for(let t of _())e.isOpen()?t.dataset.active=`true`:delete t.dataset.active},S=e.subscribe(x);return x(),v(),()=>{a=!0,clearInterval(p),window.clearInterval(u),y.disconnect(),b.disconnect(),S(),s(),l();for(let e of t.values())e.entry.remove();t.clear()}}const He=`$:/palettes/CupertinoDark`,Ue=`$:/palettes/Vanilla`,We=`data-ds-dark-theme`,Ge=`$:/palette`,Ke=new Set,qe=new WeakSet;let Je=``,Ye=!0,Xe=He;function Ze(){try{let e=document.documentElement,t=document.body;if(t!==null&&t.hasAttribute(We))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 Qe(e){try{let t=e.wiki.getTiddlerText(Ge);return typeof t==`string`&&t.trim().length>0?t.trim():Ue}catch{return Ue}}function $e(e){try{let t=e.wiki.getTiddler(Qe(e))?.fields;return t!==void 0&&t[`color-scheme`]===`dark`}catch{return!1}}function et(e){try{let t=e.syncer;if(t?.tiddlerInfo===void 0)return;let n=e.wiki.getChangeCount(Ge),r=t.tiddlerInfo[Ge];r===void 0?t.tiddlerInfo[Ge]={changeCount:n}:r.changeCount=n}catch{}}function tt(e){try{let t=e.syncer,n=t?.syncadaptor;if(t===void 0||n===void 0||qe.has(t))return;let r=n.saveTiddler.bind(n);n.saveTiddler=(e,t)=>{if(Ye&&Je.length>0&&e?.fields?.title===Ge&&e?.fields?.text===Xe){t(null,{},0);return}r(e,t)},qe.add(t)}catch{}}function nt(e,t){try{if(Qe(e)===t)return;e.wiki.setText(Ge,`text`,void 0,t),et(e)}catch{}}function rt(e,t){let n=Qe(e);if(t){if($e(e))return;n!==Xe&&(Je=n),nt(e,Xe)}else $e(e)&&n===Xe&&Je.length>0&&nt(e,Je)}function it(e,t){try{let n=t.contentDocument?.documentElement;if(n==null)return;let r=$e(e)?`dark`:`light`;n.style.getPropertyValue(`color-scheme`)!==r&&n.style.setProperty(`color-scheme`,r)}catch{}}function at(e){try{let t=e.contentWindow?.$tw;if(t===void 0||t.wiki===void 0)return;tt(t),Ye?rt(t,Ze()):rt(t,!1),it(t,e)}catch{}}function ot(e){let t=e.enabled!==!1,n=typeof e.darkPalette==`string`&&e.darkPalette.trim().length>0?e.darkPalette.trim():He,r=t!==Ye||n!==Xe;if(Ye=t,Xe=n,r)for(let e of[...Ke])e()}function st(e){if(e===null)return()=>{};let t=()=>at(e);Ke.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:[We]}),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(),()=>{Ke.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 ct=`dsh-panel-activate`,lt=`dsh-tw-panel-reload`;let ut=`知识库`;function dt(e){let t=typeof e==`string`?e.trim():``;t.length>0&&(ut=t)}function ft(){return ut}async function pt(){try{return(await fetch(te,{method:`POST`,signal:AbortSignal.timeout(8e3)})).ok}catch{return!1}}function mt({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 ht(e){let t=e.loaded;return t===void 0||t.length===0?null:t}function gt(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=`重启中…`,pt().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=ht(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&&(dt(e.ui.tabLabel??ut),ot({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=ht(o.dataset);e!==null&&(o.src=e)};document.addEventListener(lt,x);let S=je(()=>{!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=st(i),n&&b(),t},setVisible(e){i||(n=e,e&&!r&&(r=!0),o!==void 0&&(o.hidden=!e||ht(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(lt,x),S(),m();for(let e of l)window.clearTimeout(e);l.clear(),p?.(),a?.remove()}}}}function _t(){return{setVisible(){},openTiddler(){return!1},dispose(){}}}const vt=new Set;function yt(e){for(let t of vt)if(t.openTiddler(e))return!0;return!1}function bt(){_e().then(e=>{e?.ui!==void 0&&dt(e.ui.tabLabel??ut)})}const xt={view:`dsh-tw-rightbar-view`,frameWrap:`dsh-tw-rightbar-frame-wrap`,frame:`dsh-tw-rightbar-frame`,error:`dsh-tw-rightbar-error`};function St(e,t){if(t.aborted)return _t();let n=gt(xt,{wikiId:ke});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,vt.delete(a),t.removeEventListener(`abort`,i),n.dispose())}};return vt.add(a),a}const Ct=[`[class*="centerCol"]`,`[data-pane="conversation"]`,`.dshDesktopConversationSurface`],wt=`data-dsh-tw-active`,Tt=[`data-dsh-atb-active`,`data-dsh-taskboard-active`,`data-dsh-ssh-active`],Et=`dsh-tiddlywiki`,Dt=`[data-dsh-panel-host]`,Ot={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`},kt=`dsh-tw-open-tiddler`;function At(e){typeof document>`u`||typeof e!=`string`||e.length===0||document.dispatchEvent(new CustomEvent(kt,{detail:{title:e}}))}function jt(){let e=document.querySelector(Dt);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 Mt(){for(let e of Ct){let t=document.querySelector(e);if(t!==null)return t}}function Nt(e){let t,n,r=!1,i,a=gt(Ot,{wikiId:ke}),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(Dt)!==null;!n&&!e.isOpen()&&r===i||(i=r,t.style.zIndex=String(jt()),r?t.dataset.sidebarHost=`1`:delete t.dataset.sidebarHost)},c=()=>{(n===void 0||!n.isConnected)&&(n=Mt()),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&&(yt(r)||(e.openPanel(),a.openTiddler(r)))},u=()=>{if(e.isOpen()){for(let e of Tt)document.documentElement.removeAttribute(e);document.documentElement.setAttribute(wt,``),document.dispatchEvent(new CustomEvent(ct,{detail:Et})),m()}else document.documentElement.removeAttribute(wt);a.setVisible(e.isOpen())},d=t=>{t.detail!==Et&&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(ct,d);let b=e.subscribe(u);return c(),u(),document.addEventListener(kt,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(ct,d),document.removeEventListener(kt,l),h.disconnect(),b(),document.documentElement.removeAttribute(wt),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 Pt=`dsh-tiddlywiki/editor-popup`;let k,Ft,It,Lt,Rt,zt;function Bt(e,t){Kt(),!(k===void 0||Ft===void 0)&&(It!==void 0&&(It.textContent=`TiddlyWiki 编辑器 · ${t}`),k.style.display=``,document.dispatchEvent(new CustomEvent(ct,{detail:Pt})),(Ft.dataset.loaded!==e||Ht())&&(Ft.dataset.loaded=e,Ft.src=e),Ut())}function Vt(){return k!==void 0&&k.style.display!==`none`}function Ht(){if(Ft===void 0)return!1;let e=null;try{e=Ft.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 Ut(){k!==void 0&&k.querySelector(`button, [href], input, select, textarea, iframe, [tabindex]:not([tabindex="-1"])`)?.focus()}function Wt(){k!==void 0&&(k.style.display=`none`),Ft!==void 0&&(Ft.dataset.loaded=``)}function Gt(){Lt?.(),Lt=void 0,Rt!==void 0&&(document.removeEventListener(`keydown`,Rt),Rt=void 0),zt!==void 0&&(document.removeEventListener(ct,zt),zt=void 0),k?.remove(),k=void 0,Ft=void 0,It=void 0}function Kt(){if(k!==void 0&&Ft!==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`,It=document.createElement(`span`),It.className=`dsh-tw-editor-title`,It.textContent=`TiddlyWiki 编辑器`;let t=document.createElement(`button`);t.type=`button`,t.className=`dsh-tw-editor-close`,t.textContent=`✕`,t.title=`关闭`,e.append(It,t),Ft=document.createElement(`iframe`),Ft.className=`dsh-tw-editor-frame`,Ft.setAttribute(`sandbox`,`allow-scripts allow-same-origin allow-forms allow-popups`),Ft.title=`TiddlyWiki 编辑器`,Lt=st(Ft);let n=document.createElement(`div`);n.className=`dsh-tw-editor-resize`,n.title=`拖拽调整大小`,k.append(e,Ft,n),document.body.append(k),t.addEventListener(`click`,()=>Wt()),Rt=e=>{e.key===`Escape`&&Vt()&&Wt()},document.addEventListener(`keydown`,Rt),zt=e=>{e.detail!==Pt&&Vt()&&Wt()},document.addEventListener(ct,zt),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 qt=[],Jt=[];(()=>{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?Jt:qt).push(n+=e[t])})();function Yt(e){if(e<768)return!1;for(let t=0,n=qt.length;;){let r=t+n>>1;if(e<qt[r])n=r;else if(e>=Jt[r])t=r+1;else return!0;if(t==n)return!1}}function Xt(e){return e>=127462&&e<=127487}const Zt=8205;function Qt(e,t,n=!0,r=!0){return(n?$t:en)(e,t,r)}function $t(e,t,n){if(t==e.length)return t;t&&nn(e.charCodeAt(t))&&rn(e.charCodeAt(t-1))&&t--;let r=tn(e,t);for(t+=an(r);t<e.length;){let i=tn(e,t);if(r==Zt||i==Zt||n&&Yt(i))t+=an(i),r=i;else if(Xt(i)){let n=0,r=t-2;for(;r>=0&&Xt(tn(e,r));)n++,r-=2;if(n%2==0)break;t+=2}else break}return t}function en(e,t,n){for(;t>1;){let r=$t(e,t-2,n);if(r<t)return r;t--}return 0}function tn(e,t){let n=e.charCodeAt(t);if(!rn(n)||t+1==e.length)return n;let r=e.charCodeAt(t+1);return nn(r)?(n-55296<<10)+(r-56320)+65536:n}function nn(e){return e>=56320&&e<57344}function rn(e){return e>=55296&&e<56320}function an(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]=hn(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),sn.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]=hn(this,e,t);let n=[];return this.decompose(e,t,n,0),sn.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 dn(this),i=new dn(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 dn(this,e)}iterRange(e,t=this.length){return new fn(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 pn(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 on(t):sn.from(on.split(t,[]))}},on=class e extends A{constructor(e,t=cn(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 mn(r,o,n,a);r=o+1,n++}}decompose(t,n,r,i){let a=t<=0&&n>=this.length?this:new e(un(this.text,t,n),Math.min(n,this.length)-Math.max(0,t));if(i&1){let t=r.pop(),n=ln(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]=hn(this,t,n);let i=ln(this.text,ln(r.text,un(this.text,0,t)),n),a=this.length+r.length-(n-t);return i.length<=32?new e(i,a):sn.from(e.split(i,[]),a)}sliceString(e,t=this.length,n=`
794
+ `;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`,C=`${p}/upload`,ee=`${p}/sync`,te=`${p}/restart`,w=`${p}/session/summary`,ne=`${p}/admin/state`,re=`${p}/admin/prompt`,T=`${p}/admin/info`,ie=`${p}/admin/config`,E=`${p}/admin/restart`,ae=`${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}const Te=`dsh-tiddlywiki.focusWiki`;function Ee(){try{let e=window.localStorage.getItem(Te);return e!==null&&e.length>0?e:void 0}catch{return}}let De=Ee();const Oe=new Set;function ke(){return De}function Ae(e){if(e!==De){De=e;try{e===void 0?window.localStorage.removeItem(Te):window.localStorage.setItem(Te,e)}catch{}for(let t of[...Oe])t(e)}}function je(e){return Oe.add(e),()=>{Oe.delete(e)}}function Me(e,t){return e.length===0||De!==void 0&&e.some(e=>e.id===De)?De:t!==void 0&&e.some(e=>e.id===t)?t:e[0]?.id}const Ne={book:`<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="M3.5 3h9v10h-9z"/><path d="M6.5 3v10"/><path d="M8.5 6h2.5M8.5 8.5h2"/></svg>`,briefcase:`<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="M2.5 5.5h11v7h-11z"/><path d="M6 5.5V4a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v1.5"/><path d="M2.5 8.5h11"/></svg>`,home:`<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="M2.5 7.5 8 3l5.5 4.5"/><path d="M4 7v6h8V7"/></svg>`,notebook:`<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.5h7.5v11H4z"/><path d="M6 2.5v11"/><path d="M8 6h2M8 8.5h2"/></svg>`,flask:`<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="M6.5 2.5v4L3.5 12a1 1 0 0 0 .9 1.5h7.2A1 1 0 0 0 12.5 12L9.5 6.5v-4"/><path d="M5.5 2.5h5"/><path d="M4.8 10h6.4"/></svg>`,globe:`<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"><circle cx="8" cy="8" r="5.5"/><path d="M2.5 8h11"/><path d="M8 2.5c1.6 1.6 2.4 3.5 2.4 5.5S9.6 12 8 13.5C6.4 12 5.6 10 5.6 8s.8-3.9 2.4-5.5z"/></svg>`,star:`<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="m8 2.5 1.7 3.6 3.8.5-2.8 2.7.7 3.9L8 11.4l-3.4 1.8.7-3.9-2.8-2.7 3.8-.5z"/></svg>`,archive:`<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="M2.5 3.5h11v3h-11z"/><path d="M3.5 6.5v6h9v-6"/><path d="M6.5 9h3"/></svg>`},Pe=Object.keys(Ne);function Fe(e){return Object.prototype.hasOwnProperty.call(Ne,e)}function Ie(e,t){if(t!==void 0&&Fe(t)){e.innerHTML=Ne[t]??`<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>`,e.classList.remove(`dsh-tw-entry-emoji`);return}if(t!==void 0&&t.trim().length>0){e.textContent=t.trim(),e.classList.add(`dsh-tw-entry-emoji`);return}e.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>`,e.classList.remove(`dsh-tw-entry-emoji`)}function Le(){let e=document.querySelector(`[data-pane="sidebar"], [class*="sidebarCol"], .dshDesktopUpstreamSidebar, .dshDesktopSidebarSurface`);if(e!==null)return e.querySelector(`[class*="logoRow"]`)?.parentElement??e.firstElementChild}function Re(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 ze(e,t,n,r){let i=document.createElement(`button`);i.type=`button`,i.dataset.dshTwEntry=``,i.className=`dsh-tw-entry`,n!==void 0&&(i.dataset.wiki=n),i.setAttribute(`aria-label`,`TiddlyWiki 知识库:${t}`);let a=document.createElement(`span`);a.className=`dsh-tw-entry-icon`,Ie(a,r);let o=document.createElement(`span`);return o.className=`dsh-tw-entry-label`,o.textContent=t,i.append(a,o),i.addEventListener(`click`,()=>{n!==void 0&&Ae(n),e.toggle()}),{entry:i,labelEl:o,iconEl:a}}function Be(e,t){try{let n=Re(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 Ve(e){let t=new Map,{entry:n,labelEl:r,iconEl:i}=ze(e,`TiddlyWiki`);t.set(``,{entry:n,labelEl:r,iconEl:i});let a=!1,o=async()=>{let e=await we();a||e.sidebarLabel.length===0||(r.textContent=e.sidebarLabel,n.setAttribute(`aria-label`,e.sidebarLabel))};o();let s=Se(()=>{o()}),c=async()=>{let r=await _e();if(a)return;let i=(Array.isArray(r?.wikis)?r.wikis:[]).filter(e=>e.running);if(i.length<=1){for(let[e,n]of t)e!==``&&(n.entry.remove(),t.delete(e));n.hidden=!1;return}n.hidden=!0;let o=new Set(i.map(e=>e.id));for(let[e,n]of t)e===``||o.has(e)||(n.entry.remove(),t.delete(e));for(let n of i){let a=t.get(n.id);a===void 0&&(a=ze(e,n.label,n.id,n.icon),t.set(n.id,a)),a.labelEl.textContent=n.label,Ie(a.iconEl,n.icon),a.entry.setAttribute(`aria-label`,`TiddlyWiki 知识库:${n.label}`),Me(i,r?.defaultId)===n.id?a.entry.dataset.focus=`true`:delete a.entry.dataset.focus}d!==void 0&&(f=!1,v())};c();let l=je(()=>{c()}),u=window.setInterval(()=>{c()},1e4),d,f=!1,p,m=0,h=()=>{p!==void 0&&(clearInterval(p),p=void 0)},g=()=>{p===void 0&&(m=15,p=setInterval(()=>{v(),m--,(f||m<=0)&&h()},2e3))},_=()=>[...t.values()].map(e=>e.entry).filter(e=>!e.hidden),v=()=>{if(d!==void 0&&!d.isConnected&&(b.disconnect(),d=void 0,f=!1,g()),f){if(_().every(e=>document.body.contains(e)))return;b.disconnect(),d=void 0,f=!1,g()}if(d??=Le(),d===void 0)return;let e=!1;for(let t of _())Be(d,t)&&(e=!0);f=e,f&&(h(),b.observe(d,{childList:!0,subtree:!0}))},y=new MutationObserver(()=>{v()});y.observe(document.body,{childList:!0,subtree:!0});let b=new MutationObserver(()=>{if(d===void 0||!d.isConnected){f=!1,g(),v();return}for(let e of _())d.contains(e)||Be(d,e)});g();let x=()=>{let t=Me(_().map(e=>({id:e.dataset.wiki??``})).filter(e=>e.id.length>0),void 0);for(let n of _()){let r=n.dataset.wiki,i=r===void 0?_().length===1:r===t;e.isOpen()&&i?n.dataset.active=`true`:delete n.dataset.active}},S=e.subscribe(x),C=je(x);return x(),v(),()=>{a=!0,clearInterval(p),window.clearInterval(u),y.disconnect(),b.disconnect(),S(),s(),l(),C();for(let e of t.values())e.entry.remove();t.clear()}}const He=`$:/palettes/CupertinoDark`,Ue=`$:/palettes/Vanilla`,We=`data-ds-dark-theme`,Ge=`$:/palette`,Ke=new Set,qe=new WeakSet;let Je=``,Ye=!0,Xe=He;function Ze(){try{let e=document.documentElement,t=document.body;if(t!==null&&t.hasAttribute(We))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 Qe(e){try{let t=e.wiki.getTiddlerText(Ge);return typeof t==`string`&&t.trim().length>0?t.trim():Ue}catch{return Ue}}function $e(e){try{let t=e.wiki.getTiddler(Qe(e))?.fields;return t!==void 0&&t[`color-scheme`]===`dark`}catch{return!1}}function et(e){try{let t=e.syncer;if(t?.tiddlerInfo===void 0)return;let n=e.wiki.getChangeCount(Ge),r=t.tiddlerInfo[Ge];r===void 0?t.tiddlerInfo[Ge]={changeCount:n}:r.changeCount=n}catch{}}function tt(e){try{let t=e.syncer,n=t?.syncadaptor;if(t===void 0||n===void 0||qe.has(t))return;let r=n.saveTiddler.bind(n);n.saveTiddler=(e,t)=>{if(Ye&&Je.length>0&&e?.fields?.title===Ge&&e?.fields?.text===Xe){t(null,{},0);return}r(e,t)},qe.add(t)}catch{}}function nt(e,t){try{if(Qe(e)===t)return;e.wiki.setText(Ge,`text`,void 0,t),et(e)}catch{}}function rt(e,t){let n=Qe(e);if(t){if($e(e))return;n!==Xe&&(Je=n),nt(e,Xe)}else $e(e)&&n===Xe&&Je.length>0&&nt(e,Je)}function it(e,t){try{let n=t.contentDocument?.documentElement;if(n==null)return;let r=$e(e)?`dark`:`light`;n.style.getPropertyValue(`color-scheme`)!==r&&n.style.setProperty(`color-scheme`,r)}catch{}}function at(e){try{let t=e.contentWindow?.$tw;if(t===void 0||t.wiki===void 0)return;tt(t),Ye?rt(t,Ze()):rt(t,!1),it(t,e)}catch{}}function ot(e){let t=e.enabled!==!1,n=typeof e.darkPalette==`string`&&e.darkPalette.trim().length>0?e.darkPalette.trim():He,r=t!==Ye||n!==Xe;if(Ye=t,Xe=n,r)for(let e of[...Ke])e()}function st(e){if(e===null)return()=>{};let t=()=>at(e);Ke.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:[We]}),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(),()=>{Ke.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 ct=`dsh-panel-activate`,lt=`dsh-tw-panel-reload`;let ut=`知识库`;function dt(e){let t=typeof e==`string`?e.trim():``;t.length>0&&(ut=t)}function ft(){return ut}async function pt(){try{return(await fetch(te,{method:`POST`,signal:AbortSignal.timeout(8e3)})).ok}catch{return!1}}function mt({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 ht(e){let t=e.loaded;return t===void 0||t.length===0?null:t}function gt(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=`重启中…`,pt().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=ht(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&&(dt(e.ui.tabLabel??ut),ot({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=ht(o.dataset);e!==null&&(o.src=e)};document.addEventListener(lt,x);let S=je(()=>{!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=st(i),n&&b(),t},setVisible(e){i||(n=e,e&&!r&&(r=!0),o!==void 0&&(o.hidden=!e||ht(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(lt,x),S(),m();for(let e of l)window.clearTimeout(e);l.clear(),p?.(),a?.remove()}}}}function _t(){return{setVisible(){},openTiddler(){return!1},dispose(){}}}const vt=new Set;function yt(e){for(let t of vt)if(t.openTiddler(e))return!0;return!1}function bt(){_e().then(e=>{e?.ui!==void 0&&dt(e.ui.tabLabel??ut)})}const xt={view:`dsh-tw-rightbar-view`,frameWrap:`dsh-tw-rightbar-frame-wrap`,frame:`dsh-tw-rightbar-frame`,error:`dsh-tw-rightbar-error`};function St(e,t){if(t.aborted)return _t();let n=gt(xt,{wikiId:ke});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,vt.delete(a),t.removeEventListener(`abort`,i),n.dispose())}};return vt.add(a),a}const Ct=[`[class*="centerCol"]`,`[data-pane="conversation"]`,`.dshDesktopConversationSurface`],wt=`data-dsh-tw-active`,Tt=[`data-dsh-atb-active`,`data-dsh-taskboard-active`,`data-dsh-ssh-active`],Et=`dsh-tiddlywiki`,Dt=`[data-dsh-panel-host]`,Ot={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`},kt=`dsh-tw-open-tiddler`;function At(e){typeof document>`u`||typeof e!=`string`||e.length===0||document.dispatchEvent(new CustomEvent(kt,{detail:{title:e}}))}function jt(){let e=document.querySelector(Dt);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 Mt(){for(let e of Ct){let t=document.querySelector(e);if(t!==null)return t}}function Nt(e){let t,n,r=!1,i,a=gt(Ot,{wikiId:ke}),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(Dt)!==null;!n&&!e.isOpen()&&r===i||(i=r,t.style.zIndex=String(jt()),r?t.dataset.sidebarHost=`1`:delete t.dataset.sidebarHost)},c=()=>{(n===void 0||!n.isConnected)&&(n=Mt()),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&&(yt(r)||(e.openPanel(),a.openTiddler(r)))},u=()=>{if(e.isOpen()){for(let e of Tt)document.documentElement.removeAttribute(e);document.documentElement.setAttribute(wt,``),document.dispatchEvent(new CustomEvent(ct,{detail:Et})),m()}else document.documentElement.removeAttribute(wt);a.setVisible(e.isOpen())},d=t=>{t.detail!==Et&&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(ct,d);let b=e.subscribe(u);return c(),u(),document.addEventListener(kt,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(ct,d),document.removeEventListener(kt,l),h.disconnect(),b(),document.documentElement.removeAttribute(wt),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 Pt=`dsh-tiddlywiki/editor-popup`;let k,Ft,It,Lt,Rt,zt;function Bt(e,t){Kt(),!(k===void 0||Ft===void 0)&&(It!==void 0&&(It.textContent=`TiddlyWiki 编辑器 · ${t}`),k.style.display=``,document.dispatchEvent(new CustomEvent(ct,{detail:Pt})),(Ft.dataset.loaded!==e||Ht())&&(Ft.dataset.loaded=e,Ft.src=e),Ut())}function Vt(){return k!==void 0&&k.style.display!==`none`}function Ht(){if(Ft===void 0)return!1;let e=null;try{e=Ft.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 Ut(){k!==void 0&&k.querySelector(`button, [href], input, select, textarea, iframe, [tabindex]:not([tabindex="-1"])`)?.focus()}function Wt(){k!==void 0&&(k.style.display=`none`),Ft!==void 0&&(Ft.dataset.loaded=``)}function Gt(){Lt?.(),Lt=void 0,Rt!==void 0&&(document.removeEventListener(`keydown`,Rt),Rt=void 0),zt!==void 0&&(document.removeEventListener(ct,zt),zt=void 0),k?.remove(),k=void 0,Ft=void 0,It=void 0}function Kt(){if(k!==void 0&&Ft!==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`,It=document.createElement(`span`),It.className=`dsh-tw-editor-title`,It.textContent=`TiddlyWiki 编辑器`;let t=document.createElement(`button`);t.type=`button`,t.className=`dsh-tw-editor-close`,t.textContent=`✕`,t.title=`关闭`,e.append(It,t),Ft=document.createElement(`iframe`),Ft.className=`dsh-tw-editor-frame`,Ft.setAttribute(`sandbox`,`allow-scripts allow-same-origin allow-forms allow-popups`),Ft.title=`TiddlyWiki 编辑器`,Lt=st(Ft);let n=document.createElement(`div`);n.className=`dsh-tw-editor-resize`,n.title=`拖拽调整大小`,k.append(e,Ft,n),document.body.append(k),t.addEventListener(`click`,()=>Wt()),Rt=e=>{e.key===`Escape`&&Vt()&&Wt()},document.addEventListener(`keydown`,Rt),zt=e=>{e.detail!==Pt&&Vt()&&Wt()},document.addEventListener(ct,zt),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 qt=[],Jt=[];(()=>{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?Jt:qt).push(n+=e[t])})();function Yt(e){if(e<768)return!1;for(let t=0,n=qt.length;;){let r=t+n>>1;if(e<qt[r])n=r;else if(e>=Jt[r])t=r+1;else return!0;if(t==n)return!1}}function Xt(e){return e>=127462&&e<=127487}const Zt=8205;function Qt(e,t,n=!0,r=!0){return(n?$t:en)(e,t,r)}function $t(e,t,n){if(t==e.length)return t;t&&nn(e.charCodeAt(t))&&rn(e.charCodeAt(t-1))&&t--;let r=tn(e,t);for(t+=an(r);t<e.length;){let i=tn(e,t);if(r==Zt||i==Zt||n&&Yt(i))t+=an(i),r=i;else if(Xt(i)){let n=0,r=t-2;for(;r>=0&&Xt(tn(e,r));)n++,r-=2;if(n%2==0)break;t+=2}else break}return t}function en(e,t,n){for(;t>1;){let r=$t(e,t-2,n);if(r<t)return r;t--}return 0}function tn(e,t){let n=e.charCodeAt(t);if(!rn(n)||t+1==e.length)return n;let r=e.charCodeAt(t+1);return nn(r)?(n-55296<<10)+(r-56320)+65536:n}function nn(e){return e>=56320&&e<57344}function rn(e){return e>=55296&&e<56320}function an(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]=hn(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),sn.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]=hn(this,e,t);let n=[];return this.decompose(e,t,n,0),sn.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 dn(this),i=new dn(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 dn(this,e)}iterRange(e,t=this.length){return new fn(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 pn(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 on(t):sn.from(on.split(t,[]))}},on=class e extends A{constructor(e,t=cn(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 mn(r,o,n,a);r=o+1,n++}}decompose(t,n,r,i){let a=t<=0&&n>=this.length?this:new e(un(this.text,t,n),Math.min(n,this.length)-Math.max(0,t));if(i&1){let t=r.pop(),n=ln(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]=hn(this,t,n);let i=ln(this.text,ln(r.text,un(this.text,0,t)),n),a=this.length+r.length-(n-t);return i.length<=32?new e(i,a):sn.from(e.split(i,[]),a)}sliceString(e,t=this.length,n=`
795
795
  `){[e,t]=hn(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}},sn=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]=hn(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=`
796
796
  `){[e,t]=hn(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 on(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 on&&c&&(n=u[u.length-1])instanceof on&&t.lines+n.lines<=32?(c+=t.lines,l+=t.length+1,u[u.length-1]=new on(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 on([``],0);function cn(e){let t=-1;for(let n of e)t+=n.length+1;return t}function ln(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 un(e,t,n){return ln(e,[``],t,n)}var dn=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 on?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 on?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=`
797
797
  `,this;e--}else if(r instanceof on){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 on?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)}},fn=class{constructor(e,t,n){this.value=``,this.done=!1,this.cursor=new dn(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!=``}},pn=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()},dn.prototype[Symbol.iterator]=fn.prototype[Symbol.iterator]=pn.prototype[Symbol.iterator]=function(){return this});var mn=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 hn(e,t,n){return t=Math.max(0,Math.min(e.length,t)),[t,Math.max(t,Math.min(e.length,n))]}function gn(e,t,n=!0,r=!0){return Qt(e,t,n,r)}function _n(e){return e>=56320&&e<57344}function vn(e){return e>=55296&&e<56320}function yn(e,t){let n=e.charCodeAt(t);if(!vn(n)||t+1==e.length)return n;let r=e.charCodeAt(t+1);return _n(r)?(n-55296<<10)+(r-56320)+65536:n}function bn(e){return e<65536?1:2}const xn=/\r\n?|\n/;var Sn=(function(e){return e[e.Simple=0]=`Simple`,e[e.TrackDel=1]=`TrackDel`,e[e.TrackBefore=2]=`TrackBefore`,e[e.TrackAfter=3]=`TrackAfter`,e})(Sn||={}),Cn=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){Dn(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:kn(this,e)}mapDesc(e,t=!1){return e.empty?this:On(this,e,t)}mapPos(e,t=-1,n=Sn.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!=Sn.Simple&&c>=e&&(n==Sn.TrackDel&&r<e&&c>e||n==Sn.TrackBefore&&r<e||n==Sn.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)}},wn=class e extends Cn{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 Dn(this,(t,n,r,i,a)=>e=e.replace(r,r+(n-t),a),!1),e}mapDesc(e,t=!1){return On(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:kn(this,e,!0)}map(e,t=!1){return e.empty?this:On(this,e,t,!0)}iterChanges(e,t=!1){Dn(this,e,t)}get desc(){return Cn.create(this.sections)}filter(t){let n=[],r=[],i=[],a=new An(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);Tn(i,e,-1);let t=a.ins==-1?-1:a.off==0?a.ins:0;Tn(n,e,t),t>0&&En(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);Tn(n,e,-1),Tn(i,e,a.ins==-1?-1:a.off==0?a.ins:0),a.forward(e),o+=e}}return{changes:new e(n,r),filtered:Cn.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&&Tn(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||xn)):l:A.empty,d=u.length;if(e==s&&d==0)return;e<o&&c(),e>o&&Tn(i,e-o,-1),Tn(i,s-e,d),En(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 Tn(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 En(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 Dn(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 On(e,t,n,r=!1){let i=[],a=r?[]:null,o=new An(e),s=new An(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);Tn(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(Tn(i,s.ins,-1);t;){let n=Math.min(o.len,t);o.ins>=0&&e<o.i&&o.len<=n&&(Tn(i,0,o.ins),a&&En(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;Tn(i,t,e<o.i?o.ins:0),a&&e<o.i&&En(a,i,o.text),e=o.i,o.forward(o.len-n)}else if(o.done&&s.done)return a?wn.createSet(i,a):Cn.create(i);else throw Error(`Mismatched change set lengths`)}function kn(e,t,n=!1){let r=[],i=n?[]:null,a=new An(e),o=new An(t);for(let e=!1;;)if(a.done&&o.done)return i?wn.createSet(r,i):Cn.create(r);else if(a.ins==0)Tn(r,a.len,0,e),a.next();else if(o.len==0&&!o.done)Tn(r,0,o.ins,e),i&&En(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;Tn(r,t,n,e),i&&n&&En(i,r,o.text)}else o.ins==-1?(Tn(r,a.off?0:a.len,t,e),i&&En(i,r,a.textBit(t))):(Tn(r,a.off?0:a.len,o.off?0:o.ins,e),i&&!o.off&&En(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 An=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)}},jn=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=>jn.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 jn.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?jn.create(t,e,a|32,n):jn.create(e,t,a,n)}static undirectionalRange(e,t){return jn.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 Mn(e,t){for(let n of e.ranges)if(n.to>t)throw RangeError(`Selection points outside of document`)}let Nn=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=Nn++,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:Pn),!!t.static,t.enables)}of(e){return new Fn([],this,0,e)}compute(e,t){if(this.isStatic)throw Error(`Can't compute a static facet`);return new Fn(e,this,1,t)}computeN(e,t){if(this.isStatic)throw Error(`Can't compute a static facet`);return new Fn(e,this,2,t)}from(e,t){return t||=e=>e,this.compute([e],n=>t(n.field(e)))}};function Pn(e,t){return e==t||e.length==t.length&&e.every((e,n)=>e===t[n])}var Fn=class{constructor(e,t,n,r){this.dependencies=e,this.facet=t,this.type=n,this.value=r,this.id=Nn++}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)||Ln(e,c)){let r=t(e);if(a?!In(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=Xn(o,c);if(this.dependencies.every(t=>t instanceof M?o.facet(t)===e.facet(t):t instanceof Bn?o.field(t,!1)==e.field(t,!1):!0)||(a?In(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 In(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 Ln(e,t){let n=!1;for(let r of t)Yn(e,r)&1&&(n=!0);return n}function Rn(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=Xn(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)Yn(e,t);return e.values[o]=s(e),1},update(e,n){if(!Ln(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=Ln(e,r),c=i.config.facets[t.id],l=i.facet(t);if(c&&!a&&Pn(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 zn=M.define({static:!0});var Bn=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(Nn++,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(zn).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(zn),i=n.facet(zn),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,zn.of({field:this,create:e})]}get extension(){return this}};const Vn={lowest:4,low:3,default:2,high:1,highest:0};function Hn(e){return t=>new Wn(t,e)}const Un={highest:Hn(Vn.highest),high:Hn(Vn.high),default:Hn(Vn.default),low:Hn(Vn.low),lowest:Hn(Vn.lowest)};var Wn=class{constructor(e,t){this.inner=e,this.prec=t}get extension(){return this}},Gn=class e{of(e){return new Kn(this,e)}reconfigure(t){return e.reconfigure.of({compartment:this,extension:t})}get(e){return e.config.compartments.get(this)}},Kn=class{constructor(e,t){this.compartment=e,this.inner=t}get extension(){return this}},qn=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 Jn(t,n,o))e instanceof Bn?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,Pn(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=>Rn(e,n,t))}}let d=l.map(e=>e(s));return new e(t,o,d,s,c,a)}};function Jn(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 Kn&&n.delete(e.compartment)}if(i.set(e,o),Array.isArray(e))for(let t of e)a(t,o);else if(e instanceof Kn){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 Wn)a(e.inner,e.prec);else if(e instanceof Bn)r[o].push(e),e.provides&&a(e.provides,o);else if(e instanceof Fn)r[o].push(e),e.facet.extensions&&a(e.facet.extensions,Vn.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,Vn.default),r.reduce((e,t)=>e.concat(t))}function Yn(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 Xn(e,t){return t&1?e.config.staticValues[t>>1]:e.values[t>>1]}const Zn=M.define(),Qn=M.define({combine:e=>e.some(e=>e),static:!0}),$n=M.define({combine:e=>e.length?e[0]:void 0,static:!0}),er=M.define(),tr=M.define(),nr=M.define(),rr=M.define({combine:e=>e.length?e[0]:!1});var ir=class{constructor(e,t){this.type=e,this.value=t}static define(){return new ar}},ar=class{of(e){return new ir(this,e)}},or=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 or(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 sr=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&&Mn(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]==`.`))}};sr.time=ir.define(),sr.userEvent=ir.define(),sr.addToHistory=ir.define(),sr.remote=ir.define();function cr(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 lr(e,t,n){let r,i,a;return n?(r=t.changes,i=wn.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 ur(e,t,n){let r=t.selection,i=hr(t.annotations);return t.userEvent&&(i=i.concat(sr.userEvent.of(t.userEvent))),{changes:t.changes instanceof wn?t.changes:wn.of(t.changes||[],n,e.facet($n)),selection:r&&(r instanceof j?r:j.single(r.anchor,r.head)),effects:hr(t.effects),annotations:i,scrollIntoView:!!t.scrollIntoView}}function dr(e,t,n){let r=ur(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=lr(r,ur(e,t[i],a?r.changes.newLength:e.doc.length),a)}let i=sr.create(e,r.changes,r.selection,r.effects,r.annotations,r.scrollIntoView);return pr(n?fr(i):i)}function fr(e){let t=e.startState,n=!0;for(let r of t.facet(er)){let t=r(e);if(t===!1){n=!1;break}Array.isArray(t)&&(n=n===!0?t:cr(n,t))}if(n!==!0){let r,i;if(n===!1)i=e.changes.invertedDesc,r=wn.empty(t.doc.length);else{let t=e.changes.filter(n);r=t.changes,i=t.filtered.mapDesc(t.changes).invertedDesc}e=sr.create(t,r,e.selection&&e.selection.map(i),N.mapEffects(e.effects,i),e.annotations,e.scrollIntoView)}let r=t.facet(tr);for(let n=r.length-1;n>=0;n--){let i=r[n](e);e=i instanceof sr?i:Array.isArray(i)&&i.length==1&&i[0]instanceof sr?i[0]:dr(t,hr(i),!1)}return e}function pr(e){let t=e.startState,n=t.facet(nr),r=e;for(let i=n.length-1;i>=0;i--){let a=n[i](e);a&&Object.keys(a).length&&(r=lr(r,ur(t,a,e.changes.newLength),!0))}return r==e?e:sr.create(t,e.changes,e.selection,r.effects,r.annotations,r.scrollIntoView)}const mr=[];function hr(e){return e==null?mr:Array.isArray(e)?e:[e]}var gr=(function(e){return e[e.Word=0]=`Word`,e[e.Space=1]=`Space`,e[e.Other=2]=`Other`,e})(gr||={});const _r=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;let vr;try{vr=RegExp(`[\\p{Alphabetic}\\p{Number}_]`,`u`)}catch{}function yr(e){if(vr)return vr.test(e);for(let t=0;t<e.length;t++){let n=e[t];if(/\w/.test(n)||n>`€`&&(n.toUpperCase()!=n.toLowerCase()||_r.test(n)))return!0}return!1}function br(e){return t=>{if(!/\S/.test(t))return gr.Space;if(yr(t))return gr.Word;for(let n=0;n<e.length;n++)if(t.indexOf(e[n])>-1)return gr.Word;return gr.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++)Yn(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 Yn(this,n),Xn(this,n)}update(...e){return dr(this,e,!0)}applyTransaction(t){let n=this.config,{base:r,compartments:i}=n;for(let e of t.effects)e.is(Gn.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=hr(r).concat(e.value));let a;n?a=t.startState.values.slice():(n=qn.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(Qn)?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=hr(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(hr(o.effects),l))}return{changes:r,selection:j.create(i,t.mainIndex),effects:a}}changes(t=[]){return t instanceof wn?t:wn.of(t,this.doc.length,this.facet(e.lineSeparator))}toText(t){return A.of(t.split(this.facet(e.lineSeparator)||xn))}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:(Yn(this,t),Xn(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 Bn&&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=qn.resolve(t.extensions||[],new Map),r=t.doc instanceof A?t.doc:A.of((t.doc||``).split(n.staticFacet(e.lineSeparator)||xn)),i=t.selection?t.selection instanceof j?t.selection:j.single(t.selection.anchor,t.selection.head):j.single(0);return Mn(i,r.length),n.staticFacet(Qn)||(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)||`
@@ -830,9 +830,9 @@ html[data-dsh-tw-active] .dshDesktopConversationSurface > :not([data-dsh-tw-view
830
830
  }`,{label:`enum`,detail:`definition`,type:`keyword`})]),Kh=new $l,qh=new Set([`Script`,`Block`,`FunctionExpression`,`FunctionDeclaration`,`ArrowFunction`,`MethodDeclaration`,`ForStatement`]);function Jh(e){return(t,n)=>{let r=t.node.getChild(`VariableDefinition`);return r&&n(r,e),!0}}const Yh=[`FunctionDeclaration`],Xh={FunctionDeclaration:Jh(`function`),ClassDeclaration:Jh(`class`),ClassExpression:()=>!0,EnumDeclaration:Jh(`constant`),TypeAliasDeclaration:Jh(`type`),NamespaceDeclaration:Jh(`namespace`),VariableDefinition(e,t){e.matchContext(Yh)||t(e,`variable`)},TypeDefinition(e,t){t(e,`type`)},__proto__:null};function Zh(e,t){let n=Kh.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=Xh[t.name];if(e&&e(t,a)||qh.has(t.name))return!1}else if(t.to-t.from>8192){for(let n of Zh(e,t.node))r.push(n);return!1}}),Kh.set(t,r),r}const Qh=/^[\w$\xa1-\uffff][\w$\d\xa1-\uffff]*$/,$h=[`TemplateString`,`String`,`RegExp`,`LineComment`,`BlockComment`,`VariableDefinition`,`TypeDefinition`,`Label`,`PropertyDefinition`,`PropertyName`,`PrivatePropertyDefinition`,`PrivatePropertyName`,`JSXText`,`JSXAttributeValue`,`JSXOpenTag`,`JSXCloseTag`,`JSXSelfClosingTag`,`.`,`?.`];function eg(e){let t=Y(e.state).resolveInner(e.pos,-1);if($h.indexOf(t.name)>-1)return null;let n=t.name==`VariableName`||t.to-t.from<20&&Qh.test(e.state.sliceDoc(t.from,t.to));if(!n&&!e.explicit)return null;let r=[];for(let n=t;n;n=n.parent)qh.has(n.name)&&(r=r.concat(Zh(e.state.doc,n)));return{options:r,from:n?t.from:e.pos,validFor:Qh}}const tg=Xu.define({name:`javascript`,parser:Uh.configure({props:[md.add({IfStatement:Ed({except:/^\s*({|else\b)/}),TryStatement:Ed({except:/^\s*({|catch\b|finally\b)/}),LabeledStatement:Td,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:Cd({closing:`}`}),ArrowFunction:e=>e.baseIndent+e.unit,"TemplateString BlockComment":()=>null,"Statement Property":Ed({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}}),Od.add({"Block ClassBody SwitchBody EnumBody ObjectExpression ArrayExpression ObjectType":kd,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:`$`}}),ng={test:e=>/^JSX/.test(e.name),facet:Ku({commentTokens:{block:{open:`{/*`,close:`*/}`}}})},rg=tg.configure({dialect:`ts`},`typescript`),ig=tg.configure({dialect:`jsx`,props:[qu.add(e=>e.isTop?[ng]:void 0)]}),ag=tg.configure({dialect:`jsx ts`,props:[qu.add(e=>e.isTop?[ng]:void 0)]},`typescript`);let og=e=>({label:e,type:`keyword`});const sg=`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(og),cg=sg.concat([`declare`,`implements`,`private`,`protected`,`public`].map(og));function lg(e={}){let t=e.jsx?e.typescript?ag:ig:e.typescript?rg:tg,n=e.typescript?Gh.concat(cg):Wh.concat(sg);return new od(t,[tg.data.of({autocomplete:ef($h,$d(n))}),tg.data.of({autocomplete:eg}),e.jsx?pg:[]])}function ug(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 dg(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 fg=typeof navigator==`object`&&/Android\b/.test(navigator.userAgent),pg=H.inputHandler.of((e,t,n,r,i)=>{if((fg?e.composing:e.compositionStarted)||e.state.readOnly||t!=n||r!=`>`&&r!=`/`||!tg.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=dg(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=ug(n);if(r&&r.name==`JSXOpenTag`&&!/^\/?>|^<\//.test(o.doc.sliceString(t,t+2))&&(i=dg(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)}),mg=[`_blank`,`_self`,`_top`,`_parent`],hg=[`ascii`,`utf-8`,`utf-16`,`latin1`,`latin1`],gg=[`get`,`post`,`put`,`delete`],_g=[`application/x-www-form-urlencoded`,`multipart/form-data`,`text/plain`],vg=[`true`,`false`],Q={},yg={a:{attrs:{href:null,ping:null,type:null,media:null,target:mg,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:mg}},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:_g,formmethod:gg,formnovalidate:[`novalidate`],formtarget:mg,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":hg,autocomplete:[`on`,`off`],enctype:_g,method:gg,novalidate:[`novalidate`],target:mg}},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:_g,formmethod:gg,formnovalidate:[`novalidate`],formtarget:mg,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:hg,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:hg}},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},bg={accesskey:null,class:null,contenteditable:vg,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:vg,autocorrect:vg,autocapitalize:vg,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":vg,"aria-autocomplete":[`inline`,`list`,`both`,`none`],"aria-busy":vg,"aria-checked":[`true`,`false`,`mixed`,`undefined`],"aria-controls":null,"aria-describedby":null,"aria-disabled":vg,"aria-dropeffect":null,"aria-expanded":[`true`,`false`,`undefined`],"aria-flowto":null,"aria-grabbed":[`true`,`false`,`undefined`],"aria-haspopup":vg,"aria-hidden":vg,"aria-invalid":[`true`,`false`,`grammar`,`spelling`],"aria-label":null,"aria-labelledby":null,"aria-level":null,"aria-live":[`off`,`polite`,`assertive`],"aria-multiline":vg,"aria-multiselectable":vg,"aria-owns":null,"aria-posinset":null,"aria-pressed":[`true`,`false`,`mixed`,`undefined`],"aria-readonly":vg,"aria-relevant":null,"aria-required":vg,"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},xg=`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 xg)bg[e]=null;var Sg=class{constructor(e,t){this.tags={...yg,...e},this.globalAttrs={...bg,...t},this.allTags=Object.keys(this.tags),this.globalAttrNames=Object.keys(this.globalAttrs)}};Sg.default=new Sg;function Cg(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 wg(e,t=!1){for(;e;e=e.parent)if(e.name==`Element`)if(t)t=!1;else return e;return null}function Tg(e,t,n){return n.tags[Cg(e,wg(t))]?.children||n.allTags}function Eg(e,t){let n=[];for(let r=wg(t);r&&!r.type.isTop;r=wg(r.parent)){let i=Cg(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 Dg=/^[:\-\.\w\u00b7-\uffff]*$/;function Og(e,t,n,r,i){let a=/\s*>/.test(e.sliceDoc(i,i+5))?``:`>`,o=wg(n,n.name==`StartTag`||n.name==`TagName`);return{from:r,to:i,options:Tg(e.doc,o,t).map(e=>({label:e,type:`type`})).concat(Eg(e.doc,n).map((e,t)=>({label:`/`+e,apply:`/`+e+a,type:`type`,boost:99-t}))),validFor:/^\/?[:\-\.\w\u00b7-\uffff]*$/}}function kg(e,t,n,r){let i=/\s*>/.test(e.sliceDoc(r,r+5))?``:`>`;return{from:n,to:r,options:Eg(e.doc,t).map((e,t)=>({label:e,apply:e+i,type:`type`,boost:99-t})),validFor:Dg}}function Ag(e,t,n,r){let i=[],a=0;for(let r of Tg(e.doc,n,t))i.push({label:`<`+r,type:`type`});for(let t of Eg(e.doc,n))i.push({label:`</`+t+`>`,type:`type`,boost:99-a++});return{from:r,to:r,options:i,validFor:/^<\/?[:\-\.\w\u00b7-\uffff]*$/}}function jg(e,t,n,r,i){let a=wg(n),o=a?t.tags[Cg(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:Dg}}function Mg(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=wg(n),i=r?t.tags[Cg(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 Ng(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)?kg(n,i,i.from,r):Og(n,e,i,i.from,r):i.name==`StartTag`||i.name==`IncompleteTag`?Og(n,e,i,r,r):i.name==`StartCloseTag`||i.name==`IncompleteCloseTag`?kg(n,i,r,r):i.name==`OpenTag`||i.name==`SelfClosingTag`||i.name==`AttributeName`?jg(n,e,i,i.name==`AttributeName`?i.from:r,r):i.name==`Is`||i.name==`AttributeValue`||i.name==`UnquotedAttributeValue`?Mg(n,e,i,i.name==`Is`?r:i.from,r):t.explicit&&(a.name==`Element`||a.name==`Text`||a.name==`Document`)?Ag(n,e,i,r):null}function Pg(e){return Ng(Sg.default,e)}function Fg(e){let{extraTags:t,extraGlobalAttributes:n}=e,r=n||t?new Sg(t,n):Sg.default;return e=>Ng(r,e)}const Ig=tg.parser.configure({top:`SingleExpression`}),Lg=[{tag:`script`,attrs:e=>e.type==`text/typescript`||e.lang==`ts`,parser:rg.parser},{tag:`script`,attrs:e=>e.type==`text/babel`||e.type==`text/jsx`,parser:ig.parser},{tag:`script`,attrs:e=>e.type==`text/typescript-jsx`,parser:ag.parser},{tag:`script`,attrs(e){return/^(importmap|speculationrules|application\/(.+\+)?json)$/i.test(e.type)},parser:Ig},{tag:`script`,attrs(e){return!e.type||/^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^module$|^$/i.test(e.type)},parser:tg.parser},{tag:`style`,attrs(e){return(!e.lang||e.lang==`css`)&&(!e.type||/^(text\/)?(x-)?(stylesheet|css)$/i.test(e.type))},parser:kh.parser}],Rg=[{name:`style`,parser:kh.parser.configure({top:`Styles`})}].concat(xg.map(e=>({name:e,parser:tg.parser}))),zg=Xu.define({name:`html`,parser:Jm.configure({props:[md.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}}),Od.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}}}),Ld.add({"OpenTag CloseTag":e=>e.getChild(`TagName`)})]}),languageData:{commentTokens:{block:{open:`<!--`,close:`-->`}},indentOnInput:/^\s*<\/\w+\W$/,wordChars:`-_`}}),Bg=zg.configure({wrap:Qm(Lg,Rg)});function Vg(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=Qm((e.nestedLanguages||[]).concat(Lg),(e.nestedAttributes||[]).concat(Rg))),new od(n?zg.configure({wrap:n,dialect:t}):t?Bg.configure({dialect:t}):Bg,[Bg.data.of({autocomplete:Fg(e)}),e.autoCloseTags===!1?[]:Wg,lg().support,Ah().support])}const Hg=new Set(`area base br col command embed frame hr img input keygen link meta param source track wbr menuitem`.split(` `));function Ug(e,t,n){for(;;){if(t.lastChild?.name!=`CloseTag`)return!1;let r=t.parent;if(!r||Cg(e,r)!=n)return!0;t=r}}const Wg=H.inputHandler.of((e,t,n,r,i)=>{if(e.composing||e.state.readOnly||t!=n||r!=`>`&&r!=`/`||!Bg.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=Cg(o.doc,t.parent,n))&&!Hg.has(a)&&!Ug(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=Cg(o.doc,e,n))&&!Hg.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)}),Gg=Ku({commentTokens:{block:{open:`<!--`,close:`-->`}}}),Kg=new U,qg=Dp.configure({props:[Od.add(e=>!e.is(`Block`)||e.is(`Document`)||Jg(e)!=null||Yg(e)?void 0:(e,t)=>({from:t.doc.lineAt(e.from).to,to:e.to})),Kg.add(Jg),md.add({Document:()=>null}),Gu.add({Document:Gg})]});function Jg(e){let t=/^(?:ATX|Setext)Heading(\d)$/.exec(e.name);return t?+t[1]:void 0}function Yg(e){return e.name==`OrderedList`||e.name==`BulletList`}function Xg(e,t){let n=e;for(;;){let e=n.nextSibling,r;if(!e||(r=Jg(e.type))!=null&&r<=t)break;n=e}return n.to}const Zg=Dd.of((e,t,n)=>{for(let r=Y(e).resolveInner(n,-1);r&&!(r.from<t);r=r.parent){let e=r.type.prop(Kg);if(e==null)continue;let t=Xg(r,e);if(t>n)return{from:n,to:t}}return null});function Qg(e){return new Ju(Gg,e,[],`markdown`)}const $g=Qg(qg),e_=Qg(qg.configure([qp,Xp,Yp,Zp,{props:[Od.add({Table:(e,t)=>({from:t.doc.lineAt(e.from).to,to:e.to})})]}]));function t_(e,t){return n=>{if(n&&e){let t=null;if(n=/\S*/.exec(n)[0],t=typeof e==`function`?e(n):sd.matchLanguageName(e,n,!0),t instanceof sd)return t.support?t.support.language.parser:$u.getSkippingParser(t.load());if(t)return t.parser}return t?t.parser:null}}var n_=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(+i_(this.item,e)[2]+t):``;return this.spaceBefore+n+this.type+this.spaceAfter}};function r_(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 n_(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 n_(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 n_(i.parent,s,s+t,a[1],e,n,i))}}return r}function i_(e,t){return/^(\s*)(\d+)(?=[.)])/.exec(t.sliceString(e.from,e.from+10))}function a_(e,t,n,r=0){for(let i=-1,a=e;;){if(a.name==`ListItem`){let e=i_(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 o_(e,t){let n=/^[ \t]*/.exec(e)[0].length;if(!n||t.facet(ld)!=` `)return e;let r=Br(e,4,n),i=``;for(let e=r;e>0;)e>=4?(i+=` `,e-=4):(i+=` `,e--);return i+e.slice(n)}const s_=((e={})=>({state:t,dispatch:n})=>{let r=Y(t),{doc:i}=t,a=null,o=t.changeByRange(n=>{if(!n.empty||!e_.isActiveAt(t,n.from,-1)&&!e_.isActiveAt(t,n.from,1))return a={range:n};let o=n.from,s=i.lineAt(o),c=r_(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`&&a_(l.item,i,r,-2),e&&e.node.name==`OrderedList`&&a_(e.item,i,r),{range:j.cursor(t+n.length),changes:r}}else{let e=u_(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`&&a_(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?Br(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=o_(p,t),l_(l.node,t.doc)&&(p=u_(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 c_(e){return e.name==`QuoteMark`||e.name==`ListMark`}function l_(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 u_(e,t,n){let r=``;for(let t=0,i=e.length-2;t<=i;t++)r+=e[t].blank(t<i?Br(n.text,4,e[t+1].from)-r.length:null,t<i);return o_(r,t)}function d_(e,t){let n=e.resolveInner(t,-1),r=t;c_(n)&&(r=n.from,n=n.parent);for(let e;e=n.childBefore(r);)if(c_(e))r=e.from;else if(e.name==`OrderedList`||e.name==`BulletList`)n=e.lastChild,r=n.to;else break;return n}const f_=[{key:`Enter`,run:s_},{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&&e_.isActiveAt(e,t.from)){let t=a.lineAt(i),r=r_(d_(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(Br(t.text,4,n.to)-Br(t.text,4,n.from));return r==t.from&&(i=o_(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)}}],p_=Vg({matchClosingTags:!1});function m_(e={}){let{codeLanguages:t,defaultCodeLanguage:n,addKeymap:r=!0,base:{parser:i}=$g,completeHTMLTags:a=!0,pasteURLAsLink:o=!0,htmlTagLanguage:s=p_}=e;if(!(i instanceof tp))throw RangeError("Base parser provided to `markdown` should be a Markdown parser");let c=e.extensions?[e.extensions]:[],l=[s.support,Zg],u;o&&l.push(y_),n instanceof od?(l.push(n.support),u=n.language):n&&(u=n);let d=t||u?t_(t,u):void 0;c.push(kp({codeParser:d,htmlParser:s.language.parser})),r&&l.push(Un.high(el.of(f_)));let f=Qg(i.configure(c));return a&&l.push(f.data.of({autocomplete:h_})),new od(f,l)}function h_(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:__(),validFor:/^<[:\-\.\w\u00b7-\uffff]*$/}}let g_=null;function __(){if(g_)return g_;let e=Pg(new Xd(P.create({extensions:p_}),0,!0));return g_=e?e.options:[]}const v_=/code|horizontalrule|html|link|comment|processing|escape|entity|image|mark|url/i,y_=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),!e_.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||v_.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)}}),b_=e=>{let{state:t}=e,n=t.doc.lineAt(t.selection.main.from),r=T_(e.state,n.from);return r.line?S_(e):r.block?w_(e):!1};function x_(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 S_=x_(k_,0),C_=x_(O_,0),w_=x_((e,t)=>O_(e,t,D_(t)),0);function T_(e,t){let n=e.languageDataAt(`commentTokens`,t,1);return n.length?n[0]:{}}function E_(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 D_(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 O_(e,t,n=t.selection.ranges){let r=n.map(e=>T_(t,e.from).block);if(!r.every(e=>e))return null;let i=n.map((e,n)=>E_(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 k_(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=T_(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 A_=ir.define(),j_=ir.define(),M_=M.define(),N_=M.define({combine(e){return xr(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)})}}),P_=Bn.define({create(){return Q_.empty},update(e,t){let n=t.state.facet(N_),r=t.annotation(A_);if(r){let i=V_.fromTransaction(t,r.selection),a=r.side,o=a==0?e.undone:e.done;return o=i?H_(o,o.length,n.minDepth,i):q_(o,t.startState.selection),new Q_(a==0?r.rest:o,a==0?o:r.rest)}let i=t.annotation(j_);if((i==`full`||i==`before`)&&(e=e.isolate()),t.annotation(sr.addToHistory)===!1)return t.changes.empty?e:e.addMapping(t.changes.desc);let a=V_.fromTransaction(t),o=t.annotation(sr.time),s=t.annotation(sr.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 Q_(e.done.map(V_.fromJSON),e.undone.map(V_.fromJSON))}});function F_(e={}){return[P_,N_.of(e),H.domEventHandlers({beforeinput(e,t){let n=e.inputType==`historyUndo`?L_:e.inputType==`historyRedo`?R_:null;return n?(e.preventDefault(),n(t)):!1}})]}function I_(e,t){return function({state:n,dispatch:r}){if(!t&&n.readOnly)return!1;let i=n.field(P_,!1);if(!i)return!1;let a=i.pop(e,n,t);return a?(r(a),!0):!1}}const L_=I_(0,!1),R_=I_(1,!1),z_=I_(0,!0),B_=I_(1,!0);var V_=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&&wn.fromJSON(t.changes),[],t.mapped&&Cn.fromJSON(t.mapped),t.startSelection&&j.fromJSON(t.startSelection),t.selectionsAfter.map(j.fromJSON))}static fromTransaction(t,n){let r=K_;for(let e of t.startState.facet(M_)){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,K_)}static selection(t){return new e(void 0,K_,void 0,void 0,t)}};function H_(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 U_(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 W_(e,t){return e.ranges.length==t.ranges.length&&e.ranges.filter((e,n)=>e.empty!=t.ranges[n].empty).length===0}function G_(e,t){return e.length?t.length?e.concat(t):e:t}const K_=[];function q_(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),H_(e,e.length-1,1e9,n.setSelAfter(r)))}else return[V_.selection([t])]}function J_(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 Y_(e,t){if(!e.length)return e;let n=e.length,r=K_;for(;n;){let i=X_(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?[V_.selection(r)]:K_}function X_(e,t,n){let r=G_(e.selectionsAfter.length?e.selectionsAfter.map(e=>e.map(t)):K_,n);if(!e.changes)return V_.selection(r);let i=e.changes.map(t),a=t.mapDesc(e.changes,!0),o=e.mapped?e.mapped.composeDesc(a):a;return new V_(i,N.mapEffects(e.effects,t),o,e.startSelection.map(a),r)}const Z_=/^(input\.type|delete)($|\.)/;var Q_=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||Z_.test(r))&&(!s.selectionsAfter.length&&n-this.prevTime<i.newGroupDelay&&i.joinToEvent(a,U_(s.changes,t.changes))||r==`input.type.compose`)?H_(o,o.length-1,i.minDepth,new V_(t.changes.compose(s.changes),G_(N.mapEffects(t.effects,s.changes),s.effects),s.mapped,s.startSelection,K_)):H_(o,o.length,i.minDepth,t),new e(o,K_,n,r)}addSelection(t,n,r,i){let a=this.done.length?this.done[this.done.length-1].selectionsAfter:K_;return a.length>0&&n-this.prevTime<i&&r==this.prevUserEvent&&r&&/^select($|\.)/.test(r)&&W_(a[a.length-1],t)?this:new e(q_(this.done,t),this.undone,n,r)}addMapping(t){return new e(Y_(this.done,t),Y_(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:A_.of({side:e,rest:J_(r),selection:a}),userEvent:e==0?`select.undo`:`select.redo`,scrollIntoView:!0});if(i.changes){let n=r.length==1?K_:r.slice(0,r.length-1);return i.mapped&&(n=Y_(n,i.mapped)),t.update({changes:i.changes,selection:i.startSelection,effects:i.effects,annotations:A_.of({side:e,rest:n,selection:a}),filter:!1,userEvent:e==0?`undo`:`redo`,scrollIntoView:!0})}else return null}};Q_.empty=new Q_(K_,K_);const $_=[{key:`Mod-z`,run:L_,preventDefault:!0},{key:`Mod-y`,mac:`Mod-Shift-z`,run:R_,preventDefault:!0},{linux:`Ctrl-Shift-z`,run:R_,preventDefault:!0},{key:`Mod-u`,run:z_,preventDefault:!0},{key:`Alt-u`,mac:`Mod-Shift-u`,run:B_,preventDefault:!0}];function ev(e,t){return j.create(e.ranges.map(t),e.mainIndex)}function tv(e,t){return e.update({selection:t,scrollIntoView:!0,userEvent:`select`})}function nv({state:e,dispatch:t},n){let r=ev(e.selection,n);return r.eq(e.selection,!0)?!1:(t(tv(e,r)),!0)}function rv(e,t){return j.cursor(t?e.to:e.from)}function iv(e,t){return nv(e,n=>n.empty?e.moveByChar(n,t):rv(n,t))}function av(e){return e.textDirectionAt(e.state.selection.main.head)==R.LTR}const ov=e=>iv(e,!av(e)),sv=e=>iv(e,av(e));function cv(e,t){return nv(e,n=>n.empty?e.moveByGroup(n,t):rv(n,t))}const lv=e=>cv(e,!av(e)),uv=e=>cv(e,av(e));typeof Intl<`u`&&Intl.Segmenter;function dv(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 fv(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;dv(e,t,i)?r=t:a=n?t.to:t.from}let a=r.type.prop(i),o,s;return s=a&&(o=n?Bd(e,r.from,1):Bd(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 pv=e=>nv(e,t=>fv(e.state,t,!av(e))),mv=e=>nv(e,t=>fv(e.state,t,av(e)));function hv(e,t){return nv(e,n=>{if(!n.empty)return rv(n,t);let r=e.moveVertically(n,t);return r.head==n.head?e.moveToLineBoundary(n,t):r})}const gv=e=>hv(e,!1),_v=e=>hv(e,!0);function vv(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 yv(e,t){let n=vv(e),{state:r}=e,i=ev(r.selection,r=>r.empty?e.moveVertically(r,t,n.height):rv(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(tv(r,i),{effects:a}),!0}const bv=e=>yv(e,!1),xv=e=>yv(e,!0);function Sv(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 Cv=e=>nv(e,t=>Sv(e,t,!0)),wv=e=>nv(e,t=>Sv(e,t,!1)),Tv=e=>nv(e,t=>Sv(e,t,!av(e))),Ev=e=>nv(e,t=>Sv(e,t,av(e))),Dv=e=>nv(e,t=>j.cursor(e.lineBlockAt(t.head).from,1)),Ov=e=>nv(e,t=>j.cursor(e.lineBlockAt(t.head).to,-1));function kv(e,t,n){let r=!1,i=ev(e.selection,t=>{let i=Bd(e,t.head,-1)||Bd(e,t.head,1)||t.head>0&&Bd(e,t.head-1,1)||t.head<e.doc.length&&Bd(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(tv(e,i)),!0):!1}const Av=({state:e,dispatch:t})=>kv(e,t,!1);function jv(e,t,n){let r=ev(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(tv(e.state,r)),!0)}function Mv(e,t){return jv(e,t,n=>e.moveByChar(n,t))}const Nv=e=>Mv(e,!av(e)),Pv=e=>Mv(e,av(e));function Fv(e,t){return jv(e,t,n=>e.moveByGroup(n,t))}const Iv=e=>Fv(e,!av(e)),Lv=e=>Fv(e,av(e)),Rv=e=>{let t=!av(e);return jv(e,t,n=>fv(e.state,n,t))},zv=e=>{let t=av(e);return jv(e,t,n=>fv(e.state,n,t))};function Bv(e,t){return jv(e,t,n=>e.moveVertically(n,t))}const Vv=e=>Bv(e,!1),Hv=e=>Bv(e,!0);function Uv(e,t){return jv(e,t,n=>e.moveVertically(n,t,vv(e).height))}const Wv=e=>Uv(e,!1),Gv=e=>Uv(e,!0),Kv=e=>jv(e,!0,t=>Sv(e,t,!0)),qv=e=>jv(e,!1,t=>Sv(e,t,!1)),Jv=e=>{let t=!av(e);return jv(e,t,n=>Sv(e,n,t))},Yv=e=>{let t=av(e);return jv(e,t,n=>Sv(e,n,t))},Xv=e=>jv(e,!1,t=>j.cursor(e.lineBlockAt(t.head).from)),Zv=e=>jv(e,!0,t=>j.cursor(e.lineBlockAt(t.head).to)),Qv=({state:e,dispatch:t})=>(t(tv(e,{anchor:0})),!0),$v=({state:e,dispatch:t})=>(t(tv(e,{anchor:e.doc.length})),!0),ey=({state:e,dispatch:t})=>(t(tv(e,{anchor:e.selection.main.anchor,head:0})),!0),ty=({state:e,dispatch:t})=>(t(tv(e,{anchor:e.selection.main.anchor,head:e.doc.length})),!0),ny=({state:e,dispatch:t})=>(t(e.update({selection:{anchor:0,head:e.doc.length},userEvent:`select`})),!0),ry=({state:e,dispatch:t})=>{let n=Sy(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},iy=({state:e,dispatch:t})=>{let n=ev(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(tv(e,n)),!0)};function ay(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(tv(n,j.create(i,i.length-1))),!0)}const oy=e=>ay(e,!1),sy=e=>ay(e,!0),cy=({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(tv(e,r)),!0):!1};function ly(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=uy(e,o,!1)):o>i&&(n=`delete.forward`,o=uy(e,o,!0)),i=Math.min(i,o),a=Math.max(a,o)}else i=uy(e,i,!1),a=uy(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 uy(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 dy=(e,t,n)=>ly(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=Br(s,a.tabSize)%ud(a)||ud(a);for(let t=0;t<e&&s[s.length-1-t]==` `;t++)i--;c=i}else c=gn(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=gn(o.text,c-o.from,!1,!1)+o.from);return c}),fy=e=>dy(e,!1,!0),py=e=>dy(e,!0,!1),my=(e,t)=>ly(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=gn(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}),hy=e=>my(e,!1),gy=e=>my(e,!0),_y=e=>ly(e,t=>{let n=e.lineBlockAt(t.head).to;return t.head<n?n:Math.min(e.state.doc.length,t.head+1)}),vy=e=>ly(e,t=>{let n=e.moveToLineBoundary(t,!1).head;return t.head>n?n:Math.max(0,t.head-1)}),yy=e=>ly(e,t=>{let n=e.moveToLineBoundary(t,!0).head;return t.head<n?n:Math.min(e.state.doc.length,t.head+1)}),by=({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},xy=({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:gn(r.text,n-r.from,!1)+r.from,a=n==r.to?n+1:gn(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 Sy(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 Cy(e,t,n){if(e.readOnly)return!1;let r=[],i=[];for(let t of Sy(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 wy=({state:e,dispatch:t})=>Cy(e,t,!1),Ty=({state:e,dispatch:t})=>Cy(e,t,!0);function Ey(e,t,n){if(e.readOnly)return!1;let r=[];for(let t of Sy(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 Dy=({state:e,dispatch:t})=>Ey(e,t,!1),Oy=({state:e,dispatch:t})=>Ey(e,t,!0),ky=e=>{if(e.state.readOnly)return!1;let{state:t}=e,n=t.changes(Sy(t).map(({from:e,to:n})=>(e>0?e--:n<t.doc.length&&n++,{from:e,to:n}))),r=ev(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 Ay(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 jy=Ny(!1),My=Ny(!0);function Ny(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&&Ay(t,r);e&&(r=i=(i<=a.to?a:t.doc.lineAt(i)).to);let s=new pd(t,{simulateBreak:r,simulateDoubleBreak:!!o}),c=fd(s,r);for(c??=Br(/^\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=[``,dd(t,c)];return o&&l.push(dd(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 Py(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 Fy=({state:e,dispatch:t})=>{if(e.readOnly)return!1;let n=Object.create(null),r=new pd(e,{overrideIndentation:e=>n[e]??-1}),i=Py(e,(t,i,a)=>{let o=fd(r,t.from);if(o==null)return;/\S/.test(t.text)||(o=0);let s=/^\s*/.exec(t.text)[0],c=dd(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},Iy=({state:e,dispatch:t})=>e.readOnly?!1:(t(e.update(Py(e,(t,n)=>{n.push({from:t.from,insert:e.facet(ld)})}),{userEvent:`input.indent`})),!0),Ly=({state:e,dispatch:t})=>e.readOnly?!1:(t(e.update(Py(e,(t,n)=>{let r=/^\s*/.exec(t.text)[0];if(!r)return;let i=Br(r,e.tabSize),a=0,o=dd(e,Math.max(0,i-ud(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),Ry=e=>(e.setTabFocusMode(),!0),zy=[{key:`Ctrl-b`,run:ov,shift:Nv,preventDefault:!0},{key:`Ctrl-f`,run:sv,shift:Pv},{key:`Ctrl-p`,run:gv,shift:Vv},{key:`Ctrl-n`,run:_v,shift:Hv},{key:`Ctrl-a`,run:Dv,shift:Xv},{key:`Ctrl-e`,run:Ov,shift:Zv},{key:`Ctrl-d`,run:py},{key:`Ctrl-h`,run:fy},{key:`Ctrl-k`,run:_y},{key:`Ctrl-Alt-h`,run:hy},{key:`Ctrl-o`,run:by},{key:`Ctrl-t`,run:xy},{key:`Ctrl-v`,run:xv}],By=[{key:`ArrowLeft`,run:ov,shift:Nv,preventDefault:!0},{key:`Mod-ArrowLeft`,mac:`Alt-ArrowLeft`,run:lv,shift:Iv,preventDefault:!0},{mac:`Cmd-ArrowLeft`,run:Tv,shift:Jv,preventDefault:!0},{key:`ArrowRight`,run:sv,shift:Pv,preventDefault:!0},{key:`Mod-ArrowRight`,mac:`Alt-ArrowRight`,run:uv,shift:Lv,preventDefault:!0},{mac:`Cmd-ArrowRight`,run:Ev,shift:Yv,preventDefault:!0},{key:`ArrowUp`,run:gv,shift:Vv,preventDefault:!0},{mac:`Cmd-ArrowUp`,run:Qv,shift:ey},{mac:`Ctrl-ArrowUp`,run:bv,shift:Wv},{key:`ArrowDown`,run:_v,shift:Hv,preventDefault:!0},{mac:`Cmd-ArrowDown`,run:$v,shift:ty},{mac:`Ctrl-ArrowDown`,run:xv,shift:Gv},{key:`PageUp`,run:bv,shift:Wv},{key:`PageDown`,run:xv,shift:Gv},{key:`Home`,run:wv,shift:qv,preventDefault:!0},{key:`Mod-Home`,run:Qv,shift:ey},{key:`End`,run:Cv,shift:Kv,preventDefault:!0},{key:`Mod-End`,run:$v,shift:ty},{key:`Enter`,run:jy,shift:jy},{key:`Mod-a`,run:ny},{key:`Backspace`,run:fy,shift:fy,preventDefault:!0},{key:`Delete`,run:py,preventDefault:!0},{key:`Mod-Backspace`,mac:`Alt-Backspace`,run:hy,preventDefault:!0},{key:`Mod-Delete`,mac:`Alt-Delete`,run:gy,preventDefault:!0},{mac:`Mod-Backspace`,run:vy,preventDefault:!0},{mac:`Mod-Delete`,run:yy,preventDefault:!0}].concat(zy.map(e=>({mac:e.key,run:e.run,shift:e.shift}))),Vy=[{key:`Alt-ArrowLeft`,mac:`Ctrl-ArrowLeft`,run:pv,shift:Rv},{key:`Alt-ArrowRight`,mac:`Ctrl-ArrowRight`,run:mv,shift:zv},{key:`Alt-ArrowUp`,run:wy},{key:`Shift-Alt-ArrowUp`,run:Dy},{key:`Alt-ArrowDown`,run:Ty},{key:`Shift-Alt-ArrowDown`,run:Oy},{key:`Mod-Alt-ArrowUp`,run:oy},{key:`Mod-Alt-ArrowDown`,run:sy},{key:`Escape`,run:cy},{key:`Mod-Enter`,run:My},{key:`Alt-l`,mac:`Ctrl-l`,run:ry},{key:`Mod-i`,run:iy,preventDefault:!0},{key:`Mod-[`,run:Ly},{key:`Mod-]`,run:Iy},{key:`Mod-Alt-\\`,run:Fy},{key:`Shift-Mod-k`,run:ky},{key:`Shift-Mod-\\`,run:Av},{key:`Mod-/`,run:b_},{key:`Alt-A`,mac:`Ctrl-A`,run:C_},{key:`Ctrl-m`,mac:`Shift-Alt-m`,run:Ry}].concat(By),Hy=`var(--dsw-alias-brand-primary, #3e63dd)`,Uy=`color-mix(in srgb, var(--dsw-alias-brand-primary, #3e63dd) 55%, transparent)`,Wy=`var(--dsw-alias-label-dimmed, #999)`,Gy=`ui-monospace, "Cascadia Mono", Consolas, "SF Mono", Menlo, monospace`,Ky=Ad.define([{tag:[J.heading1,J.heading2,J.heading3,J.heading4,J.heading5,J.heading6],color:Hy,fontWeight:`700`},{tag:J.processingInstruction,color:Uy},{tag:J.monospace,fontFamily:Gy,backgroundColor:`color-mix(in srgb, var(--dsw-alias-label-secondary, #888) 12%, transparent)`,borderRadius:`4px`,padding:`0 3px`},{tag:J.content,fontFamily:Gy,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:Hy,textDecoration:`underline`},{tag:J.url,color:Uy,textDecoration:`underline dotted`},{tag:J.quote,fontStyle:`italic`,color:`var(--dsw-alias-label-secondary, #888)`},{tag:J.contentSeparator,color:Wy,textDecoration:`line-through`},{tag:J.comment,color:Wy}]);function qy(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,F_(),m_({base:e_}),Pd(Ky),gl(),wl(e.placeholder??``),el.of([...Vy,...$_,{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?``:`
831
831
  `}${e}\n`;n.dispatch({changes:{from:t,insert:r},selection:{anchor:t+r.length},scrollIntoView:!0}),n.focus()},focus:()=>n.focus()}}const Jy=`dsh-tw-note-state`,Yy=`dsh-tw-note-draft-v1`,Xy=`dsh-tw-note-window-id`,Zy=(()=>{try{let e=sessionStorage.getItem(Xy);if(e!==null&&e.length>0)return e;let t=Math.random().toString(36).slice(2,10);return sessionStorage.setItem(Xy,t),t}catch{return Math.random().toString(36).slice(2,10)}})();function Qy(){return`dsh-tw-note-draft-v1:${Zy}`}function $y(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 eb(e){try{return $y(localStorage.getItem(e))}catch{return null}}function tb(){let e=eb(Qy());if(e!==null)return{draft:e,foreign:e.windowId!==void 0&&e.windowId!==Zy};let t=eb(Yy);if(t===null)return null;let n={...t,windowId:Zy};rb(n);try{localStorage.removeItem(Yy)}catch{}return{draft:n,foreign:!0}}function nb(e){rb({...e,windowId:Zy})}function rb(e){try{localStorage.setItem(Qy(),JSON.stringify({...e,windowId:Zy}))}catch{}}function ib(){try{localStorage.removeItem(Qy())}catch{}}function ab(e,t,n){return`${e}\u0000${t}\u0000${n.join(``)}`}function ob(e){return e<10?`0${e}`:String(e)}function sb(e=new Date){return`${e.getFullYear()}-${ob(e.getMonth()+1)}-${ob(e.getDate())} ${ob(e.getHours())}:${ob(e.getMinutes())}`}function cb(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 lb(){let e=await _e();return typeof e?.note?.tag==`string`&&e.note.tag.length>0?e.note.tag:`inbox`}function ub(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 db(e,t,n=e=>e){if(e.size>67108864){O(`文件过大(≤ 64MB)`);return}try{let r=await fetch(n(`${C}?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})`:`[${a}](${i.url})`;t.insertAtCaret(o),O(`已上传「${a}」并插入链接`)}catch(e){O(`上传失败:${e instanceof Error?e.message:String(e)}`)}}function fb(){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(Jy,{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,C=()=>{e!==void 0&&(S=sb(),e.titleInput.value=S)},ee=()=>{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)){ib();return}let r=ab(n,t,e.tagEditor.peekTags());h!==null&&r===h||rb({text:t,title:n,tags:e.tagEditor.peekTags(),savedAt:Date.now()})},te=()=>{t||!n||e===void 0||(f!==void 0&&(clearTimeout(f),f=void 0),f=window.setTimeout(()=>{f=void 0,ee()},500))},w=()=>{e!==void 0&&(e.draftBanner.hidden=!0)},ne=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;ib(),w(),h=ab(e,t,n),m=null;let a=pe(c,o,i.twUrl,i.twUrlAbsolute);return Bt(`${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}},re=()=>{p=!1,e!==void 0&&(e.recentWrap.hidden=!0)},T=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=ab(r.title,r.text??``,r.tags??[]),w(),re(),O(`已载入「${r.title}」`),e.editor.focus()}catch(e){O(`读取失败:${e instanceof Error?e.message:String(e)}`)}},ie=()=>{if(e===void 0)return;if(p){re();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=[cb(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`,()=>{T(t.title)}),n.addEventListener(`keydown`,e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),T(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)}})()},E=()=>{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 C=document.createElement(`button`);C.type=`button`,C.className=`dsh-tw-note-draft-discard`,C.textContent=`丢弃`,b.append(x,C);let T=document.createElement(`div`);T.className=`dsh-tw-note-fields`;let E=document.createElement(`input`);E.className=`dsh-tw-note-title`,E.placeholder=`标题(默认时间戳)`,E.setAttribute(`aria-label`,`笔记标题(默认时间戳)`);let ae=ub({onChange:te});T.append(E,ae.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,T.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)return;if(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){oe.hidden=!0,oe.style.display=`none`,ce.disabled=!0;return}oe.style.display=``,ce.disabled=!1;let n=typeof e?.defaultId==`string`?e.defaultId:void 0,r=()=>{s||(o=Me(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=je(()=>{r(),ce.value=o??``,ue()})}),E.addEventListener(`input`,te);let de,D=qy({placeholder:`写点东西… Markdown 高亮,可 📎/拖入文件
832
832
  Ctrl+Enter 保存`,onSave:()=>{de?.()},onChange:te}),fe=document.createElement(`button`);fe.type=`button`,fe.className=`dsh-tw-note-upload`,fe.title=`上传文件到 wiki 并插入 Markdown 链接(也可直接拖入编辑器)`,fe.textContent=`📎 上传`;let pe=document.createElement(`input`);pe.type=`file`,pe.multiple=!0,pe.hidden=!0,fe.addEventListener(`click`,()=>{pe.click()}),pe.addEventListener(`change`,()=>{for(let e of Array.from(pe.files??[]))db(e,D,d);pe.value=``});let me=0;D.el.addEventListener(`dragenter`,e=>{e.preventDefault(),me++,D.el.classList.add(`dsh-tw-note-drop`)}),D.el.addEventListener(`dragover`,e=>{e.preventDefault()}),D.el.addEventListener(`dragleave`,e=>{e.preventDefault(),me=Math.max(0,me-1),me===0&&D.el.classList.remove(`dsh-tw-note-drop`)}),D.el.addEventListener(`drop`,e=>{e.preventDefault(),me=0,D.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))db(e,D,d)});let he=document.createElement(`div`);he.className=`dsh-tw-note-foot`;let ge=document.createElement(`div`);ge.className=`dsh-tw-note-foot-left`;let ve=document.createElement(`span`);ve.className=`dsh-tw-note-hint`,ve.textContent=`Ctrl+Enter`;let ye=document.createElement(`button`);ye.type=`button`,ye.className=`dsh-tw-note-recent-btn`,ye.title=`最近修改的笔记,点击载入继续编辑`,ye.textContent=`🕘 最近`,ye.addEventListener(`click`,ie),ge.append(fe,ye,ve);let be=document.createElement(`div`);be.className=`dsh-tw-note-foot-right`;let xe=document.createElement(`button`);xe.type=`button`,xe.className=`dsh-tw-note-edit`,xe.title=`保存并在 TiddlyWiki 原生编辑器中打开`,xe.textContent=`✏️ 在 TW 中编辑`;let Se=document.createElement(`button`);Se.type=`button`,Se.className=`dsh-tw-note-save`,Se.textContent=`保存`,be.append(xe,Se),he.append(ge,be);let Ce=document.createElement(`div`);Ce.className=`dsh-tw-note-recent`,Ce.hidden=!0,a.append(p,b,T,D.el,he),r.append(a,Ce),document.body.append(r),e={root:r,card:a,editor:D,titleInput:E,tagEditor:ae,saveBtn:Se,editBtn:xe,draftBanner:b,bannerText:x,recentWrap:Ce};let we=()=>{n=!1,r.hidden=!0,re(),_(!1)},Te=()=>{f!==void 0&&(clearTimeout(f),f=void 0),D.setValue(``),E.value=sb(),S=E.value,ae.setTags([]),h=ab(E.value.trim(),``,[])},Ee=()=>{ib(),w(),h=ab(E.value.trim(),D.getValue(),ae.getTags()),m=null,Te(),we()},De=!1;de=async()=>{if(De)return;let e=D.getValue().trim();if(e.length===0){O(`内容为空,未保存`);return}De=!0,Se.disabled=!0,Se.textContent=`保存中…`;try{let t=E.value.trim(),n={title:t,tags:ae.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){O(`保存被拒绝:这篇笔记在你读取之后被改动过。请用「🕘 最近」重新载入后再保存。`);return}O(`保存失败:${i?.error??`HTTP ${r.status}`}`);return}Ee(),O(`已保存「${i.title??E.value}」`)}catch(e){O(`保存失败:${e instanceof Error?e.message:String(e)}`)}finally{De=!1,Se.disabled=!1,Se.textContent=`保存`}},Se.addEventListener(`click`,()=>{de?.()});let Oe=async()=>{let e=E.value.trim().length>0?E.value.trim():sb(),t=D.getValue(),n=ae.getTags();xe.disabled=!0,xe.textContent=`打开中…`;try{await ne(e,t,n)}finally{xe.disabled=!1,xe.textContent=`✏️ 在 TW 中编辑`}};xe.addEventListener(`click`,()=>{Oe()}),y.addEventListener(`click`,we);let ke=null,Ae=(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();ke={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(ke===null)return;let t=e.clientX-ke.startX,n=e.clientY-ke.startY;!ke.moved&&Math.abs(t)<4&&Math.abs(n)<4||(ke.moved=!0,Ae(ke.origLeft+t,ke.origTop+n))});let Ne=e=>{if(ke!==null){try{p.releasePointerCapture(e.pointerId)}catch{}ke=null,p.classList.remove(`dsh-tw-note-head-dragging`)}};p.addEventListener(`pointerup`,Ne),p.addEventListener(`pointercancel`,Ne),C.addEventListener(`click`,()=>{ib(),w(),Te(),O(`已丢弃草稿`)}),i=()=>{ee()},window.addEventListener(`pagehide`,i)};return{async open(r){if(t||(E(),e===void 0||n))return;n=!0,e.root.hidden=!1,b(r),_(!0);let i=tb(),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&&(O(`已恢复其它窗口的未保存草稿`),nb(o));else{if(C(),a=await lb(),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,re(),_(!1))},async openNative(){if(!(t||r)&&!(Vt()&&!Ht())){r=!0;try{let e=tb(),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():sb(),i=n?e.draft.text:``,o=[];if(n)o=e.draft.tags;else{if(a=await lb(),t)return;o=[a]}e!==null&&e.foreign&&(e.draft.text.trim().length>0||e.draft.title.trim().length>0)&&(O(`已恢复其它窗口的未保存草稿`),nb(e.draft)),await ne(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),ee(),e?.tagEditor.dispose(),e?.editor.view.destroy(),e?.root.remove(),e=void 0}}}function pb(e){return e<10?`0${e}`:String(e)}function mb(e){return`${pb(e.getHours())}:${pb(e.getMinutes())}`}function hb(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(`上次同步 ${mb(t)}`),{state:i,tooltip:r.join(` · `)}}function gb(){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=hb(n,t);(i.state!==e.state||i.tooltip!==e.tooltip)&&(e=i,o())},c=async()=>{if(i)return;let e=await _e();i||s(e)};return c(),n=window.setInterval(()=>{c()},3e4),{getState:()=>e,trigger:async()=>{if(i)return e;if(r)return O(`同步进行中…`),e;r=!0,e={...e,state:`syncing`},o();try{let e=await fetch(ee,{method:`POST`,signal:AbortSignal.timeout(12e4)}),n=he(await e.json().catch(()=>null),e.status);n.ok?(t=new Date,O(`同步完成:${n.message}`)):O(`同步失败:${n.message}`)}catch(e){O(`同步失败:${e instanceof Error?e.message:String(e)}`)}finally{r=!1,await c()}return e},subscribe(e){return a.add(e),()=>{a.delete(e)}},dispose(){i=!0,n!==void 0&&(clearInterval(n),n=void 0),a.clear()}}}async function _b(){let e=await _e(),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 vb(){let e=await we();return{showQuickNote:e.showQuickNote,showPanelStatus:e.showPanelStatus,showSyncButton:e.showSyncButton}}async function yb(){let e=await _e();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 bb(e,t,n){let r=!1,i,a,o,s,c,l,u,d,f=!1,m,h,g={state:`unknown`,text:`TiddlyWiki 服务…`,logs:[]},_=()=>{f=!1,s!==void 0&&(s.hidden=!0),u!==void 0&&(u.hidden=!0)},v=e=>{if(!f)return;let t=e.target;i!==void 0&&i.contains(t)||_()},y=()=>{if(u===void 0)return;let e=[`TiddlyWiki 服务:${g.text}`];e.push(`知识库同步:${n.getState().tooltip}`),g.logs.length>0&&(e.push(`最近日志:`),e.push(...g.logs.slice(-3))),u.textContent=e.join(`
833
- `)},b=()=>{let e=n.getState();o!==void 0&&(o.dataset.state=e.state),a!==void 0&&(a.title=`知识库 · ${e.tooltip}`),y()},x=async()=>{g=await yb(),!r&&(c!==void 0&&(c.textContent=g.text),l!==void 0&&(l.dataset.state=g.state),y())},S=(g,S)=>{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,g.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`,()=>{y(),u!==void 0&&(u.hidden=!1)}),e.addEventListener(`mouseleave`,()=>{u!==void 0&&(u.hidden=!0)}),s.append(e)}if(g.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`,()=>{_(),we().then(e=>{e.quickNoteMode===`native`?t.openNative():t.open()})}),s.append(e)}if(g.showPanelStatus){if(S.wikis.length>1){let t=document.createElement(`div`);t.className=`dsh-tw-fab-group`,t.textContent=`知识库`,s.append(t);let n=new Map,r=()=>{let e=Me(S.wikis,S.defaultId);for(let[t,r]of n){let n=t===e;r.dataset.current=n?`1`:`0`;let i=S.wikis.find(e=>e.id===t);r.textContent=`${n?`●`:`○`} ${i?.label??t}`}};for(let t of S.wikis){let r=document.createElement(`button`);r.type=`button`,r.className=`dsh-tw-fab-item`,r.dataset.current=`0`,r.title=`${t.path}${t.running?``:`(未运行,打开会启动)`}`,r.addEventListener(`click`,()=>{_(),Ae(t.id),t.running||fetch(`${p}/admin/wikis`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({action:`start`,id:t.id}),signal:AbortSignal.timeout(12e4)}).catch(()=>void 0),e.openPanel()}),n.set(t.id,r),s.append(r)}r(),m=je(()=>{r()}),h=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`,()=>{_(),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`,()=>{_(),document.dispatchEvent(new CustomEvent(lt)),x()}),s.append(n)}if(g.showSyncButton){let e=document.createElement(`button`);e.type=`button`,e.className=`dsh-tw-fab-item`,e.textContent=`🔁 同步`,e.addEventListener(`click`,()=>{_(),n.trigger()}),s.append(e)}a=document.createElement(`button`),a.type=`button`,a.className=`dsh-tw-fab`,a.setAttribute(`aria-label`,`TiddlyWiki 知识库`);let C=document.createElement(`span`);C.className=`dsh-tw-fab-icon`,C.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(C,o),a.addEventListener(`click`,()=>{if(s!==void 0){if(f){_();return}f=!0,s.hidden=!1,h?.(),b(),x()}}),i.append(s,a),document.body.append(i),b(),document.addEventListener(`click`,v,!0)},C=e.subscribe(()=>{d!==void 0&&(d.textContent=e.isOpen()?`收起 TW 面板`:`打开 TW 面板`)}),ee=n.subscribe(b);return(async()=>{let[e,t]=await Promise.all([vb(),_b()]);r||!e.showQuickNote&&!e.showPanelStatus&&!e.showSyncButton||S(e,t)})(),()=>{r=!0,m?.(),m=void 0,document.removeEventListener(`click`,v,!0),C(),ee(),i?.remove()}}function xb(e){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 a=0,o=0,s=window.setInterval(()=>{if(o++,!n()){o>=20&&window.clearInterval(s);return}a++,a>=3&&window.clearInterval(s)},1500),c=window.setTimeout(n,120),l=window.setTimeout(n,600);return()=>{r.disconnect(),window.removeEventListener(`resize`,n),document.removeEventListener(`visibilitychange`,n),window.clearInterval(s),window.clearTimeout(c),window.clearTimeout(l)}}function Sb(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(Jy,t),we().then(t=>{e&&i(t.quickNoteMode)}),()=>{e=!1,window.removeEventListener(Jy,t)}},[]),c.useLayoutEffect(()=>{let e=a.current;if(e!==null)return xb(e)},[]);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`?Vt()&&!Ht()?Wt():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 Cb(){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),d=c.useRef(null);if(c.useLayoutEffect(()=>{let e=d.current;if(e!==null)return xb(e)},[]),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 f=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`,{ref:d,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=>{f(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 wb(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 Tb(){return ft()}async function Eb(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 Db(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(w,{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 wb(o.title);if(!g.current||n!==h.current)return;if(c===null){let e=await Eb(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 Eb(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 Ob(e,t){if(!(e===void 0||t.showSessionTab===!1))return dt(t.tabLabel),e.inject(`conversation.view`,()=>e.register({name:`conversation.view`,id:`dsh-tiddlywiki-summary`,order:20,label:Tb},Db))}function $(e,t,n){let r=document.createElement(e);return t!==void 0&&(r.className=t),n!==void 0&&(r.textContent=n),r}function kb(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 Ab(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 jb(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 Ab(zb(ne));if(t)return;c=!0,n.hidden=!0,n.replaceChildren(),Mb(r,e,l),Ub(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 Mb(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(ee,{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 Ab(E,{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 Nb(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:`完整:额外附一份由工具注册表实时生成的参数索引`}]),C=m(`prompt.extra`,`附加说明(永远追加在末尾,可放团队/个人规范)`,typeof b.extra==`string`?b.extra:``,5),ee=m(`prompt.override`,`整段替换(非空时取代上面的内置文本,附加说明仍会追加)`,typeof b.override==`string`?b.override:``,8),te=()=>c.some(e=>(e.key.startsWith(`prompt.`)||e.key===`wechat.enabled`)&&e.changed()),w=$(`button`,`dsh-tw-settings-btn`,`预览注入文本(按表单当前值)`);w.type=`button`,w.title=`按表单当前值渲染注入文本(不用先保存);点「保存配置」后这就是实际注入的内容`;let ne=$(`pre`,`dsh-tw-settings-prompt-preview`);ne.hidden=!0,w.addEventListener(`click`,()=>{if(!ne.hidden){ne.hidden=!0,ne.textContent=``;return}w.disabled=!0,(async()=>{try{let e=await Ab(zb(re),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({enabled:x.checked,mode:S.value,extra:C.value,override:ee.value,wechat:y.checked})});if(e.ok!==!0)throw Error(e.error??`获取失败`);ne.textContent=e.enabled===!1?`(已关闭:不会注入任何提示词)`:`# 形态 ${e.mode??``} · ${e.length??0} 字符${te()?`(含未保存的修改,保存后才真正注入)`:``}\n\n${e.text??``}`,ne.hidden=!1}catch(e){O(`读取提示词失败:${e instanceof Error?e.message:String(e)}`)}finally{w.disabled=!1}})()}),i.append(w,ne);let T=t.bridge??{};d(`bridge.enabled`,`启用「本地剪藏桥」(书签小工具后端监听 127.0.0.1 端口,保存后立即生效)`,T.enabled===!0),f(`bridge.port`,`剪藏桥端口(整数 1–65535;改端口需重启 dsh web 生效)`,typeof T.port==`number`&&T.port>0?T.port:8618,{min:1,max:65535,step:1,integer:!0}),u(`bridge.token`,`剪藏桥 token(非空时校验书签的 x-clip-token 头;强烈建议设置。已设置时显示为 ********,原样保存=不改,清空=删除)`,typeof T.token==`string`?T.token:``),l(`bridge.tag`,`剪藏笔记默认 tag`,typeof T.tag==`string`&&T.tag.trim().length>0?T.tag.trim():`clip`);let E=kb(r.saveError??``);E.hidden=r.saveError===void 0;let ae=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`保存配置`);ae.type=`button`,ae.addEventListener(`click`,()=>{ae.disabled=!0,(async()=>{let e=c.filter(e=>e.invalid?.()!==void 0);if(e.length>0){O(`有 ${e.length} 个字段填得不对(见字段旁的红色提示),未保存`),ae.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(`没有改动`),ae.disabled=!1;return}try{await Ab(zb(ie),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(t)}),Ce(),r.saveError=void 0,E.hidden=!0,E.textContent=``,O(`配置已保存`),n()}catch(e){r.saveError=`保存失败:${e instanceof Error?e.message:String(e)}`,E.textContent=r.saveError,E.hidden=!1,n()}finally{ae.disabled=!1}})()}),r.isDirty=()=>c.some(e=>e.changed()),i.append(E,ae),e.append(i)}function Pb(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},C=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`,()=>C(y.value)),x.addEventListener(`click`,()=>{a.plugins!==void 0&&(x.disabled=!0,(async()=>{try{await Ab(T,{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()}})())}),C(``),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 ee=$(`section`,`dsh-tw-settings-section`);ee.append($(`h3`,`dsh-tw-settings-h`,`主题管理(自带主题)`));let te=$(`div`,`dsh-tw-settings-muted`,`「加载」= TW 里可用的主题(可多选,依赖链自动带上,如 heavier 会带 snowwhite+vanilla);「活动」= 当前视觉主题(单选,自动加入加载集)。应用后重启 TW。`),w=$(`div`,`dsh-tw-settings-row dsh-tw-settings-head`);w.append($(`span`,`dsh-tw-settings-col`,`加载`),$(`span`,`dsh-tw-settings-col`,`活动`),$(`span`,`dsh-tw-settings-name`,`主题`));let ne=t?.themes??[],re=t?.themeActive,ie=ne[ne.length-1],E=typeof re==`string`&&s.some(e=>e.name===re)?re:ie??`tiddlywiki/vanilla`,ae=()=>a.themeActive??E,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===ae(),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 Ab(T,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({themes:[...p()],themeActive:ae()})}),a.themes=void 0,a.themeActive=void 0,O(`主题已应用,TW 已重启`),i()}catch(e){O(`应用失败:${e instanceof Error?e.message:String(e)}`),se()}})())}),se(),ee.append(te,w,ce,oe),e.append(ee);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 Ab(T,{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)}const Fb={book:`📖 书(book)`,briefcase:`💼 公文包(briefcase)`,home:`🏠 房子(home)`,notebook:`📓 笔记本(notebook)`,flask:`🧪 实验(flask)`,globe:`🌐 地球(globe)`,star:`⭐ 星标(star)`,archive:`🗄 归档(archive)`},Ib=[`📚`,`💼`,`🏠`,`✍️`,`🧪`,`🌱`,`🎯`,`🗂️`];function Lb(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 Ab(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(`;`)}`),h(r),await n()}catch(e){if(t())return;O(`操作失败:${e instanceof Error?e.message:String(e)}`),await g()}},m=async(e,r,a)=>{i.textContent=a;try{let i=await Ab(e,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(r),signal:AbortSignal.timeout(18e4)});if(t())return;i.ok!==!0&&O(`失败:${i.error??`未知错误`}`),await g(),await n()}catch(e){if(t())return;O(`失败:${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=Rb===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`,()=>{Rb=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`,`移出列表`);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},`移出中…`)});let _=$(`select`,`dsh-tw-settings-icon-select`);_.setAttribute(`aria-label`,`「${r.label}」的入口图标`);let v=typeof r.icon==`string`?r.icon:``,y=[[``,`默认图标`]];for(let e of Pe)y.push([e,Fb[e]??e]);for(let e of Ib)y.push([e,e]);v.length>0&&!y.some(([e])=>e===v)&&y.push([v,v]);for(let[e,t]of y){let n=document.createElement(`option`);n.value=e,n.textContent=t,_.append(n)}if(_.value=v,_.addEventListener(`change`,()=>{let e=_.value;p(e.length>0?{action:`update`,wiki:{...r,icon:e}}:{action:`update`,wiki:{...r,icon:``}},`保存中…`)}),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){O(`根目录不能为空`);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(le,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){O(`请填写根目录与文件夹名`);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 Ab(de);if(t())return;h(e)}catch(e){if(t())return;i.textContent=`读取知识库列表失败:${e instanceof Error?e.message:String(e)}`}};g()}let Rb;function zb(e){return Rb===void 0?e:`${e}?wiki=${encodeURIComponent(Rb)}`}function Bb(e,t,n){(async()=>{try{let e=await Ab(de);if(t()||e.mode===`multi`)return}catch{}t()||Vb(e,t,n)})()}function Vb(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 Ab(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 Ab(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 Ab(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 Hb(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 Ab(ae);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?`
833
+ `)},b=()=>{let e=n.getState();o!==void 0&&(o.dataset.state=e.state),a!==void 0&&(a.title=`知识库 · ${e.tooltip}`),y()},x=async()=>{g=await yb(),!r&&(c!==void 0&&(c.textContent=g.text),l!==void 0&&(l.dataset.state=g.state),y())},S=(g,S)=>{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,g.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`,()=>{y(),u!==void 0&&(u.hidden=!1)}),e.addEventListener(`mouseleave`,()=>{u!==void 0&&(u.hidden=!0)}),s.append(e)}if(g.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`,()=>{_(),we().then(e=>{e.quickNoteMode===`native`?t.openNative():t.open()})}),s.append(e)}if(g.showPanelStatus){if(S.wikis.length>1){let t=document.createElement(`div`);t.className=`dsh-tw-fab-group`,t.textContent=`知识库`,s.append(t);let n=new Map,r=()=>{let e=Me(S.wikis,S.defaultId);for(let[t,r]of n){let n=t===e;r.dataset.current=n?`1`:`0`;let i=S.wikis.find(e=>e.id===t);r.textContent=`${n?`●`:`○`} ${i?.label??t}`}};for(let t of S.wikis){let r=document.createElement(`button`);r.type=`button`,r.className=`dsh-tw-fab-item`,r.dataset.current=`0`,r.title=`${t.path}${t.running?``:`(未运行,打开会启动)`}`,r.addEventListener(`click`,()=>{_(),Ae(t.id),t.running||fetch(`${p}/admin/wikis`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({action:`start`,id:t.id}),signal:AbortSignal.timeout(12e4)}).catch(()=>void 0),e.openPanel()}),n.set(t.id,r),s.append(r)}r(),m=je(()=>{r()}),h=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`,()=>{_(),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`,()=>{_(),document.dispatchEvent(new CustomEvent(lt)),x()}),s.append(n)}if(g.showSyncButton){let e=document.createElement(`button`);e.type=`button`,e.className=`dsh-tw-fab-item`,e.textContent=`🔁 同步`,e.addEventListener(`click`,()=>{_(),n.trigger()}),s.append(e)}a=document.createElement(`button`),a.type=`button`,a.className=`dsh-tw-fab`,a.setAttribute(`aria-label`,`TiddlyWiki 知识库`);let C=document.createElement(`span`);C.className=`dsh-tw-fab-icon`,C.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(C,o),a.addEventListener(`click`,()=>{if(s!==void 0){if(f){_();return}f=!0,s.hidden=!1,h?.(),b(),x()}}),i.append(s,a),document.body.append(i),b(),document.addEventListener(`click`,v,!0)},C=e.subscribe(()=>{d!==void 0&&(d.textContent=e.isOpen()?`收起 TW 面板`:`打开 TW 面板`)}),ee=n.subscribe(b);return(async()=>{let[e,t]=await Promise.all([vb(),_b()]);r||!e.showQuickNote&&!e.showPanelStatus&&!e.showSyncButton||S(e,t)})(),()=>{r=!0,m?.(),m=void 0,document.removeEventListener(`click`,v,!0),C(),ee(),i?.remove()}}function xb(e){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 a=0,o=0,s=window.setInterval(()=>{if(o++,!n()){o>=20&&window.clearInterval(s);return}a++,a>=3&&window.clearInterval(s)},1500),c=window.setTimeout(n,120),l=window.setTimeout(n,600);return()=>{r.disconnect(),window.removeEventListener(`resize`,n),document.removeEventListener(`visibilitychange`,n),window.clearInterval(s),window.clearTimeout(c),window.clearTimeout(l)}}function Sb(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(Jy,t),we().then(t=>{e&&i(t.quickNoteMode)}),()=>{e=!1,window.removeEventListener(Jy,t)}},[]),c.useLayoutEffect(()=>{let e=a.current;if(e!==null)return xb(e)},[]);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`?Vt()&&!Ht()?Wt():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 Cb(){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),d=c.useRef(null);if(c.useLayoutEffect(()=>{let e=d.current;if(e!==null)return xb(e)},[]),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 f=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`,{ref:d,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=>{f(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 wb(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 Tb(){return ft()}async function Eb(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 Db(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(w,{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 wb(o.title);if(!g.current||n!==h.current)return;if(c===null){let e=await Eb(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 Eb(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 Ob(e,t){if(!(e===void 0||t.showSessionTab===!1))return dt(t.tabLabel),e.inject(`conversation.view`,()=>e.register({name:`conversation.view`,id:`dsh-tiddlywiki-summary`,order:20,label:Tb},Db))}function $(e,t,n){let r=document.createElement(e);return t!==void 0&&(r.className=t),n!==void 0&&(r.textContent=n),r}function kb(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 Ab(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 jb(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 Ab(zb(ne));if(t)return;c=!0,n.hidden=!0,n.replaceChildren(),Mb(r,e,l),Ub(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 Mb(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(ee,{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 Ab(E,{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 Nb(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:`完整:额外附一份由工具注册表实时生成的参数索引`}]),C=m(`prompt.extra`,`附加说明(永远追加在末尾,可放团队/个人规范)`,typeof b.extra==`string`?b.extra:``,5),ee=m(`prompt.override`,`整段替换(非空时取代上面的内置文本,附加说明仍会追加)`,typeof b.override==`string`?b.override:``,8),te=()=>c.some(e=>(e.key.startsWith(`prompt.`)||e.key===`wechat.enabled`)&&e.changed()),w=$(`button`,`dsh-tw-settings-btn`,`预览注入文本(按表单当前值)`);w.type=`button`,w.title=`按表单当前值渲染注入文本(不用先保存);点「保存配置」后这就是实际注入的内容`;let ne=$(`pre`,`dsh-tw-settings-prompt-preview`);ne.hidden=!0,w.addEventListener(`click`,()=>{if(!ne.hidden){ne.hidden=!0,ne.textContent=``;return}w.disabled=!0,(async()=>{try{let e=await Ab(zb(re),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({enabled:x.checked,mode:S.value,extra:C.value,override:ee.value,wechat:y.checked})});if(e.ok!==!0)throw Error(e.error??`获取失败`);ne.textContent=e.enabled===!1?`(已关闭:不会注入任何提示词)`:`# 形态 ${e.mode??``} · ${e.length??0} 字符${te()?`(含未保存的修改,保存后才真正注入)`:``}\n\n${e.text??``}`,ne.hidden=!1}catch(e){O(`读取提示词失败:${e instanceof Error?e.message:String(e)}`)}finally{w.disabled=!1}})()}),i.append(w,ne);let T=t.bridge??{};d(`bridge.enabled`,`启用「本地剪藏桥」(书签小工具后端监听 127.0.0.1 端口,保存后立即生效)`,T.enabled===!0),f(`bridge.port`,`剪藏桥端口(整数 1–65535;改端口需重启 dsh web 生效)`,typeof T.port==`number`&&T.port>0?T.port:8618,{min:1,max:65535,step:1,integer:!0}),u(`bridge.token`,`剪藏桥 token(非空时校验书签的 x-clip-token 头;强烈建议设置。已设置时显示为 ********,原样保存=不改,清空=删除)`,typeof T.token==`string`?T.token:``),l(`bridge.tag`,`剪藏笔记默认 tag`,typeof T.tag==`string`&&T.tag.trim().length>0?T.tag.trim():`clip`);let E=kb(r.saveError??``);E.hidden=r.saveError===void 0;let ae=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`保存配置`);ae.type=`button`,ae.addEventListener(`click`,()=>{ae.disabled=!0,(async()=>{let e=c.filter(e=>e.invalid?.()!==void 0);if(e.length>0){O(`有 ${e.length} 个字段填得不对(见字段旁的红色提示),未保存`),ae.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(`没有改动`),ae.disabled=!1;return}try{await Ab(zb(ie),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(t)}),Ce(),r.saveError=void 0,E.hidden=!0,E.textContent=``,O(`配置已保存`),n()}catch(e){r.saveError=`保存失败:${e instanceof Error?e.message:String(e)}`,E.textContent=r.saveError,E.hidden=!1,n()}finally{ae.disabled=!1}})()}),r.isDirty=()=>c.some(e=>e.changed()),i.append(E,ae),e.append(i)}function Pb(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},C=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`,()=>C(y.value)),x.addEventListener(`click`,()=>{a.plugins!==void 0&&(x.disabled=!0,(async()=>{try{await Ab(zb(T),{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()}})())}),C(``),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 ee=$(`section`,`dsh-tw-settings-section`);ee.append($(`h3`,`dsh-tw-settings-h`,`主题管理(自带主题)`));let te=$(`div`,`dsh-tw-settings-muted`,`「加载」= TW 里可用的主题(可多选,依赖链自动带上,如 heavier 会带 snowwhite+vanilla);「活动」= 当前视觉主题(单选,自动加入加载集)。应用后重启 TW。`),w=$(`div`,`dsh-tw-settings-row dsh-tw-settings-head`);w.append($(`span`,`dsh-tw-settings-col`,`加载`),$(`span`,`dsh-tw-settings-col`,`活动`),$(`span`,`dsh-tw-settings-name`,`主题`));let ne=t?.themes??[],re=t?.themeActive,ie=ne[ne.length-1],E=typeof re==`string`&&s.some(e=>e.name===re)?re:ie??`tiddlywiki/vanilla`,ae=()=>a.themeActive??E,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===ae(),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 Ab(zb(T),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({themes:[...p()],themeActive:ae()})}),a.themes=void 0,a.themeActive=void 0,O(`主题已应用,TW 已重启`),i()}catch(e){O(`应用失败:${e instanceof Error?e.message:String(e)}`),se()}})())}),se(),ee.append(te,w,ce,oe),e.append(ee);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 Ab(zb(T),{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)}const Fb={book:`📖 书(book)`,briefcase:`💼 公文包(briefcase)`,home:`🏠 房子(home)`,notebook:`📓 笔记本(notebook)`,flask:`🧪 实验(flask)`,globe:`🌐 地球(globe)`,star:`⭐ 星标(star)`,archive:`🗄 归档(archive)`},Ib=[`📚`,`💼`,`🏠`,`✍️`,`🧪`,`🌱`,`🎯`,`🗂️`];function Lb(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 Ab(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(`;`)}`),h(r),await n()}catch(e){if(t())return;O(`操作失败:${e instanceof Error?e.message:String(e)}`),await g()}},m=async(e,r,a)=>{i.textContent=a;try{let i=await Ab(e,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(r),signal:AbortSignal.timeout(18e4)});if(t())return;i.ok!==!0&&O(`失败:${i.error??`未知错误`}`),await g(),await n()}catch(e){if(t())return;O(`失败:${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=Rb===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`,()=>{Rb=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`,`移出列表`);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},`移出中…`)});let _=$(`select`,`dsh-tw-settings-icon-select`);_.setAttribute(`aria-label`,`「${r.label}」的入口图标`);let v=typeof r.icon==`string`?r.icon:``,y=[[``,`默认图标`]];for(let e of Pe)y.push([e,Fb[e]??e]);for(let e of Ib)y.push([e,e]);v.length>0&&!y.some(([e])=>e===v)&&y.push([v,v]);for(let[e,t]of y){let n=document.createElement(`option`);n.value=e,n.textContent=t,_.append(n)}if(_.value=v,_.addEventListener(`change`,()=>{let e=_.value;p(e.length>0?{action:`update`,wiki:{...r,icon:e}}:{action:`update`,wiki:{...r,icon:``}},`保存中…`)}),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){O(`根目录不能为空`);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(le,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){O(`请填写根目录与文件夹名`);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 Ab(de);if(t())return;h(e)}catch(e){if(t())return;i.textContent=`读取知识库列表失败:${e instanceof Error?e.message:String(e)}`}};g()}let Rb;function zb(e){return Rb===void 0?e:`${e}?wiki=${encodeURIComponent(Rb)}`}function Bb(e,t,n){(async()=>{try{let e=await Ab(de);if(t()||e.mode===`multi`)return}catch{}t()||Vb(e,t,n)})()}function Vb(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 Ab(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 Ab(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 Ab(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 Hb(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 Ab(zb(ae));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?`
834
834
 
835
- `:``}用内置版本覆盖?`))return}u.disabled=!0,u.textContent=`执行中…`,(async()=>{try{let e=await fetch(oe,{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?O(`重新初始化失败:${n?.error??n?.results?.[0]?.error??`HTTP ${e.status}`}`):O(`已重新初始化「${t.title}」`),o()}catch(e){O(`重新初始化失败:${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(se,{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?O(`反初始化失败:${n?.error??n?.results?.[0]?.error??`HTTP ${e.status}`}`):O(`已反初始化「${t.title}」`),o()}catch(e){O(`反初始化失败:${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(oe,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({force:!0}),signal:AbortSignal.timeout(6e4)}),t=await e.json().catch(()=>null);!e.ok||t?.ok!==!0?O(`重新初始化失败:${t?.error??`HTTP ${e.status}`}`):O(`全部已重新初始化`),o()}catch(e){O(`重新初始化失败:${e instanceof Error?e.message:String(e)}`)}finally{s.disabled=!1,s.textContent=`全部重新初始化`}})()});let c=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-danger`,`全部反初始化`);c.type=`button`,c.title=`移除所有可选 seed 写入的 tiddler 与 marker(功能必需项保留)`,c.addEventListener(`click`,()=>{window.confirm(`确定全部反初始化?将删除所有可选 seed 写入的 tiddler(含一次性 marker)。功能必需项(发送给 Agent 按钮 / TW 前端 API 基址)会保留。`)&&(c.disabled=!0,c.textContent=`移除中…`,(async()=>{try{let e=await fetch(se,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({}),signal:AbortSignal.timeout(6e4)}),t=await e.json().catch(()=>null);!e.ok||t?.ok!==!0?O(`反初始化失败:${t?.error??`HTTP ${e.status}`}`):O(`全部可选 seed 已反初始化`),o()}catch(e){O(`反初始化失败:${e instanceof Error?e.message:String(e)}`)}finally{c.disabled=!1,c.textContent=`全部反初始化`}})())}),n.append(r,a,i,s,c),e.append(n),o()}function Ub(e,t,n,r,i,a){e.replaceChildren(),typeof t.configError==`string`&&t.configError.length>0&&e.append(kb(`⚠️ 配置未生效:${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(kb(`⚠️ 服务器上的配置在别处被改动过(另一个标签页保存 / 语言管理等),当前表单仍是旧值:直接点「保存配置」会以本页内容覆盖那些改动。`)),i.host===void 0||s&&!c){let e=$(`div`,`dsh-tw-settings-confighost`);Nb(e,t.config??{},n,i),i.host=e,i.signature=o}e.append($(`div`,`dsh-tw-settings-muted`,Rb===void 0?`配置作用域:默认知识库(在「知识库列表」里点某行的「配置」可切到那个库)`:`配置作用域:${Rb}(在「知识库列表」里改;编辑的是该库自己的配置 tiddler)`)),e.append(i.host),Lb(e,r,n),Bb(e,r,n),Pb(e,t.info,t.catalog,t.runtimePlugins,n,a),Hb(e,r)}function Wb(){let e=c.useRef(null);return c.useEffect(()=>{let t=e.current;return t===null?void 0:jb(t)},[]),c.createElement(`div`,{ref:e})}const Gb={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 Kb(e){return typeof e==`object`&&!!e&&e.kind===`tool-result`}function qb(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 Jb(e){try{let t=JSON.parse(e);return typeof t==`object`&&t&&!Array.isArray(t)?t:{}}catch{return{}}}function Yb(e){return Array.isArray(e)?e.filter(e=>typeof e?.text==`string`).map(e=>e.text).join(`
835
+ `:``}用内置版本覆盖?`))return}u.disabled=!0,u.textContent=`执行中…`,(async()=>{try{let e=await fetch(zb(oe),{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?O(`重新初始化失败:${n?.error??n?.results?.[0]?.error??`HTTP ${e.status}`}`):O(`已重新初始化「${t.title}」`),o()}catch(e){O(`重新初始化失败:${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(zb(se),{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?O(`反初始化失败:${n?.error??n?.results?.[0]?.error??`HTTP ${e.status}`}`):O(`已反初始化「${t.title}」`),o()}catch(e){O(`反初始化失败:${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(zb(oe),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({force:!0}),signal:AbortSignal.timeout(6e4)}),t=await e.json().catch(()=>null);!e.ok||t?.ok!==!0?O(`重新初始化失败:${t?.error??`HTTP ${e.status}`}`):O(`全部已重新初始化`),o()}catch(e){O(`重新初始化失败:${e instanceof Error?e.message:String(e)}`)}finally{s.disabled=!1,s.textContent=`全部重新初始化`}})()});let c=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-danger`,`全部反初始化`);c.type=`button`,c.title=`移除所有可选 seed 写入的 tiddler 与 marker(功能必需项保留)`,c.addEventListener(`click`,()=>{window.confirm(`确定全部反初始化?将删除所有可选 seed 写入的 tiddler(含一次性 marker)。功能必需项(发送给 Agent 按钮 / TW 前端 API 基址)会保留。`)&&(c.disabled=!0,c.textContent=`移除中…`,(async()=>{try{let e=await fetch(zb(se),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({}),signal:AbortSignal.timeout(6e4)}),t=await e.json().catch(()=>null);!e.ok||t?.ok!==!0?O(`反初始化失败:${t?.error??`HTTP ${e.status}`}`):O(`全部可选 seed 已反初始化`),o()}catch(e){O(`反初始化失败:${e instanceof Error?e.message:String(e)}`)}finally{c.disabled=!1,c.textContent=`全部反初始化`}})())}),n.append(r,a,i,s,c),e.append(n),o()}function Ub(e,t,n,r,i,a){e.replaceChildren(),typeof t.configError==`string`&&t.configError.length>0&&e.append(kb(`⚠️ 配置未生效:${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(kb(`⚠️ 服务器上的配置在别处被改动过(另一个标签页保存 / 语言管理等),当前表单仍是旧值:直接点「保存配置」会以本页内容覆盖那些改动。`)),i.host===void 0||s&&!c){let e=$(`div`,`dsh-tw-settings-confighost`);Nb(e,t.config??{},n,i),i.host=e,i.signature=o}e.append($(`div`,`dsh-tw-settings-muted`,Rb===void 0?`配置作用域:默认知识库(在「知识库列表」里点某行的「配置」可切到那个库)`:`配置作用域:${Rb}(在「知识库列表」里改;编辑的是该库自己的配置 tiddler)`)),e.append(i.host),Lb(e,r,n),Bb(e,r,n),Pb(e,t.info,t.catalog,t.runtimePlugins,n,a),Hb(e,r)}function Wb(){let e=c.useRef(null);return c.useEffect(()=>{let t=e.current;return t===null?void 0:jb(t)},[]),c.createElement(`div`,{ref:e})}const Gb={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 Kb(e){return typeof e==`object`&&!!e&&e.kind===`tool-result`}function qb(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 Jb(e){try{let t=JSON.parse(e);return typeof t==`object`&&t&&!Array.isArray(t)?t:{}}catch{return{}}}function Yb(e){return Array.isArray(e)?e.filter(e=>typeof e?.text==`string`).map(e=>e.text).join(`
836
836
  `):``}function Xb(e){return typeof e==`string`?e:``}async function Zb(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 Qb(e){return wb(e,1e4)}function $b(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 ex(e){return t=>{t.defaultPrevented||t.button!==0||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||(t.preventDefault(),t.stopPropagation(),At(e))}}function tx(e){let t=Gb[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 nx=new Map;function rx(e){let t=nx.get(e);if(t!==void 0){if(Date.now()-t.at>3e5){nx.delete(e);return}return nx.delete(e),nx.set(e,t),t}}function ix(e,t){for(nx.delete(e),nx.set(e,{at:Date.now(),...t});nx.size>50;){let e=nx.keys().next().value;if(e===void 0)break;nx.delete(e)}}function ax(e){e.length>0&&nx.delete(e)}function ox(e){let t=e.join(`\0`);c.useEffect(()=>{for(let e of t.split(`\0`))ax(e)},[t])}function sx(e){let{title:t,fresh:n}=e,{loading:r,data:i}=$b(async()=>{n===!0&&ax(t);let e=rx(t);if(e!==void 0)return{get:e.get,html:e.html};let[r,i]=await Promise.all([Zb(`${g}?title=${encodeURIComponent(t)}`),Qb(t)]);return typeof i==`string`&&i.length>0&&ix(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(tx,{toolName:e.toolName,title:t,subtitle:e.subtitle,tags:l,onOpen:ex(t),foot:u===void 0?void 0:`修改于 ${u}`},s)}function cx(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:ex(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 lx(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(cx,{key:`${e.title}-${t}`,...e}))),c.createElement(tx,{toolName:e.toolName,title:e.title,subtitle:e.subtitle},n)}function ux(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 dx(e){let t=Xb(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=ux(e.text);r!==null&&n.set(`workspace`,r);let i=n.toString(),a=$b(()=>Zb(`${S}?${i}`),[i]).data,o=(Array.isArray(a?.items)?a.items:[]).map(e=>({title:Xb(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(lx,{toolName:e.toolName,title:t.length>0?t:`检索`,subtitle:d,rows:o,fallbackText:`没有匹配的笔记`})}function fx(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(tx,{toolName:e.toolName,title:e.title.length>0?e.title:void 0,...e.title.length>0?{onOpen:ex(e.title)}:{}},t)}function px(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=$b(()=>Zb(`${x}?${n}`),[n]).data,i=(Array.isArray(r?.items)?r.items:[]).map(e=>({title:Xb(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(lx,{toolName:e.toolName,title:`最近修改`,subtitle:i.length>0?`最近 ${i.length} 条`:``,rows:i,fallbackText:`暂无笔记`})}function mx(e){let t=(Array.isArray(e.args.items)?e.args.items:[]).map(e=>typeof e==`object`&&e&&typeof e.title==`string`?Xb(e.title):null).filter(e=>e!==null&&e.length>0).map(e=>({title:e}));return ox(t.map(e=>e.title)),c.createElement(lx,{toolName:e.toolName,title:`批量写入`,subtitle:t.length>0?`写入 ${t.length} 篇`:`(参数中没有可解析的 items)`,rows:t,fallbackText:`没有可展示的笔记`})}function hx(e){let t=$b(()=>Zb(`${b}?limit=60&sort=count`),[]).data,n=(Array.isArray(t?.items)?t.items:[]).map(e=>({tag:Xb(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(tx,{toolName:e.toolName,title:`标签`,subtitle:`共 ${i} 个`},a)}function gx(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(tx,{toolName:e.toolName},t)}function _x(e){ox([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(tx,{toolName:e.toolName,title:e.title.length>0?e.title:void 0},t)}function vx(e,t){switch(e){case`tiddlywiki_get`:case`tiddlywiki_put`:case`tiddlywiki_append`:case`tiddlywiki_delete`:case`tiddlywiki_attach`:case`tiddlywiki_backlinks`:return Xb(t.title);case`tiddlywiki_rename`:return Xb(t.newTitle);case`tiddlywiki_search`:return Xb(t.query);default:return``}}function yx(e){let t=e.block,n=e.toolName,r=Kb(t),i=qb(t),a=n!==void 0&&n.length>0?n:i?.name??``,o=Jb(i?.argsRaw??``),s=r?Yb(t.content):``;if(i===null)return c.createElement(tx,{toolName:a},c.createElement(`pre`,{className:`dsh-tw-toolcard-fallback`},s||`(无调用信息)`));if(!r)return c.createElement(tx,{toolName:a,title:vx(a,o)},c.createElement(`div`,{className:`dsh-tw-toolcard-pending`},`处理中…`));if(t.isError===!0)return c.createElement(tx,{toolName:a,title:vx(a,o)},c.createElement(`div`,{className:`dsh-tw-toolcard-error`},s||`工具调用失败`));switch(a){case`tiddlywiki_get`:return c.createElement(sx,{toolName:a,title:Xb(o.title),subtitle:`读取`});case`tiddlywiki_put`:return c.createElement(sx,{toolName:a,title:Xb(o.title),subtitle:`已写入`,fresh:!0});case`tiddlywiki_append`:return c.createElement(sx,{toolName:a,title:Xb(o.title),subtitle:`已增量写入`,fresh:!0});case`tiddlywiki_rename`:return c.createElement(sx,{toolName:a,title:Xb(o.newTitle),subtitle:`已重命名「${Xb(o.oldTitle)}」→`,fresh:!0});case`tiddlywiki_delete`:return c.createElement(_x,{toolName:a,title:Xb(o.title),text:s});case`tiddlywiki_attach`:return c.createElement(fx,{toolName:a,title:Xb(o.title)});case`tiddlywiki_batch_put`:return c.createElement(mx,{toolName:a,args:o});case`tiddlywiki_search`:return c.createElement(dx,{toolName:a,args:o,text:s});case`tiddlywiki_recent`:return c.createElement(px,{toolName:a,args:o});case`tiddlywiki_list_tags`:return c.createElement(hx,{toolName:a});case`tiddlywiki_git_sync`:case`tiddlywiki_git_resolve`:return c.createElement(gx,{toolName:a,text:s});default:return c.createElement(tx,{toolName:a,title:vx(a,o)},c.createElement(`pre`,{className:`dsh-tw-toolcard-fallback`},s||`(完成)`))}}const bx=[`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 xx(e){let t=[];for(let n of bx)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}`},yx));r!==void 0&&t.push(r)}catch(e){console.error(`[dsh-tiddlywiki] register toolview ${n} failed:`,e)}return t}function Sx(){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{}At(i)}};return document.addEventListener(`click`,e,!0),()=>document.removeEventListener(`click`,e,!0)}const Cx=`dsh-tiddlywiki`,wx=`dsh-tiddlywiki/rightbar`;function Tx(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=St(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(ct,{detail:wx}));let e=e=>{e.detail!==wx&&o()};return document.addEventListener(ct,e),()=>document.removeEventListener(ct,e)},[a,o]),c.createElement(`div`,{ref:r,className:`dsh-tw-rightbar-tab`})}function Ex(){return{id:Cx,kind:`dsh-tiddlywiki`,title:()=>ft(),guide:[{order:10,title:()=>`TiddlyWiki 知识库`,description:()=>`在右侧边栏打开 TiddlyWiki 编辑器(与聊天并排)`,icon:mt}]}}function Dx(e,t){let n=[];try{n.push(e.register(Ex()));let r=t.inject(`sidebar.right.pane.tab`,()=>t.register({name:`sidebar.right.pane.tab`,key:Cx},Tx));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 bt(),()=>{for(let e of n.splice(0))e()}}const Ox=[`slots`];function kx(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=fb(),t.push(()=>o?.dispose())}),i(`sync controller`,()=>{s=gb(),t.push(()=>s?.dispose())}),i(`sidebar entry`,()=>t.push(Ve(a))),i(`center panel`,()=>t.push(Nt(a))),o!==void 0&&s!==void 0){let e=o,n=s;i(`knowledge FAB`,()=>t.push(bb(a,e,n)))}i(`editor popup`,()=>t.push(Gt)),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:`知识库作用域`},Cb()));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:`快速笔记`},Sb(a)));n!==void 0&&t.push(n)}),i(`session summary tab`,()=>{let n=Ob(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=Dx(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(...xx(e.slots))}),i(`wiki link interceptor`,()=>t.push(Sx())),i(`settings section`,()=>{let n=e.slots?.inject(`settings.section`,()=>e.slots?.register({name:`settings.section`,id:`dsh-tiddlywiki`,order:50,label:`TiddlyWiki 知识库`},Wb));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=kx,exports.inject=Ox,exports.name=`dsh-tiddlywiki/client`;
837
837
  return module.exports;
838
838
  }
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",
4
+ "version": "0.28.6",
5
5
  "type": "module",
6
6
  "keywords": [
7
7
  "dsh",
@@ -724,7 +724,7 @@ function renderCatalogSection(
724
724
  applyPlugins.disabled = true
725
725
  void (async () => {
726
726
  try {
727
- await fetchJson(INFO_ENDPOINT, { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ plugins: [...desiredPlugins()] }) })
727
+ await fetchJson(withWiki(INFO_ENDPOINT), { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ plugins: [...desiredPlugins()] }) })
728
728
  // 应用成功才清 pending:之后重新跟随服务器(TW 重启后 info 会给出真实集合)。
729
729
  pending.plugins = undefined
730
730
  toast('插件已应用,TW 已重启')
@@ -855,7 +855,7 @@ function renderCatalogSection(
855
855
  applyThemes.disabled = true
856
856
  void (async () => {
857
857
  try {
858
- await fetchJson(INFO_ENDPOINT, {
858
+ await fetchJson(withWiki(INFO_ENDPOINT), {
859
859
  method: 'POST',
860
860
  headers: { 'content-type': 'application/json' },
861
861
  body: JSON.stringify({ themes: [...desiredThemes()], themeActive: activeThemeName() }),
@@ -909,7 +909,7 @@ function renderCatalogSection(
909
909
  applyLangs.disabled = true
910
910
  void (async () => {
911
911
  try {
912
- await fetchJson(INFO_ENDPOINT, { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ languages: [...desiredLanguages()] }) })
912
+ await fetchJson(withWiki(INFO_ENDPOINT), { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ languages: [...desiredLanguages()] }) })
913
913
  pending.languages = undefined
914
914
  toast('语言已应用,TW 已重启')
915
915
  void refresh()
@@ -1405,7 +1405,7 @@ function renderSeedsSection(body: HTMLElement, isDisposed: () => boolean): void
1405
1405
  // 按钮回调的 await 之后调用,晚到的响应不得再 wrap.replaceChildren()。
1406
1406
  if (isDisposed()) return
1407
1407
  try {
1408
- const data = await fetchJson<{ ok?: boolean; items?: SeedItem[]; error?: string }>(SEEDS_ENDPOINT)
1408
+ const data = await fetchJson<{ ok?: boolean; items?: SeedItem[]; error?: string }>(withWiki(SEEDS_ENDPOINT))
1409
1409
  if (isDisposed()) return
1410
1410
  if (data.ok !== true || !Array.isArray(data.items)) throw new Error(data.error ?? '获取失败')
1411
1411
  wrap.replaceChildren()
@@ -1453,7 +1453,7 @@ function renderSeedsSection(body: HTMLElement, isDisposed: () => boolean): void
1453
1453
  btn.textContent = '执行中…'
1454
1454
  void (async () => {
1455
1455
  try {
1456
- const res = await fetch(SEEDS_RUN_ENDPOINT, {
1456
+ const res = await fetch(withWiki(SEEDS_RUN_ENDPOINT), {
1457
1457
  method: 'POST',
1458
1458
  headers: { 'content-type': 'application/json' },
1459
1459
  body: JSON.stringify({ id: item.id, force: true }),
@@ -1489,7 +1489,7 @@ function renderSeedsSection(body: HTMLElement, isDisposed: () => boolean): void
1489
1489
  rm.textContent = '移除中…'
1490
1490
  void (async () => {
1491
1491
  try {
1492
- const res = await fetch(SEEDS_REMOVE_ENDPOINT, {
1492
+ const res = await fetch(withWiki(SEEDS_REMOVE_ENDPOINT), {
1493
1493
  method: 'POST',
1494
1494
  headers: { 'content-type': 'application/json' },
1495
1495
  body: JSON.stringify({ id: item.id }),
@@ -1529,7 +1529,7 @@ function renderSeedsSection(body: HTMLElement, isDisposed: () => boolean): void
1529
1529
  runAll.textContent = '执行中…'
1530
1530
  void (async () => {
1531
1531
  try {
1532
- const res = await fetch(SEEDS_RUN_ENDPOINT, {
1532
+ const res = await fetch(withWiki(SEEDS_RUN_ENDPOINT), {
1533
1533
  method: 'POST',
1534
1534
  headers: { 'content-type': 'application/json' },
1535
1535
  body: JSON.stringify({ force: true }),
@@ -1557,7 +1557,7 @@ function renderSeedsSection(body: HTMLElement, isDisposed: () => boolean): void
1557
1557
  removeAll.textContent = '移除中…'
1558
1558
  void (async () => {
1559
1559
  try {
1560
- const res = await fetch(SEEDS_REMOVE_ENDPOINT, {
1560
+ const res = await fetch(withWiki(SEEDS_REMOVE_ENDPOINT), {
1561
1561
  method: 'POST',
1562
1562
  headers: { 'content-type': 'application/json' },
1563
1563
  body: JSON.stringify({}),
@@ -266,14 +266,29 @@ export function mountSidebarEntry(state: PanelState): () => void {
266
266
  // placed 成功后由 tryPlace 立即 clearInterval(见上);仅在 root 重建时重启。
267
267
  startRetry()
268
268
 
269
+ /**
270
+ * Highlight the row whose knowledge base the panel is actually showing.
271
+ *
272
+ * NOT all rows (v0.28.6 fix): the panel is shared, but it can only display ONE
273
+ * wiki — the focused one. Highlighting every row made it look like all three
274
+ * were open (作者报障). The row the user clicked becomes the focus, and that is
275
+ * the row that lights up.
276
+ */
269
277
  const syncActive = (): void => {
270
- // 面板是共享的:所有行一起高亮/取消,用户看到的"打开中"状态才一致。
278
+ const focus = resolveFocusWiki(
279
+ activeRows().map((el) => ({ id: el.dataset.wiki ?? '' })).filter((w) => w.id.length > 0),
280
+ undefined,
281
+ )
271
282
  for (const el of activeRows()) {
272
- if (state.isOpen()) el.dataset.active = 'true'
283
+ const id = el.dataset.wiki
284
+ // 单库默认行没有 data-wiki:它就是唯一那个库,面板开着时它就该亮。
285
+ const mine = id === undefined ? activeRows().length === 1 : id === focus
286
+ if (state.isOpen() && mine) el.dataset.active = 'true'
273
287
  else delete el.dataset.active
274
288
  }
275
289
  }
276
290
  const unsubscribe = state.subscribe(syncActive)
291
+ const unsubscribeRowFocus = subscribeFocusWiki(syncActive)
277
292
  syncActive()
278
293
  tryPlace()
279
294
 
@@ -286,6 +301,7 @@ export function mountSidebarEntry(state: PanelState): () => void {
286
301
  unsubscribe()
287
302
  unsubscribeLabel()
288
303
  unsubscribeFocus()
304
+ unsubscribeRowFocus()
289
305
  for (const row of rows.values()) row.entry.remove()
290
306
  rows.clear()
291
307
  }
@@ -15,6 +15,13 @@ const STYLE_ID = 'dsh-tiddlywiki-styles'
15
15
 
16
16
  const CSS_TEXT = `
17
17
  /* ── sidebar entry ───────────────────────────────────────────── */
18
+ /* ⚠️ hidden 属性在 CSS 里只是 display:none,**任何显式 display 都能盖掉它**。
19
+ 这条全局兜底(v0.28.5)盖住全表里所有自带 display 的组件。已经踩过 12 次:
20
+ 面板 iframe、错误块、快速笔记、FAB 菜单/提示、右侧栏、目标库下拉、草稿栏、
21
+ 最近列表 —— 每次都是"某个元素 hidden 了却还显示",然后为它单独补一条规则。
22
+ 多库模式下默认那一行「TiddlyWiki」也是靠 hidden 让位给每库入口行的,没有这条
23
+ 它照样渲染(作者 2026-09-28 报障)。一条全局规则替掉那 12 条逐元素规则。 */
24
+ [hidden] { display: none !important; }
18
25
  .dsh-tw-entry {
19
26
  display: flex; align-items: center; gap: 8px; position: relative;
20
27
  width: calc(100% - 8px); margin: 2px 4px; padding: 6px 10px;
@@ -69,9 +76,6 @@ html[data-dsh-tw-active] .dshDesktopConversationSurface > :not([data-dsh-tw-view
69
76
  /* The iframe background follows the DSH theme so a blank/preload frame never
70
77
  flashes pure white in dark mode (TW paints its own palette once loaded). */
71
78
  .dsh-tw-panel-frame { flex: 1; min-height: 0; border: 0; width: 100%; display: block; background: var(--dsw-alias-bg-layer-1, #fff); }
72
- /* [hidden] must beat the author display rules above (UA hidden is overridden). */
73
- .dsh-tw-panel-frame[hidden],
74
- .dsh-tw-panel-error[hidden] { display: none !important; }
75
79
 
76
80
  .dsh-tw-panel-error {
77
81
  flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center;
@@ -98,8 +102,6 @@ html[data-dsh-tw-active] .dshDesktopConversationSurface > :not([data-dsh-tw-view
98
102
  flex: 1; min-height: 0; border: 0; width: 100%; display: block;
99
103
  background: var(--dsw-alias-bg-layer-1, #fff);
100
104
  }
101
- .dsh-tw-rightbar-frame[hidden],
102
- .dsh-tw-rightbar-error[hidden] { display: none !important; }
103
105
  .dsh-tw-rightbar-error {
104
106
  flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center;
105
107
  gap: 10px; color: var(--dsw-alias-label-secondary, #666); font-size: 13px; text-align: center; padding: 20px;
@@ -122,9 +124,7 @@ html[data-dsh-tw-active] .dshDesktopConversationSurface > :not([data-dsh-tw-view
122
124
  display: flex; flex-direction: column; align-items: flex-end; gap: 10px;
123
125
  font-family: inherit;
124
126
  }
125
- /* The wrapper's display:flex would beat the UA [hidden]{display:none} rule,
126
- so the card's show/hide (root.hidden) needs an explicit rule. */
127
- .dsh-tw-note[hidden] { display: none; }
127
+
128
128
  .dsh-tw-note-card {
129
129
  width: 340px; max-width: calc(100vw - 40px);
130
130
  background: var(--dsw-alias-bg-layer-2, #fff); color: var(--dsw-alias-label-primary, #222);
@@ -135,7 +135,7 @@ html[data-dsh-tw-active] .dshDesktopConversationSurface > :not([data-dsh-tw-view
135
135
  backdrop-filter: blur(14px); -webkit-backdrop-filter: blur(14px);
136
136
  animation: dsh-tw-note-in 180ms ease;
137
137
  }
138
- .dsh-tw-note-card[hidden] { display: none; }
138
+
139
139
  @keyframes dsh-tw-note-in {
140
140
  from { opacity: 0; transform: translateY(8px) scale(.98); }
141
141
  to { opacity: 1; transform: translateY(0) scale(1); }
@@ -460,7 +460,7 @@ html[data-dsh-tw-active] .dshDesktopConversationSurface > :not([data-dsh-tw-view
460
460
  backdrop-filter: blur(14px); -webkit-backdrop-filter: blur(14px);
461
461
  animation: dsh-tw-note-in 160ms ease;
462
462
  }
463
- .dsh-tw-fab-menu[hidden] { display: none; }
463
+
464
464
  .dsh-tw-fab-status {
465
465
  display: flex; align-items: center; gap: 7px;
466
466
  padding: 6px 9px; font-size: 12px; color: var(--dsw-alias-label-secondary, #666);
@@ -482,7 +482,7 @@ html[data-dsh-tw-active] .dshDesktopConversationSurface > :not([data-dsh-tw-view
482
482
  font-size: 11px; line-height: 1.6; white-space: pre-line; word-break: break-word;
483
483
  text-align: left;
484
484
  }
485
- .dsh-tw-fab-tip[hidden] { display: none; }
485
+
486
486
  .dsh-tw-fab-tip::after {
487
487
  content: ''; position: absolute; right: 16px; bottom: -5px;
488
488
  width: 10px; height: 10px; transform: rotate(45deg);
@@ -537,7 +537,7 @@ html[data-dsh-tw-active] .dshDesktopConversationSurface > :not([data-dsh-tw-view
537
537
  上面那条 display:inline-flex 就盖掉了,于是单库模式下这个空下拉照样显示出来
538
538
  (作者 2026-09-28 报障:"有个写入下拉,但是没有选项")。显式尊重 hidden,
539
539
  并把这一条写在后面(同优先级靠后者生效)。 */
540
- .dsh-tw-note-wiki[hidden] { display: none; }
540
+
541
541
  .dsh-tw-note-wiki-label { opacity: .7; }
542
542
  .dsh-tw-note-wiki-select {
543
543
  border: 1px solid var(--dsw-alias-border-l2, rgba(0,0,0,.18));
@@ -545,7 +545,7 @@ html[data-dsh-tw-active] .dshDesktopConversationSurface > :not([data-dsh-tw-view
545
545
  padding: 2px 6px; border-radius: 999px; max-width: 220px;
546
546
  }
547
547
  .dsh-tw-note-wiki-hint { font-size: 12px; opacity: .75; }
548
- .dsh-tw-note-wiki-hint[hidden] { display: none; }
548
+
549
549
 
550
550
  /* ── input-dock quick-note button(聊天输入框上方,conversation.input.dock)──
551
551
  该槽位渲染为「输入框上方的全宽条目」纵向 flex 排列(todo/cost-meter/goal/
@@ -579,7 +579,7 @@ html[data-dsh-tw-active] .dshDesktopConversationSurface > :not([data-dsh-tw-view
579
579
  background: color-mix(in srgb, var(--dsw-alias-state-warning-primary, #d9822b) 12%, transparent);
580
580
  color: var(--dsw-alias-label-primary, #222);
581
581
  }
582
- .dsh-tw-note-draft[hidden] { display: none; }
582
+
583
583
  .dsh-tw-note-draft-text { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
584
584
  .dsh-tw-note-draft-discard {
585
585
  border: 1px solid var(--dsw-alias-border-l2, rgba(0,0,0,.18));
@@ -598,7 +598,7 @@ html[data-dsh-tw-active] .dshDesktopConversationSurface > :not([data-dsh-tw-view
598
598
  box-shadow: var(--dsw-shadow-lv3, 0 8px 30px rgba(0,0,0,.22));
599
599
  font-size: 13px;
600
600
  }
601
- .dsh-tw-note-recent[hidden] { display: none; }
601
+
602
602
  .dsh-tw-note-recent-item {
603
603
  display: flex; align-items: baseline; justify-content: space-between; gap: 10px;
604
604
  padding: 6px 8px; border-radius: 7px; cursor: pointer;