dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
DSH 会话头部的时间模块:现在时间、距你上次发言、提醒与倒计时。纯前端插件——数据存浏览器 localStorage,host 半不注册任何东西;到点提示是边框呼吸灯加界面浮条,不发系统通知。
DSH 会话头部的一个时间模块:现在时间 / 距你上次发消息 / 提醒 / 倒计时。
定位是会话内的短期时间提醒 —— 管"此刻这台机器上的计时",不承担"关了也不会忘"的责任。 收起时只占一小条,点开向下拉出面板;到点时模块边框呼吸发亮 + 界面浮条。
DSH 版本兼容性(0.1.3 核对于官方桌面版
0.2.0-rc.2与网页版0.2.0-rc.1)conversation.session.header.actions槽位、ctx.slotsAPI、以及「到点唤醒会话」走的sessions.binding(id).session.prompt()链,在 0.1.6 → 0.1.7 → 0.2.0 三个版本线上均未改变。 0.1.3 起package.json带engines.dsh,且 peer 不设上界 —— 任何未来的 DSH 版本都不会被这道 声明挡在门外。(反例:dsh-skill-mcp-panel曾因 peer 上界<0.2.0-0让所有 0.2.x 用户的面板整体消失。) 0.1.1 加的槽位挂载失败留痕仍然有效:ctx.slots缺失或注入抛异常会在控制台报警 —— 这两种情况下模块以前是彻底无声的,只表现为「这插件好像没装」。
纯前端插件(dsh.client.platform = web):
localStorage| 提醒 | 倒计时 | |
|---|---|---|
| 是什么 | 一天内的一个钟点(如 21:40) | 一段时长(天 / 时 / 分 / 秒) |
| 寿命 | 长期保留在列表里;响过之后回到初始状态,继续等下一个钟点 | 一次性:跑完自动从列表清理 |
| 开关 | ▶ 启动、⏸ 关闭(两个动作分开,当前生效的那个亮着) | ⏸ 暂停 / 继续、× 删除,带进度条 |
| 设定 | 时 / 分 两个滚轮 | 天 / 时 / 分 / 秒 四个滚轮 |
收起态(会话头部,紧邻「客厅」按钮)—— 上行日期,下行星期与时刻,右侧胶囊是最近一个到期的计时:

点模块向下拉出面板:

面板自上而下四段:现在时间(秒级)→ 距你上次发消息 → 提醒 → 倒计时, 最底部是「到点唤醒会话」开关(默认关)。
Esc、点面板外面、或再点一次收起+ 新建:名称 + 时间(时 / 分滚轮)→ 保存即启动
▶ 启动、⏸ 关闭、⋯ 编辑(编辑页左下角是 删除)+ 新建:名称 + 时长(天 / 时 / 分 / 秒滚轮)→ 开始
⏸ 暂停 / 继续、× 删除上次唤醒:已投递 / 跳过:会话正在跑 / …)ahfkhas 这类非时间字符↑ / ↓ / PageUp / PageDown// profile 的 package.json
"dependencies": {
"sage-reminder": "link:<你的路径>/sage-reminder" // 本地目录用 link:,发布版写版本号
},
"dsh": { "profile": { "bundles": [ ..., "sage-reminder" ] } }
然后在该 profile 目录跑 pnpm install,重启(或刷新页面)。
什么都没注册。 host 半是故意空的(lib/index.js 只有一个 apply() 打一行启动标记):
localStorage,定时也全在浏览器bundles 里"原则是把复杂度压到最小:会话头部的一个时间模块,不该为了"更稳"而拖出一条宿主侧的数据通道。
下面几条都是讨论过、明确决定先不做的方向。记在这里是因为它们各有真实代价 —— 将来真要做时照这张表决策,别凭感觉加。
| 想解决 | 要动什么 | 代价 |
|---|---|---|
| 提醒活过 DSH 重启 | 数据从 localStorage 搬到宿主侧文件 | 需要一条 host ↔ client 的数据通道。注意 localStorage 的隔离键是 scheme + host + 端口,而桌面壳每次启动都是 --port 0(OS 随机分配)→ 重启必丢,刷新页面不受影响 |
| 让智能体自己设提醒 | 宿主侧注册一个工具(agent 只能调宿主工具) | 和上一条是同一个改动 —— 一加工具,宿主就必须自己存数据,"重启不丢"会被一起带进来 |
| 页面关着也能到点提醒 | 定时也搬到宿主侧常驻 | 还要重新设计"提醒长什么样"(系统通知 / 托盘 / 等页面回来再补),并重新确认"不要系统通知"这条取舍 |
别做半迁移。 只把某一类提醒搬到宿主侧、另一类留在 localStorage,结果是两个真相源 + "为什么这条留下了那条没了"的困惑。要做就整库一起搬。
一、面板挂在模块自己的容器上,且右对齐。 不是开一个全屏 overlay,而是
「模块 + 下拉面板」包在同一个 position: relative 的容器里,面板绝对定位到它 ——
跟着模块走,不需要算坐标。用 right: 0 而不是 left: 0:模块在会话头部右侧,
往右展开会顶出窗口(实测溢出 127px)。
二、滚轮的对齐靠几何保证,不靠 margin 凑。 列高 = 可见行数 × 行高(3 × 24px),
中间那一行天然落在列的正中,而高亮条也画在列的正中 —— 两者必然重合。
(早先用 margin-top 把首行往下推,本来就偏 10px;再叠上一条被上一行孤儿声明吃掉的
.ck-picker 规则,整块滚轮就退化成了上下两坨。)
三、会话事件窗口要「订阅」而不是「读一次」。
「距你上次发消息」取自 sessions.binding(sessionId).eventSource。
实测它第一次 getSnapshot() 拿到的 entries 是空数组,要 subscribe() 等事件填进来。
用户消息的事件名是 user/message。
拿不到就整行隐藏 —— 不编假数据。
localStorage,
而 localStorage 的隔离键是 scheme + host + 端口;桌面壳每次启动都用 --port 0
(OS 随机分配端口)→ 重启之后 origin 变了,这些数据就读不到。
这是 2026-09-19 当面确认的定位:它就是"会话内的短期提醒",不承担跨重启持久化 ——
真要做,就不止是个 DSH 插件了(要 host 半存盘 + 定时 + 系统级提醒)。
刷新页面不影响。sessions 服务 + 会话事件流)。
接口若变,这一行会安静地消失,不影响其余功能。MIT