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

Telegram 智能体网关 GooDAnDReaDY/dsh-messenger-gateway

DeepSeek Harnessv0.4.28
GooDAnDReaDY4 天前有提交已提供中文文档扫描:含敏感能力

Telegram 桥接 DeepSeek Harness:会话、steer、homes 和 TTS 语音消息

38.6/100
综合分
5
GitHub 星标
2,196
npm 周下载
—/5
用户评分

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add @goodandready/dsh-messenger-gateway
npm 源 · @goodandready/dsh-messenger-gateway 的发布者账号已校验与本仓库一致

状态速览

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

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

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

✓npm 包@goodandready/dsh-messenger-gateway @ 0.4.28
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/30 15:54:52

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

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 77 处,展示前 74 条)
  • 发起网络请求
    lib/client.js:634
    const res = await fetch(`${ROUTE_PREFIX}/status`, { credentials: 'same-origin', cache: 'no-store', signal: timeoutSignal(10000) })
  • 发起网络请求
    lib/client.js:646
    const res = await fetch(`${ROUTE_PREFIX}/pairing`, { credentials: 'same-origin', cache: 'no-store', signal: timeoutSignal(10000) })
  • 发起网络请求
    lib/client.js:667
    const res = await fetch(`${ROUTE_PREFIX}/update`, { cache: 'no-store', signal: timeoutSignal(15000) })
  • 发起网络请求
    lib/client.js:689
    const res = await fetch(`${ROUTE_PREFIX}/update`, {
  • 发起网络请求
    lib/client.js:726
    const res = await fetch(`${ROUTE_PREFIX}/smoke`, {
  • 发起网络请求
    lib/client.js:1428
    const res = await fetch(`${ROUTE_PREFIX}/pairing/approve`, {
  • 读取本地文件
    lib/updater.js:68
    if (!existsSync(entry)) return undefined
  • 读取本地文件
    lib/updater.js:71
    if (existsSync(manifestPath)) {
  • 读取本地文件
    lib/updater.js:73
    const manifest = JSON.parse(readFileSync(manifestPath, 'utf8'))
  • 发起网络请求
    lib/updater.js:148
    const response = await fetch(`${cleanReg}/${encodeURIComponent(packageName)}/latest`, {
  • 读取本地文件
    lib/updater.js:163
    const raw = await readFile(manifestPath, 'utf8')
  • 发起网络请求
    lib/proxy.js:164
    const req = mod.request(options)
  • 发起网络请求
    lib/proxy.js:558
    req = mod.request({
  • 发起网络请求
    lib/proxy.js:633
    if (shouldBypassProxy(url.hostname, env)) return fetch(input, init)
  • 读取本地文件
    lib/workspace.js:19
    const st = statSync(resolved)
  • 读取本地文件
    lib/workspace.js:94
    if (existsSync(wsFile)) {
  • 读取本地文件
    lib/workspace.js:95
    const raw = await readFile(wsFile, 'utf8')
  • 读取本地文件
    lib/workspace.js:162
    if (existsSync(gitPath)) {
  • 读取本地文件
    lib/workspace.js:163
    const st = statSync(gitPath)
  • 读取本地文件
    lib/workspace.js:168
    const content = readFileSync(gitPath, "utf8")
  • 发起网络请求
    lib/outbound.js:83
    const res = await fetch(url, { signal: effectiveSignal })
  • 写入本地文件
    lib/voice-prefs.js:7
    mkdirSync(dir, { recursive: true })
  • 写入本地文件
    lib/voice-prefs.js:10
    writeFileSync(tmpPath, JSON.stringify(data, null, 2), "utf8")
  • 写入本地文件
    lib/voice-prefs.js:11
    renameSync(tmpPath, filePath)
  • 删除本地文件
    lib/voice-prefs.js:13
    try { unlinkSync(tmpPath) } catch { }
  • 读取本地文件
    lib/voice-prefs.js:21
    if (filePath && existsSync(filePath)) {
  • 读取本地文件
    lib/voice-prefs.js:23
    const raw = JSON.parse(readFileSync(filePath, "utf8"))
  • 读取本地文件
    lib/personas.js:76
    const raw = JSON.parse(readFileSync(filePath, 'utf8'))
  • 读取本地文件
    lib/scheduler.js:44
    const raw = await readFile(filePath, 'utf8')
  • 写入本地文件
    lib/pairing.js:16
    mkdirSync(dir, { recursive: true })
  • 写入本地文件
    lib/pairing.js:19
    writeFileSync(tmpPath, JSON.stringify(data, null, 2), 'utf8')
  • 写入本地文件
    lib/pairing.js:20
    renameSync(tmpPath, filePath)
  • 删除本地文件
    lib/pairing.js:22
    try { unlinkSync(tmpPath) } catch { }
  • 读取本地文件
    lib/pairing.js:29
    if (filePath && existsSync(filePath)) {
  • 读取本地文件
    lib/pairing.js:31
    const raw = JSON.parse(readFileSync(filePath, 'utf8'))
  • 读取本地文件
    lib/gateway-turn.js:181
    const bytes = new Uint8Array(await readFile(att.path))
  • 读取本地文件
    lib/outbox.js:87
    if (existsSync(storagePath)) {
  • 读取本地文件
    lib/outbox.js:88
    const raw = readFileSync(storagePath, 'utf8')
  • 写入本地文件
    lib/storage-atomic.js:12
    await mkdir(dir, { recursive: true })
  • 写入本地文件
    lib/storage-atomic.js:16
    await writeFile(tmpPath, serialized, 'utf8')
  • 写入本地文件
    lib/storage-atomic.js:17
    await rename(tmpPath, filePath)
  • 删除本地文件
    lib/storage-atomic.js:19
    await unlink(tmpPath).catch(() => {})
  • 写入本地文件
    lib/storage-atomic.js:29
    mkdirSync(dir, { recursive: true })
  • 写入本地文件
    lib/storage-atomic.js:32
    writeFileSync(tmpPath, JSON.stringify(data, null, 2), 'utf8')
  • 写入本地文件
    lib/storage-atomic.js:33
    renameSync(tmpPath, filePath)
  • 删除本地文件
    lib/storage-atomic.js:35
    try { unlinkSync(tmpPath) } catch { }
  • 读取本地文件
    lib/adapters/telegram.js:789
    const bytes = file.bytes || (file.path ? await readFile(file.path) : null)
  • 发起网络请求
    lib/adapters/discord.js:83
    const res = await fetch(this.webhookUrl, {
  • 读取本地文件
    lib/adapters/discord.js:114
    const bytes = file.bytes || (file.path ? await readFile(file.path) : null)
  • 发起网络请求
    lib/adapters/discord.js:121
    const res = await fetch(`${DISCORD_API}/channels/${targetChannel}/messages`, {
  • 发起网络请求
    lib/adapters/discord.js:156
    const res = await fetch(`${DISCORD_API}/channels/${channelId}/messages/${messageId}`, {
  • 发起网络请求
    lib/adapters/discord.js:176
    const res = await fetch(`${DISCORD_API}/channels/${channelId}/messages`, {
  • 发起网络请求
    lib/adapters/slack.js:82
    const res = await fetch(this.webhookUrl, {
  • 发起网络请求
    lib/adapters/slack.js:114
    const res = await fetch(`${SLACK_API}/chat.postMessage`, {
  • 发起网络请求
    lib/adapters/slack.js:141
    const res = await fetch(`${SLACK_API}/chat.update`, {
  • 读取本地文件
    lib/file-manager.js:94
    st = await stat(target)
  • 读取本地文件
    lib/file-manager.js:109
    const rawEntries = await readdir(target, { withFileTypes: true })
  • 读取本地文件
    lib/file-manager.js:118
    const entryStat = await stat(full)
  • 读取本地文件
    lib/file-manager.js:181
    st = await stat(target)
  • 读取本地文件
    lib/file-manager.js:197
    const bytes = await readFile(target)
  • 发起网络请求
    lib/memory-brain.js:116
    const res = await fetch(`${cfg.baseUrl}/mcp`, {
  • 写入本地文件
    lib/artifacts.js:323
    writeFileSync(inPath, svgContent, "utf-8")
  • 执行外部命令固定命令
    lib/artifacts.js:325
    const proc = spawn("ffmpeg", ["-y", "-i", inPath, "-update", "1", "-frames:v", "1", outPath])
  • 读取本地文件
    lib/artifacts.js:332
    return readFileSync(outPath)
  • 删除本地文件
    lib/artifacts.js:336
    try { unlinkSync(inPath) } catch { }
  • 删除本地文件
    lib/artifacts.js:337
    try { unlinkSync(outPath) } catch { }
  • 执行外部命令固定命令
    lib/tts.js:62
    const child = spawn('ffmpeg', args, { stdio: ['ignore', 'ignore', 'pipe'] })
  • 写入本地文件
    lib/tts.js:80
    await writeFile(input, audioBytes)
  • 读取本地文件
    lib/tts.js:90
    return await readFile(output)
  • 删除本地文件递归
    lib/tts.js:92
    await rm(dir, { recursive: true, force: true }).catch(() => {})
  • 发起网络请求
    lib/integrations.js:10
    const res = await fetch(url, {
  • 读取本地文件
    lib/photos.js:10
    const bytes = new Uint8Array(await readFile(att.path))
  • 写入本地文件
    lib/media.js:48
    mkdirSync(cacheDir, { recursive: true })
  • 写入本地文件
    lib/media.js:50
    writeFileSync(path, bytes)
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

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

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-agent@deepseek-ai/dsh-agent-loop@deepseek-ai/dsh-host-webserver@deepseek-ai/dsh-llm@deepseek-ai/dsh-session@deepseek-ai/dsh-settings@deepseek-ai/schemastery@deepseek-ai/dsh-tools
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 会话管理
  • TTS语音消息
v0.4.282026-10-30
Release 5:仪表盘与最终路线图收尾 · Telegram Mini App(TMA)仪表盘(#150): - 轻量移动端 Web UI,挂在 /dsh-messenger-gateway/webapp 下,沿用 Telegram 原生主题 CSS 变量。 - 对 window.Telegram.WebApp.initData 做 HMAC-SHA256 加密校验(validateTelegramWebAppData)。 - 内存环形缓冲存储 createArtifactStore,捕获生成的 Mermaid 图、图表和表格,支持 #artifact= 深链。 - 全屏产物查看器,SVG 可缩放拖动,代码高亮查看,一键复制按钮。 - 实时主机健康与适配器状态仪表盘:运行时长、消息计数、活跃会话,以及 Outbox DLQ 监控和快速重试。 - 接入 Telegram Bot 交互:通过 Bot API setChatMenuButton 常驻菜单按钮 [📊 Dashboard],快捷操作键盘扩展,以及 /app 聊天命令。 - test/webapp.test.mjs 中完整的单元测试覆盖(8 个测试)。
v0.4.272026-10-30
Release 4:可靠性与计量 · 出站事务队列(Outbox DLQ)(#155): - 零依赖事务队列(outbox-queue.json),在投递前持久化出站操作。 - 自动离线缓冲、带指数退避与抖动的重试调度,并遵循 Telegram 的 retry_after 头。 - 故障关闭式终态错误检测,把失败转入死信队列(DLQ)。 - DLQ 溢出时向配对聊天发送管理员通知。 - 运维用 /outbox 命令(/outbox、/outbox retry、/outbox clear)。 · Messenger 会话中的 token 用量与成本追踪(#156): - 提取用量指标(提示词、补全、推理、缓存 token)与单轮时长。 - 多层级会话投影读取(session.projection("costByModel")),回退到按轮累加。 - 精确计价(DeepSeek 官方 token 费率)。 - 可配置的紧凑成本页脚(telegram.costFooter),把执行指标追加到每轮回复。 - 可配置的预算告警阈值(telegram.budgetAlertThresholdUsd)。 - 交互式 /cost 命令,附详细明细。
v0.4.262026-10-29
第 3 批,共 5 批: · Issue #151:按主题自动划分工作区,项目 worktree 相互隔离(/project bind/list/unbind、git worktree 检查、动态解析 cwd)。 · Issue #152:接入 dsh-memory-brain,持久保存用户配置档与记忆(/memory、/forget、按轮次自动注入上下文、严格隔离用户级作用域)。
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
📦 @goodandready/dsh-messenger-gateway DeepSeek Harness Telegram 专属网关(支持交互按钮调度、论坛话题隔离与语音条回复) 🇬🇧 English • 🇷🇺 Русский • 🇨🇳 中文说明 ⭐ 如果您喜欢这个插件,请在 GitHub 上为它点亮 Star — 这能让我知道插件对您有用,并鼓励我继续开发和维护它。 🐛 如果您发现 Bug 或希望增加功能,请使用任意语言在 GitHub 上提交 Issue — 我会评估您的建议,并在后续版本中实现有价值的改进。 ⚡ 插件概览 dsh-messenger-gateway 为 DeepSeek Harness 智能体提供企业级 Telegram 接入桥梁。 除常规对话转发外,本插件全面打通了智能体深度交互能力:问答交互式内联按钮 (Inline Keyboard)、Telegram 论坛话题 (Forum Topics) 独立会话隔离、代理连接支持 (HTTP/HTTPS/SOCKS5 与自定义 apiRoot)、单用户工作区目录安全隔离、6 位配对码鉴权防护以及语音条朗读回复 (TTS)。
展开完整文档(README 剩余 1 节)
📦 @goodandready/dsh-messenger-gateway

DeepSeek Harness Telegram 专属网关(支持交互按钮调度、论坛话题隔离与语音条回复)

🇬🇧 English •
🇷🇺 Русский •
🇨🇳 中文说明

⭐ 如果您喜欢这个插件,请在 GitHub 上为它点亮 Star — 这能让我知道插件对您有用,并鼓励我继续开发和维护它。

🐛 如果您发现 Bug 或希望增加功能,请使用任意语言在 GitHub 上提交 Issue — 我会评估您的建议,并在后续版本中实现有价值的改进。

⚡ 插件概览

dsh-messenger-gateway 为 DeepSeek Harness 智能体提供企业级 Telegram 接入桥梁。

除常规对话转发外,本插件全面打通了智能体深度交互能力:问答交互式内联按钮 (Inline Keyboard)、Telegram 论坛话题 (Forum Topics) 独立会话隔离、代理连接支持 (HTTP/HTTPS/SOCKS5 与自定义 apiRoot)、单用户工作区目录安全隔离、6 位配对码鉴权防护以及语音条朗读回复 (TTS)。

graph LR
subgraph TelegramClient [Telegram 客户端 / 群组 / 话题]
User[👤 用户 / 论坛话题] --> TG[Telegram Bot API 轮询 / Webhook]
end

subgraph GatewayCore [网关调度核心]
TG --> Auth{配对码与权限校验}
Auth -->|已配对用户| Router{话题与目录路由器}
Router --> Home[独立工作目录: /homes/user_id]
Home --> Thread[DSH 隔离会话上下文]
end

subgraph AgentLoop [DSH 智能体执行流]
Thread --> Agent[智能体逻辑流]
Agent -->|ask_question 工具调用| Ask[Telegram 原生内联交互按钮]
Agent -->|语音回复合成| TTS[TTS 语音条消息下发]
end

subgraph Feedback [交互下发]
Ask --> TG
TTS --> TG
end

style TelegramClient fill:#1e1e2e,stroke:#89b4fa,stroke-width:2px,color:#cdd6f4
style GatewayCore fill:#181825,stroke:#cba6f7,stroke-width:2px,color:#cdd6f4
style AgentLoop fill:#11111b,stroke:#a6e3a1,stroke-width:2px,color:#cdd6f4
style Feedback fill:#181825,stroke:#f38ba8,stroke-width:2px,color:#cdd6f4

📦 安装指南

dsh plugin --profile web add @goodandready/dsh-messenger-gateway

📄 开源协议

MIT © GooDAnDReaDY
预览分享卡片长什么样 ↓GooDAnDReaDY/dsh-messenger-gateway
分享 · DeepSeek Harness Hub
GooDAnDReaDY/dsh-messenger-gateway

Telegram 桥接 DeepSeek Harness:会话、steer、homes 和 TTS 语音消息

回到顶部