deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
PROJECT README
给 DSH(DeepSeek Harness)的「新会话」加上第二重含义:日常聊天 与 开始工作。
日常模式跑一个只有对话能力的轻量 agent —— 有人格、能联网检索、能向你提问、能压缩上下文,但没有文件读写、没有 Shell、没有计划模式、没有子代理;工作模式完全沿用 DSH 原有行为,一行都不改。
一个纯客户端 DSH 插件:不 fork DSH 本体,只往它公开的 4 个槽位注册 9 条内容(其中「更多」那一对按需注册:面板行超过三个才出现,见下)、再加三个方法补丁(客户端两个导航方法、Host 一个预设选择),DSH 升级后不会把插件带坏。
DSH 原本只有一个「新会话」,而它一定是完整的编码 Agent:带着工作目录、bash、文件读写、计划模式、子代理。用它来问一句「今天天气怎么样」或者闲聊两句,代价是模型手里攥着一整套会往仓库里动手的工具,提示词里也全是工程上下文 —— 答话的语气和边界都被带偏。
这个插件把入口拆成两个,像 ChatGPT 把 chat 和 work 分开那样:
| 日常 | 工作 | |
|---|---|---|
| 你点的是 | 侧边栏「日常聊天」 | 侧边栏「开始工作」,或其它任何「新会话」入口 |
| 跑的是哪个 agent | daily 预设 |
profile 默认预设(默认 standard) |
| 模型手里的工具 | 对话人格、网页检索/抓取、提问、上下文压缩 | 全部 |
| 侧边栏那一片 | 换成日常会话列表 | 原生工作区浏览器,且不出现「日常聊天」这一行 |
| 上下文 | 锁死:改不了项目,也换不了 Agent 模式 | 随便改 |
| 会话落在哪 | 专属工作区(标题「日常聊天」) | 原有工作区 |
| 记忆 / 图片识别 / 模型路由 | 照常可用 | 照常可用 |
「日常」是一块真实的工作区而不是一个 UI 开关,所以日常对话是正常 Session:历史留得住,列表就是记账到该工作区的会话。
| 日常 | 工作 | |
|---|---|---|
| 侧边栏入口 | 「日常聊天」整行,order: -20 |
「开始工作」整行,order: -10 |
| 菜单折叠 | 「更多」整行(order: -5):把其余面板行折起来;面板行超过三个时才出现(三行以内整列照常显示),两个模式共用同一个开关,状态记在 localStorage |
同左 |
| 预设 | daily |
profile 默认(本机为 standard) |
| 开场那一行 | 「项目」与「Agent 模式」两个 chip 都不出现 | 两个都在 |
| 能不能改上下文 | 不能:会话钉在「日常聊天」工作区上,预设钉在 daily 上 |
随便:项目、预设、计划模式、子代理 |
| 核心循环 | 用户消息 → 模型 → 工具调用(检索 / 提问)→ 回复 | 用户消息 → 模型 → 工具调用(读文件 / 改文件 / 跑命令 / 计划 / 子代理)→ 回复 |
| 会话列表 | 日常会话,按更新时间倒序,每行只有标题,运行中带绿点 | 原生分组列表 |
| 侧边栏的工作区 | 原生工作区列表整体让位给日常会话列表 | 原生列表,但不出现「日常聊天」这一行 |
三行都排在「插件」之上(该行 order: 0,槽位按 priority、order 升序排;「更多」是 -5)。原生侧边栏的「新会话」按钮会被隐藏,由「日常聊天」「开始工作」这两行取代;macOS 窗口控件等其它「新会话」入口仍然在,并按当前模式路由。
两个模式是互斥的视图,不只是换个预设:工作模式下侧边栏不列「日常聊天」—— 它不是项目,而且点一下整行就会把产品切回日常;日常模式下原生工作区列表整体让位给日常会话列表。
0.1.7。本版本在 DSH 0.1.7-alpha.2、macOS 上验证过;依赖的槽位契约是 sidebar.panellist / sidebar.workspaces / shell.overlay / main。0.1.6 及更早从用户预设根读目录(见第 1 步),本版不再往那里写任何东西。daily 预设由包内 patch 声明(见第 1 步);客户端半(client.js,dsh.client.platform: web)贡献全部界面。没有构建步骤。daily agent 预设:随插件一起声明日常模式跑的 daily 预设随包发布在 preset/daily.patch.yml:一行 @deepseek-ai/dsh-agent-preset 声明,config.plugins 决定这个预设装哪些行(人格、网页工具、提问工具、压缩组),config.name / config.description 是选择器里的显示名与描述,config.order: 5 让它排在 harness 自带的四个预设(standard / ptc / minimal / cordis)之后。
DSH 0.1.7 起,预设就是这种「由 bundle patch 带进来的 declaration row」,不再从 <dshHome>/.agent-presets/<presetId>/ 读任何东西。所以本包把这份 patch 也列进 dsh.bundle.patch:装上插件就装上了预设 —— 没有目录要复制,没有用户预设根要写,也没有「已存在就不覆盖」的规则。你在设置页里改过的预设,DSH 会按行 id preset-daily 覆盖到 profile 的 cordis.patch.yml(用户层,永远压过包内这一份)。
从
0.1.6或更早的版本升上来:那些版本由 Host 半把preset/daily/复制到~/.dsh/.agent-presets/daily/。这条老路在新 DSH 上已被完全忽略,旧目录留着不会有任何作用(插件每次启动会在控制台提醒一次),可以直接删掉。没有这个预设也能跑起来:插件选预设失败时只打一条 warn 并回退到 profile 默认预设,代价是日常会话又变回完整编码 Agent —— 日常模式就失去意义了。
插件是 private 的本地包(包名 @local/dsh-daily-chat,不会发布到 npm),用链接方式装进某个 profile。
方式 A:Web 侧边栏「插件」页 —— 安装组合包,填本仓库目录的绝对路径。管理器会读该目录的 package.json,确认它声明了 bundle patch,装好后默认启用。
方式 B:命令行
dsh plugin --profile web add link:/path/to/dsh-daily-chat
然后确认 profile manifest ~/.dsh/profiles/web/package.json 的 dsh.profile.bundles 里包含了 @local/dsh-daily-chat,没有就手动加在列表末尾 —— bundles 是插件挂载顺序,放最后即可:
"bundles": [
"@deepseek-ai/dsh-base",
"@deepseek-ai/dsh-web-app",
"@local/dsh-daily-chat"
]
重启 dsh web,刷新页面。部署里启用了 HMR 的话配置改动会自己生效,否则运行中的组合会保留到重启。侧边栏面板列表顶部会多出「日常聊天」「开始工作」两行;这一列的面板行一旦超过三个(本部署里是「插件」「定时任务」两行),两行下面还会多一个「更多」开关;只排着「插件」时整列照常显示(见文首截图)。原生「新会话」按钮同时消失。
装好后开一个新会话验证:点「日常聊天」应该直接落在一个空白会话的输入框里,且该会话没有 bash / 文件类工具。
daily → 把中间栏交还会话。中间只会闪一帧占位文字,不会停在中间页。startSession。dsh.daily-chat.panels,刷新后保持;它只折叠这一列,不动中间栏。面板行回落到三个以内时这一行自己就不注册了 —— 留着它也没有可折的东西,只会多一个点了没反应的按钮;第三方插件把行加到第四个,它会自己长回来(见工作原理)。cwd 两条判据都算,后者是宿主半锁预设用的同一条规则)。顺带修掉一个岔路 —— 原生「新会话」会按「当前会话所属的工作区」挑目标,在日常聊天里点「开始工作」时那个当前会话正属于日常,于是新会话又被开进日常聊天;现在这一步已经看不见那个工作区了,目标落到最近用过的工作项目上,一个工作项目都没有时中间栏回到空白首页。daily」这一种上下文,所以开场那行的「项目」和「Agent 模式」两个 chip 直接不出现;从别处发起的工作区切换(空会话里那个「选工作区」提示、目录选择器)会被服务层拒绝并弹一张提示卡,从设置页把某个预设「设为默认」也改不动日常会话的预设,只会看到 DSH 原生的「无法切换到…」。想换项目或换能力,先点「开始工作」。dsh.daily-chat.mode,读写失败时一律按 work 处理,不改变原有习惯。margin 与左内边距一致,标签不再自带字号字距,直接继承侧栏的 14px 与分区标题的三级字色,max-width:45% 保证挤不到按钮;按钮是同一个 IconProjectAddOutline16、同一套 28px 圆形 hover 样式、同一套右边距 —— 只靠 --dsh-sidebar-inline-padding 内缩,右边缘与侧栏内容框齐平(工作模式那条 margin-right:-4px 在这版 DSH 里实测没生效,所以这里按实测而不是按那行声明对齐),展开时 16px、收起时 18px。列表本体的滚动几何也照抄工作模式那一套:外面再套一层 listArea,用 margin-right:calc(-1 * 内缩) 把列表整个拉回侧栏外缘,列表自己再 margin-right:2px + scrollbar-gutter:stable + padding-right:calc(内缩 − 滚动条 8px − 2px)。隔着一张对照截图量出来的结果是:滚动条右缘落在侧栏外缘内 2px(工作模式实测 2px,改之前我们是 14px),行的右缘落在内容框边缘(两边都是外缘内 12px),而且列表会不会滚动都不会左右抖。点一行打开该会话并确保仍处于日常模式;行里只有一个状态点和一个标题,不显示时间。那个加号等同于点「日常聊天」。做三件浏览器做不可靠的事:
daily 预设的迁移。 预设本身由包内 preset/daily.patch.yml 声明(见安装第 1 步),Host 半只做一件事:如果发现某个老安装留下的 <harness home>/.agent-presets/daily/,就在控制台打一条提示,说明它已不再被读取、可以直接删(走 console.warn 而不是 ctx.logger:查过的部署里 logger 的输出没有接到服务端控制台,而这条提示的全部意义就是被人看见)。那个目录长得就像「预设已经装好了」,是排查「预设没了」时第一个该排除的东西。<DSH_HOME>/daily-chat(默认 ~/.dsh/daily-chat)建目录,注册成标题为「日常聊天」的工作区;注册是幂等的,已注册的路径不动。daily 预设上。 在 agentPresets.select 的原型上补一层:会话的 cwd 是日常目录、而目标预设不是 daily 时直接拒绝,客户端会把它显示成 DSH 原生的「无法切换到「标准模式」:…」。这条只能落在 Host:客户端那半能藏掉 chip,但预设还有别的入口 —— 设置页的「设为默认」会顺手写进当前空白会话 —— 而预设决定模型手里到底有哪些工具。三条都是尽力而为:第一条本来就只是提示,工作区那条失败也只打一条 warn,客户端会各自兜底(预设退回部署默认值,工作区退回目录选择框);第三条在拿不到 agentPresets 时什么都不做,只是不锁。客户端那半用目录 basename daily-chat 认领工作区、按 id daily 选预设,所以浏览器永远不用猜路径、也不会一开始就弹框问人;DSH_HOME 的读法与部署其它部分一致,未设置时用 ~/.dsh。
四个贡献、三个原型补丁、一个 store 补丁,外加两个 <html> 属性(Host 那半另有一个预设补丁,见上):
| 席位 | 配置 | 作用 |
|---|---|---|
sidebar.panellist ×3 |
order: -20 / -10 / -5 |
三个带图标 + 文字的入口,排在「插件」之上:「日常聊天」「开始工作」「更多」。行长得像「插件」,点击权归侧边栏,只能 selectPanel(id)。前两行常驻,「更多」按需注册(这一列超过三行才注册,回落到三行以内就注销) |
main ×3 |
key: daily-chat / daily-chat-work / daily-chat-more |
每行配一个面板。前两个执行一次动作后立刻把中间栏交还会话 —— 这就是两行都直接落进输入框、没有中间页的原因;「更多」那个不画任何东西,只翻转折叠属性并把中间栏交还(每个 panellist id 都必须配一个 main 面板,否则 selectPanel 找不到目标) |
sidebar.workspaces |
priority: -1,仅日常模式注册 |
单值槽位只有「活着的、优先级最低的」那一条会渲染,所以 -1 接管工作区区域,注销即让原生浏览器回来 |
shell.overlay ×2 |
全局 | 全部 chrome 规则:藏原生「新会话」按钮、日常下藏开场那行、日常下摘掉标题栏预设胶囊的图标、折叠时藏掉不带本插件标记的面板行(再加箭头翻转);失败提示卡 |
uiWorkspace.startSession 原型补丁 |
— | 所有「新会话」入口都汇聚到这一个方法。日常模式下它改道去开日常会话;另外它也是「开始工作」要调回的原方法 |
uiWorkspace.openWorkspace 原型补丁 |
— | 所有「切项目」都汇聚到这一个方法:开场那行的「项目」chip、空会话里的工作区提示、目录选择器。日常模式下目标不是日常工作区就拒绝(reject + 提示卡),reject 还顺带把选择器乐观显示的那个名字收回去 |
workspaces.list.getSnapshot 原型补丁 |
— | 工作模式下把日常工作区从工作区快照里投影掉(日常模式原样返回)。同一份原始快照只投影一次并按身份缓存 —— useWorkspaces 的 selector 是按 Object.is 比较的,每次给新对象会无限重渲染 |
sessions.list.getSnapshot store 补丁 |
— | 工作模式下把日常会话从会话列表的 ids 里去掉,否则它们会从工作区行下面整批挪进「未分组」(那一组是按「会话列表 − 可见工作区记账」算的)。只动 ids,byId 保持完整,所以主栏里打开着的那个会话仍有摘要与状态。这一条打在 store 对象自己身上 —— 它不是类实例,没有共享原型可用 |
<html data-dsc-mode> |
仅日常模式写着 | 模式相关的 CSS 靠它生效;插件卸载时移除 |
<html data-dsc-panels="more"> |
仅折叠状态写着 | 折叠相关的 CSS 靠它生效;展开时移除,插件卸载时也移除 |
补丁打在服务原型上而不是实例上:Cordis 发给每个使用方的都是同一个实例的独立 traceable 代理,而侧边栏早在插件加载之前就抓住了自己那份代理,Host 的 API 网关也是每次调用才从原型上取方法。工作区快照那层同理:useWorkspaces 这个 hook 每次读都经同一个 model 调 getSnapshot()(subscribe 与 getSnapshot 各自被包成稳定闭包,来源只捕获一次),所以投影不用重新订阅就即时生效,卸载时把原型方法还回去即可。会话列表是唯一的例外:它是个对象字面量而不是类实例(createSnapshotStore 的返回值),没有共享原型可用,所以那条补丁直接换掉对象自己的 getSnapshot —— 浏览器发布的正是同一个对象(provideRoot({ hooks: { sessions: sessions.list } })),所有 useSessions 读到的还是同一个投影。
折叠是这套里唯一不碰服务层的动作:它不改注册、不换快照、不打补丁,只把 <html> 上一个属性翻一下,由一条 CSS 决定哪些行不画。行上没有 id 也没有 data-*(只有哈希类名、aria-label 和 aria-current),插件也没法注销别人的注册,所以判据只能反过来写 —— 给自家每个 glyph 打上 data-dsc-keep,再藏掉按钮里没有这个标记的行。不过「这一行要不要存在」倒是在读服务层:ctx.slots.entries('sidebar.panellist') 数一圈(「更多」自己不算),超过三个入口就注册「更多」;回落到三个以内就注销,并把折叠属性一并摘掉 —— 否则会留下一批被藏起来的行、却没有东西能把它们展开。判定挂在 ctx.slots.subscribe('sidebar.panellist', …) 上(槽位变更按 microtask 批次通知),所以第三方插件后注册的行会自己让这一行长回来。
「不出现 + 拦得住」是两层:开场那行是 CSS 按 <html data-dsc-mode="daily"> 藏掉的(看不到就点不到),服务层那两个补丁负责挡住绕过 UI 的路(空会话里的工作区提示、设置页改默认预设、以后新加的入口)。
其它值得知道的点:
EMPTY_WORKSPACES / EMPTY_SESSIONS),不会因为某个来源没装而崩。dailyChat。staysDaily 会放行而不是拦死 —— 宁可少锁一次,也不让导航在启动那一瞬间卡住。| 名字 | 值 | 说明 |
|---|---|---|
| localStorage key | dsh.daily-chat.mode |
当前模式,daily / work |
| localStorage key | dsh.daily-chat.panels |
面板行是否折叠,more / all;异常一律按 all(全展开) |
| 日常 agent preset id | daily |
声明在 preset/daily.patch.yml 的 config.id;客户端与 Host 半按 DAILY_PRESET 认它。想换成自己的预设,三处都要改 |
| 模式属性 | data-dsc-mode="daily",挂在 <html> 上 |
只在日常模式存在;模式相关的 CSS 全部挂在它下面,插件卸载即移除。见 client.js 的 MODE_ATTRIBUTE |
| 折叠属性 | data-dsc-panels="more",挂在 <html> 上 |
只在折叠状态存在;折叠相关的 CSS 挂在它下面,展开即移除。见 client.js 的 PANELS_ATTRIBUTE |
| 行标记 | data-dsc-keep / data-dsc-more |
打在本插件注册的三个 glyph 上:前者是「这行别折」,后者供箭头翻转用。折叠规则靠它反选别人家的行 |
| 预设声明位置 | 包内 preset/daily.patch.yml | 作为 bundle patch 的一层随插件挂载生效,不落任何目录;<dshHome>/.agent-presets/daily/ 是 0.1.6 时代的老路径,已不再被读取 |
| 日常工作区目录 | <dshHome>/daily-chat,默认 ~/.dsh/daily-chat |
Host 建目录;客户端按 basename daily-chat 认领;Host 侧也按这个目录判断「这是不是日常会话」 |
| Host 目录常量 | daily-chat |
见 index.js 的 DAILY_DIRECTORY,与客户端常量需一致 |
| locale 命名空间 | dailyChat |
— |
| 文件 | 作用 |
|---|---|
| package.json | 包名、exports、dsh.bundle.patch、dsh.client(platform: web、immediately、inject、external) |
| cordis.patch.yml | 一行 insert,把这个包挂进 profile |
| index.js | Host 半:建目录并注册工作区 + 锁住日常会话的预设 + 提示 0.1.6 时代残留的预设目录 |
| client.js | Client 半:全部 UI、状态、「新会话」路由、项目锁定、工作模式的工作区/会话过滤与面板行折叠 |
| preset/daily.patch.yml | daily 预设本体:一行 @deepseek-ai/dsh-agent-preset 声明,config.plugins 就是它的组装 |
| assets/sidebar-modes.png | README 用截图:侧边栏顶部的两行模式入口(早于「更多」开关) |
window.__ModuleLoader__.load),由客户端模块加载器直接读取;改完刷新页面即可,没生效就重启 dsh web。name、以及 client.js 里 load({ id }) 的 id;profile 的 bundles 里也是这个名字。dsh web(部署里启用了 HMR 的话会自己生效)。想在本机临时改,就在 profile 的 ~/.dsh/profiles/web/cordis.patch.yml(用户层)里按行 id preset-daily 覆盖 config.plugins —— 设置页里保存的编辑走的就是这条路,所以它不会被包内的版本盖掉。order: 5,排在 harness 自带四个之后),点开它列的正是人格 + 网页 + 提问 + 压缩;在干净的 DSH_HOME 下启动一次,只有 <DSH_HOME>/daily-chat/ 会被创建(预设来自包内 patch,不落目录);⑦ 日常模式下开场那行整个不出现(项目与 Agent 模式两个 chip 都没有),<html> 上能看到 data-dsc-mode="daily";⑧ 在设置页把标准模式「设为默认」,日常会话的预设不动、只看到 DSH 原生的拒绝提示;⑨ 点「开始工作」照旧出得来,出来后项目 chip 与 Agent 模式 chip 都回来了;⑩ 工作模式的侧边栏里没有「日常聊天」这一行、「未分组」里也没有日常会话(只剩别的旧会话),而你在日常聊天里点「开始工作」之后,新会话落在最近用过的那个工作项目上(一个工作项目都没有时中间栏是空白首页);⑪ 点「更多」后「插件」「定时任务」等行消失、「更多」的箭头翻转,刷新页面仍保持折叠;再点一次全部回来,中间栏不被切走;把「插件」「定时任务」这些行都关掉、这一列回落到三行以内后,「更多」自己不出现(localStorage 里的折叠状态留着但不生效),重新启用后它连着折叠一起回来。button[class*="newSession"]{display:none}。DSH 若改掉这个 CSS-module 类名,规则失配、按钮重新出现 —— 失败方向是「多一个按钮」,不会误伤别的东西。macOS 窗口控件用的是另一个模块的另一个类名,不受影响。html[data-dsc-mode="daily"] [class*="heroWorkspaceRow"],命中 @deepseek-ai/dsh-client-ui-conversation 里那个行容器。DSH 改名后 chip 会重新出现,但服务层那两个补丁还在拦,所以失败方向是「看得见、点了被拒」,不是「又能切了」。uiWorkspace.startSession / uiWorkspace.openWorkspace,Host 补 agentPresets.select。任何一个被改名或改签名,对应的那条锁静默失效(补丁取不到原方法就不装),不会连带报错。Host 那条按会话 cwd 是否等于 <harness home>/daily-chat 判断,所以把日常会话手工挪出那个目录之后就不再受锁 —— 那时候它本来也不再是日常会话了。@deepseek-ai/dsh-client-ui-primitives 的 IconProjectAddOutline16(工作模式同一个),取不到就退化成一个纯文本「+」,不会崩。[data-slot="conversation.session.header.actions"] > span[title] > svg,前一半是槽位键(本插件本来就往这个槽位注册),后一半是那个胶囊的形状:根元素是带 title 的 <span>、图标是它的第一个直接子元素。同槽位的其它占用方(任务、计划、终端、费用表)都是按钮或 <div>,所以这条只命中一个元素。DSH 若改了槽位键或那个胶囊的根元素,图标会重新出现。data-*(只有哈希类名、本地化的 aria-label 和 aria-current),插件也没法注销别人的注册,所以折叠只能反过来做:给自家三个 glyph 打上 data-dsc-keep,再藏掉按钮里没有这个标记的行。面板本身还挂着,只是这一列不画它 —— 折叠是「这一列只剩三个入口」,不是「禁用其它面板」。规则要吃 :has()(Chromium 105+,本部署的 Electron 远高于此);DSH 若改掉面板列表的类名,规则失配、所有行照旧可见。反过来,以后别的插件加的行也会被一起折进去(这是有意的:折起来就该只剩这三个入口),那些插件并没有被卸载。另外,「更多」本身按需出现:这一列的面板行不超过三个就不注册 —— 三行本来就全显示得下,多一个按钮反而是多余的;读不到面板列表就按「不需要折」处理,这一行不注册,其余功能不受影响。~/.dsh/storages/workspace.json 里也照旧)。代价是工作模式里没法从「已归档」视图里恢复一条日常会话 —— 切到日常模式再操作。<home>/.dsh/daily-chat 这个路径;路径对不上才退回「目录名是 daily-chat 且标题是 日常聊天」。这一条比认领日常会话那套规则更严是有意的:多一点误判会把用户自己的项目从侧边栏里抹掉,少一点误判只是那一行还在。getSnapshot。 工作区那层取不到 workspaces.list.getSnapshot 原型方法就什么都不做(日常那一行重新出现在工作列表里);会话那层要在 store 对象上写 getSnapshot,写不进去就退化成「日常会话回到未分组」。两处都不会连带报错,其余功能不受影响。之所以只能在视图层过滤:WorkspaceView 上没有任何可用标记 —— DSH 目前既没有 hidden 字段,也没有「系统工作区」这类概念;而「未分组」是拿「会话列表 − 可见工作区记账」现算的,所以藏工作区必须连会话一起藏。0.1.7 及以上。 0.1.6 及更早从用户预设根(<dshHome>/.agent-presets/)读目录,不认 declaration row,而 0.1.7 起那个根已无人读取;本版只用 declaration row 声明预设,所以在更老的 DSH 上日常会话会静默退回 profile 默认预设(浏览器控制台里能看到一条 warn)。priority 上被两条注册占用会直接抛错(sidebar.workspaces 在 priority: 0 已被 ui-workspace 占用,本插件用 -1 才安全);list 槽位同 id 同 priority 亦然。同 profile 里再装一个改相同席位的插件前,先确认优先级。package.json 还没有 license 与 engines.dsh。 对外发布前建议补上。方式 A:Web 插件页 关掉或删除该组合包。
方式 B:命令行
dsh plugin --profile web remove @local/dsh-daily-chat
并把 @local/dsh-daily-chat 从 profile manifest 的 dsh.profile.bundles 里去掉。隐藏按钮的 CSS 是插件自己渲染出来的,插件一卸载规则就跟着消失,原生「新会话」按钮自动回来。
可选清理(不做也不影响使用):
~/.dsh/.agent-presets/daily/ —— 只有从 0.1.6 或更早的版本升上来的机器上才有(老版本插件复制进去的),DSH 0.1.7 起不再读取,可以直接删;预设本体在包内 patch 里,随插件一起卸载;~/.dsh/daily-chat/ 与 ~/.dsh/storages/workspace.json 里那条工作区记录 —— 想彻底抹掉日常会话历史;dsh.daily-chat.mode。本仓库尚未声明开源协议。若要发布到 GitHub / npm,建议补一个 LICENSE(如 MIT),并在 package.json 里加上 "license": "MIT"。
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。