qq-codex-bridge 0.1.3 → 0.1.4

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 (39) hide show
  1. package/.env.example +62 -0
  2. package/README.md +232 -287
  3. package/bin/chatgpt-desktop.js +2 -0
  4. package/bin/qq-codex-weixin-gateway.js +14 -0
  5. package/dist/apps/bridge-daemon/src/bootstrap.js +161 -31
  6. package/dist/apps/bridge-daemon/src/cli.js +5 -1
  7. package/dist/apps/bridge-daemon/src/config.js +168 -37
  8. package/dist/apps/bridge-daemon/src/http-server.js +23 -11
  9. package/dist/apps/bridge-daemon/src/main.js +163 -29
  10. package/dist/apps/bridge-daemon/src/thread-command-handler.js +309 -26
  11. package/dist/apps/chatgpt-desktop-cli/src/cli.js +191 -0
  12. package/dist/apps/weixin-gateway/src/cli.js +446 -0
  13. package/dist/apps/weixin-gateway/src/config.js +135 -0
  14. package/dist/apps/weixin-gateway/src/dev.js +2 -0
  15. package/dist/apps/weixin-gateway/src/message-store.js +50 -0
  16. package/dist/apps/weixin-gateway/src/server.js +216 -0
  17. package/dist/apps/weixin-gateway/src/state.js +163 -0
  18. package/dist/apps/weixin-gateway/src/weixin-client.js +520 -0
  19. package/dist/packages/adapters/chatgpt-desktop/src/ax-client.js +472 -0
  20. package/dist/packages/adapters/chatgpt-desktop/src/bridge-provider.js +82 -0
  21. package/dist/packages/adapters/chatgpt-desktop/src/driver.js +161 -0
  22. package/dist/packages/adapters/chatgpt-desktop/src/image-cache.js +155 -0
  23. package/dist/packages/adapters/chatgpt-desktop/src/session-registry.js +48 -0
  24. package/dist/packages/adapters/chatgpt-desktop/src/types.js +1 -0
  25. package/dist/packages/adapters/codex-desktop/src/codex-app-server-driver.js +810 -0
  26. package/dist/packages/adapters/codex-desktop/src/codex-app-ui-notification-forwarder.js +33 -0
  27. package/dist/packages/adapters/codex-desktop/src/codex-desktop-driver.js +727 -123
  28. package/dist/packages/adapters/codex-desktop/src/codex-local-rollout-reader.js +227 -0
  29. package/dist/packages/adapters/codex-desktop/src/codex-local-submission-reader.js +142 -0
  30. package/dist/packages/adapters/weixin/src/weixin-channel-adapter.js +15 -0
  31. package/dist/packages/adapters/weixin/src/weixin-http-client.js +42 -0
  32. package/dist/packages/adapters/weixin/src/weixin-sender.js +200 -0
  33. package/dist/packages/adapters/weixin/src/weixin-webhook.js +35 -0
  34. package/dist/packages/orchestrator/src/bridge-orchestrator.js +72 -25
  35. package/dist/packages/orchestrator/src/weixin-outbound-format.js +55 -0
  36. package/dist/packages/ports/src/chat.js +1 -0
  37. package/dist/packages/store/src/session-repo.js +16 -3
  38. package/dist/packages/store/src/sqlite.js +3 -0
  39. package/package.json +8 -2
package/README.md CHANGED
@@ -7,444 +7,389 @@
7
7
 
8
8
  ![qq-codex-bridge README Hero](./output/readme-hero-nanobanana-productized-v1.png)
9
9
 
10
- 一个把 **QQ 官方机器人会话** 桥接到 **Codex Desktop** 的开源实验项目。
10
+ ## Codex / ChatGPT Desktop 变成你的 QQ / 微信私人 AI 助理
11
11
 
12
- 它的核心目标很直接:
12
+ **qq-codex-bridge** 是一个开源本地桥接工具,让你通过 **QQ** 或**微信**直接对话 **Codex Desktop** 或 **ChatGPT Desktop**——支持图片理解、语音提问、文件分析、AI 生图回传,私聊群聊都能用,同时支持多 Bot、多账号接入。
13
13
 
14
- - 在 QQ 私聊 / 群聊里接收用户消息
15
- - 按会话把消息映射到 Codex Desktop 线程
16
- - 用 CDP 驱动 Codex Desktop 发送消息、切线程、读取回复
17
- - 把 Codex 的文本、图片、文件、语音转写结果继续回送到 QQ
14
+ ---
18
15
 
19
- 项目当前已经能跑真实链路,但仍然属于 **实验性可用** 阶段,更适合开发者联调、研究和二次改造,而不是直接当成稳定生产系统。
16
+ ## 你可以这样用
20
17
 
21
- ## 文档导航
18
+ ### 发张图片,让 AI 帮你看
22
19
 
23
- - [快速开始](#快速开始)
24
- - [FAQ 与故障排查](./docs/faq.md)
25
- - [架构说明](./docs/architecture.md)
26
- - [在线 Wiki(GitNexus 自动生成)](https://gistcdn.githack.com/983033995/3206d28d1bd71323166bc511b8681620/raw/index.html#overview)
27
- - [测试说明](./docs/testing.md)
28
- - [变更记录](./CHANGELOG.md)
29
- - [贡献指南](./CONTRIBUTING.md)
30
- - [安全策略](./SECURITY.md)
20
+ 遇到截图、照片、产品图?直接发给机器人,AI 会结合图片内容给出分析。手机端 QQ、桌面端 QQ 均可使用。
31
21
 
32
- ---
22
+ ![图片理解](./output/截屏%202026-04-10%2021.33.09.png)
33
23
 
34
- ## 项目特性
24
+ ### 语音提问,张口就来
35
25
 
36
- ### 核心链路
26
+ 发一条语音,桥接会自动转写后发给 AI。双手不便打字时,直接说话就能问。
37
27
 
38
- - QQ 官方 Bot WebSocket gateway 入站
39
- - QQ 私聊 / 群聊会话隔离
40
- - Codex Desktop 启动检查与 CDP 连接
41
- - QQ 消息映射到 Codex 线程
42
- - Codex 回复增量采集并多次回传到 QQ
43
- - SQLite 持久化会话、入站记录、出站任务
28
+ ### Markdown 和代码,结构完整回传
44
29
 
45
- ### 媒体与 STT
46
-
47
- - QQ 附件下载与上下文注入
48
- - 图片
49
- - 语音
50
- - 视频
51
- - 文件
52
- - 语音转文字
53
- - QQ 自带 `asr_refer_text` 回退
54
- - `openai-compatible`
55
- - `volcengine-flash`
56
- - 本地离线 `whisper.cpp`
57
- - QQ 媒体回传
58
- - 图片
59
- - 音频
60
- - 视频
61
- - 文件
62
-
63
- ### Codex 回复处理
64
-
65
- - 富文本链接提取
66
- - 有序列表编号保留
67
- - 代码块序列化为 fenced markdown
68
- - 表格结构保留
69
- - 长耗时任务回复采集窗口延长
70
- - 同一轮回复中的媒体结果继续跟进,不再只截前几段文本
30
+ AI 输出的列表、代码块、表格会尽量保留格式后再发到 QQ。写代码、看文档都清晰。
71
31
 
72
- ### 线程管理
32
+ ![Markdown 渲染效果](./output/截屏%202026-04-10%2021.31.46.png)
73
33
 
74
- 仅私聊可用:
34
+ ### AI 生成了图片?直接发回 QQ
75
35
 
76
- | 用途 | 完整命令 | 简写 |
77
- | --- | --- | --- |
78
- | 查看最近活跃线程 | `/threads` | `/t` |
79
- | 查看当前绑定线程 | `/thread current` | `/tc` |
80
- | 切换到指定线程 | `/thread use <序号>` | `/tu <序号>` |
81
- | 新建线程 | `/thread new <标题>` | `/tn <标题>` |
82
- | 基于最近对话 fork 线程 | `/thread fork <标题>` | `/tf <标题>` |
83
- | 查看帮助 | `/help` | - |
84
-
85
- ---
36
+ Codex / ChatGPT 调用图片生成工具后,成品会自动回传到 QQ 对话里。创作结果一目了然。
86
37
 
87
- ## 适用场景
38
+ ![AI 生图回传](./output/截屏%202026-04-10%2022.00.25.png)
88
39
 
89
- - 想直接在 QQ 里把 Codex 当成一个“会话型桌面代理”来用
90
- - 需要把图片、语音、文件上下文桥接给 Codex
91
- - 想研究 Codex Desktop 的 CDP 自动化与回复采集
92
- - 想复用 QQ 官方 Bot 能力,但不依赖 OpenClaw 宿主
40
+ ### 私聊线程管理,复杂任务不丢上下文
93
41
 
94
- ---
42
+ 在 QQ 私聊中直接查看、切换、新建 Codex / ChatGPT 对话线程。大型项目可以分线程讨论,每个线程独立记忆,互不干扰。
95
43
 
96
- ## 项目效果
44
+ ![线程管理](./output/截屏%202026-04-10%2021.47.08.png)
97
45
 
98
- ### Markdown 与代码回复
46
+ ---
99
47
 
100
- Codex 的列表、代码块、表格会尽量保留结构后再发给 QQ。
48
+ ## 工作原理
101
49
 
102
- ![Markdown 渲染效果](./output/截屏%202026-04-10%2021.31.46.png)
50
+ ```text
51
+ QQ Bot / 微信
52
+
53
+
54
+ BridgeOrchestrator(本地 Node.js 进程)
55
+
56
+ ├── SessionStore / TranscriptStore(SQLite)
57
+ ├── Channel Sender(QQ / 微信)
58
+
59
+ ├── CodexDesktopDriver ──► Chrome DevTools Protocol ──► Codex Desktop
60
+ └── ChatgptDesktopDriver ──► macOS Accessibility API ──► ChatGPT Desktop
61
+ ```
103
62
 
104
- ### 图片理解
63
+ 桥接运行在本地,通过 CDP 驱动 Codex Desktop,通过 macOS Accessibility API 驱动 ChatGPT Desktop,完成消息收发和上下文注入。每个私聊会话可以独立绑定对话线程,并通过 `/source` 命令随时切换 AI 源。
105
64
 
106
- 发送图片给机器人,Codex 可以结合图片内容继续回答。
65
+ ---
107
66
 
108
- ![图片理解](./output/截屏%202026-04-10%2021.33.09.png)
67
+ ## 快速开始
109
68
 
110
- ### 线程管理
69
+ ### 第 0 步:创建 QQ 机器人,获取 AppID 和 AppSecret
111
70
 
112
- QQ 私聊中直接查看最近活跃线程,并快速切换。
71
+ 1. 打开 [QQ 开放平台](https://q.qq.com/qqbot/openclaw/index.html),登录后点击「**创建机器人**」
72
+ 2. 填写机器人名称和简介,完成创建
73
+ 3. 进入机器人详情页,复制 **AppID** 和 **AppSecret**(点击"查看"可显示 AppSecret)
113
74
 
114
- ![线程管理](./output/截屏%202026-04-10%2021.47.08.png)
75
+ ![QQ 开放平台机器人创建页面](https://minimax-algeng-chat-tts.oss-cn-wulanchabu.aliyuncs.com/ccv2%2F2026-04-13%2FMiniMax-M2.7%2F2022349168671990452%2F7e608ce17a900fa601a014dc957ef1314be87cff5a110e27615a5393bf2912d6..png?Expires=1776145198&OSSAccessKeyId=LTAI5tGLnRTkBjLuYPjNcKQ8&Signature=eM71QgFWMmELUyeGG2fLn3Onugk%3D)
115
76
 
116
- ### AI 生图回传
77
+ > 同一 AppID + AppSecret 可以同时在多个群聊和私聊中使用,无需重复创建。
117
78
 
118
- Codex 调用图片生成工具后,桥接会把成品图片继续回传到 QQ。
79
+ ### 1 步:生成配置文件
119
80
 
120
- ![AI 生图回传](./output/截屏%202026-04-10%2022.00.25.png)
81
+ 推荐直接用 `npx`:
121
82
 
122
- ---
83
+ ```bash
84
+ npx qq-codex-bridge init
85
+ ```
123
86
 
124
- ## 技术架构
87
+ 或全局安装后使用:
125
88
 
126
- ```text
127
- QQ Official Bot Gateway
128
-
129
-
130
- QqGatewayClient / QqGateway
131
-
132
-
133
- BridgeOrchestrator
134
-
135
- ├── SessionStore / TranscriptStore (SQLite)
136
- ├── QqSender / QqApiClient
137
- └── CodexDesktopDriver
138
-
139
- └── Chrome DevTools Protocol
140
-
141
- └── Codex Desktop
89
+ ```bash
90
+ npm i -g qq-codex-bridge
91
+ qq-codex-bridge init
142
92
  ```
143
93
 
144
- 更贴近实际运行时的链路是:
94
+ 这会将内置配置模板写入当前目录的 `.env`。
145
95
 
146
- ```text
147
- QQ 消息
148
- -> 归一化 / 附件下载 / STT
149
- -> 构造成 Codex 入站上下文
150
- -> 注入 Codex Desktop
151
- -> 轮询最新 assistant unit
152
- -> 增量 draft
153
- -> QQ 文本 / 媒体发送
154
- -> SQLite 记录入站与出站任务
155
- ```
96
+ ### 第 2 步:填写 `.env`
156
97
 
157
- ---
98
+ 将上一步复制的 **AppID** 和 **AppSecret** 填入 `.env`:
158
99
 
159
- ## 和官方项目的关系
100
+ ```env
101
+ QQBOT_APP_ID=你的AppID
102
+ QQBOT_CLIENT_SECRET=你的ClientSecret
103
+ ```
160
104
 
161
- 这个项目参考了:
105
+ `.env` 中其他常用变量:
162
106
 
163
- - [tencent-connect/openclaw-qqbot](https://github.com/tencent-connect/openclaw-qqbot)
164
- - [openclaw/openclaw](https://github.com/openclaw/openclaw)
107
+ | 变量 | 说明 | 默认值 |
108
+ |---|---|---|
109
+ | `CODEX_REMOTE_DEBUGGING_PORT` | Codex Desktop 远程调试端口 | `9229` |
110
+ | `QQBOT_STT_*` | 语音转文字配置(可选,不填则用 QQ 内置 ASR) | — |
111
+ | `QQBOT_MARKDOWN_SUPPORT` | 是否启用 QQ markdown 文本发送 | `false` |
165
112
 
166
- 主要借鉴了这些思路:
113
+ ### 第 3 步:启动桥接
167
114
 
168
- - QQ gateway WebSocket 入站
169
- - 出站消息路由与媒体发送
170
- - 语音 / 文件处理方式
171
- - Markdown 分块发送思路
172
- - “增量回复 -> 分段回传”的设计方向
115
+ ```bash
116
+ npx qq-codex-bridge
117
+ ```
173
118
 
174
- 但两者仍然不同:
119
+ 正常启动后会看到类似日志:
175
120
 
176
- | 项目 | 运行位置 | 宿主 |
177
- | --- | --- | --- |
178
- | `openclaw-qqbot` | OpenClaw 插件 | OpenClaw |
179
- | `qq-codex-bridge` | 本地 Node.js 进程 | Codex Desktop |
121
+ ```text
122
+ [qq-codex-bridge] codex desktop ready { launched: true|false, remoteDebuggingPort: 9229 }
123
+ [qq-codex-bridge] ready { transport: 'qq-gateway-websocket', accountKeys: ['qqbot:default'], conversationProvider: 'codex-desktop' }
124
+ ```
180
125
 
181
- 所以这个项目不是 OpenClaw 插件移植版,而是 **面向 Codex Desktop 的独立桥接实现**。
126
+ > 桥接会先检查 Codex Desktop 是否已运行;若未运行,会尽量自动拉起后再继续。
182
127
 
183
- ---
128
+ ### 第 4 步:在 QQ 中联调
184
129
 
185
- ## 项目结构
130
+ 建议按这个顺序测试:
186
131
 
187
- ```text
188
- apps/bridge-daemon/
189
- src/
190
- main.ts
191
- bootstrap.ts
192
- config.ts
193
- thread-command-handler.ts
194
- debug-codex-workers.ts
195
-
196
- packages/adapters/qq/
197
- src/
198
- qq-gateway-client.ts
199
- qq-gateway.ts
200
- qq-api-client.ts
201
- qq-sender.ts
202
- qq-media-downloader.ts
203
- qq-media-parser.ts
204
- qq-stt.ts
205
-
206
- packages/adapters/codex-desktop/
207
- src/
208
- cdp-session.ts
209
- codex-desktop-driver.ts
210
- composer-heuristics.ts
211
- reply-parser.ts
212
-
213
- packages/orchestrator/
214
- src/
215
- bridge-orchestrator.ts
216
- media-context.ts
217
- qq-outbound-draft.ts
218
- qq-outbound-format.ts
219
- qqbot-skill-context.ts
220
-
221
- packages/store/
222
- src/
223
- sqlite.ts
224
- session-repo.ts
225
- message-repo.ts
226
- ```
132
+ 1. **普通文本** — 先确认消息收发正常
133
+ 2. **一条会让 AI 分阶段回答的问题** — 验证增量回复采集
134
+ 3. **一条语音** — 验证 STT 转写链路
135
+ 4. **一张图片** — 验证图片上下文注入
136
+ 5. **`/t` 与 `/tu 2`** — 验证线程管理命令
227
137
 
228
138
  ---
229
139
 
230
- ## 环境要求
140
+ ## 微信通道
231
141
 
232
- - macOS
233
- - Node.js 20+
234
- - 已安装 Codex Desktop
235
- - Codex Desktop 可通过远程调试端口暴露 page target
236
- - QQ 官方机器人 `AppID` 和 `ClientSecret`
142
+ 仓库内置了一套**真实微信文本网关**,对接微信 long-poll 接口,把消息转发给 bridge,再把回复发回微信。
237
143
 
238
- ---
144
+ ### 最小配置
239
145
 
240
- ## 快速开始
146
+ `.env` 中补充:
241
147
 
242
- ### 1. 生成当前目录配置
148
+ ```env
149
+ WEIXIN_ENABLED=true
150
+ WEIXIN_ACCOUNT_ID=default
151
+ WEIXIN_WEBHOOK_PATH=/webhooks/weixin
152
+ WEIXIN_EGRESS_BASE_URL=http://127.0.0.1:3200
153
+ WEIXIN_EGRESS_TOKEN=your-token
154
+ ```
243
155
 
244
- 推荐直接用 `npx`:
156
+ ### 首次扫码登录
245
157
 
246
158
  ```bash
247
- npx qq-codex-bridge init
159
+ pnpm weixin:login
160
+ # 或已安装发布包:
161
+ qq-codex-weixin-gateway --weixin-login
248
162
  ```
249
163
 
250
- 如果你更喜欢先全局安装:
164
+ ### 启动网关
251
165
 
252
166
  ```bash
253
- npm i -g qq-codex-bridge
254
- qq-codex-bridge init
255
- ```
167
+ # 源码开发模式(同时启动 bridge + 微信网关):
168
+ pnpm dev
256
169
 
257
- 这一步会把包内置的模板写成当前目录下的 `.env`。
170
+ # 或单独启动微信网关:
171
+ pnpm start:weixin-gateway
172
+ # 已安装发布包:
173
+ qq-codex-weixin-gateway
174
+ ```
258
175
 
259
- ### 2. 填写 `.env`
176
+ 完整说明见:[微信文本通道接入文档](./docs/weixin-text-gateway.md)
260
177
 
261
- 最少需要配置这两个变量:
178
+ ---
262
179
 
263
- - `QQBOT_APP_ID`
264
- - `QQBOT_CLIENT_SECRET`
180
+ ## 多 Bot / 多账号接入
265
181
 
266
- ### 3. 启动桥接
182
+ ### QQ Bot
267
183
 
268
- 临时运行:
184
+ **方式 A:JSON 数组(推荐)**
269
185
 
270
- ```bash
271
- npx qq-codex-bridge
186
+ ```env
187
+ QQBOTS_JSON=[{"accountId":"main","appId":"AppID1","clientSecret":"Secret1","markdownSupport":false},{"accountId":"shop","appId":"AppID2","clientSecret":"Secret2","markdownSupport":false}]
272
188
  ```
273
189
 
274
- 如果已经全局安装:
190
+ **方式 B:ID 列表 + 分账号变量**
275
191
 
276
- ```bash
277
- qq-codex-bridge
192
+ ```env
193
+ QQBOT_ACCOUNT_IDS=main,shop
194
+ QQBOT_MAIN_APP_ID=AppID1
195
+ QQBOT_MAIN_CLIENT_SECRET=Secret1
196
+ QQBOT_SHOP_APP_ID=AppID2
197
+ QQBOT_SHOP_CLIENT_SECRET=Secret2
278
198
  ```
279
199
 
280
- 默认端口仍然是:
200
+ ### 多微信账号
281
201
 
282
- - `CODEX_REMOTE_DEBUGGING_PORT=9229`
202
+ 每个微信账号需要一个独立的网关进程(监听不同端口):
283
203
 
284
- 正式 CLI 会先检查 Codex Desktop 的 CDP 端口;如果尚未启动,会尽量自动拉起 Codex Desktop 后再继续启动桥接。
204
+ **方式 A:JSON 数组**
285
205
 
286
- 正常启动日志类似:
206
+ ```env
207
+ WEIXIN_ACCOUNTS_JSON=[{"accountId":"main","webhookPath":"/webhooks/weixin/main","egressBaseUrl":"http://127.0.0.1:3201","egressToken":"token-main"},{"accountId":"shop","webhookPath":"/webhooks/weixin/shop","egressBaseUrl":"http://127.0.0.1:3202","egressToken":"token-shop"}]
208
+ ```
287
209
 
288
- ```text
289
- [qq-codex-bridge] codex desktop ready { launched: true|false, remoteDebuggingPort: 9229 }
290
- [qq-codex-bridge] ready { transport: 'qq-gateway-websocket', accountKey: 'qqbot:default' }
210
+ **方式 B:ID 列表 + 分账号变量**
211
+
212
+ ```env
213
+ WEIXIN_ACCOUNT_IDS=main,shop
214
+ WEIXIN_MAIN_WEBHOOK_PATH=/webhooks/weixin/main
215
+ WEIXIN_MAIN_EGRESS_BASE_URL=http://127.0.0.1:3201
216
+ WEIXIN_MAIN_EGRESS_TOKEN=token-main
217
+ WEIXIN_SHOP_WEBHOOK_PATH=/webhooks/weixin/shop
218
+ WEIXIN_SHOP_EGRESS_BASE_URL=http://127.0.0.1:3202
219
+ WEIXIN_SHOP_EGRESS_TOKEN=token-shop
291
220
  ```
292
221
 
293
- ### 4. QQ 中联调
222
+ > bot 单账号时保持旧配置(`QQBOT_APP_ID` + `QQBOT_CLIENT_SECRET`)即可,自动作为 `accountId=default` 处理,无需改动。
294
223
 
295
- 建议先按这个顺序测试:
224
+ ---
296
225
 
297
- 1. 普通文本
298
- 2. 一条会让 Codex 分阶段回答的问题
299
- 3. 一条语音
300
- 4. 一张图片
301
- 5. `/t` 与 `/tu 2`
226
+ ## 对话源切换(Codex / ChatGPT)
302
227
 
303
- ### 5. 说明
228
+ bridge 同时支持 **Codex Desktop** 和 **ChatGPT Desktop** 作为 AI 对话后端。每个私聊会话可以独立切换:
304
229
 
305
- - 这是“**无需源码启动**”,不是“**无依赖运行**”
306
- - 你仍然需要本机已经安装 **Codex Desktop**
307
- - 当前推荐平台仍然是 **macOS**
230
+ ```text
231
+ /source 查看当前对话源
232
+ /source codex 切换到 Codex Desktop
233
+ /source chatgpt 切换到 ChatGPT Desktop
234
+ ```
235
+
236
+ 切换后,`/t`、`/tu`、`/tn` 等线程命令会自动路由到对应的 Desktop 应用。
308
237
 
309
- ### 6. 开发者源码启动
238
+ ---
310
239
 
311
- 如果你是要参与开发、调试源码或跑测试,再走下面这条路径:
240
+ ## 开发者源码启动
312
241
 
313
242
  ```bash
314
243
  git clone https://github.com/983033995/qq-codex-bridge.git
315
244
  cd qq-codex-bridge
316
245
  pnpm install
317
246
  cp .env.example .env
247
+ # 填写 .env 中的 QQBOT_APP_ID 和 QQBOT_CLIENT_SECRET
318
248
  pnpm dev
319
249
  ```
320
250
 
321
251
  ---
322
252
 
323
- ## STT 配置
324
-
325
- 项目支持三层语音转写策略。
253
+ ## 项目特性
326
254
 
327
- ### 1. 零配置模式
255
+ ### 核心能力
328
256
 
329
- 不配置任何 `QQBOT_STT_*` 时:
257
+ - QQ 官方 Bot WebSocket gateway 入站,支持多 bot 并行
258
+ - 微信文本 long-poll 入站 / HTTP 文本出站,支持多账号
259
+ - QQ 私聊 / 群聊会话隔离
260
+ - 多通道会话隔离(QQ / 微信)
261
+ - 双 AI 源:Codex Desktop(CDP)+ ChatGPT Desktop(macOS AX)
262
+ - 每个私聊会话独立绑定线程,可随时切换 AI 源
263
+ - SQLite 持久化会话、入站记录、出站任务
330
264
 
331
- - 优先使用 QQ 事件里的 `asr_refer_text`
332
- - 如果 QQ 没返回 ASR,再回退到附件占位
265
+ ### 媒体与语音
333
266
 
334
- 这是最适合开源项目默认体验的模式。
267
+ - QQ 附件下载与上下文注入(图片、语音、视频、文件)
268
+ - 语音转文字:支持 QQ 内置 ASR / OpenAI 兼容 / 火山引擎 / 本地 whisper.cpp
269
+ - QQ 媒体回传:图片、音频、视频、文件
270
+ - ChatGPT Desktop 图片生成结果自动回传
335
271
 
336
- ### 2. 云端 STT
272
+ ### 回复处理
337
273
 
338
- 支持:
274
+ - 富文本链接提取、有序列表编号保留
275
+ - 代码块序列化为 fenced markdown、表格结构保留
276
+ - 长耗时任务回复采集窗口延长
277
+ - 同一轮回复中的媒体结果持续跟进
339
278
 
340
- - `openai-compatible`
341
- - `volcengine-flash`
279
+ ### 私聊命令(完整列表)
342
280
 
343
- 适合需要更高转写稳定性的人。
281
+ 所有命令仅在**私聊**中有效;`/` 开头的命令由 bridge 拦截处理,不会直接发给 AI。
344
282
 
345
- ### 3. 本地离线 STT
283
+ **Codex Desktop 源下可用:**
346
284
 
347
- 支持:
285
+ | 用途 | 完整命令 | 简写 |
286
+ | --- | --- | --- |
287
+ | 查看最近活跃线程 | `/threads` | `/t` |
288
+ | 查看当前绑定线程 | `/thread current` | `/tc` |
289
+ | 切换到指定线程 | `/thread use <序号>` | `/tu <序号>` |
290
+ | 新建线程 | `/thread new <标题>` | `/tn <标题>` |
291
+ | 基于最近对话 fork 线程 | `/thread fork <标题>` | `/tf <标题>` |
292
+ | 查看当前模型 | `/model` | `/m` |
293
+ | 切换模型 | `/model use <名称>` | `/mu <名称>` |
294
+ | 查看额度信息 | `/quota` | `/q` |
295
+ | 查看当前运行状态 | `/status` | `/st` |
348
296
 
349
- - `local-whisper-cpp`
297
+ **ChatGPT Desktop 源下可用:**
350
298
 
351
- 适合重视隐私、不想依赖云端 API 的人。
299
+ | 用途 | 完整命令 | 简写 |
300
+ | --- | --- | --- |
301
+ | 查看最近对话列表 | `/threads` | `/t` |
302
+ | 查看当前绑定对话 | `/thread current` | `/tc` |
303
+ | 切换到指定对话 | `/thread use <序号>` | `/tu <序号>` |
304
+ | 新建对话 | `/thread new <标题>` | `/tn <标题>` |
352
305
 
353
- ### STT 日志
306
+ **两种源通用:**
354
307
 
355
- 当前会输出这些 STT 日志:
308
+ | 用途 | 命令 |
309
+ | --- | --- |
310
+ | 查看当前对话源 | `/source` |
311
+ | 切换到 Codex Desktop | `/source codex` |
312
+ | 切换到 ChatGPT Desktop | `/source chatgpt` |
313
+ | 查看所有已接入账号 | `/accounts` |
314
+ | 查看帮助 | `/help` 或 `/h` |
356
315
 
357
- - `qq stt started`
358
- - `qq stt completed`
359
- - `qq stt produced no transcript`
360
- - `qq stt fallback used`
361
- - `qq stt failed`
316
+ ---
362
317
 
363
- 日志中会带:
318
+ ## 当前实现上的保护逻辑
364
319
 
365
- - `provider`
366
- - `file`
367
- - `extension`
368
- - `durationMs`
369
- - `hasAsrReferText`
370
- - `transcriptPreview`
320
+ - **重复 QQ 入站抑制** — 短时间内同一会话、同一正文、同一媒体指纹的重复消息会被拦下
321
+ - **长耗时任务回复采集窗口延长** — 图片生成、长搜索不再因默认超时被提前截断
322
+ - **单条 draft 发送失败不再截断整轮回复** — 某一条 QQ 发送失败时,后续 draft 仍会继续尝试
323
+ - **可恢复错误不会打断桥接** — `reply_timeout` 等可恢复错误不再直接把会话打成 `needs_rebind`
371
324
 
372
325
  ---
373
326
 
374
- ## 当前实现上的一些保护逻辑
375
-
376
- 这几个点是项目和“最小 demo”相比比较重要的部分:
327
+ ## 已知限制
377
328
 
378
- - **重复 QQ 入站抑制**
379
- 短时间内同一会话、同一正文、同一媒体指纹的重复消息会被拦下,避免同一句话多次注入 Codex。
329
+ - Codex Desktop 驱动依赖当前版本的 DOM 结构和 CDP 可见性,桌面端改版后可能需要跟着适配
330
+ - ChatGPT Desktop 驱动依赖 macOS Accessibility API,macOS 系统权限变更可能影响使用
331
+ - 对 AI 回复的增量采集是**基于页面快照的伪流式**,不是官方内部事件流
332
+ - QQ 客户端的消息样式、Markdown 支持、媒体卡片展示不完全可控
333
+ - 微信当前只开放了**文本通道**,还没有内置图片、语音、文件与真实提供方签名适配
334
+ - 线程管理命令目前只在 **QQ 私聊** 中开放
380
335
 
381
- - **长耗时任务回复采集窗口延长**
382
- 图片生成、长搜索、长工具执行不再因为默认 30 秒窗口被提前截断。
336
+ ---
383
337
 
384
- - **单条 draft 发送失败不再截断整轮回复**
385
- 某一条 QQ 发送失败时,后续 draft 仍会继续尝试发送。
338
+ ## 环境要求
386
339
 
387
- - **可恢复错误不会把整个桥接打成不可用**
388
- 比如 `reply_timeout` 这类错误会被当成可恢复错误记录,不再直接把会话打成 `needs_rebind`。
340
+ - macOS
341
+ - Node.js 20+
342
+ - 已安装 Codex Desktop(使用 Codex 源时)
343
+ - 已安装 ChatGPT Desktop(使用 ChatGPT 源时)
344
+ - QQ 官方机器人 `AppID` 和 `ClientSecret`
389
345
 
390
346
  ---
391
347
 
392
- ## 已知限制
348
+ ## 安全提醒
393
349
 
394
- - 核心能力依赖 Codex Desktop 当前版本的 DOM 结构和 CDP 可见性,桌面端改版后可能需要跟着适配。
395
- - 对 Codex 回复的增量采集仍然是 **基于页面快照的伪流式**,不是官方内部事件流。
396
- - QQ 客户端自己的消息样式、Markdown 支持、媒体卡片展示不完全可控。
397
- - 线程管理命令目前只在 **QQ 私聊** 中开放。
398
- - 某些极端场景下,如果 Codex Desktop 页面结构变化很大,线程定位与回复提取可能失效。
350
+ - `.env` 里包含 QQ Bot、STT 等敏感密钥,**不要提交到仓库**(`.gitignore` 已默认排除 `.env`)
351
+ - 如果你把项目分享给别人,请务必轮换已经暴露过的密钥
352
+ - 本项目会处理用户消息、附件、语音与本地文件路径,联调时请注意隐私边界
399
353
 
400
354
  ---
401
355
 
402
356
  ## 调试建议
403
357
 
404
- ### 查看类型检查
405
-
406
358
  ```bash
359
+ # 类型检查
407
360
  pnpm run check
408
- ```
409
-
410
- ### 运行测试
411
361
 
412
- ```bash
362
+ # 运行测试
413
363
  pnpm test
414
- ```
415
364
 
416
- ### 调试 Codex page / worker
417
-
418
- ```bash
365
+ # 调试 Codex page / worker
419
366
  pnpm run debug:codex-workers -- --duration-ms 12000
420
367
  ```
421
368
 
422
369
  ---
423
370
 
424
- ## 安全提醒
371
+ ## 文档导航
425
372
 
426
- - `.env` 里会包含 QQ Bot、STT 等敏感密钥,不要提交到仓库
427
- - 如果你把项目分享给别人,请务必轮换已经暴露过的密钥
428
- - 本项目会处理用户消息、附件、语音与本地文件路径,联调时请注意隐私边界
373
+ - [FAQ 与故障排查](./docs/faq.md)
374
+ - [架构说明](./docs/architecture.md)
375
+ - [测试说明](./docs/testing.md)
376
+ - [变更记录](./CHANGELOG.md)
377
+ - [贡献指南](./CONTRIBUTING.md)
378
+ - [安全策略](./SECURITY.md)
379
+ - [在线 Wiki(GitNexus 自动生成)](https://gistcdn.githack.com/983033995/e5715ad0d61605f039ca4e6055094083/raw/index.html#overview)
429
380
 
430
381
  ---
431
382
 
432
383
  ## 贡献
433
384
 
434
- 欢迎 issue、讨论和 PR
435
-
436
- 在提交改动前,建议至少执行:
385
+ 欢迎 issue、讨论和 PR。在提交改动前,建议至少执行:
437
386
 
438
387
  ```bash
439
388
  pnpm run check
440
389
  pnpm test
441
390
  ```
442
391
 
443
- 更多约定请看:
444
-
445
- - [CONTRIBUTING.md](./CONTRIBUTING.md)
446
- - [CODE_OF_CONDUCT.md](./CODE_OF_CONDUCT.md)
447
- - [SECURITY.md](./SECURITY.md)
392
+ 更多约定请看 [CONTRIBUTING.md](./CONTRIBUTING.md) 和 [CODE_OF_CONDUCT.md](./CODE_OF_CONDUCT.md)。
448
393
 
449
394
  ---
450
395
 
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import "../dist/apps/chatgpt-desktop-cli/src/cli.js";