dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
DSH plugin: hot-switch the calling session to another agent preset after it has started (experimental; uses agentPresets.recompose) and keep the choice across restarts.
一个只做一件事的 DeepSeek Harness 插件:让已经聊到一半的会话热切换到另一个 Agent 预设 (比如 cordis 创造模式),不用新开会话。
实验性:recompose() 是 registry 的公开服务方法,但其自述契约是"重新绑定空白 Agent,由调用方负责空白检查"。本插件刻意跳过这个检查,依赖 DSH 0.2.1-rc.3 的实现细节;升级 DSH 后可能失效(失效会以普通工具错误返回,不会改坏会话)。介意的话先在新会话里验证。
官方 UI 只在空白会话(发出第一条消息之前)允许切换 preset。会话一旦开始, agentPresets.select() 会以 agent-preset/locked 拒绝,registry 的设计是"组合在会话创建时确定"。
但实际使用里,经常是聊到一半才发现需要另一套工具面/提示词:
cordis;cordis 里做完插件开发 → 想切回 standard 继续日常任务;minimal / ptc 控制上下文与工具暴露面。本插件用 registry 的公开服务方法 agentPresets.recompose() 重新绑定会话的组合 (它的 JSDoc 自述"由调用方负责空白检查"——本插件正是刻意跳过该检查的调用方), 再写入 agent-preset/selected 会话事件,让 registry 的 agentPreset 投影在恢复会话时重放这次选择 —— 重启 DSH 后仍然保持。
dsh plugin --profile desktop add github:Dax233/dsh-preset-hotswitch装完重启 DSH Desktop。Host-only bundle,没有额外依赖,不改任何 profile 配置。
要求 DSH 0.2.1-rc.3(提供 agentPresets 服务);DSH 升级后请按上面的实现说明重新核对 recompose / composedPreset / list 的契约。
switch_session_preset参数 · 必填 · 说明 preset · 否 · 目标 preset id。不传时只报告当前绑定与可用 id,不切换
current 与可用 presets 列表。工具组合与提示词段落从下一次请求开始生效。
ok: false 与原因,目标不存在时还会带上当前可用的 preset id 列表。
示例输出:
{"session":"session-233741f7","current":"ptc","presets":["standard","ptc","minimal","cordis"]}switched session session-233741f7: ptc -> cordis (effective on the next request)recompose() 立即重新绑定组合,并触发 tools/change;当前正在执行的请求仍用旧组合,下一次请求才用新组合(工具面、系统提示段落、skill 目录都会随之变化)。
append('agent-preset/selected', { agentPreset })。registry 的 agentPreset会话投影会重放该事件,因此会话恢复/重启后保持新预设。
agentPreset 是创建事实,不会被改写;选择记录只以事件形式追加。exec.agent),不会改默认预设,也不会批量影响其它会话。
父会话切换后,已有子会话保留旧组合,之后新建的子会话才继承新预设。
会话保持原绑定。
当前会话再次调用本工具不会重新挂载;请重启 DSH 或新开会话。
run_code,本工具需要在 run_code程序内调用(tools.switch_session_preset({ preset }));切回其它组合后恢复直接调用。
lib/index.js:apply() 里用 ctx.effect 注册一个工具;inject = ['tools','agents','agentPresets']。exec.agent → agents.currentInitiator();两条路径都要通过 agents.get(id) === agent 的存活校验,都拿不到就报错, 不会猜"最后一个 Agent"切错会话。
composedPreset 读当前值 → recompose(agent.ctx, id)→ session.append 记录。
node --test tests/hotswitch.test.mjs覆盖:只读报告、切换并记录事件、当前预设 no-op、initiator 回退、非存活 agent 拒绝、 initiator 异常、非法 preset 类型、subagent 拒绝、recompose 失败(含可用 id)、 list 失败、记录失败,以及 render 输出。
MIT