Skip to content

dsh-jianxian-widget

Verified

dsh-jianxian-widget · v4.27.2 · MIT · Web UI

右下角的青云剑仙:白发墨金的大师兄,会御剑、会打坐、会守炉,也会催你喝水。39 个姿态(23 个常驻 + 16 帧剑舞),20 句闲聊各配姿态与音效、不连说同一句;标题栏余额四档变色(≥50 绿、20–50 黄、<20 红、低于告急阈值呼吸鲜红)。DSH 等你答话/点头时会冒泡喊你一声(同一次挂起只吵一次)。点人物走气泡序列(文本 / 余额 / 今日已用 / 峰谷档位 / 加权随机 / 并列加权),文案与逐行样式写在 .xjj-config.json 里、可手改;「数据」页给余额、今日轮数、平均每轮与最近

Install

dsh plugin add dsh-jianxian-widget

Confirm the layer applied with dsh --profile default --dump-config — see the install guide.

Source

Tags

Creators

Readme

青云剑仙(dsh-jianxian-widget)

DSH 网页界面右下角的常驻挂件:白发墨金的剑修大师兄。替你盯余额、记消耗、提醒该睡了,也会自己御剑绕屏飞一圈。 一个宿主插件(8 条路由,全在 webServer 上)+ 一个纯前端挂件;不向 agent 注册工具、不占 token。

白衣(浅色主题)/ 黑衣(深色主题)

数据页:中文 / English

English edition: README.en.md。

项 值
版本 v4.27.2
姿态 23 个常驻 + 24 帧剑舞
法宝(菜单按钮皮肤) 14 件
音效 10 路,各带开关
面板 6 个页签(272px 宽)
浮窗 气泡编辑器(420px)、关于(420px,入口在标题栏右侧)、自检
数据 ~/.dsh/(宿主端;换端口、清浏览器缓存都不丢)

一、界面

挂件

右下角一个人物,可缩放 0.70–1.60×。拖动 = 移动位置(松手 22px 内自动吸附到边角),坐标写进配置,重启都在原位;贴左时整体水平镜像(可关)。 右键人物,或 hover 后点他头顶的法宝图标,打开面板。

面板(6 个页签)

页签 内容
数据 余额、今日已用、今日轮数(含平均每轮)、最近一笔、告急阈值、立即刷新余额、近 7 天柱状图
账本 今日 / 近 7 天 / 全部;合计(¥·轮·token)、按模型占比条、逐条明细(日期时间·模型·金额)、搜索、保留期一行
声音 总开关、音量滑杆、10 路音效逐项开关
外观 14 件法宝、人物大小、气泡停留 3–30 秒、点击气泡、贴左自动镜像、回到右下角
提醒 余额告急 → 每轮消耗 → 提问提醒 → 授权提醒 → 今日预算 → 温馨提示 → 深夜劝睡 → 提示间隔 → 闲聊间隔
更多 舞一段 → 飞一圈 → 预览动作 → 提醒一句 → 可视化编辑 → 复制路径 → 产物 / 构建 → 版本号(恢复默认在编辑器头部)

两个浮窗

  • 气泡编辑器(更多 → 可视化编辑;右上角有恢复默认,只重置当前目标并二次确认):选目标(首次点击泡 / 队列项 / 变体)、行增删与 ↑↓、行内模块(文本/余额/今日/峰谷/随机/图片;每行 ≤6、每泡 ≤6 行)、行样式(字号/颜色/B/I/U)、常用行库(存/插/删)、预览、保存。
  • 自检(更多 → 自检):版本、前端产物体积、构建是否落后于模板、今日账本、当前挂起。数据来自 /xjj/about.json。

二、动作

23 个常驻姿态

# 名称 键 素材
1 静立 idle v7/idle.webp
2 作揖 greet v12/greet.webp
3 擦剑 sword v7/sword.webp
4 御剑 fly v7/fly.webp
5 看玉简 ledger v7/ledger.webp
6 摊手 shrug v7/shrug.webp
7 抬手 refuse v6/refuse2.webp
8 收剑 bye v7/sheath.webp
9 举拳 win v8/win.webp
10 冷怒 angry v8/angry.webp
11 掏钱袋 poor v8/poor.webp
12 数灵石 coins v8/coins.webp
13 守炉 forge v4b/forge.webp
14 打盹 doze v4b/doze.webp
15 打哈欠 yawn v12/yawn.webp
16 递茶 tea v7/tea.webp
17 打坐 meditate v8/meditate.webp
18 负手 back v7/back.webp
19 抬头 sky v6/sky.webp
20 缓步 walk v6/walk.webp
21 小酌 sip v11/sip.webp
22 拔剑 wipe v11/wipe.webp
23 抚颔 chin v11/chin.webp

sleep 是状态不是第 24 个动作:深夜「睡了」复用打盹那张(v4b/doze.webp),所以常驻图仍是 23 张、动作预览也是 23 项。

⚠️ sword / wipe 两个键名与画面内容相反(sword 那张是擦剑,wipe 那张才是拔剑)。显示名已按画面校正,指针也已对调(「剑来」用 wipe、「剑要常擦」用 sword)。改配置时不要按字面理解这两个键。

剑舞与御剑飞行

  • 剑舞:24 帧(dance01–dance24),更多 → 看一套剑舞。
  • 御剑飞行:两个入口 —— ① 更多 → 飞一圈;② 3 秒内连点人物 5 下。 从当前位置起飞 → 绕屏幕中心 1.35 圈 → 精确飞回原位,约 6 秒;飞行中带青色光晕、±7° 倾角、风声,按前进方向翻转朝向;点击人物或按下即落地。落地位移不改挂件真实坐标。

触发时机

触发 姿态
默认 / 悬浮 静立 / 作揖(余额低于阈值时改为掏钱袋)
我在跑任务 守炉
首次点击人物(「道友请留步」) 作揖
点击序列里翻到「剑来」 拔剑
3 秒内连点 5 下 御剑飞行(绕屏一圈)
深夜(23:30–06:00)连点 3 下 打哈欠 + 「别点了,去睡」
深夜一次劝睡 打哈欠
余额读不出来 摊手
长时间无操作 打盹(深夜钻被窝 = 打坐)

深夜连点 3 下那支只在第 3 下触发、不清零计数——继续点到第 5 下就改起飞出去。


三、提醒与音效

提醒 触发 开关键
余额告急 余额跌破阈值,每天一次 notice.lowBalance
每轮消耗 一轮结束,冒「本轮消耗」气泡 notice.turnCost
提问提醒 DSH 用 ask_user_question 等你回答 notice.askWait
授权提醒 DSH 请求你批准 notice.approveWait
今日预算 当日已用达到预算,每天一次 budget.daily(0 = 关)
温馨提示 喝水/歇眼/走动/吃饭轮转 notice.wellness + wellness.everyMin
深夜劝睡 23:30–06:00 每晚一次 notice.lateNight
闲聊 每 N 分钟一句,不连说同一句 chatter.on + chatter.everyMin

提问/授权提醒的泡泡是定版样式:标题 15px 亮青 #7BEAFF 加粗带光晕,正文 14px 金黄 #FFC247;同一件挂起只提醒一次(前端 3 秒轮询 /xjj/wait.json,按 kind:id 去重)。

音效:按压 / 松开 / 气泡 / 面板 / 法宝 / 衣料 / 御剑风声 / 晚磬 / 提示 / 结束,各带开关,共用一条音量(0–1,默认 0.5)。


四、气泡

  • 点击序列:第 1 次点 = 首次泡,之后按队列推进,到底再点收起。
  • 模块:文本 / 余额 / 今日已用 / 峰谷 / 随机语句(带权重、不连重)/ 图片。
  • 样式:行级(字号、颜色、粗体、斜体、下划线、字距、行高)。行里写 oFloor: true 才允许低于 14px(只给次要信息用,如消耗气泡第三行)。
  • 可读性底线(渲染时强制):字号 ≥ 14px;颜色亮度 < 0.82 自动提亮;半透明度 < 0.92 抬到 0.92;气泡宽度下限 296px。你存的 11px / 暗灰不会被改,显示按底线兜底。
  • 底图:style.bg(不写用内置墨底,气泡尾巴跟随底色)。换浅底要同时把字色调暗。

五、数据与接口

路由 作用
GET /xjj/state.json[?refresh=1] 余额、今日已用、峰谷、忙碌、近 7 天
GET /xjj/turn.json 最近一轮消耗(seq 递增,前端据此冒泡)
GET /xjj/usage.json?range=today|7d|all&q= 账本页数据(合计 / 按模型 / 明细 / 保留期)
GET /xjj/wait.json 提问/授权挂起
GET /xjj/config.json / POST 读 / 写配置
GET /xjj/about.json 自检
GET /xjj/ping.json 存活探针(给人手查,前端不调用)

写栅栏:POST /xjj/config.json 必须同时满足 ① 带 x-xjj-write: 1 ② Host 是回环 ③ 来源地址是回环、有 Origin 时同源。别的机器要管理:XJJ_ADMIN_HOSTS=192.168.1.16:12824。

文件($DSH_HOME,默认 ~/.dsh) 用途
.xjj-state.json 账本:今日已用/轮数/token/模型分布、逐条明细、逐日汇总、turnSeq
.xjj-config.json 气泡与外观配置
.xjj-usage-archive.json 被挤出的逐轮明细(上限 2 万条)
.xjj-post.log 配置写回诊断日志(>200KB 重开)

模型显示名:deepseek-flash → DeepSeek-V4.1-Flash、deepseek-v4-pro → DeepSeek-V4 Pro(只影响显示,API 与账本仍存 id)。\n\n计费口径:按模型真实 usage 累加;缓存写入按未命中价计;reasoning 已含在 output 内不重复计。 价目(元/百万 token,[谷价, 高峰价]):Flash 命中 0.02/0.04、未命中 1/2、输出 4/8;Pro 命中 0.15/0.30、未命中 4.5/9.0、输出 13.5/27.0。 峰谷:工作日 9–12、14–18 为高峰;周末与 PEAK_HOLIDAYS 里的法定节假日全天谷价。


六、配置

~/.dsh/.xjj-config.json,首次运行自动写入默认预设,面板调整自动写回。

{
  "version": 10,
  "style":   { "bg": "linear-gradient(180deg,rgba(20,22,25,.985),rgba(7,8,10,.985))",
               "color": "#F3E6C8", "fontSize": 13, "radius": 10, "maxWidth": 276 },
  "sound":   { "on": true, "volume": 0.5, "press": true, "release": true, "turn": true,
               "bubble": true, "panel": true, "pick": true, "alert": true,
               "cloth": true, "wind": true, "bell": true },
  "warn":    { "balanceLow": 10 },
  "budget":  { "daily": 0 },
  "chatter": { "on": true, "everyMin": 10 },
  "wellness":{ "everyMin": 30 },
  "notice":  { "lateNight": true, "lowBalance": true, "turnCost": true,
               "wellness": true, "askWait": true, "approveWait": true },
  "bubbleOn": true,
  "bubbleHoldSec": 3,
  "ui":      { "scale": 1, "anchor": "br", "dx": 6, "dy": 10, "mirror": true,
               "talisman": "seal", "x": null, "y": null },
  "texts": {
    "lowBalance": "灵石不多了({v}),省着点用。",
    "lateNight": "子时了。剑也该归鞘,你也该睡了。",
    "lateNag": "别点了,去睡。",
    "fly": "御剑去看看。",
    "turnTitle": "本轮消耗",
    "turnCost": "-{cost} · {tokens} tok",
    "busy": "炼丹中……别催。",
    "waitAsk": "东家,{session}在等你答话。",
    "waitApprove": "有件事要你点头({session})。",
    "budget": "今天已经用掉 {v},到预算 {cap} 了。"
  },
  "lineLib": [],
  "idle":  [ { "text": "剑在鞘中,也在心里。", "pose": "idle" } ],
  "first": { "lines": [ /* 行 = { style, modules } */ ] },
  "queue": [ { "id": "present", "title": "本座在此", "pose": "greet",
               "variants": [ { "weight": 2, "lines": [] } ] } ]
}

占位符:{v} {bal} {today} {todayRaw} {turns} {avg} {last} {label} {next} {window} {cd} {day} {cost} {tokens} {session} {cap}。


七、验收(三层)

cd _tools/jianxian-widget
npm test        # 文案 → 译文 → 配置 → 结构 → 审计 → 两套守卫 → 几何 → 11 个变异体,约 1 分钟
层 命令 证明什么
前置检查 npm run test:copy / test:i18n / test:config / test:surface 文案对账、译文覆盖(源码 + 构建产物)、配置合并、结构完整性;这一层不过,后面不必跑
静态审计 node audit-teeth.mjs / --selftest 守卫没失去牙齿(无恒真断言 / 日志伪断言 / 无红出口 / 零引用判据)
逻辑守卫 node test-routes.mjs(45 项)、node test-billing.mjs(28 项) 写栅栏、挂起状态机、账本、归档、计费、构建新鲜度
门齿验收 node test-teeth.mjs 11 个变异体改坏副本后,守卫必须变红且命中期望标签

前端改动生效方式:python build.py → Ctrl+F5 → 看「更多」页版本号。版本没变 = 还没拿到新包。


八、开发约定

  1. 只改源头:src/client.template.js → build.py 生成 plugin/client.js(素材以 data URI 内联)。永不手改产物。
  2. 宿主改动要重启客户端(plugin/index.js);纯前端改动刷新页面即可。
  3. 每次改动升版本号(plugin/package.json + 面板版本行);回报以版本号为准。
  4. 姿态只能走 setPose:它外面包了一层硬守卫 —— 飞行期间只放行 'fly',其它一律拦下。新增任何"到点改姿势"的定时器,必须先判 flyingRef.current,别指望调用方自觉。
  5. 测试钩子:XJJ_TEMPLATE_FILE 覆盖模板路径,仅供守卫造「模板比产物新」的场景。
  6. 素材:姿态图与音效都是本机生成后入 assets/;生成脚本属于开发工具(tools/),不随仓库发布。

九、已知限制

  • 界面语言跟随 DSH 的语言设置(中文 / English),不另设开关;译文表在 src/i18n/en.json。
  • 御剑飞行时长(6 秒)写死;连点窗口固定 3 秒(另有深夜连点 3 下催睡)。
  • 气泡样式是行级的,不是逐模块;模块换位置要靠删除后重加。
  • 编辑器不支持拖拽排序(用 ↑↓ 按钮);随机模块权重固定按 1 存,要加权改 JSON。
  • sword / wipe 键名与画面内容相反(见第二节)。
  • 浅色气泡底会让文字看不清——渲染层按深底调过色,需要手动改 style.color。
  • 余额取数优先 DEEPSEEK_API_KEY,读不到才用 DSH 账号登录态;两者账本口径不同,切来源当天数字会重新起算。

九·五、网页版(同一套前端,另一个壳)

DSH 之外也能用:python build.py --target web 会从同一个模板出 dist/xjj.user.js, 装进 Tampermonkey 即可在普通网页右下角挂这个人物。

  • 共用:23 姿态 / 16 剑舞 / 14 法宝 / 10 音效 / 气泡 / 面板 / 提醒 / 峰谷;
  • 降级:余额、今日已用、账本、每轮消耗、提问授权提醒(这些只有 DSH 宿主有数据源,网页版显示 —);
  • 配置落 localStorage(按站点隔离),src/host.web.js 负责复刻 6 个 /xjj/*.json。

细节与限制见 ../docs/userscript.md。


十、许可

代码 MIT;姿态图 / 法宝图标 / 音效不在 MIT 内,随插件原样使用可以,单独提取再分发不行。 两份许可见仓库根目录的 LICENSE 与 LICENSE-ASSETS,来源说明见 NOTICE.md。