codex-to-im 0.1.0
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/LICENSE +21 -0
- package/README.md +163 -0
- package/README_CN.md +161 -0
- package/SECURITY.md +38 -0
- package/SKILL.md +79 -0
- package/config.env.example +106 -0
- package/dist/cli.mjs +182 -0
- package/dist/daemon.mjs +206122 -0
- package/dist/ui-server.mjs +7725 -0
- package/docs/codex-to-im-prd.md +424 -0
- package/docs/codex-to-im-shared-thread-design.md +572 -0
- package/docs/install-windows.md +287 -0
- package/package.json +55 -0
- package/references/setup-guides.md +329 -0
- package/references/token-validation.md +44 -0
- package/references/troubleshooting.md +88 -0
- package/references/usage.md +46 -0
- package/scripts/build.js +36 -0
- package/scripts/daemon.ps1 +16 -0
- package/scripts/daemon.sh +225 -0
- package/scripts/doctor.ps1 +27 -0
- package/scripts/doctor.sh +450 -0
- package/scripts/install-codex.sh +65 -0
- package/scripts/run-tests.js +44 -0
- package/scripts/supervisor-linux.sh +49 -0
- package/scripts/supervisor-macos.sh +154 -0
- package/scripts/supervisor-windows.ps1 +481 -0
|
@@ -0,0 +1,424 @@
|
|
|
1
|
+
# Codex-to-IM 产品需求与技术可行性说明
|
|
2
|
+
|
|
3
|
+
## 1. 文档目的
|
|
4
|
+
|
|
5
|
+
本文档用于明确 `codex-to-im` 的产品目标、核心场景、功能需求、会话模型、技术可行性和分阶段实现计划。
|
|
6
|
+
|
|
7
|
+
目标不是继续堆叠单独的 IM 机器人配置能力,而是把 `Codex Windows App` 作为主工作台,把飞书等 IM 作为远程协同入口,让用户可以在同一条会话上无缝切换。
|
|
8
|
+
|
|
9
|
+
配套技术设计见:
|
|
10
|
+
|
|
11
|
+
- [D:/codex/Claude-to-IM-skill/docs/codex-to-im-shared-thread-design.md](D:/codex/Claude-to-IM-skill/docs/codex-to-im-shared-thread-design.md)
|
|
12
|
+
|
|
13
|
+
## 2. 产品定位
|
|
14
|
+
|
|
15
|
+
### 2.1 核心定位
|
|
16
|
+
|
|
17
|
+
`codex-to-im` 是一个本地安装、后台常驻的桥接系统。
|
|
18
|
+
|
|
19
|
+
它负责:
|
|
20
|
+
|
|
21
|
+
- 管理 IM 渠道配置
|
|
22
|
+
- 管理本地后台 bridge 服务
|
|
23
|
+
- 把 IM 消息接入 Codex
|
|
24
|
+
- 把 Codex 会话同步到 IM
|
|
25
|
+
- 让用户在电脑端和 IM 端之间共享同一条会话
|
|
26
|
+
|
|
27
|
+
### 2.2 主次关系
|
|
28
|
+
|
|
29
|
+
- 主端:`Codex Windows App`
|
|
30
|
+
- 辅助端:`飞书`
|
|
31
|
+
- 后续扩展端:微信、企业微信机器人等
|
|
32
|
+
|
|
33
|
+
飞书不是独立替代端,而是远程控制与远程观察端。
|
|
34
|
+
|
|
35
|
+
## 3. 核心目标
|
|
36
|
+
|
|
37
|
+
### 3.1 产品目标
|
|
38
|
+
|
|
39
|
+
用户在电脑上主要通过 `Codex Windows App` 工作。
|
|
40
|
+
|
|
41
|
+
当用户离开电脑时,可以在飞书里:
|
|
42
|
+
|
|
43
|
+
- 查看当前会话进展
|
|
44
|
+
- 继续给当前会话发送指令
|
|
45
|
+
- 继续推动 Codex 工作
|
|
46
|
+
- 查看工具调用、状态变化、输出内容
|
|
47
|
+
|
|
48
|
+
回到电脑后,用户仍然能在 `Codex Windows App` 中继续同一条会话,不需要重建上下文,不需要切换到另一条 bridge 私有会话。
|
|
49
|
+
|
|
50
|
+
### 3.2 用户体验目标
|
|
51
|
+
|
|
52
|
+
- 安装方式尽可能简单:最终支持 `npm install -g codex-to-im`
|
|
53
|
+
- 启动方式尽可能简单:启动后自动打开本地配置界面
|
|
54
|
+
- 配置方式尽可能图形化:在本地页面填写飞书 / 微信等配置并测试
|
|
55
|
+
- 会话同步尽可能无感:最多只增加一个“是否同步当前会话到飞书”的按钮
|
|
56
|
+
- 飞书切换尽可能清晰:支持固定指令切换会话和线程
|
|
57
|
+
|
|
58
|
+
## 4. 非目标
|
|
59
|
+
|
|
60
|
+
以下内容不作为当前第一阶段目标:
|
|
61
|
+
|
|
62
|
+
- 做一个完整替代 `Codex Windows App` 的 IM 聊天产品
|
|
63
|
+
- 在 IM 中重建一套独立于 Codex 的长期主工作流
|
|
64
|
+
- 在没有显式绑定动作的情况下,自动推断并接管用户当前所有桌面会话
|
|
65
|
+
- 假装已经支持企业微信机器人,若当前没有对应 adapter,则应明确列为后续能力
|
|
66
|
+
|
|
67
|
+
## 5. 核心用户场景
|
|
68
|
+
|
|
69
|
+
### 5.1 场景 A:电脑主用,飞书补充
|
|
70
|
+
|
|
71
|
+
用户在 `Codex Windows App` 中开启一个工作会话。
|
|
72
|
+
|
|
73
|
+
用户点击“同步到飞书”。
|
|
74
|
+
|
|
75
|
+
系统将当前会话绑定到飞书聊天。
|
|
76
|
+
|
|
77
|
+
之后:
|
|
78
|
+
|
|
79
|
+
- Codex 输出会同步到飞书
|
|
80
|
+
- 飞书可继续发消息到该会话
|
|
81
|
+
- 飞书可查看状态和执行进度
|
|
82
|
+
- 用户回到电脑后可继续在同一条会话里工作
|
|
83
|
+
|
|
84
|
+
### 5.2 场景 B:用户离开电脑继续下指令
|
|
85
|
+
|
|
86
|
+
用户在吃饭、开会、路上时,没有电脑在手边。
|
|
87
|
+
|
|
88
|
+
用户打开飞书,进入对应机器人会话,继续发送:
|
|
89
|
+
|
|
90
|
+
- 新任务
|
|
91
|
+
- 跟进指令
|
|
92
|
+
- 停止命令
|
|
93
|
+
- 状态查询
|
|
94
|
+
|
|
95
|
+
这些消息继续进入同一条底层 Codex 会话,而不是进入新的桥接私有线程。
|
|
96
|
+
|
|
97
|
+
### 5.3 场景 C:多个会话并行时的飞书切换
|
|
98
|
+
|
|
99
|
+
用户电脑上同时有多个 Codex 会话。
|
|
100
|
+
|
|
101
|
+
飞书端必须能明确查看和切换“当前控制的是哪一条会话 / 线程”,避免上下文混乱。
|
|
102
|
+
|
|
103
|
+
## 6. 正式需求
|
|
104
|
+
|
|
105
|
+
## 6.1 安装与启动
|
|
106
|
+
|
|
107
|
+
系统应满足:
|
|
108
|
+
|
|
109
|
+
- 可以作为单个 npm 包发布,包名为 `codex-to-im`
|
|
110
|
+
- 支持全局安装
|
|
111
|
+
- 安装后提供统一入口命令,例如 `codex-to-im`
|
|
112
|
+
- 启动后能拉起本地后台服务
|
|
113
|
+
- 启动后能打开本地 Web 配置界面
|
|
114
|
+
|
|
115
|
+
## 6.2 本地配置界面
|
|
116
|
+
|
|
117
|
+
系统应提供本地配置页,至少支持:
|
|
118
|
+
|
|
119
|
+
- 查看当前服务状态
|
|
120
|
+
- 查看可选 Codex 集成是否安装
|
|
121
|
+
- 填写飞书配置
|
|
122
|
+
- 触发微信扫码
|
|
123
|
+
- 保存配置
|
|
124
|
+
- 测试配置是否可用
|
|
125
|
+
- 启动 / 停止 bridge
|
|
126
|
+
- 安装可选 Codex 集成
|
|
127
|
+
- 查看运行日志
|
|
128
|
+
|
|
129
|
+
## 6.3 IM 渠道配置
|
|
130
|
+
|
|
131
|
+
### 飞书
|
|
132
|
+
|
|
133
|
+
飞书配置页至少支持:
|
|
134
|
+
|
|
135
|
+
- App ID
|
|
136
|
+
- App Secret
|
|
137
|
+
- Domain
|
|
138
|
+
- Allowed Users
|
|
139
|
+
- 连通性测试
|
|
140
|
+
|
|
141
|
+
### 微信
|
|
142
|
+
|
|
143
|
+
微信配置页至少支持:
|
|
144
|
+
|
|
145
|
+
- 扫码登录
|
|
146
|
+
- 查看扫码是否成功
|
|
147
|
+
- 管理当前登录账户
|
|
148
|
+
- 可选媒体下载能力开关
|
|
149
|
+
|
|
150
|
+
### 企业微信机器人
|
|
151
|
+
|
|
152
|
+
企业微信机器人应作为明确的后续需求。
|
|
153
|
+
|
|
154
|
+
若当前代码中没有 adapter,不应在第一阶段承诺“可用”,但应在产品设计中预留配置区和扩展位。
|
|
155
|
+
|
|
156
|
+
## 6.4 后台服务
|
|
157
|
+
|
|
158
|
+
系统应支持本地后台运行,至少满足:
|
|
159
|
+
|
|
160
|
+
- 不依赖用户一直打开当前终端窗口
|
|
161
|
+
- 可以查询是否运行中
|
|
162
|
+
- 可以查看日志
|
|
163
|
+
- 可以重启
|
|
164
|
+
- 可以在系统重启后恢复运行,作为后续增强项
|
|
165
|
+
|
|
166
|
+
## 6.5 可选 Codex 集成
|
|
167
|
+
系统应支持把一层很薄的可选集成安装到 Codex 的 skill 目录。
|
|
168
|
+
|
|
169
|
+
这层集成不是主流程前提,只用于补充两个入口:
|
|
170
|
+
|
|
171
|
+
- 在 Codex 内直接打开 `codex-to-im`
|
|
172
|
+
- 后续承载“共享当前会话到飞书”的入口
|
|
173
|
+
|
|
174
|
+
至少应支持:
|
|
175
|
+
|
|
176
|
+
- 检测是否已安装
|
|
177
|
+
- 自动安装到 `~/.codex/skills/codex-to-im`
|
|
178
|
+
- 若安装目录已存在,给出明确状态
|
|
179
|
+
|
|
180
|
+
## 6.6 会话共享
|
|
181
|
+
|
|
182
|
+
这是本产品最关键的需求。
|
|
183
|
+
|
|
184
|
+
系统必须支持:
|
|
185
|
+
|
|
186
|
+
- 将电脑端当前工作会话绑定到飞书
|
|
187
|
+
- 飞书继续在该会话上发送消息
|
|
188
|
+
- 飞书消息进入同一条底层 Codex thread
|
|
189
|
+
- Codex 端继续看到这条会话的历史
|
|
190
|
+
- Codex 输出同步到飞书
|
|
191
|
+
|
|
192
|
+
系统不应默认采用“飞书一条会话、电脑一条会话,然后做内容搬运”的模型。
|
|
193
|
+
|
|
194
|
+
第一原则应是:**共享同一条底层 thread**。
|
|
195
|
+
|
|
196
|
+
## 6.7 飞书端会话切换
|
|
197
|
+
|
|
198
|
+
飞书端必须支持会话 / 线程管理。
|
|
199
|
+
|
|
200
|
+
至少包括:
|
|
201
|
+
|
|
202
|
+
- 查看当前绑定会话
|
|
203
|
+
- 列出可用会话
|
|
204
|
+
- 切换到指定会话
|
|
205
|
+
- 绑定到底层指定 thread
|
|
206
|
+
- 新建一个远程会话
|
|
207
|
+
- 查看当前 chat 正在控制哪条 thread
|
|
208
|
+
|
|
209
|
+
### 建议的固定命令
|
|
210
|
+
|
|
211
|
+
第一版建议至少支持以下文本命令:
|
|
212
|
+
|
|
213
|
+
- `/status`
|
|
214
|
+
- `/sessions`
|
|
215
|
+
- `/use <session-id>`
|
|
216
|
+
- `/threads`
|
|
217
|
+
- `/thread <thread-id>`
|
|
218
|
+
- `/new`
|
|
219
|
+
- `/bind <thread-id>`
|
|
220
|
+
- `/stop`
|
|
221
|
+
|
|
222
|
+
按钮和卡片交互可以作为增强,但不能替代文本命令。
|
|
223
|
+
|
|
224
|
+
## 6.8 远程控制能力
|
|
225
|
+
|
|
226
|
+
飞书端不应只是只读观察端。
|
|
227
|
+
|
|
228
|
+
飞书端必须支持:
|
|
229
|
+
|
|
230
|
+
- 发送普通文本消息
|
|
231
|
+
- 继续任务
|
|
232
|
+
- 停止当前任务
|
|
233
|
+
- 查看当前状态
|
|
234
|
+
- 查看权限请求
|
|
235
|
+
- 继续推动 Codex 工作
|
|
236
|
+
|
|
237
|
+
## 7. 会话与线程模型
|
|
238
|
+
|
|
239
|
+
## 7.1 基本原则
|
|
240
|
+
|
|
241
|
+
需要明确区分两个概念:
|
|
242
|
+
|
|
243
|
+
- 产品层会话:用户可理解、可切换、可管理的会话
|
|
244
|
+
- 底层 thread:Codex SDK / Codex CLI 持久化的真实线程
|
|
245
|
+
|
|
246
|
+
第一阶段推荐模型:
|
|
247
|
+
|
|
248
|
+
- 一个产品层共享会话对应一个底层 `thread_id`
|
|
249
|
+
- 一个飞书 chat 同时只控制一个“当前活动共享会话”
|
|
250
|
+
- 切换飞书会话,本质上是切换当前绑定的 `thread_id`
|
|
251
|
+
|
|
252
|
+
## 7.2 同步关系
|
|
253
|
+
|
|
254
|
+
### 从 Codex 到飞书
|
|
255
|
+
|
|
256
|
+
- 输出同步到飞书
|
|
257
|
+
- 工具调用同步到飞书
|
|
258
|
+
- 权限请求同步到飞书
|
|
259
|
+
- 运行状态同步到飞书
|
|
260
|
+
|
|
261
|
+
### 从飞书到 Codex
|
|
262
|
+
|
|
263
|
+
- 飞书消息写入共享 thread
|
|
264
|
+
- 飞书指令影响当前 thread
|
|
265
|
+
- 飞书停止命令作用于当前共享会话
|
|
266
|
+
|
|
267
|
+
## 7.3 并发控制
|
|
268
|
+
|
|
269
|
+
因为电脑端和飞书端都可能同时发输入,所以需要并发控制机制。
|
|
270
|
+
|
|
271
|
+
第一阶段建议:
|
|
272
|
+
|
|
273
|
+
- 同一 thread 串行化输入
|
|
274
|
+
- 飞书和桌面消息进入统一队列
|
|
275
|
+
- 当前有任务运行时,新的输入明确提示排队 / 中断 / 拒绝策略
|
|
276
|
+
|
|
277
|
+
后续可增强:
|
|
278
|
+
|
|
279
|
+
- 输入权控制
|
|
280
|
+
- 接管模式
|
|
281
|
+
- 只读观察模式
|
|
282
|
+
|
|
283
|
+
## 8. 技术可行性结论
|
|
284
|
+
|
|
285
|
+
## 8.1 已确认可行
|
|
286
|
+
|
|
287
|
+
通过本地代码和官方资料,可以确认以下事项成立:
|
|
288
|
+
|
|
289
|
+
- `Codex SDK` 支持 `startThread()` 和 `resumeThread(savedThreadId)`
|
|
290
|
+
- `Codex SDK` 线程持久化在 `~/.codex/sessions`
|
|
291
|
+
- 当前 bridge 代码已经可以保存和复用 `sdkSessionId`
|
|
292
|
+
- Codex App 官方说明其会接上 CLI 和 IDE extension 的 session history 和 configuration
|
|
293
|
+
|
|
294
|
+
因此,**“共享同一条底层 Codex thread” 这条方案本身是可行的。**
|
|
295
|
+
|
|
296
|
+
## 8.2 未完全确认的部分
|
|
297
|
+
|
|
298
|
+
目前尚未确认官方是否公开支持以下能力:
|
|
299
|
+
|
|
300
|
+
- 外部程序自动读取“当前 Codex Windows App 正在聚焦的 thread”
|
|
301
|
+
- 外部程序零动作接管“当前 App 正在打开的 tab”
|
|
302
|
+
- App 对外部线程写入是否总是实时刷新到当前界面
|
|
303
|
+
|
|
304
|
+
因此,当前最稳妥的产品路径不应依赖“完全自动接管当前 tab”。
|
|
305
|
+
|
|
306
|
+
## 8.3 第一阶段技术判断
|
|
307
|
+
|
|
308
|
+
第一阶段应采用:
|
|
309
|
+
|
|
310
|
+
- 显式绑定当前会话到飞书
|
|
311
|
+
- 共享底层 `thread_id`
|
|
312
|
+
- 通过 `resumeThread(thread_id)` 从飞书继续写入
|
|
313
|
+
|
|
314
|
+
而不应采用:
|
|
315
|
+
|
|
316
|
+
- 猜测 App 当前焦点 tab
|
|
317
|
+
- 依赖不可验证的桌面内部状态
|
|
318
|
+
|
|
319
|
+
## 9. 主要技术风险
|
|
320
|
+
|
|
321
|
+
## 9.1 桌面会话接管能力不足
|
|
322
|
+
|
|
323
|
+
如果 Codex Windows App 没有公开“当前会话导出 / 绑定”能力,则产品不能做到完全零按钮同步。
|
|
324
|
+
|
|
325
|
+
规避方式:
|
|
326
|
+
|
|
327
|
+
- 设计一个显式按钮“同步当前会话到飞书”
|
|
328
|
+
- 明确这一步会把当前 thread 绑定到飞书 chat
|
|
329
|
+
|
|
330
|
+
## 9.2 双端同时输入导致上下文混乱
|
|
331
|
+
|
|
332
|
+
如果电脑和飞书同时往同一条 thread 发消息,会造成任务竞争和用户困惑。
|
|
333
|
+
|
|
334
|
+
规避方式:
|
|
335
|
+
|
|
336
|
+
- 统一排队
|
|
337
|
+
- 明确提示当前任务状态
|
|
338
|
+
- 提供 `/stop`
|
|
339
|
+
- 后续增加“接管中”状态提示
|
|
340
|
+
|
|
341
|
+
## 9.3 IM 渠道能力不一致
|
|
342
|
+
|
|
343
|
+
飞书、微信、企业微信机器人在交互能力上不同。
|
|
344
|
+
|
|
345
|
+
规避方式:
|
|
346
|
+
|
|
347
|
+
- 用文本命令提供通用能力
|
|
348
|
+
- 将按钮 / 卡片作为增强能力,而不是唯一入口
|
|
349
|
+
|
|
350
|
+
## 10. 分阶段实现建议
|
|
351
|
+
|
|
352
|
+
## Phase 1:单包可安装、可配置、可运行
|
|
353
|
+
|
|
354
|
+
目标:
|
|
355
|
+
|
|
356
|
+
- 合并工程为 `codex-to-im`
|
|
357
|
+
- 本地配置页可用
|
|
358
|
+
- 飞书配置可保存和测试
|
|
359
|
+
- 微信扫码可用
|
|
360
|
+
- bridge 可后台运行
|
|
361
|
+
- 可选 Codex 集成可自动安装
|
|
362
|
+
|
|
363
|
+
这是当前已经开始落地的阶段。
|
|
364
|
+
|
|
365
|
+
## Phase 2:共享 thread 模式
|
|
366
|
+
|
|
367
|
+
目标:
|
|
368
|
+
|
|
369
|
+
- 产品层会话与底层 `thread_id` 建立映射
|
|
370
|
+
- 飞书端可绑定到共享 thread
|
|
371
|
+
- 飞书消息通过 `resumeThread(thread_id)` 写回共享会话
|
|
372
|
+
- 飞书端可查看当前绑定状态
|
|
373
|
+
|
|
374
|
+
这是本产品的核心能力阶段。
|
|
375
|
+
|
|
376
|
+
## Phase 3:会话切换与远程接管
|
|
377
|
+
|
|
378
|
+
目标:
|
|
379
|
+
|
|
380
|
+
- 飞书端支持 `/sessions`、`/use`、`/bind`、`/thread`
|
|
381
|
+
- 飞书端支持切换当前活动共享会话
|
|
382
|
+
- 支持“同步当前会话到飞书”按钮
|
|
383
|
+
- 支持从飞书端继续推动工作
|
|
384
|
+
|
|
385
|
+
## Phase 4:高可用与多渠道增强
|
|
386
|
+
|
|
387
|
+
目标:
|
|
388
|
+
|
|
389
|
+
- 启动项 / 系统服务安装
|
|
390
|
+
- 更稳定的后台管理
|
|
391
|
+
- 微信和飞书并行能力完善
|
|
392
|
+
- 企业微信机器人支持
|
|
393
|
+
- 更细粒度的权限与并发控制
|
|
394
|
+
|
|
395
|
+
## 11. 当前正式结论
|
|
396
|
+
|
|
397
|
+
本产品应被定义为:
|
|
398
|
+
|
|
399
|
+
**一个以 Codex Windows App 为主端、以飞书为远程控制端的共享会话系统。**
|
|
400
|
+
|
|
401
|
+
它的关键不在于“多机器人配置”,而在于:
|
|
402
|
+
|
|
403
|
+
- 共享同一条底层 thread
|
|
404
|
+
- 电脑与飞书之间无缝切换
|
|
405
|
+
- 飞书可以继续发送指令
|
|
406
|
+
- 会话 / 线程可切换、可绑定、可管理
|
|
407
|
+
|
|
408
|
+
在技术上,这条路线是可行的。
|
|
409
|
+
|
|
410
|
+
但第一阶段应采用“显式绑定共享 thread”的可靠方案,而不是依赖桌面 App 内部未公开的自动接管能力。
|
|
411
|
+
|
|
412
|
+
## 12. 参考依据
|
|
413
|
+
|
|
414
|
+
### 本地代码依据
|
|
415
|
+
|
|
416
|
+
- `@openai/codex-sdk` 本地 README:支持 `startThread()` 与 `resumeThread(savedThreadId)`,线程持久化于 `~/.codex/sessions`
|
|
417
|
+
- 当前桥接实现:`src/codex-provider.ts`
|
|
418
|
+
- 当前会话绑定实现:`src/store.ts`
|
|
419
|
+
- 当前 channel 路由实现:`src/lib/bridge/channel-router.ts`
|
|
420
|
+
|
|
421
|
+
### 官方资料
|
|
422
|
+
|
|
423
|
+
- OpenAI,《Introducing the Codex app》,发布于 2026 年 2 月 2 日,2026 年 3 月 4 日更新说明 Windows 已可用
|
|
424
|
+
https://openai.com/index/introducing-the-codex-app/
|