dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
DSH 界面两档模式插件:简化/原生一键切换,工具卡片白话化,降低上手门槛 / Two-level UI mode plugin for DeepSeek Harness
简体中文 | English
这个项目要做的事,DSH 官方界面自己做到了:新版界面已经原生具备折叠工具调用、简洁工具行、可读的工具输出。插件当初要解决的两个矛盾没有了。
不再继续开发。最终版本 v1.14.1(2026-09-24),源码、开发记录与验收材料全部保留在本仓库存档,供回看参考。未发布到 npm。
不推荐把它当作成品装给新用户使用;需要「可随意开关的档位」这类官方界面没有的能力时,才值得翻这里。
DSH 界面三档模式插件:原生 / 整洁 / 白话一键切换。整洁档保留产品原版的工具行语言,白话档把术语换成大白话,两者都把工具调用收成折叠组。新手看白话,老手要完整,同一套界面三种读法,降低 DeepSeek Harness 的上手门槛。
DeepSeek Harness 发布后,社区对它的批评集中在一点:门槛。
DSH 的毛坯房是刻意为之,但「想省事的人」和「要全功能的人」不该被迫接受同一套界面。dsh-prism 用三档模式回应这个矛盾:
| 档位 | 适用的人 | 界面表现 |
|---|---|---|
| 白话 | 想先用起来、不想研究术语的人 | 工具调用归组折叠:正式回复前的一串调用收成一行统计,点开展开后每行走白话文案(「正在读取一个文件的内容」),全篇 emoji 图标 |
| 整洁 | 想整洁、但不想改变原有信息读法的人 | 同样归组折叠,展开后每一行按产品原版样式呈现:单色线性图标 + 类别标题(Bash / 读取 / 编辑 / 工具调用)+「·」+ 参数摘要,例如 Bash · Run syntax check、工具调用 · get_goal · {};用宿主内置的官方 ui-primitives 组件渲染 |
| 原生 | 老手、需要完整信息的人 | 插件零接管,产品原貌原样渲染,一个像素都不改 |
默认原生档,切换一次即生效,且档位会记住(刷新页面或重启 DSH 后仍是那一档)。不想用的时候,卸掉插件,界面回到出厂状态,没有任何残留。
sidebar.footer.action 槽,与 WSL / 记忆等入口同排),显示当前档位首字(原 / 整 / 白),点开菜单切换「原生 / 整洁 / 白话」;菜单内含「隐藏复杂工具」开关(仅白话档生效);档位会记住,刷新页面或重启 DSH 后仍是上一次选的那一档@deepseek-ai/dsh-client-ui-primitives 原语(DisclosureRow / StateDot / 官方图标)渲染,标题与摘要按产品 toolRowModel 的同一套规则推导,视觉与产品原生工具行一致StateDot)+ 单色线性图标 + 类别标题 +「·」+ 参数摘要;通用工具按产品的写法带上工具名(如 工具调用 · get_goal · {})isError)显红;命令返回非零退出码(grep 没匹配、head 截断管道这类常态)显琥珀,文案「命令返回非零」TerminalBlock(命令头 + 输出 + 复制按钮)、读取族用官方 ReadBlock(带行号);其余工具走交付文档(MarkdownText)。官方原语取不到时退回原位,一块不丢FoldToggle;宿主这版尚未提供它,自动走自绘兜底(「展开 ▾ / 收起 ▾」),宿主升级后自动生效N 个工具 · M 次思考)display 收起(只收工具 / 重试座位,或「已结算且渲染为空」的助手座位),切档或卸载时按轮次原样撤回 —— 用 display 而非 hidden,是因为产品在它那侧会无条件抹掉同名的 hiddenui-chat 的 ChatView.tsx:ResizeObserver 盯着流列,读者贴底时把视口拽到新底部)会让被点的那一行从指下溜走。插件在点击那一刻记下被点那一块的屏幕位置,随后把它钉住:被点的行不动,内容从它下面往下长。补位只写滚动位置,静默 320ms(最长 1.2s)自己撤,滚轮 / 触摸 / 滚动键一动立刻让开;中段阅读本来就不动,补位在这里不添乱token / secret / password / api_key / authorization 等敏感参数名永不取值,整洁档的摘要同样过滤;参数里只有敏感键时摘要留空,不回退原始 JSONsk-xxx、Bearer xxx、?token=xxx、key=xxx)替换为占位符file_path 等参数用 basename 呈现);整洁档按产品原版规则显示路径,以贴近原版tool-call / assistant-step / model-retry 三个节点渲染器),切档时动态注册 / 注销、即时生效__PRISM_DIAG__ 存最近 6 次切段与最近 5 轮现场;可疑形态自动留痕(__PRISM_DIAG_LOG__() 读取、__PRISM_DIAG_LOG_CLEAR__() 清空),长会话里时好时坏的毛病也留得下现场pwsh → 「正在电脑上执行一条命令」),未进表的工具按参数名自动生成摘要。白话档下折叠组内每一行都按这套规则渲染;整洁档改用产品原版的类别标题与摘要规则(Bash · …、工具调用 · 工具名 · …),只在脱敏底线上保留插件自己的过滤dsh.prism.mode),刷新页面或重启 DSH 后保持;其余界面状态(折叠组开合、菜单、隐藏复杂工具开关)仍是内存态,不留痕迹--dsw-alias-* 设计变量,明暗主题自适应console.error('[prism] …') 并记入体检面(window.__PRISM_DIAG__),绝不静默吞错需要先装好 DeepSeek Harness(Node.js 22.19+ 或 24+)。
当前通过 GitHub 发布,克隆本仓库后以本地路径安装:
npx -y @deepseek-ai/dsh plugin --profile web add <本仓库目录>
也可以从 Releases 下载已发布的打包产物。启动 Web UI 后,侧栏底部「设置」上方会出现档位入口。
档位会记住吗?想清干净怎么办?
会。档位存在浏览器本地(键名 dsh.prism.mode),刷新页面、关掉 DSH 再开都保持。想回到「原生档 + 无痕迹」,把档位切回原生即可;要连记忆一起清掉,在浏览器控制台执行 localStorage.removeItem('dsh.prism.mode') 再刷新。换浏览器或清掉浏览器数据之后,同样回到默认的原生档。
为什么有些工具卡片看起来没变?
read、write、web_search 等工具官方已有产品级原生卡片,插件不为它们注册替代卡片(原生档完全原版);白话档把它们与其他工具一起收进折叠组,以统一的白话行展示,不改变官方卡片本身。
为什么折叠行的状态点有红有琥珀?
红=工具真的出错了;琥珀=命令返回了非零退出码(grep 没匹配、head 截断管道这类常态也算),文案写「命令返回非零」。这样助手连续跑管道命令时,不会一屏全是红点。
白话档会影响 agent 干活吗? 不会。插件只改界面显示,模型收到的输入输出与原生完全一致。
点开详情后表格 / 代码块是什么效果?
结果文本先脱敏,再交给官方的 MarkdownText 渲染(表格、代码块、标题、列表、行内代码与链接都在内);取不到官方原语时退回等宽纯文本,绝不抛异常。
FoldToggle 等此前缺位的原语会自动接上)有想法或遇到不适配的工具,欢迎开 issue 讨论。
exitCodeOf 与数据层同名互相覆盖 —— 新份在「读不到退出码」时返回 undefined,而判据写的是 code !== null,undefined !== null 恒真,一切无标记文本(即正常成功的工具)全被判「非零退出」:行级几乎全部 ✕、段级成功计数恒 0(计数分支 ✓ n · ! m 永不可达 —— 这也正是上一版「琥珀计数分支没被验到」悬案的答案)isError)才红 —— v1.14.0「红点不再成排」的意图这次两处都落实(白话档图标与整洁档官方 StateDot 的 warning 态同改)parseExitStatus 一字不差(前置换行 + 行尾锚定)—— 读文件、搜代码时正文里恰好出现 [exit code: N] 字样不再误判--real-primitives 双模式);新断言含行级三态、计数分支可达、尾部锚定、失败仍红;反向跑「含 bug 版」恰 3 条哨兵变红(行级实测 [0,0,2],两行全红叉的原样复现);其余门链 16/16、26/26、17/17、13/13、20/20 全绿;真机 PASS(投递 1.14.1、零报错)DisclosureRow,但行尾的状态点、折叠开关、以及展开后装的内容这三处还是自绘的。这一版换掉它们:
StateDot(运行中是追逐动画,与 TerminalBlock 头部那颗同源,行与卡片不会各说各话)FoldToggle(button + aria-expanded,文案从自造的「展开」换成产品的「还有 N 行」)TerminalBlock(命令 + 输出 + 退出码 + 一键复制 + 自带高度折叠),读取族走官方 ReadBlock(带行号的文件块)MarkdownText)—— 内容一块不丢;未接的族不许冒充官方块command / file_path(真机上原本命令会显示两遍);其余参数(cwd / timeout / offset…)照旧留着err,于是助手连跑 grep / head 管道(退出码非零)时一屏折叠行全是红点。现在 isError(工具真出事)才红;只是退出码非零的走琥珀(复用既有的 mixed 档,文案「命令返回非零」)path / offset / lines / totalLines 这类字段),插件这一层拿不到;靠解析文本反推会造出「看着对、其实错」的内容(红线:一块都不许吞,也不许编)PRISM_REAL_PRIMITIVES=1 在 WSL 里跑 Windows 版 node.exe 时传不过去,新增 --real-primitives 命令行开关--real-primitives 双模式实测)dsh.prism.diag.log,封顶 20 条,超了丢最旧的一半)span=false(本节点没落进任何段 → 工具格走单行原版行,整洁档此刻与原生档同貌)与 claimOK=false(认领失败 → 那一段没人画折叠行)。产品自己折(foldable)与节点不在窗口(inWin=false)属正常形态,不记 —— 记了只会把有效信号淹掉__PRISM_DIAG_LOG__() 取回 JSON、__PRISM_DIAG_LOG_CLEAR__() 清空;dev/prism-claim-dump.js 的取证片段会一并打印--client=dev/client-1.12.0-backup.js(不含留痕的旧版)跑,其中 5 条当场变红、且回归不再被中断 —— 断言咬得住。真机确认:投递版本 1.13.0、档位与三格注册面正常、读口在位、无异常时存储键不存在;另做一次端到端(塞样本 → 读口读回 → 清空)全通dsh.prism.mode,与宿主自己的界面偏好同一条路(例如 dsh.conversation.contentWidth);读取放在 store 创建之前,所以启动时按记忆直接注册渲染器。读不到 / 值脏 / 存储被禁一律当没存过,回默认原生档:存储不可用只 console.warn 一次,不进 errors 计数(那三本账是渲染可靠性的计数器)dev/prism-persist-check.mjs(真 React + 真 Chrome + 真 reload)20/20;反向验证两条:摘掉落盘 → 8 条红,读改成常量 → 5 条红。回归:桩 145/145、契约 16/16、数据红队 26/26、浏览器红队 17/17、钉位 13/13、自检片段守门 12/12ui-chat 的 ChatView.tsx 用 ResizeObserver 盯着流列,读者贴底(FOLLOW_THRESHOLD = 24px)时回调里直接 el.scrollTop = el.scrollHeight;插件一展开,列高了,视口就被拽到新的底部。真机实测:贴底点开,卡片当场向上飞 160px;收起时向下掉 151px。现在点击那一刻记下被点那一块(座位)在屏幕上的 y,随后盯住列的尺寸变化,被挪走多少就补回多少 —— 只写滚动位置,不碰产品状态、不新增定时器(静默 320ms 或最长 1.2s 就自己撤),读者一动滚轮 / 触摸 / 滚动键 / 点别处立刻让开DisclosureRow 绘制,为此给它挂了自己的类名 prism-native-row,补位才认得出这条行dev/prism-pin-check.mjs(真 React + 真 Chrome + 宿主跟随的替身)13/13;反向验证:摘掉补位那一行,贴底三条断言变红(Δy 0 → −151px),中段依旧绿。桩 145/145、契约 16/16、数据红队 26/26、浏览器红队 17/17 全绿;旧版 1.9.9 跑同一套 136/145(红的 9 条正是 v1.10 分区的哨兵)首行注释 + 排错面红线(v1.10.9):文件头补了插件用途说明;排错面(__PRISM_DIAG__ 的 groups / snap)注明只供本地排错、勿贴进公开仓库——它含节点 key 与轮次结构这类会话内部标识。另:.gitignore 已把 dev/(约 5MB 的本地探针、截图与历史备份,且可能含会话原文)排除在版本控制之外
折叠范围从「一轮一条」改为「两次正文之间各一条」。 模型边写边调时,正文与工具交替出现:长活按有正文的助手步切成若干段,每段工具收成一条折叠行,紧跟在这段正文之后;段内的显示机制(面板、按 step 分段、段头、手风琴、脱敏)一字未动。一轮里没有正文边界时(纯工具长活)仍是一条,行为连续
段的边界怎么定:正文(含图片 / 插件不认识的块)算边界;只带思考的步不算 —— 思考原文留在折叠面板的段里,不会因为每步都有思考而把时间线切碎;答案步永远是边界,它之后的内容不进折叠。这段判据写在数据层一处,分段与折叠边界共用
每条折叠行各记各的账:认领账本与开合状态都按「会话 + turn + 段标识」记账,点开一条不再带动全轮;段标识取段首步号,成段后不再变
行距减半(v1.10.2 补):承载折叠行的座位与它后面一行都取半值行距(8px,产品自己给「折起来的过程行」用的也是这个值),卡片与正文贴紧;本轮里「插件接过、但什么也没画」的工具 / 重试座位直接收掉(它们零高度却各占一条 16px,正是「间隔太大」的另一半来路);撤回改为只还自己收过的那批,不再把同轮别的所有者刚收好的座位弹回来
答案步边界(v1.10.8):折叠切段原先把答案步并进了上一段,造出一段横跨答案步的段——而答案步在折叠范围之外,段内每个成员都被判在段外、谁都不许认领,这一段永远画不出来;答案之后的节点也被一并折进卡片。现在答案步一到就结算上一段、边界之外一律不参与成段(回归桩 145/145、契约 16/16、数据红队 26/26)
修掉「一轮回复完有时呈现原生效果」(v1.10.7):助手那条渲染路径把 useMode() 放在了「无段即早退」之后——那一格在两次渲染之间形态一变(收尾时组形态会变),hook 数就随之增减,React 抛 #310(Rendered more hooks),它抛在插件的 catch 之外,槽位按 keyed 规则摘牌,这一格回落到产品自己的行。档位读取已提到所有早退之前,并在浏览器层加了「有段↔无段来回切换不抛 #310」的常驻断言
排错面一眼可见(v1.10.5):档位菜单那一行直接摆出行距三本账 —— seats=(按折叠名单收掉的让位座位)、blank=(本轮空白座位直接收的累计数)、compact=(取半值行距的行数)。三个数为 0 也照写:「该收却没收到」正是要看的异常
长会话记账有界(v1.10.4):手动开合那几本 Map(展开态 / 段展开 / 答案思考 / 行详情)键里带会话,不能按轮次清;但没有上限时会随长会话无限增长且会话关掉也不回收。现在超过 600 条就丢弃最旧的一半(只丢可重建的界面状态,不碰任何数据与渲染契约)
修回两档的区别(v1.10.3 补):面板里的工具行必须「整洁档走产品原版行(官方原语 + 类别标题 + 摘要)、白话档走大白话(emoji + 白话文案)」。此前助手那条渲染路径把档位读成了 props.mode,而助手节点根本没有这个 prop —— 只要折叠行由正文步认领(v1.10.0 分区的常态),整洁档的面板就会整块掉进白话分支,看着就是「整洁档做成了白话档的程度」。现在档位一律走 useMode();浏览器层新增 4 条「两档必须不同」的常驻断言
正文步自己承担它那一行的渲染:正文在上、卡片紧随其下(同一个渲染结果里两段内容),所以卡片总是落在它对应正文的下面
回归桩升级为 140 条断言(13 条覆盖分区与行距:两条行的条数、各段统计、正文在卡片之前、答案步不认领、各段独立开合、跨会话不串档、无边界退化、只有工具头的步不构成边界、助手格收行距、紧凑标记、空白座位直接收);旧版 1.9.9 跑同一套 132/140,红的 8 条正是本次功能的哨兵
这一版把折叠组从「能跑」修到「站得住」,逐条都是真机上撞到过的问题:
hidden(它自己那侧 hidden=false 时无条件 removeAttribute)。收行距改用 display,两边互不相干;撤回按轮次过滤,不再把别的轮次收好的座位一起弹回location.step.seq(真字段是 location.step.step)。分段与折叠边界都可能因此判错;折叠边界同时改为按节点次序判定,不再依赖步号算术JsonBlocktry/catch 只能接住代码里抛的异常;异常若发生在产品 hook 调用中间,钩子计数就与上一次对不上,React 会在插件的 catch 之外抛它自己的错误,槽位随即按 keyed 规则摘牌,这一格落到产品自己的渲染器上 —— 折叠行与工具行一起没了,菜单却还写着 tool-call=ok。现在插件在自己子树里装了一层错误边界:崩溃只降级成一行,绝不惊动槽位[prism] 抛出位置: + 最多 6 帧)flex:none,不参与伸缩,既不被挤扁也不去抢邻居的宽度props.turnProcess.spec.answerStep(产品 ChatNodeSeat 透传给节点渲染器的那一份),旧通道 location.turn.data.get('turn-process') 作为回退;「答案步交还产品」这条链不再依赖插件自己解析model-retry 节点一并接管,产品那一行不再单独渲染(同一个事实本来会被画两遍).flowItem 加行距,而槽位锚点 [data-slot] 是 display:contents 且恒存在,.flowItem:empty 永不成立 —— 于是每个让位的节点各留一条 16px 空档。现在按产品自己的 hidden="until-found" 把确实渲染为空的座位收成零高,切档 / 卸载整批撤回node.key 被窗口重复投递时不再重复渲染;只有思考、没有工具的段不再被当成空段丢掉node dev/harness.mjs --client=dev/xxx.js 可把同一套断言跑在旧版上做差分对照(旧版 1.7.1 在 8 条上失败)turn-process.answerStep),最后一步交还产品原样渲染(思考 + 正文连着出现),只把中间过程性思考收进面板tool-call=ok · assistant-step=ok · errors=0):切到英文界面也能一眼读,不受语言影响window.__PRISM_DIAG__ 仍可看到完整清单(已注册的 key 与错误文本)console.error('[prism] …') 并记入 window.__PRISM_DIAG__(含已注册的渲染器清单与错误列表),排错有据window.__PRISM_DIAG__ 即可看到「注册成功了吗 / 渲染时抛了什么」max-height:260px + overflow:auto,长思考时盒子里留白并出现内滚动条,看起来像「内容被收走后留下空格」。现在不设高度上限,整页滚动segHeads=0 / toolRows=0 / thinkingBlocks=0,逐节点渲染结果为「首节点 1 条总收拢,其余全为 null」assistant-step:只渲染正文 text 块,reasoning 块不单独渲染(产品那条思考行需要四个条件同时成立才隐藏,长轮里几乎不成立)。影子验证:产品同 key 的渲染器在折叠档不会被调用assistant-step 节点,只渲染正文,思考块作为「思考完成」段的展开内容收进面板。此前思考行只在「可折叠 + 答案步 + inlineReasoning + 过程未展开」时才被产品隐藏,长轮里几乎总是不隐藏,于是思考一行行摊在收拢行外面setMode 原先在档位相同时提前 return,而渲染器注册靠订阅通知驱动 —— 一旦出现「状态已是白话档、渲染器却没注册」,再点白话档不会有任何反应,折叠组整块消失。现在档位设置永远通知一次exit 5 计入失败location.step.seq)也能切段,助手节点缺席时照样分段[prism-segments]:把窗口里的节点种类、助手步号清单、工具步号清单、段数与每段的工具/重试/思考数一次打出。分段是否成立不用猜,看这一行即可dev/harness.mjs(孤儿节点不渲染、窗口重复投递不重复摆行)[exit code: N]),并不设 isError —— 所以 exit 3 这类命令在此之前会被显示成绿勾。现在行的状态同时看 isError 与结果文本里的退出码,两者任一命中即为失败;标题里也会带上「退出码 N」model-retry),插件不接管、不重画它的样式,只在组内折算成一行次数摘要,让「几次尝试未成功」进得了统计口径12.3s),运行中的行按秒推进显示至今;数据取自产品工具块上的 callTime / time,不需要插件额外计时sidebar.footer.action 槽,与 WSL / 记忆等入口同排、位于「设置」上方;按钮显示当前档位首字(原 / 整 / 白;英文 N / T / P),宽栏 28px、窄栏 36px,与同排其它插件一致收尾复审(只动确会影响后续的地方):
dsh.client.inject 里长期挂着一个宿主并不存在的包名(@deepseek-ai/dsh-client-runtime),已清空;对官方 ui-primitives 的依赖补进 peerDependenciestoken / secret / password / api_key / authorization 等)永不取值;参数里只有敏感键时不再回退原始 JSON 文本(否则键名与结构会出现在摘要里);URL 查询串里的 ?token= / &api_key= / &sig= 等凭据形态纳入脱敏title 属性(产品没有),避免超长参数在悬停时弹出整段 JSONui-primitives 原语(DisclosureRow、StateDot、官方图标组件)渲染,标题与摘要照产品 toolRowModel 的规则推导,行语言与产品原生工具行一致(Bash · Run syntax check、工具调用 · get_goal · {})seed.ts 里已登记 @deepseek-ai/dsh-client-ui-primitives),插件 require 即得,零打包、零安装、零依赖;取不到时自动降级为普通布局,功能不丢ToolRow.module.css(标题字重、2px 圆点分隔、摘要字号与省略),主题令牌沿用 --dsw-alias-*,明暗主题自适应useChat 取用(新版把它从 SessionSnapshot.chat 挪到了 SessionStandardProps.useChat),旧版路径保留为回退,同一份代码在两代产品上都能正常归组window.__PRISM_DEBUG__ = true 后刷新,会输出首个组节点的分组上下文(turn / 节点数 / 工具数 / 边界判定),产品升级后定位问题不必再猜ToolGroupNode 裸用 framework hook useSession,每次渲染抛错导致槽位条目退出、回退产品原版渲染,两档看起来一样);改为从组件 props 取运行时注入的 hooktoolRowMeta,时间线卡片与折叠组面板共用,文案与状态完全一致priority: -1 shadow 产品渲染;白话卡片不再注册到 tool.call.toolview(该槽在简化档无消费方),折叠组面板内直接渲染TOOL_RULES,提 PRlib/client.js 保持一致(零依赖、React.createElement、中文注释)lib/client.js)TOOL_RULES 规则表:33 个工具 → 白话文案与参数摘要声明
ARG_NAME_RULES 参数名规则:无显式声明的工具按参数名自动生成摘要
SENSITIVE_KEY 敏感参数名(任何情况下不展示其值)
注册是动态的:conversation.chat.node 的 tool-call 渲染器仅在白话 / 整洁两档注册(以 priority: -1 shadow 产品 ToolCallTree;keyed 槽同 key 同 priority 的注册会抛错,更低 priority 者胜出),原生档零注册,产品界面原样呈现。折叠组面板内的工具行由插件直接渲染(白话卡片 / 原版行,展开后的详情走官方语义块或交付文档),不经 tool.call.toolview 槽分发(该槽的消费方是产品 ToolCallTree,折叠档下已被 shadow)。
分区与分段:computeGroups() 先按「有正文的助手步」把本 turn 的节点切成若干段(正文之间各一段;答案步是边界,它之后不折;只有工具头的步不构成边界),每段再交给 computeSegments() 按 step 切列(段边界取同一 step 的最后一个工具或重试节点,每个节点恰好渲染一次)。段头用官方「思考完成」的说法,段内条目复用 ToolCard / NativeToolRow / RetryRow 三种行。每条折叠行的渲染权按「会话 + turn + 段标识」认领(useGroupClaim),开合状态同键记账。耗时取工具块上的 callTime 与 time 之差,运行中的行由 useTick() 的秒级节拍推进(仅在存在运行中行时启动)。
| 字段 | 含义 |
|---|---|
tools | 工具名(数组);多个工具共用一条规则 |
doing / done | 进行中 / 完成的白话文案;缺省时自动生成通用文案 |
complex | 标记复杂工具:白话档默认折叠成一行,点击可展开 |
noArgs | 不显示参数摘要(保持原有行为) |
arg.pick | 候选参数键,按序取第一个非空字符串 |
arg.mode | 呈现方式:file=路径只留文件名 / raw=原文 / short=截断(配 max)/ count=数组计数(配 unit)/ wrap=(值)包裹 / fixed=固定文案 |
arg.prefix | 摘要前缀 |
arg.fallback | 参数缺省时的文案;不填则不显示摘要 |
TOOL_RULES 加一行,只写工具名即可:doing/done 自动生成通用白话文案,参数摘要由 ARG_NAME_RULES 按参数名自动生成(如 file_path → 「文件:xxx」、url → 「链接:xxx」),白话档折叠组面板自动按规则渲染该工具行。doing / done / arg;想让它默认折叠则加 complex: true。read / write 等)按规则渲染成白话行;原生档下它们仍是产品原版卡片,无需特殊处理。