把冗长思维链实时转成第一人称短笔记,方便随时查看
33.6/100
综合分
5
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/31 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/mmyddd/dsh-ccd.git状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
是什么
生态应用
桌面端 / Web 外壳,不以 dsh plugin add 安装
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 3 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 45 处,展示前 31 条)
- 写入本地文件index.js:1424
mkdirSync(dirname(notesPath()), { recursive: true }) - 发起网络请求client.js:326
configTask ??= fetch(CONFIG_ROUTE, { headers: { accept: 'application/json' } }) - 发起网络请求client.js:368
void fetch(LOCALE_ROUTE, { - 发起网络请求client.js:393
return fetch(`${WARM_ROUTE}?sessionId=${encodeURIComponent(sessionId)}`, { - 发起网络请求client.js:409
return fetch(WARM_ROUTE, { - 发起网络请求client.js:971
return fetch(LOCAL_ROUTE, { headers: { accept: 'application/json' } }) - 发起网络请求client.js:984
return fetch(LOCAL_ROUTE, { - 发起网络请求local.js:212
const response = await fetch(new URL(assetUrl, origin), { - 读取本地文件local.js:233
info = await stat(path) - 读取本地文件local.js:244
const stream = createReadStream(path) - 写入本地文件local.js:268
await mkdir(dirname(destination), { recursive: true }) - 发起网络请求local.js:272
const response = await fetch(url, { redirect: 'follow', signal }) - 写入本地文件local.js:278
const sink = createWriteStream(partial, { flags: 'wx', mode: 0o600 }) - 写入本地文件local.js:297
await rename(partial, destination) - 删除本地文件local.js:302
await rm(partial, { force: true }) - 写入本地文件local.js:314
await mkdir(destination, { recursive: true }) - 写入本地文件local.js:339
const sink = createWriteStream(join(destination, base), { mode: 0o700 }) - 写入本地文件local.js:364
await mkdir(destination, { recursive: true }) - 删除本地文件local.js:410
await rm(target, { force: true }) - 读取本地文件local.js:495
const info = await stat(join(layout.runtimeDir, runtime.exe)) - 读取本地文件local.js:501
const info = await stat(layout.model) - 读取本地文件local.js:547
const names = await readdir(join(dataRoot, 'models')).catch(() => []) - 读取本地文件local.js:562
const haveRuntime = await stat(join(layout.runtimeDir, runtime.exe)).then((info) => info.isFile() && info.size > 0).catch(() => false) - 删除本地文件local.js:573
await rm(archivePath, { force: true }) - 删除本地文件local.js:649
await rmdir(layout.modelsDir).catch(() => {}) - 删除本地文件local.js:666
await rm(path, options) - 执行外部命令固定命令local.js:704
execFile('tasklist', ['/FI', `PID eq ${pid}`, '/FO', 'CSV', '/NH'], { windowsHide: true }, (error, stdout) => { - 执行外部命令来自配置/变量local.js:857
const child = spawn(exe, args, { - 删除本地文件local.js:896
void rm(layout.pidFile, { force: true }).catch(() => {}) - 发起网络请求local.js:925
const response = await fetch(`${origin}/health`, { signal }) - 发起网络请求local.js:950
const response = await fetch(`${origin}/v1/chat/completions`, {
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/schemastery给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
DSH 插件:把原始思维链换成第一人称短笔记给用户看,模型下一轮读到的仍是完整推理
README
由 DeepSeek 最新模型翻译生成dsh-ccd — 思考笔记
思维链还是转一下好,看着不烧心。
字数能省就省,但你交代的事一句不丢。
宁可笔记慢一点,也不让几千字糊你一脸。
规矩先说清楚:哪些要转,转到什么程度。
怕你等,但更怕你烦。
顺手就行,别折腾眼睛。
觉得模型的思考太啰嗦?想在它想歪的那一刻就喊停?
推理模型想事的时候,你要么被几千字滚动的原文推着往下看,要么只看到折叠行里孤零零的第一句。等它想完、答案落地,你才发现方向早偏了。这时候能做的只剩重发一遍,把话说得更死,再赌一次。
dsh-ccd 把那段思考边流边转述成第一人称的一两句话:「我在核对这份清单里的哈希跟实际的 DLL 名字对不对得上」「这个前提不成立,我换个路子」。它还在想的时候你就知道它在干什么。发现跑偏,可以当场打断,也可以在一轮进行中直接补一句把它拽回来,不必等几千字之后才后悔。
插件不替你按停止键,它做的是让你早几秒知道该按。
模型那边一个字都没被改写:会话里存的仍是完整推理,下一轮它读到的也是完整推理。被缩短的只有你眼前这一层,点「查看原文」随时切回去。
这是 ccd 的 DSH 形态。ccd 那套「换回原文」的机制存在的唯一理由是客户端拿不到原文;DSH 的原文本来就在会话里,所以这里只需要换掉渲染层。
效果展示
同一段思考。
展开完整文档(README 剩余 1 节)
dsh-ccd — 思考笔记
思维链还是转一下好,看着不烧心。
字数能省就省,但你交代的事一句不丢。
宁可笔记慢一点,也不让几千字糊你一脸。
规矩先说清楚:哪些要转,转到什么程度。
怕你等,但更怕你烦。
顺手就行,别折腾眼睛。
觉得模型的思考太啰嗦?想在它想歪的那一刻就喊停?
推理模型想事的时候,你要么被几千字滚动的原文推着往下看,要么只看到折叠行里孤零零的第一句。等它想完、答案落地,你才发现方向早偏了。这时候能做的只剩重发一遍,把话说得更死,再赌一次。
dsh-ccd 把那段思考边流边转述成第一人称的一两句话:「我在核对这份清单里的哈希跟实际的 DLL 名字对不对得上」「这个前提不成立,我换个路子」。它还在想的时候你就知道它在干什么。发现跑偏,可以当场打断,也可以在一轮进行中直接补一句把它拽回来,不必等几千字之后才后悔。
插件不替你按停止键,它做的是让你早几秒知道该按。
模型那边一个字都没被改写:会话里存的仍是完整推理,下一轮它读到的也是完整推理。被缩短的只有你眼前这一层,点「查看原文」随时切回去。
这是 ccd 的 DSH 形态。ccd 那套「换回原文」的机制存在的唯一理由是客户端拿不到原文;DSH 的原文本来就在会话里,所以这里只需要换掉渲染层。
效果展示
同一段思考。模型真正在想的是这样,中英夹杂、反复自我推翻,一屏放不下:
到你眼前是这样,一两句话一行,跟着它往下走:
英文输出(language: en)单独一张。工具调用照旧穿插在笔记之间,没有被藏起来:
这两张图就是写这段 README 时截的
上面三张来自别的会话。下面两张不是摆拍:这一节和它上面那些图,是在 dsh-ccd 已经装着的情况下写出来的,一个模型在改这个仓库的 README,把它自己的思考过程摊在同一个界面上。
它在想要不要先把一个临时脚本加进 .gitignore,在盘算「README 说不提交,但图要上 GitHub 就必须提交,这算不算越权」,在核对三张截图的尺寸和路径对不对:
同一时刻点「查看原文」,它脑子里真正在过的东西长这样,上面那些笔记就是从这一堆里压出来的:
两张并排看,差多少一目了然。这就是这个插件唯一想做的事。
一次对话长什么样
比如你发一句「帮我看看这个构建为什么挂了」。它开始想,你看到的第一句是:
我在核对那份清单里登记的哈希,怀疑它跟实际的 DLL 名字对不上。
方向不对。你打断,补一句「别查哈希,先看有没有残留进程占着文件」。它重新开始,你看到的是新的一两句话,思路换了。答案出来的时候,你已经旁观了整条路,而不是事后读一篇总结。
想核对细节就点「查看原文」,完整思维链一直在,随时切回去。刷新页面、重启 DSH、隔天再打开这个会话,笔记都还在。
效果
- 展开一次思考,看到的是「我在核对…」「接下来我要…」这种一两句的笔记,不是几千字原始推理。展开的那一刻笔记就已经在,不会先闪一下原文。
- 思维链还在流、你还没展开的时候,笔记也在跟着一段一段往外写。
- 点「查看原文」随时切回完整思维链。
- 刷新页面、重启 DSH、重新打开历史会话,笔记都还在。
- 折叠状态下那一行摘要仍是原文首行(见下面「已知边界」)。
安装
在 DSH 的插件页按右上角「添加插件」,把仓库地址贴进去:
https://github.com/mmyddd/dsh-ccd
那个框认包名、GitHub 地址、本地目录三种写法,不需要 build,也不需要先 clone。想钉死某个版本就在末尾加 #<commit>。改代码时直接填本地目录(C:/Git/dsh-ccd)更顺手,改完刷新即见。
也可以直接下载打好包的 tarball,资产名不带版本,链接长期有效:
https://github.com/mmyddd/dsh-ccd/releases/latest/download/dsh-ccd.tgz
旁边有 SHA256SUMS.txt 可以对一下摘要。
装完重启 DSH 生效。
配置
插件页的「思考笔记」设置区按下面的字段生成表单,改完即时生效并写进配置档(跨 DSH 升级保留)。
| 字段 | 默认 | 说明 |
| enabled | true | 关掉就直接显示原文 |
| provider / model | 空 | 转述模型;留空用会话默认模型 |
| maxTokens | 400 | 转述请求输出上限 |
| temperature | 0.5 | 转述温度;0 表示不传 |
| language | auto | auto / zh / en / custom,auto 跟随浏览器语言 |
| customLanguage | 空 | language: custom 时的目标语言,≤40 字 |
| parallel | 3 | 每轮并发转述数 |
| timeoutSec | 20 | 单段超时 |
| maxSummaries | 0 | 一轮最多几段;0 不限 |
| minTail | 0 | 尾巴短于此值丢弃;0 用语言默认(中文 60 / 其它 120) |
| maxRunes | 0 | 单条笔记字数上限;0 用语言默认(中文 200 / 其它 420) |
| streamFirst | 100 | 第 0 段目标字数 |
| streamStep | 200 | 每段递增 |
| streamMax | 1800 | 单段上限 |
| prefix | 空 | 笔记必须以它开头,否则丢弃重试 |
| blockedRegex | 空 | 命中即整段作废(大小写不敏感) |
| avoidPrefixes | [] | 禁用的开头,只对首次尝试生效 |
| retainDays | 14 | 笔记保留天数;0 表示只受条数上限约束 |
| writer | provider | provider 走已配置的供应商;local 走本机模型 |
| localQuant | Q4_K_M | 量化精度,六档可选;换档等于重新下载 |
| localDataRoot | 空 | 运行时与模型的下载目录;空则用 <DSH_HOME>/storages/dsh_ccd_local |
| localThreads | 4 | 本地服务的 CPU 线程数 |
| localContext | 8192 | 本地服务的上下文长度 |
| localIdleSec | 300 | 闲置这么多秒后卸载模型;0 表示常驻 |
两个要点:
- 思考固定关闭,没有开关。 转述模型不该在想笔记的时候再想一遍,那会把预算烧在看不见的地方、把笔记截断在半句。如果某个路由不支持关思考,插件会退一步保证笔记完整,而不是硬关。
- 切段长度决定笔记的粒度。 默认从 100 字起,每段递增 200 字、封顶 1800 字。想让笔记更细就调小 streamFirst 和 streamStep,代价是调用次数变多。
本地模型
不想让笔记走外面的 API,就在「转述来源」里选本地模型。一台没装任何推理栈的机器也能跑:插件自己下发一个 llama.cpp 构建和一个 2B 的 GGUF(MiniCPM5-2B),下载、校验、解压、起进程都在后台完成,页面只显示进度。这台机器上的实测是一段 1500 字的推理出笔记约 2.5–5 秒。
这段配置只在 writer: local 时出现,选了供应商就看不到这些项。
量化精度可选(localQuant,默认 Q4_K_M)。六档来自两个不同的微调,这件事比位宽更要紧:
| 档位 | 体积 | 位宽 | imatrix |
| Q4_K_S | 1.52 GB | 4.82 | 是 |
| Q4_K_M | 1.56 GB | 4.96 | 否 |
| Q4_K_XL | 1.60 GB | 5.07 | 是 |
| Q5_K_XL | 1.89 GB | 6.00 | 是 |
| Q6_K_XL | 2.20 GB | 6.99 | 是 |
| Q8_0 | 2.68 GB | 8.52 | 否 |
默认的 Q4_K_M 与顶配 Q8_0 来自「无审查」那个微调,中间四档来自「锐化」那个、按重要性矩阵校准过,所以标 imatrix。位宽是按真实张量数算出来的,不是按名字猜的。
几点须知:
- 换档不删旧档。 每档是独立文件,换档只是把选中的那份也下下来,旧的那份留着,这样同一个会话里可以来回换着比哪一档措辞更好。代价是磁盘上可能同时躺着几份,卡片会列出盘上还有哪些档。
- 「删除文件」只删自己下的。 判据是文件名白名单,不是 .gguf 后缀;localDataRoot 指向一个已有目录时,你自己放进去的 GGUF 不会被删,也不会被列进「盘上有哪些量化」。
- 模型会闲置卸载(localIdleSec,默认 5 分钟)。一个 GB 的权重常驻没有道理。
- 卡片上的速度是量出来的。 读的是 llama-server 自己报的生成耗时,只算生成、不含读 prompt,所以那个数字跟着无关负载走的时候不会骗你。还没写过笔记时它说「写完第一条就会显示」,而不是画一个 0。
只有三个平台能跑本地模型:Windows x64、Linux x64、Linux ARM64。其他平台(macOS、Windows ARM64)的卡片只说一句「这个平台没有可用的运行时」,不画估算也不给按钮。其余一切照常:供应商转述、切段、笔记持久化、设置页都不碰本地运行时,换个平台装上去照样用,只是本地这一档用不了。
已知边界
折叠行那一行改不了。 DSH 的折叠摘要直接从 reasoning 原文取首行,不经过插件能挂的任何位置。要改它只能整个替换掉 assistant 的渲染,那会跟 DSH 一起升级一起碎,不值。所以折叠时你看到的是原文首句,展开后才是笔记。
折叠、展开、再折叠都不重来。 转述在后台跑,不在浏览器里,所以界面怎么折叠都不影响它。已写出的笔记和新切出来的段全部保留。
一段没写出来不废整轮。 只留一个空位,后面的段照常进行,成功一次就把连败计数清零。连续失败两次才判定这条路不通、跳过这一轮剩下的段。
失败会说真话。 「有笔记没写出来」把最该看的一件事藏了:到底是线路不通、key 被拒,还是模型名写错。所以工具栏会显示 转述失败: Connection error. 这种 provider 的原话,后面跟一个重试按钮,点它按原文重切一遍。失败原因会跟着落盘,刷新之后还在。
换模型就重来。 笔记按段序号缓存,一旦推理前缀断裂(分叉、重放、切模型)就整轮重置重新转述。
笔记存在哪
%DSH_HOME%/storages/dsh_ccd_notes/notes.db(Windows 上是 C:\Users\<you>\.dsh\storages\dsh_ccd_notes\notes.db,可用 $DSH_HOME 覆盖)。一个 SQLite 文件,一次写出单独一条记录,不是追加。
两道闸控制占用:年龄(retainDays,默认 14 天,0 关掉)和条数(最多 8000 条)。笔记是缓存不是历史,过期删除,空间直接给新笔记用。打开数据库时会先扫一遍,所以关了很久再打开不会留着一堆过期记录。
笔记不进 Session,只进这个库。所以它不会被压缩、分叉、重放之类的事牵连;反过来说,删掉这个文件笔记就没了,原文一点不受影响。
开发
| 文件 | 作用 |
| index.js | Host 半:提示词、配置、输出闸门、两条转述路线、切段与并发转述、笔记持久化、HTTP 路由 |
| local.js | 本地模型的运行时:资产表、源探测、下载校验、解压、起停 llama-server |
| client.js | 前端:取笔记、按段序显示、本地模型的准备卡片、四个界面座位 |
| test/.mjs | 六套断言测试,直接切源码里对应的区段跑,不需要 build |
| locale/{en,zh}.json | 插件页标题与描述 |
| docs/.png | 效果图,只在仓库里用,不进包 |
bash
npm test
测试覆盖切段一致性(163 个基准用例)、持久化、设置往返、显示侧状态机、本地运行时与解压。CI 在 Ubuntu 和 Windows 上各跑一遍。
许可
MIT。Host、前端、本地模型管线都是 MIT;形式上源自 ccd,但 ccd 的还原机制在这里整段不存在,搬过来的只有切段、并发转述与提示词,这些也一并按 MIT 重写了。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
mmyddd/dsh-ccd
把冗长思维链实时转成第一人称短笔记,方便随时查看
相关插件 · 其他
模型破甲清洗HunYiSage/dsh-purge
⚔️ DeepSeek Harness 网络安全红队工具dsh-purge
★ 16,993已汉化DeepSeek 客户端
73
女娲蒸馏alchaincyf/nuwa-skill
输入名人名字,提炼其思维模型与决策方式供你调用
★ 37,308已汉化DSH
72
逆向分析桥接Fanqi89/dsh-rea
REA(Reverse Engineer Anything)MCP 桥接,用来把 REA 逆向工具接入 DSH 插件
★ 51已汉化DSH
72
语音女友beiyege-01/dsh-voice-ai-girlfriend
语音 AI 女友Voice AI girlfriend for DeepSeek Harness:Whisper…
★ 888已汉化DSH
71.6
红队越狱测试套件Minglink/dsh-infinite-gen-5
DeepSeek v4.1 flash 逆向工具无限五代 求 Star 收藏 ⭐欢迎大家提交项目的改进
★ 3,759已汉化DSH
71.4
协同办公空间dream-num/univer-workspace
一个让人类与 AI Agent 共同创作、协作和审阅的开源 Office 工作空间。
★ 2,269已汉化DSH
70.8
这是你的仓库?认领条目