Repository navigation
Releases
Releases · FireOpalus/dsh-laa
v0.6.0
[0.6.0] - 2026-09-15
新增
- 峰时只拦按峰谷计费的提供方:只有
peakProviders里的提供方路由(默认
['deepseek-official'],即 DeepSeek 官方)会在峰时被停下/拒绝;其它路由——自建网关、
第三方中转、别家模型——没有峰谷定价,峰时照跑,一个请求都不会被拦。路由按「会话最近
一次请求的记录头(session.requestHeader())→ agent 创建时的路由 → 部署默认路由」
三级回退解析,因此会话中途换模型也会立刻跟上;读不到路由时按「按峰谷计费」保守处理
(宁可多等,不漏拦)。(lib/laa.js) peakProviders配置:默认['deepseek-official'],可换清单、可清空(清空 =
峰时谁都不拦,谷时的重放语义仍然保留);GET /health会回报当前清单。
(lib/laa.js、lib/web.js、cordis.patch.yml)- 快照带上路由信息:
provider(当前路由 id,读不到为null)与peakBilled
(是否受峰时约束);开关的悬停提示在不受约束时多一行「峰时不会阻塞:这个提供方不按
峰谷计费()」。(lib/laa.js、lib/client.js)
内部
- 假宿主支持
provider/loggedProvider,可以造出「创建时是 A、最近一次请求走 B」
的 agent,以及没有实时 agent 时用部署默认路由的情况。 - 新增 7 个用例:deepseek-official 照旧被拦、别的提供方峰时不拦也不停、中途换模型以
记录头为准、没发过请求时用部署默认路由、读不到路由时保守拦、peakProviders的三种
取值、悬停提示里的「峰时不会阻塞」行。
v0.5.0
[0.5.0] - 2026-09-15
变更
- 关掉 LAA 时,压着的输入当刻发出去:以前
/laa off(或点开关)只是把模式关掉,
峰时攒下的输入会一直躺在状态文件里等谷时——而模式已经关了,谷时也不会再自动投递。
现在关闭动作会立刻把整棵会话树(父会话 + 所有子会话)压着的工作交给各自的实时
agent:被中断过的轮次先收到一条续跑提示词,随后是攒下的输入、按原顺序。
(lib/laa.js) - 续跑提示词分两种:谷时继续用
[LAA MODE — OFF-PEAK WINDOW OPENED],因为「人把
LAA 关了」而投递的用新的[LAA MODE — TURNED OFF]——措辞必须对得上,否则模型会
以为自己正处在谷时窗口里。 - 当时没有实时 agent 的会话不丢输入:交不出去的留在状态里,等它下一次变成实时会话
(agent/created)时立刻投递;adopt因此不再要求模式开着。 /laa off的输出改写:报告这次发出去几个会话、几条输入,以及还有几个会话在等
实时 agent(不再说「关闭后不会再自动恢复」)。setEnabled()现在返回{ entry, released },把「关掉时交出去多少」一并交给命令层。
内部
- 新增 5 个用例:关闭时当刻投递(含提示词区分)、没有实时 agent 时留待下次运行、
整棵树一起交(从子会话关也一样)、只影响自己这棵树、控制面POST /mode off的投递;
/laa off的既有用例改为断言新的输出。
v0.4.0
[0.4.0] - 2026-09-15
新增
- 峰谷切换有动静了:相位真的翻过去时,开关会跳三下;开着 LAA 的时候轨道颜色用
1.26 秒平滑地在绿 <-> 琥珀之间推过去;并弹一条浏览器通知(LAA · 进入峰时/
LAA · 进入谷时,带会话标签,同一会话的播报互相顶替)。通知权限在用户点开关时
申请(浏览器要求用户手势),拒绝授权或浏览器没有该 API 都只是没有通知;
prefers-reduced-motion下不播动画。(lib/client.js) notify配置:enabled(默认,只有开着 LAA 的会话才播报)/always/
off,随快照一起交给前端;只影响通知,切换动画不受影响。
(lib/laa.js、cordis.patch.yml)- 按宿主边界对齐的刷新:前端不再只靠 20 秒轮询——每次拿到快照就按
nextChangeAt
精确等一次(宿主在边界后约 1 秒重新评估,前端晚 2 秒去问),20 秒轮询退化为兜底,
用来追平标签页或系统休眠期间错过的切换。(lib/client.js)
内部
test/client.test.js新增有状态的假 React(createStatefulReact):setState会
重渲染,effect 由测试显式驱动,于是轮询、边界定时器与切换动画的收尾都可控;配套的
unmount()负责跑清理——不卸载的话测试进程会被一个最长 30 分钟的真实定时器拖住。- 新增 6 个用例:切换时的动画类与通知内容、
notify三种策略、没有 Notification API
时不抛错、点开关时申请权限、notify配置收敛、快照带notify。
v0.3.1
[0.3.1] - 2026-09-14
修复
- 升级前就存在的子会话也会跟随父会话:0.3.0 只在「插件亲眼见过这个子会话」时才
认得出它的父会话(实时 agent、宿主会话仓库里的实时会话,或见过一次之后落盘的
lineage),于是升级之前创建、之后一直冷着的子会话依旧显示它自己那一份开关。
控制面现在会在第一次收到请求时向宿主的会话清单(ctx.sessionQuery.listSessions(),
就是侧栏用的那一份)补一次谱系,每个进程一次;读失败只是退回原来的判断,不影响控制面。
(lib/laa.js、lib/web.js)
内部
test/runtime.test.js的withHarness()现在同时支持同步与异步测试体(异步时等
它结束再回收运行时与临时目录)。- 新增 3 个用例:从会话清单补谱系(补之前只看见自己、补之后跟随父会话、每进程只扫
一次)、清单读失败后仍可重试、控制面在冷子会话上补谱系后读与写都落在父会话。
v0.3.0
[0.3.0] - 2026-09-14
新增
- 子会话跟随父会话的 LAA 模式:DSH 的 subagent 子会话(header 里带
origin: 'subagent'与parentSession)不再各存一份开关,而是沿谱系向上取**顶层
会话(锚点)**的那一个——父会话开着子会话就开着、父会话关掉子会话立刻放行;在子会话
里点开关(或/laa on|off)改的就是父会话,整棵会话树永远只有一个开关。悬停提示与
/laa都会写明「跟随父会话」。(lib/laa.js、lib/store.js、lib/command.js、lib/client.js) - 谱系落盘:
$DSH_HOME/laa/state.json新增lineage字段(子会话 → 父会话),
事实来自会话 header 的parentSession;读得到实时 agent 或宿主会话仓库里的实时会话
时自动补齐。于是进程重启、或子会话当前没有实时 agent 时,开关与/laa依旧显示父
会话的那一份状态。 - 控制面快照新增
inheritedFrom:非 null 时说明这是子会话,以及它跟随哪个顶层会话。
变更
- 子会话的遗留工作记在子会话自己名下:峰时被拦下的输入与被中断的轮次不再记到父
会话头上,谷时回到产生它们的那个会话的 agent 上继续跑(此前会被投递给父代理,等于
把子会话的输入送进了错误的会话)。父会话的「等待谷时」计数因此只统计它自己的遗留工作。
内部
test/harness.js支持会话 header(childHeader()):假 agent 现在可以像真实 DSH
一样带origin: 'subagent'与parentSession,也可以用provide('sessions', …)
模拟宿主会话仓库。- 新增 12 个用例:锚点解析(多级、自指、成环)、显示与拦截一致、子会话里的切换落到
父会话、遗留工作归属与谷时投递目标、谱系落盘与冷子会话、控制面读写、/laa文案、
悬停提示的「跟随父会话」行。
v0.2.1
[0.2.1] - 2026-09-14
修复
- 新对话页也有 LAA 开关了:会话还没有第一条消息时,DSH 会把整条会话顶栏藏起来
(ConversationSessionHeader里的hideChrome),注册在顶栏里的开关因此根本不会
挂载——新对话页,以及正在打开的会话,都没有可点的开关。同一个开关现在也注册进
输入框工具行(conversation.input.left),并且只在顶栏确实不显示时渲染,因此
页面上任何时刻都恰好有一个开关:可以在发出第一条消息之前就把 LAA 打开。
(lib/client.js)
内部
test/client.test.js新增 4 个用例:新对话页出现在输入框工具行、顶栏可见时不重复
渲染(engaging / 已开动 / 有活跃 target / 正在跑四种状态)、拿不到 conversation 包时
退回session.blank判断、宿主没给作用域标准 Hook 时不画第二个开关。
dsh-laa 0.2.0
dsh-laa 给每一个会话加一个 LAA 模式:打开后该会话只在 DeepSeek 的谷时(空闲时段)运行。
这一版有什么
会话级 LAA 模式
- 峰时:正在跑的轮次立刻停下;任何想要进入的步骤在
agent/pre-step瀑布里被拒绝,因此一个模型请求都不会发出。被拦下的输入原样保存,不会丢。 - 谷时:被中断的轮次收到一条续跑提示词继续做;峰时暂存的输入按原顺序重新投递;被拦下的 goal round 会把自动暂停的 goal 重新武装。
- 子代理继承所属会话的模式。状态存在
$DSH_HOME/laa/state.json,跨重启存活。
两种开关入口
/laa on | off | status斜杠命令——直接作用于会话,不产生模型消息,不花 token。- 会话页顶栏的滑动开关——单击切换当前会话的模式;悬停显示当前峰谷、下一次切换、峰时窗口与待恢复条数;开启且正处峰时轨道变琥珀色,一眼看出它正被按住。
命令、开关与状态文件读的是同一份快照,因此三者永远一致。
峰谷口径
取自 DeepSeek 官方定价页注 (3):高峰时段为北京时间周一至周五 09:00-12:00、14:00-18:00,其余(含整个周末)为空闲时段——也就是周五 18:00 到周一 09:00 是连续 63 小时的谷时。
窗口写在 peakWindows 配置里,官方再调口径只改配置,不用改代码。
安装
dsh plugin --profile web add dsh-laa装完重启 dsh web / DSH Desktop,然后在任意会话里点顶栏开关或输入 /laa。
说明
- 零运行时依赖:不 import 任何
@deepseek-ai/*,只用 Node 内建能力,无构建步骤,因此不与宿主版本耦合。 - 验证:44 个单元/集成测试 + 真实 Cordis 冒烟测试 + 一个零成本的端到端验证(真实 agent loop,但不发模型请求)。
- 已知边界:冷会话不会被插件自己唤醒(它的遗留输入会留到下次变成实时会话);峰时停的是 agent 的轮次,不杀
pwsh后台进程;详见 README。
完整说明与配置: README