🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

上下文扳道岔 mrzturn/dsh-switchman

DeepSeek 客户端v1.8.1
mrzturn8 天前有提交已提供中文文档扫描:含敏感能力兼容 / 相关生态

switchman 家族,同一作者、同一套调度理念:opencode-switchmanOpenCode 原版·…

33.5/100
综合分
5
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/27 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/mrzturn/dsh-switchman.git

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
生态应用
桌面端 / Web 外壳,不以 dsh plugin add 安装
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 8 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装

engines.node 要求 >=24,不满足 Node 22.19.0

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包dsh-switchman @ 1.8.1
✗Node 引擎要求 >=24 · 基线 Node 22.19 不满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/29 08:44:00

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件发起外部网络请求
查看扫描证据(共 37 处,展示前 37 条)
  • 读取本地文件
    index.js:153
    const parsed = parseSkillFile(readFileSync(path, "utf8"), path);
  • 读取本地文件
    index.js:171
    entries = readdirSync(root, { withFileTypes: true });
  • 读取本地文件
    index.js:201
    return { ...summary, content: parseSkillFile(readFileSync(locator, "utf8"), locator).content };
  • 发起网络请求
    client.js:146
    const response = await fetch(`${API_BASE}${resource}`, {
  • 读取本地文件
    host/lang.js:98
    raw = readFileSync(join(cwd, PROJECT_DIR, PROJECT_FILE), "utf8");
  • 写入本地文件
    host/lang.js:122
    mkdirSync(directory, { recursive: true });
  • 写入本地文件
    host/lang.js:123
    writeFileSync(
  • 写入本地文件
    host/context-watch.js:526
    mkdirSync(dirname(path), { recursive: true });
  • 写入本地文件
    host/context-watch.js:527
    writeFileSync(
  • 写入本地文件
    host/context-watch.js:577
    appendFileSync(
  • 写入本地文件
    host/context-watch.js:821
    appendFileSync(
  • 写入本地文件
    host/context-trim/index.js:220
    mkdirSync(dir, { recursive: true });
  • 写入本地文件
    host/context-trim/index.js:222
    if ((statSync(logPath, { throwIfNoEntry: false })?.size ?? 0) > 2_000_000) renameSync(logPath, `${logPath}.1`);
  • 读取本地文件
    host/context-trim/index.js:222
    if ((statSync(logPath, { throwIfNoEntry: false })?.size ?? 0) > 2_000_000) renameSync(logPath, `${logPath}.1`);
  • 写入本地文件
    host/context-trim/index.js:223
    appendFileSync(logPath, `${new Date().toISOString()} ${entry}\n`);
  • 读取本地文件
    host/context-trim/index.js:240
    const mtime = statSync(join(store.stateDir, "fork-links.json"), { throwIfNoEntry: false })?.mtimeMs ?? -1;
  • 读取本地文件
    host/vision.js:96
    access(path, constants.F_OK)
  • 删除本地文件
    host/vision.js:117
    const drop = (path) => rm(path, { force: true }).catch(() => {});
  • 写入本地文件
    host/vision.js:143
    await mkdir(dir, { recursive: true });
  • 写入本地文件
    host/vision.js:144
    await copyFile(src, dst);
  • 写入本地文件
    host/vision.js:162
    await mkdir(dir, { recursive: true });
  • 写入本地文件
    host/vision.js:187
    await copyFile(src, raw);
  • 发起网络请求
    host/intent.js:606
    const response = await fetch(endpoint, {
  • 读取本地文件
    host/lib/rank.js:167
    const raw = readFileSync(new URL("../data/capability-default.json", import.meta.url), "utf8");
  • 读取本地文件
    host/subagents.js:60
    const parsed = JSON.parse(readFileSync(path, "utf8"));
  • 读取本地文件
    host/context-trim/fork.js:82
    if (!existsSync(file)) return { version: FORK_LINKS_VERSION, links: {} };
  • 读取本地文件
    host/context-trim/fork.js:83
    const parsed = JSON.parse(readFileSync(file, "utf8"));
  • 写入本地文件
    host/context-trim/fork.js:119
    mkdirSync(dir, { recursive: true });
  • 写入本地文件
    host/context-trim/fork.js:122
    writeFileSync(tmp, JSON.stringify({ version: FORK_LINKS_VERSION, links }));
  • 写入本地文件
    host/context-trim/fork.js:123
    renameSync(tmp, file);
  • 读取本地文件
    host/context-trim/state.js:100
    if (existsSync(file)) {
  • 读取本地文件
    host/context-trim/state.js:101
    const parsed = JSON.parse(readFileSync(file, "utf8"));
  • 写入本地文件
    host/context-trim/state.js:118
    renameSync(file, `${file}.corrupt`);
  • 写入本地文件
    host/context-trim/state.js:128
    renameSync(file, `${file}.corrupt`);
  • 写入本地文件
    host/context-trim/state.js:140
    mkdirSync(stateDir, { recursive: true });
  • 写入本地文件
    host/context-trim/state.js:143
    writeFileSync(tmp, JSON.stringify(ledger));
  • 写入本地文件
    host/context-trim/state.js:144
    renameSync(tmp, file);
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

README

由 DeepSeek 最新模型翻译生成
dsh-switchman switchman 家族,同一作者、同一套调度理念:opencode-switchman(OpenCode 原版)· zcode-switchman(ZCode 移植)· dsh-switchman(本仓库,DeepSeek Harness 版)。 dsh-switchman — 上下文水位驱动扳道岔,把任务丢进对的车道 上下文装上水表,任务自己找车道。 为什么需要它 用 DSH 干活久了有两件烦心事:一是会话越聊越重,上下文被历史撑到几十万 token,模型开始忘事、变慢、变贵,手动 /compact 又丢细节;二是主力模型什么都自己干,查个文件、跑个测试、对个数据都是它在啃,大半活其实该交给便宜模型。 dsh-switchman 是一个 DeepSeek Harness(DSH)插件。装上之后,主模型从「亲自干活」变成调度员:量水位、选车道、派任务、盯验收。它不是新模型,是一套挂在 DSH 上的调度规程加一个配置界面,一共做八件事: 1. 上下文水位:长会话不撑爆。 每轮实时统计会话 token,三条水位线逐级加码:80k(soft,可调)提醒「该委派了」;120k(hard)收紧单次读取预算、引导收尾;150k(force)自动交接——fork 一份会话留底、压缩上下文、唤醒续跑,任务不断线。
展开完整文档(README 剩余 1 节)
dsh-switchman

switchman 家族,同一作者、同一套调度理念:opencode-switchman(OpenCode 原版)· zcode-switchman(ZCode 移植)· dsh-switchman(本仓库,DeepSeek Harness 版)。

dsh-switchman — 上下文水位驱动扳道岔,把任务丢进对的车道

上下文装上水表,任务自己找车道。

为什么需要它

用 DSH 干活久了有两件烦心事:一是会话越聊越重,上下文被历史撑到几十万 token,模型开始忘事、变慢、变贵,手动 /compact 又丢细节;二是主力模型什么都自己干,查个文件、跑个测试、对个数据都是它在啃,大半活其实该交给便宜模型。

dsh-switchman 是一个 DeepSeek Harness(DSH)插件。装上之后,主模型从「亲自干活」变成调度员:量水位、选车道、派任务、盯验收。它不是新模型,是一套挂在 DSH 上的调度规程加一个配置界面,一共做八件事:

1. 上下文水位:长会话不撑爆。 每轮实时统计会话 token,三条水位线逐级加码:80k(soft,可调)提醒「该委派了」;120k(hard)收紧单次读取预算、引导收尾;150k(force)自动交接——fork 一份会话留底、压缩上下文、唤醒续跑,任务不断线。交接那一刻还在跑的后台子智能体也不会丢:id、任务、报告路径都写进交接文档,续跑的会话知道去哪收报告,不会重复派活。每个子智能体自带独立硬顶,到顶写完 HANDOFF 摘要退场。自动干预不合手时可临时接管:/ctx-pause 停掉全部水位动作(测量照跑、尾部水位行转成 paused,只是不动手),/ctx-resume 随时恢复——重启 DSH 后干预也会自动回来,是临时放手,不是永久关闭;/ctx-handover 不等水位到顶,主动发起同一次交接:fork 备份、压缩上下文、唤醒续跑(会话先被引导到空闲边界,结果可能要等几分钟)。

2. 六个派发池:什么活配什么模型。 轻量池(批量小活)、机械池(模板化改写)、主力池(日常编码)、高难池(高难推理与大规模重构)、多模态池(看图)、复审池(独立验证)。设置页里勾候选、排优先级、标 S/A/B/C 档,还能给每条路线单独钉思考强度——档位下拉来自该模型真实支持的级别,不是通用三档。主模型每轮提示词里都带着一张 [SWITCHMAN:POOLS] 推荐表,照表派活。执行模式三态:关闭 / 建议 / 强制(强制 = 池外模型直接拒绝)。

3. Agent Teams 模式:从单干到带团队。 默认关闭,装完就是轻量的 subagent 派发。设置页两个独立开关:

- 智能体团队模式——打开后注入团队规程(默认委派 + 分级验证 + 共享任务板纪律),并自动启用 DSH 的 Agent Teams:主模型可以拉常驻队友(spawn_teammate)、往共享任务板派活(team_task_)、和队友互发消息。什么时候建团队有明确纪律:可并行的独立子任务、量大且自包含、主上下文水位已高、需要角色分离;一次性的单点调查仍走 subagent。再关掉开关,团队条款零残留,也不会撤走正在运行的会话里的团队工具。
- 同步子智能体模型白名单——DSH 有张「允许 Agent 为子智能体选择模型」的授权白名单:池里选了但没授权的路线,点名派发会被拒(团队模式下会标 ⚠)。打开这个开关,六个池的并集整体写入那张白名单——switchman 做唯一事实源,不用两边重复配置。白名单按「新建会话」快照生效,同步只对之后新开的会话起作用。

会话头部有直观反馈:⚡「自主团队」徽标、◇ 当前会话实际模型;自动交接进行时出现「交接进行中 · 备份会话 / 压缩上下文 / 唤醒续接」的实时提示。

4. 语言偏好:问一次,记一辈子。 回复、代码注释、文档三种语言各一个下拉,作用域可选全局或按项目(.switchman/lang.json)。不设也行——首次用到时用你 DSH 界面的语言问一次,记住后每个会话自动遵守。

5. 界面语言:插件自己也说你的话。 设置页顶部的「界面」区里一个「界面语言」下拉(设置键 uiLocale):自动(默认,跟随 DeepSeek Harness 应用语言),或手动选任一内置界面语言——选项一律显示语言原名、不作翻译。它只切换本插件自己的界面(徽标、首页面板、设置页),不动 DSH 应用语言:选中即实时预览、无需重启,保存后记住、下次启动自动恢复,任何失败都回退到应用语言;词典全部内联在插件包里,无需下载。

6. 分级验证:改完必查。 超过 20 行的改动交 tester 验证;超过 300 行、或动了核心 / 安全 / 数据一致性逻辑,再交一个 reviewer 独立复审。复审模型锚定「写出这份 diff 的智能体」所用的模型来选,尽量避开;池里实在避不开时,会在结论里声明 DOWNGRADED。你说一句「不要用团队」,它立刻退回单干。

7. /vision:纯文本模型也能处理图。 主力模型读不了图时,DSH 会在入口直接拒掉带图消息。贴上图、输入 /vision 这张图错在哪,图片会被交给多模态池的模型去读,结论回到当前会话。输入框上方会提前提示「当前模型不支持读图」;直接发图被拒时,自动改写成 /vision 重发一次,不用手动重来;多模态池没配时命令会拒绝并给出配置指引。

8. 意图识别自动选模型:消息进来,模型自动落位。 设置页新增【意图识别】分组:主开关(默认关闭,开启需配置分类器并至少一个候选)、分类器小模型路由(provider + model + 可选 effort,TypeSafe Jev 类决策模型与通用对话模型都支持,输出宽容解析)、分类器类型三选(auto / decision / chat)、独立候选模型列表(每个候选 provider + model + 可选 effort + 一句能力描述)、缓存窗口秒数(默认 300,对齐厂商 prompt cache 约 5 分钟)、切换置信度阈值(默认 80)、分类超时(默认 60000ms)、历史消息条数(默认 6)与字符预算(默认 2400)、可选兜底模型。模型选择器出现「Auto · Switchman」分组下的「Auto」入口(客户端渲染为本地化的「自动(意图识别)」);选中后每条用户消息先由分类器判定最合适的候选,同一轮锁定决策:置信度不足或仍在缓存窗口内时优先沿用当前模型(缓存续用),置信度足够高或当前模型不在候选里才切换;切换在调用层静默完成,不往会话里插「模型已切换」。输入框上方有状态 chip(自动路由时显示当前路由模型与上次决策置信度),候选与阈值随时回设置页查看。

只有一个模型也值得装——水位控制和分级验证与模型数量无关,单模型长会话同样受益。

捆绑技能

- db-query——MySQL / Redis 只读核验:跑 SQL 对数、查缓存键 / TTL、跨库一致性检查,拒绝一切写入。首次使用需初始化(见下)。
- git-commit-message——生成规范的 commit 文案,只出文本,从不替你 git。
- requirement-docs——需求分析 / PRD / 设计文档的统一规范,产出归档到 docs/requirements-and-design/。

快速上手

1. 安装——任意会话里让 agent 执行,或在 Web 插件管理页:

plugin_manager: install_bundle target=dsh-switchman

或从本地检出安装(link 方式;更新后需 remove_bundle + install_bundle 重装):

plugin_manager: install_bundle target=/path/to/dsh-switchman

或在终端用 dsh 命令——按运行方式选对应的 profile:

dsh plugin --profile web add dsh-switchman # Web GUI
dsh plugin --profile desktop add dsh-switchman # 桌面应用

2. 重启 DSH——完全退出应用再打开(刷新页面不算),客户端模块表才能识别本 bundle。

3. 配置——设置 → dsh-switchman,或首页侧边栏的「Switchman 调度中心」。配置就一页,长这样,从上往下过一遍就配完了:

dsh-switchman 配置页全貌:界面语言、语言偏好、六个派发池、能力排序与执行模式、团队开关、上下文水位与命令

- 界面——插件自己的界面语言。图中「自动」即跟随 DSH 应用语言;选具体语言则当场整页切换,保存后记住,随时切回「自动」。
- 语言——智能体产出物的语言。作用域图中为「全局(本 profile)」(也可按项目,各自读 .switchman/lang.json);回复 / 代码注释 / 文档三个下拉图中都定在简体中文,每项下方有「当前:…」状态行。全不设也行,首次用到问一次、记住即用。
- 派发池——六张卡片两行三列:上排轻量、机械、主力,下排高难、多模态、复审。卡片按供应商分组勾候选模型;勾上「手动序」变成编号优先列表,用 ↑ ↓ × 调顺序;每条路线可钉思考强度(默认「跟随泳道」)。顶部汇总行实时更新,图中即「已配置 4/6 池 · 排名 2 项 · 模式 建议」。
- 能力排序 + 执行模式——六池选中模型的并集按能力排序、最强在前(图中 glm-5.3 锚 S 档、glm-5.3-flash 锚 A 档),可调序、可删减;执行模式建议 / 强制(强制 = 池外模型直接拒绝)。
- 智能体团队——团队模式与白名单同步两个开关,默认全关;图中为开启状态,开关下方有同步状态行。
- 上下文水位——三档阈值(图中 80000 / 120000 / 150000)、单次读取预算(3000)、硬档行为(限流放行 / 拦截)、自动交接开关、子智能体独立上限,都在这区。底部一行命令:/ctx-pause 暂停干预 · /ctx-resume 恢复 · /ctx-handover 立即备份交接(它会把会话引导到空闲边界再压缩,结果可能要等几分钟)。
- 意图识别——主开关、分类器小模型路由、分类器类型(auto / decision / chat)、独立候选列表(每项附一句能力描述)、缓存窗口 / 置信度阈值 / 分类超时 / 历史消息预算、可选兜底模型。开启后模型选择器出现「自动(意图识别)」入口,输入框上方显示当前路由模型与置信度 chip。

4. 验证——会话头部出现 ⚡「自主团队」徽标(旁边 ◇ 显示当前会话模型);或者直接问模型「你系统提示词最后一段标题是什么」,答案应提到 dsh-switchman 规程。

db-query 首次使用初始化(脚本依赖装在技能目录内,不污染项目):

bash <安装目录>/skills/db-query/scripts/setup.sh

分类器选型建议:若要本地部署决策模型,推荐用 Ollama 运行 tev1:4b-mxfp8:分类器类型选「决策端点(systemone)」,端点填 http://127.0.0.1:11434/v1/systemone,模型名填 tev1:4b-mxfp8。若走 LLM 目录的 chat 分类器,推荐云端小模型,或不带思考(推理)能力的本地小模型——关闭思考可同时压低延迟与分类超时失败率。

默认配置

以下为新安装后的全部默认值(权威来源:host/config.js 的 zod schema)。

界面与语言:uiLocale = auto(跟随 DSH 应用语言);langScope = global;langConversation/Comments/Docs = 空(首次对话问一次后记住;注释与文档语言跟随对话语言)。

派发池:六条泳道(economy/mechanical/main/hard/vision/review)候选均为空(= 用系统默认模型,不干预);手动排序与 effort 钉选均为关/空;dispatchEnforce = advice(建议不强制)。

上下文水位:soft 80000 / hard 120000 / force 150000 tokens;单次读取预算 3000;超预算行为 cap(截断加警告);wmAutoHandover = 开(force 档自动备份+压缩交接);子会话硬顶 = 开(共享 150k)。

Agent Teams:teamsMode = 关;syncWhitelist = 关(两者相互独立)。

意图识别(默认不可用,需配置分类器 + 至少一个候选 + 打开主开关):intentEnabled = 关(关闭时 Auto 入口隐藏,已选 Auto 的会话走兜底链);分类器路由未设置;分类器类型 chat;候选列表空(预置分类需填模型才参与路由);缓存窗口 300 秒 / 切换置信度 80 / 分类超时 60000 ms;历史 6 条 / 2400 字符;intentContextWindow = 200000。

开箱要点:① 意图识别开箱不可用是有意设计,三步开启(分类器、候选、开关);② Auto 有效窗口开箱即为 200000——护栏保证 0.8×窗口 ≥ force 档(150000),核心压缩线(160000)永远在平滑交接线(150000)之后;③ 开箱最有感的是水位三件套:80k 提醒委派 / 120k 收敛读取 / 150k 自动备份交接,无需任何设置。

工作原理

- Host 半(index.js + host/)注入字节恒定的系统提示词段(语言 / 泳道 / 水位协议 / 团队),实时水位行改走尾部 runtime-context 快照通道(只追加、不改写提示词头部,供应商提示词缓存不受影响)、读预算与 enforce 双闸、四个斜杠命令(ctx 三件套 + /vision)。设置保存后下一轮提示词装配即生效,无需重启。
- Client 半(client.js)渲染设置页、会话头部的 ⚡ 徽标与 ◇ 模型标识、交接进行中的动态提示;配置快照经 Host 路由家族读写。
- 首页侧边栏的「Switchman 调度中心」入口,单击即以中央面板打开同一配置页;原设置入口保留。
- cordis.patch.yml 完整保留出厂预设的插件列表,只在 persona suffix 上做扩展;Agent Teams 工具本体来自出厂 bundle,开启团队模式时自动启用。

维护注意

- DSH 升级后若出厂预设插件列表有变,从新的 presets/.patch.yml 重新同步 cordis.patch.yml(保留 doctrine suffix),然后重装。
- 协议行([SWITCHMAN:LANG|POOLS|WATERMARK|TEAMS])刻意保持英文且字节稳定——不要本地化。
- npm pack --dry-run 应保持审计过的 50 文件 / ~205 kB 形态(docs/ 截图不进包)。
- 零运行时依赖——硬性不变量。 宿主侧包(@deepseek-ai/schemastery、cordis 等)只允许声明为 peerDependencies,由运行中的 DSH 用它自己的副本满足。普通 dependencies 会被物理安装进 profile 工作区(<profile>/node_modules/…),从而对同处 profile 的其他插件遮蔽宿主副本——1.7.0 把 schemastery 声明为普通依赖时,正是这个机制让 dshmarket 插件市场崩溃(一个进程里出现两份 schemastery,市场产生的 schema 与宿主不再同类)。scripts/validate.mjs 会在 dependencies 再次出现时直接失败;因此安装、升级、卸载 dsh-switchman 都不会再影响 dshmarket 或任何其他社区包在运行时解析到的模块。

License

MIT
预览分享卡片长什么样 ↓mrzturn/dsh-switchman
分享 · DeepSeek Harness Hub
mrzturn/dsh-switchman

switchman 家族,同一作者、同一套调度理念:opencode-switchmanOpenCode 原版·…

这是你的仓库?认领条目

回到顶部