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

常驻助理团队 Nothing1024/dsh-bot

Cordisv0.1.0
Nothing102431 天前有提交已提供中文文档扫描:含敏感能力

管理多人设助理,私聊或组队协作讨论

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

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

自动兼容检查未通过:缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装。以下命令仍可尝试,但可能失败。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Nothing1024/dsh-bot
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

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

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

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

缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装

展开查看检查明细 ↓

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

✓npm 包dsh-bot @ 0.1.0
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✗入口文件缺少入口声明

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

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/31 17:45:07

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

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

读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 78 处,展示前 66 条)
  • 写入本地文件
    packages/dsh-bot-host/src/bots.ts:452
    await mkdir(join(home, 'dsh-bot'), { recursive: true })
  • 读取本地文件
    packages/dsh-bot-host/src/bots.ts:454
    const raw = await readFile(file, 'utf8')
  • 写入本地文件
    packages/dsh-bot-host/src/bots.ts:567
    await mkdir(dir, { recursive: true })
  • 写入本地文件
    packages/dsh-bot-host/src/bots.ts:571
    await writeFile(tmp, `${JSON.stringify(body, null, 2)}\n`, 'utf8')
  • 写入本地文件
    packages/dsh-bot-host/src/bots.ts:572
    await rename(tmp, file)
  • 写入本地文件
    packages/dsh-bot-host/src/groups.ts:226
    await mkdir(dirname(file), { recursive: true })
  • 写入本地文件
    packages/dsh-bot-host/src/groups.ts:228
    await writeFile(tmp, `${JSON.stringify(body, null, 2)}\n`, 'utf8')
  • 写入本地文件
    packages/dsh-bot-host/src/groups.ts:229
    await rename(tmp, file)
  • 写入本地文件
    packages/dsh-bot-host/src/groups.ts:233
    await mkdir(dirname(file), { recursive: true })
  • 写入本地文件
    packages/dsh-bot-host/src/groups.ts:235
    await writeFile(tmp, body, 'utf8')
  • 写入本地文件
    packages/dsh-bot-host/src/groups.ts:236
    await rename(tmp, file)
  • 读取本地文件
    packages/dsh-bot-host/src/groups.ts:279
    if (!existsSync(file)) return []
  • 读取本地文件
    packages/dsh-bot-host/src/groups.ts:282
    raw = await readFile(file, 'utf8')
  • 读取本地文件
    packages/dsh-bot-host/src/groups.ts:327
    if (!existsSync(file)) return []
  • 读取本地文件
    packages/dsh-bot-host/src/groups.ts:330
    raw = await readFile(file, 'utf8')
  • 读取本地文件
    packages/dsh-bot-host/src/groups.ts:411
    if (!existsSync(file)) return undefined
  • 读取本地文件
    packages/dsh-bot-host/src/groups.ts:412
    const raw = await readFile(file, 'utf8')
  • 删除本地文件
    packages/dsh-bot-host/src/groups.ts:516
    await rm(roomFilePath(home, room.roomId), { force: true })
  • 删除本地文件
    packages/dsh-bot-host/src/groups.ts:583
    await rm(roomFilePath(home, roomId), { force: true })
  • 读取本地文件
    packages/dsh-bot-host/src/marks-cache.ts:26
    const info = await stat(path)
  • 写入本地文件
    packages/dsh-bot-host/src/memory.ts:99
    await writeFile(join(dir(botId), PROFILE_FILE), serializeProfile(rows), 'utf8')
  • 写入本地文件
    packages/dsh-bot-host/src/memory.ts:109
    await writeFile(join(dir(botId), LOG_FILE), serializeLog(rows), 'utf8')
  • 写入本地文件
    packages/dsh-bot-host/src/memory.ts:141
    await appendFile(join(dir(botId), LOG_FILE), serializeLog([entry]), 'utf8')
  • 删除本地文件递归
    packages/dsh-bot-host/src/memory.ts:179
    await rm(dir(botId), { recursive: true, force: true })
  • 读取本地文件
    packages/dsh-bot-host/src/memory.ts:352
    return await readFile(path, 'utf8')
  • 写入本地文件
    packages/dsh-bot-host/src/memory.ts:361
    await mkdir(dir, { recursive: true })
  • 写入本地文件
    packages/dsh-bot-host/src/peers.ts:54
    await mkdir(dirname(file), { recursive: true })
  • 写入本地文件
    packages/dsh-bot-host/src/peers.ts:55
    await appendFile(file, `${JSON.stringify(row)}\n`, 'utf8')
  • 读取本地文件
    packages/dsh-bot-host/src/peers.ts:60
    if (!existsSync(file)) return []
  • 读取本地文件
    packages/dsh-bot-host/src/peers.ts:61
    const raw = await readFile(file, 'utf8')
  • 读取本地文件
    packages/dsh-bot-host/src/roster-layout.ts:58
    if (!existsSync(file)) return DEFAULT_SECTIONS.map(row => ({ ...row }))
  • 读取本地文件
    packages/dsh-bot-host/src/roster-layout.ts:60
    const parsed = JSON.parse(await readFile(file, 'utf8')) as { sections?: unknown }
  • 写入本地文件
    packages/dsh-bot-host/src/roster-layout.ts:80
    await mkdir(dirname(file), { recursive: true })
  • 写入本地文件
    packages/dsh-bot-host/src/roster-layout.ts:81
    await writeFile(file, `${JSON.stringify({ version: 1, sections }, null, 2)}\n`, 'utf8')
  • 读取本地文件
    packages/dsh-bot-host/src/routines.ts:136
    if (!existsSync(file)) return []
  • 读取本地文件
    packages/dsh-bot-host/src/routines.ts:138
    const raw = await readFile(file, 'utf8')
  • 写入本地文件
    packages/dsh-bot-host/src/routines.ts:144
    await rename(file, bak)
  • 写入本地文件
    packages/dsh-bot-host/src/routines.ts:154
    await mkdir(dirname(file), { recursive: true })
  • 写入本地文件
    packages/dsh-bot-host/src/routines.ts:156
    await writeFile(tmp, `${JSON.stringify(rows, null, 2)}\n`, 'utf8')
  • 写入本地文件
    packages/dsh-bot-host/src/routines.ts:157
    await rename(tmp, file)
  • 读取本地文件
    packages/dsh-bot-host/src/session-voice-store.ts:24
    await access(file)
  • 写入本地文件
    packages/dsh-bot-host/src/session-voice-store.ts:29
    await mkdir(dirname(file), { recursive: true })
  • 写入本地文件
    packages/dsh-bot-host/src/session-voice-store.ts:30
    await writeFile(file, `${text}\n`, 'utf8')
  • 读取本地文件
    packages/dsh-bot-host/src/session-voice-store.ts:36
    const raw = await readFile(fileOf(id), 'utf8')
  • 读取本地文件
    packages/dsh-bot-host/src/workbench-routes.ts:207
    const info = await stat(file)
  • 读取本地文件
    packages/dsh-bot-host/src/workbench-routes.ts:216
    const body = await readFile(file)
  • 发起网络请求
    packages/workbench-ui/src/api.ts:94
    response = await fetch(`/dsh-bot/${method}`, {
  • 写入剪贴板
    packages/workbench-ui/src/jump.ts:23
    await clipboard.writeText(sessionId)
  • 读取本地文件
    standards/validate.mjs:213
    if (!existsSync(dir)) return out
  • 读取本地文件
    standards/validate.mjs:214
    for (const entry of readdirSync(dir)) {
  • 读取本地文件
    standards/validate.mjs:216
    const st = statSync(p)
  • 读取本地文件
    standards/validate.mjs:247
    for (const pkg of readdirSync(PACKAGES_DIR)) {
  • 读取本地文件
    standards/validate.mjs:249
    if (!existsSync(srcDir) || !statSync(srcDir).isDirectory()) continue
  • 读取本地文件
    standards/validate.mjs:249
    if (!existsSync(srcDir) || !statSync(srcDir).isDirectory()) continue
  • 写入本地文件
    standards/validate.mjs:369
    writeFileSync(BASELINE_PATH, JSON.stringify({
  • 发起网络请求
    work/bot-production-smoke.mjs:3
    const pages = await (await fetch('http://127.0.0.1:9230/json/list')).json()
  • 写入本地文件
    work/bot-production-smoke.mjs:124
    } finally { await writeFile('work/bot-production-smoke-result.json',JSON.stringify({...result,errors},null,2));ws.close() }
  • 发起网络请求
    work/bot-real-browser.mjs:2
    const pages = await (await fetch('http://127.0.0.1:9230/json/list')).json()
  • 读取本地文件
    work/bot-real-browser.mjs:11
    const log = await readFile('/tmp/dsh-bot-implementation-gateway.log', 'utf8')
  • 写入本地文件
    work/bot-real-browser.mjs:21
    await writeFile('/tmp/dsh-bot-production.png', Buffer.from(shot.data, 'base64'))
  • 发起网络请求
    work/bot-visibility-smoke.mjs:3
    const pages = await (await fetch('http://127.0.0.1:9230/json/list')).json()
  • 写入本地文件
    work/bot-visibility-smoke.mjs:64
    await writeFile('work/bot-visibility-smoke-result.json',JSON.stringify({...result,errors},null,2))
  • 写入剪贴板
    work/sidebar-ui-migration-bundle/prototype.iife.js:55
    `))},a))}return(0,z.jsx)(`div`,{className:`md`,children:n})}function rn(e){if(e===void 0)return;let t=e.trim().match(/^ agent *来自 *(.+?):/u)?.[1]
  • 发起网络请求
    work/sidebar-ui-migration-check.mjs:3
    const pages = await (await fetch('http://127.0.0.1:9228/json/list')).json()
  • 写入本地文件
    work/sidebar-ui-migration-check.mjs:33
    await writeFile(`/tmp/migration-theme-${theme}.png`, Buffer.from(shot.data, 'base64'))
  • 写入本地文件
    work/sidebar-ui-migration-check.mjs:111
    await writeFile(`/tmp/migrated-components-${width}.png`, Buffer.from(shot.data, 'base64'))
扫描于 2026/11/2(1 天前) · 范围 全包扫描 · 来源 GitHub 仓库

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

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

界面预览

1 张 · 点击查看大图

README

由 DeepSeek 最新模型翻译生成
DSH Bot 为 DeepSeek Shell 提供常驻对话能力的插件 管理多个 AI 人设,让它们独立对话或小组协作,构建属于你的 AI 助理团队。 依赖插件: dsh-session-tool(原 session-tool)。会话创建、标记和隐藏都走它。 为什么需要 DSH Bot DeepSeek Shell 本身提供强大的 agent 能力,但缺少「常驻助理」的概念。DSH Bot 填补了这个空白: - 始终在线 - 不用每次重新创建会话,助理一直在那里等你 - 多人设管理 - 为不同场景创建专门的助理(工作、生活、技术、创意...) - 团队协作 - 让多个助理在小组中讨论同一个问题,获得多角度视角 - 跨会话记忆 - 助理记住你们之间的对话,形成长期的工作关系 - 程序化调用 - 其他 agent 可以通过 dsh_bot_ask 委托 bot 处理任务 核心功能 工作台界面:左侧管理多个人设,右侧进行对话 人设管理 在工作台左侧创建和管理多个 AI 助理,每个都有独立的: - 人设描述(决定对话风格和专业领域) - 头像标识(emoji 或首字母色块) - 专属模型配置(可选,否则跟随全局设置) - 跨会话记忆(自动积累对话历史中的重要信息) 人设分组管理:置顶、工作、生活 三个默认组,可拖拽移动。
展开完整文档(README 剩余 1 节)
DSH Bot

为 DeepSeek Shell 提供常驻对话能力的插件

管理多个 AI 人设,让它们独立对话或小组协作,构建属于你的 AI 助理团队。

依赖插件: dsh-session-tool(原 session-tool)。会话创建、标记和隐藏都走它。

为什么需要 DSH Bot

DeepSeek Shell 本身提供强大的 agent 能力,但缺少「常驻助理」的概念。DSH Bot 填补了这个空白:

- 始终在线 - 不用每次重新创建会话,助理一直在那里等你
- 多人设管理 - 为不同场景创建专门的助理(工作、生活、技术、创意...)
- 团队协作 - 让多个助理在小组中讨论同一个问题,获得多角度视角
- 跨会话记忆 - 助理记住你们之间的对话,形成长期的工作关系
- 程序化调用 - 其他 agent 可以通过 dsh_bot_ask 委托 bot 处理任务

核心功能

工作台界面:左侧管理多个人设,右侧进行对话

人设管理

在工作台左侧创建和管理多个 AI 助理,每个都有独立的:
- 人设描述(决定对话风格和专业领域)
- 头像标识(emoji 或首字母色块)
- 专属模型配置(可选,否则跟随全局设置)
- 跨会话记忆(自动积累对话历史中的重要信息)

人设分组管理:置顶、工作、生活 三个默认组,可拖拽移动。

1:1 私聊

点击某个人设进入专属对话界面:
- 所有对话历史都在这个人设下
- 右上角切换该人设的不同会话主题
- 消息右键「📌 记住这条」添加到长期记忆
- 会话头点击「🧠」查看和管理记忆内容

小组讨论

创建 2-6 人的小组,让多个人设协作讨论:

你:我们应该用 React 还是 Vue 做这个项目?

[第一轮] 前端工程师:从技术栈成熟度看,React 生态更丰富... 架构师:考虑团队熟悉度和长期维护成本... 项目经理:建议先做原型验证,两周内决定...

[第二轮] 前端工程师:@项目经理 原型可以用 Vite 快速搭建... 架构师:同意,技术选型应该基于实际验证...

讨论机制:
- 默认 3 轮讨论(可在小组设置中调整)
- 支持 @ 点名特定成员
- 引用某成员的消息时,该成员优先回应
- 讨论进行中发送的新消息会自动排队
- 点击「让他们继续聊」可以不发新消息让讨论继续

定时例程

为任何 bot 设置定时任务:
- 每天特定时间(支持时区设置)
- 每小时整点
- 自定义间隔(分钟)
- 高级 cron 表达式

到点后 bot 在专门的「例程 · 名称」线程里自动执行,没事干就回复 (silent),有事才落消息。窗口失焦时会触发系统通知。

Bot 间通信

Bot 可以通过 dsh_bot_send({toBot, text}) 工具给其他 bot 发消息:
- 发件人立刻收到 {accepted: true} 确认
- 收件人在「来自 <发件人名>」会话中处理
- 每 bot 每分钟限 3 条,防止消息轰炸
- 工作台「同事」页查看发送记录

委托工具

任何 DSH agent 都可以通过 dsh_bot_ask 委托 bot 处理任务:

// 在任何 agent 中调用 const result = await dsh_bot_ask({ message: "帮我分析这段代码的性能瓶颈", context: codeSnippet });

委托创建的会话默认隐藏(标题带 ~ 前缀),工作台需开启「包含隐藏」才显示。

快速开始

安装和启动

安装依赖
pnpm install

构建项目
pnpm run build

设置环境(第一次或配置变更后) sh env/setup.sh

启动服务 sh env/boot.sh

启动后访问:
- 主页:http://127.0.0.1:3084
- 工作台:http://127.0.0.1:3084/dsh-bot/ui

也可以在 DSH 官方 GUI 顶栏点击「Bot」进入工作台。

运行测试

完整测试(包含模型调用) bash scripts/manual-test.sh

只测配置和会话创建(不调用模型) bash scripts/manual-test.sh --no-write

测试覆盖:会话创建、委托工具、模型配置、标记查询、工作台 CRUD 操作。

配置

模型设置

Bot 默认使用 DSH 全局模型配置。如需为 bot 指定专属模型,在 settings 中配置:

dsh-bot:
model:
provider: deepseek
model: deepseek-chat
reasoningEffort: high # 可选

留空则完全跟随全局配置。配置变更热生效,无需重启服务。

记忆系统

默认启用自动记忆抽取。关闭方法:

dsh-bot:
memory:
enabled: false

记忆存储在 $DSH_HOME/dsh-bot/memory/<botId>/:
- profile.md - 长期事实
- log.jsonl - 时间线日志

项目架构

dsh-bot/
├── packages/
│ ├── tool-dsh-bot/ # 委托工具定义 │ ├── ui-dsh-bot/ # 官方 GUI 集成 │ ├── dsh-bot-host/ # 主服务:RPC、SSE、路由 │ ├── workbench-ui/ # 工作台前端(React) │ └── dsh-bot-shared/ # 共享类型和工具 ├── env/ # 独立的 DSH_HOME │ ├── dsh-bot/ # bot 注册表、小组、记忆 │ └── session-tool/ # 会话标记 ├── scripts/ │ └── manual-test.sh # 集成测试 ├── standards/ # 社区标准对齐 └── docs/ # 设计文档

开发指南

本地开发

类型检查
pnpm run typecheck

运行单元测试
pnpm test

监视模式
pnpm test:watch

社区标准检查
pnpm run standard:check

调试

用 dsh-plugin-debug skill 查看内部状态:

确认服务身份 ~/.agents/skills/dsh-plugin-debug/scripts/dsh-rpc-who.sh 3084

查看插件列表 ~/.agents/skills/dsh-plugin-debug/scripts/dsh-rpc.sh 3084 pluginInventory/list

查询会话标记

依赖插件: dsh-session-tool(原 session-tool)。下面的路径是本机邻仓目录,仓库名已是 dsh-session-tool。

DSH_HOME="$PWD/env" node ../../session-tool/plugin/packages/session-tool-cli/lib/bin.js marks list --mark app:dsh-bot

技术说明

会话管理

用 dsh-session-tool 管理会话,标记为 app:dsh-bot(过渡期双写 kind:dsh-bot)。

工作台实时更新

通过 Server-Sent Events (SSE) 推送更新:
- 私聊:SSE 连接后停止轮询
- 小组:每 5 秒拉取房间状态(识别成员变更)
- 断线时降级为 2 秒轮询
- 标签页隐藏时暂停(节省资源)

小组讨论机制

成员发言通过隐藏会话实现:
- 标题格式:~dsh-bot-group:<roomId>-<memberId>
- 标记为 kind:hidden,默认不在工作台显示
- 口吻在 write 时注入,不修改 bot 配置
- 不归档(避免 DSH 0.2.0-rc.1 的归档会话限制)

边界和限制

人设编辑:只对新会话生效。创建会话时快照人设,已有对话保持原口吻。

委托会话:dsh_bot_ask 创建的会话默认隐藏,需在工作台开启「包含隐藏」才能看到。

排队持久化:小组讨论的排队消息只在内存中,重启服务会丢失。

官方会话:在 DSH GUI 用「+ 新会话」创建的会话不归 DSH Bot 管理。

社区标准

本项目对齐 dsh-community-standard v0.15:

- packages/tool-dsh-bot/dsh-plugin.json - 工具插件 manifest
- packages/ui-dsh-bot/dsh-plugin.json - UI 插件 manifest
- standards/host-descriptor.json - Host 能力声明
- standards/ - 纯函数协商、fixtures、适配器基线

详见 standards/README.md。

品牌资源

brand/ 目录包含项目视觉资产:

| 文件 | 用途 |
| logo-primary.png | 主 logo,适合应用图标、文档封面 |
| icon-simple.png | 简化图标 (512×512),适合 favicon |
| banner-horizontal.png | 横向 banner (1536×512),适合 GitHub 头图 |
| screenshot-workbench.png | 工作台截图,用于文档演示 |

配色规范:
- 主色:蓝色渐变 #2196F3 → #1976D2
- 辅助色:橙色渐变 #FF9800 → #F57C00
- 设计风格:圆润友好、扁平化、渐变质感

文档

- 环境配置详解
- 任务包索引
- 归档材料
- v1 设计文档
- 工作台设计

许可

本项目为私有仓库,未明确授权不得复制或分发。

基于 DeepSeek Shell v0.2.0-rc.1
预览分享卡片长什么样 ↓Nothing1024/dsh-bot
分享 · DeepSeek Harness Hub
Nothing1024/dsh-bot

管理多人设助理,私聊或组队协作讨论

这是你的仓库?认领条目

回到顶部