agents-bridge 0.1.4 → 0.1.5

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.
Files changed (62) hide show
  1. package/README.md +188 -205
  2. package/config.example.json +46 -46
  3. package/dist/agents/cli-runner.d.ts +5 -2
  4. package/dist/agents/cli-runner.d.ts.map +1 -1
  5. package/dist/agents/cli-runner.js +73 -35
  6. package/dist/agents/cli-runner.js.map +1 -1
  7. package/dist/agents/cli-session-store.d.ts +6 -0
  8. package/dist/agents/cli-session-store.d.ts.map +1 -1
  9. package/dist/agents/cli-session-store.js +64 -0
  10. package/dist/agents/cli-session-store.js.map +1 -1
  11. package/dist/channels/command-gating.d.ts.map +1 -1
  12. package/dist/channels/command-gating.js +6 -6
  13. package/dist/channels/command-gating.js.map +1 -1
  14. package/dist/cli/cmd-add-agent.d.ts +19 -0
  15. package/dist/cli/cmd-add-agent.d.ts.map +1 -0
  16. package/dist/cli/cmd-add-agent.js +339 -0
  17. package/dist/cli/cmd-add-agent.js.map +1 -0
  18. package/dist/cli/cmd-restart.d.ts +3 -0
  19. package/dist/cli/cmd-restart.d.ts.map +1 -0
  20. package/dist/cli/cmd-restart.js +22 -0
  21. package/dist/cli/cmd-restart.js.map +1 -0
  22. package/dist/cli/cmd-start.d.ts.map +1 -1
  23. package/dist/cli/cmd-start.js +35 -10
  24. package/dist/cli/cmd-start.js.map +1 -1
  25. package/dist/cli/cmd-stop.d.ts +5 -0
  26. package/dist/cli/cmd-stop.d.ts.map +1 -1
  27. package/dist/cli/cmd-stop.js +32 -8
  28. package/dist/cli/cmd-stop.js.map +1 -1
  29. package/dist/cli/run-main.d.ts +1 -1
  30. package/dist/cli/run-main.d.ts.map +1 -1
  31. package/dist/cli/run-main.js +5 -1
  32. package/dist/cli/run-main.js.map +1 -1
  33. package/dist/entry.d.ts.map +1 -1
  34. package/dist/entry.js +8 -0
  35. package/dist/entry.js.map +1 -1
  36. package/dist/types/index.d.ts +6 -0
  37. package/dist/types/index.d.ts.map +1 -1
  38. package/package.json +5 -1
  39. package/dist/agents/cli-output.test.d.ts +0 -2
  40. package/dist/agents/cli-output.test.d.ts.map +0 -1
  41. package/dist/agents/cli-output.test.js +0 -56
  42. package/dist/agents/cli-output.test.js.map +0 -1
  43. package/dist/agents/cli-runner.test.d.ts +0 -2
  44. package/dist/agents/cli-runner.test.d.ts.map +0 -1
  45. package/dist/agents/cli-runner.test.js +0 -119
  46. package/dist/agents/cli-runner.test.js.map +0 -1
  47. package/dist/agents/cli-session-store.test.d.ts +0 -2
  48. package/dist/agents/cli-session-store.test.d.ts.map +0 -1
  49. package/dist/agents/cli-session-store.test.js +0 -30
  50. package/dist/agents/cli-session-store.test.js.map +0 -1
  51. package/dist/agents/codex-app-server-runtime.test.d.ts +0 -2
  52. package/dist/agents/codex-app-server-runtime.test.d.ts.map +0 -1
  53. package/dist/agents/codex-app-server-runtime.test.js +0 -164
  54. package/dist/agents/codex-app-server-runtime.test.js.map +0 -1
  55. package/dist/cli/run-main.test.d.ts +0 -2
  56. package/dist/cli/run-main.test.d.ts.map +0 -1
  57. package/dist/cli/run-main.test.js +0 -17
  58. package/dist/cli/run-main.test.js.map +0 -1
  59. package/dist/config/default-config.test.d.ts +0 -2
  60. package/dist/config/default-config.test.d.ts.map +0 -1
  61. package/dist/config/default-config.test.js +0 -19
  62. package/dist/config/default-config.test.js.map +0 -1
package/README.md CHANGED
@@ -1,290 +1,273 @@
1
- # agents-bridge
1
+ # agents-bridge
2
2
 
3
- 鏈湴 Agent 缃戝叧锛岄儴缃插湪瀹㈡埛鏈湴鏈哄櫒涓婏紝閫氳繃闀胯疆璇㈣繛鎺ヤ簯绔?botlink 骞冲彴锛岄┍鍔ㄦ湰鍦扮殑 Claude Code / Codex 绛?AI Agent銆?
3
+ 本地 Agent 网关,部署在客户本地机器上,通过长轮询连接 botlink 平台,把消息转发给本机运行的 Claude Code / Codex 等 Agent 运行时。
4
4
 
5
- ## 鏋舵瀯姒傝
5
+ 核心特点:
6
6
 
7
- ```
8
- botlink 浜戠 瀹㈡埛鏈湴
9
- 鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹? 鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
10
- 鈹? botlink-web 鈹? 鈹? agents-bridge 鈹?
11
- 鈹? client-gateway 鈹? 鈹? 鈹?
12
- 鈹? bot-gateway 鈼勨攢鈹€鈹€鈹€鈹€鈹€鈹€鈹尖攢鈹€ HTTP 鈹? botlink channel 鈹?
13
- 鈹? message-svc 鈹? 闀胯疆璇⑩攤 鈫? 鈹?
14
- 鈹? routing-svc 鈹? 鈹? Agent Runtime 鈹?
15
- 鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹? 鈹? 鈹溾攢 Claude Code (CLI) 鈹?
16
- 鈹? 鈹溾攢 Codex (CLI) 鈹?
17
- 鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
18
- ```
7
+ - 客户端主动外连,无需暴露入站端口
8
+ - 支持 `claude-cli/...`、`codex-cli/...` 这类 CLI 模型引用
9
+ - 支持多 agent 配置与按绑定规则路由
10
+ - 提供 `onboard`、`add-agent`、`doctor`、`logs`、`config` 等运维命令
11
+ - 支持前台运行和守护进程模式
12
+
13
+ ## 架构概览
14
+
15
+ 链路可以简化为:
19
16
 
20
- agents-bridge 濮嬬粓浣滀负瀹㈡埛绔富鍔ㄥ杩炰簯绔紝瀹㈡埛鏃犻渶鏆撮湶浠讳綍绔彛銆?
17
+ `botlink cloud -> 长轮询 -> agents-bridge -> 本地 CLI backend / Agent Runtime`
21
18
 
22
- ## 蹇€熷紑濮?
19
+ 其中:
23
20
 
24
- ### 鏂瑰紡 A锛歯pm 鍏ㄥ眬瀹夎锛堟帹鑽愶級
21
+ - botlink 负责云端消息入口
22
+ - agents-bridge 负责轮询、路由、会话管理、日志和文件中转
23
+ - 本地 Agent Runtime 负责实际执行 Claude Code、Codex 等 CLI
24
+
25
+ ## 快速开始
26
+
27
+ ### 方式 A:npm 全局安装
25
28
 
26
29
  ```bash
27
30
  npm install -g agents-bridge@latest
28
31
 
29
- # 浜や簰寮忓紩瀵硷細杈撳叆 gateway URL銆乥ot token銆侀€夋嫨妯″瀷锛岃嚜鍔ㄧ敓鎴愰厤缃?
32
+ # 交互式初始化:输入 gateway URL、bot token、选择模型
30
33
  agents-bridge onboard
31
34
 
32
- # 鍚姩
35
+ # 前台启动
33
36
  agents-bridge start
34
- ```
35
37
 
36
- ### 鏂瑰紡 B锛欴ocker
37
-
38
- ```bash
39
- docker run -d --name agents-bridge \
40
- -v /home/user/project:/workspace \
41
- -v agents-bridge-data:/root/.agent-bridge \
42
- | `AGENT_BRIDGE_GATEWAY_URL` | `channels.botlink.gateway_url` 或 `channels.botlink.accounts.default.gateway_url` | botlink 网关地址 |
43
- | `AGENT_BRIDGE_BOT_TOKEN` | `channels.botlink.bot_token` 或 `channels.botlink.accounts.default.bot_token` | Bot Token |
44
- -e ANTHROPIC_API_KEY=sk-ant-xxx \
45
- agents-bridge:latest
38
+ # 或后台启动
39
+ agents-bridge start --daemon
46
40
  ```
47
41
 
48
- 鎴栦娇鐢?docker-compose锛?
42
+ ### 方式 B:Docker Compose
49
43
 
50
44
  ```bash
51
45
  cp .env.example .env
52
- # 缂栬緫 .env 濉叆瀹為檯鍊?
46
+ # 编辑 .env,填写 GATEWAY_URL、BOT_TOKEN 等变量
47
+
53
48
  docker compose up -d
54
49
  ```
55
50
 
56
- ### 鏂瑰紡 C锛氭簮鐮佽繍琛岋紙寮€鍙戣€咃級
51
+ `docker-compose.yml` 默认会:
52
+
53
+ - 挂载 `${WORKSPACE_DIR:-./workspace}` 到容器内 `/workspace`
54
+ - 持久化 `/root/.agent-bridge`
55
+ - 通过环境变量覆盖网关地址、Bot Token 和日志级别
56
+
57
+ ### 方式 C:源码运行
57
58
 
58
59
  ```bash
59
60
  git clone <repo-url>
60
- cd <repo-dir>
61
+ cd agent-bridge
61
62
  pnpm install
62
63
  pnpm build
63
- cp config.example.json config.json # 缂栬緫閰嶇疆
64
+ cp config.example.json config.json
65
+ # 编辑 config.json
64
66
  node dist/entry.js start
65
67
  ```
66
68
 
67
- 寮€鍙戞ā寮忥紙鑷姩閲嶈浇锛夛細
69
+ 开发模式:
68
70
 
69
71
  ```bash
70
72
  pnpm dev
71
73
  ```
72
74
 
73
- ## CLI 鍛戒护
75
+ ## CLI 命令
74
76
 
75
77
  ```bash
76
- agents-bridge start # 启动 gateway(前台)
77
- agents-bridge start --daemon # 启动为后台守护进程
78
- agents-bridge start -c <path> # 指定配置文件启动
79
- agents-bridge stop # 停止守护进程
80
- agents-bridge status # 查看运行状态
81
- agents-bridge onboard # 交互式初始化引导
82
- agents-bridge doctor # 诊断环境、会话持久化、日志与 CLI 路径
83
- agents-bridge logs # 查看当天最新日志
84
- agents-bridge config # 查看当前配置(脱敏显示)
85
- agents-bridge help # 帮助
78
+ agents-bridge start # 前台启动
79
+ agents-bridge start --daemon # 后台启动
80
+ agents-bridge start -c ./config.json # 指定配置文件
81
+ agents-bridge stop # 停止守护进程
82
+ agents-bridge restart # 重启
83
+ agents-bridge status # 查看运行状态
84
+ agents-bridge onboard # 交互式初始化
85
+ agents-bridge add-agent # 交互式追加一个 agent
86
+ agents-bridge doctor # 检查环境、CLI、API Key 和配置
87
+ agents-bridge logs # 查看最近日志
88
+ agents-bridge config # 输出当前配置
89
+ agents-bridge version # 查看版本
90
+ agents-bridge help # 查看帮助
86
91
  ```
87
92
 
88
- ## 閰嶇疆
93
+ ## 配置
89
94
 
90
- ### 閰嶇疆鏂囦欢
95
+ ### 配置文件搜索顺序
91
96
 
92
- 涓婚厤缃枃浠朵负 JSON 鏍煎紡锛屾悳绱㈤『搴忥細
97
+ 当前实现会按以下顺序读取第一个存在的配置文件:
93
98
 
94
- 1. CLI 鍙傛暟锛歚agents-bridge start -c /path/to/config.json`
95
- 2. 鐜鍙橀噺锛歚AGENT_BRIDGE_CONFIG=/path/to/config.json`
96
- 3. 鐢ㄦ埛鐩綍锛歚~/.agent-bridge/config.json`
97
- 4. 褰撳墠鐩綍锛歚./config.json`
99
+ 1. `agents-bridge start -c /path/to/config.json`
100
+ 2. 环境变量 `AGENT_BRIDGE_CONFIG`
101
+ 3. 当前目录 `./config.json`
102
+ 4. 用户目录 `~/.agent-bridge/config.json`
98
103
 
99
- 瀹屾暣绀轰緥瑙?[config.example.json](config.example.json)锛堝崟 agent锛夊拰 [config.multi-agent.example.json](config.multi-agent.example.json)锛堝 agent锛夈€傞厤缃瓧娈佃缁嗚鏄庤 [閰嶇疆鏂囨。](../agent-bridge-docs/docs/guides/configuration.md)銆?
100
- 褰撳墠杩愯鏃朵粎鏀寔 CLI 妯″紡妯″瀷锛屽 `claude-cli/...`銆乣codex-cli/...`銆俙anthropic/...`銆乣openai/...` 杩欑被 API 鐩磋繛妯″瀷寮曠敤鏆傛湭瀹炵幇鎵ц閾捐矾銆?
101
- ### 鏍稿績閰嶇疆椤癸紙鍗?agent锛?
104
+ ### 最小配置示例
102
105
 
103
106
  ```json
104
107
  {
105
108
  "channels": {
106
109
  "botlink": {
107
- "gateway_url": "https://your-botlink-instance.com",
108
- "bot_token": "bot_xxxxxxxxxxxxxxxxxx",
109
- "poll_timeout": 30,
110
- "retry_interval": 5,
111
- "max_retry_interval": 60
110
+ "gateway_url": "https://your-botlink.com",
111
+ "bot_token": "bot_xxx"
112
112
  }
113
113
  },
114
114
  "agents": {
115
115
  "defaults": {
116
116
  "model": {
117
117
  "primary": "claude-cli/opus-4.6"
118
- },
119
- "cliBackends": {
120
- "claude-cli": {
121
- "command": "claude",
122
- "args": ["-p", "--output-format", "json", "--dangerously-skip-permissions"],
123
- "resumeArgs": ["-p", "--output-format", "json", "--dangerously-skip-permissions", "--resume", "{sessionId}"],
124
- "output": "json",
125
- "modelArg": "--model",
126
- "sessionArg": "--session-id",
127
- "sessionIdFields": ["session_id", "sessionId", "conversation_id", "conversationId"],
128
- "sessionMode": "always",
129
- "serialize": true
130
- },
131
- "codex-cli": {
132
- "command": "codex",
133
- "args": ["exec", "--json", "..."],
134
- "resumeArgs": ["exec", "resume", "{sessionId}", "..."],
135
- "sessionMode": "existing",
136
- "output": "jsonl",
137
- "resumeOutput": "text",
138
- "modelArg": "--model",
139
- "sessionIdFields": ["thread_id"],
140
- "serialize": true
141
- }
142
118
  }
143
- }
144
- },
145
- "logging": {
146
- "level": "info"
147
- }
148
- }
149
- ```
150
-
151
- ### 澶?Agent 閰嶇疆
152
-
153
- 鍦?`agents` 涓嬪姞 `list` 瀹氫箟澶氫釜鍛藉悕 agent锛岀敤椤跺眰 `bindings` 鎸変細璇?鐢ㄦ埛璺敱锛?
154
-
155
- ```json
156
- {
157
- "agents": {
158
- "defaults": { "model": { "primary": "claude-cli/opus-4.6" } },
119
+ },
159
120
  "list": [
160
- { "id": "coder", "default": true, "workspace": "/home/user/app" },
161
- { "id": "ops", "model": "codex-cli/o3", "workspace": "/opt/infra" }
121
+ {
122
+ "id": "default",
123
+ "default": true
124
+ }
162
125
  ]
163
126
  },
164
127
  "bindings": [
165
- { "agentId": "ops", "match": { "peer": { "id": "-300" } } },
166
- { "agentId": "coder", "match": { "channel": "*" } }
128
+ {
129
+ "agentId": "default",
130
+ "match": {
131
+ "channel": "*"
132
+ }
133
+ }
167
134
  ]
168
135
  }
169
136
  ```
170
137
 
171
- 姣忎釜 agent 缁ф壙 `defaults` 骞跺彲瑕嗙洊 model銆亀orkspace銆乪nv銆乧liBackends 绛夈€傝瑙?[閰嶇疆鏂囨。](../agent-bridge-docs/docs/guides/configuration.md)銆?
138
+ 完整示例见:
172
139
 
173
- ### 鐜鍙橀噺瑕嗙洊
140
+ - [config.example.json](./config.example.json)
141
+ - [config.multi-agent.example.json](./config.multi-agent.example.json)
142
+ - [配置文档](../agent-bridge-docs/docs/guides/configuration.md)
174
143
 
175
- 鐜鍙橀噺鍙鐩栭厤缃枃浠朵腑鐨勫搴斿€硷細
144
+ ### 关键配置项
176
145
 
177
- | 鐜鍙橀噺 | 瑕嗙洊 | 璇存槑 |
178
- |---|---|---|
179
- | `AGENT_BRIDGE_CONFIG` | 鈥?| 閰嶇疆鏂囦欢璺緞 |
180
- | `AGENT_BRIDGE_GATEWAY_URL` | `channels.botlink.gateway_url` 或 `channels.botlink.accounts.default.gateway_url` | botlink 网关地址 |
181
- | `AGENT_BRIDGE_BOT_TOKEN` | `channels.botlink.bot_token` 或 `channels.botlink.accounts.default.bot_token` | Bot Token |
182
- | `AGENT_BRIDGE_LOG_LEVEL` | `logging.level` | 鏃ュ織绾у埆 |
183
- | `AGENT_BRIDGE_TEMP_DIR` | `files.temp_dir` | 涓存椂鏂囦欢鐩綍 |
146
+ - `channels.botlink.gateway_url`:botlink 网关地址
147
+ - `channels.botlink.bot_token`:bot token
148
+ - `agents.defaults.model.primary`:主模型引用,例如 `claude-cli/opus-4.6` 或 `codex-cli/gpt-5.4`
149
+ - `agents.defaults.model.fallbacks`:备用模型链
150
+ - `agents.defaults.cliBackends`:CLI backend 启动参数与运行模式
151
+ - `agents.list`:命名 agent 列表
152
+ - `bindings`:消息路由规则,可按 `channel`、`accountId`、`peer.id` 等条件匹配
153
+ - `files.temp_dir`:文件中转目录
154
+ - `logging.level`:日志级别
184
155
 
185
- ## 鏁版嵁鐩綍
156
+ ### 多 agent 配置
186
157
 
187
- ```
188
- ~/.agent-bridge/
189
- 鈹溾攢鈹€ config.json # 涓婚厤缃紙onboard 鐢熸垚锛?
190
- 鈹溾攢鈹€ agent-bridge.pid # PID 鏂囦欢锛坉aemon 妯″紡锛?
191
- 鈹溾攢鈹€ agents/ # per-agent 鐘舵€侊紙澶?agent 妯″紡锛?
192
- 鈹? 鈹溾攢鈹€ coder/
193
- 鈹? 鈹? 鈹斺攢鈹€ cli-sessions.json # coder 鐨?session 鏄犲皠
194
- 鈹? 鈹溾攢鈹€ reviewer/
195
- 鈹? 鈹? 鈹斺攢鈹€ cli-sessions.json
196
- 鈹? 鈹斺攢鈹€ default/ # 闅愬紡 agent锛堟湭閰?list 鏃讹級
197
- 鈹? 鈹斺攢鈹€ cli-sessions.json
198
- 鈹溾攢鈹€ data/
199
- 鈹? 鈹溾攢鈹€ sessions/ # 鏃х増 session 瀛樺偍锛堝崌绾у悗鑷姩杩佺Щ锛?
200
- 鈹? 鈹溾攢鈹€ files/ # 鏂囦欢涓浆涓存椂鐩綍
201
- 鈹? 鈹斺攢鈹€ logs/ # 鏃ュ織鏂囦欢
202
- 鈹斺攢鈹€ skills/ # 鑷畾涔夋妧鑳?
203
- ```
158
+ 多 agent 模式通过 `agents.list` 定义运行实例,通过 `bindings` 决定消息路由到哪个 agent。
204
159
 
205
- ## 椤圭洰缁撴瀯
160
+ 追加 agent 时,也可以直接运行:
206
161
 
162
+ ```bash
163
+ agents-bridge add-agent
207
164
  ```
208
- agents-bridge/
209
- 鈹溾攢鈹€ bin/
210
- 鈹? 鈹斺攢鈹€ agent-bridge.mjs # CLI 鍏ュ彛锛坣pm 鍏ㄥ眬瀹夎锛?
211
- 鈹溾攢鈹€ src/
212
- 鈹? 鈹溾攢鈹€ entry.ts # 涓诲叆鍙o紝瀛愬懡浠よ矾鐢?
213
- 鈹? 鈹溾攢鈹€ cli/ # CLI 鍛戒护瀹炵幇
214
- 鈹? 鈹? 鈹溾攢鈹€ run-main.ts # 鍙傛暟瑙f瀽
215
- 鈹? 鈹? 鈹溾攢鈹€ cmd-start.ts # start 鍛戒护
216
- 鈹? 鈹? 鈹溾攢鈹€ cmd-stop.ts # stop 鍛戒护
217
- 鈹? 鈹? 鈹溾攢鈹€ cmd-status.ts # status 鍛戒护
218
- 鈹? 鈹? 鈹溾攢鈹€ cmd-onboard.ts # onboard 浜や簰寮曞
219
- 鈹? 鈹? 鈹溾攢鈹€ cmd-doctor.ts # doctor 鐜璇婃柇
220
- 鈹? 鈹? 鈹溾攢鈹€ cmd-logs.ts # logs 鏌ョ湅
221
- 鈹? 鈹? 鈹斺攢鈹€ cmd-config.ts # config 鏌ョ湅
222
- 鈹? 鈹溾攢鈹€ config/ # 閰嶇疆鍔犺浇涓庢牎楠?
223
- 鈹? 鈹? 鈹溾攢鈹€ config.ts # 涓诲姞杞藉櫒
224
- 鈹? 鈹? 鈹溾攢鈹€ zod-schema.ts # Zod schema
225
- 鈹? 鈹? 鈹溾攢鈹€ paths.ts # 鏁版嵁鐩綍璺緞甯搁噺
226
- 鈹? 鈹? 鈹溾攢鈹€ env-vars.ts # 鐜鍙橀噺璇诲彇
227
- 鈹? 鈹? 鈹溾攢鈹€ merge-config.ts # 閰嶇疆鍚堝苟
228
- 鈹? 鈹? 鈹斺攢鈹€ agent-dirs.ts # 鐩綍鍒濆鍖?
229
- 鈹? 鈹溾攢鈹€ channels/ # Channel 鎻掍欢妗嗘灦
230
- 鈹? 鈹? 鈹溾攢鈹€ registry.ts # 鎻掍欢娉ㄥ唽琛?
231
- 鈹? 鈹? 鈹溾攢鈹€ session.ts # 浼氳瘽绠$悊
232
- 鈹? 鈹? 鈹斺攢鈹€ ...
233
- 鈹? 鈹溾攢鈹€ agents/ # Agent 杩愯鏃?
234
- 鈹? 鈹? 鈹溾攢鈹€ agent-resolver.ts # 澶?agent 閰嶇疆瑙f瀽锛坉efaults + list 鍚堝苟锛?
235
- 鈹? 鈹? 鈹溾攢鈹€ agent-router.ts # 娑堟伅璺敱锛坆indings 鍖归厤锛?
236
- 鈹? 鈹? 鈹溾攢鈹€ cli-backends.ts # CLI backend provider id / 榛樿閰嶇疆瑁呴厤
237
- 鈹? 鈹? 鈹溾攢鈹€ cli-session-store.ts # CLI session 鏄犲皠鎸佷箙鍖栵紙per-agent锛?
238
- 鈹? 鈹? 鈹溾攢鈹€ cli-runner.ts # Claude/Codex CLI 鎵ц鍣?
239
- 鈹? 鈹? 鈹斺攢鈹€ ...
240
- 鈹? 鈹溾攢鈹€ types/ # 绫诲瀷瀹氫箟
241
- 鈹? 鈹斺攢鈹€ logger.ts # Pino 鏃ュ織
242
- 鈹溾攢鈹€ extensions/ # Channel 鎻掍欢锛坆otlink锛?
243
- 鈹溾攢鈹€ skills/ # 鎶€鑳藉畾涔?
244
- 鈹溾攢鈹€ config.example.json # 閰嶇疆绀轰緥
245
- 鈹溾攢鈹€ .env.example # 鐜鍙橀噺绀轰緥
246
- 鈹溾攢鈹€ Dockerfile
247
- 鈹溾攢鈹€ docker-compose.yml
248
- 鈹溾攢鈹€ package.json
249
- 鈹斺攢鈹€ tsconfig.json
250
- ```
251
165
 
252
- ## 褰撳墠鏀寔鐨?Agent 妯″紡
166
+ 该命令会在现有配置上:
167
+
168
+ - 追加一个 `agents.list[]` 项
169
+ - 可选绑定已有 botlink `accountId`
170
+ - 可选创建新的 botlink account 并立刻绑定
171
+ - 写入前自动备份原配置文件
253
172
 
254
- | 妯″紡 | 妯″瀷寮曠敤绀轰緥 | 璇存槑 |
173
+ 例如:
174
+
175
+ - 一个 bot 绑定到 Codex
176
+ - 一个 bot 绑定到 Claude Code
177
+ - 不同工作区使用不同 `workspace`
178
+ - 通过预置 `cliSessionId` 复用既有 CLI 会话
179
+
180
+ 详见 [config.multi-agent.example.json](./config.multi-agent.example.json)。
181
+
182
+ ### 环境变量覆盖
183
+
184
+ 环境变量可覆盖配置文件中的对应值:
185
+
186
+ | 环境变量 | 覆盖字段 | 说明 |
255
187
  |---|---|---|
256
- | Claude Code | `claude-cli/opus-4.6` | 通过 CLI backend 启动本地 `claude` 命令 |
257
- | Codex | `codex-cli/gpt-5.4` | 通过 CLI backend 启动本地 `codex` 命令 |
258
- | Pi Agent | `anthropic/claude-sonnet-4-6` | 通过 LLM API 直连,内置工具执行 |
188
+ | `AGENT_BRIDGE_CONFIG` | 配置文件路径 | 指定要加载的 `config.json` |
189
+ | `AGENT_BRIDGE_GATEWAY_URL` | `channels.botlink.gateway_url` | botlink 网关地址 |
190
+ | `AGENT_BRIDGE_BOT_TOKEN` | `channels.botlink.bot_token` | Bot Token |
191
+ | `AGENT_BRIDGE_LOG_LEVEL` | `logging.level` | 日志级别 |
192
+ | `AGENT_BRIDGE_TEMP_DIR` | `files.temp_dir` | 临时文件目录 |
193
+ | `ANTHROPIC_API_KEY` | 环境变量 | 供诊断或后续 API 模式使用 |
194
+ | `OPENAI_API_KEY` | 环境变量 | 供诊断或后续 API 模式使用 |
259
195
 
260
- 鍦?`config.json` 鐨?`agents.defaults.model.primary` 涓€夋嫨銆?
196
+ ## 模型与运行模式
261
197
 
262
- ## CLI Backend 绾﹀畾
198
+ 当前消息执行链路仅支持 CLI 模式模型,也就是:
263
199
 
264
- - 内置 provider id 固定为 `claude-cli`、`codex-cli`。
265
- - `agents.defaults.cliBackends` 会覆盖内置默认值,不需要重复写全量字段。
266
- - `SessionEnvelope.sessionId` 是 botlink 稳定会话键,不等于 Claude/Codex 自己的 session id。
267
- - CLI backend session id 会持久化到 `~/.agent-bridge/data/sessions/cli-sessions.json` 的 `cliSessionIds[providerId]`。
268
- - `serialize: true` 的语义是“同一 botlink session 串行、跨 session 可并发”。
269
- - Claude CLI 走 JSON 输出;Codex CLI 首次运行走 JSONL,resume 走 text。
270
- - agents-bridge 会把运行日志同时写到 stdout 和 `~/.agent-bridge/data/logs/agent-bridge-YYYY-MM-DD.log`。
271
- - `agents-bridge doctor` 会检查 Codex 会话是否缺失 `thread_id` 持久化,便于定位“每次都 fresh”的问题。
200
+ - `claude-cli/...`
201
+ - `codex-cli/...`
272
202
 
273
- ## 鎶€鏈爤
203
+ 配置层已经允许 `anthropic/...`、`openai/...` 这类 API provider 引用,但当前主运行时尚未实现 API 模式;若把它们设为主模型,程序会返回“当前仅支持 CLI 模式模型”。
274
204
 
275
- - TypeScript + Node.js (>= 22.0.0)
276
- - pnpm (>= 9.0.0)
277
- - Pino锛堟棩蹇楋級
278
- - Zod锛堥厤缃牎楠岋級
279
- - JSON锛堥厤缃牸寮忥級
205
+ ## 数据目录
280
206
 
281
- ## 寮€鍙?
207
+ 运行时数据默认保存在 `~/.agent-bridge/`:
208
+
209
+ ```text
210
+ ~/.agent-bridge/
211
+ ├── config.json
212
+ ├── agent-bridge.pid
213
+ ├── agents/
214
+ │ └── <agentId>/
215
+ │ └── cli-sessions.json
216
+ ├── data/
217
+ │ ├── files/
218
+ │ ├── logs/
219
+ │ └── sessions/
220
+ └── skills/
221
+ ```
222
+
223
+ 其中:
224
+
225
+ - `config.json`:全局配置文件
226
+ - `agent-bridge.pid`:守护进程 PID 文件
227
+ - `agents/<agentId>/cli-sessions.json`:每个 agent 的 CLI 会话映射
228
+ - `data/logs/`:按天滚动的日志文件
229
+ - `skills/`:自定义技能目录
230
+
231
+ ## 项目结构
232
+
233
+ ```text
234
+ agent-bridge/
235
+ ├── bin/ # CLI 入口
236
+ ├── src/
237
+ │ ├── cli/ # start / stop / onboard / doctor 等命令
238
+ │ ├── agents/ # Agent 解析、路由、CLI 执行
239
+ │ ├── channels/ # Channel 插件(如 botlink)
240
+ │ ├── config/ # 配置加载、校验、默认值
241
+ │ ├── types/ # 类型定义
242
+ │ └── logger.ts # 日志
243
+ ├── extensions/ # 扩展点
244
+ ├── skills/ # 本地技能目录
245
+ ├── config.example.json
246
+ ├── config.multi-agent.example.json
247
+ ├── docker-compose.yml
248
+ ├── Dockerfile
249
+ └── package.json
250
+ ```
251
+
252
+ ## 开发
282
253
 
283
254
  ```bash
284
- pnpm install # 瀹夎渚濊禆
285
- pnpm build # 缂栬瘧
286
- pnpm dev # 寮€鍙戞ā寮忥紙鑷姩閲嶈浇锛?
287
- pnpm typecheck # 绫诲瀷妫€鏌?
255
+ pnpm install
256
+ pnpm build
257
+ pnpm typecheck
258
+ pnpm dev
288
259
  ```
289
260
 
261
+ 环境要求:
262
+
263
+ - Node.js >= 22.0.0
264
+ - pnpm >= 9.0.0
265
+
266
+ ## 相关文档
267
+
268
+ - [文档索引](../agent-bridge-docs/INDEX.md)
269
+ - [配置文档](../agent-bridge-docs/docs/guides/configuration.md)
270
+
271
+ ## 许可证
290
272
 
273
+ [MIT](./LICENSE)
@@ -8,11 +8,11 @@
8
8
  "max_retry_interval": 60
9
9
  }
10
10
  },
11
- "agents": {
12
- "defaults": {
13
- "model": {
14
- "primary": "claude-cli/opus-4.6",
15
- "fallbacks": [
11
+ "agents": {
12
+ "defaults": {
13
+ "model": {
14
+ "primary": "claude-cli/opus-4.6",
15
+ "fallbacks": [
16
16
  "codex-cli/gpt-5.4"
17
17
  ]
18
18
  },
@@ -77,22 +77,22 @@
77
77
  "args": [
78
78
  "exec",
79
79
  "--json",
80
- "--color",
81
- "never",
82
- "--sandbox",
83
- "workspace-write",
84
- "--skip-git-repo-check"
85
- ],
80
+ "--color",
81
+ "never",
82
+ "--sandbox",
83
+ "workspace-write",
84
+ "--skip-git-repo-check"
85
+ ],
86
86
  "resumeArgs": [
87
87
  "exec",
88
88
  "resume",
89
89
  "{sessionId}",
90
- "--color",
91
- "never",
92
- "--sandbox",
93
- "workspace-write",
94
- "--skip-git-repo-check"
95
- ],
90
+ "--color",
91
+ "never",
92
+ "--sandbox",
93
+ "workspace-write",
94
+ "--skip-git-repo-check"
95
+ ],
96
96
  "output": "jsonl",
97
97
  "resumeOutput": "text",
98
98
  "input": "arg",
@@ -102,13 +102,13 @@
102
102
  "sessionSource": "agent-bridge",
103
103
  "startupTimeoutMs": 15000,
104
104
  "requestTimeoutMs": 30000,
105
- "serviceName": "agent-bridge",
106
- "experimentalApi": false,
107
- "approvalPolicy": "never",
108
- "sandbox": "workspace-write",
109
- "persistExtendedHistory": false,
110
- "experimentalRawEvents": false
111
- },
105
+ "serviceName": "agent-bridge",
106
+ "experimentalApi": false,
107
+ "approvalPolicy": "never",
108
+ "sandbox": "workspace-write",
109
+ "persistExtendedHistory": false,
110
+ "experimentalRawEvents": false
111
+ },
112
112
  "sessionIdFields": [
113
113
  "thread_id"
114
114
  ],
@@ -129,28 +129,28 @@
129
129
  "maxMs": 180000
130
130
  }
131
131
  }
132
- }
133
- }
134
- }
135
- },
136
- "list": [
137
- {
138
- "id": "default",
139
- "default": true
140
- }
141
- ]
142
- },
143
- "bindings": [
144
- {
145
- "agentId": "default",
146
- "match": {
147
- "channel": "*"
148
- }
149
- }
150
- },
151
- "skills": {
152
- "dirs": [
153
- "./skills"
132
+ }
133
+ }
134
+ }
135
+ },
136
+ "list": [
137
+ {
138
+ "id": "default",
139
+ "default": true
140
+ }
141
+ ]
142
+ },
143
+ "bindings": [
144
+ {
145
+ "agentId": "default",
146
+ "match": {
147
+ "channel": "*"
148
+ }
149
+ }
150
+ },
151
+ "skills": {
152
+ "dirs": [
153
+ "./skills"
154
154
  ]
155
155
  },
156
156
  "files": {
@@ -4,7 +4,8 @@ import { type CodexTurnRuntime } from './codex-app-server-runtime.js';
4
4
  import { CliSessionStore } from './cli-session-store.js';
5
5
  export declare class LocalCliTurnExecutor implements CliTurnExecutor {
6
6
  private readonly options;
7
- private codexRuntime;
7
+ private activeCodexRuntime;
8
+ private readonly drainingCodexRuntimes;
8
9
  constructor(options: {
9
10
  config: Pick<AppConfig, 'agents'>;
10
11
  logger: Logger;
@@ -16,7 +17,9 @@ export declare class LocalCliTurnExecutor implements CliTurnExecutor {
16
17
  private emitProcessing;
17
18
  private executeTurn;
18
19
  teardown(): Promise<void>;
19
- private getCodexRuntime;
20
+ rotateCodexRuntime(): Promise<void>;
21
+ private acquireCodexRuntime;
22
+ private releaseCodexRuntime;
20
23
  private executeCodexAppServerTurn;
21
24
  private executeCliExecTurn;
22
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cli-runner.d.ts","sourceRoot":"","sources":["../../src/agents/cli-runner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,KAAK,EACV,gBAAgB,EAGhB,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,MAAM,EAEP,MAAM,mBAAmB,CAAA;AAc1B,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,+BAA+B,CAAA;AACtC,OAAO,EAAE,eAAe,EAAwB,MAAM,wBAAwB,CAAA;AAkB9E,qBAAa,oBAAqB,YAAW,eAAe;IAIxD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAH1B,OAAO,CAAC,YAAY,CAAgC;gBAGjC,OAAO,EAAE;QACxB,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;QACjC,MAAM,EAAE,MAAM,CAAA;QACd,YAAY,CAAC,EAAE,eAAe,CAAA;QAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAA;QACzB,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,gBAAgB,CAAA;KACrE;IAGG,GAAG,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;YAyHxC,cAAc;YAId,WAAW;IAqBnB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAI/B,OAAO,CAAC,eAAe;YAUT,yBAAyB;YA+DzB,kBAAkB;CAwIjC"}
1
+ {"version":3,"file":"cli-runner.d.ts","sourceRoot":"","sources":["../../src/agents/cli-runner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,KAAK,EACV,gBAAgB,EAGhB,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,MAAM,EAEP,MAAM,mBAAmB,CAAA;AAc1B,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,+BAA+B,CAAA;AACtC,OAAO,EAAE,eAAe,EAAwB,MAAM,wBAAwB,CAAA;AAuB9E,qBAAa,oBAAqB,YAAW,eAAe;IAKxD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJ1B,OAAO,CAAC,kBAAkB,CAAgC;IAC1D,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAA8B;gBAGjD,OAAO,EAAE;QACxB,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;QACjC,MAAM,EAAE,MAAM,CAAA;QACd,YAAY,CAAC,EAAE,eAAe,CAAA;QAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAA;QACzB,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,gBAAgB,CAAA;KACrE;IAGG,GAAG,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;YAyHxC,cAAc;YAId,WAAW;IAqBnB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAYzB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IAezC,OAAO,CAAC,mBAAmB;YAab,mBAAmB;YAUnB,yBAAyB;YAqEzB,kBAAkB;CAwIjC"}