dsh-partner
Long-lived AI companions with WeChat channel routing for DeepSeek Harness
- Stars
- 0
- Language
- TypeScript
- Created
- Aug 27, 2026
- Updated
- Aug 31, 2026
Introduction
DSH Partner
面向 DeepSeek Harness 的长期 AI 伙伴与微信渠道插件。
伙伴不是一次会话中的临时提示词。每个伙伴拥有独立身份、Agent Preset、模型路由、能力声明,以及按微信联系人隔离的 DSH Session。第一版以微信为主要渠道,使用腾讯微信 iLink Bot API,不模拟个人微信网页版协议。
当前能力
- 伙伴创建、编辑与删除
- Agent scoped 身份提示,仅影响该伙伴创建的 Agent
- 为伙伴选择 Agent Preset、提供方与模型
- 微信 iLink Bot 扫码连接
bot_token只保存到 DSH Credential Store,管理 API 和浏览器均不返回- 微信渠道启用、停用、断线退避与运行状态
- 私聊首次联系配对审批
微信机器人 + 联系人独立 Session 路由- DSH Agent 完整回复后回发微信,并保留 iLink
context_token - 微信图片与文档双向收发:图片进入 DSH 原生附件上下文,文档安全保存到伙伴独立工作目录
- 伙伴可把工作目录内生成的图片、PDF、Office 文档及常用文本文件回发微信
- DSH 运行中发起选择题或自由提问时同步到微信;联系人回复序号、选项文字或自定义答案后,原 Agent 继续执行
- 微信在伙伴忙碌时遵循 DSH 全局
ui-conversation.busyEnter:steer插入当前轮,queue排入下一轮 - 按伙伴和微信联系人双重隔离的完整对话归档、每日回顾与结构化长期记忆
- 逐轮记忆提炼使用有界的专用上下文,只发送当前轮、相关记忆的精简视图与最近证据;每日终审保留当天每轮的双向代表片段,未进入提示的旧数据仍由存储层完整保留
- 从明确对话中形成可审计的联系人画像;可靠画像作为会话理解基线,偏好、任务、事件、关系与短期情绪信号继续按当前话题召回
- 人物画像按联系人隔离,使用固定长期槽位和证据阈值;用户可查看来源、手动修正或删除,已确认内容不会再被自动提炼覆盖
- 每日终审只保存有证据的记忆关系;强关系可把一跳关联记忆补入当前话题召回,并在关系审计中解释召回依据
- 冲突关系不会被合并成用户事实;仅在当前话题相关时提示伙伴指出差异并请求确认,所有关系仍严格按联系人隔离
- 对话提炼与每日终审会识别尚未闭环、反复不满意、采用临时方案或正在等待外部结果的「伙伴挂念」;长期记忆只提供理解背景,不直接生成巡检任务
- 伙伴会话额外提供一个紧凑的
partner_concern_suggest候选工具;它只在伙伴自己的会话且长期记忆开启时可见,不会增加普通 DSH 会话的工具提示开销 - 工具候选和轮后提炼共用确定性准入策略:必须引用当前用户原话,满足优先级、置信度和综合分数门槛;每批最多新增两条,同主题只更新不重复创建
- 用户也可以自然地交代一件需要留意的事,并通过「继续留意、提高关注、已经解决、别管这个」控制它的生命周期;明确说出目标的“停止关注”会确定性更新状态,不依赖模型事后猜测
- 伙伴从记忆提炼或每日终审中自动新建关注后,会在当前伙伴会话中发出一次创建通知,并同步到对应的微信渠道,方便及时检查或移除
- 心跳只查询到期挂念,使用独立内存推理作用域观察上次检查后的变化;无到期事项时不会调用模型
- 心跳根据挂念选择当前可用的安全来源,并在来源内部逐层缩小范围:知识库按“找库→库内搜索→读取条目”,本地按“确定范围→定位文件/内容→读取证据”;发现阶段有独立软截止、单工具超时和整轮安全上限
- 知识文档明确指定本地核验命令时,心跳可使用作用域内临时注册的受控只读命令工具;它不经过 shell,只接受版本、npm 包版本和少量 Git 状态查询,禁止管道、重定向、脚本、任意程序与任意参数,并记录命令结果或拒绝原因
- 挂念明确关联
@文件时,伙伴可先读取再以最小修改持续维护该文件;写权限精确限定到已关联的现存文件,不能创建其他文件或触碰伙伴私有存储 - 发现结果先保存为 Observation,经过去重、相关性、新鲜度、可行动性和近期打扰历史的确定性评分,再决定静默记下、下次顺手一提、进入伙伴动态或主动通知
- 心跳硬性排除伙伴记忆、挂念数据库、会话归档及其备份,不向无关主题扩散
- 未送达的重要提醒会保留并安全补发;普通对话开始时只召回与当前消息相关的延迟提及
- 每次实际巡察结束后在原伙伴会话写入一条可折叠的活动说明,便于核验工具、结果摘要、最终判断和通知状态,不生成伙伴回复气泡
- 可配置静默时段、检查间隔、每日通知上限、失败退避和手动检查;失败后不会早于正常检查间隔重试
- 修改伙伴身份或能力时清理该伙伴的渠道 Session,防止新旧人格串联
- Windows、macOS、Linux 兼容的原子状态写入
心跳默认关闭,升级后不会突然主动发送消息。群聊策略和多渠道适配尚未开放。
安装
dsh plugin --profile web add @lemoncat7/dsh-partner
本地压缩包:
dsh plugin --profile web add ./lemoncat7-dsh-partner-<version>.tgz
重启对应 DSH profile 后,左侧「空间」上方会出现「伙伴」。打开伙伴面板,创建或选择伙伴,再进入「微信」扫码。
默认配置
- insert:
- id: partner
name: '@lemoncat7/dsh-partner'
config:
statePath: !!js dshHomePath('partner/state.json')
exposeWeb: true
apiPrefix: /partner-local/v1
defaultCwd: ''
autoStartChannels: true
defaultCwd 为空时使用 DSH 进程当前工作目录,以兼容桌面端和 Docker。可按部署情况显式设为真实存在的绝对路径。
微信流程
- 插件请求
/ilink/bot/get_bot_qrcode?bot_type=3。 - 页面每两秒检查二维码状态,确认后凭据直接进入 Credential Store。
- 后台通过
/ilink/bot/getupdates长轮询接收消息。 - 未授权联系人只会创建配对请求。
- 批准后,为该联系人创建或恢复独立 DSH Agent。
- 收到图片时,插件通过微信 CDN 下载并解密媒体,保存到伙伴工作目录,同时作为 DSH 原生图片附件交给 Agent;文档保存后以安全路径交给 Agent。
- Agent 使用伙伴身份和所选 Preset 运行,最终文本通过
/ilink/bot/sendmessage返回微信;回复中明确引用的工作目录文件会加密上传并作为微信附件发送。
渠道身份只决定消息归属,不授予任何工具权限。SSH、知识库和未来 Git 插件仍执行各自的挂载、授权和审批规则。
数据与安全
- 普通状态:
statePath指向的 JSON 文件。 - 伙伴记忆:
<defaultCwd>/partners/<伙伴 ID>/memory/,按联系人隔离保存每日完整对话归档、人物画像、每日回顾、结构化长期记忆和有证据的记忆关系;画像按版本进入联系人会话,其他记忆按当前话题与一跳强关系召回,默认永久保留。 - 伙伴挂念:
<defaultCwd>/partners/<伙伴 ID>/concerns/concerns.sqlite,保存挂念生命周期、变化观察、去重指纹、候选审计和打扰决策;候选审计保留 90 天,SQLite 使用 WAL、索引和串行事务写入。 - 敏感凭据:DSH Credential Store,scope 为
dsh-partner-weixin。 - 管理 API:默认
/partner-local/v1,仅接受同源请求;写操作还要求X-DSH-Partner-Request: 1。 - 微信机器人只能绑定一个伙伴;联系人上下文不会跨机器人、伙伴或其他联系人共享。
- 入站附件上限为 64 MB,保存在
<伙伴 cwd>/inbound/,目录权限为0700、文件权限为0600。 - 出站附件最多 8 个,只允许伙伴工作目录内的真实文件;会解析真实路径并拒绝符号链接越界、未知格式和超限文件。
开发
npm install
npm test
npm pack --dry-run
要求 Node.js ^22.19.0 || >=24.0.0,与当前 DSH 运行时一致。