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

强化界面 nothurry/stronger-dsh

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

为原生界面加上动效、背景与上下文记忆管理

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

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

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

状态速览

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

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 83 处,展示前 71 条)
  • 读取本地文件
    lib/index.js:29
    const loading=(async()=>{await media.load();await workspace.load();await bots.load();await workbench.load();await wechat.load();await intelligence.loa
  • 写入本地文件
    lib/index.js:77
    preferences={...preferences,...payload};await mkdir(data,{recursive:true});await writeFile(path.join(data,'ui.json'),JSON.stringify(preferences,null,2
  • 写入本地文件
    lib/index.js:77
    preferences={...preferences,...payload};await mkdir(data,{recursive:true});await writeFile(path.join(data,'ui.json'),JSON.stringify(preferences,null,2
  • 执行外部命令固定命令
    lib/computer.js:55
    const child=spawn('powershell.exe',['-NoLogo','-NoProfile','-NonInteractive','-STA','-Command',UIA_SCRIPT],{windowsHide:true,shell:false,stdio:['pipe'
  • 读取本地文件
    lib/bots.js:9
    async load(){try{const raw=await readFile(this.file,'utf8');if(raw.length>300000)throw Error('角色配置过大');const s=JSON.parse(raw);if(s.version!==1||!Numb
  • 写入本地文件
    lib/bots.js:13
    async persist(next){await mkdir(path.dirname(this.file),{recursive:true});const tmp=this.file+'.'+randomUUID()+'.tmp';await writeFile(tmp,JSON.stringi
  • 写入本地文件
    lib/bots.js:13
    async persist(next){await mkdir(path.dirname(this.file),{recursive:true});const tmp=this.file+'.'+randomUUID()+'.tmp';await writeFile(tmp,JSON.stringi
  • 写入本地文件
    lib/bots.js:13
    async persist(next){await mkdir(path.dirname(this.file),{recursive:true});const tmp=this.file+'.'+randomUUID()+'.tmp';await writeFile(tmp,JSON.stringi
  • 读取本地文件
    lib/bots.js:21
    async loadTasks(){try{const raw=await readFile(this.taskFile,'utf8');if(raw.length>2000000)throw Error('协作记录过大');const s=JSON.parse(raw);if(s.version!
  • 写入本地文件
    lib/bots.js:22
    async taskChange(fn){const job=this.taskQueue.then(async()=>{const next=structuredClone(this.tasks);const result=await fn(next);await mkdir(path.dirna
  • 写入本地文件
    lib/bots.js:22
    async taskChange(fn){const job=this.taskQueue.then(async()=>{const next=structuredClone(this.tasks);const result=await fn(next);await mkdir(path.dirna
  • 写入本地文件
    lib/bots.js:22
    async taskChange(fn){const job=this.taskQueue.then(async()=>{const next=structuredClone(this.tasks);const result=await fn(next);await mkdir(path.dirna
  • 读取本地文件
    lib/media.js:7
    async load(){try{const c=JSON.parse(await readFile(join(this.dataDir,'connections.json'),'utf8'));for(const k of Object.keys(EMPTY))if(typeof c[k]==='
  • 读取本地文件
    lib/media.js:15
    for(const [key,extensions,limit]of files){if(!next[key])continue;if(!isAbsolute(next[key])||!extensions.has(extname(next[key]).toLowerCase()))throw ne
  • 写入本地文件
    lib/media.js:16
    await mkdir(this.dataDir,{recursive:true});const p=join(this.dataDir,'connections.json');await writeFile(p+'.tmp',JSON.stringify(next,null,2));await r
  • 写入本地文件
    lib/media.js:16
    await mkdir(this.dataDir,{recursive:true});const p=join(this.dataDir,'connections.json');await writeFile(p+'.tmp',JSON.stringify(next,null,2));await r
  • 写入本地文件
    lib/media.js:16
    await mkdir(this.dataDir,{recursive:true});const p=join(this.dataDir,'connections.json');await writeFile(p+'.tmp',JSON.stringify(next,null,2));await r
  • 读取本地文件
    lib/media.js:18
    async asset(){if(!this.config.skin)return null;const b=await readFile(this.config.skin);if(b.length>5_000_000)throw new Error('形象文件过大');const mime={'.
  • 读取本地文件
    lib/media.js:20
    if(!this.services){const file=join(this.dataDir,'local-services.mjs');try{await stat(file);this.services=(await import(pathToFileURL(file).href)).crea
  • 发起网络请求
    lib/media.js:29
    while(Date.now()<deadline){controller.signal.throwIfAborted();try{const r=await fetch(cfg.api+'/openapi.json',{signal:AbortSignal.any([controller.sign
  • 发起网络请求
    lib/media.js:34
    const r=await fetch(cfg.api+'/tts',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({text:clean,text_lang:'zh',ref_audio
  • 读取本地文件
    lib/workspace.js:40
    let spec;try{const st=await lstat(manifest);if(!st.isFile()||st.isSymbolicLink()||st.size>32000)throw Error('Invalid local skill manifest');spec=JSON.
  • 读取本地文件
    lib/workspace.js:40
    let spec;try{const st=await lstat(manifest);if(!st.isFile()||st.isSymbolicLink()||st.size>32000)throw Error('Invalid local skill manifest');spec=JSON.
  • 读取本地文件
    lib/workspace.js:41
    if((await lstat(root)).isSymbolicLink()||spec.version!==1||!Array.isArray(spec.skills)||spec.skills.length>32)throw Error('Invalid local skill library
  • 读取本地文件
    lib/workspace.js:42
    const actual=await realpath(root),seen=new Set(),skills=[];
  • 读取本地文件
    lib/workspace.js:46
    if((await lstat(folder)).isSymbolicLink()||path.dirname(await realpath(folder))!==actual)throw Error('Linked skill folder forbidden');
  • 读取本地文件
    lib/workspace.js:46
    if((await lstat(folder)).isSymbolicLink()||path.dirname(await realpath(folder))!==actual)throw Error('Linked skill folder forbidden');
  • 写入本地文件
    lib/workspace.js:65
    async load(){await mkdir(this.data,{recursive:true});try{const v=JSON.parse(await readFile(this.file,'utf8'));if(v.version!==1||!Array.isArray(v.recor
  • 写入本地文件
    lib/workspace.js:66
    async mutate(fn){if(!this.ready)throw new Error('知识与记忆数据未就绪;不会覆盖现有文件');const task=this.queue.then(async()=>{const previous=this.state;const next=struc
  • 写入本地文件
    lib/workspace.js:66
    async mutate(fn){if(!this.ready)throw new Error('知识与记忆数据未就绪;不会覆盖现有文件');const task=this.queue.then(async()=>{const previous=this.state;const next=struc
  • 写入本地文件
    lib/workspace.js:66
    async mutate(fn){if(!this.ready)throw new Error('知识与记忆数据未就绪;不会覆盖现有文件');const task=this.queue.then(async()=>{const previous=this.state;const next=struc
  • 写入本地文件
    lib/workspace.js:82
    persistSnapshots(){if(this.snapshotError)return;const next={version:1,entries:[...this.snapshots]};const task=this.snapshotQueue.then(async()=>{const
  • 写入本地文件
    lib/workspace.js:82
    persistSnapshots(){if(this.snapshotError)return;const next={version:1,entries:[...this.snapshots]};const task=this.snapshotQueue.then(async()=>{const
  • 写入本地文件
    lib/guard.js:60
    try{await mkdir(workspace.data,{recursive:true});await appendFile(path.join(workspace.data,'review-audit.jsonl'),JSON.stringify(audit)+'\n');}catch{re
  • 写入本地文件
    lib/guard.js:60
    try{await mkdir(workspace.data,{recursive:true});await appendFile(path.join(workspace.data,'review-audit.jsonl'),JSON.stringify(audit)+'\n');}catch{re
  • 读取本地文件
    lib/workbench.js:25
    async load(){await mkdir(this.data,{recursive:true});for(const [file,key]of [['workbench.json','config'],['usage.json','usage']])try{const s=JSON.pars
  • 写入本地文件
    lib/workbench.js:25
    async load(){await mkdir(this.data,{recursive:true});for(const [file,key]of [['workbench.json','config'],['usage.json','usage']])try{const s=JSON.pars
  • 写入本地文件
    lib/workbench.js:26
    persist(file,value){const task=this.queue.then(async()=>{const p=path.join(this.data,file),tmp=p+'.'+randomUUID()+'.tmp';await writeFile(tmp,JSON.stri
  • 写入本地文件
    lib/workbench.js:26
    persist(file,value){const task=this.queue.then(async()=>{const p=path.join(this.data,file),tmp=p+'.'+randomUUID()+'.tmp';await writeFile(tmp,JSON.stri
  • 读取本地文件
    lib/workbench.js:45
    async workspaces(){const root=path.join(path.dirname(path.dirname(this.data)),'workspaces'),rows=[];try{for(const e of await readdir(root,{withFileTyp
  • 读取本地文件
    lib/workbench.js:45
    async workspaces(){const root=path.join(path.dirname(path.dirname(this.data)),'workspaces'),rows=[];try{for(const e of await readdir(root,{withFileTyp
  • 读取本地文件
    lib/workbench.js:45
    async workspaces(){const root=path.join(path.dirname(path.dirname(this.data)),'workspaces'),rows=[];try{for(const e of await readdir(root,{withFileTyp
  • 写入本地文件
    lib/workbench.js:46
    async createWorkspace(name='default'){if(typeof name!=='string'||name.length>48||!/^[-a-zA-Z0-9_ 4e00- 9fff ]+$/.test(name)||!name.trim()||/^(?:con|
  • 读取本地文件
    lib/workbench.js:46
    async createWorkspace(name='default'){if(typeof name!=='string'||name.length>48||!/^[-a-zA-Z0-9_ 4e00- 9fff ]+$/.test(name)||!name.trim()||/^(?:con|
  • 读取本地文件
    lib/workbench.js:46
    async createWorkspace(name='default'){if(typeof name!=='string'||name.length>48||!/^[-a-zA-Z0-9_ 4e00- 9fff ]+$/.test(name)||!name.trim()||/^(?:con|
  • 读取本地文件
    lib/wechat.js:44
    async load(){try{const c=JSON.parse(await readFile(path.join(this.data,'wechat.json'),'utf8'));if(c.version!==1||typeof c.enabled!=='boolean'||['cwd',
  • 写入本地文件
    lib/wechat.js:45
    async save(config){await mkdir(this.data,{recursive:true});const p=path.join(this.data,'wechat.json'),tmp=p+'.'+randomUUID()+'.tmp';await writeFile(tm
  • 写入本地文件
    lib/wechat.js:45
    async save(config){await mkdir(this.data,{recursive:true});const p=path.join(this.data,'wechat.json'),tmp=p+'.'+randomUUID()+'.tmp';await writeFile(tm
  • 写入本地文件
    lib/wechat.js:45
    async save(config){await mkdir(this.data,{recursive:true});const p=path.join(this.data,'wechat.json'),tmp=p+'.'+randomUUID()+'.tmp';await writeFile(tm
  • 读取本地文件
    lib/wechat.js:47
    async checkCwd(cwd){if(typeof cwd!=='string'||!path.isAbsolute(cwd)||cwd.length>1200||path.parse(cwd).root===cwd)throw Error('请选择具体工作区');const st=awai
  • 读取本地文件
    lib/wechat.js:47
    async checkCwd(cwd){if(typeof cwd!=='string'||!path.isAbsolute(cwd)||cwd.length>1200||path.parse(cwd).root===cwd)throw Error('请选择具体工作区');const st=awai
  • 读取本地文件
    lib/wechat.js:48
    async configure(payload){const {cwd,enabled,shareMemory=this.config.shareMemory}=payload;let allowedCwds=Object.hasOwn(payload,'allowedCwds')?payload.
  • 读取本地文件
    lib/wechat.js:48
    async configure(payload){const {cwd,enabled,shareMemory=this.config.shareMemory}=payload;let allowedCwds=Object.hasOwn(payload,'allowedCwds')?payload.
  • 读取本地文件
    lib/wechat.js:98
    const validate=async id=>{active();if(!this.config.enabled)throw Error('微信通道已停用');if(!this.owns(id))throw Error('此会话不属于微信通道,请在微信使用 /new');const cwd=aw
  • 读取本地文件
    lib/intelligence.js:26
    async load(){await mkdir(this.data,{recursive:true});try{const s=JSON.parse(await readFile(path.join(this.data,'intelligence.json'),'utf8'));if(s.vers
  • 写入本地文件
    lib/intelligence.js:26
    async load(){await mkdir(this.data,{recursive:true});try{const s=JSON.parse(await readFile(path.join(this.data,'intelligence.json'),'utf8'));if(s.vers
  • 写入本地文件
    lib/intelligence.js:27
    async mutate(fn){const job=this.queue.then(async()=>{if(!this.ready)throw Error('能力配置未就绪');const next=structuredClone(this.config);await fn(next);cons
  • 写入本地文件
    lib/intelligence.js:27
    async mutate(fn){const job=this.queue.then(async()=>{if(!this.ready)throw Error('能力配置未就绪');const next=structuredClone(this.config);await fn(next);cons
  • 读取本地文件
    lib/thinking.js:20
    async load(){try{const raw=await readFile(this.file,'utf8');if(raw.length>12_000_000)throw new Error('思考数据过大');const parsed=JSON.parse(raw);if(parsed.
  • 写入本地文件
    lib/thinking.js:23
    async save(next){await mkdir(this.root,{recursive:true});const text=JSON.stringify(next,null,2);if(text.length>10_000_000)throw new Error('思考数据达到容量上限,
  • 写入本地文件
    lib/thinking.js:23
    async save(next){await mkdir(this.root,{recursive:true});const text=JSON.stringify(next,null,2);if(text.length>10_000_000)throw new Error('思考数据达到容量上限,
  • 写入本地文件
    lib/thinking.js:23
    async save(next){await mkdir(this.root,{recursive:true});const text=JSON.stringify(next,null,2);if(text.length>10_000_000)throw new Error('思考数据达到容量上限,
  • 写入本地文件
    lib/model-access.js:7
    async load(){await mkdir(path.dirname(this.file),{recursive:true});try{const s=JSON.parse(await readFile(this.file,'utf8'));if(!s||Object.keys(s).some
  • 读取本地文件
    lib/model-access.js:7
    async load(){await mkdir(path.dirname(this.file),{recursive:true});try{const s=JSON.parse(await readFile(this.file,'utf8'));if(!s||Object.keys(s).some
  • 写入本地文件
    lib/model-access.js:10
    set({provider,model,enabled}){const job=this.queue.then(async()=>{if(!this.ready)throw Error('模型调用开关尚未就绪');if(!id(provider)||model!==undefined&&!id(mo
  • 写入本地文件
    lib/model-access.js:10
    set({provider,model,enabled}){const job=this.queue.then(async()=>{if(!this.ready)throw Error('模型调用开关尚未就绪');if(!id(provider)||model!==undefined&&!id(mo
  • 读取本地文件
    lib/check-public.js:9
    const tar=gunzipSync(await readFile(file),{maxOutputLength:1_000_000});const seen=new Set();let cursor=0;
  • 读取本地文件
    lib/check-public.js:12
    const content=tar.subarray(cursor+512,cursor+512+size),source=await readFile(path.join(root,relative));if(createHash('sha256').update(content).digest(
  • 读取本地文件
    lib/check-public.js:18
    async function walk(dir){for(const name of await readdir(dir)){if(name==='.gitignore'||name==='node_modules'||name==='test'||name==='.market'||name===
  • 读取本地文件
    lib/check-public.js:18
    async function walk(dir){for(const name of await readdir(dir)){if(name==='.gitignore'||name==='node_modules'||name==='test'||name==='.market'||name===
  • 读取本地文件
    lib/check-public.js:18
    async function walk(dir){for(const name of await readdir(dir)){if(name==='.gitignore'||name==='node_modules'||name==='test'||name==='.market'||name===
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

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

原生 DSH 界面、动效、有界上下文召回、按范围生效的技能与智能体协作。

README

由 DeepSeek 最新模型翻译生成
Stronger DSH DeepSeek Harness 原生界面与能力扩展。黑、白、淡灰和少量淡紫,轻圆角、纯色、轻阴影。复用 DSH 的模型、订阅、设置、会话、插件、原生压缩和权限系统。 需要 Node 24 和 DSH >=0.2.1-rc.3 <0.3.0-0。为兼容现有本机配置,内部包名仍为 dsh-ui-stronger。只安装一份;不要与同包的旧版本并存。 安装与发现 从 Releases 下载 .tgz,在终端使用 DSH 原生 CLI: dsh plugin --profile desktop add <归档的绝对路径> 也可直接安装当前预构建包: dsh plugin --profile desktop add https://github.com/liyuxuan20111101/stronger-dsh/releases/download/v0.18.14/dsh-ui-stronger-0.18.14.tgz 安装后正常重启 DSH。依赖仍从 npm 解析,并非完全离线。已有本机设置保留。
展开完整文档(README 剩余 1 节)
Stronger DSH

DeepSeek Harness 原生界面与能力扩展。黑、白、淡灰和少量淡紫,轻圆角、纯色、轻阴影。复用 DSH 的模型、订阅、设置、会话、插件、原生压缩和权限系统。

需要 Node 24 和 DSH >=0.2.1-rc.3 <0.3.0-0。为兼容现有本机配置,内部包名仍为 dsh-ui-stronger。只安装一份;不要与同包的旧版本并存。

安装与发现

从 Releases 下载 .tgz,在终端使用 DSH 原生 CLI:

dsh plugin --profile desktop add <归档的绝对路径>

也可直接安装当前预构建包:

dsh plugin --profile desktop add https://github.com/liyuxuan20111101/stronger-dsh/releases/download/v0.18.14/dsh-ui-stronger-0.18.14.tgz

安装后正常重启 DSH。依赖仍从 npm 解析,并非完全离线。已有本机设置保留。

在 DSH 自定义插件发现源中添加:

https://raw.githubusercontent.com/liyuxuan20111101/stronger-dsh/main/.market/index.json

备用:https://cdn.jsdelivr.net/gh/liyuxuan20111101/stronger-dsh@main/.market/index.json。CDN 可能缓存旧索引。自定义源与社区默认目录的收录是两件事,默认目录须另经维护者评审。

界面与动效

- 原生启动加载层在客户端脚本前出现,在连接和输入界面实际就绪后退出,可隐藏或关闭,异常时最多保留 20 秒。
- 统一导航与一个扩展入口,保留原生模型、插件和设置。可编辑工作模块,提示词模块只准备草稿。
- 有界消息入场、页面切换、控件回应;批量历史不逐条飞入,同一时刻最多 6 个插件 Web Animations。隐藏窗口或减少动效时停止相关动画。
- 可选本机静态图、GIF、MP4/WebM 背景,背景不进入模型上下文;视频静音,隐藏或关闭动效时暂停。解码能力受宿主限制。
- 部分界面选择器依赖当前 DSH 版本,宿主升级可能需要适配。关闭插件可恢复宿主界面。

上下文、记忆与用量

扩展 → 上下文与模型。使用原生 Token Meter,显示原生可提供的占用、成分和模型用量。未报告的 usage/cache 显示未知,订阅用量不按固定价格冒充账单。

「立即压缩」执行原生 /compact。可跟随 DSH、自动管理或仅手动。自动管理阈值 50%–90%,最近原文目标可选 8K/16K/32K/64K;实际预算仍受输出预留、完整消息和工具配对影响,目标并非硬截断。跟随 DSH 保留宿主策略。压缩本身也会调用模型。

长期记忆使用有界、冻结的会话快照与按需原文召回,参考 Hermes memory。新记忆先待确认,支持编辑和归档;人设不能授予工具权限。冻结前缀减少无谓变化,原始会话不因本插件检索而删除。

workspace_archive 在本会话默认返回 4 条短命中,完整原文通过 seq/digest/offset 分页补读。跨会话 workspace_history 须显式开启,限定当前工作区与通道,最多 512 个候选会话、每页 4,800 事件、默认 6 命中;游标可继续查更早内容。原文分页每次最多 2,400 字符,校验内容版本,不返回思考、工具输出或合成指令。

摘要和检索结果是参考资料,不是授权。没有无损多月记忆、固定 token 节省或固定缓存命中率保证。更精确的细节需要补读原句。

技能、知识库与角色

- / 或模型按需使用已启用的原生技能;技能页支持开关、自建、编辑、停用、恢复和删除。模型从已验证的重复/纠错流程提出草稿,用户确认后才能启用。
- 按需技能包括任务交接、技能固化、资料检索、谨慎修改、角色协作、可信核验、时间与来源整理等。技能内容不能扩大权限。
- 知识库仅索引用户主动接入的本机 Markdown/TXT/CSV/JSON 文件夹;命中附文件和行号。模型调用时,选中的片段会发送给当前服务商。不要接入密钥目录。
- 主/子角色可配置名称、职责、技能名和现有模型。workspace_team 使用 DSH 原生子会话,任务/角色快照本机持久化,可设验收要求、前置依赖和幂等 key,每父会话最多两个活跃子任务。
- 协作页展示真实任务状态和消息回执。message/inbox/ack 支持同一父任务内的本机消息;消息按需读取,不自动唤醒空闲模型。依赖门禁核对前置任务正常结束,结果验收仍由主智能体负责,不是无人值守 DAG 调度器。
- workspace_world time 返回主机时间与 IANA 时区,不冒充网络授时;evidence 将调用方提供的来源整理为 JSON/摘录哈希,并标明未独立核验。它本身不搜索或抓网页,/world-research 引导复用 DSH 已有联网工具。X/YouTube 仍受真实访问权限与字幕可用性限制。

微信、语音与桌宠

微信接入复用锁定的 ClawBot 依赖,只接受绑定账号本人,工作区白名单可配置,桌面/微信长期记忆默认隔离,可显式共享。已有图文顺序、多图与回复分段路径保留;适配器检查分段、字节预算、编码和媒体文件头。真实微信收发须在自己的账号上验收;跨消息聚合和持久出站重放未实现。

语音与桌宠是可选本机接入功能。公开包不提供任何角色图片、音频、语音模型权重、私人偏好或人设内容。未接入时普通聊天和界面增强照常可用。通过扩展里的语音/桌宠入口选择自己的合法本机资源;不要把资源提交到代码仓库。

安全边界

执行前先核对真实当前参数、工作目录和人类指示,最新限制优先;审查出错、取消、格式错误、授权缺失或参数变化时拒绝。历史工具记录只传身份摘要,依赖被省略的代码或数据、无法判断时仍须补查,不能凭哈希推断安全。实际执行门会使陈旧批准失效,原生权限拒绝仍然有效。

这是额外的执行审查层,不是操作系统沙箱,无法隔离恶意原生插件。停用插件会移除此附加层;审查和独立子任务会增加模型请求、等待和用量。网页、记忆、人格、技能与子智能体消息不能授予新的用户授权。

所有个人配置、记忆、角色与知识索引保留在本机 DSH 数据目录;使用模型、联网或微信时,相关任务数据仍会按你配置的服务商/通道发送。请按任务选择最小必要资料。

开发与验证

npm ci --ignore-scripts
npm test
node lib/check-public.js
npm pack --ignore-scripts

当前 125 项回归覆盖范围包括工作区/通道隔离、原文分页、审批失效、技能管理、原生适配协议与动效调度。已在隔离 DSH 和本机合成模型上验证协作链路及界面;这不等于真实模型质量、真实微信收发、多月记忆或付费 token/缓存基准。发布包使用明确的 20 文件白名单,并逐文件核对归档。

Source and releases contain code and synthetic tests only. MIT license. Issues: stronger-dsh/issues.

Windows 电脑操作

模型和用户可调用 /computer-use。通过 Windows UI Automation 读取最多 400 个非密码控件,操作绑定当前会话 30 秒内观察;支持标准按钮 Invoke 与文本框 ValuePattern。所有调用走执行前审查,本机桌面以外通道拒绝。修改后重新观察核验;超时或失效不自动重试。可在技能管理停用。不包含截图视觉、坐标点击或虚拟桌面隔离;自绘界面需宿主其他工具。参考微软 UFO 的 UIA 优先与观察/执行/验证分层思路,未复制其源码。

0.18.6 更新

- 6px 控件 / 10px 面板轻圆角;统一折面标志和导航图标,黑白灰与少量淡紫。
- 启动画面使用更轻的轨道与低对比背景,工作区实际就绪即退出;后台暂停,减少动效时不旋转。
- 本机技能库接入:在 DSH_HOME/plugins-data/dsh-ui-stronger/skill-library/ 下放置 index.json 与各技能资源。索引格式为 {"version":1,"skills":[{"name":"my-skill","description":"适用场景"}]},每项对应同名目录内的 SKILL.md。完整脚本与引用文件由用户自行存放。正常重启后,技能可在现有管理页启停,并由用户或模型按需调用;正文不常驻上下文。技能仍受原有执行审查限制。
- ClawBot 并发创建会话串行化,避免归属映射丢失;空消息校验与输入中提示更完善。已有多图/多段能力保持,图片数量和大小仍服从宿主限制。
- 更自然的对话承接与微信短段落策略,尊重用户人设,不编造经历、记忆、图像内容或完成状态。

公开包只提供本机技能库接口,不附用户导入的技能资源、训练记录、语音、桌宠、人设或知识资料。105 项回归通过;实际模型语气、微信收发和长期记忆效果仍取决于所用模型与宿主,不能将本机合成测试视为这些效果的保证。

0.18.7 修复

- 兼容 Windows 编辑器保存的带 BOM 技能索引和技能说明。
- 微信连接停用或重新配置后,丢弃旧连接的迟到初始化与会话创建结果。
- 微信面板定时刷新状态,后台跳过、请求去重,关闭面板后不回写旧结果。
- 技能库加载失败时显示原因。

109 项回归通过。此版没有扩展 Windows 系统托盘菜单;当前 DSH 宿主未向普通插件开放相应接口。

0.18.8:减少模板化表达

所谓「AI 味」常混合了固定开场/总结、无依据的迎合、把闲聊写成工作报告、泛泛的共情及生硬的人设表演。它不是一个可用词表可靠检测的单一指标。关于模型迎合倾向的研究指出,偏好训练可能鼓励迎合用户观点;本插件不能改变基础模型权重。

插件侧发现的具体诱因是连续性提示一直要求报告动作、依据、验证和缺口,容易把本应按任务需要使用的汇报习惯扩大到普通聊天。现已明确区分闲聊和实际操作的汇报需求,保留事实和安全边界。

扩展 → 人设 → 表达方式:自然表达(默认)、精炼直接、跟随模型。最后一个选项完全不注入本插件的表达提示。选择只改变后续表达引导,不修改用户人设或记忆内容;子智能体与隔离来源不注入此风格提示,JSON/代码/训练协议仍优先。

不会增加一次润色模型调用,不改写最终消息、删减引用或模拟真人经历;提示在同一偏好和通道下稳定,不逐轮增加随机规则。111 项结构、持久化、隔离及既有功能回归通过,另在隔离 DSH 中验证三种选项保存。尚未做真实模型的盲评或跨模型量化比较;实际语气改善取决于模型和当前任务,不能保证消除所有模板化表达。

0.18.9:交互动效

- 扩展面板 270ms 短距离侧移入场,遮罩 180ms 淡入;搜索面板 220ms 轻移入场。
- 扩展页 230ms 内容切换,退出 180ms,按钮按下/悬停与开关反馈更明确。
- 新内容 230ms 入场,错峰延迟最多 60ms;Web Animations 并发仍最多 6 个,批量历史超过 12 候选时跳过,流式同节点不反复重播。
- 后台和减少动态效果时暂停/取消;动效总开关关闭后新增动画不生效。退出期间保留遮罩以避免点击穿透。启动加载仍在真实就绪后退出,不添加人为展示等待。

113 项回归通过;在隔离 DSH 中核对真实计算样式及开关停止动画,未测量 GPU 帧率或进行跨设备性能基准。配色、功能布局、人设和模型设置不因本轮动效更新改变。

0.18.10:统一选择菜单

选择菜单沿用界面的灰白/深灰底色、淡紫选中态、细边框与小圆角;选项留白及分组更清晰。保留原生键盘、表单与辅助技术语义,不增加重复入口。支持可定制 select 的内核使用主题弹层;旧内核保留原生菜单,不保证消除系统高亮色。多选和列表框不改变。

修复展开原生选择列表时 Esc 同时关闭外层扩展面板的问题。114 项回归通过;菜单样式通过隔离 DSH 实测。纯样式增强依据 Chrome 可定制选择控件。

0.18.11:插件互操作与渠道错误说明

- 优先返回原生模型目录,保留其他插件附加的字段、参数及接收对象;原生目录超时或失败时,才用有界适配器发现兜底。安装时不主动刷新目录。
- 模型目录与上下文压缩包装器卸载后透明转发,避免破坏后装插件保留的调用链;压缩跟随宿主且未配置路由时,不再创建配置代理。
- 通用控件、ARIA 弹层和选择菜单样式限制在本插件面板内;保留特定宿主布局样式与整体主题,减少对其他插件自有控件的强制覆盖。
- 当前原生回合结束记录含 11128 渠道拒绝时,过程面板展示固定说明。不会回显原始报错、密钥或请求体,不改写模型请求或客户端身份,不自动重试渠道拒绝。

119 项回归通过;隔离 DSH 检查模型目录、原生供应商设置与菜单。另用合成外部插件样式验证其字体、圆角、菜单阴影和原生选择框保持独立。这不表示所有第三方插件或实际供应商渠道均已验收。原生上游错误仍在 DSH 会话记录中保留,过程说明不替代其原始证据。

HTTP 400 / 11128

Illegal API invocation from an unapproved channel 表示上游拒绝当前接入渠道。仅凭此错误不能判定具体适配器、账号状态或请求片段,缩短上下文及反复重发通常不能解决。请在 DSH 原生模型设置核对供应商及接入方式,查阅适配器支持范围,或改用允许当前客户端接入的 API。已有渠道插件上游报告记录同类拒绝,但不证明你的请求具有完全相同的触发条件。

插件不伪装官方客户端、不隐藏客户端身份、不绕过上游访问限制。多插件同时调整同一个模型路由、上下文策略或主界面仍可能冲突,建议只保留一个策略来源。

0.18.12:目录重载兜底

供应商插件重载时若目录读取同步抛错,超时兜底也能正常拒绝并返回固定提示,不产生未捕获定时器异常、不回显适配器原始敏感错误;同一次调用只启动一次兜底。新增专项回归,完整 120 项通过。0.18.11 已发行记录保留,当前推荐安装 0.18.12。

0.18.13:文字对齐与排版节奏

统一扩展面板内文字按钮的水平/垂直居中与 20px 行高;表单标签与控件采用 6px 间距、统一左边界。说明文字提高到 11px 并减小字距,长说明和勾选项自然换行。侧栏常用导航采用 13px/20px 节奏,工作区分组 12px,保持原有主题配色、功能及动效。

120 项回归通过;隔离 DSH 实测角色表单、技能页,480px/360px 窗口无横向溢出或按钮文字裁切。仅调整本插件面板及特定宿主导航类,不新增功能或覆盖第三方插件通用样式;不声称所有宿主/第三方页面都已逐一验收。

0.18.14:ClawBot 原生协作与错误回传

- 微信主会话可调用原生 workspace_team 分发任务、并行子智能体与查看状态,同一主任务最多两个并行。未配置子角色时提供通用助手,已有停用角色不会被重新启用。
- 回复包含子任务运行/完成/失败概况;子任务后续失败可向绑定本人通知。仅关联受信任的原生子会话,工作区越界、其他会话和停用后的事件不回传。
- 失败时显示阶段、HTTP/错误码、请求编号和可用原因,过滤凭据、私人路径及请求内容。上游未提供的细节不会编造;需要新增权限的审批仍在桌面处理。
- 修复宿主事件订阅返回空值时 ClawBot 管理器启动不兼容的问题。

125 项回归通过,包括真实 ClawBot 管理器配合模拟微信传输、两个模拟原生子智能体的集成测试。没有通过本次测试发送真实微信消息或调用付费模型;实际微信收发仍需账号侧验收。
预览分享卡片长什么样 ↓nothurry/stronger-dsh
分享 · DeepSeek Harness Hub
nothurry/stronger-dsh

为原生界面加上动效、背景与上下文记忆管理

这是你的仓库?认领条目

回到顶部