@leviyuan/lodestar 0.17.2 → 0.17.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +29 -29
- package/dist/lodestar-setup.js +13 -10
- package/dist/lodestar-update.js +10 -7
- package/dist/lodestar-version.js +1 -1
- package/dist/lodestar.js +168 -165
- package/docs/AGENTS.md +7 -4
- package/docs/claude-agent-backend.md +29 -43
- package/docs/configuration.md +29 -5
- package/docs/models.md +38 -30
- package/docs/usage.md +29 -31
- package/package.json +1 -1
- package/scripts/postinstall.cjs +2 -1
- package/docs/dsh-testing-report.md +0 -189
|
@@ -1,189 +0,0 @@
|
|
|
1
|
-
# 把 DeepSeek Harness 接进飞书:完整测试记录
|
|
2
|
-
|
|
3
|
-
版本:Lodestar 0.17.0。验收日期:2026-09-10。
|
|
4
|
-
|
|
5
|
-
这次接入把 DeepSeek Harness(DSH)作为独立原生后端:Lodestar 启动 Node 子进程,通过 stdio 桥接原生 Agent、会话、工具和提问服务,再把事件交给现有 Session 和飞书 Card Kit。原来使用 Claude 兼容接口的 DeepSeek 来源继续保留,两者各自管理账号、模型和历史。
|
|
6
|
-
|
|
7
|
-
验收分三层:可重复的本地自动化、真实 DeepSeek API、真实飞书群。测试中发现并修复了取消状态无法落盘、后台工具结果导致进程退出、图片编码误判和 setup 命令解析问题。最后由用户从飞书客户端发送图片,补齐 WebSocket 入站验证。
|
|
8
|
-
|
|
9
|
-
本报告按场景列出用例;一个自动化用例可能包含多个步骤和断言。不同层次会重复验证同一能力,因此不把所有表格行相加当作“独立测试总数”。群标识、用户身份、真实会话编号、API key、余额和原始用户图片均不包含在分享版中。
|
|
10
|
-
|
|
11
|
-
## 测试环境和方法
|
|
12
|
-
|
|
13
|
-
| 项目 | 本次使用的环境或方法 |
|
|
14
|
-
| --- | --- |
|
|
15
|
-
| 原生依赖 | `@deepseek-ai/dsh@0.1.5-alpha.2`(当次历史验收快照;当前生产策略为自动跟随 latest) |
|
|
16
|
-
| 本机运行时 | Linux、Bun 1.3.11、Node 22.22.2 |
|
|
17
|
-
| 模型 | DeepSeek-V4-Flash、DeepSeek-V4-Pro、DeepSeek-V4-Flash-Vision-Exp |
|
|
18
|
-
| 推理设置 | 真实请求覆盖 `off`、`high`、`max`;支持值仍以模型目录为准 |
|
|
19
|
-
| 本地自动化 | 真正启动 Node DSH runtime;模型接口使用本地 HTTP/SSE 服务,Shell、文件和 MCP 工具实际执行 |
|
|
20
|
-
| 真实 API | 使用已经配置的账号;在临时目录建立独立运行时,结束后回收子进程 |
|
|
21
|
-
| 群内验收 | 使用用户指定的测试群和运行中的 daemon;通过现有 debug 注入入口发送带“自动化测试”标记的可见消息 |
|
|
22
|
-
| 人工交互 | 用户实际选择模型、点击提问按钮、发送 `cl` 并上传图片 |
|
|
23
|
-
| 证据 | 模型请求内容、工具结果、实际文件内容、原生持久化事件、飞书原始卡片、systemd 日志及进程状态 |
|
|
24
|
-
|
|
25
|
-
文本注入复用了真实群、真实消息 ID 和正常 Session 处理路径,但它不能证明飞书 WebSocket 收到了用户图片。因此图片入站另用真实客户端消息验证;没有把模拟事件算作这一项通过。
|
|
26
|
-
|
|
27
|
-
## 一、本次新增或扩展的 27 个自动化用例
|
|
28
|
-
|
|
29
|
-
### 14 个原生 runtime 与桥接用例
|
|
30
|
-
|
|
31
|
-
源码:[src/dsh-process.test.ts](../src/dsh-process.test.ts)。这些用例运行真实 Node DSH 子进程,本地模型服务负责提供可控响应和错误。
|
|
32
|
-
|
|
33
|
-
| 编号 | 场景与执行方式 | 验收条件 |
|
|
34
|
-
| --- | --- | --- |
|
|
35
|
-
| A01 | 主 Agent 启动后台子 Agent,主回复先结束,子 Agent 再执行 Bash | 内容块结果进入共享后台卡状态;子任务完成,主进程仍存活 |
|
|
36
|
-
| A02 | 注入桥接致命错误,随后正常完成 shutdown | 即使退出码为 0,仍报告非预期退出 |
|
|
37
|
-
| A03 | 连续多轮、停止进程、恢复历史,再从首轮 checkpoint 分叉并查询历史 | 流式文本和 token/cache 用量正确;恢复包含旧上下文;分支保留边界之前的内容、排除之后的内容;历史归属正确 |
|
|
38
|
-
| A04 | 让模型发起真实 Bash 写文件 | 工具结果关联正确,磁盘上的文件内容与预期一致 |
|
|
39
|
-
| A05 | 原生 `ask_user_question`,通过标准权限回答接口选择 Blue | 只触发一次提问,下一次模型请求包含真实选择值 |
|
|
40
|
-
| A06 | 持续挂起 SSE 响应,取消后再发下一轮 | 本轮明确为 aborted,进程存活,后续回复成功 |
|
|
41
|
-
| A07 | 模型接口先返回 HTTP 401,再返回 `finish_reason=length` | 分别报告鉴权失败、输出上限,不标记为成功 |
|
|
42
|
-
| A08 | 一轮工具调用中切换模型和 effort,下一轮再继续;同时以 worker 权限启动 | 当前轮仍使用原路由,下一轮使用 Pro/off;worker 工具列表不含继续委派能力 |
|
|
43
|
-
| A09 | 根 Agent 通过真实 Shell 检查委派环境 | 根 Agent 获得专用上下文,通用主会话 capability 不直接出现在 Shell 环境中 |
|
|
44
|
-
| A10 | 附加一个内容并非图片的 `.png` 文件 | 明确报错,模型接口没有收到请求 |
|
|
45
|
-
| A11 | 把有效 JPEG 保存成 `.png` 后附加给视觉模型 | 依据文件字节声明类型,图片被接受 |
|
|
46
|
-
| A12 | 空历史压缩、构造多轮长历史后压缩,再停止并恢复 | 无需压缩时显式拒绝;真实压缩完成且发出事件;压缩后的会话可恢复 |
|
|
47
|
-
| A13 | 原生子 Agent 检查自己的工具清单及 Shell 环境 | 不能再次委派,不能继承根 Agent 的委派上下文;仍能使用普通代码工具 |
|
|
48
|
-
| A14 | 在隔离项目配置 stdio MCP 服务,由模型调用发现的工具 | 服务实际启动,工具被发现并执行,结果回到模型 |
|
|
49
|
-
|
|
50
|
-
### 3 个账号来源用例
|
|
51
|
-
|
|
52
|
-
源码:[src/token-source-dsh.test.ts](../src/token-source-dsh.test.ts)。
|
|
53
|
-
|
|
54
|
-
| 编号 | 场景 | 验收条件 |
|
|
55
|
-
| --- | --- | --- |
|
|
56
|
-
| A15 | 没有为 DSH 显式配置凭据,但环境中存在 DeepSeek key | 来源保持禁用、模型列表为空,启动报缺失凭据;不借用旧来源 |
|
|
57
|
-
| A16 | 启动环境中混有旧 Anthropic、DeepSeek、DSH home 与 Node 覆盖值 | 清除冲突值,注入选定账号与 Node 配置,保留调用方需要的委派上下文 |
|
|
58
|
-
| A17 | 注册和解析 `deepseek-harness-setup` | 命令对应独立来源,解析后 provider 为 `dsh` |
|
|
59
|
-
|
|
60
|
-
### 10 个共享模块用例
|
|
61
|
-
|
|
62
|
-
| 编号 | 场景 | 验收条件与源码 |
|
|
63
|
-
| --- | --- | --- |
|
|
64
|
-
| A18 | Agent CLI 使用 DSH 专用上下文发请求 | 请求带正确认证;[agent-cli.test.ts](../src/agent-cli.test.ts) |
|
|
65
|
-
| A19 | DSH 上下文结构不合法,同时存在旧凭据 | 明确失败,不改用旧凭据;同上 |
|
|
66
|
-
| A20 | 保存再加载 DSH resume、`off` effort 与原生 event checkpoint | 数据完整,保留其他 provider 的历史;[feishu-turns-map.test.ts](../src/feishu-turns-map.test.ts) |
|
|
67
|
-
| A21 | 提交非法 DSH fork 锚点 | 在触碰后端前拒绝;同上 |
|
|
68
|
-
| A22 | 在 Session 输入含连字符、无参数的 setup 命令 | 由命令层消费并给出提示,不流入模型;[session.test.ts](../src/session.test.ts) |
|
|
69
|
-
| A23 | 模型面板选择 DSH 的 `off` effort | 使用同一个原生进程更新设置;同上 |
|
|
70
|
-
| A24 | Claude 正在执行任务时切换到 DSH | 拒绝替换忙碌进程;同上 |
|
|
71
|
-
| A25 | DSH 子工具返回内容块数组 | Session 不抛异常,结果不写到主对话卡;同上 |
|
|
72
|
-
| A26 | 后台卡 active/pending 两个池接收结构化结果及错误 | 正常生成摘要,错误信息保留;[background.test.ts](../src/cards/background.test.ts) |
|
|
73
|
-
| A27 | 通知回复占用输入时,DSH 连续产生两条提问 | 延迟按钮和提醒;回复结束后逐题激活、回填;[session-ask.test.ts](../src/session-ask.test.ts) |
|
|
74
|
-
|
|
75
|
-
## 二、真实 DeepSeek API 验收
|
|
76
|
-
|
|
77
|
-
首轮独立验收包含 13 个场景,另有 1 个视觉模型场景,全部通过。下表的成功证据均来自实际请求或工具执行。
|
|
78
|
-
|
|
79
|
-
| 编号 | 用例 | 检查结果 |
|
|
80
|
-
| --- | --- | --- |
|
|
81
|
-
| L01 | Flash/off 基础流式回复与 checkpoint | 收到预期回复、用量及原生完成锚点 |
|
|
82
|
-
| L02 | Write → Edit → Bash | 文件确实创建、修改,Shell 读到修改后的内容 |
|
|
83
|
-
| L03 | 独立 Read | 模型通过 Read 读取未在提示词中给出的文件内容 |
|
|
84
|
-
| L04 | 原生提问和程序回填 | 回填 BLUE 后,模型使用了实际答案 |
|
|
85
|
-
| L05 | 项目 MCP | 实际调用本地 MCP echo 工具并取得结果 |
|
|
86
|
-
| L06 | 切换到 Pro | 使用选定模型成功回复 |
|
|
87
|
-
| L07 | 切回 Flash/high | 推理设置被实际请求采用,回复成功 |
|
|
88
|
-
| L08 | 进程恢复 | 关闭并恢复原生会话后,仍能回答先前保存的记忆词 |
|
|
89
|
-
| L09 | 中断真实 Shell,再继续 | 取消能结束本轮,下一轮继续工作 |
|
|
90
|
-
| L10 | 手动压缩与后续回复 | 原生压缩完成,压缩后继续回答 |
|
|
91
|
-
| L11 | 原生 checkpoint 分叉 | 新分支从指定完成边界继续,源会话保留 |
|
|
92
|
-
| L12 | 原生子 Agent | 子任务实际执行,主 Agent 获得并使用结果 |
|
|
93
|
-
| L13 | 原生历史列表 | 返回同目录的原生会话记录 |
|
|
94
|
-
| L14 | Vision-Exp/off 看图 | 正确识别测试图形为 triangle |
|
|
95
|
-
|
|
96
|
-
发现后台卡和图片问题后,又用真实 API 分别复测:JPEG 识别为 circle;后台子 Agent 的结构化工具结果进入共享状态,完成后根进程继续存活。随后再到运行中的测试群验证修复。
|
|
97
|
-
|
|
98
|
-
## 三、真实飞书群验收
|
|
99
|
-
|
|
100
|
-
群内选择的是 `DeepSeek-V4-Flash-Vision-Exp / max`;跨模型委派选择 DSH 的 Pro/high。以下各项均观察飞书返回的实际卡片或文件,避免把提示词中的“成功标记”当作模型输出。
|
|
101
|
-
|
|
102
|
-
| 编号 | 用例 | 真实验收证据 |
|
|
103
|
-
| --- | --- | --- |
|
|
104
|
-
| F01 | 模型目录与面板选择 | DSH 三个模型已加载;用户实际选择 Vision-Exp/max;群设置与回复 footer 一致 |
|
|
105
|
-
| F02 | 基础流式回复 | 助手正文包含预期标记;卡片结束 streaming,footer 显示完成、模型和用量 |
|
|
106
|
-
| F03 | 工具卡与文件发送 | Agent 创建文件并读取;发送标记生成独立文件消息;从飞书重新下载后内容逐字一致 |
|
|
107
|
-
| F04 | 提问按钮 | 用户真实点击 BLUE;卡片显示已回答;模型回复使用 BLUE |
|
|
108
|
-
| F05 | 两条消息排队 | 第一条执行短 Shell 时发送第二条;两条结果落在不同卡片 |
|
|
109
|
-
| F06 | `stop` 后继续 | 中断正在等待的 Shell,卡片显示停止;下一条输入正常完成 |
|
|
110
|
-
| F07 | `rs` 恢复本群会话 | 保持原生会话编号,记忆词保留;daemon PID 不变 |
|
|
111
|
-
| F08 | 前台原生子 Agent | `run_in_background=false`,子 Agent 计算 `13×17`,主 Agent 返回 221 |
|
|
112
|
-
| F09 | Lodestar 管理的跨模型委派 | 通过真实 `lodestar-agent` CLI 调用 DSH Pro;委派板显示完成,主回复和子结果均为 42 |
|
|
113
|
-
| F10 | `compact` | 群命令显示原生压缩完成,后续回复正常;暂缺的上下文数据明确显示 MISS |
|
|
114
|
-
| F11 | `fk` / `bk` 选择器 | 两个选择器均出现并列出可选历史;本项只验证展示,不包含点击后建群或切换分支 |
|
|
115
|
-
| F12 | 后台原生子 Agent,首次尝试 | 实际发现结构化工具结果导致卡片异常和 DSH 退出;保留失败证据 |
|
|
116
|
-
| F13 | 后台修复后的群内回归 | 主回复先结束;子 Agent 完成 Bash、job_output、Read 三次调用;后台卡显示三条结果并正常结算;主会话还能继续回答 |
|
|
117
|
-
| F14 | JPEG 编码回归 | 上传 JPEG 到飞书、下载为 `.png`,以附件路径送入运行中 Session;正确回答 blue circle |
|
|
118
|
-
| F15 | 回归结束后的会话健康 | 继续发送独立短请求,回复成功;检查本轮日志无 DSH 异常退出或卡片错误 |
|
|
119
|
-
| F16 | 用户真实 `cl` | 用户在客户端清空会话;旧 DSH 正常退出,新会话就绪 |
|
|
120
|
-
| F17 | 用户真实图片 WebSocket 入站 | 用户从客户端发图;daemon 实际下载附件;DSH 正确读出图片中的文字与场景,卡片约 3.1 秒完成 |
|
|
121
|
-
|
|
122
|
-
F13 还检查了原生记录:后台启动时的主回复与完成后的续聊属于同一个已初始化会话。F17 使用用户自己发来的图片,不是机器人发送后的注入模拟。3.1 秒只是这一次样本的处理时长,不代表性能基准。
|
|
123
|
-
|
|
124
|
-
## 四、测试发现了什么
|
|
125
|
-
|
|
126
|
-
| 问题 | 触发与证据 | 修复及复测 |
|
|
127
|
-
| --- | --- | --- |
|
|
128
|
-
| setup 命令未被拦截 | 原正则不接受来源名中的连字符,也不接受无参数形式,命令可能落入模型输入 | 命令层接受连字符、大小写和无参数提示;新增 Session 用例 |
|
|
129
|
-
| 取消状态无法落盘 | Node fetch 会修改可变的 abort reason,附加原生日志不接受的 stack 属性 | 取消原因保持不可变;取消请求、取消 Shell、取消后续聊均验证 |
|
|
130
|
-
| 后台工具结果导致退出 | 子工具返回 `ContentBlock[]`;后台摘要把它当字符串调用 `.replace()`,实际抛 TypeError 并终止 DSH | 先按内容结构归一化文本;补共享卡片、Session、真实 runtime 测试;真实 API 和群内再次通过 |
|
|
131
|
-
| 致命错误退出被当成预期关闭 | 出错后清理过程正常结束,会掩盖最初的致命原因 | 保留非预期失败标记;退出码 0 也不把此前失败改成成功 |
|
|
132
|
-
| 图片编码误判 | 飞书下载文件后缀为 `.png`,字节却是 JPEG;原生附件服务报 `Declared image type does not match its bytes` | 根据图片字节判断 MIME;保留错误输入拒绝;模拟 API、真实 API、群内、用户客户端四层验证 |
|
|
133
|
-
|
|
134
|
-
这些问题被保留为失败记录和回归用例。修复后的代码先独立验证,再经用户明确授权重启 daemon,最后检查新 PID、启动时间及真实群内结果。
|
|
135
|
-
|
|
136
|
-
## 五、观察脚本也需要验证
|
|
137
|
-
|
|
138
|
-
测试过程中有几次失败来自观察方法,不能据此修改产品来“制造通过”:
|
|
139
|
-
|
|
140
|
-
- 飞书默认读卡接口返回的是兼容提示。改用 `raw_card_content`,解析真正的 Card Kit 2.0 内容,才可判断正文、工具、footer 和 streaming 状态。
|
|
141
|
-
- 原始卡片读取结果不包含按钮回调的私有字段。曾据此等不到按钮;最终以用户实际点击、卡片已回答状态和模型拿到 BLUE 三份证据验收。
|
|
142
|
-
- 复合任务中,模型虽然完成写入和执行,却跳过了单独的 Read。保留这次失败,再设计一个不知道文件内容就无法通过的独立读取任务。
|
|
143
|
-
- 递归遍历卡片的观察脚本曾占用过高 CPU。检查完整命令后只终止该脚本,改为迭代遍历,再核对已经完成的主卡和委派板。
|
|
144
|
-
- 首次启动时曾把“上次已经停止的会话编号”与“本次新会话编号”直接比较。产品的冷启动规则本就会新建会话;改为核对初始化之后的原生记录和后续回复,不把合法新会话误判为崩溃重启。
|
|
145
|
-
- 消息列表探针曾使用不支持的 `page_size=100`,收到明确参数错误;改为 50 并分页,未绕过或忽略 API 错误。
|
|
146
|
-
|
|
147
|
-
## 六、覆盖边界
|
|
148
|
-
|
|
149
|
-
本次已经验证核心代码工具、原生会话、提问、委派、后台卡、取消、压缩、模型选择与图片入站。仍应准确保留以下边界:
|
|
150
|
-
|
|
151
|
-
- 882 项是全项目回归用例数,不是 882 次真实 DeepSeek 调用,也不是所有用户操作的穷举。
|
|
152
|
-
- `fk` / `bk` 群内只验证到选择器;原生 fork 的边界语义已在本地 runtime 和真实 API 层验证,没有在这一轮额外创建临时群或执行实际回退。
|
|
153
|
-
- 项目 MCP 的真实执行覆盖 stdio;HTTP MCP、所有插件与所有外部服务没有逐一实测。
|
|
154
|
-
- 本机真实运行环境为 Linux / Node 22.22.2;没有据此宣称 macOS、Windows、所有 Node 版本均经过人工端到端测试。
|
|
155
|
-
- 问答卡仍可能同时显示原生 ask 工具行和交互提问行;真实回答链路已验证,不能据此声称展示已做去重优化。
|
|
156
|
-
|
|
157
|
-
## 七、发布门禁与复现入口
|
|
158
|
-
|
|
159
|
-
日常可重复的检查入口:
|
|
160
|
-
|
|
161
|
-
```bash
|
|
162
|
-
# desc: 运行 DSH 专项回归
|
|
163
|
-
bun test src/dsh-process.test.ts src/token-source-dsh.test.ts
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
```bash
|
|
167
|
-
# desc: 运行发布质量检查
|
|
168
|
-
bun run ci
|
|
169
|
-
```
|
|
170
|
-
|
|
171
|
-
`bun run ci` 包含生产依赖审计、TypeScript 检查、全量测试、固定 seed 的随机顺序测试和发布入口构建。发布还必须把实际 tarball 安装到空目录,执行 `npm audit --omit=dev`,防止源码 overrides 与用户安装后的依赖树不一致。
|
|
172
|
-
|
|
173
|
-
真实群测试需要显式指定目标群与账号;独立 API 测试需要有效凭据。不要把真实 key 写进测试文件,也不要为群内验收另起一个 daemon。
|
|
174
|
-
|
|
175
|
-
0.17.0 最终发布前检查结果:
|
|
176
|
-
|
|
177
|
-
| 检查 | 结果 |
|
|
178
|
-
| --- | --- |
|
|
179
|
-
| 源码生产依赖审计 | 通过 |
|
|
180
|
-
| TypeScript 类型检查 | 通过 |
|
|
181
|
-
| 全量测试 | **882 pass / 0 fail**,59 个文件,3380 次断言 |
|
|
182
|
-
| 固定 seed 17 的随机顺序测试 | **882 pass / 0 fail**,3380 次断言 |
|
|
183
|
-
| 发布入口构建 | 7 个 JavaScript 入口生成成功,包含独立 `dsh-bridge.js` |
|
|
184
|
-
| 实际 tarball 安装 | 空目录安装成功;7 个安装后入口通过 Node 语法检查 |
|
|
185
|
-
| 安装后生产依赖审计 | **0 漏洞** |
|
|
186
|
-
| 安装包中的原生 DSH smoke | 协议握手成功,读取 3 个模型,2 次本地模型请求、1 次真实 Shell 工具调用,磁盘文件内容匹配,子进程正常回收 |
|
|
187
|
-
| 用户真实图片入站 | 通过,最终图像内容经人工核对 |
|
|
188
|
-
|
|
189
|
-
源码层与安装包层分别留存了检查结果。安装包 smoke 使用实际解包后的桥接文件与依赖,模型接口为本地可控服务;真实 DeepSeek 请求和真实群内验收见前两节。
|