dsh-loop-engine-allinone 0.4.0 → 0.4.1
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/CHANGELOG.md +19 -0
- package/README.md +2 -0
- package/README.zh.md +135 -45
- package/package.json +152 -152
package/CHANGELOG.md
CHANGED
|
@@ -8,6 +8,25 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
|
8
8
|
|
|
9
9
|
Nothing yet.
|
|
10
10
|
|
|
11
|
+
## [0.4.1]
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
|
|
15
|
+
- A language switch in both READMEs (`English · 简体中文`). GitHub only renders
|
|
16
|
+
`README.md`, so the pair is linked rather than auto-detected.
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
|
|
20
|
+
- `README.zh.md` was a translation of the UPSTREAM plugin: four hosted engines, no
|
|
21
|
+
registry chapter, nothing about grok/minimaxcode or the ACP capability bridges. It
|
|
22
|
+
is rewritten from the English README section by section (same nine sections, same
|
|
23
|
+
order).
|
|
24
|
+
- `tsconfig.json` no longer extends a `../deepseek-harness/` checkout that only
|
|
25
|
+
exists in the author's working tree, and `vitest.config.ts` applies its harness
|
|
26
|
+
aliases only when that checkout is present. Before this, a fresh clone could not
|
|
27
|
+
run `node build.mjs` (TS5083) or `vitest run` (32 suites could not resolve
|
|
28
|
+
`@deepseek-ai/cordis`).
|
|
29
|
+
|
|
11
30
|
## [0.4.0]
|
|
12
31
|
|
|
13
32
|
### Added
|
package/README.md
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# dsh-loop-engine-allinone
|
|
2
2
|
|
|
3
|
+
**English** · [简体中文](README.zh.md)
|
|
4
|
+
|
|
3
5
|
[](LICENSE)
|
|
4
6
|
[](#version-compatibility)
|
|
5
7
|
|
package/README.zh.md
CHANGED
|
@@ -1,87 +1,177 @@
|
|
|
1
1
|
# dsh-loop-engine-allinone
|
|
2
2
|
|
|
3
|
-
[
|
|
3
|
+
[English](README.md) · **简体中文**
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
[](https://www.npmjs.com/package/dsh-loop-engine-allinone)
|
|
6
|
+
[](LICENSE)
|
|
7
|
+
|
|
8
|
+
像选模型一样选 **dsh web** 的 agent 循环引擎——**按会话**选:内置的 `in-process`(默认),或十家托管引擎
|
|
9
|
+
`claude-code` / `codex` / `pi` / `kimi` / `agy` / `zcode` / `qoderclicn` / `hermes` / `grok` / `minimaxcode`。
|
|
10
|
+
会话之间互不影响:一个对话跑 Codex,另一个可以同时跑 Kimi。只要会话打开且空闲,任何时候都能换引擎——
|
|
11
|
+
两个托管引擎之间是**原地换手**,有一边是 `in-process` 时会让**页面重新载入**(`dsh web` 进程本身**不重启**)。
|
|
12
|
+
以上**无需改动主仓库**。
|
|
13
|
+
|
|
14
|
+
> **本仓库 fork 自 [`kuun993/dsh-loop-engine`](https://github.com/kuun993/dsh-loop-engine)。**
|
|
15
|
+
> 上游插件已经能按会话切引擎。本 fork 的贡献是**一套架构**——一份数据驱动的引擎注册表
|
|
16
|
+
> 加一层可插拔驱动——以及这套架构让「加一家引擎」变得便宜的六家引擎。
|
|
17
|
+
>
|
|
18
|
+
> | | 上游 | 本 fork |
|
|
19
|
+
> |---|---|---|
|
|
20
|
+
> | 引擎名单 | 硬编码在五个地方 | **一张注册表**,其余全部派生 |
|
|
21
|
+
> | 加一家引擎 | 改五个文件 | **一行注册表 + 一个驱动** |
|
|
22
|
+
> | 引擎数 | 4 | **10** |
|
|
23
|
+
> | ACP 引擎 | 1(kimi) | **3**(kimi / grok / minimaxcode)共用一个骨架 |
|
|
24
|
+
> | 外部 CLI 驱动 | 每家各写 | `driver-cli/` + `driver-acp/` |
|
|
25
|
+
>
|
|
26
|
+
> 四家原有引擎的协议代码**一行未动**。`kimi` 迁到共享 ACP 骨架上时**行为不变**,
|
|
27
|
+
> 它那套没改过的测试就是这次迁移的回归钉。
|
|
28
|
+
|
|
29
|
+
## 引擎标记
|
|
30
|
+
|
|
31
|
+
每家引擎在引擎选择器里有自己的标记,在对话页的 turn-status 行上有自己的颜色与字形;
|
|
32
|
+
**只有 `in-process` 用 DeepSeek 的鱼**。
|
|
33
|
+
|
|
34
|
+
四家原有引擎用厂商公布的 path。本 fork 加的第一波四家(agy / zcode / qoderclicn / hermes)
|
|
35
|
+
是从**本机找到的厂商自己的 artwork** 描或量出来的——手工画的版本不像真标记,被用户否过。
|
|
36
|
+
第二波两家(grok / minimaxcode)从**用户提供的图**描出:Grok Build 的黑环加斜杠
|
|
37
|
+
(斜杠两个尖端只有约 1px 宽,所以那条描摹必须是 8 连通——4 连通会把尖端削掉约 6%),
|
|
38
|
+
MiniMax Code 在蓝色底上的白色团块(底色是渐变,所以掩码规则是"最暗通道仍然够亮"而不是亮度阈值)。
|
|
39
|
+
Grok 厂商公布的 ACP 图标是同一个标记**粗约一个像素**的版本,对照记录在 `docs/engine-registry.md`。
|
|
40
|
+
|
|
41
|
+
标记以**数据**形式放在 [`src/client/engine-marks.ts`](src/client/engine-marks.ts) 而不是 JSX 里,
|
|
42
|
+
所以测试能断言"每个注册的引擎都有自己的标记"。
|
|
43
|
+
|
|
44
|
+
## 引擎注册表
|
|
45
|
+
|
|
46
|
+
每一个跟引擎有关的决定都来自**一张表** [`src/engine-registry.ts`](src/engine-registry.ts):
|
|
47
|
+
id 名单、能力声明、型号目录、显示文案。设置页的 schema、preset id 运算、驱动分派、
|
|
48
|
+
浏览器半边的选项与字形全部从它派生。第二张表
|
|
49
|
+
([`src/engine-drivers.ts`](src/engine-drivers.ts))是 node 侧唯一必须 import 各驱动类的模块。
|
|
50
|
+
两张表都对托管名单**全量**,所以「注册了引擎但忘了驱动」是编译错误,不是运行时才发现。
|
|
51
|
+
|
|
52
|
+
想加引擎?读 [docs/engine-registry.md](docs/engine-registry.md)——其中 §2 第 6 步是
|
|
53
|
+
**ACP 引擎的全部配方**:一个 profile 加四个小文件,共享层一行不用改。
|
|
6
54
|
|
|
7
55
|
## 安装
|
|
8
56
|
|
|
9
57
|
```sh
|
|
58
|
+
# 从本仓库装(npm 上的包名是本 fork 自己的):
|
|
10
59
|
dsh plugin --profile web add dsh-loop-engine-allinone
|
|
60
|
+
|
|
61
|
+
# 或者从本地 checkout:
|
|
62
|
+
dsh plugin --profile web add /path/to/dsh-loop-engine-allinone
|
|
11
63
|
```
|
|
12
64
|
|
|
13
|
-
启动一次 `dsh web
|
|
65
|
+
启动一次 `dsh web`(路由器会在有界窗口内重试,等基础 bundle 让出 factory 槽位),
|
|
66
|
+
然后打开 **Settings → Loop engine**。
|
|
14
67
|
|
|
15
68
|
**安装须知**
|
|
16
69
|
|
|
17
|
-
- 安装会重写 profile 的 `cordis.patch.yml` 里一小段**不带引擎 id**
|
|
18
|
-
- **装到 `web` 以外的 profile
|
|
70
|
+
- 安装会重写 profile 的 `cordis.patch.yml` 里一小段**不带引擎 id** 的受管理块;文件里你写的其它部分逐字节保留。从更早版本升级**不需要手工改文件**。
|
|
71
|
+
- **装到 `web` 以外的 profile**(桌面版的 `desktop`、`headless` 部署、改过名的 profile)必须在该 profile 的组合条目里写上 `profile: <名字>`:
|
|
19
72
|
```yaml
|
|
20
73
|
- id: loop-engine
|
|
21
74
|
config:
|
|
22
75
|
profile: desktop
|
|
23
76
|
```
|
|
24
|
-
`profile` 默认是 `web
|
|
25
|
-
- **卸载**是 `dsh plugin --profile web remove dsh-loop-engine-allinone`
|
|
26
|
-
- **pnpm 10+** 可能拦下依赖的 build script
|
|
27
|
-
- **用源码启动 harness**
|
|
77
|
+
`profile` 默认是 `web`,不写的话插件会把受管块写进 `<home>/profiles/web/cordis.patch.yml`,而正在跑的那个 profile 永远不会读它:插件挂着,但基础 `agent-loop` 行没被禁,路由器拿不到 factory 槽位,任何托管引擎都不可达。(这是装进桌面版时踩出来的。)
|
|
78
|
+
- **卸载**是 `dsh plugin --profile web remove dsh-loop-engine-allinone` **再加上删掉那段受管理块**——块会比插件活得久,而它还在时 profile 里没有任何 agent factory,会话一条也建不出来。
|
|
79
|
+
- **pnpm 10+** 可能拦下依赖的 build script(`ERR_PNPM_IGNORED_BUILDS`,列出 `esbuild`、`@google/genai`、`protobufjs`)。执行 `pnpm approve-builds`(或加一条 `allowBuilds`)后重试;只有安装方能授予这个权限。
|
|
80
|
+
- **用源码启动 harness** 时还要多做一步:用 `file:` shim 把 profile 的 harness peer 包桥接到 checkout 源码,否则恢复会话会报 `agent-presets: refusing to compose an unscoped context`。步骤见 [docs/source-checkout.md](docs/source-checkout.md)。
|
|
28
81
|
|
|
29
82
|
## 环境要求
|
|
30
83
|
|
|
31
84
|
| 引擎 | 本机需要 |
|
|
32
85
|
|---|---|
|
|
33
|
-
| Claude Code | 已安装并登录 Claude Code CLI |
|
|
34
|
-
| Codex | 执行过 `codex login
|
|
35
|
-
| Pi | `pi`
|
|
36
|
-
| Kimi Code | 已安装并登录 `kimi` CLI
|
|
86
|
+
| Claude Code | 已安装并登录 Claude Code CLI(或什么都不装:SDK 自带一个捆绑二进制) |
|
|
87
|
+
| Codex | 执行过 `codex login`,或配置 `CODEX_API_KEY` |
|
|
88
|
+
| Pi | `pi` 自己要求的认证方式(其 `~/.pi/agent/auth.json`,或提供方的 API-key 环境变量) |
|
|
89
|
+
| Kimi Code | 已安装并登录 `kimi` CLI,且在 `PATH` 上(或用 `bins.kimiBin` 固定路径) |
|
|
90
|
+
| Antigravity | 已安装 `agy` CLI 并完成 Google 登录 |
|
|
91
|
+
| ZCode | ZCode CLI 加一个有效的 GLM Coding Plan 订阅 |
|
|
92
|
+
| Qoder CN | 已安装 `qoderclicn` CLI 并登录 |
|
|
93
|
+
| Hermes Agent | 已安装 `hermes` CLI 并登录;它读自己的 `HERMES_HOME`,由子进程继承 |
|
|
94
|
+
| Grok Build | 已安装 `grok` CLI(`~/.grok/bin/grok.exe`,或 `npx @xai-official/grok@<pin> agent stdio`)并**登录过一次**(`grok` / `grok login`)——它的 ACP server 在没有账号时会拒绝 `session/new` |
|
|
95
|
+
| MiniMax Code | `npm i -g @minimax-ai/code`,然后 `mcode login --region cn\|global`,再 `mcode provider use token-plan` 才会花 M Plan 订阅额度而不是 API key |
|
|
96
|
+
|
|
97
|
+
**这些 CLI 由你自己安装,插件不装、也不登录。** 插件对 `bundled: false` 的引擎只做两件事:
|
|
98
|
+
探可执行文件、按 argv 起子进程(没有任何 `postinstall`,依赖里也没有这些包)。
|
|
99
|
+
没装时选中它会报「找不到可执行文件」,这是设计。
|
|
37
100
|
|
|
38
101
|
## 使用方法
|
|
39
102
|
|
|
40
|
-
- **新会话**——在 preset
|
|
41
|
-
- **Settings → Loop engine**
|
|
42
|
-
- **换当前这条会话**用对话页 composer
|
|
43
|
-
- 托管 →
|
|
44
|
-
- 涉及 `in-process`
|
|
45
|
-
-
|
|
46
|
-
-
|
|
47
|
-
-
|
|
48
|
-
-
|
|
49
|
-
-
|
|
103
|
+
- **新会话**——在 preset 选择器(工作区选择器旁的 chip)上选引擎;保留部署自己的默认(`standard`)则走 in-process。子 agent 沿用拉起它的那个 agent 的引擎。
|
|
104
|
+
- **Settings → Loop engine** 决定**新会话**的默认引擎:改完立即生效,已经在跑的会话不受影响。选 **In-process** 会把插件接手前的默认值恢复回去。
|
|
105
|
+
- **换当前这条会话**用对话页 composer 的引擎选择器(勾选 *在对话页显示引擎选择器*)。
|
|
106
|
+
- 托管 → 托管:原地换手,当场生效。
|
|
107
|
+
- 涉及 `in-process` 的方向:先弹确认框,确认后页面重新载入并回到同一条会话(滚动位置与未发出的草稿会丢,会话记录不丢)。
|
|
108
|
+
- 正在跑一轮的会话会被**拒绝**,子 agent 的会话不能换。
|
|
109
|
+
- **对话头部那个标记**(preset 标签旁边)写的是这条会话**实际在跑**的引擎;取消勾选 *在对话头部显示引擎标记* 即可关掉它。
|
|
110
|
+
- **模型**——两种分组,刻意区分:
|
|
111
|
+
- **声明了自己型号目录的引擎独占一组**,用引擎自己的名字(今天是 `Antigravity`、`Grok Build`、`MiniMax Code`),里面是 `default` 加该引擎订阅包含的型号。选一条就把那个 id 交给引擎(`agy --model …`,ACP 引擎则是 `session/set_config_option`),于是你能在自己的订阅里挑,而不是接受"引擎自己决定"。`default` 仍然就是那个意思。
|
|
112
|
+
- **其余引擎共用 `external` 分组**,只有一条 `default`。这不是残留:模型目录是按 Host **代际**构建的、不按会话区分,一家一组会把十个一模一样的 `default` 塞进每个会话的菜单。
|
|
113
|
+
- 型号表**在注册表里声明**,启动时不探测——插件开机不启动任何外部进程。订阅变了的部署改 `src/engine-registry.ts` 的 `models` 行;过期的 id 会在引擎处**响亮地失败**,这是诚实的结果。
|
|
114
|
+
- **`bins`**(组合条目,可选)——按每家引擎注册表的 `binConfigKey` 覆盖可执行文件:
|
|
115
|
+
```yaml
|
|
116
|
+
- id: loop-engine
|
|
117
|
+
config:
|
|
118
|
+
bins:
|
|
119
|
+
claudeBin: 'D:/tools/claude.exe'
|
|
120
|
+
kimiBin: 'D:/tools/kimi.exe'
|
|
121
|
+
grokBin: 'C:/Users/me/.grok/bin/grok.exe'
|
|
122
|
+
minimaxcodeBin: 'D:/Programs/npm-global/node_modules/@minimax-ai/code/cli.js'
|
|
123
|
+
```
|
|
124
|
+
**升级外部 CLI 后插件立刻认**:它不缓存版本、不比版本号,每次开会话都是现起进程。
|
|
125
|
+
三家捆绑引擎里,`codexBin` 与 `piBin` 能让插件**彻底不依赖**捆绑包;
|
|
126
|
+
`claudeBin` 只是换掉真正执行的二进制,`@anthropic-ai/claude-agent-sdk` 仍是硬依赖(value import)。
|
|
127
|
+
- **`regions`**(组合条目,可选)——按注册表 `region.configKey` 覆盖引擎账号区域。今天只有 MiniMax Code 声明(`regions.mcodeRegion`,默认 `cn`),因为它的登录端点与凭据都是按区域存的:
|
|
128
|
+
```yaml
|
|
129
|
+
- id: loop-engine
|
|
130
|
+
config:
|
|
131
|
+
regions:
|
|
132
|
+
mcodeRegion: 'en'
|
|
133
|
+
```
|
|
134
|
+
值会写进子进程环境里**该 CLI 真正读的那个变量**(`MAVIS_REGION`——实测;`MCODE_REGION` 在 `mcode acp` 上无效)。未知值、或与 `env` 里同一个变量冲突,会在构造期失败而不是把子进程指向没人选的账号。
|
|
135
|
+
- **`childIdleMs`**(组合条目,毫秒,默认 `0` = 不启用)——Kimi、Codex、Grok、MiniMax Code **每条会话保有一个常驻子进程**跨 step 复用;设了它就在空闲这么久之后把子进程关掉,下一步再重新拉起。只关子进程,所以不会触发任何重载。Pi 与 Claude Code 每步各起一次,不受影响。
|
|
136
|
+
- **`engineContextWindow`**(组合条目,token,默认 `262144`)——dsh 给共享托管路由假设的上下文窗口。托管引擎不向 dsh 报自己的容量,这是 dsh 自动压缩算阈值用的数(默认在它的 80% 触发)。跑多家引擎时设成**最小的那个窗口**。
|
|
137
|
+
- **`summarizerProvider` / `summarizerModel`**(组合条目,**要么都设、要么都不设**)——托管会话**压缩**时用来做摘要的真实 dsh 模型。压缩是 dsh 自己的,但那次摘要调用是普通 llm 请求,而托管会话的路由模型是本插件的占位路由——没有这一对,托管会话永远压不下去:每次尝试只记一条警告然后继续。只设一个(或空串)会在启动期被拒。
|
|
138
|
+
- **dsh 自己的命令**(`/export`、`/feedback`、`/permission`)在托管引擎下照常可用。托管引擎的 preset 是 `standard` 的副本,去掉了被外部引擎接管的那几行(dsh 的 `/plan`、goal 工具与 `/goal`、技能相关行)。dsh 的**压缩是保留的**:它是让会话日志(也就是每步回放给引擎的 transcript)保持有界的唯一手段,而引擎自己的每轮压缩做不到(每步都新开一个引擎会话,引擎那边缩了、日志还在长)。配好 `summarizerProvider` / `summarizerModel`,否则那次摘要调用没有模型可用。
|
|
50
139
|
|
|
51
140
|
## 版本兼容
|
|
52
141
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
142
|
+
**一个发布版本同时服务三代 harness**:0.1.5 线(`>=0.1.5-rc.1 <0.1.6-0`)、0.1.7 线(`>=0.1.7-rc.1 <0.1.8-0`)
|
|
143
|
+
与 0.2.0 线(`>=0.2.0-rc.1 <0.2.1-0`)——它在加载期探测当前是哪一代、走对应分支。
|
|
144
|
+
这两个并集范围就是它在 `peerDependencies` 里声明的范围;超出范围的 harness 会在启动或会话恢复时**响亮地失败**。
|
|
56
145
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
| `0.1.5-rc3` … `0.1.5-rc5` | `0.1.5-rc.2` |
|
|
61
|
-
| `0.1.5-rc1` / `0.1.5-rc2` | `0.1.5-rc.1` |
|
|
62
|
-
| `1.0.0-rc8` … `1.0.0-rc15` | `0.1.2-rc.1` |
|
|
63
|
-
| `1.0.0-rc7` 及更早 | `0.1.1-rc.2` |
|
|
146
|
+
版本读作 `<harness 线>-rcN`,其中 **`rcN` 是本插件对那条线的第 N 次发布号**,不是 harness 自己的 `rc` 号。
|
|
147
|
+
在被覆盖的线里,新的 harness `rc` **不需要**插件跟版——除非某个 API 面动了;
|
|
148
|
+
[docs/compatibility.md](docs/compatibility.md) §1 列出了这些面与判定命令。
|
|
64
149
|
|
|
65
150
|
## 已知限制
|
|
66
151
|
|
|
67
|
-
- **它替掉了 harness 的 agent factory。**
|
|
68
|
-
- **引擎记录是侧车文件** `$DSH_HOME/.loop-engine/engines.json
|
|
69
|
-
- **涉及 `in-process` 的换引擎会重新载入页面**——harness loop
|
|
70
|
-
-
|
|
152
|
+
- **它替掉了 harness 的 agent factory。** 唯一那个门面服务所有会话,所以插件对此的承诺是:它读不出引擎的会话——包括跟托管引擎毫无关系的会话——一律**降级到 `in-process`**,而不是打不开。见 [docs/per-session-engine.md](docs/per-session-engine.md) §6。
|
|
153
|
+
- **引擎记录是侧车文件** `$DSH_HOME/.loop-engine/engines.json`,不在会话日志里:换机器或换 `DSH_HOME` 就丢,会话回退到自己的 preset。见 §5.5。
|
|
154
|
+
- **涉及 `in-process` 的换引擎会重新载入页面**——harness loop 既不交出活会话,也不接受不是它建的会话。见 §5.2/§5.4。
|
|
155
|
+
- **已经跑过一轮的会话**仍可换引擎,但只能在空闲时,且会重建那条会话的 agent。见 §5。
|
|
71
156
|
- **带旧 preset id `loop-engine` 的老会话**在重建一次之前显示为"旧版托管引擎"。见 §7。
|
|
72
|
-
- **同引擎的多条会话共享该 CLI
|
|
73
|
-
- **切回 `in-process`
|
|
157
|
+
- **同引擎的多条会话共享该 CLI 自己的认证目录**,插件不加锁。见 §6。
|
|
158
|
+
- **切回 `in-process` 之后**,模型菜单里那个共享的 `external` 分组仍在(模型目录不按会话裁剪)。
|
|
159
|
+
- **grok 的工具要走 harness 的 shell 服务**:它的 shell 工具通过客户端侧终端桥执行,没有 `ctx.shell` 的组合会**拒绝**而不是无约束执行。对话与推理两条路不受影响。
|
|
160
|
+
- **`claudeBin` 卸不掉捆绑 SDK**(见上),`codexBin` / `piBin` 可以。
|
|
161
|
+
- **捆绑引擎没有运行时升级按钮**,这是刻意的:它们的版本是本包的依赖钉,升级=改依赖,不是原地改写。
|
|
74
162
|
|
|
75
163
|
## 细节都在哪
|
|
76
164
|
|
|
77
|
-
- [docs/
|
|
78
|
-
- [docs/
|
|
79
|
-
- [docs/
|
|
80
|
-
- [docs/
|
|
165
|
+
- [docs/engine-registry.md](docs/engine-registry.md) —— **加引擎的配方**;§2 第 6 步是 ACP 引擎的全部,另有 5 个踩过的坑。
|
|
166
|
+
- [docs/per-session-engine.md](docs/per-session-engine.md) —— 按会话选引擎的完整用户可见行为(上面引的 § 就是它)。
|
|
167
|
+
- [docs/architecture.md](docs/architecture.md) —— 插件核心:唯一 factory 槽位、受管理块、路由、provider 路由。
|
|
168
|
+
- [docs/compatibility.md](docs/compatibility.md) —— **harness 升级时先看这篇**。
|
|
169
|
+
- [docs/driver-core.md](docs/driver-core.md) —— 共享驱动层。
|
|
81
170
|
- [docs/engine-claude.md](docs/engine-claude.md) · [engine-codex](docs/engine-codex.md) · [engine-kimi](docs/engine-kimi.md) · [engine-pi](docs/engine-pi.md) —— 逐引擎内部实现。
|
|
171
|
+
- [CHANGELOG.md](CHANGELOG.md) —— 每个版本改了什么,含被实测推翻的假设与已知限制。
|
|
172
|
+
- [CONTRIBUTING.md](CONTRIBUTING.md) —— 贡献规则(**probe first**:协议结论必须来自真实帧)。
|
|
82
173
|
- [docs/source-checkout.md](docs/source-checkout.md) —— 源码启动 harness 需要的 `file:` shim。
|
|
83
|
-
-
|
|
84
|
-
- [docs/proposals/](docs/proposals/) —— 提交给主仓的提案。
|
|
174
|
+
- `scripts/probe/` —— 协议探针:`probe.mjs`、`acp-handshake.mjs`、`smoke-driver.ts`、`smoke-acp.ts`。
|
|
85
175
|
|
|
86
176
|
## License
|
|
87
177
|
|
package/package.json
CHANGED
|
@@ -1,152 +1,152 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "dsh-loop-engine-allinone",
|
|
3
|
-
"description": "Web-switchable agent loop engine selection for the DeepSeek Harness - out-of-tree plugin with a data-driven engine registry and a pluggable driver layer. Ten engines: Claude Code / Codex / Pi / Kimi Code / Antigravity / ZCode / Qoder CN / Hermes / Grok Build / MiniMax Code. All-in-one fork of kuun993/dsh-loop-engine.",
|
|
4
|
-
"version": "0.4.
|
|
5
|
-
"publishConfig": {
|
|
6
|
-
"registry": "https://registry.npmjs.org/"
|
|
7
|
-
},
|
|
8
|
-
"repository": {
|
|
9
|
-
"type": "git",
|
|
10
|
-
"url": "git+https://github.com/yaliklinty/dsh-loop-engine-allinone.git"
|
|
11
|
-
},
|
|
12
|
-
"type": "module",
|
|
13
|
-
"main": "lib/index.js",
|
|
14
|
-
"types": "lib/types/index.d.ts",
|
|
15
|
-
"exports": {
|
|
16
|
-
".": {
|
|
17
|
-
"types": "./lib/types/index.d.ts",
|
|
18
|
-
"default": "./lib/index.js"
|
|
19
|
-
},
|
|
20
|
-
"./invariant": {
|
|
21
|
-
"types": "./lib/types/invariant.d.ts",
|
|
22
|
-
"default": "./lib/invariant.js"
|
|
23
|
-
},
|
|
24
|
-
"./client": {
|
|
25
|
-
"types": "./lib/types/client/index.d.ts",
|
|
26
|
-
"default": "./lib/client.js"
|
|
27
|
-
},
|
|
28
|
-
"./src/*": "./src/*",
|
|
29
|
-
"./package.json": "./package.json"
|
|
30
|
-
},
|
|
31
|
-
"files": [
|
|
32
|
-
"lib/index.js",
|
|
33
|
-
"lib/invariant.js",
|
|
34
|
-
"lib/client.js",
|
|
35
|
-
"lib/types/**/*.d.ts",
|
|
36
|
-
"cordis.patch.yml",
|
|
37
|
-
"README.md",
|
|
38
|
-
"CHANGELOG.md",
|
|
39
|
-
"CONTRIBUTING.md",
|
|
40
|
-
"SECURITY.md",
|
|
41
|
-
"LICENSE",
|
|
42
|
-
"NOTICE"
|
|
43
|
-
],
|
|
44
|
-
"license": "MIT",
|
|
45
|
-
"engines": {
|
|
46
|
-
"node": "^22.19.0 || >=24.0.0"
|
|
47
|
-
},
|
|
48
|
-
"packageManager": "pnpm@11.23.0",
|
|
49
|
-
"scripts": {
|
|
50
|
-
"build": "node build.mjs",
|
|
51
|
-
"typecheck": "tsc -p tsconfig.build.json --noEmit",
|
|
52
|
-
"test": "vitest run",
|
|
53
|
-
"test:coverage": "vitest run --coverage",
|
|
54
|
-
"compat:install": "pnpm -C .compat/015 install --frozen-lockfile && pnpm -C .compat/017 install --frozen-lockfile && pnpm -C .compat/020 install --frozen-lockfile",
|
|
55
|
-
"test:compat": "vitest run --config vitest.config.compat015.ts && vitest run --config vitest.config.compat017.ts && vitest run --config vitest.config.compat020.ts"
|
|
56
|
-
},
|
|
57
|
-
"dsh": {
|
|
58
|
-
"bundle": {
|
|
59
|
-
"patch": "./cordis.patch.yml"
|
|
60
|
-
},
|
|
61
|
-
"client": {
|
|
62
|
-
"inject": [
|
|
63
|
-
"@deepseek-ai/dsh-client-locale",
|
|
64
|
-
"@deepseek-ai/dsh-client-ui-settings",
|
|
65
|
-
"@deepseek-ai/dsh-api-remotes",
|
|
66
|
-
"@deepseek-ai/dsh-api-session-controller"
|
|
67
|
-
],
|
|
68
|
-
"platform": "web",
|
|
69
|
-
"external": [
|
|
70
|
-
"@deepseek-ai/dsh-client-locale/client",
|
|
71
|
-
"@deepseek-ai/dsh-client-store",
|
|
72
|
-
"@deepseek-ai/dsh-client-ui-settings/client",
|
|
73
|
-
"@deepseek-ai/dsh-api-remotes/client",
|
|
74
|
-
"@deepseek-ai/dsh-settings/types"
|
|
75
|
-
]
|
|
76
|
-
}
|
|
77
|
-
},
|
|
78
|
-
"dependencies": {
|
|
79
|
-
"@anthropic-ai/claude-agent-sdk": "0.3.220",
|
|
80
|
-
"@anthropic-ai/sdk": "0.93.0",
|
|
81
|
-
"@deepseek-ai/schemastery": "3.18.4",
|
|
82
|
-
"@earendil-works/pi-coding-agent": "0.84.3",
|
|
83
|
-
"@openai/codex": "0.149.1"
|
|
84
|
-
},
|
|
85
|
-
"peerDependencies": {
|
|
86
|
-
"@deepseek-ai/cordis": "^4.0.1",
|
|
87
|
-
"@deepseek-ai/dsh-agent": ">=0.1.5-rc.1 <0.1.6-0 || >=0.1.7-rc.1 <0.1.8-0 || >=0.2.0-rc.1 <0.2.1-0",
|
|
88
|
-
"@deepseek-ai/dsh-agent-loop": ">=0.1.5-rc.1 <0.1.6-0 || >=0.1.7-rc.1 <0.1.8-0 || >=0.2.0-rc.1 <0.2.1-0",
|
|
89
|
-
"@deepseek-ai/dsh-invariants": ">=0.1.5-rc.1 <0.1.6-0 || >=0.1.7-rc.1 <0.1.8-0 || >=0.2.0-rc.1 <0.2.1-0",
|
|
90
|
-
"@deepseek-ai/dsh-llm": ">=0.1.5-rc.1 <0.1.6-0 || >=0.1.7-rc.1 <0.1.8-0 || >=0.2.0-rc.1 <0.2.1-0",
|
|
91
|
-
"@deepseek-ai/dsh-scope": ">=0.1.5-rc.1 <0.1.6-0 || >=0.1.7-rc.1 <0.1.8-0 || >=0.2.0-rc.1 <0.2.1-0",
|
|
92
|
-
"@deepseek-ai/dsh-session": ">=0.1.5-rc.1 <0.1.6-0 || >=0.1.7-rc.1 <0.1.8-0 || >=0.2.0-rc.1 <0.2.1-0",
|
|
93
|
-
"@deepseek-ai/dsh-session-persistence": ">=0.1.5-rc.1 <0.1.6-0 || >=0.1.7-rc.1 <0.1.8-0 || >=0.2.0-rc.1 <0.2.1-0",
|
|
94
|
-
"@deepseek-ai/dsh-settings": ">=0.1.5-rc.1 <0.1.6-0 || >=0.1.7-rc.1 <0.1.8-0 || >=0.2.0-rc.1 <0.2.1-0",
|
|
95
|
-
"@deepseek-ai/dsh-subprocess": ">=0.1.5-rc.1 <0.1.6-0 || >=0.1.7-rc.1 <0.1.8-0 || >=0.2.0-rc.1 <0.2.1-0",
|
|
96
|
-
"@deepseek-ai/dsh-timeout": ">=0.1.5-rc.1 <0.1.6-0 || >=0.1.7-rc.1 <0.1.8-0 || >=0.2.0-rc.1 <0.2.1-0",
|
|
97
|
-
"@deepseek-ai/dsh-typert-protocol": ">=0.1.5-rc.1 <0.1.6-0 || >=0.1.7-rc.1 <0.1.8-0 || >=0.2.0-rc.1 <0.2.1-0"
|
|
98
|
-
},
|
|
99
|
-
"devDependencies": {
|
|
100
|
-
"@deepseek-ai/dsh-agent": "0.2.0-rc.2",
|
|
101
|
-
"@deepseek-ai/dsh-agent-loop": "0.2.0-rc.2",
|
|
102
|
-
"@deepseek-ai/dsh-invariants": "0.2.0-rc.2",
|
|
103
|
-
"@deepseek-ai/dsh-llm": "0.2.0-rc.2",
|
|
104
|
-
"@deepseek-ai/dsh-scope": "0.2.0-rc.2",
|
|
105
|
-
"@deepseek-ai/dsh-session": "0.2.0-rc.2",
|
|
106
|
-
"@deepseek-ai/dsh-session-persistence": "0.2.0-rc.2",
|
|
107
|
-
"@deepseek-ai/dsh-settings": "0.2.0-rc.2",
|
|
108
|
-
"@deepseek-ai/dsh-subprocess": "0.2.0-rc.2",
|
|
109
|
-
"@deepseek-ai/dsh-timeout": "0.2.0-rc.2",
|
|
110
|
-
"@deepseek-ai/dsh-attachment": "0.2.0-rc.2",
|
|
111
|
-
"@deepseek-ai/dsh-client-locale": "0.2.0-rc.2",
|
|
112
|
-
"@deepseek-ai/dsh-client-store": "0.2.0-rc.2",
|
|
113
|
-
"@deepseek-ai/dsh-client-ui-conversation": "0.2.0-rc.2",
|
|
114
|
-
"@deepseek-ai/dsh-client-ui-primitives": "0.2.0-rc.2",
|
|
115
|
-
"@deepseek-ai/dsh-client-ui-renderer": "0.2.0-rc.2",
|
|
116
|
-
"@deepseek-ai/dsh-client-ui-settings": "0.2.0-rc.2",
|
|
117
|
-
"@deepseek-ai/dsh-client-ui-slots": "0.2.0-rc.2",
|
|
118
|
-
"@deepseek-ai/dsh-home-paths": "0.2.0-rc.2",
|
|
119
|
-
"@deepseek-ai/dsh-session-persistence-jsonl": "0.2.0-rc.2",
|
|
120
|
-
"@deepseek-ai/dsh-subprocess-local": "0.2.0-rc.2",
|
|
121
|
-
"@deepseek-ai/dsh-system-prompt": "0.2.0-rc.2",
|
|
122
|
-
"@deepseek-ai/dsh-typert-protocol": "0.2.0-rc.2",
|
|
123
|
-
"@types/node": "^22.20.0",
|
|
124
|
-
"@types/react": "^19.0.0",
|
|
125
|
-
"@vitest/coverage-v8": "^4.1.8",
|
|
126
|
-
"esbuild": "^0.28.2",
|
|
127
|
-
"tsx": "^4.22.4",
|
|
128
|
-
"typescript": "^6.0.3",
|
|
129
|
-
"vite": "^7.0.0",
|
|
130
|
-
"vite-tsconfig-paths": "^6.1.1",
|
|
131
|
-
"vitest": "^4.1.8"
|
|
132
|
-
},
|
|
133
|
-
"bugs": {
|
|
134
|
-
"url": "https://github.com/yaliklinty/dsh-loop-engine-allinone/issues"
|
|
135
|
-
},
|
|
136
|
-
"homepage": "https://github.com/yaliklinty/dsh-loop-engine-allinone#readme",
|
|
137
|
-
"author": "dsh-loop-engine-allinone contributors",
|
|
138
|
-
"keywords": [
|
|
139
|
-
"deepseek-harness",
|
|
140
|
-
"dsh",
|
|
141
|
-
"dsh-plugin",
|
|
142
|
-
"agent-loop",
|
|
143
|
-
"coding-agent",
|
|
144
|
-
"claude-code",
|
|
145
|
-
"codex",
|
|
146
|
-
"kimi",
|
|
147
|
-
"antigravity",
|
|
148
|
-
"grok",
|
|
149
|
-
"minimax",
|
|
150
|
-
"acp"
|
|
151
|
-
]
|
|
152
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "dsh-loop-engine-allinone",
|
|
3
|
+
"description": "Web-switchable agent loop engine selection for the DeepSeek Harness - out-of-tree plugin with a data-driven engine registry and a pluggable driver layer. Ten engines: Claude Code / Codex / Pi / Kimi Code / Antigravity / ZCode / Qoder CN / Hermes / Grok Build / MiniMax Code. All-in-one fork of kuun993/dsh-loop-engine.",
|
|
4
|
+
"version": "0.4.1",
|
|
5
|
+
"publishConfig": {
|
|
6
|
+
"registry": "https://registry.npmjs.org/"
|
|
7
|
+
},
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/yaliklinty/dsh-loop-engine-allinone.git"
|
|
11
|
+
},
|
|
12
|
+
"type": "module",
|
|
13
|
+
"main": "lib/index.js",
|
|
14
|
+
"types": "lib/types/index.d.ts",
|
|
15
|
+
"exports": {
|
|
16
|
+
".": {
|
|
17
|
+
"types": "./lib/types/index.d.ts",
|
|
18
|
+
"default": "./lib/index.js"
|
|
19
|
+
},
|
|
20
|
+
"./invariant": {
|
|
21
|
+
"types": "./lib/types/invariant.d.ts",
|
|
22
|
+
"default": "./lib/invariant.js"
|
|
23
|
+
},
|
|
24
|
+
"./client": {
|
|
25
|
+
"types": "./lib/types/client/index.d.ts",
|
|
26
|
+
"default": "./lib/client.js"
|
|
27
|
+
},
|
|
28
|
+
"./src/*": "./src/*",
|
|
29
|
+
"./package.json": "./package.json"
|
|
30
|
+
},
|
|
31
|
+
"files": [
|
|
32
|
+
"lib/index.js",
|
|
33
|
+
"lib/invariant.js",
|
|
34
|
+
"lib/client.js",
|
|
35
|
+
"lib/types/**/*.d.ts",
|
|
36
|
+
"cordis.patch.yml",
|
|
37
|
+
"README.md",
|
|
38
|
+
"CHANGELOG.md",
|
|
39
|
+
"CONTRIBUTING.md",
|
|
40
|
+
"SECURITY.md",
|
|
41
|
+
"LICENSE",
|
|
42
|
+
"NOTICE"
|
|
43
|
+
],
|
|
44
|
+
"license": "MIT",
|
|
45
|
+
"engines": {
|
|
46
|
+
"node": "^22.19.0 || >=24.0.0"
|
|
47
|
+
},
|
|
48
|
+
"packageManager": "pnpm@11.23.0",
|
|
49
|
+
"scripts": {
|
|
50
|
+
"build": "node build.mjs",
|
|
51
|
+
"typecheck": "tsc -p tsconfig.build.json --noEmit",
|
|
52
|
+
"test": "vitest run",
|
|
53
|
+
"test:coverage": "vitest run --coverage",
|
|
54
|
+
"compat:install": "pnpm -C .compat/015 install --frozen-lockfile && pnpm -C .compat/017 install --frozen-lockfile && pnpm -C .compat/020 install --frozen-lockfile",
|
|
55
|
+
"test:compat": "vitest run --config vitest.config.compat015.ts && vitest run --config vitest.config.compat017.ts && vitest run --config vitest.config.compat020.ts"
|
|
56
|
+
},
|
|
57
|
+
"dsh": {
|
|
58
|
+
"bundle": {
|
|
59
|
+
"patch": "./cordis.patch.yml"
|
|
60
|
+
},
|
|
61
|
+
"client": {
|
|
62
|
+
"inject": [
|
|
63
|
+
"@deepseek-ai/dsh-client-locale",
|
|
64
|
+
"@deepseek-ai/dsh-client-ui-settings",
|
|
65
|
+
"@deepseek-ai/dsh-api-remotes",
|
|
66
|
+
"@deepseek-ai/dsh-api-session-controller"
|
|
67
|
+
],
|
|
68
|
+
"platform": "web",
|
|
69
|
+
"external": [
|
|
70
|
+
"@deepseek-ai/dsh-client-locale/client",
|
|
71
|
+
"@deepseek-ai/dsh-client-store",
|
|
72
|
+
"@deepseek-ai/dsh-client-ui-settings/client",
|
|
73
|
+
"@deepseek-ai/dsh-api-remotes/client",
|
|
74
|
+
"@deepseek-ai/dsh-settings/types"
|
|
75
|
+
]
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
"dependencies": {
|
|
79
|
+
"@anthropic-ai/claude-agent-sdk": "0.3.220",
|
|
80
|
+
"@anthropic-ai/sdk": "0.93.0",
|
|
81
|
+
"@deepseek-ai/schemastery": "3.18.4",
|
|
82
|
+
"@earendil-works/pi-coding-agent": "0.84.3",
|
|
83
|
+
"@openai/codex": "0.149.1"
|
|
84
|
+
},
|
|
85
|
+
"peerDependencies": {
|
|
86
|
+
"@deepseek-ai/cordis": "^4.0.1",
|
|
87
|
+
"@deepseek-ai/dsh-agent": ">=0.1.5-rc.1 <0.1.6-0 || >=0.1.7-rc.1 <0.1.8-0 || >=0.2.0-rc.1 <0.2.1-0",
|
|
88
|
+
"@deepseek-ai/dsh-agent-loop": ">=0.1.5-rc.1 <0.1.6-0 || >=0.1.7-rc.1 <0.1.8-0 || >=0.2.0-rc.1 <0.2.1-0",
|
|
89
|
+
"@deepseek-ai/dsh-invariants": ">=0.1.5-rc.1 <0.1.6-0 || >=0.1.7-rc.1 <0.1.8-0 || >=0.2.0-rc.1 <0.2.1-0",
|
|
90
|
+
"@deepseek-ai/dsh-llm": ">=0.1.5-rc.1 <0.1.6-0 || >=0.1.7-rc.1 <0.1.8-0 || >=0.2.0-rc.1 <0.2.1-0",
|
|
91
|
+
"@deepseek-ai/dsh-scope": ">=0.1.5-rc.1 <0.1.6-0 || >=0.1.7-rc.1 <0.1.8-0 || >=0.2.0-rc.1 <0.2.1-0",
|
|
92
|
+
"@deepseek-ai/dsh-session": ">=0.1.5-rc.1 <0.1.6-0 || >=0.1.7-rc.1 <0.1.8-0 || >=0.2.0-rc.1 <0.2.1-0",
|
|
93
|
+
"@deepseek-ai/dsh-session-persistence": ">=0.1.5-rc.1 <0.1.6-0 || >=0.1.7-rc.1 <0.1.8-0 || >=0.2.0-rc.1 <0.2.1-0",
|
|
94
|
+
"@deepseek-ai/dsh-settings": ">=0.1.5-rc.1 <0.1.6-0 || >=0.1.7-rc.1 <0.1.8-0 || >=0.2.0-rc.1 <0.2.1-0",
|
|
95
|
+
"@deepseek-ai/dsh-subprocess": ">=0.1.5-rc.1 <0.1.6-0 || >=0.1.7-rc.1 <0.1.8-0 || >=0.2.0-rc.1 <0.2.1-0",
|
|
96
|
+
"@deepseek-ai/dsh-timeout": ">=0.1.5-rc.1 <0.1.6-0 || >=0.1.7-rc.1 <0.1.8-0 || >=0.2.0-rc.1 <0.2.1-0",
|
|
97
|
+
"@deepseek-ai/dsh-typert-protocol": ">=0.1.5-rc.1 <0.1.6-0 || >=0.1.7-rc.1 <0.1.8-0 || >=0.2.0-rc.1 <0.2.1-0"
|
|
98
|
+
},
|
|
99
|
+
"devDependencies": {
|
|
100
|
+
"@deepseek-ai/dsh-agent": "0.2.0-rc.2",
|
|
101
|
+
"@deepseek-ai/dsh-agent-loop": "0.2.0-rc.2",
|
|
102
|
+
"@deepseek-ai/dsh-invariants": "0.2.0-rc.2",
|
|
103
|
+
"@deepseek-ai/dsh-llm": "0.2.0-rc.2",
|
|
104
|
+
"@deepseek-ai/dsh-scope": "0.2.0-rc.2",
|
|
105
|
+
"@deepseek-ai/dsh-session": "0.2.0-rc.2",
|
|
106
|
+
"@deepseek-ai/dsh-session-persistence": "0.2.0-rc.2",
|
|
107
|
+
"@deepseek-ai/dsh-settings": "0.2.0-rc.2",
|
|
108
|
+
"@deepseek-ai/dsh-subprocess": "0.2.0-rc.2",
|
|
109
|
+
"@deepseek-ai/dsh-timeout": "0.2.0-rc.2",
|
|
110
|
+
"@deepseek-ai/dsh-attachment": "0.2.0-rc.2",
|
|
111
|
+
"@deepseek-ai/dsh-client-locale": "0.2.0-rc.2",
|
|
112
|
+
"@deepseek-ai/dsh-client-store": "0.2.0-rc.2",
|
|
113
|
+
"@deepseek-ai/dsh-client-ui-conversation": "0.2.0-rc.2",
|
|
114
|
+
"@deepseek-ai/dsh-client-ui-primitives": "0.2.0-rc.2",
|
|
115
|
+
"@deepseek-ai/dsh-client-ui-renderer": "0.2.0-rc.2",
|
|
116
|
+
"@deepseek-ai/dsh-client-ui-settings": "0.2.0-rc.2",
|
|
117
|
+
"@deepseek-ai/dsh-client-ui-slots": "0.2.0-rc.2",
|
|
118
|
+
"@deepseek-ai/dsh-home-paths": "0.2.0-rc.2",
|
|
119
|
+
"@deepseek-ai/dsh-session-persistence-jsonl": "0.2.0-rc.2",
|
|
120
|
+
"@deepseek-ai/dsh-subprocess-local": "0.2.0-rc.2",
|
|
121
|
+
"@deepseek-ai/dsh-system-prompt": "0.2.0-rc.2",
|
|
122
|
+
"@deepseek-ai/dsh-typert-protocol": "0.2.0-rc.2",
|
|
123
|
+
"@types/node": "^22.20.0",
|
|
124
|
+
"@types/react": "^19.0.0",
|
|
125
|
+
"@vitest/coverage-v8": "^4.1.8",
|
|
126
|
+
"esbuild": "^0.28.2",
|
|
127
|
+
"tsx": "^4.22.4",
|
|
128
|
+
"typescript": "^6.0.3",
|
|
129
|
+
"vite": "^7.0.0",
|
|
130
|
+
"vite-tsconfig-paths": "^6.1.1",
|
|
131
|
+
"vitest": "^4.1.8"
|
|
132
|
+
},
|
|
133
|
+
"bugs": {
|
|
134
|
+
"url": "https://github.com/yaliklinty/dsh-loop-engine-allinone/issues"
|
|
135
|
+
},
|
|
136
|
+
"homepage": "https://github.com/yaliklinty/dsh-loop-engine-allinone#readme",
|
|
137
|
+
"author": "dsh-loop-engine-allinone contributors",
|
|
138
|
+
"keywords": [
|
|
139
|
+
"deepseek-harness",
|
|
140
|
+
"dsh",
|
|
141
|
+
"dsh-plugin",
|
|
142
|
+
"agent-loop",
|
|
143
|
+
"coding-agent",
|
|
144
|
+
"claude-code",
|
|
145
|
+
"codex",
|
|
146
|
+
"kimi",
|
|
147
|
+
"antigravity",
|
|
148
|
+
"grok",
|
|
149
|
+
"minimax",
|
|
150
|
+
"acp"
|
|
151
|
+
]
|
|
152
|
+
}
|