dsh-pet
PC2005-cloud/dsh-petDSH Web UI 桌面宠物,Windows / macOS / Linux 三端可用:浏览器浮层或透明置顶桌面窗口,106 个透明动画、带挤压与粒子的甩抛反弹物理、随会话事件实时联动的工作状态气泡、碎碎念与带持久记忆的对话、余额展示、表情包配图、多开同屏,并支持直接放入的自定义动画与宠物种类(pet pack)。
📦 npm:
@kidlab/dsh-kid-process· 安装:dsh plugin --profile web add @kidlab/dsh-kid-process(或npm i @kidlab/dsh-kid-process)
给小朋友讲「电脑里现在有多少小工人在干活」的插件:一个包 = 一张卡片 + 四个工具,零第三方依赖、无构建步骤,装完即用。
它是 kid-coder / kid-sysmon / kid-network / kid-storage / kid-memory / kid-security 之后的第 7 个,也是最后一个从 0.1 动态创作形态搬过来的。
把进程讲成在**工作台(内存)**上干活的小工人:
| 说法 | 对应什么 | 讲的道理 |
|---|---|---|
| 🐝 小工人 | 进程 process | 每个打开的程序都会派小工人上场 |
| 🪪 工号 | PID | 小工人的身份证号;程序一退出就作废,所以每次打开工号常常不一样 |
| 👨🏫 师傅工号 | PPID | 谁把它带来上场的介绍人;一路往上问,最后都是总管 launchd(工号 1) |
| 💪 正在卖力干活 | 状态 R | 正占着 CPU 在算 |
| 😴 在打盹等活儿 | 状态 S | 大多数工人其实都在等活儿 |
| 🧟 僵尸工人 | 状态 Z | 活干完了、工牌还没被收走(也不占算力,收走就好) |
ps)。proc_count / proc_busiest / proc_family / proc_badge,模型可以直接喊出来查。
这四个的文本、命令、判定与 0.1 版逐字一致(node verify-legacy-equivalence.mjs 逐条核对),只有注册方式变了。卡片长这样(折叠 / 展开,数字是本机实测的示意):
┌──────────────────────────────────────────────────────────────┐
│ 🐝 工人点名 511 个工人在册 · 21 个在卖力 🙂 有几个僵尸 ▾ │
└──────────────────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────────────┐
│ 🐝 工人点名 511 个工人在册 · 21 个在卖力 🙂 有几个僵尸 ▴ │
│ 点名板 │
│ 21 487 3 │
│ 在卖力干活 在打盹等活儿 赖着不走的僵尸 │
│ ▓▓▓▓ 21 在卖力 ▓▓▓▓▓▓▓▓▓▓▓▓ 487 在打盹 ▓ 3 僵尸 │
│ 最卖力榜 │
│ Google Chrome ×12 ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ 51.5% │
│ node ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ 41.9% │
│ 家族 │
│ 总管 launchd(工号 1)带了 435 个直接徒弟 │
│ 🧟 赖着不走的小工人(活干完了,工牌还没被收走)3 个 │
│ 🐝 进程 = 在这台电脑上干活的小工人 | 每 15 秒点一次名 | 22:31 │
└──────────────────────────────────────────────────────────────┘
等级看的是车间秩序(僵尸越多越该收工牌):
| 等级 | 什么时候 | 卡片上的话 |
|---|---|---|
| 😄 车间整洁 | 有工人在干活,且零僵尸 | 一切都好 |
| 🙂 有几个僵尸 | 1–4 个僵尸 | 顺手收一下工牌就好 |
| 😅 僵尸有点多 | ≥ 5 个僵尸 | 建议重启一下那个程序 |
| 😴 都歇了 | 一个卖力的都没有 | 电脑在闲着 |
| ❓ 看不清 | 一条命令都没读到(权限问题等) | 不赖小朋友,也不误判成「安全/干净」 |
# 推荐:GUI「插件管理」页的安装框里直接粘贴包目录路径
/Users/baixiao/Code/deepseek-harness-dev/plugin-kid-process
# 或者在 DSH 会话里让模型执行(等价的同一件事)
plugin_manager install_bundle /Users/baixiao/Code/deepseek-harness-dev/plugin-kid-process
index.js / tools.js / collect.js):装完返回 applied 就立即生效,不用重启。client.js):装完先刷新页面看 🐝 在不在——安装一般会顺带把模块表增量重算并推下去,刷新就够;
万一刷新后还是没有,再重启 dsh web(重启后刷新即可,不用重装)。
setsid / nohup 也甩不掉),
新起的 dsh web 会以 EPERM: operation not permitted, open '~/.dsh/profiles/web/cordis.yml' 直接退出,
结果旧服务已停、新服务没起来(经过见迁移指南 14.9「新量到 3」)。client.js 的话不用重启,刷新页面即可;改 index.js 才需要重启。在用户层(~/.dsh/cordis.patch.yml)按 id 覆盖这一行——不要再写一行 insert(同 id 的 insert 行不能共存):
- id: kid-process
config:
enabled: true # false = 只关掉四个模型工具,卡片照旧
timeoutMs: 8000 # 单条命令超时,1000–30000
| 字段 | 默认 | 说明 |
|---|---|---|
enabled | true | false 时不注册四个工具;卡片由它自己的会话门禁控制,不受这里影响 |
timeoutMs | 8000 | 单条只读命令的超时(1000–30000,越界会被夹到边界值) |
timeoutMs 不合法(非数字)时回落到默认 8000。
0.1 版只有工具,没有卡片;这一版把卡片补上,并且把装载方式从「workspace 注册 + 根 tsc 编译 + ~/.dsh/profiles/node_modules 软链 + 用户层 patch 的 insert 行」
换成 web profile 里的静态 bundle(一个 install_bundle 就位):
| 差异 | 旧版 | 现在 | 为什么 |
|---|---|---|---|
| 装载 | src/*.ts → 根 tsc → lib/*.js → profiles/node_modules 软链 → patch insert | 一个 bundle 包(host 半部 + client 半部) | 0.1 的 cordis_define / cordis_run 动态工具在 0.2 已经没有了 |
| 工具定义 | defineTool({ … }) | 普通对象 + ctx.tools.register() | bundle 走 link: 安装,解析不到 @deepseek-ai/dsh-tools |
| 参数形状 | defineTool({ parameters: {…} }) 投影而来 | 写死 NO_PARAMS / OPT_PID / NEED_PID | 在 Tool.listTools 里投影逐字节相同,模型看到的契约没变 |
| 配置校验 | Schema + 默认值 | index.js 里的 timeoutMsOf() 兜同样的默认/边界 | 不 import schemastery |
| 注册时机 | 顶层 inject | apply() 里 ctx.inject('tools', …) | 没有 tools 服务的 profile(只要卡片)也能装 |
| 卡片 | 无 | 同包的 ./client 导出 + /kid-process/collect 路由 | 一个包干两件事 |
tools.js 刻意不和 collect.js 共用一个取数层:tools.js 要保持「一个字没动」,而卡片的命令重新挑过(每条多带一个 pid,这样卡片上的名字能对上工具里的工号)。
client.js 顶部有一行白名单(当前为空 = 每个会话都显示):
const ONLY_SESSIONS = []
echo $DSH_SESSION_ID 可以拿到当前会话 id。const ONLY_SESSIONS = [](空数组 = 不限会话)。白名单外的会话直接渲染 null:卡片不出现,轮询也不会启动(不白花算力)。
node verify.mjs # 端到端自检(112 项):解析 / 真机采集 / 路由 / 卡片装载 / 渲染 / 四个工具
node verify-legacy-equivalence.mjs # 与旧版 legacy/src/tools.ts 的文本级等价对照
两个都 EXIT=0 才算好。verify.mjs 不依赖浏览器,也不依赖本机此刻的进程表(点名、榜单、家族、等级都用注入的假文本测)。
⚠️ 一个环境坑:本 checkout 的 bash 沙箱会拦 /bin/ps(Operation not permitted),
所以 verify.mjs 会先探一次 ps 能不能用,不能用时把真机断言自动降级成「形状 + 降级文案」核对
(插件在 dsh 进程里跑,不受这个沙箱限制)。同理,本 checkout 里 tsc 跑这些插件会 segfault(exit 139,环境问题),所以用 node --check + 上面两个脚本。
private: true 是为了本机 link: 安装。真要发 npm:去掉 private、npm version 提版本、npm publish --access public。
legacy/ 已经在 files 白名单之外,不会被发出去。
| 文件 | 作用 |
|---|---|
package.json | 包定义:main + exports['.'](host)、exports['./client'](卡片)、dsh.bundle.patch + dsh.client |
index.js | host 半部入口:注册 /kid-process/collect 路由 + 子注入 tools 注册四个工具;配置归一化 |
tools.js | 四个模型工具的普通对象定义(不 import 任何第三方包,文本与旧版逐字一致) |
collect.js | 卡片取数:三条只读 ps 命令 + 纯函数解析(assemble() 离线可测)+ 5 秒缓存 |
client.js | 卡片半部:模块表注册 + 槽位注入 + 15 秒轮询 + 样式(IIFE 包住,避免顶层标识符撞车) |
cordis.patch.yml | bundle 的 patch:一行 insert 装 kid-process(卡片 + 四个工具) |
verify.mjs | 本地端到端自检(112 项) |
verify-legacy-equivalence.mjs | 与旧版 TS 源码的文本级等价对照 |
legacy/ | 旧版(src/ lib/ example/ package.json tsconfig.json 等)原样存档,只作对照,不发布不加载 |