commit f24aa0841da055f6d283445fcff3b8b78114a735 Author: kingOfSoySauce <60259156+kingOfSoySauce@users.noreply.github.com> Date: Fri Aug 14 22:30:15 2026 +0800 Initial release diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..97e52f8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +node_modules/ +.env +.env.* +!.env.example +.DS_Store +.idea/ +.vscode/ +*.log +*.tgz +coverage/ +test-results/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..42140d4 --- /dev/null +++ b/README.md @@ -0,0 +1,76 @@ +# 滑动变祖 · DeepSeek Harness 皮肤 + +把 Harness 的推理等级改为紧凑滑块,并用滑动变祖原项目的 0–30 强度映射同步人物、背景与界面配色。 + +## 交互规则 + +- 档位直接读取当前模型的 `reasoning.efforts`,不写死数量或名称。 +- 任意 N 个档位均匀落在 0–30:两档为 `0 / 30`,三档为 `0 / 15 / 30`,五档为 `0 / 7.5 / 15 / 22.5 / 30`。 +- 拖动期间只做连续视觉预览;指针松开、键盘操作完成或控件失焦时,才吸附到最近档位并通过官方 ModelDirectory 提交该档位原始 ID。 +- 不支持推理或只有一个可选档位的模型不显示滑块。 +- addressed subagent 不显示也不提交滑块。 + +## 外观开关 + +入口位于 `设置 → 通用设置 → 外观皮肤`: + +- `滑动变祖`:显示滑块并启用人物、背景和自适应配色。 +- `原生`:移除背景层、皮肤变量和滑块,恢复 Harness 原生界面。 + +选择保存在当前浏览器本地,不会改动模型配置。 + +## 安装 + +需要先安装 DeepSeek Harness CLI。发布到独立 GitHub 仓库后,可以直接从 Git 安装: + +```sh +dsh plugin --profile web add github:kingOfSoySauce/dsh-liang-skin#COMMIT +dsh --profile web --dump-config +dsh --profile web +``` + +请将 `COMMIT` 换成具体 commit。固定 commit 可避免之后的推送在未经审查时改变已安装代码。 + +也可以克隆后从本地路径安装: + +```sh +git clone https://github.com/kingOfSoySauce/dsh-liang-skin.git +cd dsh-liang-skin +dsh plugin --profile web add . +``` + +`--dump-config` 的输出中应出现 `dsh-client-liang-intensity-skin` 配置层。要卸载插件: + +```sh +dsh plugin --profile web remove dsh-client-liang-intensity-skin +``` + +### 从 GitHub Release tarball 安装 + +发布者可在仓库根目录生成可分发包: + +```sh +npm pack +``` + +将生成的 `.tgz` 上传为 GitHub Release 附件后,用户下载并安装: + +```sh +dsh plugin --profile web add ./dsh-client-liang-intensity-skin-0.1.0.tgz +``` + +包内已包含构建好的 `lib/client.js`,安装时不需要执行第三方 `prepare` 脚本。 + +## 本地开发 + +```sh +npm install +npm test +npm run build +``` + +修改 client 源码后需要运行 `npm run build`,并一起提交更新后的 `lib/client.js` 和 source map。 + +## 素材 + +插件包含运行时所需的图片和视频素材,安装后不需要额外下载。 diff --git a/assets/liang-evolution.mp4 b/assets/liang-evolution.mp4 new file mode 100644 index 0000000..a6a4354 Binary files /dev/null and b/assets/liang-evolution.mp4 differ diff --git a/assets/liang-evolution.webm b/assets/liang-evolution.webm new file mode 100644 index 0000000..d6cd62e Binary files /dev/null and b/assets/liang-evolution.webm differ diff --git a/assets/liang-poster.png b/assets/liang-poster.png new file mode 100644 index 0000000..ff5a3b0 Binary files /dev/null and b/assets/liang-poster.png differ diff --git a/assets/portrait-source-v2/GENERATION-BRIEF.md b/assets/portrait-source-v2/GENERATION-BRIEF.md new file mode 100644 index 0000000..5fb2400 --- /dev/null +++ b/assets/portrait-source-v2/GENERATION-BRIEF.md @@ -0,0 +1,98 @@ +# 滑动变祖 · 人像与视频生成交接 + +## 结论 + +- 计划关键图:**24 张** +- 已生成:**24 / 24** +- 分辨率与色彩:**1024 × 1024,RGB** +- 生成图目录:`packages/dsh-client-liang-intensity-skin/assets/portrait-source-v2/` +- 原视频关键帧目录:`packages/dsh-client-liang-intensity-skin/assets/portrait-source-v2/references/` +- 原视频:`packages/dsh-client-liang-intensity-skin/assets/liang-evolution.webm` + +`stage-low.png`、`stage-mid.png`、`stage-max.png` 是早期别名。后续生图和生视频只使用表格里的 24 个规范文件名。 + +## 公共提示词 + +下面这段作为每张图的公共提示词。把大括号变量替换为表格中对应内容;阶段服装、表情和装饰必须以该阶段原视频关键帧为准。 + +```text +Use case: identity-preserve +Asset type: square key portrait for a continuous image-to-video character evolution sequence + +Primary request: +Using {REFERENCE_FRAME} as the authoritative stage reference, create the level {LEVEL} key portrait of the same Chinese adult man. Preserve his identity exactly: facial structure, glasses, hairstyle, skin tone, age, eye spacing, nose, mouth and overall proportions. Preserve the outfit, expression, posture and stage-specific accessories shown in the authoritative reference. Do not borrow clothing or accessories from a later stage. + +Composition and camera: +Photorealistic 1:1 studio portrait, 1024×1024. Full centered half-body composition from the top of the head to the waist or slightly below the waist. The complete head, shoulders, upper arms and torso must remain inside the frame. Keep generous and balanced safety margins on the top, left and right. The head must be clearly smaller than a headshot and must not dominate the frame. Front-facing, eye-level camera, symmetrical posture, 85mm portrait-lens look, no perspective distortion. + +Continuity: +Use {PREVIOUS_KEY} and {NEXT_KEY} only as continuity references. Keep eye line, head size, shoulder width, body scale, camera distance, background horizon and light direction consistent across the sequence. Changes from adjacent keys must be gradual and attributable only to increasing intensity. Do not change identity. Do not introduce an intermediate transition pose or motion blur. + +Scene and lighting: +Clean full-frame studio background with a subtle neutral gradient appropriate to this stage. The background must fill the entire square evenly; do not bake a left-side blank layout or right-side placement into the image. Soft frontal key light, restrained rim light, realistic skin texture, natural fabric texture, high-end editorial photography. + +Constraints: +No close-up crop. No cropped head, shoulders, arms or torso. No side pose. No extra person. No duplicated limbs or accessories. No text, logo, UI, frame, border or watermark. No motion blur. No transition frame. No exaggerated fantasy elements beyond those already visible in the authoritative stage reference. Output only the final square image to {OUTPUT_PATH}. +``` + +## 24 张关键图状态表 + +| 顺序 | 强度 | 实际时间戳 | 状态 | 规范输出文件 | 权威阶段参考图 | 连续性参考 | +|---:|---:|---:|---|---|---|---| +| 1 | 00 | 0.000s | 已生成 | `stage-00.png` | `references/stage-00-0.000s.png` | 下一张 `level-01.png` | +| 2 | 01 | 0.268s | 已生成 | `level-01.png` | `references/level-01-0.268s.png` | 前一张 `stage-00.png`;下一张 `level-03.png` | +| 3 | 03 | 0.803s | 已生成 | `level-03.png` | `references/level-03-0.803s.png` | 前一张 `level-01.png`;下一张 `level-04.png` | +| 4 | 04 | 1.071s | 已生成 | `level-04.png` | `references/level-04-1.071s.png` | 前一张 `level-03.png`;下一张 `stage-06.png` | +| 5 | 06 | 1.600s | 已生成 | `stage-06.png` | `references/stage-06-1.600s.png` | 前一张 `level-04.png`;下一张 `level-07.png` | +| 6 | 07 | 1.874s | 已生成 | `level-07.png` | `references/level-07-1.874s.png` | 前一张 `stage-06.png`;下一张 `level-09.png` | +| 7 | 09 | 2.410s | 已生成 | `level-09.png` | `references/level-09-2.410s.png` | 前一张 `level-07.png`;下一张 `level-10.png` | +| 8 | 10 | 2.678s | 已生成 | `level-10.png` | `references/level-10-2.678s.png` | 前一张 `level-09.png`;下一张 `stage-12.png` | +| 9 | 12 | 3.200s | 已生成 | `stage-12.png` | `references/stage-12-3.200s.png` | 前一张 `level-10.png`;下一张 `level-13.png` | +| 10 | 13 | 3.481s | 已生成 | `level-13.png` | `references/level-13-3.481s.png` | 前一张 `stage-12.png`;下一张 `level-14.png` | +| 11 | 14 | 3.749s | 已生成 | `level-14.png` | `references/level-14-3.749s.png` | 前一张 `level-13.png`;下一张 `bridge-15.png` | +| 12 | 15(桥接) | 4.000s | 已生成 | `bridge-15.png` | `references/bridge-15-4.000s.png` | 前一张 `level-14.png`;下一张 `level-16.png` | +| 13 | 16 | 4.284s | 已生成 | `level-16.png` | `references/level-16-4.284s.png` | 前一张 `bridge-15.png`;下一张 `level-17.png` | +| 14 | 17 | 4.552s | 已生成 | `level-17.png` | `references/level-17-4.552s.png` | 前一张 `level-16.png`;下一张 `stage-18.png` | +| 15 | 18 | 4.800s | 已生成 | `stage-18.png` | `references/stage-18-4.800s.png` | 前一张 `level-17.png`;下一张 `level-19.png` | +| 16 | 19 | 5.088s | 已生成 | `level-19.png` | `references/level-19-5.088s.png` | 前一张 `stage-18.png`;下一张 `level-21.png` | +| 17 | 21 | 5.623s | 已生成 | `level-21.png` | `references/level-21-5.623s.png` | 前一张 `level-19.png`;下一张 `level-22.png` | +| 18 | 22 | 5.891s | 已生成 | `level-22.png` | `references/level-22-5.891s.png` | 前一张 `level-21.png`;下一张 `stage-24.png` | +| 19 | 24 | 6.400s | 已生成 | `stage-24.png` | `references/stage-24-6.400s.png` | 前一张 `level-22.png`;下一张 `level-25.png` | +| 20 | 25 | 6.694s | 已生成 | `level-25.png` | `references/level-25-6.694s.png` | 前一张 `stage-24.png`;下一张 `bridge-27.png` | +| 21 | 27(桥接) | 7.200s | 已生成 | `bridge-27.png` | `references/bridge-27-7.200s.png` | 前一张 `level-25.png`;下一张 `level-28.png` | +| 22 | 28 | 7.497s | 已生成 | `level-28.png` | `references/level-28-7.497s.png` | 前一张 `bridge-27.png`;下一张 `level-29.png` | +| 23 | 29 | 7.765s | 已生成 | `level-29.png` | `references/level-29-7.765s.png` | 前一张 `level-28.png`;下一张 `stage-30.png` | +| 24 | 30 | 8.000s | 已生成 | `stage-30.png` | `references/stage-30-8.000s.png` | 前一张 `level-29.png` | + +所有表格路径均相对于本文件所在目录。 + +## 生视频输入顺序 + +```text +stage-00.png +level-01.png +level-03.png +level-04.png +stage-06.png +level-07.png +level-09.png +level-10.png +stage-12.png +level-13.png +level-14.png +bridge-15.png +level-16.png +level-17.png +stage-18.png +level-19.png +level-21.png +level-22.png +stage-24.png +level-25.png +bridge-27.png +level-28.png +level-29.png +stage-30.png +``` + +视频 agent 应锁定镜头、构图和人物位置,只在相邻关键图之间做外观演化;不要加入推拉、横移、眨眼、转头、嘴部动作或随机肢体运动。输出仍按当前 UI 使用的 1:1 方形画幅制作,左侧留白和人物右移由 UI 的裁切、定位与渐变遮罩完成。 diff --git a/assets/portrait-source-v2/bridge-15.png b/assets/portrait-source-v2/bridge-15.png new file mode 100644 index 0000000..acdc6af Binary files /dev/null and b/assets/portrait-source-v2/bridge-15.png differ diff --git a/assets/portrait-source-v2/bridge-27.png b/assets/portrait-source-v2/bridge-27.png new file mode 100644 index 0000000..c981698 Binary files /dev/null and b/assets/portrait-source-v2/bridge-27.png differ diff --git a/assets/portrait-source-v2/level-01.png b/assets/portrait-source-v2/level-01.png new file mode 100644 index 0000000..9e5fb46 Binary files /dev/null and b/assets/portrait-source-v2/level-01.png differ diff --git a/assets/portrait-source-v2/level-03.png b/assets/portrait-source-v2/level-03.png new file mode 100644 index 0000000..7274a58 Binary files /dev/null and b/assets/portrait-source-v2/level-03.png differ diff --git a/assets/portrait-source-v2/level-04.png b/assets/portrait-source-v2/level-04.png new file mode 100644 index 0000000..e870fb9 Binary files /dev/null and b/assets/portrait-source-v2/level-04.png differ diff --git a/assets/portrait-source-v2/level-07.png b/assets/portrait-source-v2/level-07.png new file mode 100644 index 0000000..de1a3ff Binary files /dev/null and b/assets/portrait-source-v2/level-07.png differ diff --git a/assets/portrait-source-v2/level-09.png b/assets/portrait-source-v2/level-09.png new file mode 100644 index 0000000..775cbcd Binary files /dev/null and b/assets/portrait-source-v2/level-09.png differ diff --git a/assets/portrait-source-v2/level-10.png b/assets/portrait-source-v2/level-10.png new file mode 100644 index 0000000..614768e Binary files /dev/null and b/assets/portrait-source-v2/level-10.png differ diff --git a/assets/portrait-source-v2/level-13.png b/assets/portrait-source-v2/level-13.png new file mode 100644 index 0000000..3464b32 Binary files /dev/null and b/assets/portrait-source-v2/level-13.png differ diff --git a/assets/portrait-source-v2/level-14.png b/assets/portrait-source-v2/level-14.png new file mode 100644 index 0000000..31236fd Binary files /dev/null and b/assets/portrait-source-v2/level-14.png differ diff --git a/assets/portrait-source-v2/level-16.png b/assets/portrait-source-v2/level-16.png new file mode 100644 index 0000000..64694be Binary files /dev/null and b/assets/portrait-source-v2/level-16.png differ diff --git a/assets/portrait-source-v2/level-17.png b/assets/portrait-source-v2/level-17.png new file mode 100644 index 0000000..d97080a Binary files /dev/null and b/assets/portrait-source-v2/level-17.png differ diff --git a/assets/portrait-source-v2/level-19.png b/assets/portrait-source-v2/level-19.png new file mode 100644 index 0000000..800c2b0 Binary files /dev/null and b/assets/portrait-source-v2/level-19.png differ diff --git a/assets/portrait-source-v2/level-21.png b/assets/portrait-source-v2/level-21.png new file mode 100644 index 0000000..ab726db Binary files /dev/null and b/assets/portrait-source-v2/level-21.png differ diff --git a/assets/portrait-source-v2/level-22.png b/assets/portrait-source-v2/level-22.png new file mode 100644 index 0000000..386910e Binary files /dev/null and b/assets/portrait-source-v2/level-22.png differ diff --git a/assets/portrait-source-v2/level-25.png b/assets/portrait-source-v2/level-25.png new file mode 100644 index 0000000..fdb8f91 Binary files /dev/null and b/assets/portrait-source-v2/level-25.png differ diff --git a/assets/portrait-source-v2/level-28.png b/assets/portrait-source-v2/level-28.png new file mode 100644 index 0000000..470684f Binary files /dev/null and b/assets/portrait-source-v2/level-28.png differ diff --git a/assets/portrait-source-v2/level-29.png b/assets/portrait-source-v2/level-29.png new file mode 100644 index 0000000..67eaba1 Binary files /dev/null and b/assets/portrait-source-v2/level-29.png differ diff --git a/assets/portrait-source-v2/references/bridge-15-4.000s.png b/assets/portrait-source-v2/references/bridge-15-4.000s.png new file mode 100644 index 0000000..bf6293a Binary files /dev/null and b/assets/portrait-source-v2/references/bridge-15-4.000s.png differ diff --git a/assets/portrait-source-v2/references/bridge-27-7.200s.png b/assets/portrait-source-v2/references/bridge-27-7.200s.png new file mode 100644 index 0000000..7ddf422 Binary files /dev/null and b/assets/portrait-source-v2/references/bridge-27-7.200s.png differ diff --git a/assets/portrait-source-v2/references/contact-sheet-final-24.png b/assets/portrait-source-v2/references/contact-sheet-final-24.png new file mode 100644 index 0000000..1d7acf0 Binary files /dev/null and b/assets/portrait-source-v2/references/contact-sheet-final-24.png differ diff --git a/assets/portrait-source-v2/references/contact-sheet-levels-16.png b/assets/portrait-source-v2/references/contact-sheet-levels-16.png new file mode 100644 index 0000000..67b942c Binary files /dev/null and b/assets/portrait-source-v2/references/contact-sheet-levels-16.png differ diff --git a/assets/portrait-source-v2/references/contact-sheet.png b/assets/portrait-source-v2/references/contact-sheet.png new file mode 100644 index 0000000..e0a5d22 Binary files /dev/null and b/assets/portrait-source-v2/references/contact-sheet.png differ diff --git a/assets/portrait-source-v2/references/level-01-0.268s.png b/assets/portrait-source-v2/references/level-01-0.268s.png new file mode 100644 index 0000000..c0e4da0 Binary files /dev/null and b/assets/portrait-source-v2/references/level-01-0.268s.png differ diff --git a/assets/portrait-source-v2/references/level-03-0.803s.png b/assets/portrait-source-v2/references/level-03-0.803s.png new file mode 100644 index 0000000..fb19c8c Binary files /dev/null and b/assets/portrait-source-v2/references/level-03-0.803s.png differ diff --git a/assets/portrait-source-v2/references/level-04-1.071s.png b/assets/portrait-source-v2/references/level-04-1.071s.png new file mode 100644 index 0000000..6aaf356 Binary files /dev/null and b/assets/portrait-source-v2/references/level-04-1.071s.png differ diff --git a/assets/portrait-source-v2/references/level-07-1.874s.png b/assets/portrait-source-v2/references/level-07-1.874s.png new file mode 100644 index 0000000..b2b445d Binary files /dev/null and b/assets/portrait-source-v2/references/level-07-1.874s.png differ diff --git a/assets/portrait-source-v2/references/level-09-2.410s.png b/assets/portrait-source-v2/references/level-09-2.410s.png new file mode 100644 index 0000000..527c8c4 Binary files /dev/null and b/assets/portrait-source-v2/references/level-09-2.410s.png differ diff --git a/assets/portrait-source-v2/references/level-10-2.678s.png b/assets/portrait-source-v2/references/level-10-2.678s.png new file mode 100644 index 0000000..ff7545e Binary files /dev/null and b/assets/portrait-source-v2/references/level-10-2.678s.png differ diff --git a/assets/portrait-source-v2/references/level-13-3.481s.png b/assets/portrait-source-v2/references/level-13-3.481s.png new file mode 100644 index 0000000..4a9b8de Binary files /dev/null and b/assets/portrait-source-v2/references/level-13-3.481s.png differ diff --git a/assets/portrait-source-v2/references/level-14-3.749s.png b/assets/portrait-source-v2/references/level-14-3.749s.png new file mode 100644 index 0000000..cb63897 Binary files /dev/null and b/assets/portrait-source-v2/references/level-14-3.749s.png differ diff --git a/assets/portrait-source-v2/references/level-16-4.284s.png b/assets/portrait-source-v2/references/level-16-4.284s.png new file mode 100644 index 0000000..da70df1 Binary files /dev/null and b/assets/portrait-source-v2/references/level-16-4.284s.png differ diff --git a/assets/portrait-source-v2/references/level-17-4.552s.png b/assets/portrait-source-v2/references/level-17-4.552s.png new file mode 100644 index 0000000..16f80fa Binary files /dev/null and b/assets/portrait-source-v2/references/level-17-4.552s.png differ diff --git a/assets/portrait-source-v2/references/level-19-5.088s.png b/assets/portrait-source-v2/references/level-19-5.088s.png new file mode 100644 index 0000000..e49efb5 Binary files /dev/null and b/assets/portrait-source-v2/references/level-19-5.088s.png differ diff --git a/assets/portrait-source-v2/references/level-21-5.623s.png b/assets/portrait-source-v2/references/level-21-5.623s.png new file mode 100644 index 0000000..fc7a0c3 Binary files /dev/null and b/assets/portrait-source-v2/references/level-21-5.623s.png differ diff --git a/assets/portrait-source-v2/references/level-22-5.891s.png b/assets/portrait-source-v2/references/level-22-5.891s.png new file mode 100644 index 0000000..e3e3cbf Binary files /dev/null and b/assets/portrait-source-v2/references/level-22-5.891s.png differ diff --git a/assets/portrait-source-v2/references/level-25-6.694s.png b/assets/portrait-source-v2/references/level-25-6.694s.png new file mode 100644 index 0000000..f3f5682 Binary files /dev/null and b/assets/portrait-source-v2/references/level-25-6.694s.png differ diff --git a/assets/portrait-source-v2/references/level-28-7.497s.png b/assets/portrait-source-v2/references/level-28-7.497s.png new file mode 100644 index 0000000..b8689e8 Binary files /dev/null and b/assets/portrait-source-v2/references/level-28-7.497s.png differ diff --git a/assets/portrait-source-v2/references/level-29-7.765s.png b/assets/portrait-source-v2/references/level-29-7.765s.png new file mode 100644 index 0000000..d11450f Binary files /dev/null and b/assets/portrait-source-v2/references/level-29-7.765s.png differ diff --git a/assets/portrait-source-v2/references/stage-00-0.000s.png b/assets/portrait-source-v2/references/stage-00-0.000s.png new file mode 100644 index 0000000..a875835 Binary files /dev/null and b/assets/portrait-source-v2/references/stage-00-0.000s.png differ diff --git a/assets/portrait-source-v2/references/stage-06-1.600s.png b/assets/portrait-source-v2/references/stage-06-1.600s.png new file mode 100644 index 0000000..a90750c Binary files /dev/null and b/assets/portrait-source-v2/references/stage-06-1.600s.png differ diff --git a/assets/portrait-source-v2/references/stage-12-3.200s.png b/assets/portrait-source-v2/references/stage-12-3.200s.png new file mode 100644 index 0000000..e87ebd0 Binary files /dev/null and b/assets/portrait-source-v2/references/stage-12-3.200s.png differ diff --git a/assets/portrait-source-v2/references/stage-18-4.800s.png b/assets/portrait-source-v2/references/stage-18-4.800s.png new file mode 100644 index 0000000..1eeec8b Binary files /dev/null and b/assets/portrait-source-v2/references/stage-18-4.800s.png differ diff --git a/assets/portrait-source-v2/references/stage-24-6.400s.png b/assets/portrait-source-v2/references/stage-24-6.400s.png new file mode 100644 index 0000000..9114840 Binary files /dev/null and b/assets/portrait-source-v2/references/stage-24-6.400s.png differ diff --git a/assets/portrait-source-v2/references/stage-30-8.000s.png b/assets/portrait-source-v2/references/stage-30-8.000s.png new file mode 100644 index 0000000..c214d14 Binary files /dev/null and b/assets/portrait-source-v2/references/stage-30-8.000s.png differ diff --git a/assets/portrait-source-v2/stage-00.png b/assets/portrait-source-v2/stage-00.png new file mode 100644 index 0000000..90fb47b Binary files /dev/null and b/assets/portrait-source-v2/stage-00.png differ diff --git a/assets/portrait-source-v2/stage-06.png b/assets/portrait-source-v2/stage-06.png new file mode 100644 index 0000000..4f25230 Binary files /dev/null and b/assets/portrait-source-v2/stage-06.png differ diff --git a/assets/portrait-source-v2/stage-12.png b/assets/portrait-source-v2/stage-12.png new file mode 100644 index 0000000..96b7ff7 Binary files /dev/null and b/assets/portrait-source-v2/stage-12.png differ diff --git a/assets/portrait-source-v2/stage-18.png b/assets/portrait-source-v2/stage-18.png new file mode 100644 index 0000000..15a3973 Binary files /dev/null and b/assets/portrait-source-v2/stage-18.png differ diff --git a/assets/portrait-source-v2/stage-24.png b/assets/portrait-source-v2/stage-24.png new file mode 100644 index 0000000..0eeca84 Binary files /dev/null and b/assets/portrait-source-v2/stage-24.png differ diff --git a/assets/portrait-source-v2/stage-30.png b/assets/portrait-source-v2/stage-30.png new file mode 100644 index 0000000..9eb90e1 Binary files /dev/null and b/assets/portrait-source-v2/stage-30.png differ diff --git a/assets/portrait-source-v2/stage-low.png b/assets/portrait-source-v2/stage-low.png new file mode 100644 index 0000000..90fb47b Binary files /dev/null and b/assets/portrait-source-v2/stage-low.png differ diff --git a/assets/portrait-source-v2/stage-max.png b/assets/portrait-source-v2/stage-max.png new file mode 100644 index 0000000..9eb90e1 Binary files /dev/null and b/assets/portrait-source-v2/stage-max.png differ diff --git a/assets/portrait-source-v2/stage-mid.png b/assets/portrait-source-v2/stage-mid.png new file mode 100644 index 0000000..15a3973 Binary files /dev/null and b/assets/portrait-source-v2/stage-mid.png differ diff --git a/cordis.patch.yml b/cordis.patch.yml new file mode 100644 index 0000000..5a524e5 --- /dev/null +++ b/cordis.patch.yml @@ -0,0 +1,3 @@ +- insert: + - id: liang-intensity-skin + name: dsh-client-liang-intensity-skin diff --git a/design-qa-comparison.png b/design-qa-comparison.png new file mode 100644 index 0000000..af239aa Binary files /dev/null and b/design-qa-comparison.png differ diff --git a/design-qa-final.png b/design-qa-final.png new file mode 100644 index 0000000..967bd6f Binary files /dev/null and b/design-qa-final.png differ diff --git a/design-qa.md b/design-qa.md new file mode 100644 index 0000000..3d13154 --- /dev/null +++ b/design-qa.md @@ -0,0 +1,41 @@ +# 滑动变祖 · Design QA + +final result: passed + +## Verified build + +- DSH `0.1.0-rc.6`, isolated profile on `127.0.0.1:3081` +- Plugin client bundle loads and the dynamic reasoning slider is present +- 8/8 unit cases pass; production client bundle builds successfully + +## Interaction checks + +- Drag/input updates only the continuous local preview +- Tooltip is mounted only while pointer or keyboard interaction is active +- Tooltip label combines the continuous Liang rank with the nearest dynamic model effort, for example `梁祖 · Max` +- Release snaps to the nearest effort and performs one model-selection commit +- Two-, three-, and five-effort models derive their stops from provider metadata +- UI remains native-light through level 23 and switches to the black/gold theme at level 24 (`梁神`) +- Portrait frames switch directly; no crossfade is retained + +## Visual checks + +- Light state keeps native white composer, pale message bubble, readable dark text, and a visible half-body portrait +- Dark state keeps the portrait behind the usable conversation area and aligns controls, sidebar, borders, and accents to the charcoal/gold reference +- Sidebar and main canvas share a continuous tonal family +- Tooltip is compact, follows the thumb, and does not obscure model selection or send controls +- Tooltip may extend beyond the slider box at either endpoint so its center remains aligned with the thumb +- Tooltip now follows the active skin surface: light surface with dark text in the light shell, dark surface with light text in the dark shell +- Light mode retains Harness blue accents and a black badge with light lettering +- Dark mode uses the calibrator's `#c19a49` / `#d5b56e` gold for the badge, hero glow, effort label, slider, and send action +- Slider thumb, rail, and ticks use one subdued accent family; the send arrow is dark on gold +- Light mode slider, rail, and ticks use the secondary text color; the send arrow remains white on blue +- Portraits render without brightness, contrast, or saturation filters; source artwork supplies the intended tonal grade +- Side-by-side reference comparison: `design-qa-comparison.png` +- Final implementation capture: `design-qa-final.png` + +## Asset handoff + +- 24/24 portrait sources are present at `assets/portrait-source-v2/` +- Final contact sheet: `assets/portrait-source-v2/references/contact-sheet-final-24.png` +- Generation/video handoff: `assets/portrait-source-v2/GENERATION-BRIEF.md` diff --git a/lib/client.js b/lib/client.js new file mode 100644 index 0000000..6d0f165 --- /dev/null +++ b/lib/client.js @@ -0,0 +1,627 @@ +window.__ModuleLoader__.load({id:"dsh-client-liang-intensity-skin",factory:(require)=>{var module={exports:{}};var exports=module.exports; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/client/index.tsx +var index_exports = {}; +__export(index_exports, { + apply: () => apply, + inject: () => inject +}); +module.exports = __toCommonJS(index_exports); +var import_react = require("react"); + +// src/client/skin.css +var skin_default = '.liang-skin-backdrop {\n position: fixed;\n z-index: 0;\n inset: 0;\n overflow: hidden;\n pointer-events: none;\n background: var(--liang-page, transparent);\n opacity: 0;\n transition: opacity 220ms ease, background-color 180ms linear;\n}\n\nbody[data-liang-skin="on"] .liang-skin-backdrop {\n opacity: 1;\n}\n\n.liang-skin-backdrop video,\n.liang-skin-backdrop img {\n position: absolute;\n top: 50%;\n right: 0;\n display: block;\n width: min(42vw, 720px);\n height: 100vh;\n object-fit: cover;\n object-position: 50% 42%;\n opacity: var(--liang-portrait-opacity, 0.45);\n transform: translateY(-50%);\n filter: none;\n mask-image: linear-gradient(90deg, transparent 0%, rgb(0 0 0 / 20%) 10%, black 30%, black 100%);\n transition: filter 180ms linear;\n}\n\n.liang-skin-backdrop img {\n display: none;\n}\n\n.liang-skin-backdrop[data-media="sequence"] video,\n.liang-skin-backdrop[data-media="sequence"] .liang-skin-poster {\n display: none;\n}\n\n.liang-skin-backdrop[data-media="sequence"] .liang-skin-sequence-frame {\n display: block;\n opacity: var(--liang-portrait-opacity, 0.82);\n}\n\n.liang-skin-backdrop[data-media="video"] .liang-skin-sequence-frame,\n.liang-skin-backdrop[data-media="video"] .liang-skin-poster {\n display: none;\n}\n\n.liang-skin-backdrop[data-media="poster"] video,\n.liang-skin-backdrop[data-media="poster"] .liang-skin-sequence-frame {\n display: none;\n}\n\n.liang-skin-backdrop[data-media="poster"] .liang-skin-poster {\n display: block;\n}\n\n.liang-skin-backdrop[data-media="color"] video,\n.liang-skin-backdrop[data-media="color"] img {\n display: none;\n}\n\n.liang-skin-backdrop::after {\n position: absolute;\n inset: 0;\n content: "";\n background: linear-gradient(90deg, var(--liang-page, transparent) 0 28%, transparent 57% 100%);\n}\n\nbody[data-liang-skin="on"] {\n --dsw-alias-bg-base: var(--liang-bg-base) !important;\n --dsw-alias-bg-layer-1: var(--liang-layer-1) !important;\n --dsw-alias-bg-layer-2: var(--liang-layer-2) !important;\n --dsw-alias-bg-layer-3: var(--liang-layer-3) !important;\n --dsw-specific-sidebar-fill: var(--liang-sidebar) !important;\n --dsw-alias-label-primary: var(--liang-ink) !important;\n --dsw-alias-label-primary-dimmed: var(--liang-ink) !important;\n --dsw-alias-label-secondary: var(--liang-secondary) !important;\n --dsw-alias-label-tertiary: var(--liang-tertiary) !important;\n --dsw-alias-label-caption: var(--liang-tertiary) !important;\n --dsw-alias-border-l1: var(--liang-border) !important;\n --dsw-alias-border-l2-darkmode-thin: var(--liang-border) !important;\n --dsw-alias-border-l2: var(--liang-border) !important;\n --dsw-alias-border-l3: var(--liang-border) !important;\n --dsw-alias-button-primary-fill: var(--liang-accent) !important;\n --dsw-alias-button-primary-hover: var(--liang-accent-hover) !important;\n --dsw-alias-button-info-fill: var(--liang-accent) !important;\n --dsw-alias-button-info-hover: var(--liang-accent-hover) !important;\n --dsw-alias-state-business-primary: var(--liang-accent) !important;\n --dsw-alias-interactive-bg-hover: var(--liang-hover) !important;\n --dsw-alias-interactive-bg-active: var(--liang-hover) !important;\n --dsw-alias-button-elevated-fill: var(--liang-layer-1) !important;\n --dsw-alias-button-floating-fill: var(--liang-layer-2) !important;\n --dsw-alias-button-floating-hover: var(--liang-layer-3) !important;\n --dsw-alias-interactive-bg-hover-solid: var(--liang-layer-2) !important;\n --dsw-specific-bubble: var(--liang-layer-2) !important;\n --dsw-specific-input-major: var(--liang-layer-1) !important;\n --dsw-specific-menu: var(--liang-layer-3) !important;\n --dsw-specific-selector: var(--liang-layer-2) !important;\n background: var(--liang-page) !important;\n}\n\nbody[data-liang-skin="on"]:is(\n [data-liang-stage="0"],\n [data-liang-stage="1"],\n [data-liang-stage="2"],\n [data-liang-stage="3"]\n) {\n --dsw-alias-brand-primary-new-colorprimary-new-color: rgb(65 118 230) !important;\n --dsw-alias-brand-primary: rgb(15 17 21) !important;\n --dsw-alias-brand-text: rgb(15 17 21) !important;\n --dsw-alias-button-primary-fill: rgb(15 17 21) !important;\n --dsw-alias-button-primary-hover: rgb(53 54 56) !important;\n --dsw-alias-button-info-fill: rgb(65 118 230) !important;\n --dsw-alias-button-info-hover: rgb(103 158 254) !important;\n --dsw-alias-state-business-primary: rgb(65 118 230) !important;\n --dsw-alias-label-primary-inverted: rgb(249 250 251) !important;\n --dsw-alias-button-elevated-fill: rgb(255 255 255) !important;\n --dsw-alias-button-floating-fill: rgb(255 255 255) !important;\n --dsw-alias-button-floating-hover: rgb(241 243 245) !important;\n --dsw-alias-interactive-bg-hover-solid: rgb(241 243 245) !important;\n --dsw-specific-bubble: rgb(237 243 254) !important;\n --dsw-specific-input-major: rgb(255 255 255) !important;\n --dsw-specific-menu: rgb(255 255 255) !important;\n --dsw-specific-selector: rgb(245 246 247) !important;\n}\n\nbody[data-liang-skin="on"][data-liang-stage="5"] {\n --dsw-alias-brand-primary-new-colorprimary-new-color: #c19a49 !important;\n --dsw-alias-brand-primary: #c19a49 !important;\n --dsw-alias-brand-text: #d5b56e !important;\n --dsw-alias-button-info-fill: #c19a49 !important;\n --dsw-alias-button-info-hover: #d5b56e !important;\n --dsw-alias-state-business-primary: #c19a49 !important;\n}\n\n/* Preserve the wordmark badge contrast even when the underlying Harness\n preference is dark while our low-intensity shell is light. */\nbody[data-liang-skin="on"]:is(\n [data-liang-stage="0"],\n [data-liang-stage="1"],\n [data-liang-stage="2"],\n [data-liang-stage="3"]\n) button[aria-label="\u65B0\u5EFA\u4F1A\u8BDD"] svg[viewBox="0 0 182 24"] > rect[width="52"] {\n fill: rgb(15 17 21) !important;\n}\n\nbody[data-liang-skin="on"]:is(\n [data-liang-stage="0"],\n [data-liang-stage="1"],\n [data-liang-stage="2"],\n [data-liang-stage="3"]\n) button[aria-label="\u65B0\u5EFA\u4F1A\u8BDD"] svg[viewBox="0 0 182 24"] > g[clip-path*="badge"] path {\n fill: rgb(249 250 251) !important;\n}\n\nbody[data-liang-skin="on"][data-liang-stage="5"] button[aria-label="\u65B0\u5EFA\u4F1A\u8BDD"] svg[viewBox="0 0 182 24"] > rect[width="52"] {\n fill: #c19a49 !important;\n}\n\nbody[data-liang-skin="on"][data-liang-stage="5"] button[aria-label="\u65B0\u5EFA\u4F1A\u8BDD"] svg[viewBox="0 0 182 24"] > g[clip-path*="badge"] path {\n fill: #171816 !important;\n}\n\nbody[data-liang-skin="on"][data-liang-stage="5"] [aria-label^="\u9009\u62E9\u6A21\u578B"] > span:nth-of-type(2) {\n color: #d5b56e !important;\n}\n\nbody[data-liang-skin="on"][data-liang-stage="5"] [class*="heroGlow"] ellipse {\n fill: #c19a49 !important;\n fill-opacity: 0.16 !important;\n}\n\nbody[data-liang-skin="on"][data-liang-stage="5"] span[class*="_previewBadge"] {\n color: #171816 !important;\n background: #c19a49 !important;\n}\n\nbody[data-liang-skin="on"][data-liang-stage="5"] button[aria-label="\u53D1\u9001\u6D88\u606F"] {\n color: #171816 !important;\n}\n\nbody[data-liang-skin="on"][data-liang-stage="5"] button[aria-label="\u53D1\u9001\u6D88\u606F"]:disabled {\n opacity: 0.62;\n}\n\nbody[data-liang-skin="on"]:is(\n [data-liang-stage="0"],\n [data-liang-stage="1"],\n [data-liang-stage="2"],\n [data-liang-stage="3"]\n) button[aria-label="\u53D1\u9001\u6D88\u606F"] {\n color: #fff !important;\n}\n\nbody[data-liang-skin="on"]:is(\n [data-liang-stage="0"],\n [data-liang-stage="1"],\n [data-liang-stage="2"],\n [data-liang-stage="3"]\n) button[aria-label="\u53D1\u9001\u6D88\u606F"]:disabled {\n color: rgb(255 255 255 / 92%) !important;\n background: rgb(65 118 230 / 42%) !important;\n opacity: 1;\n}\n\nbody[data-liang-skin="on"] > #root {\n position: relative;\n z-index: 1;\n background: transparent !important;\n}\n\nbody[data-liang-skin="on"] button,\nbody[data-liang-skin="on"] input,\nbody[data-liang-skin="on"] textarea {\n transition: color 160ms linear, background-color 160ms linear, border-color 160ms linear;\n}\n\n/* Harness can itself be in dark mode while the low intensity stages are light.\n The composer card has a native theme-mode fill, so explicitly bring only\n those light stages back to the original light surface and readable ink. */\nbody[data-liang-skin="on"]:is(\n [data-liang-stage="0"],\n [data-liang-stage="1"],\n [data-liang-stage="2"],\n [data-liang-stage="3"]\n) [data-composer-card="true"] {\n border-color: var(--liang-border) !important;\n color: var(--liang-ink) !important;\n background: var(--liang-layer-1) !important;\n box-shadow: 0 8px 28px rgb(20 22 20 / 8%);\n}\n\nbody[data-liang-skin="on"]:is(\n [data-liang-stage="0"],\n [data-liang-stage="1"],\n [data-liang-stage="2"],\n [data-liang-stage="3"]\n) [data-composer-card="true"] :is(textarea, button, [data-input-mirror="true"]) {\n color: var(--liang-ink) !important;\n caret-color: var(--liang-accent) !important;\n}\n\nbody[data-liang-skin="on"]:is(\n [data-liang-stage="0"],\n [data-liang-stage="1"],\n [data-liang-stage="2"],\n [data-liang-stage="3"]\n) [data-composer-card="true"] textarea::placeholder {\n color: var(--liang-tertiary) !important;\n opacity: 1;\n}\n\n.liang-effort-control {\n --liang-control-accent: var(--dsw-alias-brand-primary-new-colorprimary-new-color, #4176e6);\n --liang-control-rail: var(--dsw-alias-border-l3, rgb(0 0 0 / 16%));\n position: relative;\n display: flex;\n width: 124px;\n height: 28px;\n align-items: center;\n margin: 0 3px;\n overflow: visible;\n}\n\nbody[data-liang-skin="on"] .liang-effort-control {\n --liang-control-accent: var(--liang-accent);\n --liang-control-rail: color-mix(in srgb, var(--liang-accent) 34%, transparent);\n}\n\nbody[data-liang-skin="on"]:is(\n [data-liang-stage="0"],\n [data-liang-stage="1"],\n [data-liang-stage="2"],\n [data-liang-stage="3"]\n) .liang-effort-control {\n --liang-control-accent: var(--liang-secondary);\n --liang-control-rail: color-mix(in srgb, var(--liang-secondary) 28%, transparent);\n}\n\n.liang-effort-control__ticks {\n position: absolute;\n z-index: 0;\n inset: 0 10px;\n pointer-events: none;\n}\n\n.liang-effort-control__tooltip {\n position: absolute;\n z-index: 4;\n bottom: calc(100% + 7px);\n left: var(--liang-tooltip-position);\n min-width: max-content;\n padding: 5px 8px;\n border: 1px solid var(--liang-border, rgb(0 0 0 / 12%));\n border-radius: 7px;\n color: var(--liang-ink, #171816);\n background: var(--liang-layer-1, #fff);\n box-shadow: 0 5px 16px rgb(0 0 0 / 16%);\n font-size: 11px;\n font-weight: 600;\n line-height: 16px;\n letter-spacing: 0.01em;\n pointer-events: none;\n transform: translateX(-50%);\n white-space: nowrap;\n}\n\n.liang-effort-control__tooltip::after {\n position: absolute;\n top: 100%;\n left: 50%;\n width: 7px;\n height: 7px;\n content: "";\n background: inherit;\n transform: translate(-50%, -4px) rotate(45deg);\n}\n\n.liang-effort-control__tick {\n position: absolute;\n top: 50%;\n width: 1px;\n height: 7px;\n background: var(--liang-control-accent);\n opacity: 0.42;\n transform: translate(-50%, -50%);\n}\n\n.liang-effort-control__range {\n position: relative;\n z-index: 1;\n width: 100%;\n height: 28px;\n margin: 0;\n cursor: ew-resize;\n appearance: none;\n background: transparent;\n touch-action: pan-y;\n}\n\n.liang-effort-control__range:disabled {\n cursor: progress;\n opacity: 0.58;\n}\n\n.liang-effort-control__range::-webkit-slider-runnable-track {\n height: 1px;\n border-radius: 1px;\n background: linear-gradient(90deg, var(--liang-control-accent) 0 var(--liang-slider-progress), var(--liang-control-rail) var(--liang-slider-progress) 100%);\n}\n\n.liang-effort-control__range::-webkit-slider-thumb {\n width: 13px;\n height: 13px;\n margin-top: -6px;\n border: 1.5px solid color-mix(in srgb, var(--liang-control-accent) 72%, transparent);\n border-radius: 50%;\n appearance: none;\n background: radial-gradient(circle, var(--liang-control-accent) 0 2px, color-mix(in srgb, var(--liang-control-accent) 22%, var(--dsw-alias-bg-layer-1, #fff)) 2.5px);\n box-shadow: 0 1px 4px rgb(0 0 0 / 14%);\n}\n\nbody[data-liang-skin="on"] .liang-effort-control__range::-webkit-slider-thumb {\n width: 13px;\n height: 13px;\n margin-top: -6px;\n border-color: color-mix(in srgb, var(--liang-control-accent) 72%, transparent);\n background: radial-gradient(circle, var(--liang-control-accent) 0 2px, color-mix(in srgb, var(--liang-control-accent) 22%, var(--liang-layer-1)) 2.5px);\n}\n\n.liang-effort-control__range::-moz-range-track {\n height: 1px;\n background: var(--liang-control-rail);\n}\n\n.liang-effort-control__range::-moz-range-progress {\n height: 1px;\n background: var(--liang-control-accent);\n}\n\n.liang-effort-control__range::-moz-range-thumb {\n width: 11px;\n height: 11px;\n border: 1.5px solid color-mix(in srgb, var(--liang-control-accent) 72%, transparent);\n border-radius: 50%;\n background: color-mix(in srgb, var(--liang-control-accent) 24%, var(--dsw-alias-bg-layer-1, #fff));\n}\n\n.liang-effort-control__range:focus-visible {\n outline: none;\n}\n\n.liang-effort-control[data-state="error"] {\n --liang-control-accent: var(--dsw-alias-state-error-primary, #e43c3c);\n}\n\n.liang-settings-row {\n display: flex;\n min-height: 82px;\n align-items: center;\n justify-content: space-between;\n gap: 24px;\n padding: 16px 0;\n border-bottom: 1px solid var(--dsw-alias-border-l1, rgb(0 0 0 / 6%));\n color: var(--dsw-alias-label-primary);\n}\n\n.liang-settings-row__title {\n flex: 0 0 auto;\n font-size: 14px;\n font-weight: 500;\n}\n\n.liang-settings-row__choices {\n display: flex;\n gap: 8px;\n}\n\n.liang-settings-row__choice {\n min-width: 76px;\n height: 40px;\n padding: 0 14px;\n border: 1px solid var(--dsw-alias-border-l2, rgb(0 0 0 / 10%));\n border-radius: 10px;\n color: var(--dsw-alias-label-secondary);\n background: var(--dsw-alias-bg-layer-1);\n cursor: pointer;\n}\n\n.liang-settings-row__choice:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.liang-settings-row__choice[aria-pressed="true"] {\n border-color: var(--dsw-alias-label-primary);\n color: var(--dsw-alias-label-primary);\n box-shadow: inset 0 0 0 1px var(--dsw-alias-label-primary);\n}\n\n@media (max-width: 760px) {\n .liang-effort-control {\n width: 92px;\n }\n\n .liang-skin-backdrop video,\n .liang-skin-backdrop img {\n right: -18vw;\n width: 92vw;\n opacity: calc(var(--liang-portrait-opacity, 0.45) * 0.72);\n }\n\n .liang-settings-row {\n align-items: flex-start;\n flex-direction: column;\n gap: 12px;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .liang-skin-backdrop,\n .liang-skin-backdrop video,\n .liang-skin-backdrop img,\n body[data-liang-skin="on"] button,\n body[data-liang-skin="on"] input,\n body[data-liang-skin="on"] textarea {\n transition: none;\n }\n}\n'; + +// src/client/logic.ts +var PREVIEW_MAX_FRAME = 240; +var MAX_LEVEL = 30; +var LIANG_RANKS = ["\u5C0F\u96BE\u6881", "\u7262\u6881", "\u6881\u5B50", "\u6881\u5723", "\u6881\u795E", "\u6881\u7956"]; +var STOPS = [ + { at: 0, page: [232, 233, 229], surface: [248, 248, 245], surface2: [238, 239, 235], ink: [23, 24, 22], secondary: [112, 116, 111], accent: [181, 43, 36], portraitOpacity: 0.92 }, + { at: 6, page: [211, 211, 206], surface: [239, 239, 234], surface2: [224, 224, 218], ink: [26, 26, 24], secondary: [101, 101, 96], accent: [181, 43, 36], portraitOpacity: 0.93 }, + { at: 12, page: [171, 168, 162], surface: [211, 208, 201], surface2: [190, 186, 179], ink: [27, 26, 24], secondary: [83, 79, 74], accent: [166, 54, 42], portraitOpacity: 0.94 }, + { at: 18, page: [117, 112, 106], surface: [154, 148, 140], surface2: [128, 122, 115], ink: [24, 22, 20], secondary: [65, 61, 56], accent: [154, 56, 42], portraitOpacity: 0.94 }, + { at: 24, page: [43, 39, 37], surface: [48, 43, 40], surface2: [58, 51, 46], ink: [244, 241, 232], secondary: [184, 180, 169], accent: [181, 92, 54], portraitOpacity: 0.94 }, + { at: 30, page: [17, 17, 17], surface: [30, 27, 25], surface2: [41, 35, 30], ink: [244, 241, 232], secondary: [184, 180, 169], accent: [193, 154, 73], portraitOpacity: 0.94 } +]; +function clampFrame(value) { + if (!Number.isFinite(value)) return 0; + return Math.min(PREVIEW_MAX_FRAME, Math.max(0, Math.round(value))); +} +function frameForEffort(index, count) { + if (count <= 1 || !Number.isFinite(index)) return 0; + const safe = Math.min(count - 1, Math.max(0, Math.round(index))); + return Math.round(safe / (count - 1) * PREVIEW_MAX_FRAME); +} +function nearestEffortIndex(frame, efforts) { + if (efforts.length === 0) return -1; + const safe = clampFrame(frame); + let best = 0; + let distance = Math.abs(safe - frameForEffort(0, efforts.length)); + for (let index = 1; index < efforts.length; index += 1) { + const next = Math.abs(safe - frameForEffort(index, efforts.length)); + if (next < distance) { + best = index; + distance = next; + } + } + return best; +} +function selectedEffortIndex(efforts, selectedId, defaultId) { + const id = selectedId ?? defaultId; + return id === void 0 ? -1 : efforts.findIndex((effort) => effort.id === id); +} +function portraitBlendForLevel(level, anchors) { + if (anchors.length === 0) return { lowerIndex: -1, upperIndex: -1, mix: 0 }; + const safeLevel = Number.isFinite(level) ? Math.min(anchors[anchors.length - 1], Math.max(anchors[0], level)) : anchors[0]; + let upperIndex = anchors.findIndex((anchor) => anchor >= safeLevel); + if (upperIndex < 0) upperIndex = anchors.length - 1; + const lowerIndex = Math.max(0, upperIndex - (anchors[upperIndex] > safeLevel ? 1 : 0)); + const span = anchors[upperIndex] - anchors[lowerIndex]; + return { + lowerIndex, + upperIndex, + mix: span === 0 ? 0 : (safeLevel - anchors[lowerIndex]) / span + }; +} +function liangRankForFrame(rawFrame) { + const level = clampFrame(rawFrame) / PREVIEW_MAX_FRAME * MAX_LEVEL; + const index = level >= MAX_LEVEL ? LIANG_RANKS.length - 1 : Math.floor(level / 6); + return LIANG_RANKS[Math.min(LIANG_RANKS.length - 1, Math.max(0, index))]; +} +function indicatorLabel(rawFrame, efforts) { + const effort = efforts[nearestEffortIndex(rawFrame, efforts)]; + return effort === void 0 ? liangRankForFrame(rawFrame) : `${liangRankForFrame(rawFrame)} \xB7 ${effort.name}`; +} +function lerp(a, b, amount) { + return a + (b - a) * amount; +} +function mix(a, b, amount) { + return [ + Math.round(lerp(a[0], b[0], amount)), + Math.round(lerp(a[1], b[1], amount)), + Math.round(lerp(a[2], b[2], amount)) + ]; +} +function rgb(value, alpha = 1) { + return alpha === 1 ? `rgb(${value[0]} ${value[1]} ${value[2]})` : `rgb(${value[0]} ${value[1]} ${value[2]} / ${alpha})`; +} +function paletteForFrame(rawFrame) { + const frame = clampFrame(rawFrame); + const level = frame / PREVIEW_MAX_FRAME * MAX_LEVEL; + const portraitStage = Math.min(5, Math.floor(level / 6)); + const portraitFrom = STOPS[portraitStage]; + const portraitTo = STOPS[Math.min(5, portraitStage + 1)]; + const portraitAmount = portraitFrom === portraitTo ? 0 : (level - portraitFrom.at) / (portraitTo.at - portraitFrom.at); + const dark = level >= 24; + const stage = dark ? 5 : 0; + const ui = dark ? STOPS[5] : STOPS[0]; + const page = ui.page; + const surface = ui.surface; + const surface2 = ui.surface2; + const sidebar = mix(page, surface2, 0.25); + const ink = ui.ink; + const secondary = ui.secondary; + const accent = dark ? [193, 154, 73] : [65, 118, 230]; + const accentHover = mix(accent, ink, 0.13); + return { + level, + stage, + strength: level / MAX_LEVEL, + page: rgb(page), + // Keep the shell readable while allowing the right-side portrait to remain + // visibly present. Dense controls use the opaque layer tokens below. + base: rgb(page, dark ? 0.42 : 0.28), + layer1: rgb(surface, 0.94), + layer2: rgb(surface2, 0.96), + layer3: rgb(surface2, 0.99), + sidebar: rgb(sidebar, 0.96), + ink: rgb(ink), + secondary: rgb(secondary), + tertiary: rgb(mix(secondary, page, 0.28)), + border: rgb(ink, dark ? 0.15 : 0.12), + accent: rgb(accent), + accentHover: rgb(accentHover), + hover: rgb(ink, dark ? 0.09 : 0.07), + portraitOpacity: String(lerp( + portraitFrom.portraitOpacity, + portraitTo.portraitOpacity, + portraitAmount + )) + }; +} + +// src/client/index.tsx +var import_jsx_runtime = require("react/jsx-runtime"); +var PACKAGE_ID = "dsh-client-liang-intensity-skin"; +var LOCALE_NAMESPACE = "liang.skin"; +var ASSET_PREFIX = `/plugins/${PACKAGE_ID}/assets`; +var VIDEO_DURATION = 8.033; +var PREFERENCE_KEY = "dsh-liang-intensity-skin.enabled"; +var PORTRAIT_ANCHORS = [ + { level: 0, file: "stage-00.png" }, + { level: 6, file: "stage-06.png" }, + { level: 12, file: "stage-12.png" }, + { level: 15, file: "bridge-15.png" }, + { level: 18, file: "stage-18.png" }, + { level: 24, file: "stage-24.png" }, + { level: 27, file: "bridge-27.png" }, + { level: 30, file: "stage-30.png" } +]; +var cssVariables = [ + "--liang-strength", + "--liang-page", + "--liang-bg-base", + "--liang-layer-1", + "--liang-layer-2", + "--liang-layer-3", + "--liang-sidebar", + "--liang-ink", + "--liang-secondary", + "--liang-tertiary", + "--liang-border", + "--liang-accent", + "--liang-accent-hover", + "--liang-hover", + "--liang-portrait-opacity" +]; +var SkinPresenter = class { + scope; + root; + video; + poster; + portrait; + preloads; + enabled = true; + frame = 0; + pendingFrame = 0; + raf = 0; + disposed = false; + unsubscribe; + constructor(scope) { + this.scope = scope; + this.root = document.createElement("div"); + this.root.className = "liang-skin-backdrop"; + this.root.dataset.plugin = PACKAGE_ID; + this.root.dataset.media = "sequence"; + this.root.setAttribute("aria-hidden", "true"); + this.video = document.createElement("video"); + this.video.muted = true; + this.video.playsInline = true; + this.video.preload = "auto"; + const webm = document.createElement("source"); + webm.src = `${ASSET_PREFIX}/liang-evolution.webm`; + webm.type = "video/webm"; + const mp4 = document.createElement("source"); + mp4.src = `${ASSET_PREFIX}/liang-evolution.mp4`; + mp4.type = "video/mp4"; + this.video.append(webm, mp4); + this.poster = document.createElement("img"); + this.poster.className = "liang-skin-poster"; + this.poster.src = `${ASSET_PREFIX}/liang-poster.png`; + this.poster.alt = ""; + this.portrait = document.createElement("img"); + this.portrait.className = "liang-skin-sequence-frame"; + this.portrait.alt = ""; + this.portrait.draggable = false; + this.portrait.addEventListener("error", this.handleSequenceError); + this.preloads = PORTRAIT_ANCHORS.map(({ file }) => { + const image = new Image(); + image.src = `${ASSET_PREFIX}/portrait-source-v2/${file}`; + return image; + }); + this.root.append(this.video, this.portrait, this.poster); + document.body.prepend(this.root); + this.video.addEventListener("loadedmetadata", this.handleMetadata); + this.video.addEventListener("error", this.handleVideoError); + this.poster.addEventListener("error", this.handlePosterError); + this.video.load(); + this.unsubscribe = scope.subscribe(() => this.syncSettings()); + this.syncSettings(); + } + handleMetadata = () => { + this.seek(this.frame); + }; + handleVideoError = () => { + this.root.dataset.media = "poster"; + }; + handleSequenceError = () => { + this.root.dataset.media = "video"; + }; + handlePosterError = () => { + this.root.dataset.media = "color"; + }; + syncSettings() { + this.setEnabled(this.scope.getSnapshot().enabled); + } + isEnabled() { + return this.enabled; + } + setEnabled(enabled) { + this.enabled = enabled; + if (enabled) { + if (!this.root.isConnected) document.body.prepend(this.root); + document.body.dataset.liangSkin = "on"; + this.applyFrame(); + } else { + this.root.remove(); + delete document.body.dataset.liangSkin; + delete document.body.dataset.liangStage; + for (const name of cssVariables) document.body.style.removeProperty(name); + } + } + setFrame(frame) { + this.pendingFrame = Math.min(PREVIEW_MAX_FRAME, Math.max(0, Math.round(frame))); + this.frame = this.pendingFrame; + if (!this.enabled) return; + if (this.raf !== 0) return; + this.raf = requestAnimationFrame(() => { + this.raf = 0; + this.frame = this.pendingFrame; + this.applyFrame(); + }); + } + applyFrame() { + const palette = paletteForFrame(this.frame); + const body = document.body; + body.dataset.liangStage = String(palette.stage); + body.style.setProperty("--liang-strength", String(palette.strength)); + body.style.setProperty("--liang-page", palette.page); + body.style.setProperty("--liang-bg-base", palette.base); + body.style.setProperty("--liang-layer-1", palette.layer1); + body.style.setProperty("--liang-layer-2", palette.layer2); + body.style.setProperty("--liang-layer-3", palette.layer3); + body.style.setProperty("--liang-sidebar", palette.sidebar); + body.style.setProperty("--liang-ink", palette.ink); + body.style.setProperty("--liang-secondary", palette.secondary); + body.style.setProperty("--liang-tertiary", palette.tertiary); + body.style.setProperty("--liang-border", palette.border); + body.style.setProperty("--liang-accent", palette.accent); + body.style.setProperty("--liang-accent-hover", palette.accentHover); + body.style.setProperty("--liang-hover", palette.hover); + body.style.setProperty("--liang-portrait-opacity", palette.portraitOpacity); + this.updatePortrait(palette.level); + this.seek(this.frame); + } + updatePortrait(level) { + const { lowerIndex, upperIndex, mix: mix2 } = portraitBlendForLevel( + level, + PORTRAIT_ANCHORS.map((anchor) => anchor.level) + ); + const lower = PORTRAIT_ANCHORS[lowerIndex]; + const upper = PORTRAIT_ANCHORS[upperIndex]; + const selected = mix2 >= 0.5 ? upper : lower; + const source = `${ASSET_PREFIX}/portrait-source-v2/${selected.file}`; + if (this.portrait.getAttribute("src") !== source) this.portrait.src = source; + } + seek(frame) { + if (this.video.readyState < 1 || this.video.duration === 0) return; + const duration = Number.isFinite(this.video.duration) ? this.video.duration : VIDEO_DURATION; + const target = Math.min(Math.max(0, duration - 1e-3), frame / PREVIEW_MAX_FRAME * duration); + if (Math.abs(this.video.currentTime - target) > 0.025) this.video.currentTime = target; + } + async choose(enabled) { + this.setEnabled(enabled); + try { + await this.scope.set(enabled); + } catch (error) { + this.syncSettings(); + throw error; + } + } + dispose() { + if (this.disposed) return; + this.disposed = true; + this.unsubscribe(); + if (this.raf !== 0) cancelAnimationFrame(this.raf); + this.video.pause(); + this.video.removeEventListener("loadedmetadata", this.handleMetadata); + this.video.removeEventListener("error", this.handleVideoError); + this.portrait.removeEventListener("error", this.handleSequenceError); + this.poster.removeEventListener("error", this.handlePosterError); + for (const image of this.preloads) image.src = ""; + this.root.remove(); + document.body.removeAttribute("data-liang-skin"); + delete document.body.dataset.liangStage; + for (const name of cssVariables) document.body.style.removeProperty(name); + } +}; +function modelReasoning(state) { + const current = state.current; + if (current === null) return null; + const group = state.groups.find((item) => item.id === current.provider); + const model = group?.models.find((item) => item.id === current.model); + if (model?.reasoning === void 0) return null; + return { + selection: current, + efforts: model.reasoning.efforts, + defaultEffort: model.reasoning.defaultEffort + }; +} +function LiangEffortSlider({ directory, load, select, presenter, scope }) { + const state = (0, import_react.useSyncExternalStore)( + (listener) => directory.subscribe(listener), + () => directory.getSnapshot() + ); + const skin = (0, import_react.useSyncExternalStore)( + (listener) => scope.subscribe(listener), + () => scope.getSnapshot() + ); + const reasoning = (0, import_react.useMemo)(() => modelReasoning(state), [state]); + const efforts = reasoning?.efforts ?? []; + const committedIndex = selectedEffortIndex( + efforts, + reasoning?.selection.reasoningEffort, + reasoning?.defaultEffort + ); + const committedFrame = committedIndex < 0 ? 0 : frameForEffort(committedIndex, efforts.length); + const [frame, setFrame] = (0, import_react.useState)(committedFrame); + const [pending, setPending] = (0, import_react.useState)(false); + const [failed, setFailed] = (0, import_react.useState)(false); + const [interacting, setInteracting] = (0, import_react.useState)(false); + const dragging = (0, import_react.useRef)(false); + const enabled = skin.enabled; + (0, import_react.useEffect)(() => { + if (enabled) load(); + }, [enabled, load]); + (0, import_react.useEffect)(() => { + if (dragging.current || pending) return; + setFrame(committedFrame); + presenter.setFrame(committedFrame); + }, [committedFrame, pending, presenter]); + if (!enabled) return null; + if (reasoning === null || efforts.length < 2) return null; + const previewIndex = nearestEffortIndex(frame, efforts); + const previewEffort = efforts[previewIndex]; + const progress = `${frame / PREVIEW_MAX_FRAME * 100}%`; + const commit = async (rawFrame) => { + const targetIndex = nearestEffortIndex(rawFrame, efforts); + const target = efforts[targetIndex]; + if (target === void 0) return; + const targetFrame = frameForEffort(targetIndex, efforts.length); + dragging.current = false; + setFrame(targetFrame); + presenter.setFrame(targetFrame); + if (targetIndex === committedIndex || pending) return; + setPending(true); + setFailed(false); + const accepted = await select({ + provider: reasoning.selection.provider, + model: reasoning.selection.model, + reasoningEffort: target.id + }); + setPending(false); + if (!accepted) { + setFailed(true); + setFrame(committedFrame); + presenter.setFrame(committedFrame); + } + }; + return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)( + "div", + { + className: "liang-effort-control", + "data-plugin": PACKAGE_ID, + "data-state": failed ? "error" : pending ? "pending" : "ready", + title: previewEffort?.name, + children: [ + interacting && /* @__PURE__ */ (0, import_jsx_runtime.jsx)( + "output", + { + className: "liang-effort-control__tooltip", + style: { "--liang-tooltip-position": progress }, + children: indicatorLabel(frame, efforts) + } + ), + /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "liang-effort-control__ticks", "aria-hidden": "true", children: efforts.map((effort, index) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)( + "i", + { + className: "liang-effort-control__tick", + style: { left: `${frameForEffort(index, efforts.length) / PREVIEW_MAX_FRAME * 100}%` } + }, + effort.id + )) }), + /* @__PURE__ */ (0, import_jsx_runtime.jsx)( + "input", + { + className: "liang-effort-control__range", + type: "range", + min: 0, + max: PREVIEW_MAX_FRAME, + step: 1, + value: frame, + disabled: pending || state.status === "selecting", + "aria-label": "\u601D\u8003\u7B49\u7EA7", + "aria-valuetext": previewEffort?.name ?? "", + style: { "--liang-slider-progress": progress }, + onPointerDown: () => { + dragging.current = true; + setInteracting(true); + }, + onInput: (event) => { + dragging.current = true; + const next = Number(event.currentTarget.value); + setFrame(next); + presenter.setFrame(next); + }, + onPointerUp: (event) => { + setInteracting(false); + void commit(Number(event.currentTarget.value)); + }, + onPointerCancel: () => { + setInteracting(false); + dragging.current = false; + setFrame(committedFrame); + presenter.setFrame(committedFrame); + }, + onKeyUp: (event) => { + setInteracting(false); + if (event.key !== "Escape") void commit(Number(event.currentTarget.value)); + }, + onBlur: (event) => { + setInteracting(false); + if (dragging.current) void commit(Number(event.currentTarget.value)); + }, + onKeyDown: (event) => { + setInteracting(true); + if (event.key === "Escape" && !pending) { + setInteracting(false); + dragging.current = false; + setFrame(committedFrame); + presenter.setFrame(committedFrame); + } + } + } + ) + ] + } + ); +} +function AppearanceSkinRow({ scope, presenter, t }) { + const snapshot = (0, import_react.useSyncExternalStore)( + (listener) => scope.subscribe(listener), + () => scope.getSnapshot() + ); + const enabled = snapshot.enabled; + const [pending, setPending] = (0, import_react.useState)(false); + const choose = async (next) => { + if (next === enabled || pending) return; + setPending(true); + try { + await presenter.choose(next); + } finally { + setPending(false); + } + }; + return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "liang-settings-row", "data-plugin": PACKAGE_ID, children: [ + /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "liang-settings-row__title", children: t("appearance.title") }), + /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "liang-settings-row__choices", children: [ + /* @__PURE__ */ (0, import_jsx_runtime.jsx)( + "button", + { + className: "liang-settings-row__choice", + type: "button", + "aria-pressed": !enabled, + disabled: pending, + onClick: () => void choose(false), + children: t("appearance.native") + } + ), + /* @__PURE__ */ (0, import_jsx_runtime.jsx)( + "button", + { + className: "liang-settings-row__choice", + type: "button", + "aria-pressed": enabled, + disabled: pending, + onClick: () => void choose(true), + children: t("appearance.liang") + } + ) + ] }) + ] }); +} +var inject = [ + "slots", + "sessions", + "modelDirectories", + "locale" +]; +function createPreferenceStore() { + let snapshot = { + enabled: localStorage.getItem(PREFERENCE_KEY) !== "0" + }; + const listeners = /* @__PURE__ */ new Set(); + const onStorage = (event) => { + if (event.key !== PREFERENCE_KEY) return; + const enabled = event.newValue !== "0"; + if (enabled === snapshot.enabled) return; + snapshot = { enabled }; + for (const listener of listeners) listener(); + }; + window.addEventListener("storage", onStorage); + return { + getSnapshot: () => snapshot, + subscribe(listener) { + listeners.add(listener); + return () => listeners.delete(listener); + }, + async set(enabled) { + if (enabled === snapshot.enabled) return; + localStorage.setItem(PREFERENCE_KEY, enabled ? "1" : "0"); + snapshot = { enabled }; + for (const listener of listeners) listener(); + }, + dispose() { + window.removeEventListener("storage", onStorage); + listeners.clear(); + } + }; +} +function apply(ctx) { + const style = document.createElement("style"); + style.dataset.plugin = PACKAGE_ID; + style.textContent = skin_default; + document.head.append(style); + ctx.effect(() => () => style.remove(), "liang-intensity-skin: scoped styles"); + const scope = createPreferenceStore(); + ctx.effect(() => () => scope.dispose(), "liang-intensity-skin: appearance preference"); + const presenter = new SkinPresenter(scope); + ctx.effect(() => () => presenter.dispose(), "liang-intensity-skin: backdrop presenter"); + ctx.effect(() => ctx.locale.register(LOCALE_NAMESPACE, { + zh: { + "appearance.title": "\u5916\u89C2\u76AE\u80A4", + "appearance.native": "\u539F\u751F", + "appearance.liang": "\u6ED1\u52A8\u53D8\u7956" + }, + en: { + "appearance.title": "Visual skin", + "appearance.native": "Native", + "appearance.liang": "Slider" + } + }), "liang-intensity-skin: settings locale"); + ctx.slots.inject("settings.general.item", () => ctx.slots.register({ + name: "settings.general.item", + id: "liang-intensity-appearance", + order: 11, + locale: LOCALE_NAMESPACE, + inject: () => ({ scope, presenter }) + }, AppearanceSkinRow)); + ctx.slots.inject("conversation.input.right", () => ctx.slots.register({ + name: "conversation.input.right", + id: "liang-intensity-control", + order: 10, + inject: (sessionId) => { + const available = ctx.sessions.subagentAddress(sessionId) === void 0; + const directory = ctx.modelDirectories.directoryFor(sessionId); + return { + directory: directory.store, + presenter, + scope, + load: () => { + if (available) void directory.load().catch(() => void 0); + }, + select: (selection) => available ? directory.select(selection).then(() => true, () => false) : Promise.resolve(false) + }; + } + }, LiangEffortSlider)); +} +return module.exports;}}); +//# sourceMappingURL=client.js.map diff --git a/lib/client.js.map b/lib/client.js.map new file mode 100644 index 0000000..cb54a6c --- /dev/null +++ b/lib/client.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../src/client/index.tsx", "../src/client/skin.css", "../src/client/logic.ts"], + "sourcesContent": ["import {\n useEffect,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n} from \"react\";\nimport type { ClientContext, SnapshotStore } from \"@deepseek-ai/dsh-client-runtime/client\";\nimport type {} from \"@deepseek-ai/dsh-client-ui-conversation/client\";\nimport type {} from \"@deepseek-ai/dsh-client-ui-settings/client\";\nimport type {} from \"@deepseek-ai/dsh-client-ui-model-selection/client\";\nimport styles from \"./skin.css\";\nimport {\n PREVIEW_MAX_FRAME,\n frameForEffort,\n indicatorLabel,\n nearestEffortIndex,\n paletteForFrame,\n portraitBlendForLevel,\n selectedEffortIndex,\n type EffortLike,\n} from \"./logic\";\n\nconst PACKAGE_ID = \"dsh-client-liang-intensity-skin\";\nconst LOCALE_NAMESPACE = \"liang.skin\";\nconst ASSET_PREFIX = `/plugins/${PACKAGE_ID}/assets`;\nconst VIDEO_DURATION = 8.033;\nconst PREFERENCE_KEY = \"dsh-liang-intensity-skin.enabled\";\n\nconst PORTRAIT_ANCHORS = [\n { level: 0, file: \"stage-00.png\" },\n { level: 6, file: \"stage-06.png\" },\n { level: 12, file: \"stage-12.png\" },\n { level: 15, file: \"bridge-15.png\" },\n { level: 18, file: \"stage-18.png\" },\n { level: 24, file: \"stage-24.png\" },\n { level: 27, file: \"bridge-27.png\" },\n { level: 30, file: \"stage-30.png\" },\n] as const;\n\ninterface SkinSettings {\n enabled: boolean;\n}\n\ninterface PreferenceStore {\n getSnapshot(): SkinSettings;\n subscribe(listener: () => void): () => void;\n set(enabled: boolean): Promise;\n dispose(): void;\n}\n\ninterface ModelSelection {\n provider: string;\n model: string;\n reasoningEffort?: string;\n}\n\ninterface CatalogModel {\n id: string;\n reasoning?: {\n efforts: EffortLike[];\n defaultEffort?: string;\n };\n}\n\ninterface ModelDirectoryState {\n current: ModelSelection | null;\n groups: readonly { id: string; models: CatalogModel[] }[];\n status: \"idle\" | \"loading\" | \"ready\" | \"selecting\" | \"error\";\n error: string | null;\n}\n\ninterface ModelDirectory {\n store: SnapshotStore;\n load(): Promise;\n select(selection: ModelSelection): Promise;\n}\n\ninterface SliderProps {\n directory: SnapshotStore;\n load: () => void;\n select: (selection: ModelSelection) => Promise;\n presenter: SkinPresenter;\n scope: PreferenceStore;\n}\n\ninterface SettingsRowProps {\n scope: PreferenceStore;\n presenter: SkinPresenter;\n t: (key: string) => string;\n}\n\nconst cssVariables = [\n \"--liang-strength\",\n \"--liang-page\",\n \"--liang-bg-base\",\n \"--liang-layer-1\",\n \"--liang-layer-2\",\n \"--liang-layer-3\",\n \"--liang-sidebar\",\n \"--liang-ink\",\n \"--liang-secondary\",\n \"--liang-tertiary\",\n \"--liang-border\",\n \"--liang-accent\",\n \"--liang-accent-hover\",\n \"--liang-hover\",\n \"--liang-portrait-opacity\",\n] as const;\n\nclass SkinPresenter {\n private readonly scope: PreferenceStore;\n private readonly root: HTMLDivElement;\n private readonly video: HTMLVideoElement;\n private readonly poster: HTMLImageElement;\n private readonly portrait: HTMLImageElement;\n private readonly preloads: HTMLImageElement[];\n private enabled = true;\n private frame = 0;\n private pendingFrame = 0;\n private raf = 0;\n private disposed = false;\n private unsubscribe: () => void;\n\n constructor(scope: PreferenceStore) {\n this.scope = scope;\n this.root = document.createElement(\"div\");\n this.root.className = \"liang-skin-backdrop\";\n this.root.dataset.plugin = PACKAGE_ID;\n this.root.dataset.media = \"sequence\";\n this.root.setAttribute(\"aria-hidden\", \"true\");\n\n this.video = document.createElement(\"video\");\n this.video.muted = true;\n this.video.playsInline = true;\n this.video.preload = \"auto\";\n // A video poster stays painted while a paused video is scrubbed in some\n // browsers, which would make every effort show the same portrait. Keep the\n // separate image element as the true load-error fallback instead.\n const webm = document.createElement(\"source\");\n webm.src = `${ASSET_PREFIX}/liang-evolution.webm`;\n webm.type = \"video/webm\";\n const mp4 = document.createElement(\"source\");\n mp4.src = `${ASSET_PREFIX}/liang-evolution.mp4`;\n mp4.type = \"video/mp4\";\n this.video.append(webm, mp4);\n\n this.poster = document.createElement(\"img\");\n this.poster.className = \"liang-skin-poster\";\n this.poster.src = `${ASSET_PREFIX}/liang-poster.png`;\n this.poster.alt = \"\";\n\n this.portrait = document.createElement(\"img\");\n this.portrait.className = \"liang-skin-sequence-frame\";\n this.portrait.alt = \"\";\n this.portrait.draggable = false;\n this.portrait.addEventListener(\"error\", this.handleSequenceError);\n\n this.preloads = PORTRAIT_ANCHORS.map(({ file }) => {\n const image = new Image();\n image.src = `${ASSET_PREFIX}/portrait-source-v2/${file}`;\n return image;\n });\n\n this.root.append(this.video, this.portrait, this.poster);\n document.body.prepend(this.root);\n\n this.video.addEventListener(\"loadedmetadata\", this.handleMetadata);\n this.video.addEventListener(\"error\", this.handleVideoError);\n this.poster.addEventListener(\"error\", this.handlePosterError);\n this.video.load();\n this.unsubscribe = scope.subscribe(() => this.syncSettings());\n this.syncSettings();\n }\n\n private readonly handleMetadata = () => {\n this.seek(this.frame);\n };\n\n private readonly handleVideoError = () => {\n this.root.dataset.media = \"poster\";\n };\n\n private readonly handleSequenceError = () => {\n this.root.dataset.media = \"video\";\n };\n\n private readonly handlePosterError = () => {\n this.root.dataset.media = \"color\";\n };\n\n private syncSettings() {\n this.setEnabled(this.scope.getSnapshot().enabled);\n }\n\n isEnabled() {\n return this.enabled;\n }\n\n setEnabled(enabled: boolean) {\n this.enabled = enabled;\n if (enabled) {\n if (!this.root.isConnected) document.body.prepend(this.root);\n document.body.dataset.liangSkin = \"on\";\n this.applyFrame();\n } else {\n this.root.remove();\n delete document.body.dataset.liangSkin;\n delete document.body.dataset.liangStage;\n for (const name of cssVariables) document.body.style.removeProperty(name);\n }\n }\n\n setFrame(frame: number) {\n this.pendingFrame = Math.min(PREVIEW_MAX_FRAME, Math.max(0, Math.round(frame)));\n this.frame = this.pendingFrame;\n if (!this.enabled) return;\n if (this.raf !== 0) return;\n this.raf = requestAnimationFrame(() => {\n this.raf = 0;\n this.frame = this.pendingFrame;\n this.applyFrame();\n });\n }\n\n private applyFrame() {\n const palette = paletteForFrame(this.frame);\n const body = document.body;\n body.dataset.liangStage = String(palette.stage);\n body.style.setProperty(\"--liang-strength\", String(palette.strength));\n body.style.setProperty(\"--liang-page\", palette.page);\n body.style.setProperty(\"--liang-bg-base\", palette.base);\n body.style.setProperty(\"--liang-layer-1\", palette.layer1);\n body.style.setProperty(\"--liang-layer-2\", palette.layer2);\n body.style.setProperty(\"--liang-layer-3\", palette.layer3);\n body.style.setProperty(\"--liang-sidebar\", palette.sidebar);\n body.style.setProperty(\"--liang-ink\", palette.ink);\n body.style.setProperty(\"--liang-secondary\", palette.secondary);\n body.style.setProperty(\"--liang-tertiary\", palette.tertiary);\n body.style.setProperty(\"--liang-border\", palette.border);\n body.style.setProperty(\"--liang-accent\", palette.accent);\n body.style.setProperty(\"--liang-accent-hover\", palette.accentHover);\n body.style.setProperty(\"--liang-hover\", palette.hover);\n body.style.setProperty(\"--liang-portrait-opacity\", palette.portraitOpacity);\n this.updatePortrait(palette.level);\n this.seek(this.frame);\n }\n\n private updatePortrait(level: number) {\n const { lowerIndex, upperIndex, mix } = portraitBlendForLevel(\n level,\n PORTRAIT_ANCHORS.map((anchor) => anchor.level),\n );\n const lower = PORTRAIT_ANCHORS[lowerIndex];\n const upper = PORTRAIT_ANCHORS[upperIndex];\n const selected = mix >= 0.5 ? upper : lower;\n const source = `${ASSET_PREFIX}/portrait-source-v2/${selected.file}`;\n if (this.portrait.getAttribute(\"src\") !== source) this.portrait.src = source;\n }\n\n private seek(frame: number) {\n if (this.video.readyState < 1 || this.video.duration === 0) return;\n const duration = Number.isFinite(this.video.duration) ? this.video.duration : VIDEO_DURATION;\n const target = Math.min(Math.max(0, duration - 0.001), (frame / PREVIEW_MAX_FRAME) * duration);\n if (Math.abs(this.video.currentTime - target) > 0.025) this.video.currentTime = target;\n }\n\n async choose(enabled: boolean) {\n this.setEnabled(enabled);\n try {\n await this.scope.set(enabled);\n } catch (error) {\n this.syncSettings();\n throw error;\n }\n }\n\n dispose() {\n if (this.disposed) return;\n this.disposed = true;\n this.unsubscribe();\n if (this.raf !== 0) cancelAnimationFrame(this.raf);\n this.video.pause();\n this.video.removeEventListener(\"loadedmetadata\", this.handleMetadata);\n this.video.removeEventListener(\"error\", this.handleVideoError);\n this.portrait.removeEventListener(\"error\", this.handleSequenceError);\n this.poster.removeEventListener(\"error\", this.handlePosterError);\n for (const image of this.preloads) image.src = \"\";\n this.root.remove();\n document.body.removeAttribute(\"data-liang-skin\");\n delete document.body.dataset.liangStage;\n for (const name of cssVariables) document.body.style.removeProperty(name);\n }\n}\n\nfunction modelReasoning(state: ModelDirectoryState) {\n const current = state.current;\n if (current === null) return null;\n const group = state.groups.find((item) => item.id === current.provider);\n const model = group?.models.find((item) => item.id === current.model);\n if (model?.reasoning === undefined) return null;\n return {\n selection: current,\n efforts: model.reasoning.efforts,\n defaultEffort: model.reasoning.defaultEffort,\n };\n}\n\nfunction LiangEffortSlider({ directory, load, select, presenter, scope }: SliderProps) {\n const state = useSyncExternalStore(\n (listener) => directory.subscribe(listener),\n () => directory.getSnapshot(),\n );\n const skin = useSyncExternalStore(\n (listener) => scope.subscribe(listener),\n () => scope.getSnapshot(),\n );\n const reasoning = useMemo(() => modelReasoning(state), [state]);\n const efforts = reasoning?.efforts ?? [];\n const committedIndex = selectedEffortIndex(\n efforts,\n reasoning?.selection.reasoningEffort,\n reasoning?.defaultEffort,\n );\n const committedFrame = committedIndex < 0\n ? 0\n : frameForEffort(committedIndex, efforts.length);\n const [frame, setFrame] = useState(committedFrame);\n const [pending, setPending] = useState(false);\n const [failed, setFailed] = useState(false);\n const [interacting, setInteracting] = useState(false);\n const dragging = useRef(false);\n const enabled = skin.enabled;\n\n useEffect(() => {\n if (enabled) load();\n }, [enabled, load]);\n\n useEffect(() => {\n if (dragging.current || pending) return;\n setFrame(committedFrame);\n presenter.setFrame(committedFrame);\n }, [committedFrame, pending, presenter]);\n\n if (!enabled) return null;\n if (reasoning === null || efforts.length < 2) return null;\n\n const previewIndex = nearestEffortIndex(frame, efforts);\n const previewEffort = efforts[previewIndex];\n const progress = `${(frame / PREVIEW_MAX_FRAME) * 100}%`;\n\n const commit = async (rawFrame: number) => {\n const targetIndex = nearestEffortIndex(rawFrame, efforts);\n const target = efforts[targetIndex];\n if (target === undefined) return;\n const targetFrame = frameForEffort(targetIndex, efforts.length);\n dragging.current = false;\n setFrame(targetFrame);\n presenter.setFrame(targetFrame);\n if (targetIndex === committedIndex || pending) return;\n setPending(true);\n setFailed(false);\n const accepted = await select({\n provider: reasoning.selection.provider,\n model: reasoning.selection.model,\n reasoningEffort: target.id,\n });\n setPending(false);\n if (!accepted) {\n setFailed(true);\n setFrame(committedFrame);\n presenter.setFrame(committedFrame);\n }\n };\n\n return (\n \n {interacting && (\n \n {indicatorLabel(frame, efforts)}\n \n )}\n
\n {efforts.map((effort, index) => (\n \n ))}\n
\n {\n dragging.current = true;\n setInteracting(true);\n }}\n onInput={(event) => {\n dragging.current = true;\n const next = Number(event.currentTarget.value);\n setFrame(next);\n presenter.setFrame(next);\n }}\n onPointerUp={(event) => {\n setInteracting(false);\n void commit(Number(event.currentTarget.value));\n }}\n onPointerCancel={() => {\n setInteracting(false);\n dragging.current = false;\n setFrame(committedFrame);\n presenter.setFrame(committedFrame);\n }}\n onKeyUp={(event) => {\n setInteracting(false);\n if (event.key !== \"Escape\") void commit(Number(event.currentTarget.value));\n }}\n onBlur={(event) => {\n setInteracting(false);\n if (dragging.current) void commit(Number(event.currentTarget.value));\n }}\n onKeyDown={(event) => {\n setInteracting(true);\n if (event.key === \"Escape\" && !pending) {\n setInteracting(false);\n dragging.current = false;\n setFrame(committedFrame);\n presenter.setFrame(committedFrame);\n }\n }}\n />\n \n );\n}\n\nfunction AppearanceSkinRow({ scope, presenter, t }: SettingsRowProps) {\n const snapshot = useSyncExternalStore(\n (listener) => scope.subscribe(listener),\n () => scope.getSnapshot(),\n );\n const enabled = snapshot.enabled;\n const [pending, setPending] = useState(false);\n\n const choose = async (next: boolean) => {\n if (next === enabled || pending) return;\n setPending(true);\n try {\n await presenter.choose(next);\n } finally {\n setPending(false);\n }\n };\n\n return (\n
\n {t(\"appearance.title\")}\n
\n void choose(false)}\n >\n {t(\"appearance.native\")}\n \n void choose(true)}\n >\n {t(\"appearance.liang\")}\n \n
\n
\n );\n}\n\nexport const inject = [\n \"slots\",\n \"sessions\",\n \"modelDirectories\",\n \"locale\",\n];\n\nfunction createPreferenceStore(): PreferenceStore {\n let snapshot: SkinSettings = {\n enabled: localStorage.getItem(PREFERENCE_KEY) !== \"0\",\n };\n const listeners = new Set<() => void>();\n const onStorage = (event: StorageEvent) => {\n if (event.key !== PREFERENCE_KEY) return;\n const enabled = event.newValue !== \"0\";\n if (enabled === snapshot.enabled) return;\n snapshot = { enabled };\n for (const listener of listeners) listener();\n };\n window.addEventListener(\"storage\", onStorage);\n return {\n getSnapshot: () => snapshot,\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n async set(enabled) {\n if (enabled === snapshot.enabled) return;\n localStorage.setItem(PREFERENCE_KEY, enabled ? \"1\" : \"0\");\n snapshot = { enabled };\n for (const listener of listeners) listener();\n },\n dispose() {\n window.removeEventListener(\"storage\", onStorage);\n listeners.clear();\n },\n };\n}\n\nexport function apply(ctx: ClientContext) {\n const style = document.createElement(\"style\");\n style.dataset.plugin = PACKAGE_ID;\n style.textContent = styles;\n document.head.append(style);\n ctx.effect(() => () => style.remove(), \"liang-intensity-skin: scoped styles\");\n\n const scope = createPreferenceStore();\n ctx.effect(() => () => scope.dispose(), \"liang-intensity-skin: appearance preference\");\n const presenter = new SkinPresenter(scope);\n ctx.effect(() => () => presenter.dispose(), \"liang-intensity-skin: backdrop presenter\");\n\n ctx.effect(() => ctx.locale.register(LOCALE_NAMESPACE, {\n zh: {\n \"appearance.title\": \"\u5916\u89C2\u76AE\u80A4\",\n \"appearance.native\": \"\u539F\u751F\",\n \"appearance.liang\": \"\u6ED1\u52A8\u53D8\u7956\",\n },\n en: {\n \"appearance.title\": \"Visual skin\",\n \"appearance.native\": \"Native\",\n \"appearance.liang\": \"Slider\",\n },\n }), \"liang-intensity-skin: settings locale\");\n\n ctx.slots.inject(\"settings.general.item\", () => ctx.slots.register({\n name: \"settings.general.item\",\n id: \"liang-intensity-appearance\",\n order: 11,\n locale: LOCALE_NAMESPACE,\n inject: () => ({ scope, presenter }),\n }, AppearanceSkinRow));\n\n ctx.slots.inject(\"conversation.input.right\", () => ctx.slots.register({\n name: \"conversation.input.right\",\n id: \"liang-intensity-control\",\n order: 10,\n inject: (sessionId: string) => {\n const available = ctx.sessions.subagentAddress(sessionId) === undefined;\n const directory = ctx.modelDirectories.directoryFor(sessionId) as ModelDirectory;\n return {\n directory: directory.store,\n presenter,\n scope,\n load: () => {\n if (available) void directory.load().catch(() => undefined);\n },\n select: (selection: ModelSelection) => available\n ? directory.select(selection).then(() => true, () => false)\n : Promise.resolve(false),\n };\n },\n }, LiangEffortSlider));\n}\n", ".liang-skin-backdrop {\n position: fixed;\n z-index: 0;\n inset: 0;\n overflow: hidden;\n pointer-events: none;\n background: var(--liang-page, transparent);\n opacity: 0;\n transition: opacity 220ms ease, background-color 180ms linear;\n}\n\nbody[data-liang-skin=\"on\"] .liang-skin-backdrop {\n opacity: 1;\n}\n\n.liang-skin-backdrop video,\n.liang-skin-backdrop img {\n position: absolute;\n top: 50%;\n right: 0;\n display: block;\n width: min(42vw, 720px);\n height: 100vh;\n object-fit: cover;\n object-position: 50% 42%;\n opacity: var(--liang-portrait-opacity, 0.45);\n transform: translateY(-50%);\n filter: none;\n mask-image: linear-gradient(90deg, transparent 0%, rgb(0 0 0 / 20%) 10%, black 30%, black 100%);\n transition: filter 180ms linear;\n}\n\n.liang-skin-backdrop img {\n display: none;\n}\n\n.liang-skin-backdrop[data-media=\"sequence\"] video,\n.liang-skin-backdrop[data-media=\"sequence\"] .liang-skin-poster {\n display: none;\n}\n\n.liang-skin-backdrop[data-media=\"sequence\"] .liang-skin-sequence-frame {\n display: block;\n opacity: var(--liang-portrait-opacity, 0.82);\n}\n\n.liang-skin-backdrop[data-media=\"video\"] .liang-skin-sequence-frame,\n.liang-skin-backdrop[data-media=\"video\"] .liang-skin-poster {\n display: none;\n}\n\n.liang-skin-backdrop[data-media=\"poster\"] video,\n.liang-skin-backdrop[data-media=\"poster\"] .liang-skin-sequence-frame {\n display: none;\n}\n\n.liang-skin-backdrop[data-media=\"poster\"] .liang-skin-poster {\n display: block;\n}\n\n.liang-skin-backdrop[data-media=\"color\"] video,\n.liang-skin-backdrop[data-media=\"color\"] img {\n display: none;\n}\n\n.liang-skin-backdrop::after {\n position: absolute;\n inset: 0;\n content: \"\";\n background: linear-gradient(90deg, var(--liang-page, transparent) 0 28%, transparent 57% 100%);\n}\n\nbody[data-liang-skin=\"on\"] {\n --dsw-alias-bg-base: var(--liang-bg-base) !important;\n --dsw-alias-bg-layer-1: var(--liang-layer-1) !important;\n --dsw-alias-bg-layer-2: var(--liang-layer-2) !important;\n --dsw-alias-bg-layer-3: var(--liang-layer-3) !important;\n --dsw-specific-sidebar-fill: var(--liang-sidebar) !important;\n --dsw-alias-label-primary: var(--liang-ink) !important;\n --dsw-alias-label-primary-dimmed: var(--liang-ink) !important;\n --dsw-alias-label-secondary: var(--liang-secondary) !important;\n --dsw-alias-label-tertiary: var(--liang-tertiary) !important;\n --dsw-alias-label-caption: var(--liang-tertiary) !important;\n --dsw-alias-border-l1: var(--liang-border) !important;\n --dsw-alias-border-l2-darkmode-thin: var(--liang-border) !important;\n --dsw-alias-border-l2: var(--liang-border) !important;\n --dsw-alias-border-l3: var(--liang-border) !important;\n --dsw-alias-button-primary-fill: var(--liang-accent) !important;\n --dsw-alias-button-primary-hover: var(--liang-accent-hover) !important;\n --dsw-alias-button-info-fill: var(--liang-accent) !important;\n --dsw-alias-button-info-hover: var(--liang-accent-hover) !important;\n --dsw-alias-state-business-primary: var(--liang-accent) !important;\n --dsw-alias-interactive-bg-hover: var(--liang-hover) !important;\n --dsw-alias-interactive-bg-active: var(--liang-hover) !important;\n --dsw-alias-button-elevated-fill: var(--liang-layer-1) !important;\n --dsw-alias-button-floating-fill: var(--liang-layer-2) !important;\n --dsw-alias-button-floating-hover: var(--liang-layer-3) !important;\n --dsw-alias-interactive-bg-hover-solid: var(--liang-layer-2) !important;\n --dsw-specific-bubble: var(--liang-layer-2) !important;\n --dsw-specific-input-major: var(--liang-layer-1) !important;\n --dsw-specific-menu: var(--liang-layer-3) !important;\n --dsw-specific-selector: var(--liang-layer-2) !important;\n background: var(--liang-page) !important;\n}\n\nbody[data-liang-skin=\"on\"]:is(\n [data-liang-stage=\"0\"],\n [data-liang-stage=\"1\"],\n [data-liang-stage=\"2\"],\n [data-liang-stage=\"3\"]\n) {\n --dsw-alias-brand-primary-new-colorprimary-new-color: rgb(65 118 230) !important;\n --dsw-alias-brand-primary: rgb(15 17 21) !important;\n --dsw-alias-brand-text: rgb(15 17 21) !important;\n --dsw-alias-button-primary-fill: rgb(15 17 21) !important;\n --dsw-alias-button-primary-hover: rgb(53 54 56) !important;\n --dsw-alias-button-info-fill: rgb(65 118 230) !important;\n --dsw-alias-button-info-hover: rgb(103 158 254) !important;\n --dsw-alias-state-business-primary: rgb(65 118 230) !important;\n --dsw-alias-label-primary-inverted: rgb(249 250 251) !important;\n --dsw-alias-button-elevated-fill: rgb(255 255 255) !important;\n --dsw-alias-button-floating-fill: rgb(255 255 255) !important;\n --dsw-alias-button-floating-hover: rgb(241 243 245) !important;\n --dsw-alias-interactive-bg-hover-solid: rgb(241 243 245) !important;\n --dsw-specific-bubble: rgb(237 243 254) !important;\n --dsw-specific-input-major: rgb(255 255 255) !important;\n --dsw-specific-menu: rgb(255 255 255) !important;\n --dsw-specific-selector: rgb(245 246 247) !important;\n}\n\nbody[data-liang-skin=\"on\"][data-liang-stage=\"5\"] {\n --dsw-alias-brand-primary-new-colorprimary-new-color: #c19a49 !important;\n --dsw-alias-brand-primary: #c19a49 !important;\n --dsw-alias-brand-text: #d5b56e !important;\n --dsw-alias-button-info-fill: #c19a49 !important;\n --dsw-alias-button-info-hover: #d5b56e !important;\n --dsw-alias-state-business-primary: #c19a49 !important;\n}\n\n/* Preserve the wordmark badge contrast even when the underlying Harness\n preference is dark while our low-intensity shell is light. */\nbody[data-liang-skin=\"on\"]:is(\n [data-liang-stage=\"0\"],\n [data-liang-stage=\"1\"],\n [data-liang-stage=\"2\"],\n [data-liang-stage=\"3\"]\n) button[aria-label=\"\u65B0\u5EFA\u4F1A\u8BDD\"] svg[viewBox=\"0 0 182 24\"] > rect[width=\"52\"] {\n fill: rgb(15 17 21) !important;\n}\n\nbody[data-liang-skin=\"on\"]:is(\n [data-liang-stage=\"0\"],\n [data-liang-stage=\"1\"],\n [data-liang-stage=\"2\"],\n [data-liang-stage=\"3\"]\n) button[aria-label=\"\u65B0\u5EFA\u4F1A\u8BDD\"] svg[viewBox=\"0 0 182 24\"] > g[clip-path*=\"badge\"] path {\n fill: rgb(249 250 251) !important;\n}\n\nbody[data-liang-skin=\"on\"][data-liang-stage=\"5\"] button[aria-label=\"\u65B0\u5EFA\u4F1A\u8BDD\"] svg[viewBox=\"0 0 182 24\"] > rect[width=\"52\"] {\n fill: #c19a49 !important;\n}\n\nbody[data-liang-skin=\"on\"][data-liang-stage=\"5\"] button[aria-label=\"\u65B0\u5EFA\u4F1A\u8BDD\"] svg[viewBox=\"0 0 182 24\"] > g[clip-path*=\"badge\"] path {\n fill: #171816 !important;\n}\n\nbody[data-liang-skin=\"on\"][data-liang-stage=\"5\"] [aria-label^=\"\u9009\u62E9\u6A21\u578B\"] > span:nth-of-type(2) {\n color: #d5b56e !important;\n}\n\nbody[data-liang-skin=\"on\"][data-liang-stage=\"5\"] [class*=\"heroGlow\"] ellipse {\n fill: #c19a49 !important;\n fill-opacity: 0.16 !important;\n}\n\nbody[data-liang-skin=\"on\"][data-liang-stage=\"5\"] span[class*=\"_previewBadge\"] {\n color: #171816 !important;\n background: #c19a49 !important;\n}\n\nbody[data-liang-skin=\"on\"][data-liang-stage=\"5\"] button[aria-label=\"\u53D1\u9001\u6D88\u606F\"] {\n color: #171816 !important;\n}\n\nbody[data-liang-skin=\"on\"][data-liang-stage=\"5\"] button[aria-label=\"\u53D1\u9001\u6D88\u606F\"]:disabled {\n opacity: 0.62;\n}\n\nbody[data-liang-skin=\"on\"]:is(\n [data-liang-stage=\"0\"],\n [data-liang-stage=\"1\"],\n [data-liang-stage=\"2\"],\n [data-liang-stage=\"3\"]\n) button[aria-label=\"\u53D1\u9001\u6D88\u606F\"] {\n color: #fff !important;\n}\n\nbody[data-liang-skin=\"on\"]:is(\n [data-liang-stage=\"0\"],\n [data-liang-stage=\"1\"],\n [data-liang-stage=\"2\"],\n [data-liang-stage=\"3\"]\n) button[aria-label=\"\u53D1\u9001\u6D88\u606F\"]:disabled {\n color: rgb(255 255 255 / 92%) !important;\n background: rgb(65 118 230 / 42%) !important;\n opacity: 1;\n}\n\nbody[data-liang-skin=\"on\"] > #root {\n position: relative;\n z-index: 1;\n background: transparent !important;\n}\n\nbody[data-liang-skin=\"on\"] button,\nbody[data-liang-skin=\"on\"] input,\nbody[data-liang-skin=\"on\"] textarea {\n transition: color 160ms linear, background-color 160ms linear, border-color 160ms linear;\n}\n\n/* Harness can itself be in dark mode while the low intensity stages are light.\n The composer card has a native theme-mode fill, so explicitly bring only\n those light stages back to the original light surface and readable ink. */\nbody[data-liang-skin=\"on\"]:is(\n [data-liang-stage=\"0\"],\n [data-liang-stage=\"1\"],\n [data-liang-stage=\"2\"],\n [data-liang-stage=\"3\"]\n) [data-composer-card=\"true\"] {\n border-color: var(--liang-border) !important;\n color: var(--liang-ink) !important;\n background: var(--liang-layer-1) !important;\n box-shadow: 0 8px 28px rgb(20 22 20 / 8%);\n}\n\nbody[data-liang-skin=\"on\"]:is(\n [data-liang-stage=\"0\"],\n [data-liang-stage=\"1\"],\n [data-liang-stage=\"2\"],\n [data-liang-stage=\"3\"]\n) [data-composer-card=\"true\"] :is(textarea, button, [data-input-mirror=\"true\"]) {\n color: var(--liang-ink) !important;\n caret-color: var(--liang-accent) !important;\n}\n\nbody[data-liang-skin=\"on\"]:is(\n [data-liang-stage=\"0\"],\n [data-liang-stage=\"1\"],\n [data-liang-stage=\"2\"],\n [data-liang-stage=\"3\"]\n) [data-composer-card=\"true\"] textarea::placeholder {\n color: var(--liang-tertiary) !important;\n opacity: 1;\n}\n\n.liang-effort-control {\n --liang-control-accent: var(--dsw-alias-brand-primary-new-colorprimary-new-color, #4176e6);\n --liang-control-rail: var(--dsw-alias-border-l3, rgb(0 0 0 / 16%));\n position: relative;\n display: flex;\n width: 124px;\n height: 28px;\n align-items: center;\n margin: 0 3px;\n overflow: visible;\n}\n\nbody[data-liang-skin=\"on\"] .liang-effort-control {\n --liang-control-accent: var(--liang-accent);\n --liang-control-rail: color-mix(in srgb, var(--liang-accent) 34%, transparent);\n}\n\nbody[data-liang-skin=\"on\"]:is(\n [data-liang-stage=\"0\"],\n [data-liang-stage=\"1\"],\n [data-liang-stage=\"2\"],\n [data-liang-stage=\"3\"]\n) .liang-effort-control {\n --liang-control-accent: var(--liang-secondary);\n --liang-control-rail: color-mix(in srgb, var(--liang-secondary) 28%, transparent);\n}\n\n.liang-effort-control__ticks {\n position: absolute;\n z-index: 0;\n inset: 0 10px;\n pointer-events: none;\n}\n\n.liang-effort-control__tooltip {\n position: absolute;\n z-index: 4;\n bottom: calc(100% + 7px);\n left: var(--liang-tooltip-position);\n min-width: max-content;\n padding: 5px 8px;\n border: 1px solid var(--liang-border, rgb(0 0 0 / 12%));\n border-radius: 7px;\n color: var(--liang-ink, #171816);\n background: var(--liang-layer-1, #fff);\n box-shadow: 0 5px 16px rgb(0 0 0 / 16%);\n font-size: 11px;\n font-weight: 600;\n line-height: 16px;\n letter-spacing: 0.01em;\n pointer-events: none;\n transform: translateX(-50%);\n white-space: nowrap;\n}\n\n.liang-effort-control__tooltip::after {\n position: absolute;\n top: 100%;\n left: 50%;\n width: 7px;\n height: 7px;\n content: \"\";\n background: inherit;\n transform: translate(-50%, -4px) rotate(45deg);\n}\n\n.liang-effort-control__tick {\n position: absolute;\n top: 50%;\n width: 1px;\n height: 7px;\n background: var(--liang-control-accent);\n opacity: 0.42;\n transform: translate(-50%, -50%);\n}\n\n.liang-effort-control__range {\n position: relative;\n z-index: 1;\n width: 100%;\n height: 28px;\n margin: 0;\n cursor: ew-resize;\n appearance: none;\n background: transparent;\n touch-action: pan-y;\n}\n\n.liang-effort-control__range:disabled {\n cursor: progress;\n opacity: 0.58;\n}\n\n.liang-effort-control__range::-webkit-slider-runnable-track {\n height: 1px;\n border-radius: 1px;\n background: linear-gradient(90deg, var(--liang-control-accent) 0 var(--liang-slider-progress), var(--liang-control-rail) var(--liang-slider-progress) 100%);\n}\n\n.liang-effort-control__range::-webkit-slider-thumb {\n width: 13px;\n height: 13px;\n margin-top: -6px;\n border: 1.5px solid color-mix(in srgb, var(--liang-control-accent) 72%, transparent);\n border-radius: 50%;\n appearance: none;\n background: radial-gradient(circle, var(--liang-control-accent) 0 2px, color-mix(in srgb, var(--liang-control-accent) 22%, var(--dsw-alias-bg-layer-1, #fff)) 2.5px);\n box-shadow: 0 1px 4px rgb(0 0 0 / 14%);\n}\n\nbody[data-liang-skin=\"on\"] .liang-effort-control__range::-webkit-slider-thumb {\n width: 13px;\n height: 13px;\n margin-top: -6px;\n border-color: color-mix(in srgb, var(--liang-control-accent) 72%, transparent);\n background: radial-gradient(circle, var(--liang-control-accent) 0 2px, color-mix(in srgb, var(--liang-control-accent) 22%, var(--liang-layer-1)) 2.5px);\n}\n\n.liang-effort-control__range::-moz-range-track {\n height: 1px;\n background: var(--liang-control-rail);\n}\n\n.liang-effort-control__range::-moz-range-progress {\n height: 1px;\n background: var(--liang-control-accent);\n}\n\n.liang-effort-control__range::-moz-range-thumb {\n width: 11px;\n height: 11px;\n border: 1.5px solid color-mix(in srgb, var(--liang-control-accent) 72%, transparent);\n border-radius: 50%;\n background: color-mix(in srgb, var(--liang-control-accent) 24%, var(--dsw-alias-bg-layer-1, #fff));\n}\n\n.liang-effort-control__range:focus-visible {\n outline: none;\n}\n\n.liang-effort-control[data-state=\"error\"] {\n --liang-control-accent: var(--dsw-alias-state-error-primary, #e43c3c);\n}\n\n.liang-settings-row {\n display: flex;\n min-height: 82px;\n align-items: center;\n justify-content: space-between;\n gap: 24px;\n padding: 16px 0;\n border-bottom: 1px solid var(--dsw-alias-border-l1, rgb(0 0 0 / 6%));\n color: var(--dsw-alias-label-primary);\n}\n\n.liang-settings-row__title {\n flex: 0 0 auto;\n font-size: 14px;\n font-weight: 500;\n}\n\n.liang-settings-row__choices {\n display: flex;\n gap: 8px;\n}\n\n.liang-settings-row__choice {\n min-width: 76px;\n height: 40px;\n padding: 0 14px;\n border: 1px solid var(--dsw-alias-border-l2, rgb(0 0 0 / 10%));\n border-radius: 10px;\n color: var(--dsw-alias-label-secondary);\n background: var(--dsw-alias-bg-layer-1);\n cursor: pointer;\n}\n\n.liang-settings-row__choice:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.liang-settings-row__choice[aria-pressed=\"true\"] {\n border-color: var(--dsw-alias-label-primary);\n color: var(--dsw-alias-label-primary);\n box-shadow: inset 0 0 0 1px var(--dsw-alias-label-primary);\n}\n\n@media (max-width: 760px) {\n .liang-effort-control {\n width: 92px;\n }\n\n .liang-skin-backdrop video,\n .liang-skin-backdrop img {\n right: -18vw;\n width: 92vw;\n opacity: calc(var(--liang-portrait-opacity, 0.45) * 0.72);\n }\n\n .liang-settings-row {\n align-items: flex-start;\n flex-direction: column;\n gap: 12px;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .liang-skin-backdrop,\n .liang-skin-backdrop video,\n .liang-skin-backdrop img,\n body[data-liang-skin=\"on\"] button,\n body[data-liang-skin=\"on\"] input,\n body[data-liang-skin=\"on\"] textarea {\n transition: none;\n }\n}\n", "export const PREVIEW_MAX_FRAME = 240;\nexport const MAX_LEVEL = 30;\n\nconst LIANG_RANKS = [\"\u5C0F\u96BE\u6881\", \"\u7262\u6881\", \"\u6881\u5B50\", \"\u6881\u5723\", \"\u6881\u795E\", \"\u6881\u7956\"] as const;\n\nexport interface EffortLike {\n id: string;\n name: string;\n description?: string;\n}\n\nexport interface Palette {\n level: number;\n stage: number;\n strength: number;\n page: string;\n base: string;\n layer1: string;\n layer2: string;\n layer3: string;\n sidebar: string;\n ink: string;\n secondary: string;\n tertiary: string;\n border: string;\n accent: string;\n accentHover: string;\n hover: string;\n portraitOpacity: string;\n}\n\ntype Rgb = readonly [number, number, number];\n\ninterface PaletteStop {\n at: number;\n page: Rgb;\n surface: Rgb;\n surface2: Rgb;\n ink: Rgb;\n secondary: Rgb;\n accent: Rgb;\n portraitOpacity: number;\n}\n\n// These are the original calibrator's six stage anchors: pale neutral at the\n// low end, progressively smoked surfaces, then charcoal and antique gold.\nconst STOPS: readonly PaletteStop[] = [\n { at: 0, page: [232, 233, 229], surface: [248, 248, 245], surface2: [238, 239, 235], ink: [23, 24, 22], secondary: [112, 116, 111], accent: [181, 43, 36], portraitOpacity: 0.92 },\n { at: 6, page: [211, 211, 206], surface: [239, 239, 234], surface2: [224, 224, 218], ink: [26, 26, 24], secondary: [101, 101, 96], accent: [181, 43, 36], portraitOpacity: 0.93 },\n { at: 12, page: [171, 168, 162], surface: [211, 208, 201], surface2: [190, 186, 179], ink: [27, 26, 24], secondary: [83, 79, 74], accent: [166, 54, 42], portraitOpacity: 0.94 },\n { at: 18, page: [117, 112, 106], surface: [154, 148, 140], surface2: [128, 122, 115], ink: [24, 22, 20], secondary: [65, 61, 56], accent: [154, 56, 42], portraitOpacity: 0.94 },\n { at: 24, page: [43, 39, 37], surface: [48, 43, 40], surface2: [58, 51, 46], ink: [244, 241, 232], secondary: [184, 180, 169], accent: [181, 92, 54], portraitOpacity: 0.94 },\n { at: 30, page: [17, 17, 17], surface: [30, 27, 25], surface2: [41, 35, 30], ink: [244, 241, 232], secondary: [184, 180, 169], accent: [193, 154, 73], portraitOpacity: 0.94 },\n];\n\nexport function clampFrame(value: number): number {\n if (!Number.isFinite(value)) return 0;\n return Math.min(PREVIEW_MAX_FRAME, Math.max(0, Math.round(value)));\n}\n\nexport function frameForEffort(index: number, count: number): number {\n if (count <= 1 || !Number.isFinite(index)) return 0;\n const safe = Math.min(count - 1, Math.max(0, Math.round(index)));\n return Math.round((safe / (count - 1)) * PREVIEW_MAX_FRAME);\n}\n\nexport function nearestEffortIndex(frame: number, efforts: readonly EffortLike[]): number {\n if (efforts.length === 0) return -1;\n const safe = clampFrame(frame);\n let best = 0;\n let distance = Math.abs(safe - frameForEffort(0, efforts.length));\n for (let index = 1; index < efforts.length; index += 1) {\n const next = Math.abs(safe - frameForEffort(index, efforts.length));\n if (next < distance) {\n best = index;\n distance = next;\n }\n }\n return best;\n}\n\nexport function selectedEffortIndex(\n efforts: readonly EffortLike[],\n selectedId?: string,\n defaultId?: string,\n): number {\n const id = selectedId ?? defaultId;\n return id === undefined ? -1 : efforts.findIndex((effort) => effort.id === id);\n}\n\nexport function portraitBlendForLevel(level: number, anchors: readonly number[]) {\n if (anchors.length === 0) return { lowerIndex: -1, upperIndex: -1, mix: 0 };\n const safeLevel = Number.isFinite(level)\n ? Math.min(anchors[anchors.length - 1], Math.max(anchors[0], level))\n : anchors[0];\n let upperIndex = anchors.findIndex((anchor) => anchor >= safeLevel);\n if (upperIndex < 0) upperIndex = anchors.length - 1;\n const lowerIndex = Math.max(0, upperIndex - (anchors[upperIndex] > safeLevel ? 1 : 0));\n const span = anchors[upperIndex] - anchors[lowerIndex];\n return {\n lowerIndex,\n upperIndex,\n mix: span === 0 ? 0 : (safeLevel - anchors[lowerIndex]) / span,\n };\n}\n\nexport function liangRankForFrame(rawFrame: number): string {\n const level = (clampFrame(rawFrame) / PREVIEW_MAX_FRAME) * MAX_LEVEL;\n const index = level >= MAX_LEVEL ? LIANG_RANKS.length - 1 : Math.floor(level / 6);\n return LIANG_RANKS[Math.min(LIANG_RANKS.length - 1, Math.max(0, index))];\n}\n\nexport function indicatorLabel(rawFrame: number, efforts: readonly EffortLike[]): string {\n const effort = efforts[nearestEffortIndex(rawFrame, efforts)];\n return effort === undefined\n ? liangRankForFrame(rawFrame)\n : `${liangRankForFrame(rawFrame)} \u00B7 ${effort.name}`;\n}\n\nfunction lerp(a: number, b: number, amount: number): number {\n return a + (b - a) * amount;\n}\n\nfunction mix(a: Rgb, b: Rgb, amount: number): Rgb {\n return [\n Math.round(lerp(a[0], b[0], amount)),\n Math.round(lerp(a[1], b[1], amount)),\n Math.round(lerp(a[2], b[2], amount)),\n ];\n}\n\nfunction rgb(value: Rgb, alpha = 1): string {\n return alpha === 1\n ? `rgb(${value[0]} ${value[1]} ${value[2]})`\n : `rgb(${value[0]} ${value[1]} ${value[2]} / ${alpha})`;\n}\n\nexport function paletteForFrame(rawFrame: number): Palette {\n const frame = clampFrame(rawFrame);\n const level = (frame / PREVIEW_MAX_FRAME) * MAX_LEVEL;\n const portraitStage = Math.min(5, Math.floor(level / 6));\n const portraitFrom = STOPS[portraitStage];\n const portraitTo = STOPS[Math.min(5, portraitStage + 1)];\n const portraitAmount = portraitFrom === portraitTo\n ? 0\n : (level - portraitFrom.at) / (portraitTo.at - portraitFrom.at);\n\n // The UI itself is intentionally binary: levels 0\u201323 keep the native light\n // shell; entering the original \u6881\u795E/\u6881\u7956 region at level 24 switches black/gold.\n const dark = level >= 24;\n const stage = dark ? 5 : 0;\n const ui = dark ? STOPS[5] : STOPS[0];\n const page = ui.page;\n const surface = ui.surface;\n const surface2 = ui.surface2;\n const sidebar = mix(page, surface2, 0.25);\n const ink = ui.ink;\n const secondary = ui.secondary;\n // Keep Harness' native blue in the light shell. The original calibrator's\n // antique gold only becomes the product accent once the dark region begins.\n const accent: Rgb = dark ? [193, 154, 73] : [65, 118, 230];\n const accentHover = mix(accent, ink, 0.13);\n\n return {\n level,\n stage,\n strength: level / MAX_LEVEL,\n page: rgb(page),\n // Keep the shell readable while allowing the right-side portrait to remain\n // visibly present. Dense controls use the opaque layer tokens below.\n base: rgb(page, dark ? 0.42 : 0.28),\n layer1: rgb(surface, 0.94),\n layer2: rgb(surface2, 0.96),\n layer3: rgb(surface2, 0.99),\n sidebar: rgb(sidebar, 0.96),\n ink: rgb(ink),\n secondary: rgb(secondary),\n tertiary: rgb(mix(secondary, page, 0.28)),\n border: rgb(ink, dark ? 0.15 : 0.12),\n accent: rgb(accent),\n accentHover: rgb(accentHover),\n hover: rgb(ink, dark ? 0.09 : 0.07),\n portraitOpacity: String(lerp(\n portraitFrom.portraitOpacity,\n portraitTo.portraitOpacity,\n portraitAmount,\n )),\n };\n}\n"], + "mappings": "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", + "names": ["mix"] +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..f2e401a --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5111 @@ +{ + "name": "dsh-client-liang-intensity-skin", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "dsh-client-liang-intensity-skin", + "version": "0.1.0", + "devDependencies": { + "@types/react": "~18.3.1", + "esbuild": "^0.25.0", + "vitest": "^4.1.10" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-api-remotes": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-locale": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-runtime": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-ui-conversation": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-ui-model-selection": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-ui-settings": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-ui-settings-general": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-ui-slots": "^0.1.0-rc.6", + "@deepseek-ai/dsh-host-webserver": "^0.1.0-rc.6", + "react": "^18.2.0" + } + }, + "node_modules/@deepseek-ai/cordis": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/cordis/-/cordis-4.0.1.tgz", + "integrity": "sha512-YBdskTU2Po1kru3GgcUWUbkTsPMA9LkSQDAY8rBkFJeajdgcQad3QPJZE26JyK99Xb6HaASvoXg2DSUTeN/0Nw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@deepseek-ai/cosmokit": "^1.8.2", + "@standard-schema/spec": "^1.1.0" + }, + "bin": { + "cordis": "bin.js" + }, + "peerDependencies": { + "@deepseek-ai/cordis-plugin-include": "^1.0.6", + "@deepseek-ai/cordis-plugin-loader": "^1.0.2" + }, + "peerDependenciesMeta": { + "@deepseek-ai/cordis-plugin-include": { + "optional": true + }, + "@deepseek-ai/cordis-plugin-loader": { + "optional": true + } + } + }, + "node_modules/@deepseek-ai/cordis-plugin-include": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/cordis-plugin-include/-/cordis-plugin-include-1.0.6.tgz", + "integrity": "sha512-i1VXrZCbv6tk/iUgedCNjrxxArbWT3IvRZGB5sdqJ3ectnihivXXQbRZ8JJ73DSmAPvlMGmrbtjFAfm10yvXRg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@deepseek-ai/cosmokit": "^1.8.2", + "js-yaml": "^4.1.0" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/cordis-plugin-loader": "^1.0.2" + } + }, + "node_modules/@deepseek-ai/cordis-plugin-loader": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/cordis-plugin-loader/-/cordis-plugin-loader-1.0.2.tgz", + "integrity": "sha512-RIW9hoVyhYDWdCI9BsvtZccPde1ECLC4OAxupwowGTak78vwVTVdb3HezTSOK1Y1/Ax3Ru0LA1pYOB04CnTxIQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@deepseek-ai/cosmokit": "^1.8.2" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "node-addon-require-builtin": "^0.1.4" + }, + "peerDependenciesMeta": { + "node-addon-require-builtin": { + "optional": true + } + } + }, + "node_modules/@deepseek-ai/cosmokit": { + "version": "1.8.2", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/cosmokit/-/cosmokit-1.8.2.tgz", + "integrity": "sha512-muBOKtSrUKU5m/xpq8ZXWL6hQ/jgd4PhU2PqH97bcxIiLEJfNwZOGQEx4t/aS/GgxRAR+ra9pMHPMtTHU4sqqA==", + "license": "MIT", + "peer": true + }, + "node_modules/@deepseek-ai/dsh-agent": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-agent/-/dsh-agent-0.1.0-rc.6.tgz", + "integrity": "sha512-vtqq2pWTrzn0dKfj5kREZRpP82AwtGjGx9V1lYnKvF+Uc/a8zyWbSvjDE7V1d3YQAQJzs2cWO31hURWDekDXIA==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6", + "@deepseek-ai/dsh-llm": "^0.1.0-rc.6", + "@deepseek-ai/dsh-scope": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session": "^0.1.0-rc.6", + "@deepseek-ai/dsh-system-prompt": "^0.1.0-rc.6", + "@deepseek-ai/dsh-typert-protocol": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-agent-default-model": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-agent-default-model/-/dsh-agent-default-model-0.1.0-rc.6.tgz", + "integrity": "sha512-5Fl15p5mHVMlp69Ea0qeS81ej1Bt9vSJtCed+gjvzkKzv5y3VbJQ8PPBV34F1rTSyhTtjj5Q7TuDugQI5ZpjfA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@deepseek-ai/schemastery": "^3.18.1" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-agent": "^0.1.0-rc.6", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6", + "@deepseek-ai/dsh-llm": "^0.1.0-rc.6", + "@deepseek-ai/dsh-settings": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-agent-presets": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-agent-presets/-/dsh-agent-presets-0.1.0-rc.6.tgz", + "integrity": "sha512-LtDz0TYE7YNhJOhMDZ8s45xQG57bWF4F1SN3tjYDosaBdINIRTxJ0O80BC+KeliqFDw071ZNOzTUEelwEAIx7w==", + "license": "MIT", + "peer": true, + "dependencies": { + "@deepseek-ai/schemastery": "^3.18.1", + "js-yaml": "^4.1.0" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/cordis-plugin-include": "^1.0.6", + "@deepseek-ai/cordis-plugin-loader": "^1.0.2", + "@deepseek-ai/dsh-agent": "^0.1.0-rc.6", + "@deepseek-ai/dsh-atomic-write": "^0.1.0-rc.6", + "@deepseek-ai/dsh-home-paths": "^0.1.0-rc.6", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6", + "@deepseek-ai/dsh-scope": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session": "^0.1.0-rc.6", + "@deepseek-ai/dsh-settings": "^0.1.0-rc.6", + "@deepseek-ai/dsh-system-prompt": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-api-gateway": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-api-gateway/-/dsh-api-gateway-0.1.0-rc.6.tgz", + "integrity": "sha512-pmdQXBEJpUtr87jIfTyzyPWKGbUghzJno/nZpBWfhk+ZTjGwj0jKpyA5GhhS/tzzo67f5IdmEjcxddoDr3o3Kw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@deepseek-ai/dsh-typert-protocol": "^0.1.0-rc.6" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-client-connection": "^0.1.0-rc.6", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6", + "@deepseek-ai/dsh-typert-registry": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-api-remotes": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-api-remotes/-/dsh-api-remotes-0.1.0-rc.6.tgz", + "integrity": "sha512-yYsHgPr5ZiLk+i2RTREdMj8Gin7J8jG2qnTehZmLpCONGbJv2+grPPRuH7OwcQd+HguXL0ay/rlg6L1O1t8xDg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@deepseek-ai/dsh-typert-protocol": "^0.1.0-rc.6" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-agent": "^0.1.0-rc.6", + "@deepseek-ai/dsh-agent-presets": "^0.1.0-rc.6", + "@deepseek-ai/dsh-api-gateway": "^0.1.0-rc.6", + "@deepseek-ai/dsh-commands": "^0.1.0-rc.6", + "@deepseek-ai/dsh-cordis-host-runner": "^0.1.0-rc.6", + "@deepseek-ai/dsh-credentials": "^0.1.0-rc.6", + "@deepseek-ai/dsh-goal": "^0.1.0-rc.6", + "@deepseek-ai/dsh-host-plugin-inventory": "^0.1.0-rc.6", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6", + "@deepseek-ai/dsh-llm": "^0.1.0-rc.6", + "@deepseek-ai/dsh-message-feedback": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session-persistence": "^0.1.0-rc.6", + "@deepseek-ai/dsh-settings": "^0.1.0-rc.6", + "@deepseek-ai/dsh-typert-registry": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-atomic-write": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-atomic-write/-/dsh-atomic-write-0.1.0-rc.6.tgz", + "integrity": "sha512-Ot/2aygDzWuN4ypUkDJA6MpSlGbcvzzKnWAms0lg+2WUtPZr7O0cGb83K3TEO2NoAu0LJfVxlbo8Eya3tDaFtw==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-attachment": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-attachment/-/dsh-attachment-0.1.0-rc.6.tgz", + "integrity": "sha512-3P6N17NQ8jqSQGzeCs+svCIqArU8oq0YmgEAo+axN9aVuUDferWU4DLRSX59UGpmyldX4LQn81toA+c+DqMcHg==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-brand": "^0.1.0-rc.6", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-brand": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-brand/-/dsh-brand-0.1.0-rc.6.tgz", + "integrity": "sha512-E8j9Nby24qP4rfrdcfc7bpt1CHpGT3tYmycOJJkEOH4ptIdT1m2ro9nmnSd5CWYukTr64A77vjm2WGqHRI92UA==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-client-connection": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-client-connection/-/dsh-client-connection-0.1.0-rc.6.tgz", + "integrity": "sha512-ZHqZXmmdcxzw7HKwrSJDlU3/GVulvX/yAc1xHu7hw+cXWws2QK7ahQMpfdiywnxAVYadhFnsvLLkEPp38mOREg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@deepseek-ai/dsh-attachment": "^0.1.0-rc.6", + "@deepseek-ai/dsh-commands": "^0.1.0-rc.6", + "@deepseek-ai/dsh-host-apiproxy": "^0.1.0-rc.6", + "@deepseek-ai/dsh-llm": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session": "^0.1.0-rc.6", + "@deepseek-ai/dsh-tools": "^0.1.0-rc.6", + "@deepseek-ai/schemastery": "^3.18.1", + "ws": "^8.21.0" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-host-webserver": "^0.1.0-rc.6", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-client-locale": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-client-locale/-/dsh-client-locale-0.1.0-rc.6.tgz", + "integrity": "sha512-IoSLGxfHgcoaNzIlQ7YRTHRTy/MQCvvusrPCwlT30Xc9lpQe6Yo/LiRLDXlm9zbhN6imf/AoQZIfO+T3VGqneg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@deepseek-ai/dsh-settings": "^0.1.0-rc.6", + "@deepseek-ai/schemastery": "^3.18.1" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-api-remotes": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-connection": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-runtime": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-ui-primitives": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-ui-settings": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-ui-slots": "^0.1.0-rc.6", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6", + "react": "^18.2.0" + } + }, + "node_modules/@deepseek-ai/dsh-client-runtime": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-client-runtime/-/dsh-client-runtime-0.1.0-rc.6.tgz", + "integrity": "sha512-qprJMsVPLK2CyJmmCHwECJZlbM7XNG5yKr2Zf/yKYRyz0+QNJfHlIt+4C32tkjFFIq+Dx3gU5YaUQaLXxsR4/w==", + "license": "MIT", + "peer": true, + "dependencies": { + "@deepseek-ai/dsh-agent": "^0.1.0-rc.6", + "@deepseek-ai/dsh-attachment": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-connection": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-ui-slots": "^0.1.0-rc.6", + "@deepseek-ai/dsh-commands": "^0.1.0-rc.6", + "@deepseek-ai/dsh-host-apiproxy": "^0.1.0-rc.6", + "@deepseek-ai/dsh-llm": "^0.1.0-rc.6", + "@deepseek-ai/dsh-llm-retry": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session-projection": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session-title": "^0.1.0-rc.6", + "@deepseek-ai/dsh-tools": "^0.1.0-rc.6", + "immer": "^10.1.1", + "react": "^18.2.0", + "zustand": "~4.4.7" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-api-remotes": "^0.1.0-rc.6", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6", + "@deepseek-ai/dsh-typert-protocol": "^0.1.0-rc.6", + "@deepseek-ai/dsh-typert-registry": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-client-schema-form": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-client-schema-form/-/dsh-client-schema-form-0.1.0-rc.6.tgz", + "integrity": "sha512-2kFkweuNJlcnYRTy6rXx1gWoWNapFCDOvcYs7Kkir8n3JwQVB6xwTkQxVuZDBTD4jrdIpKTeetx4ghig49joTw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@deepseek-ai/schemastery": "^3.18.1" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-client-ui-attachment": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-client-ui-attachment/-/dsh-client-ui-attachment-0.1.0-rc.6.tgz", + "integrity": "sha512-/cnnH48758EQxJB/p3qPaAgFmQuxNgu29pGzSd4jH2W9dM29lNkLLZ15mrpS6IIDndx0bEzW/nLJ4x6/iowHnQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@deepseek-ai/dsh-attachment": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-ui-primitives": "^0.1.0-rc.6", + "clsx": "^2.0.0", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-client-ui-commands": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-client-ui-commands/-/dsh-client-ui-commands-0.1.0-rc.6.tgz", + "integrity": "sha512-he9tgQtm/yy4qJRzob37rTqfb+FTY1YWzvHjDwfAWzsHH0R8vO2r0L/WHX8ZFpdGzzcPAIGuwEjkDa5Q05PI0A==", + "license": "MIT", + "peer": true, + "dependencies": { + "clsx": "^2.0.0" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-api-remotes": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-locale": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-runtime": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-ui-conversation": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-ui-input-trigger": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-ui-primitives": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-ui-slots": "^0.1.0-rc.6", + "@deepseek-ai/dsh-commands": "^0.1.0-rc.6", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6", + "react": "^18.2.0" + } + }, + "node_modules/@deepseek-ai/dsh-client-ui-conversation": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-client-ui-conversation/-/dsh-client-ui-conversation-0.1.0-rc.6.tgz", + "integrity": "sha512-pKDKZYTRvO9pBTyHvVOtPDuTzNfCHwy7GmeIaRLjyCORLPM3uv0BuMc1qIHVI6LcK54l+cRGIuSSGah3bO/0vw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@deepseek-ai/dsh-settings": "^0.1.0-rc.6", + "@deepseek-ai/schemastery": "^3.18.1", + "clsx": "^2.0.0" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-agent": "^0.1.0-rc.6", + "@deepseek-ai/dsh-api-remotes": "^0.1.0-rc.6", + "@deepseek-ai/dsh-attachment": "^0.1.0-rc.6", + "@deepseek-ai/dsh-brand": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-connection": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-locale": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-runtime": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-ui-attachment": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-ui-input-trigger": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-ui-primitives": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-ui-settings": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-ui-slots": "^0.1.0-rc.6", + "@deepseek-ai/dsh-commands": "^0.1.0-rc.6", + "@deepseek-ai/dsh-compaction": "^0.1.0-rc.6", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6", + "@deepseek-ai/dsh-llm-retry": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session-stats": "^0.1.0-rc.6", + "@deepseek-ai/dsh-token-meter": "^0.1.0-rc.6", + "@deepseek-ai/dsh-tools": "^0.1.0-rc.6", + "react": "^18.2.0" + } + }, + "node_modules/@deepseek-ai/dsh-client-ui-input-trigger": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-client-ui-input-trigger/-/dsh-client-ui-input-trigger-0.1.0-rc.6.tgz", + "integrity": "sha512-lp6psRmPzkvz5JiVhV2tIovzVq7oo0LKbQcL77Rlcw1ZmHoZMCzQYResbMa+un9ycM8io/am2VKbTOaqrWjgOA==", + "license": "MIT", + "peer": true, + "dependencies": { + "clsx": "^2.0.0" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-client-locale": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-runtime": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-ui-primitives": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-ui-slots": "^0.1.0-rc.6", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6", + "react": "^18.2.0" + } + }, + "node_modules/@deepseek-ai/dsh-client-ui-model-selection": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-client-ui-model-selection/-/dsh-client-ui-model-selection-0.1.0-rc.6.tgz", + "integrity": "sha512-adjndhpBq++KGOmA8aK12xTBYvTu1UnY8BCW6smOQa93VVPuMWqstDw7MFZ6mrFQoF3tHwNxoSo+tYWS20o+mg==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-api-remotes": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-connection": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-locale": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-runtime": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-ui-commands": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-ui-conversation": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-ui-input-trigger": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-ui-primitives": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-ui-slots": "^0.1.0-rc.6", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6", + "clsx": "^2.1.1", + "react": "^18.2.0" + } + }, + "node_modules/@deepseek-ai/dsh-client-ui-primitives": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-client-ui-primitives/-/dsh-client-ui-primitives-0.1.0-rc.6.tgz", + "integrity": "sha512-vZ9/V5pXYbkumLEOHagEjzSWvVxX+CtXZ13+iNz3BnqDVsy0HYLgnrWwcLLPHqHLUmww9NlxXe9husoS7o/zyw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@shikijs/langs": "^4.3.1", + "@types/mdast": "^4.0.4", + "anser": "^2.3.5", + "clsx": "^2.0.0", + "katex": "^0.16.47", + "mdast-util-from-markdown": "^2.0.3", + "mdast-util-gfm": "^3.1.0", + "mdast-util-math": "^3.0.0", + "micromark-core-commonmark": "^2.0.3", + "micromark-extension-gfm": "^3.0.0", + "micromark-extension-math": "^3.1.0", + "micromark-factory-space": "^2.0.1", + "micromark-util-character": "^2.1.1", + "micromark-util-classify-character": "^2.0.1", + "micromark-util-sanitize-uri": "^2.0.1", + "micromark-util-symbol": "^2.0.1", + "micromark-util-types": "^2.0.2", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "shiki": "^4.3.1" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-client-ui-settings": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-client-ui-settings/-/dsh-client-ui-settings-0.1.0-rc.6.tgz", + "integrity": "sha512-g+6w62SWnwMWkn6VuLK6MHcSKbXQZD7oTYLG5wjhDRDULOEBCgikXD3LJo/esOsVncXABDiih8KuDW3Fg8TfSQ==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-api-remotes": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-connection": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-runtime": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-schema-form": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-ui-slots": "^0.1.0-rc.6", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6", + "@deepseek-ai/dsh-settings": "^0.1.0-rc.6", + "react": "^18.2.0" + } + }, + "node_modules/@deepseek-ai/dsh-client-ui-settings-general": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-client-ui-settings-general/-/dsh-client-ui-settings-general-0.1.0-rc.6.tgz", + "integrity": "sha512-AmN1VkT4YJq0Tg7odtLteFGLvGZCklbmL/uCCc3YHw6bQ/n+ZE+92tPMDxjMfHVPPcwqQS5T57ReLdAzJ3WyHA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@deepseek-ai/dsh-settings": "^0.1.0-rc.6", + "@deepseek-ai/schemastery": "^3.18.1", + "clsx": "^2.0.0" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-api-remotes": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-connection": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-locale": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-runtime": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-ui-primitives": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-ui-settings": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-ui-sidebar": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-ui-slots": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-web-react": "^0.1.0-rc.6", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6", + "react": "^18.2.0" + } + }, + "node_modules/@deepseek-ai/dsh-client-ui-sidebar": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-client-ui-sidebar/-/dsh-client-ui-sidebar-0.1.0-rc.6.tgz", + "integrity": "sha512-q31eeswx19M8tKeMFsDTluWWi9fqZ/m4l8xT5m6eTB50pFFkaPHcl10uHzhCOOxKPMUX3HM4TjyoOclZXruT0Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "clsx": "^2.0.0" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-client-locale": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-runtime": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-ui-primitives": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-ui-slots": "^0.1.0-rc.6", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6", + "react": "^18.2.0" + } + }, + "node_modules/@deepseek-ai/dsh-client-ui-slots": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-client-ui-slots/-/dsh-client-ui-slots-0.1.0-rc.6.tgz", + "integrity": "sha512-F4VZA60bMRi4DAbZvNipM4E/Jl01QC0cQCPpeIEIh1/lq/y/bpc7IqujtzWESHPe3qSljTURip3hkANfsYs3UA==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-client-web-react": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-client-web-react/-/dsh-client-web-react-0.1.0-rc.6.tgz", + "integrity": "sha512-2PAnRsZzokVr/nCcwX87axdxzobQYp76xzX70vYSqghlDab1phsIdgDSm1JxpszN9G3ETBMTLPM9xz30iodqYQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@deepseek-ai/dsh-client-ui-slots": "^0.1.0-rc.6", + "react": "^18.2.0", + "use-sync-external-store": "1.2.0" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-code-runtime": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-code-runtime/-/dsh-code-runtime-0.1.0-rc.6.tgz", + "integrity": "sha512-aw8D4IOeMo11A3uxQeE4LFoW3bvaQnVkGFqqtS+lsINDARrOCJHXLUgecoKpys+Lc5erZZ4UQDnymJmL4OCcKA==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-commands": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-commands/-/dsh-commands-0.1.0-rc.6.tgz", + "integrity": "sha512-dq1GZmGTPXEGG01ksZ6Jj6DxAkzAbg+nepvfnM/P74d6EUcsFsEy7CfS18n0VJ6/2Wp0xOWsQyyuFElqbynO7w==", + "license": "MIT", + "peer": true, + "dependencies": { + "zod": "^4.4.3" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-agent": "^0.1.0-rc.6", + "@deepseek-ai/dsh-brand": "^0.1.0-rc.6", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6", + "@deepseek-ai/dsh-scope": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session": "^0.1.0-rc.6", + "@deepseek-ai/dsh-typert-protocol": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-compaction": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-compaction/-/dsh-compaction-0.1.0-rc.6.tgz", + "integrity": "sha512-Uu8qgrHom13gdwwxAnqmNuWM8MqafkRlhjQMMJYmaMVVxjEUewSJ6lwtMbUEBR5ViLsfv4pTm5TnhxNCjedBUw==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-brand": "^0.1.0-rc.6", + "@deepseek-ai/dsh-commands": "^0.1.0-rc.6", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6", + "@deepseek-ai/dsh-llm": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-cordis-host-runner": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-cordis-host-runner/-/dsh-cordis-host-runner-0.1.0-rc.6.tgz", + "integrity": "sha512-opN+kvxYf40rBVWhURZmq2E8uGWkv8r9L0YfynYAu/2YE7W/oGEQx2x1Mp0LxuWq1uec8rtu2GL2U17ORNuuVw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@deepseek-ai/schemastery": "^3.18.1", + "zod": "^4.4.3" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-agent": "^0.1.0-rc.6", + "@deepseek-ai/dsh-brand": "^0.1.0-rc.6", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6", + "@deepseek-ai/dsh-llm": "^0.1.0-rc.6", + "@deepseek-ai/dsh-scope": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session": "^0.1.0-rc.6", + "@deepseek-ai/dsh-tools": "^0.1.0-rc.6", + "@deepseek-ai/dsh-typert-protocol": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-credentials": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-credentials/-/dsh-credentials-0.1.0-rc.6.tgz", + "integrity": "sha512-zyYRs3A9gxfZjZfONzJdMhM0Gzbslpha+FGYkLDRAozgPj0N7mZdE+Qflx2V4WNrCnsSjuvOW0HFBxWtSRUTUw==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-brand": "^0.1.0-rc.6", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-goal": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-goal/-/dsh-goal-0.1.0-rc.6.tgz", + "integrity": "sha512-cONQOvFqZmjtw5HSgbXJ5/8rZ2gHqdf69ONhH21cLFu5jJKVy9YbLt42SlD2sdGMv/co9nN8Kt9bWQiZ/96VbQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@deepseek-ai/schemastery": "^3.18.1", + "zod": "^4.4.3" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-agent": "^0.1.0-rc.6", + "@deepseek-ai/dsh-brand": "^0.1.0-rc.6", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6", + "@deepseek-ai/dsh-llm": "^0.1.0-rc.6", + "@deepseek-ai/dsh-scope": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session-projection": "^0.1.0-rc.6", + "@deepseek-ai/dsh-typert-protocol": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-home-paths": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-home-paths/-/dsh-home-paths-0.1.0-rc.6.tgz", + "integrity": "sha512-gIiUBmqB3L8inFr+hvjZv2/i6EVJOHIHCHg7bBFVhcl4HDK94+8wUCXTLGy80tcuISzIQiIaLuJq/NhSmV9Amw==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-host-apiproxy": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-host-apiproxy/-/dsh-host-apiproxy-0.1.0-rc.6.tgz", + "integrity": "sha512-sydiTngUEtvCyUwtCpXusQXVuiq0Kv7t2Axe8UKbimhhQLktnfhAmsEF+QHFTG5zcnxAuuigPiUTeY0Cr8+CnA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@deepseek-ai/dsh-agent": "^0.1.0-rc.6", + "@deepseek-ai/dsh-agent-default-model": "^0.1.0-rc.6", + "@deepseek-ai/dsh-api-remotes": "^0.1.0-rc.6", + "@deepseek-ai/dsh-attachment": "^0.1.0-rc.6", + "@deepseek-ai/dsh-brand": "^0.1.0-rc.6", + "@deepseek-ai/dsh-commands": "^0.1.0-rc.6", + "@deepseek-ai/dsh-credentials": "^0.1.0-rc.6", + "@deepseek-ai/dsh-goal": "^0.1.0-rc.6", + "@deepseek-ai/dsh-host-directory-picker": "^0.1.0-rc.6", + "@deepseek-ai/dsh-jobs": "^0.1.0-rc.6", + "@deepseek-ai/dsh-llm": "^0.1.0-rc.6", + "@deepseek-ai/dsh-native-command": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session-persistence": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session-projection": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session-projection-cache": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session-query": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session-title": "^0.1.0-rc.6", + "@deepseek-ai/dsh-settings": "^0.1.0-rc.6", + "@deepseek-ai/dsh-skill": "^0.1.0-rc.6", + "@deepseek-ai/dsh-subagent": "^0.1.0-rc.6", + "@deepseek-ai/dsh-tools": "^0.1.0-rc.6", + "@deepseek-ai/dsh-user-approval": "^0.1.0-rc.6", + "@deepseek-ai/dsh-user-questions": "^0.1.0-rc.6", + "@deepseek-ai/dsh-workspace": "^0.1.0-rc.6", + "@deepseek-ai/schemastery": "^3.18.1", + "fflate": "^0.8.2", + "zod": "^4.4.3" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-agent-presets": "^0.1.0-rc.6", + "@deepseek-ai/dsh-cordis-host-runner": "^0.1.0-rc.6", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-host-directory-picker": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-host-directory-picker/-/dsh-host-directory-picker-0.1.0-rc.6.tgz", + "integrity": "sha512-1XafIFC2H5sPi720ATQWgCTgjZum7ZUng6H+z9uDMOhkKLFO7X2n8D2ddmGuQINnKV7sjlw0Q1uBr/sFiY4Bqw==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-host-plugin-inventory": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-host-plugin-inventory/-/dsh-host-plugin-inventory-0.1.0-rc.6.tgz", + "integrity": "sha512-FObaWsBb1Wlyg5/UH7nSNRUCjslZmUEOO90E2g01asefzXICmvY9rDsaAHzOvuAljX9+IDWn678kDJBK+3OFkA==", + "license": "MIT", + "peer": true, + "dependencies": { + "zod": "^4.4.3" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/cordis-plugin-loader": "^1.0.2", + "@deepseek-ai/dsh-brand": "^0.1.0-rc.6", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6", + "@deepseek-ai/dsh-typert-protocol": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-host-webserver": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-host-webserver/-/dsh-host-webserver-0.1.0-rc.6.tgz", + "integrity": "sha512-Zod2L+JPss8uGuVMc+5VMQYidCyOZWV8H7LsvyzVR73dhB9zIIm4smuRwuHrk6ss+F/QWmHWV+/yUgqbBJTLjA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@deepseek-ai/schemastery": "^3.18.1" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-invariants": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-invariants/-/dsh-invariants-0.1.0-rc.6.tgz", + "integrity": "sha512-WfEfOi99a4cpOugRAHTBSTnesLieu3ist1q9PXDXFBHX++K1rAl9+sB7YrdnbB8LH0UOY532gS9xJUYU6w0SLw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@deepseek-ai/schemastery": "^3.18.1" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1" + } + }, + "node_modules/@deepseek-ai/dsh-jobs": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-jobs/-/dsh-jobs-0.1.0-rc.6.tgz", + "integrity": "sha512-fmyvSOVsNObmRnciuH57ZntuCSb0gflRleCeQx1ToGHRoGrR4Ndnstx33SuIXUQt6OSUhD2w2WKQTReXogpnSQ==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-agent": "^0.1.0-rc.6", + "@deepseek-ai/dsh-brand": "^0.1.0-rc.6", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-llm": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-llm/-/dsh-llm-0.1.0-rc.6.tgz", + "integrity": "sha512-kuFGC8bHlzGTwlRxQhXjf3CYWl8M4NzH+EYIkrW8rri4iMc9W53xrdvkil5No/DUlMm8g1u7GdeiWYFy0TMvtA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@deepseek-ai/schemastery": "^3.18.1" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-attachment": "^0.1.0-rc.6", + "@deepseek-ai/dsh-brand": "^0.1.0-rc.6", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6", + "@deepseek-ai/dsh-timeout": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-llm-retry": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-llm-retry/-/dsh-llm-retry-0.1.0-rc.6.tgz", + "integrity": "sha512-HdjBWcQ6spwA8B5dScRhndLQNiKoQTkq36O+kmJ80B9V4z08K5XrJwAInH9cCxJ91CqNzx/sxCdDds0oZDH1Pw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@deepseek-ai/schemastery": "^3.18.1" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-agent": "^0.1.0-rc.6", + "@deepseek-ai/dsh-brand": "^0.1.0-rc.6", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6", + "@deepseek-ai/dsh-llm": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session": "^0.1.0-rc.6", + "@deepseek-ai/dsh-timeout": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-message-feedback": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-message-feedback/-/dsh-message-feedback-0.1.0-rc.6.tgz", + "integrity": "sha512-yqI49BjgVODSPQex7KdRhc4fUquvhifRYe73QP3w6snXYB6058tH8WQk2Yx+m1APi60dLEAZ1AJibRA4oCo6WQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@deepseek-ai/schemastery": "^3.18.1", + "zod": "^4.4.3" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-brand": "^0.1.0-rc.6", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6", + "@deepseek-ai/dsh-llm": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session-persistence": "^0.1.0-rc.6", + "@deepseek-ai/dsh-storage-domain": "^0.1.0-rc.6", + "@deepseek-ai/dsh-typert-protocol": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-native-command": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-native-command/-/dsh-native-command-0.1.0-rc.6.tgz", + "integrity": "sha512-b2AwcAlNmTDPho/dMQ5wOicEwkDG1FSNSCUvluFp9JBbM8AqUMI3rVuOGFPIT0BEOi+ehpW/if0BZ2S35FSEwA==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-scope": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-scope/-/dsh-scope-0.1.0-rc.6.tgz", + "integrity": "sha512-UlDLV4syLoJinNg9imhXrSAHrdaTa5Ff8gg46rzjFJGPUOhAk3DZff0hryT5OhrBi0A5Tj92qVpg2pRVvxnUzQ==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-session": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-session/-/dsh-session-0.1.0-rc.6.tgz", + "integrity": "sha512-8tu8I6VWC7050GAUXWhcEWQw4pakALQc8TlhKr52m7Y4+kIKeNt3FBgP86PaGPBtpK0p5zUPRQNkFpzZbBdxyw==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-brand": "^0.1.0-rc.6", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6", + "@deepseek-ai/dsh-llm": "^0.1.0-rc.6", + "@deepseek-ai/dsh-scope": "^0.1.0-rc.6", + "@deepseek-ai/dsh-typert-protocol": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-session-persistence": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-session-persistence/-/dsh-session-persistence-0.1.0-rc.6.tgz", + "integrity": "sha512-AbNBe+IYCbZqSHqOACVdj8QTynm2HZ0cThrEuI6nGMtlWLYLx6lzZ1rgO/56Av9mIScjyTBGJAIKhEYaMTBG9g==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-brand": "^0.1.0-rc.6", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session": "^0.1.0-rc.6", + "@deepseek-ai/dsh-timeout": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-session-projection": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-session-projection/-/dsh-session-projection-0.1.0-rc.6.tgz", + "integrity": "sha512-DYLALBPdEI1LZjJ4B6rdGdGY4gy+iR2+5Xh2xJoAGa/pTyN5Z55TNfvuMJrmeRBjAuDXNUQpmURbvos5rJ4veg==", + "license": "MIT", + "peer": true, + "dependencies": { + "zod": "^4.4.3" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-session-projection-cache": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-session-projection-cache/-/dsh-session-projection-cache-0.1.0-rc.6.tgz", + "integrity": "sha512-Fqyd5aN7MvIiRMWxs0Q4dWmSMKLqdWNk5U97EFdeWY3Ol5bk8SSFfFrij4941B5y4K2f7C0mE9nLSQ3mfL2KHg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@deepseek-ai/schemastery": "^3.18.1", + "zod": "^4.4.3" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session-persistence": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session-projection": "^0.1.0-rc.6", + "@deepseek-ai/dsh-storage-domain": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-session-query": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-session-query/-/dsh-session-query-0.1.0-rc.6.tgz", + "integrity": "sha512-bGzRrZnWuXDUtAmwkRxT74Nuc4PLQJmJ4IeGgSSTIGJ9JQCNbvVjr4ZWDWg+D/PvbZwh9mpYJspDZdUP42eWAA==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-brand": "^0.1.0-rc.6", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6", + "@deepseek-ai/dsh-llm": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session-persistence": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session-title": "^0.1.0-rc.6" + }, + "peerDependenciesMeta": { + "@deepseek-ai/dsh-session-persistence": { + "optional": true + } + } + }, + "node_modules/@deepseek-ai/dsh-session-stats": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-session-stats/-/dsh-session-stats-0.1.0-rc.6.tgz", + "integrity": "sha512-B2Rwp1klSl7DmRpViPnuIlmlPgsARdxqRpsz7MwoXTC1oKYipWgoCw8JFOsDxVj8Rno1o1kWVjVAM10I/FC1aw==", + "license": "MIT", + "peer": true, + "dependencies": { + "zod": "^4.4.3" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6", + "@deepseek-ai/dsh-llm": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session-projection": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-session-title": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-session-title/-/dsh-session-title-0.1.0-rc.6.tgz", + "integrity": "sha512-RHV1ujuomvQB63HPI/n25c2/2It5XQ7zNQKozSqYOPQw7AIr16PT9iFqC7sCQ4l2gAY5GI3FbI1cQgHzjHNOag==", + "license": "MIT", + "peer": true, + "dependencies": { + "@deepseek-ai/schemastery": "^3.18.1", + "zod": "^4.4.3" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-brand": "^0.1.0-rc.6", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6", + "@deepseek-ai/dsh-llm": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session-projection": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-settings": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-settings/-/dsh-settings-0.1.0-rc.6.tgz", + "integrity": "sha512-5ZlH2FNRU0kkdcCoEJohvdb2fiNnxM+iZqN3icbR3WQbMm8RPRrXlZlps5YUaQKPRbNRHA2LkOXW998QRlhHcA==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-brand": "^0.1.0-rc.6", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6", + "@deepseek-ai/schemastery": "^3.18.1" + } + }, + "node_modules/@deepseek-ai/dsh-skill": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-skill/-/dsh-skill-0.1.0-rc.6.tgz", + "integrity": "sha512-VyRlCOASIRuTflKwn4NvbdAXxSPnnLJ+RAQUI4GK5pOtPwI2DhJrbovqpyp5kNAkZMsqvIeHWu5PcCEJ+FpQ2w==", + "license": "MIT", + "peer": true, + "dependencies": { + "@deepseek-ai/schemastery": "^3.18.1" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6", + "@deepseek-ai/dsh-llm": "^0.1.0-rc.6", + "@deepseek-ai/dsh-scope": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-storage": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-storage/-/dsh-storage-0.1.0-rc.6.tgz", + "integrity": "sha512-zq15tNz5ywWuM15eqWADn7SKAPKyDYBto1WxZDIVJxHwQTBqu8gVaCdZo5IonH827qnabyiuJedgh9SkbSrTjg==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-storage-domain": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-storage-domain/-/dsh-storage-domain-0.1.0-rc.6.tgz", + "integrity": "sha512-/5qDCIIf9JNpoRG5VrY/CXFIuch1tDE0H5XREHsKd6LE26TOHcTAUH6gyersFG4e3TPoOLJYDp1+SapFLd7+kQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@deepseek-ai/schemastery": "^3.18.1", + "zod": "^4.4.3" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6", + "@deepseek-ai/dsh-storage": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-subagent": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-subagent/-/dsh-subagent-0.1.0-rc.6.tgz", + "integrity": "sha512-vROmBDAlaFAzzSlTBOlvg/7fO55zxhUztnLtB3lKmN5RevrNQBjTsbeIMDQ8ow5ZplxEOnLU+sikFoA5JaoH8A==", + "license": "MIT", + "peer": true, + "dependencies": { + "zod": "^4.4.3" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-agent": "^0.1.0-rc.6", + "@deepseek-ai/dsh-agent-presets": "^0.1.0-rc.6", + "@deepseek-ai/dsh-brand": "^0.1.0-rc.6", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6", + "@deepseek-ai/dsh-jobs": "^0.1.0-rc.6", + "@deepseek-ai/dsh-llm": "^0.1.0-rc.6", + "@deepseek-ai/dsh-sandbox": "^0.1.0-rc.6", + "@deepseek-ai/dsh-sandbox-policy": "^0.1.0-rc.6", + "@deepseek-ai/dsh-scope": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session-persistence": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session-projection": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session-projection-cache": "^0.1.0-rc.6", + "@deepseek-ai/dsh-tools": "^0.1.0-rc.6", + "@deepseek-ai/dsh-user-approval": "^0.1.0-rc.6" + }, + "peerDependenciesMeta": { + "@deepseek-ai/dsh-agent-presets": { + "optional": true + }, + "@deepseek-ai/dsh-jobs": { + "optional": true + }, + "@deepseek-ai/dsh-sandbox": { + "optional": true + }, + "@deepseek-ai/dsh-sandbox-policy": { + "optional": true + }, + "@deepseek-ai/dsh-session-persistence": { + "optional": true + }, + "@deepseek-ai/dsh-session-projection": { + "optional": true + }, + "@deepseek-ai/dsh-session-projection-cache": { + "optional": true + }, + "@deepseek-ai/dsh-user-approval": { + "optional": true + } + } + }, + "node_modules/@deepseek-ai/dsh-system-prompt": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-system-prompt/-/dsh-system-prompt-0.1.0-rc.6.tgz", + "integrity": "sha512-E7g+XChh4q4/wX++v56z1pV4SA1Rtz42xkznLPPi9FlXrrzJxwHMOUzBZ9Rz3Y1kLhQ++HJG3ZatmNx3rjFilg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@deepseek-ai/schemastery": "^3.18.1" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6", + "@deepseek-ai/dsh-llm": "^0.1.0-rc.6", + "@deepseek-ai/dsh-scope": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-timeout": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-timeout/-/dsh-timeout-0.1.0-rc.6.tgz", + "integrity": "sha512-CUean0fAnfsJVszFEip7PsU/S26W+JfDFfsza2dCtlw8n6xlkbHA9Gjxdk2aTwqDGCgXEPkRW7mYkdJ0n6FR7w==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-token-meter": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-token-meter/-/dsh-token-meter-0.1.0-rc.6.tgz", + "integrity": "sha512-qU5FT4n1RJXP3Ss8NJ5TTvPo8rZ6cxcrCedp1t0sTAj93SGssAanq47voSmznPP52nwz/SLeunznAIT0jhbsZQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@deepseek-ai/schemastery": "^3.18.1", + "zod": "^4.4.3" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-compaction": "^0.1.0-rc.6", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6", + "@deepseek-ai/dsh-llm": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session-projection": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-tools": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-tools/-/dsh-tools-0.1.0-rc.6.tgz", + "integrity": "sha512-Tu08EPK3JyK0iNjH4FGzu/1uADynNSS6SmwOLdfytUN0YNqwNuKFSt2OJUg19famNlTgy992DcHfDu0T+gLXFg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@deepseek-ai/schemastery": "^3.18.1" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-agent": "^0.1.0-rc.6", + "@deepseek-ai/dsh-code-runtime": "^0.1.0-rc.6", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6", + "@deepseek-ai/dsh-llm": "^0.1.0-rc.6", + "@deepseek-ai/dsh-scope": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session": "^0.1.0-rc.6", + "@deepseek-ai/dsh-system-prompt": "^0.1.0-rc.6", + "@deepseek-ai/dsh-user-approval": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-typert-protocol": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-typert-protocol/-/dsh-typert-protocol-0.1.0-rc.6.tgz", + "integrity": "sha512-weWzN8r01YCkoDCAM7BsKw2YhRrD4zL8N2SAZu9hovYtXSq8xHXsP4Zh8RLYIlYcuotjyff/6hic+0TJPd14YA==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-typert-registry": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-typert-registry/-/dsh-typert-registry-0.1.0-rc.6.tgz", + "integrity": "sha512-ry2AApGn0vEEIRWDC7TlLiLj5K8+2OblxXlGHs1u9APVxhPjZLok6Kfo57yfeJyW+EONGXv1DQcU05U+aYE7Tg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@deepseek-ai/dsh-typert-protocol": "^0.1.0-rc.6", + "zod": "^4.4.3" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-user-approval": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-user-approval/-/dsh-user-approval-0.1.0-rc.6.tgz", + "integrity": "sha512-9rnkSDGOpu2XUeGwbPeTzVUTFWTND1PMPM5L/ZQPptV5yyZlQiNxM2rCC6OdL+ZVerwxEqrRhZIQn/KVtQfKag==", + "license": "MIT", + "peer": true, + "dependencies": { + "@deepseek-ai/schemastery": "^3.18.1" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-agent": "^0.1.0-rc.6", + "@deepseek-ai/dsh-brand": "^0.1.0-rc.6", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6", + "@deepseek-ai/dsh-llm": "^0.1.0-rc.6", + "@deepseek-ai/dsh-scope": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session": "^0.1.0-rc.6", + "@deepseek-ai/dsh-system-prompt": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-user-questions": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-user-questions/-/dsh-user-questions-0.1.0-rc.6.tgz", + "integrity": "sha512-5vG4Ug+hVQuwU4KN7CFpF9qObBEYY/mPe1FHhToYO8Y2ICdHt3eX0Or9oEJFW68bZAMfuiAshZL8oUubr7obRg==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-agent": "^0.1.0-rc.6", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6", + "@deepseek-ai/dsh-llm": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/dsh-workspace": { + "version": "0.1.0-rc.6", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/dsh-workspace/-/dsh-workspace-0.1.0-rc.6.tgz", + "integrity": "sha512-3R5mX5JTBD9jDpUdauqaswDlxxJzlrRtJ7aH4Ok5jPdlxw0LhC5aIsS5S5RCtFLI1xDzonnInEczjmqmdGQcDQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "zod": "^4.4.3" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-brand": "^0.1.0-rc.6", + "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session": "^0.1.0-rc.6", + "@deepseek-ai/dsh-session-persistence": "^0.1.0-rc.6", + "@deepseek-ai/dsh-storage": "^0.1.0-rc.6", + "@deepseek-ai/dsh-storage-domain": "^0.1.0-rc.6" + } + }, + "node_modules/@deepseek-ai/schemastery": { + "version": "3.18.1", + "resolved": "https://registry.npmmirror.com/@deepseek-ai/schemastery/-/schemastery-3.18.1.tgz", + "integrity": "sha512-Qn0FCSwCQnpnj6SB31I6i2sIKgKWnkbJM8O0EU91Gv2UsYVvtZTl6IA0sCwk2e2MZf5S8w5hpq9QkeVvK9qwxg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@deepseek-ai/cosmokit": "^1.8.2", + "@standard-schema/spec": "^1.1.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@oxc-project/types": { + "version": "0.144.0", + "resolved": "https://registry.npmmirror.com/@oxc-project/types/-/types-0.144.0.tgz", + "integrity": "sha512-nuhZIOLuI6TFQ32I/WnUx+SCPY7SdSKwgnFHydAuoS1+Z4BRcaP+RRJmGzl9lw+0OFF7UmaESf7KQRXaNLHypg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.4.tgz", + "integrity": "sha512-jHC2cnyKz5xU2fhECtFl8OZ83cYNt13GZQD+0uMJ/X3o+ijmd56okHhTUwxVSHPx1IRVIJEZ1/1pPzeLCU6XKA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-Dc5mPD8F5F/FS8i01syd7FTF6yB2fVthH/TRkjwJkzUK6EpoxHtqvZQP5Zwq80/5z19TWYHIg1KOHboCgVx/aQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.4.tgz", + "integrity": "sha512-fpDm4oBo6SqLvWUYCmFhdde3U9KH2fRNNMeAnAPAIwxRL345xutL0EtEUcuoxsoazdJGv/MuDBQHlCDrtbvqOg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.4.tgz", + "integrity": "sha512-rSJoreDE/HoIzoaib6MTp5jQtCTdMHKIvItAKT/ImS6Y6Ww76oUaeMyp4Vc/fAgd/ehji068IxetHXAnqUwN9A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.4.tgz", + "integrity": "sha512-/jm8OGHgn7oGaJu3i/qZI9spUGcJ+y/lk43ttQ/iO1tOd9NissG6o97bighBCiL+BKRngmcDuR6ikfwYdJmVuQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.4.tgz", + "integrity": "sha512-tIP06BeD9EqvECBrPZ+sqdPlYrT+aYaAiu1wYziVx5elRK/ftm33JxVDy2bXGbr6J0CrtirCkR87/X5a2euEng==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.4.tgz", + "integrity": "sha512-Ql1Q0EQqVThvn9VAVlwNzsUvbSFtCMGjLpRRi4pk5i7NZZ4n5ISiLMjHYtus4VQ2PvkSw24zyaCVsiS+sXPj1w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.4.tgz", + "integrity": "sha512-GjbjXD4XXfN19D0LZNbmiCBUoDiRACsYHr0yaIbbn8aFsXjHZifcYqu/W5Er5X2X990WjHXFrxarn5chzItorQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.4.tgz", + "integrity": "sha512-p5WR0NOwaRmJ/B1b6IjEFLLivwEsf3PrdBIhRbhTCQisbo2SvHHpG4ELB/+FgQNnB88LTOF86upmJmbvZdQ2lw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.4.tgz", + "integrity": "sha512-4/GyVjmhR+Tc6HLJvwc1sOhPqAZtySiSMesOZyX6JQ5XBxoTDEMKQzvo07NIK6nTon/SivlZqvhzvuVBNQhObQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.4.tgz", + "integrity": "sha512-l9eeLsCNvPpmSXUej0etw/J1eqV0Jj1D5G/xG6YTijmE6dkv6E2QezgWbTfQk63v952DPqrjOCoiqxq7Bw0YUQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.4.tgz", + "integrity": "sha512-e0F355MSTMm3+UOqtV3L24gFUp2N5m1f8L/7d56deik6va+AXdrt9F8LbzGpeWGWRbZEDq4m8NVnJDeBtf9DZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.4.tgz", + "integrity": "sha512-AWLi0uBRYh6QlE7OKhiz+phZC0qwtij2QZmhmOdsLdFn64m7oMpooE9ICE3lhm9xMb4SpDo2WbHcxX1iFLFtqw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.4.tgz", + "integrity": "sha512-UwSDJOg3dqCAejWdxclJjCsh3Qq4vLYMDxmyHqo1btz3stK2VqgwNd3mm5tuIwzSlGIQ/1H9Hr+Zn09mrezNqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@shikijs/core": { + "version": "4.4.3", + "resolved": "https://registry.npmmirror.com/@shikijs/core/-/core-4.4.3.tgz", + "integrity": "sha512-QCR4q2ZO/ILJEuwiBMel4wdcTDb1JGwfjKTxPDF6x8ixOaluPrVqIn06C99AcRPhmYlBR56d/Fb+GN58GzExpg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@shikijs/primitive": "4.4.3", + "@shikijs/types": "4.4.3", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.5", + "hast-util-to-html": "^9.0.5" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "4.4.3", + "resolved": "https://registry.npmmirror.com/@shikijs/engine-javascript/-/engine-javascript-4.4.3.tgz", + "integrity": "sha512-FbOjFJp9VLdo1Wevs10BBtVxiTWwNLqZh5Gkhjgda/ioL15YOgeSl9n+6XMa3qRlPQzfhFNe641SrynFHYG0nQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@shikijs/types": "4.4.3", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.6" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "4.4.3", + "resolved": "https://registry.npmmirror.com/@shikijs/engine-oniguruma/-/engine-oniguruma-4.4.3.tgz", + "integrity": "sha512-EcOQkxdxGQrc1Row/cC2c96/v1dbZqGnEVu1qTuT/MJmp6+cXCvQussowVmCv5Tqr3KuY3c7IbM6HTW3LJ1k9w==", + "license": "MIT", + "peer": true, + "dependencies": { + "@shikijs/types": "4.4.3", + "@shikijs/vscode-textmate": "^10.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/langs": { + "version": "4.4.3", + "resolved": "https://registry.npmmirror.com/@shikijs/langs/-/langs-4.4.3.tgz", + "integrity": "sha512-ePic0yfAJGOF83D5wBHK/00EjK65oahBYxFk5epgq33WRv7X9UuxLEV8PtR0szC0z8dl7INIpIodB99JRFlR+A==", + "license": "MIT", + "peer": true, + "dependencies": { + "@shikijs/types": "4.4.3" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/primitive": { + "version": "4.4.3", + "resolved": "https://registry.npmmirror.com/@shikijs/primitive/-/primitive-4.4.3.tgz", + "integrity": "sha512-m0wBeLDQDeIxRdUmrCPdQqfuUamDwRL5isCfYbguKD6NiaKpVbsv+3J81DyIKgNW5h4WAIIr8T4EkgQrBBxvaQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@shikijs/types": "4.4.3", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.5" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/themes": { + "version": "4.4.3", + "resolved": "https://registry.npmmirror.com/@shikijs/themes/-/themes-4.4.3.tgz", + "integrity": "sha512-w8UHjeUnIR965KMWJHUPXOc2mNJUnK3vpVLYLvw5IYU2mnTTJ89E24OrJDBNiJDQ0qzb0tc4l7mrIXx5cFeIyw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@shikijs/types": "4.4.3" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/types": { + "version": "4.4.3", + "resolved": "https://registry.npmmirror.com/@shikijs/types/-/types-4.4.3.tgz", + "integrity": "sha512-UEJxmRR++MAGR6hugn0vgVS2W/6lWAts84FFSrnlH9sP0LNol7E5+NQ792pH8liWUhyMyjhTgSUH3k7iD7tc5g==", + "license": "MIT", + "peer": true, + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.5" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmmirror.com/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "license": "MIT", + "peer": true + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "license": "MIT" + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmmirror.com/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/debug": { + "version": "4.1.13", + "resolved": "https://registry.npmmirror.com/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.5", + "resolved": "https://registry.npmmirror.com/@types/hast/-/hast-3.0.5.tgz", + "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/katex": { + "version": "0.16.8", + "resolved": "https://registry.npmmirror.com/@types/katex/-/katex-0.16.8.tgz", + "integrity": "sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmmirror.com/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.31", + "resolved": "https://registry.npmmirror.com/@types/react/-/react-18.3.31.tgz", + "integrity": "sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT", + "peer": true + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.3.3.tgz", + "integrity": "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==", + "license": "ISC", + "peer": true + }, + "node_modules/@vitest/expect": { + "version": "4.1.10", + "resolved": "https://registry.npmmirror.com/@vitest/expect/-/expect-4.1.10.tgz", + "integrity": "sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.1.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.1.10", + "@vitest/utils": "4.1.10", + "chai": "^6.2.2", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/pretty-format": { + "version": "4.1.10", + "resolved": "https://registry.npmmirror.com/@vitest/pretty-format/-/pretty-format-4.1.10.tgz", + "integrity": "sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "4.1.10", + "resolved": "https://registry.npmmirror.com/@vitest/runner/-/runner-4.1.10.tgz", + "integrity": "sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.1.10", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "4.1.10", + "resolved": "https://registry.npmmirror.com/@vitest/snapshot/-/snapshot-4.1.10.tgz", + "integrity": "sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.10", + "@vitest/utils": "4.1.10", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "4.1.10", + "resolved": "https://registry.npmmirror.com/@vitest/spy/-/spy-4.1.10.tgz", + "integrity": "sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "4.1.10", + "resolved": "https://registry.npmmirror.com/@vitest/utils/-/utils-4.1.10.tgz", + "integrity": "sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.10", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/anser": { + "version": "2.3.5", + "resolved": "https://registry.npmmirror.com/anser/-/anser-2.3.5.tgz", + "integrity": "sha512-vcZjxvvVoxTeR5XBNJB38oTu/7eDCZlwdz32N1eNgpyPF7j/Z7Idf+CUwQOkKKpJ7RJyjxgLHCM7vdIK0iCNMQ==", + "license": "MIT", + "peer": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0", + "peer": true + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmmirror.com/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "peer": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "peer": true, + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/es-module-lexer": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-2.3.1.tgz", + "integrity": "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/expect-type": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/expect-type/-/expect-type-1.4.0.tgz", + "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fflate": { + "version": "0.8.3", + "resolved": "https://registry.npmmirror.com/fflate/-/fflate-0.8.3.tgz", + "integrity": "sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==", + "license": "MIT", + "peer": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmmirror.com/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/immer": { + "version": "10.2.0", + "resolved": "https://registry.npmmirror.com/immer/-/immer-10.2.0.tgz", + "integrity": "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==", + "license": "MIT", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT", + "peer": true + }, + "node_modules/js-yaml": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.3.1.tgz", + "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/katex": { + "version": "0.16.47", + "resolved": "https://registry.npmmirror.com/katex/-/katex-0.16.47.tgz", + "integrity": "sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==", + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "license": "MIT", + "peer": true, + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmmirror.com/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmmirror.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmmirror.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmmirror.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmmirror.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.33.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmmirror.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmmirror.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", + "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-math": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/mdast-util-math/-/mdast-util-math-3.0.0.tgz", + "integrity": "sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "longest-streak": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.1.0", + "unist-util-remove-position": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmmirror.com/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "peer": true, + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "peer": true, + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "peer": true, + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "peer": true, + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "peer": true, + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "peer": true, + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "peer": true, + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-math": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/micromark-extension-math/-/micromark-extension-math-3.1.0.tgz", + "integrity": "sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/katex": "^0.16.0", + "devlop": "^1.0.0", + "katex": "^0.16.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "peer": true + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "peer": true + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "peer": true + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "peer": true + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT", + "peer": true + }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/obug": { + "version": "2.1.4", + "resolved": "https://registry.npmmirror.com/obug/-/obug-2.1.4.tgz", + "integrity": "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/oniguruma-parser": { + "version": "0.12.2", + "resolved": "https://registry.npmmirror.com/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz", + "integrity": "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==", + "license": "MIT", + "peer": true + }, + "node_modules/oniguruma-to-es": { + "version": "4.3.6", + "resolved": "https://registry.npmmirror.com/oniguruma-to-es/-/oniguruma-to-es-4.3.6.tgz", + "integrity": "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==", + "license": "MIT", + "peer": true, + "dependencies": { + "oniguruma-parser": "^0.12.2", + "regex": "^6.1.0", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/property-information": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/property-information/-/property-information-7.2.0.tgz", + "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmmirror.com/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmmirror.com/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "license": "MIT", + "peer": true, + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "license": "MIT", + "peer": true, + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "license": "MIT", + "peer": true + }, + "node_modules/rolldown": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/rolldown/-/rolldown-1.2.4.tgz", + "integrity": "sha512-rSr7irW0K7QRWzjdJXqZowkcRdDtjRduh43rBltnVKd0VFq839l1lJoDvGJb6gl7+4rTTCrPWu+YfujUL8Ug7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.144.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.2.4", + "@rolldown/binding-darwin-arm64": "1.2.4", + "@rolldown/binding-darwin-x64": "1.2.4", + "@rolldown/binding-freebsd-x64": "1.2.4", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.4", + "@rolldown/binding-linux-arm64-gnu": "1.2.4", + "@rolldown/binding-linux-arm64-musl": "1.2.4", + "@rolldown/binding-linux-ppc64-gnu": "1.2.4", + "@rolldown/binding-linux-s390x-gnu": "1.2.4", + "@rolldown/binding-linux-x64-gnu": "1.2.4", + "@rolldown/binding-linux-x64-musl": "1.2.4", + "@rolldown/binding-openharmony-arm64": "1.2.4", + "@rolldown/binding-win32-arm64-msvc": "1.2.4", + "@rolldown/binding-win32-x64-msvc": "1.2.4" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmmirror.com/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/shiki": { + "version": "4.4.3", + "resolved": "https://registry.npmmirror.com/shiki/-/shiki-4.4.3.tgz", + "integrity": "sha512-Mb/GvXPHBAXdgGIcnfU5L3ldpn1XcxrGkPHwqgRx17/I2XRfqlFKk2vGkHWINn1kdXvzJZeuO3is6I9KLPFm0g==", + "license": "MIT", + "peer": true, + "dependencies": { + "@shikijs/core": "4.4.3", + "@shikijs/engine-javascript": "4.4.3", + "@shikijs/engine-oniguruma": "4.4.3", + "@shikijs/langs": "4.4.3", + "@shikijs/themes": "4.4.3", + "@shikijs/types": "4.4.3", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.5" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmmirror.com/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/std-env/-/std-env-4.2.0.tgz", + "integrity": "sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==", + "dev": true, + "license": "MIT" + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "peer": true, + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmmirror.com/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/tinyexec/-/tinyexec-1.3.0.tgz", + "integrity": "sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyrainbow": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/tinyrainbow/-/tinyrainbow-3.1.1.tgz", + "integrity": "sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmmirror.com/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vitest": { + "version": "4.1.10", + "resolved": "https://registry.npmmirror.com/vitest/-/vitest-4.1.10.tgz", + "integrity": "sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.1.10", + "@vitest/mocker": "4.1.10", + "@vitest/pretty-format": "4.1.10", + "@vitest/runner": "4.1.10", + "@vitest/snapshot": "4.1.10", + "@vitest/spy": "4.1.10", + "@vitest/utils": "4.1.10", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.1.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.10", + "@vitest/browser-preview": "4.1.10", + "@vitest/browser-webdriverio": "4.1.10", + "@vitest/coverage-istanbul": "4.1.10", + "@vitest/coverage-v8": "4.1.10", + "@vitest/ui": "4.1.10", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/coverage-istanbul": { + "optional": true + }, + "@vitest/coverage-v8": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false + } + } + }, + "node_modules/vitest/node_modules/@esbuild/aix-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", + "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/android-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.28.2.tgz", + "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/android-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", + "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/android-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.28.2.tgz", + "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/darwin-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", + "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/darwin-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", + "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", + "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/freebsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", + "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", + "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", + "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", + "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-loong64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", + "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-mips64el": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", + "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", + "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-riscv64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", + "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-s390x": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", + "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", + "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", + "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/netbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", + "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", + "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/openbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", + "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", + "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/sunos-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", + "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/win32-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", + "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/win32-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", + "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/win32-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", + "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@vitest/mocker": { + "version": "4.1.10", + "resolved": "https://registry.npmmirror.com/@vitest/mocker/-/mocker-4.1.10.tgz", + "integrity": "sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.1.10", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/esbuild": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.28.2.tgz", + "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "peer": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.2", + "@esbuild/android-arm": "0.28.2", + "@esbuild/android-arm64": "0.28.2", + "@esbuild/android-x64": "0.28.2", + "@esbuild/darwin-arm64": "0.28.2", + "@esbuild/darwin-x64": "0.28.2", + "@esbuild/freebsd-arm64": "0.28.2", + "@esbuild/freebsd-x64": "0.28.2", + "@esbuild/linux-arm": "0.28.2", + "@esbuild/linux-arm64": "0.28.2", + "@esbuild/linux-ia32": "0.28.2", + "@esbuild/linux-loong64": "0.28.2", + "@esbuild/linux-mips64el": "0.28.2", + "@esbuild/linux-ppc64": "0.28.2", + "@esbuild/linux-riscv64": "0.28.2", + "@esbuild/linux-s390x": "0.28.2", + "@esbuild/linux-x64": "0.28.2", + "@esbuild/netbsd-arm64": "0.28.2", + "@esbuild/netbsd-x64": "0.28.2", + "@esbuild/openbsd-arm64": "0.28.2", + "@esbuild/openbsd-x64": "0.28.2", + "@esbuild/openharmony-arm64": "0.28.2", + "@esbuild/sunos-x64": "0.28.2", + "@esbuild/win32-arm64": "0.28.2", + "@esbuild/win32-ia32": "0.28.2", + "@esbuild/win32-x64": "0.28.2" + } + }, + "node_modules/vitest/node_modules/vite": { + "version": "8.2.1", + "resolved": "https://registry.npmmirror.com/vite/-/vite-8.2.1.tgz", + "integrity": "sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.33.0", + "picomatch": "^4.0.5", + "postcss": "^8.5.25", + "rolldown": "~1.2.1", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.4.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ws": { + "version": "8.21.3", + "resolved": "https://registry.npmmirror.com/ws/-/ws-8.21.3.tgz", + "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmmirror.com/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "license": "MIT", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zustand": { + "version": "4.4.7", + "resolved": "https://registry.npmmirror.com/zustand/-/zustand-4.4.7.tgz", + "integrity": "sha512-QFJWJMdlETcI69paJwhSMJz7PPWjVP8Sjhclxmxmxv/RYI7ZOvR5BHX+ktH0we9gTWQMxcne8q1OY8xxz604gw==", + "license": "MIT", + "peer": true, + "dependencies": { + "use-sync-external-store": "1.2.0" + }, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "@types/react": ">=16.8", + "immer": ">=9.0", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + } + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..767bc44 --- /dev/null +++ b/package.json @@ -0,0 +1,76 @@ +{ + "name": "dsh-client-liang-intensity-skin", + "version": "0.1.0", + "private": true, + "description": "滑动变祖:an opt-in adaptive reasoning slider skin for DeepSeek Harness", + "repository": { + "type": "git", + "url": "git+https://github.com/kingOfSoySauce/dsh-liang-skin.git" + }, + "homepage": "https://github.com/kingOfSoySauce/dsh-liang-skin#readme", + "bugs": "https://github.com/kingOfSoySauce/dsh-liang-skin/issues", + "type": "module", + "main": "./src/index.js", + "exports": { + ".": "./src/index.js", + "./client": "./lib/client.js", + "./package.json": "./package.json" + }, + "files": [ + "assets/liang-evolution.mp4", + "assets/liang-evolution.webm", + "assets/liang-poster.png", + "assets/portrait-source-v2/stage-00.png", + "assets/portrait-source-v2/stage-06.png", + "assets/portrait-source-v2/stage-12.png", + "assets/portrait-source-v2/bridge-15.png", + "assets/portrait-source-v2/stage-18.png", + "assets/portrait-source-v2/stage-24.png", + "assets/portrait-source-v2/bridge-27.png", + "assets/portrait-source-v2/stage-30.png", + "cordis.patch.yml", + "lib/client.js", + "lib/client.js.map", + "src/index.js", + "src/range.js" + ], + "scripts": { + "build": "node ./scripts/build-client.mjs", + "test": "vitest run" + }, + "dsh": { + "bundle": { + "patch": "./cordis.patch.yml" + }, + "client": { + "platform": "web", + "inject": [ + "@deepseek-ai/dsh-client-runtime", + "@deepseek-ai/dsh-client-ui-conversation", + "@deepseek-ai/dsh-client-ui-model-selection", + "@deepseek-ai/dsh-client-ui-settings", + "@deepseek-ai/dsh-client-ui-settings-general", + "@deepseek-ai/dsh-client-locale", + "@deepseek-ai/dsh-api-remotes" + ] + } + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-api-remotes": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-locale": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-runtime": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-ui-conversation": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-ui-model-selection": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-ui-settings": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-ui-settings-general": "^0.1.0-rc.6", + "@deepseek-ai/dsh-client-ui-slots": "^0.1.0-rc.6", + "@deepseek-ai/dsh-host-webserver": "^0.1.0-rc.6", + "react": "^18.2.0" + }, + "devDependencies": { + "@types/react": "~18.3.1", + "esbuild": "^0.25.0", + "vitest": "^4.1.10" + } +} diff --git a/scripts/build-client.mjs b/scripts/build-client.mjs new file mode 100644 index 0000000..be3eb95 --- /dev/null +++ b/scripts/build-client.mjs @@ -0,0 +1,29 @@ +import { build } from "esbuild"; + +const id = "dsh-client-liang-intensity-skin"; + +await build({ + entryPoints: ["src/client/index.tsx"], + outfile: "lib/client.js", + bundle: true, + format: "cjs", + platform: "browser", + target: "es2022", + jsx: "automatic", + sourcemap: true, + loader: { ".css": "text" }, + external: [ + "react", + "react/jsx-runtime", + "@deepseek-ai/dsh-client-runtime/client", + ], + define: { + "process.env.NODE_ENV": '"production"', + }, + banner: { + js: `window.__ModuleLoader__.load({id:${JSON.stringify(id)},factory:(require)=>{var module={exports:{}};var exports=module.exports;`, + }, + footer: { + js: "return module.exports;}});", + }, +}); diff --git a/src/client/index.tsx b/src/client/index.tsx new file mode 100644 index 0000000..85f4fb8 --- /dev/null +++ b/src/client/index.tsx @@ -0,0 +1,590 @@ +import { + useEffect, + useMemo, + useRef, + useState, + useSyncExternalStore, +} from "react"; +import type { ClientContext, SnapshotStore } from "@deepseek-ai/dsh-client-runtime/client"; +import type {} from "@deepseek-ai/dsh-client-ui-conversation/client"; +import type {} from "@deepseek-ai/dsh-client-ui-settings/client"; +import type {} from "@deepseek-ai/dsh-client-ui-model-selection/client"; +import styles from "./skin.css"; +import { + PREVIEW_MAX_FRAME, + frameForEffort, + indicatorLabel, + nearestEffortIndex, + paletteForFrame, + portraitBlendForLevel, + selectedEffortIndex, + type EffortLike, +} from "./logic"; + +const PACKAGE_ID = "dsh-client-liang-intensity-skin"; +const LOCALE_NAMESPACE = "liang.skin"; +const ASSET_PREFIX = `/plugins/${PACKAGE_ID}/assets`; +const VIDEO_DURATION = 8.033; +const PREFERENCE_KEY = "dsh-liang-intensity-skin.enabled"; + +const PORTRAIT_ANCHORS = [ + { level: 0, file: "stage-00.png" }, + { level: 6, file: "stage-06.png" }, + { level: 12, file: "stage-12.png" }, + { level: 15, file: "bridge-15.png" }, + { level: 18, file: "stage-18.png" }, + { level: 24, file: "stage-24.png" }, + { level: 27, file: "bridge-27.png" }, + { level: 30, file: "stage-30.png" }, +] as const; + +interface SkinSettings { + enabled: boolean; +} + +interface PreferenceStore { + getSnapshot(): SkinSettings; + subscribe(listener: () => void): () => void; + set(enabled: boolean): Promise; + dispose(): void; +} + +interface ModelSelection { + provider: string; + model: string; + reasoningEffort?: string; +} + +interface CatalogModel { + id: string; + reasoning?: { + efforts: EffortLike[]; + defaultEffort?: string; + }; +} + +interface ModelDirectoryState { + current: ModelSelection | null; + groups: readonly { id: string; models: CatalogModel[] }[]; + status: "idle" | "loading" | "ready" | "selecting" | "error"; + error: string | null; +} + +interface ModelDirectory { + store: SnapshotStore; + load(): Promise; + select(selection: ModelSelection): Promise; +} + +interface SliderProps { + directory: SnapshotStore; + load: () => void; + select: (selection: ModelSelection) => Promise; + presenter: SkinPresenter; + scope: PreferenceStore; +} + +interface SettingsRowProps { + scope: PreferenceStore; + presenter: SkinPresenter; + t: (key: string) => string; +} + +const cssVariables = [ + "--liang-strength", + "--liang-page", + "--liang-bg-base", + "--liang-layer-1", + "--liang-layer-2", + "--liang-layer-3", + "--liang-sidebar", + "--liang-ink", + "--liang-secondary", + "--liang-tertiary", + "--liang-border", + "--liang-accent", + "--liang-accent-hover", + "--liang-hover", + "--liang-portrait-opacity", +] as const; + +class SkinPresenter { + private readonly scope: PreferenceStore; + private readonly root: HTMLDivElement; + private readonly video: HTMLVideoElement; + private readonly poster: HTMLImageElement; + private readonly portrait: HTMLImageElement; + private readonly preloads: HTMLImageElement[]; + private enabled = true; + private frame = 0; + private pendingFrame = 0; + private raf = 0; + private disposed = false; + private unsubscribe: () => void; + + constructor(scope: PreferenceStore) { + this.scope = scope; + this.root = document.createElement("div"); + this.root.className = "liang-skin-backdrop"; + this.root.dataset.plugin = PACKAGE_ID; + this.root.dataset.media = "sequence"; + this.root.setAttribute("aria-hidden", "true"); + + this.video = document.createElement("video"); + this.video.muted = true; + this.video.playsInline = true; + this.video.preload = "auto"; + // A video poster stays painted while a paused video is scrubbed in some + // browsers, which would make every effort show the same portrait. Keep the + // separate image element as the true load-error fallback instead. + const webm = document.createElement("source"); + webm.src = `${ASSET_PREFIX}/liang-evolution.webm`; + webm.type = "video/webm"; + const mp4 = document.createElement("source"); + mp4.src = `${ASSET_PREFIX}/liang-evolution.mp4`; + mp4.type = "video/mp4"; + this.video.append(webm, mp4); + + this.poster = document.createElement("img"); + this.poster.className = "liang-skin-poster"; + this.poster.src = `${ASSET_PREFIX}/liang-poster.png`; + this.poster.alt = ""; + + this.portrait = document.createElement("img"); + this.portrait.className = "liang-skin-sequence-frame"; + this.portrait.alt = ""; + this.portrait.draggable = false; + this.portrait.addEventListener("error", this.handleSequenceError); + + this.preloads = PORTRAIT_ANCHORS.map(({ file }) => { + const image = new Image(); + image.src = `${ASSET_PREFIX}/portrait-source-v2/${file}`; + return image; + }); + + this.root.append(this.video, this.portrait, this.poster); + document.body.prepend(this.root); + + this.video.addEventListener("loadedmetadata", this.handleMetadata); + this.video.addEventListener("error", this.handleVideoError); + this.poster.addEventListener("error", this.handlePosterError); + this.video.load(); + this.unsubscribe = scope.subscribe(() => this.syncSettings()); + this.syncSettings(); + } + + private readonly handleMetadata = () => { + this.seek(this.frame); + }; + + private readonly handleVideoError = () => { + this.root.dataset.media = "poster"; + }; + + private readonly handleSequenceError = () => { + this.root.dataset.media = "video"; + }; + + private readonly handlePosterError = () => { + this.root.dataset.media = "color"; + }; + + private syncSettings() { + this.setEnabled(this.scope.getSnapshot().enabled); + } + + isEnabled() { + return this.enabled; + } + + setEnabled(enabled: boolean) { + this.enabled = enabled; + if (enabled) { + if (!this.root.isConnected) document.body.prepend(this.root); + document.body.dataset.liangSkin = "on"; + this.applyFrame(); + } else { + this.root.remove(); + delete document.body.dataset.liangSkin; + delete document.body.dataset.liangStage; + for (const name of cssVariables) document.body.style.removeProperty(name); + } + } + + setFrame(frame: number) { + this.pendingFrame = Math.min(PREVIEW_MAX_FRAME, Math.max(0, Math.round(frame))); + this.frame = this.pendingFrame; + if (!this.enabled) return; + if (this.raf !== 0) return; + this.raf = requestAnimationFrame(() => { + this.raf = 0; + this.frame = this.pendingFrame; + this.applyFrame(); + }); + } + + private applyFrame() { + const palette = paletteForFrame(this.frame); + const body = document.body; + body.dataset.liangStage = String(palette.stage); + body.style.setProperty("--liang-strength", String(palette.strength)); + body.style.setProperty("--liang-page", palette.page); + body.style.setProperty("--liang-bg-base", palette.base); + body.style.setProperty("--liang-layer-1", palette.layer1); + body.style.setProperty("--liang-layer-2", palette.layer2); + body.style.setProperty("--liang-layer-3", palette.layer3); + body.style.setProperty("--liang-sidebar", palette.sidebar); + body.style.setProperty("--liang-ink", palette.ink); + body.style.setProperty("--liang-secondary", palette.secondary); + body.style.setProperty("--liang-tertiary", palette.tertiary); + body.style.setProperty("--liang-border", palette.border); + body.style.setProperty("--liang-accent", palette.accent); + body.style.setProperty("--liang-accent-hover", palette.accentHover); + body.style.setProperty("--liang-hover", palette.hover); + body.style.setProperty("--liang-portrait-opacity", palette.portraitOpacity); + this.updatePortrait(palette.level); + this.seek(this.frame); + } + + private updatePortrait(level: number) { + const { lowerIndex, upperIndex, mix } = portraitBlendForLevel( + level, + PORTRAIT_ANCHORS.map((anchor) => anchor.level), + ); + const lower = PORTRAIT_ANCHORS[lowerIndex]; + const upper = PORTRAIT_ANCHORS[upperIndex]; + const selected = mix >= 0.5 ? upper : lower; + const source = `${ASSET_PREFIX}/portrait-source-v2/${selected.file}`; + if (this.portrait.getAttribute("src") !== source) this.portrait.src = source; + } + + private seek(frame: number) { + if (this.video.readyState < 1 || this.video.duration === 0) return; + const duration = Number.isFinite(this.video.duration) ? this.video.duration : VIDEO_DURATION; + const target = Math.min(Math.max(0, duration - 0.001), (frame / PREVIEW_MAX_FRAME) * duration); + if (Math.abs(this.video.currentTime - target) > 0.025) this.video.currentTime = target; + } + + async choose(enabled: boolean) { + this.setEnabled(enabled); + try { + await this.scope.set(enabled); + } catch (error) { + this.syncSettings(); + throw error; + } + } + + dispose() { + if (this.disposed) return; + this.disposed = true; + this.unsubscribe(); + if (this.raf !== 0) cancelAnimationFrame(this.raf); + this.video.pause(); + this.video.removeEventListener("loadedmetadata", this.handleMetadata); + this.video.removeEventListener("error", this.handleVideoError); + this.portrait.removeEventListener("error", this.handleSequenceError); + this.poster.removeEventListener("error", this.handlePosterError); + for (const image of this.preloads) image.src = ""; + this.root.remove(); + document.body.removeAttribute("data-liang-skin"); + delete document.body.dataset.liangStage; + for (const name of cssVariables) document.body.style.removeProperty(name); + } +} + +function modelReasoning(state: ModelDirectoryState) { + const current = state.current; + if (current === null) return null; + const group = state.groups.find((item) => item.id === current.provider); + const model = group?.models.find((item) => item.id === current.model); + if (model?.reasoning === undefined) return null; + return { + selection: current, + efforts: model.reasoning.efforts, + defaultEffort: model.reasoning.defaultEffort, + }; +} + +function LiangEffortSlider({ directory, load, select, presenter, scope }: SliderProps) { + const state = useSyncExternalStore( + (listener) => directory.subscribe(listener), + () => directory.getSnapshot(), + ); + const skin = useSyncExternalStore( + (listener) => scope.subscribe(listener), + () => scope.getSnapshot(), + ); + const reasoning = useMemo(() => modelReasoning(state), [state]); + const efforts = reasoning?.efforts ?? []; + const committedIndex = selectedEffortIndex( + efforts, + reasoning?.selection.reasoningEffort, + reasoning?.defaultEffort, + ); + const committedFrame = committedIndex < 0 + ? 0 + : frameForEffort(committedIndex, efforts.length); + const [frame, setFrame] = useState(committedFrame); + const [pending, setPending] = useState(false); + const [failed, setFailed] = useState(false); + const [interacting, setInteracting] = useState(false); + const dragging = useRef(false); + const enabled = skin.enabled; + + useEffect(() => { + if (enabled) load(); + }, [enabled, load]); + + useEffect(() => { + if (dragging.current || pending) return; + setFrame(committedFrame); + presenter.setFrame(committedFrame); + }, [committedFrame, pending, presenter]); + + if (!enabled) return null; + if (reasoning === null || efforts.length < 2) return null; + + const previewIndex = nearestEffortIndex(frame, efforts); + const previewEffort = efforts[previewIndex]; + const progress = `${(frame / PREVIEW_MAX_FRAME) * 100}%`; + + const commit = async (rawFrame: number) => { + const targetIndex = nearestEffortIndex(rawFrame, efforts); + const target = efforts[targetIndex]; + if (target === undefined) return; + const targetFrame = frameForEffort(targetIndex, efforts.length); + dragging.current = false; + setFrame(targetFrame); + presenter.setFrame(targetFrame); + if (targetIndex === committedIndex || pending) return; + setPending(true); + setFailed(false); + const accepted = await select({ + provider: reasoning.selection.provider, + model: reasoning.selection.model, + reasoningEffort: target.id, + }); + setPending(false); + if (!accepted) { + setFailed(true); + setFrame(committedFrame); + presenter.setFrame(committedFrame); + } + }; + + return ( +
+ {interacting && ( + + {indicatorLabel(frame, efforts)} + + )} + + { + dragging.current = true; + setInteracting(true); + }} + onInput={(event) => { + dragging.current = true; + const next = Number(event.currentTarget.value); + setFrame(next); + presenter.setFrame(next); + }} + onPointerUp={(event) => { + setInteracting(false); + void commit(Number(event.currentTarget.value)); + }} + onPointerCancel={() => { + setInteracting(false); + dragging.current = false; + setFrame(committedFrame); + presenter.setFrame(committedFrame); + }} + onKeyUp={(event) => { + setInteracting(false); + if (event.key !== "Escape") void commit(Number(event.currentTarget.value)); + }} + onBlur={(event) => { + setInteracting(false); + if (dragging.current) void commit(Number(event.currentTarget.value)); + }} + onKeyDown={(event) => { + setInteracting(true); + if (event.key === "Escape" && !pending) { + setInteracting(false); + dragging.current = false; + setFrame(committedFrame); + presenter.setFrame(committedFrame); + } + }} + /> +
+ ); +} + +function AppearanceSkinRow({ scope, presenter, t }: SettingsRowProps) { + const snapshot = useSyncExternalStore( + (listener) => scope.subscribe(listener), + () => scope.getSnapshot(), + ); + const enabled = snapshot.enabled; + const [pending, setPending] = useState(false); + + const choose = async (next: boolean) => { + if (next === enabled || pending) return; + setPending(true); + try { + await presenter.choose(next); + } finally { + setPending(false); + } + }; + + return ( +
+ {t("appearance.title")} +
+ + +
+
+ ); +} + +export const inject = [ + "slots", + "sessions", + "modelDirectories", + "locale", +]; + +function createPreferenceStore(): PreferenceStore { + let snapshot: SkinSettings = { + enabled: localStorage.getItem(PREFERENCE_KEY) !== "0", + }; + const listeners = new Set<() => void>(); + const onStorage = (event: StorageEvent) => { + if (event.key !== PREFERENCE_KEY) return; + const enabled = event.newValue !== "0"; + if (enabled === snapshot.enabled) return; + snapshot = { enabled }; + for (const listener of listeners) listener(); + }; + window.addEventListener("storage", onStorage); + return { + getSnapshot: () => snapshot, + subscribe(listener) { + listeners.add(listener); + return () => listeners.delete(listener); + }, + async set(enabled) { + if (enabled === snapshot.enabled) return; + localStorage.setItem(PREFERENCE_KEY, enabled ? "1" : "0"); + snapshot = { enabled }; + for (const listener of listeners) listener(); + }, + dispose() { + window.removeEventListener("storage", onStorage); + listeners.clear(); + }, + }; +} + +export function apply(ctx: ClientContext) { + const style = document.createElement("style"); + style.dataset.plugin = PACKAGE_ID; + style.textContent = styles; + document.head.append(style); + ctx.effect(() => () => style.remove(), "liang-intensity-skin: scoped styles"); + + const scope = createPreferenceStore(); + ctx.effect(() => () => scope.dispose(), "liang-intensity-skin: appearance preference"); + const presenter = new SkinPresenter(scope); + ctx.effect(() => () => presenter.dispose(), "liang-intensity-skin: backdrop presenter"); + + ctx.effect(() => ctx.locale.register(LOCALE_NAMESPACE, { + zh: { + "appearance.title": "外观皮肤", + "appearance.native": "原生", + "appearance.liang": "滑动变祖", + }, + en: { + "appearance.title": "Visual skin", + "appearance.native": "Native", + "appearance.liang": "Slider", + }, + }), "liang-intensity-skin: settings locale"); + + ctx.slots.inject("settings.general.item", () => ctx.slots.register({ + name: "settings.general.item", + id: "liang-intensity-appearance", + order: 11, + locale: LOCALE_NAMESPACE, + inject: () => ({ scope, presenter }), + }, AppearanceSkinRow)); + + ctx.slots.inject("conversation.input.right", () => ctx.slots.register({ + name: "conversation.input.right", + id: "liang-intensity-control", + order: 10, + inject: (sessionId: string) => { + const available = ctx.sessions.subagentAddress(sessionId) === undefined; + const directory = ctx.modelDirectories.directoryFor(sessionId) as ModelDirectory; + return { + directory: directory.store, + presenter, + scope, + load: () => { + if (available) void directory.load().catch(() => undefined); + }, + select: (selection: ModelSelection) => available + ? directory.select(selection).then(() => true, () => false) + : Promise.resolve(false), + }; + }, + }, LiangEffortSlider)); +} diff --git a/src/client/logic.test.ts b/src/client/logic.test.ts new file mode 100644 index 0000000..0bee9aa --- /dev/null +++ b/src/client/logic.test.ts @@ -0,0 +1,67 @@ +import { describe, expect, it } from "vitest"; +import { + frameForEffort, + indicatorLabel, + liangRankForFrame, + nearestEffortIndex, + paletteForFrame, + portraitBlendForLevel, + selectedEffortIndex, +} from "./logic"; + +const efforts = [ + { id: "off", name: "Off" }, + { id: "high", name: "High" }, + { id: "max", name: "Max" }, +]; + +describe("滑动变祖 effort mapping", () => { + it("spreads dynamic effort metadata across all 241 preview frames", () => { + expect(frameForEffort(0, 3)).toBe(0); + expect(frameForEffort(1, 3)).toBe(120); + expect(frameForEffort(2, 3)).toBe(240); + expect(nearestEffortIndex(119, efforts)).toBe(1); + expect(nearestEffortIndex(181, efforts)).toBe(2); + }); + + it("recomputes anchors for two-level and five-level models", () => { + expect([0, 1].map((index) => frameForEffort(index, 2))).toEqual([0, 240]); + expect([0, 1, 2, 3, 4].map((index) => frameForEffort(index, 5))).toEqual([ + 0, 60, 120, 180, 240, + ]); + }); + + it("uses the provider default only when the current selection omits an effort", () => { + expect(selectedEffortIndex(efforts, "max", "high")).toBe(2); + expect(selectedEffortIndex(efforts, undefined, "high")).toBe(1); + expect(selectedEffortIndex(efforts)).toBe(-1); + }); + + it("carries the original light-to-charcoal-to-gold stage mapping", () => { + expect(paletteForFrame(0)).toMatchObject({ stage: 0, strength: 0 }); + expect(paletteForFrame(120)).toMatchObject({ stage: 0, level: 15 }); + expect(paletteForFrame(191)).toMatchObject({ stage: 0 }); + expect(paletteForFrame(192)).toMatchObject({ stage: 5 }); + expect(paletteForFrame(239)).toMatchObject({ stage: 5 }); + expect(paletteForFrame(240)).toMatchObject({ stage: 5, strength: 1 }); + expect(paletteForFrame(0).accent).toBe("rgb(65 118 230)"); + expect(paletteForFrame(240).accent).toBe("rgb(193 154 73)"); + }); + + it("finds the nearest available portrait keys", () => { + const anchors = [0, 6, 12, 15, 18, 24, 27, 30]; + expect(portraitBlendForLevel(0, anchors)).toEqual({ lowerIndex: 0, upperIndex: 0, mix: 0 }); + expect(portraitBlendForLevel(13.5, anchors)).toEqual({ lowerIndex: 2, upperIndex: 3, mix: 0.5 }); + expect(portraitBlendForLevel(31, anchors)).toEqual({ lowerIndex: 7, upperIndex: 7, mix: 0 }); + }); + + it("labels continuous Liang ranks independently from model efforts", () => { + expect(liangRankForFrame(0)).toBe("小难梁"); + expect(liangRankForFrame(48)).toBe("牢梁"); + expect(liangRankForFrame(191)).toBe("梁圣"); + expect(liangRankForFrame(192)).toBe("梁神"); + expect(liangRankForFrame(240)).toBe("梁祖"); + expect(indicatorLabel(240, efforts)).toBe("梁祖 · Max"); + expect(indicatorLabel(119, efforts)).toBe("梁子 · High"); + }); +}); diff --git a/src/client/logic.ts b/src/client/logic.ts new file mode 100644 index 0000000..176a4f4 --- /dev/null +++ b/src/client/logic.ts @@ -0,0 +1,189 @@ +export const PREVIEW_MAX_FRAME = 240; +export const MAX_LEVEL = 30; + +const LIANG_RANKS = ["小难梁", "牢梁", "梁子", "梁圣", "梁神", "梁祖"] as const; + +export interface EffortLike { + id: string; + name: string; + description?: string; +} + +export interface Palette { + level: number; + stage: number; + strength: number; + page: string; + base: string; + layer1: string; + layer2: string; + layer3: string; + sidebar: string; + ink: string; + secondary: string; + tertiary: string; + border: string; + accent: string; + accentHover: string; + hover: string; + portraitOpacity: string; +} + +type Rgb = readonly [number, number, number]; + +interface PaletteStop { + at: number; + page: Rgb; + surface: Rgb; + surface2: Rgb; + ink: Rgb; + secondary: Rgb; + accent: Rgb; + portraitOpacity: number; +} + +// These are the original calibrator's six stage anchors: pale neutral at the +// low end, progressively smoked surfaces, then charcoal and antique gold. +const STOPS: readonly PaletteStop[] = [ + { at: 0, page: [232, 233, 229], surface: [248, 248, 245], surface2: [238, 239, 235], ink: [23, 24, 22], secondary: [112, 116, 111], accent: [181, 43, 36], portraitOpacity: 0.92 }, + { at: 6, page: [211, 211, 206], surface: [239, 239, 234], surface2: [224, 224, 218], ink: [26, 26, 24], secondary: [101, 101, 96], accent: [181, 43, 36], portraitOpacity: 0.93 }, + { at: 12, page: [171, 168, 162], surface: [211, 208, 201], surface2: [190, 186, 179], ink: [27, 26, 24], secondary: [83, 79, 74], accent: [166, 54, 42], portraitOpacity: 0.94 }, + { at: 18, page: [117, 112, 106], surface: [154, 148, 140], surface2: [128, 122, 115], ink: [24, 22, 20], secondary: [65, 61, 56], accent: [154, 56, 42], portraitOpacity: 0.94 }, + { at: 24, page: [43, 39, 37], surface: [48, 43, 40], surface2: [58, 51, 46], ink: [244, 241, 232], secondary: [184, 180, 169], accent: [181, 92, 54], portraitOpacity: 0.94 }, + { at: 30, page: [17, 17, 17], surface: [30, 27, 25], surface2: [41, 35, 30], ink: [244, 241, 232], secondary: [184, 180, 169], accent: [193, 154, 73], portraitOpacity: 0.94 }, +]; + +export function clampFrame(value: number): number { + if (!Number.isFinite(value)) return 0; + return Math.min(PREVIEW_MAX_FRAME, Math.max(0, Math.round(value))); +} + +export function frameForEffort(index: number, count: number): number { + if (count <= 1 || !Number.isFinite(index)) return 0; + const safe = Math.min(count - 1, Math.max(0, Math.round(index))); + return Math.round((safe / (count - 1)) * PREVIEW_MAX_FRAME); +} + +export function nearestEffortIndex(frame: number, efforts: readonly EffortLike[]): number { + if (efforts.length === 0) return -1; + const safe = clampFrame(frame); + let best = 0; + let distance = Math.abs(safe - frameForEffort(0, efforts.length)); + for (let index = 1; index < efforts.length; index += 1) { + const next = Math.abs(safe - frameForEffort(index, efforts.length)); + if (next < distance) { + best = index; + distance = next; + } + } + return best; +} + +export function selectedEffortIndex( + efforts: readonly EffortLike[], + selectedId?: string, + defaultId?: string, +): number { + const id = selectedId ?? defaultId; + return id === undefined ? -1 : efforts.findIndex((effort) => effort.id === id); +} + +export function portraitBlendForLevel(level: number, anchors: readonly number[]) { + if (anchors.length === 0) return { lowerIndex: -1, upperIndex: -1, mix: 0 }; + const safeLevel = Number.isFinite(level) + ? Math.min(anchors[anchors.length - 1], Math.max(anchors[0], level)) + : anchors[0]; + let upperIndex = anchors.findIndex((anchor) => anchor >= safeLevel); + if (upperIndex < 0) upperIndex = anchors.length - 1; + const lowerIndex = Math.max(0, upperIndex - (anchors[upperIndex] > safeLevel ? 1 : 0)); + const span = anchors[upperIndex] - anchors[lowerIndex]; + return { + lowerIndex, + upperIndex, + mix: span === 0 ? 0 : (safeLevel - anchors[lowerIndex]) / span, + }; +} + +export function liangRankForFrame(rawFrame: number): string { + const level = (clampFrame(rawFrame) / PREVIEW_MAX_FRAME) * MAX_LEVEL; + const index = level >= MAX_LEVEL ? LIANG_RANKS.length - 1 : Math.floor(level / 6); + return LIANG_RANKS[Math.min(LIANG_RANKS.length - 1, Math.max(0, index))]; +} + +export function indicatorLabel(rawFrame: number, efforts: readonly EffortLike[]): string { + const effort = efforts[nearestEffortIndex(rawFrame, efforts)]; + return effort === undefined + ? liangRankForFrame(rawFrame) + : `${liangRankForFrame(rawFrame)} · ${effort.name}`; +} + +function lerp(a: number, b: number, amount: number): number { + return a + (b - a) * amount; +} + +function mix(a: Rgb, b: Rgb, amount: number): Rgb { + return [ + Math.round(lerp(a[0], b[0], amount)), + Math.round(lerp(a[1], b[1], amount)), + Math.round(lerp(a[2], b[2], amount)), + ]; +} + +function rgb(value: Rgb, alpha = 1): string { + return alpha === 1 + ? `rgb(${value[0]} ${value[1]} ${value[2]})` + : `rgb(${value[0]} ${value[1]} ${value[2]} / ${alpha})`; +} + +export function paletteForFrame(rawFrame: number): Palette { + const frame = clampFrame(rawFrame); + const level = (frame / PREVIEW_MAX_FRAME) * MAX_LEVEL; + const portraitStage = Math.min(5, Math.floor(level / 6)); + const portraitFrom = STOPS[portraitStage]; + const portraitTo = STOPS[Math.min(5, portraitStage + 1)]; + const portraitAmount = portraitFrom === portraitTo + ? 0 + : (level - portraitFrom.at) / (portraitTo.at - portraitFrom.at); + + // The UI itself is intentionally binary: levels 0–23 keep the native light + // shell; entering the original 梁神/梁祖 region at level 24 switches black/gold. + const dark = level >= 24; + const stage = dark ? 5 : 0; + const ui = dark ? STOPS[5] : STOPS[0]; + const page = ui.page; + const surface = ui.surface; + const surface2 = ui.surface2; + const sidebar = mix(page, surface2, 0.25); + const ink = ui.ink; + const secondary = ui.secondary; + // Keep Harness' native blue in the light shell. The original calibrator's + // antique gold only becomes the product accent once the dark region begins. + const accent: Rgb = dark ? [193, 154, 73] : [65, 118, 230]; + const accentHover = mix(accent, ink, 0.13); + + return { + level, + stage, + strength: level / MAX_LEVEL, + page: rgb(page), + // Keep the shell readable while allowing the right-side portrait to remain + // visibly present. Dense controls use the opaque layer tokens below. + base: rgb(page, dark ? 0.42 : 0.28), + layer1: rgb(surface, 0.94), + layer2: rgb(surface2, 0.96), + layer3: rgb(surface2, 0.99), + sidebar: rgb(sidebar, 0.96), + ink: rgb(ink), + secondary: rgb(secondary), + tertiary: rgb(mix(secondary, page, 0.28)), + border: rgb(ink, dark ? 0.15 : 0.12), + accent: rgb(accent), + accentHover: rgb(accentHover), + hover: rgb(ink, dark ? 0.09 : 0.07), + portraitOpacity: String(lerp( + portraitFrom.portraitOpacity, + portraitTo.portraitOpacity, + portraitAmount, + )), + }; +} diff --git a/src/client/skin.css b/src/client/skin.css new file mode 100644 index 0000000..420588a --- /dev/null +++ b/src/client/skin.css @@ -0,0 +1,472 @@ +.liang-skin-backdrop { + position: fixed; + z-index: 0; + inset: 0; + overflow: hidden; + pointer-events: none; + background: var(--liang-page, transparent); + opacity: 0; + transition: opacity 220ms ease, background-color 180ms linear; +} + +body[data-liang-skin="on"] .liang-skin-backdrop { + opacity: 1; +} + +.liang-skin-backdrop video, +.liang-skin-backdrop img { + position: absolute; + top: 50%; + right: 0; + display: block; + width: min(42vw, 720px); + height: 100vh; + object-fit: cover; + object-position: 50% 42%; + opacity: var(--liang-portrait-opacity, 0.45); + transform: translateY(-50%); + filter: none; + mask-image: linear-gradient(90deg, transparent 0%, rgb(0 0 0 / 20%) 10%, black 30%, black 100%); + transition: filter 180ms linear; +} + +.liang-skin-backdrop img { + display: none; +} + +.liang-skin-backdrop[data-media="sequence"] video, +.liang-skin-backdrop[data-media="sequence"] .liang-skin-poster { + display: none; +} + +.liang-skin-backdrop[data-media="sequence"] .liang-skin-sequence-frame { + display: block; + opacity: var(--liang-portrait-opacity, 0.82); +} + +.liang-skin-backdrop[data-media="video"] .liang-skin-sequence-frame, +.liang-skin-backdrop[data-media="video"] .liang-skin-poster { + display: none; +} + +.liang-skin-backdrop[data-media="poster"] video, +.liang-skin-backdrop[data-media="poster"] .liang-skin-sequence-frame { + display: none; +} + +.liang-skin-backdrop[data-media="poster"] .liang-skin-poster { + display: block; +} + +.liang-skin-backdrop[data-media="color"] video, +.liang-skin-backdrop[data-media="color"] img { + display: none; +} + +.liang-skin-backdrop::after { + position: absolute; + inset: 0; + content: ""; + background: linear-gradient(90deg, var(--liang-page, transparent) 0 28%, transparent 57% 100%); +} + +body[data-liang-skin="on"] { + --dsw-alias-bg-base: var(--liang-bg-base) !important; + --dsw-alias-bg-layer-1: var(--liang-layer-1) !important; + --dsw-alias-bg-layer-2: var(--liang-layer-2) !important; + --dsw-alias-bg-layer-3: var(--liang-layer-3) !important; + --dsw-specific-sidebar-fill: var(--liang-sidebar) !important; + --dsw-alias-label-primary: var(--liang-ink) !important; + --dsw-alias-label-primary-dimmed: var(--liang-ink) !important; + --dsw-alias-label-secondary: var(--liang-secondary) !important; + --dsw-alias-label-tertiary: var(--liang-tertiary) !important; + --dsw-alias-label-caption: var(--liang-tertiary) !important; + --dsw-alias-border-l1: var(--liang-border) !important; + --dsw-alias-border-l2-darkmode-thin: var(--liang-border) !important; + --dsw-alias-border-l2: var(--liang-border) !important; + --dsw-alias-border-l3: var(--liang-border) !important; + --dsw-alias-button-primary-fill: var(--liang-accent) !important; + --dsw-alias-button-primary-hover: var(--liang-accent-hover) !important; + --dsw-alias-button-info-fill: var(--liang-accent) !important; + --dsw-alias-button-info-hover: var(--liang-accent-hover) !important; + --dsw-alias-state-business-primary: var(--liang-accent) !important; + --dsw-alias-interactive-bg-hover: var(--liang-hover) !important; + --dsw-alias-interactive-bg-active: var(--liang-hover) !important; + --dsw-alias-button-elevated-fill: var(--liang-layer-1) !important; + --dsw-alias-button-floating-fill: var(--liang-layer-2) !important; + --dsw-alias-button-floating-hover: var(--liang-layer-3) !important; + --dsw-alias-interactive-bg-hover-solid: var(--liang-layer-2) !important; + --dsw-specific-bubble: var(--liang-layer-2) !important; + --dsw-specific-input-major: var(--liang-layer-1) !important; + --dsw-specific-menu: var(--liang-layer-3) !important; + --dsw-specific-selector: var(--liang-layer-2) !important; + background: var(--liang-page) !important; +} + +body[data-liang-skin="on"]:is( + [data-liang-stage="0"], + [data-liang-stage="1"], + [data-liang-stage="2"], + [data-liang-stage="3"] +) { + --dsw-alias-brand-primary-new-colorprimary-new-color: rgb(65 118 230) !important; + --dsw-alias-brand-primary: rgb(15 17 21) !important; + --dsw-alias-brand-text: rgb(15 17 21) !important; + --dsw-alias-button-primary-fill: rgb(15 17 21) !important; + --dsw-alias-button-primary-hover: rgb(53 54 56) !important; + --dsw-alias-button-info-fill: rgb(65 118 230) !important; + --dsw-alias-button-info-hover: rgb(103 158 254) !important; + --dsw-alias-state-business-primary: rgb(65 118 230) !important; + --dsw-alias-label-primary-inverted: rgb(249 250 251) !important; + --dsw-alias-button-elevated-fill: rgb(255 255 255) !important; + --dsw-alias-button-floating-fill: rgb(255 255 255) !important; + --dsw-alias-button-floating-hover: rgb(241 243 245) !important; + --dsw-alias-interactive-bg-hover-solid: rgb(241 243 245) !important; + --dsw-specific-bubble: rgb(237 243 254) !important; + --dsw-specific-input-major: rgb(255 255 255) !important; + --dsw-specific-menu: rgb(255 255 255) !important; + --dsw-specific-selector: rgb(245 246 247) !important; +} + +body[data-liang-skin="on"][data-liang-stage="5"] { + --dsw-alias-brand-primary-new-colorprimary-new-color: #c19a49 !important; + --dsw-alias-brand-primary: #c19a49 !important; + --dsw-alias-brand-text: #d5b56e !important; + --dsw-alias-button-info-fill: #c19a49 !important; + --dsw-alias-button-info-hover: #d5b56e !important; + --dsw-alias-state-business-primary: #c19a49 !important; +} + +/* Preserve the wordmark badge contrast even when the underlying Harness + preference is dark while our low-intensity shell is light. */ +body[data-liang-skin="on"]:is( + [data-liang-stage="0"], + [data-liang-stage="1"], + [data-liang-stage="2"], + [data-liang-stage="3"] +) button[aria-label="新建会话"] svg[viewBox="0 0 182 24"] > rect[width="52"] { + fill: rgb(15 17 21) !important; +} + +body[data-liang-skin="on"]:is( + [data-liang-stage="0"], + [data-liang-stage="1"], + [data-liang-stage="2"], + [data-liang-stage="3"] +) button[aria-label="新建会话"] svg[viewBox="0 0 182 24"] > g[clip-path*="badge"] path { + fill: rgb(249 250 251) !important; +} + +body[data-liang-skin="on"][data-liang-stage="5"] button[aria-label="新建会话"] svg[viewBox="0 0 182 24"] > rect[width="52"] { + fill: #c19a49 !important; +} + +body[data-liang-skin="on"][data-liang-stage="5"] button[aria-label="新建会话"] svg[viewBox="0 0 182 24"] > g[clip-path*="badge"] path { + fill: #171816 !important; +} + +body[data-liang-skin="on"][data-liang-stage="5"] [aria-label^="选择模型"] > span:nth-of-type(2) { + color: #d5b56e !important; +} + +body[data-liang-skin="on"][data-liang-stage="5"] [class*="heroGlow"] ellipse { + fill: #c19a49 !important; + fill-opacity: 0.16 !important; +} + +body[data-liang-skin="on"][data-liang-stage="5"] span[class*="_previewBadge"] { + color: #171816 !important; + background: #c19a49 !important; +} + +body[data-liang-skin="on"][data-liang-stage="5"] button[aria-label="发送消息"] { + color: #171816 !important; +} + +body[data-liang-skin="on"][data-liang-stage="5"] button[aria-label="发送消息"]:disabled { + opacity: 0.62; +} + +body[data-liang-skin="on"]:is( + [data-liang-stage="0"], + [data-liang-stage="1"], + [data-liang-stage="2"], + [data-liang-stage="3"] +) button[aria-label="发送消息"] { + color: #fff !important; +} + +body[data-liang-skin="on"]:is( + [data-liang-stage="0"], + [data-liang-stage="1"], + [data-liang-stage="2"], + [data-liang-stage="3"] +) button[aria-label="发送消息"]:disabled { + color: rgb(255 255 255 / 92%) !important; + background: rgb(65 118 230 / 42%) !important; + opacity: 1; +} + +body[data-liang-skin="on"] > #root { + position: relative; + z-index: 1; + background: transparent !important; +} + +body[data-liang-skin="on"] button, +body[data-liang-skin="on"] input, +body[data-liang-skin="on"] textarea { + transition: color 160ms linear, background-color 160ms linear, border-color 160ms linear; +} + +/* Harness can itself be in dark mode while the low intensity stages are light. + The composer card has a native theme-mode fill, so explicitly bring only + those light stages back to the original light surface and readable ink. */ +body[data-liang-skin="on"]:is( + [data-liang-stage="0"], + [data-liang-stage="1"], + [data-liang-stage="2"], + [data-liang-stage="3"] +) [data-composer-card="true"] { + border-color: var(--liang-border) !important; + color: var(--liang-ink) !important; + background: var(--liang-layer-1) !important; + box-shadow: 0 8px 28px rgb(20 22 20 / 8%); +} + +body[data-liang-skin="on"]:is( + [data-liang-stage="0"], + [data-liang-stage="1"], + [data-liang-stage="2"], + [data-liang-stage="3"] +) [data-composer-card="true"] :is(textarea, button, [data-input-mirror="true"]) { + color: var(--liang-ink) !important; + caret-color: var(--liang-accent) !important; +} + +body[data-liang-skin="on"]:is( + [data-liang-stage="0"], + [data-liang-stage="1"], + [data-liang-stage="2"], + [data-liang-stage="3"] +) [data-composer-card="true"] textarea::placeholder { + color: var(--liang-tertiary) !important; + opacity: 1; +} + +.liang-effort-control { + --liang-control-accent: var(--dsw-alias-brand-primary-new-colorprimary-new-color, #4176e6); + --liang-control-rail: var(--dsw-alias-border-l3, rgb(0 0 0 / 16%)); + position: relative; + display: flex; + width: 124px; + height: 28px; + align-items: center; + margin: 0 3px; + overflow: visible; +} + +body[data-liang-skin="on"] .liang-effort-control { + --liang-control-accent: var(--liang-accent); + --liang-control-rail: color-mix(in srgb, var(--liang-accent) 34%, transparent); +} + +body[data-liang-skin="on"]:is( + [data-liang-stage="0"], + [data-liang-stage="1"], + [data-liang-stage="2"], + [data-liang-stage="3"] +) .liang-effort-control { + --liang-control-accent: var(--liang-secondary); + --liang-control-rail: color-mix(in srgb, var(--liang-secondary) 28%, transparent); +} + +.liang-effort-control__ticks { + position: absolute; + z-index: 0; + inset: 0 10px; + pointer-events: none; +} + +.liang-effort-control__tooltip { + position: absolute; + z-index: 4; + bottom: calc(100% + 7px); + left: var(--liang-tooltip-position); + min-width: max-content; + padding: 5px 8px; + border: 1px solid var(--liang-border, rgb(0 0 0 / 12%)); + border-radius: 7px; + color: var(--liang-ink, #171816); + background: var(--liang-layer-1, #fff); + box-shadow: 0 5px 16px rgb(0 0 0 / 16%); + font-size: 11px; + font-weight: 600; + line-height: 16px; + letter-spacing: 0.01em; + pointer-events: none; + transform: translateX(-50%); + white-space: nowrap; +} + +.liang-effort-control__tooltip::after { + position: absolute; + top: 100%; + left: 50%; + width: 7px; + height: 7px; + content: ""; + background: inherit; + transform: translate(-50%, -4px) rotate(45deg); +} + +.liang-effort-control__tick { + position: absolute; + top: 50%; + width: 1px; + height: 7px; + background: var(--liang-control-accent); + opacity: 0.42; + transform: translate(-50%, -50%); +} + +.liang-effort-control__range { + position: relative; + z-index: 1; + width: 100%; + height: 28px; + margin: 0; + cursor: ew-resize; + appearance: none; + background: transparent; + touch-action: pan-y; +} + +.liang-effort-control__range:disabled { + cursor: progress; + opacity: 0.58; +} + +.liang-effort-control__range::-webkit-slider-runnable-track { + height: 1px; + border-radius: 1px; + background: linear-gradient(90deg, var(--liang-control-accent) 0 var(--liang-slider-progress), var(--liang-control-rail) var(--liang-slider-progress) 100%); +} + +.liang-effort-control__range::-webkit-slider-thumb { + width: 13px; + height: 13px; + margin-top: -6px; + border: 1.5px solid color-mix(in srgb, var(--liang-control-accent) 72%, transparent); + border-radius: 50%; + appearance: none; + background: radial-gradient(circle, var(--liang-control-accent) 0 2px, color-mix(in srgb, var(--liang-control-accent) 22%, var(--dsw-alias-bg-layer-1, #fff)) 2.5px); + box-shadow: 0 1px 4px rgb(0 0 0 / 14%); +} + +body[data-liang-skin="on"] .liang-effort-control__range::-webkit-slider-thumb { + width: 13px; + height: 13px; + margin-top: -6px; + border-color: color-mix(in srgb, var(--liang-control-accent) 72%, transparent); + background: radial-gradient(circle, var(--liang-control-accent) 0 2px, color-mix(in srgb, var(--liang-control-accent) 22%, var(--liang-layer-1)) 2.5px); +} + +.liang-effort-control__range::-moz-range-track { + height: 1px; + background: var(--liang-control-rail); +} + +.liang-effort-control__range::-moz-range-progress { + height: 1px; + background: var(--liang-control-accent); +} + +.liang-effort-control__range::-moz-range-thumb { + width: 11px; + height: 11px; + border: 1.5px solid color-mix(in srgb, var(--liang-control-accent) 72%, transparent); + border-radius: 50%; + background: color-mix(in srgb, var(--liang-control-accent) 24%, var(--dsw-alias-bg-layer-1, #fff)); +} + +.liang-effort-control__range:focus-visible { + outline: none; +} + +.liang-effort-control[data-state="error"] { + --liang-control-accent: var(--dsw-alias-state-error-primary, #e43c3c); +} + +.liang-settings-row { + display: flex; + min-height: 82px; + align-items: center; + justify-content: space-between; + gap: 24px; + padding: 16px 0; + border-bottom: 1px solid var(--dsw-alias-border-l1, rgb(0 0 0 / 6%)); + color: var(--dsw-alias-label-primary); +} + +.liang-settings-row__title { + flex: 0 0 auto; + font-size: 14px; + font-weight: 500; +} + +.liang-settings-row__choices { + display: flex; + gap: 8px; +} + +.liang-settings-row__choice { + min-width: 76px; + height: 40px; + padding: 0 14px; + border: 1px solid var(--dsw-alias-border-l2, rgb(0 0 0 / 10%)); + border-radius: 10px; + color: var(--dsw-alias-label-secondary); + background: var(--dsw-alias-bg-layer-1); + cursor: pointer; +} + +.liang-settings-row__choice:hover { + background: var(--dsw-alias-interactive-bg-hover); +} + +.liang-settings-row__choice[aria-pressed="true"] { + border-color: var(--dsw-alias-label-primary); + color: var(--dsw-alias-label-primary); + box-shadow: inset 0 0 0 1px var(--dsw-alias-label-primary); +} + +@media (max-width: 760px) { + .liang-effort-control { + width: 92px; + } + + .liang-skin-backdrop video, + .liang-skin-backdrop img { + right: -18vw; + width: 92vw; + opacity: calc(var(--liang-portrait-opacity, 0.45) * 0.72); + } + + .liang-settings-row { + align-items: flex-start; + flex-direction: column; + gap: 12px; + } +} + +@media (prefers-reduced-motion: reduce) { + .liang-skin-backdrop, + .liang-skin-backdrop video, + .liang-skin-backdrop img, + body[data-liang-skin="on"] button, + body[data-liang-skin="on"] input, + body[data-liang-skin="on"] textarea { + transition: none; + } +} diff --git a/src/index.js b/src/index.js new file mode 100644 index 0000000..f20c198 --- /dev/null +++ b/src/index.js @@ -0,0 +1,146 @@ +import { createReadStream, statSync } from "node:fs"; +import { fileURLToPath } from "node:url"; +import { parseSingleRange } from "./range.js"; + +export { parseSingleRange } from "./range.js"; + +export const PACKAGE_ID = "dsh-client-liang-intensity-skin"; +export const SETTINGS_NAMESPACE = "liang-intensity-skin"; +export const ASSET_PREFIX = `/plugins/${PACKAGE_ID}/assets/`; + +const ASSET_SPECS = [ + ["liang-evolution.webm", "video/webm"], + ["liang-evolution.mp4", "video/mp4"], + ["liang-poster.png", "image/png"], + ["portrait-source-v2/stage-00.png", "image/png"], + ["portrait-source-v2/stage-06.png", "image/png"], + ["portrait-source-v2/stage-12.png", "image/png"], + ["portrait-source-v2/bridge-15.png", "image/png"], + ["portrait-source-v2/stage-18.png", "image/png"], + ["portrait-source-v2/stage-24.png", "image/png"], + ["portrait-source-v2/bridge-27.png", "image/png"], + ["portrait-source-v2/stage-30.png", "image/png"], +]; + +function send(res, status, headers = {}) { + res.writeHead(status, { + "X-Content-Type-Options": "nosniff", + ...headers, + }); + res.end(); +} + +function buildAssets() { + const assetDirectory = fileURLToPath(new URL("../assets/", import.meta.url)); + const assets = new Map(); + for (const [name, type] of ASSET_SPECS) { + const path = fileURLToPath(new URL(`../assets/${name}`, import.meta.url)); + try { + const info = statSync(path); + if (!info.isFile()) continue; + assets.set(`${ASSET_PREFIX}${name}`, { + path, + type, + size: info.size, + etag: `W/\"${info.size.toString(16)}-${Math.trunc(info.mtimeMs).toString(16)}\"`, + }); + } catch { + // A missing optional medium is handled by the browser fallback chain. + } + } + return { assetDirectory, assets }; +} + +function createAssetHandler(assets, activeStreams) { + return (req, res) => { + const method = req.method ?? "GET"; + if (method !== "GET" && method !== "HEAD") { + send(res, 405, { Allow: "GET, HEAD" }); + return; + } + + let pathname; + try { + pathname = new URL(req.url ?? "/", "http://dsh.local").pathname; + } catch { + send(res, 404); + return; + } + const asset = assets.get(pathname); + if (asset === undefined) { + send(res, 404); + return; + } + + if (req.headers["if-none-match"] === asset.etag) { + send(res, 304, { ETag: asset.etag }); + return; + } + + const ifRange = req.headers["if-range"]; + const rangeHeader = ifRange !== undefined && ifRange !== asset.etag + ? undefined + : req.headers.range; + const range = parseSingleRange(rangeHeader, asset.size); + if (range === false) { + send(res, 416, { "Content-Range": `bytes */${asset.size}` }); + return; + } + + const start = range?.start ?? 0; + const end = range?.end ?? asset.size - 1; + const status = range === null ? 200 : 206; + const headers = { + "Accept-Ranges": "bytes", + "Cache-Control": "private, max-age=3600, must-revalidate", + "Content-Length": String(end - start + 1), + "Content-Type": asset.type, + ETag: asset.etag, + ...(range === null ? {} : { "Content-Range": `bytes ${start}-${end}/${asset.size}` }), + }; + + if (method === "HEAD") { + send(res, status, headers); + return; + } + + res.writeHead(status, { + "X-Content-Type-Options": "nosniff", + ...headers, + }); + const stream = createReadStream(asset.path, { start, end }); + activeStreams.add(stream); + const release = () => activeStreams.delete(stream); + stream.once("close", release); + stream.once("end", release); + stream.once("error", () => { + release(); + if (!res.headersSent) send(res, 500); + else res.destroy(); + }); + res.once("close", () => { + if (!stream.destroyed) stream.destroy(); + }); + stream.pipe(res); + }; +} + +export const inject = ["webServer"]; + +export function apply(ctx) { + const { assets } = buildAssets(); + const activeStreams = new Set(); + ctx.effect(() => { + const handler = createAssetHandler(assets, activeStreams); + const unregister = [...assets.keys()].map((path) => ctx.webServer.register({ + kind: "exact", + path, + handler, + })); + return () => { + for (const dispose of unregister) dispose(); + for (const stream of activeStreams) stream.destroy(); + activeStreams.clear(); + }; + }, "liang-intensity-skin: static media route"); +} diff --git a/src/index.test.ts b/src/index.test.ts new file mode 100644 index 0000000..d2245c3 --- /dev/null +++ b/src/index.test.ts @@ -0,0 +1,17 @@ +import { describe, expect, it } from "vitest"; +import { parseSingleRange } from "./range.js"; + +describe("Liang media range parser", () => { + it("accepts closed, open, and suffix ranges", () => { + expect(parseSingleRange("bytes=10-19", 100)).toEqual({ start: 10, end: 19 }); + expect(parseSingleRange("bytes=90-", 100)).toEqual({ start: 90, end: 99 }); + expect(parseSingleRange("bytes=-10", 100)).toEqual({ start: 90, end: 99 }); + }); + + it("rejects malformed, multi-part, and unsatisfiable ranges", () => { + expect(parseSingleRange("bytes=0-1,4-5", 100)).toBe(false); + expect(parseSingleRange("items=0-4", 100)).toBe(false); + expect(parseSingleRange("bytes=100-", 100)).toBe(false); + expect(parseSingleRange(undefined, 100)).toBe(null); + }); +}); diff --git a/src/range.js b/src/range.js new file mode 100644 index 0000000..39ed08f --- /dev/null +++ b/src/range.js @@ -0,0 +1,22 @@ +export function parseSingleRange(value, size) { + if (value === undefined) return null; + if (!value.startsWith("bytes=") || value.includes(",")) return false; + const match = /^bytes=(\d*)-(\d*)$/.exec(value); + if (match === null || (match[1] === "" && match[2] === "")) return false; + + let start; + let end; + if (match[1] === "") { + const suffix = Number(match[2]); + if (!Number.isSafeInteger(suffix) || suffix <= 0) return false; + start = Math.max(0, size - suffix); + end = size - 1; + } else { + start = Number(match[1]); + end = match[2] === "" ? size - 1 : Number(match[2]); + if (!Number.isSafeInteger(start) || !Number.isSafeInteger(end)) return false; + if (start >= size || end < start) return false; + end = Math.min(end, size - 1); + } + return { start, end }; +}