chatccc 0.2.51 → 0.2.53

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 (48) hide show
  1. package/README.md +103 -217
  2. package/bin/chatccc.mjs +23 -23
  3. package/config.sample.json +34 -30
  4. package/demo/ilink_echo_probe.ts +222 -222
  5. package/im-skills/feishu-skill/download-video.mjs +162 -162
  6. package/im-skills/feishu-skill/receive-send-file.md +66 -66
  7. package/im-skills/feishu-skill/receive-send-image.md +27 -27
  8. package/im-skills/feishu-skill/send-file.mjs +50 -50
  9. package/im-skills/feishu-skill/send-image.mjs +50 -50
  10. package/im-skills/feishu-skill/skill.md +10 -10
  11. package/package.json +59 -59
  12. package/src/__tests__/agent-image-rpc.test.ts +33 -33
  13. package/src/__tests__/agent-rpc-body.test.ts +41 -41
  14. package/src/__tests__/card-plain-text.test.ts +42 -0
  15. package/src/__tests__/claude-adapter.test.ts +54 -1
  16. package/src/__tests__/codex-adapter.test.ts +304 -304
  17. package/src/__tests__/config-reload.test.ts +58 -41
  18. package/src/__tests__/config-sample.test.ts +19 -0
  19. package/src/__tests__/crash-logging.test.ts +62 -62
  20. package/src/__tests__/fixtures/codex_simple_text.jsonl +4 -4
  21. package/src/__tests__/fixtures/codex_with_tool.jsonl +6 -6
  22. package/src/__tests__/im-skills.test.ts +46 -46
  23. package/src/__tests__/session.test.ts +95 -2
  24. package/src/__tests__/sim-agent.test.ts +173 -173
  25. package/src/__tests__/sim-platform.test.ts +76 -76
  26. package/src/__tests__/sim-store.test.ts +213 -213
  27. package/src/__tests__/stream-state.test.ts +134 -134
  28. package/src/__tests__/wechat-platform.test.ts +57 -0
  29. package/src/adapters/claude-adapter.ts +23 -2
  30. package/src/adapters/codex-adapter.ts +294 -294
  31. package/src/adapters/codex-session-meta-store.ts +130 -130
  32. package/src/agent-file-rpc.ts +156 -156
  33. package/src/agent-image-rpc.ts +152 -152
  34. package/src/agent-rpc-body.ts +48 -48
  35. package/src/card-plain-text.ts +108 -0
  36. package/src/cards.ts +4 -4
  37. package/src/config.ts +775 -742
  38. package/src/feishu-api.ts +6 -0
  39. package/src/im-skills.ts +109 -109
  40. package/src/index.ts +155 -788
  41. package/src/orchestrator.ts +1032 -0
  42. package/src/platform-adapter.ts +61 -0
  43. package/src/session-chat-binding.ts +7 -0
  44. package/src/session.ts +278 -113
  45. package/src/sim-agent.ts +167 -156
  46. package/src/trace.ts +50 -50
  47. package/src/web-ui.ts +1891 -1718
  48. package/src/wechat-platform.ts +517 -0
package/README.md CHANGED
@@ -1,20 +1,10 @@
1
1
  # ChatCCC
2
2
 
3
- **飞书(Lark)聊天控制 Claude Code / Cursor / Codex**
3
+ **用飞书或微信聊天控制 Claude Code / Cursor / Codex。**
4
4
 
5
- ---
6
-
7
- ## 解决的核心痛点
8
-
9
- 传统的 Claude Code(尤其是使用第三方 API 的,如 DeepSeek),需要坐在电脑桌前才能用。**离开电脑就没法用了。**
10
-
11
- ChatCCC 把 Claude Code、Cursor Agent、Codex (OpenAI) 接入了飞书群聊:
5
+ ChatCCC 把本地 AI 编程工具接入即时通讯软件。你可以在手机上发消息,让 Claude Code、Cursor Agent 或 Codex 继续写代码、查问题、跑命令;不用一直守在电脑前。
12
6
 
13
- - **手机上也能用 Claude Code / Cursor / Codex** —— 在飞书群里发消息就等于在终端输入指令,AI 的思考和回复会流式展示在群卡片里
14
- - **多会话并行** —— 一个群就是一个 AI 会话,完全隔离、互不干扰,并行工作效率更高
15
- - **多工具切换** —— `/new` 使用默认 Agent 创建会话,也可用 `/new claude`、`/new cursor`、`/new codex` 指定工具,各取所长
16
-
17
- 一句话:**在任何设备上打开飞书,就能让 Claude Code / Cursor / Codex 帮你写代码、排查问题、分析项目。**
7
+ 飞书是推荐入口:群聊就是会话,卡片能流式更新,体验完整。微信 iLink 更适合快速试用或临时使用:扫码即可接入,但只能走私聊文本模式。
18
8
 
19
9
  <p align="center">
20
10
  <img src="images/img_readme_messages.jpg" alt="飞书会话列表" width="220" align="top" />
@@ -26,12 +16,27 @@ ChatCCC 把 Claude Code、Cursor Agent、Codex (OpenAI) 接入了飞书群聊:
26
16
 
27
17
  ---
28
18
 
29
- ## 为什么选 ChatCCC
19
+ ## 为什么用 ChatCCC
20
+
21
+ - **手机上也能用 AI 编程工具**:在飞书或微信发消息,就像在终端给 Agent 下指令。
22
+ - **飞书体验更完整**:一群一会话、CardKit 卡片流式更新、支持群管理和多会话并行。
23
+ - **微信接入更轻**:不用创建飞书应用,启动后扫码即可在微信私聊里使用。
24
+ - **多 Agent 切换**:`/new` 使用默认 Agent,也可以用 `/new claude`、`/new cursor`、`/new codex` 指定工具。
25
+ - **群里能跑 git**:`/git status`、`/git pull`、`/git log` 会在当前会话工作目录执行,并把输出发回聊天窗口。
26
+
27
+ ## 飞书和微信的差异
30
28
 
31
- - **一群一会话,心智最简单** —— `/new` 直接建一个新飞书群,群本身就是 AI 会话上下文。换会话就是换群,没有 thread / 子话题概念,手机端切换最直观
32
- - **零配置成本** —— 单一 `config.json`,没有 TOML 也没有零散环境变量。`npm i -g chatccc` 后**任意目录**直接 `chatccc` 就跑,首次启动自动弹出本地 Web 配置向导
33
- - **群里能跑 git** —— `/git status`、`/git pull`、`/git log` 在飞书群里直接执行 stdout/stderr 回发,不用回电脑
34
- - **代码极简易改** —— TypeScript 实现,核心只有 20 多个文件,统一 `ToolAdapter` 接口屏蔽 Claude / Cursor / Codex 差异,看得懂、改得动
29
+ | 项目 | 飞书(推荐) | 微信 iLink |
30
+ | --- | --- | --- |
31
+ | 使用场景 | 长期主力使用 | 快速试用、临时远程控制 |
32
+ | 会话形态 | 群聊,一群一会话 | 私聊,一对一 |
33
+ | 消息展示 | CardKit 卡片,流式更新 | 纯文本,增量推送 |
34
+ | `/new` | 自动创建新群并绑定新会话 | 在当前私聊里创建新会话 |
35
+ | 多会话并行 | 直接切换不同群 | 需要在同一私聊内切换上下文 |
36
+ | 群管理 | 支持创建、重命名、解散、头像 | 不支持 |
37
+ | 接入成本 | 需要配置飞书应用 | 启动后扫码登录 |
38
+
39
+ 如果你主要在手机上长期控制 AI 编程工具,优先用飞书;如果只是想马上跑起来,微信更省配置。
35
40
 
36
41
  ---
37
42
 
@@ -43,21 +48,14 @@ ChatCCC 把 Claude Code、Cursor Agent、Codex (OpenAI) 接入了飞书群聊:
43
48
 
44
49
  ```bash
45
50
  npm install -g chatccc
46
- ```
47
-
48
- 要求 Node.js >= 20。安装完成后,**在任意目录**直接启动即可:
49
-
50
- ```bash
51
51
  chatccc
52
52
  ```
53
53
 
54
- > ChatCCC 的所有数据(`config.json`、`logs/`、`state/`)都保存在 npm 包安装目录下,与你当前终端所在目录无关。**不需要先 `cd` 到任何特定目录。**
55
-
56
- 首次启动时若 `config.json` 还没有有效凭证,会自动起一个本地 Web 配置向导(默认 `http://127.0.0.1:18080`),用浏览器把飞书 App ID / App Secret 等填进去,保存即开始运行。
54
+ 要求 Node.js >= 20。安装完成后,在任意目录执行 `chatccc` 即可启动。配置、日志和状态文件会保存在包目录下的 `config.json`、`logs/`、`state/`。
57
55
 
58
- > 已在运行的实例,启动完成后控制台底部 banner 也会打印「配置面板」地址,随时可以打开浏览器查看状态、修改配置(多数改动无需重启即可生效)。停止 / 重启请通过页面顶部按钮或终端 `Ctrl+C`,**面板上不再提供"启动"按钮**——服务停止后页面随进程退出,需要回到终端重新执行 `chatccc`。
56
+ 首次启动时,如果还没有有效配置,ChatCCC 会自动打开本地 Web 配置向导(默认 `http://127.0.0.1:18080`)。
59
57
 
60
- #### 从源码安装
58
+ #### 从源码运行
61
59
 
62
60
  ```bash
63
61
  git clone https://github.com/wzj998/ChatCCC.git
@@ -66,162 +64,84 @@ npm install
66
64
  npm run dev
67
65
  ```
68
66
 
69
- 启动后机器人通过 WebSocket 连接飞书服务器,日志会写入仓库根目录下的 `logs/`。
67
+ ### 2. 即时通讯软件配置
70
68
 
71
- #### Cursor Agent CLI(使用 Cursor 会话时需要)
69
+ #### 飞书(推荐)
72
70
 
73
- ChatCCC **不捆绑** Cursor Agent CLI,需要用户自行安装。
71
+ 1. 打开 [飞书开放平台](https://open.feishu.cn),创建一个**企业自建应用**。
72
+ 2. 在「应用功能」里开启**机器人**能力。
73
+ 3. 在「权限管理」里开通 `im:` 和 `cardkit:` 前缀下的相关权限:
74
74
 
75
- **推荐安装方式(Windows):**
75
+ | 前缀 | 用途 |
76
+ | --- | --- |
77
+ | `im:` | 收发消息、创建和管理群聊、机器人发言 |
78
+ | `cardkit:` | 卡片展示、流式更新、按钮和交互回调 |
76
79
 
77
- PowerShell 中执行:
80
+ <p align="center">
81
+ <img src="images/img_readme_permission.png" alt="飞书应用权限配置" width="280" />
82
+ </p>
78
83
 
79
- ```powershell
80
- irm 'https://cursor.com/install?win32=true' | iex
81
- ```
84
+ 4. 在「事件与回调」里订阅 `im.message.receive_v1` 和 `card.action.trigger`。
82
85
 
83
- 安装完成后 `agent` 命令会出现在系统 PATH 中。
86
+ <p align="center">
87
+ <img src="images/img_readme_event.png" alt="飞书事件订阅" width="280" />
88
+ &emsp;
89
+ <img src="images/img_readme_callback.png" alt="飞书请求网址与回调" width="280" />
90
+ </p>
84
91
 
85
- **其他安装方式:**
92
+ 5. 创建应用版本并发布(企业内部可用即可)。
93
+ 6. 在「凭证与基础信息」复制 **App ID** 和 **App Secret**,填入本地 Web 配置向导或 `config.json`。
86
94
 
87
- 1. **Cursor IDE 自带**:安装 [Cursor IDE](https://cursor.com) 后,部分版本会自带 `agent` 或 `cursor-agent` 命令
88
- 2. **独立安装**:Cursor 正在逐步提供独立的 CLI 安装方式
95
+ 如果你同时使用公司飞书和个人飞书,建议把个人账号放在另一个客户端里:安卓可用系统「应用双开」,iOS 可用 Lark。
89
96
 
90
- 安装后需登录 Cursor 账号:
97
+ #### 微信 iLink(可选)
91
98
 
92
- ```bash
93
- agent login
94
- ```
95
-
96
- 验证是否已安装(任一可用即可):
99
+ 微信模式不需要创建飞书应用。保持 `config.json` 里的 `platforms.ilink.enabled` 为 `true`(默认开启),启动 `chatccc` 后,终端会打印微信扫码登录二维码。
97
100
 
98
101
  ```bash
99
- agent --version
100
- cursor-agent --version
102
+ chatccc
103
+ # 控制台出现二维码后,用微信扫一扫登录
104
+ # 在微信里找到机器人,发送 /new 开始对话
101
105
  ```
102
106
 
103
- ChatCCC 启动时会按以下顺序确定 Cursor Agent CLI:
104
-
105
- 1. `config.json` 中的 `cursor.path` 指定的路径(若已配置)
106
- 2. Windows 上 Cursor IDE 默认安装位置 `%LOCALAPPDATA%\cursor-agent\agent.cmd`(自动识别)
107
- 3. PATH 中的 `agent` 命令
107
+ 微信登录信息会保存到 `state/ilink-auth.json`。token 过期后重新扫码即可。
108
108
 
109
- > 首次启动 ChatCCC 时,如果 `config.json` 不存在,会从 `config.sample.json` 复制一份并**立即探测一次** Cursor / Codex CLI 的绝对路径,命中就写入 `cursor.path` / `codex.path`,无须手动编辑。
109
+ ### 3. AI 工具配置
110
110
 
111
- 若想强制使用某个非默认的可执行文件(例如 `cursor-agent` 而不是 `agent`),可在 `config.json` 中显式指定:
112
-
113
- ```json
114
- {
115
- "cursor": {
116
- "path": "/path/to/agent"
117
- }
118
- }
119
- ```
111
+ ChatCCC 只负责把聊天消息转给本地 AI 工具,不捆绑这些 CLI。你只需要安装自己要用的 Agent。
120
112
 
121
- > 旧版字段 `cursor.command` 仍可读取(启动时会打印一次 warning 提示改名),新配置请统一使用 `cursor.path`。
113
+ #### Claude Code
122
114
 
123
- > **说明**:只使用 Claude Code(`/new claude`,或把 Claude Code 设为默认 Agent 后使用 `/new`)的用户无需安装 Cursor CLI。
115
+ 如果使用官方 Claude Code,本机完成 Claude CLI 登录即可。若使用 DeepSeek 等 Anthropic 兼容网关,把 `claude.apiKey` `claude.baseUrl` 填到 `config.json` Web 配置向导。
124
116
 
125
- #### Codex CLI(使用 Codex 会话时需要)
117
+ #### Cursor Agent CLI
126
118
 
127
- ChatCCC **不捆绑** Codex CLI,需要用户自行安装:
119
+ Windows 推荐安装:
128
120
 
129
- ```bash
130
- npm install -g @openai/codex
121
+ ```powershell
122
+ irm 'https://cursor.com/install?win32=true' | iex
123
+ agent login
131
124
  ```
132
125
 
133
- 安装后需登录 OpenAI 账号:
126
+ 验证:
134
127
 
135
128
  ```bash
136
- codex login
129
+ agent --version
137
130
  ```
138
131
 
139
- 验证是否已安装:
132
+ #### Codex CLI
140
133
 
141
134
  ```bash
135
+ npm install -g @openai/codex
136
+ codex login
142
137
  codex --version
143
138
  ```
144
139
 
145
- Codex 会话的模型和努力程度由 `config.toml`(`~/.codex/config.toml`)决定,也可在 `config.json` 中显式覆盖:
146
-
147
- ```json
148
- {
149
- "codex": {
150
- "path": "",
151
- "model": "",
152
- "effort": ""
153
- }
154
- }
155
- ```
156
-
157
- - `codex.path`:留空时直接调用 PATH 中的 `codex`;可填绝对路径指向自定义可执行文件(首次创建 `config.json` 时会自动探测并填入)
158
- - `codex.model`:留空时由 `~/.codex/config.toml` 决定
159
- - `codex.effort`:留空时由 `~/.codex/config.toml` 决定(通过 `-c model_reasoning_effort` 传递)
160
-
161
- > 旧版字段 `codex.command` 仍可读取(启动时会打印一次 warning 提示改名),新配置请统一使用 `codex.path`。
162
-
163
- > **说明**:只使用 Claude Code 或 Cursor 的用户无需安装 Codex CLI。
164
-
165
- ### 2. 创建飞书应用
166
-
167
- 打开 [飞书开放平台](https://open.feishu.cn),创建一个**企业自建应用**。
168
-
169
- > **第一步:同时使用公司飞书和个人飞书**
170
- >
171
- > 如果你所在的公司也使用飞书,请看此步骤;否则请直接跳到第二步。
172
- >
173
- > 如果你既要在公司飞书中使用 ChatCCC,又想用个人飞书账号,推荐以下方案:
174
- >
175
- > **方案一:安卓手机**
176
- >
177
- > 使用系统的「应用双开」功能,把飞书复制一份。原版飞书登录公司账号,飞书复制版登录个人飞书账号,两个飞书可以同时在线、互不干扰。
178
- >
179
- > **方案二:苹果手机**
180
- >
181
- > 在 App Store 下载「飞书国际版(Lark)」。原版飞书登录公司账号,Lark 登录个人飞书账号,两个 App 互相独立、可同时在线。
182
-
183
- > **第二步:添加机器人(千万别忘!)**
184
- >
185
- > 创建应用后,立刻在「应用功能」中开启「机器人」能力。没有机器人,就根本找不到哪里和这个机器人对话,整个 ChatCCC 无法工作。
186
-
187
- **权限配置(重要)**(在「权限管理」中按前缀搜索,**将以下两类前缀开头的权限全部开通**):
188
-
189
- | 前缀 | 用途(简要) |
190
- | ---- | ------------ |
191
- | `im:` | 收发消息、创建与管理群聊、以机器人身份发言等(请将此前缀下所有权限全部开通) |
192
- | `cardkit:` | 群卡片展示、流式更新、卡片按钮与交互回调相关能力等 |
193
-
194
- 控制台中同一前缀下往往有多条子权限,请逐项勾选开通,避免遗漏导致收不到消息或卡片异常。
195
-
196
- <p align="center">
197
- <img src="images/img_readme_permission.png" alt="飞书应用权限配置" width="280" />
198
- </p>
199
-
200
- **事件订阅(重要)**(在「事件与回调」中):订阅 `im.message.receive_v1` 和 `card.action.trigger` 事件。
201
-
202
- <p align="center">
203
- <img src="images/img_readme_event.png" alt="飞书事件订阅" width="280" />
204
- &emsp;
205
- <img src="images/img_readme_callback.png" alt="飞书请求网址与回调" width="280" />
206
- </p>
207
-
208
- **发布版本(不要忘了)**:配置完成后创建应用版本并发布(仅企业内部可用即可)。
209
-
210
- ### 3. 获取凭证
211
-
212
- 在飞书应用详情页的「凭证与基础信息」中,复制 **App ID** 和 **App Secret**。
213
-
214
- ### 4. 配置 `config.json`
140
+ Codex 的默认模型和推理强度可继续由 `~/.codex/config.toml` 管理,也可以在 `config.json` 中覆盖。
215
141
 
216
- ChatCCC 的所有运行参数都集中在包根目录的 `config.json`。
142
+ ### 4. `config.json`
217
143
 
218
- #### 推荐:用 Web 配置向导(首次启动自动弹出)
219
-
220
- 第一次运行 `chatccc` 时,如果 `config.json` 还没有有效凭证,会自动起一个本地 Web 服务(默认 `http://127.0.0.1:18080`)。在浏览器里把上一步拿到的 **App ID** / **App Secret** 等填进去,保存即写入 `config.json`,进程立即继续启动飞书 WebSocket。
221
-
222
- #### 备选:手动编辑 `config.json`
223
-
224
- `config.json` 不存在时,ChatCCC 会从 `config.sample.json` 复制一份,结构如下:
144
+ `config.json` 不存在时,ChatCCC 会从 `config.sample.json` 复制一份。常用结构如下:
225
145
 
226
146
  ```json
227
147
  {
@@ -229,6 +149,10 @@ ChatCCC 的所有运行参数都集中在包根目录的 `config.json`。
229
149
  "appId": "cli_xxxxxxxxxxxx",
230
150
  "appSecret": "xxxxxxxxxxxxxxxxxxxxxxxxxx"
231
151
  },
152
+ "platforms": {
153
+ "feishu": { "enabled": true },
154
+ "ilink": { "enabled": true }
155
+ },
232
156
  "port": 18080,
233
157
  "gitTimeoutSeconds": 180,
234
158
  "claude": {
@@ -255,82 +179,44 @@ ChatCCC 的所有运行参数都集中在包根目录的 `config.json`。
255
179
  }
256
180
  ```
257
181
 
258
- 各字段含义:
259
-
260
- | 字段 | 必填 | 说明 |
261
- | --- | --- | --- |
262
- | `feishu.appId` / `feishu.appSecret` | | 飞书应用「凭证与基础信息」中的 App ID / App Secret |
263
- | `port` | 否 | 本地 WebSocket 中继 + Web 向导监听端口,默认 `18080`;同机多实例时改成不同值即可 |
264
- | `gitTimeoutSeconds` | 否 | `/git` 命令在会话工作目录执行时的单次超时秒数,默认 `180`,允许范围 `1–3600`,超时会被 `SIGKILL` 强制终止 |
265
- | `claude.enabled` / `cursor.enabled` / `codex.enabled` | 否 | 是否启用对应 AI Agent;Web 向导/管理页只展示 `enabled: true` 的 agent 卡片。字段缺省时按「任一配置字段非空」自动判定(向后兼容) |
266
- | `claude.defaultAgent` / `cursor.defaultAgent` / `codex.defaultAgent` | 否 | `/new` 未指定具体 Agent 时使用哪个默认 Agent;同一时间应只有一个为 `true`。Web 配置页切换某个 Agent 为默认时会自动关闭其它 Agent 的默认开关 |
267
- | `claude.model` | | Claude Code 会话使用的模型;留空(`""` / 全空白)→ 不向 SDK 传 `model`,由 SDK / 服务商默认决定 |
268
- | `claude.effort` | 否 | Claude 思考深度(如 `low` / `medium` / `high` / `max`);留空 不向 SDK 传 `effort` |
269
- | `claude.apiKey` | 否 | 第三方 Anthropic 兼容网关的 API 密钥;**官方 Claude 用户保持 `""` 即可**,详见下文「第三方 API」一节 |
270
- | `claude.baseUrl` | 否 | 第三方 Anthropic 兼容网关的 base URL(例如 `https://api.deepseek.com/anthropic`);**官方 Claude 用户保持 `""` 即可** |
271
- | `cursor.model` | 否 | Cursor 会话使用的模型 ID(如 `claude-opus-4-7-max`);留空时不传 `--model`,可用 `agent --list-models` 查看支持的模型 |
272
- | `codex.model` | 否 | Codex 会话使用的模型;留空时由 `~/.codex/config.toml` 决定 |
273
- | `codex.effort` | 否 | Codex 努力程度(`low` / `medium` / `high`);留空时由 `~/.codex/config.toml` 决定 |
274
-
275
- > `claude.model` / `claude.effort` 的旧值 `"default"` 仍兼容,启动时会按留空处理并打印一次 warning,请尽快改成 `""`。
182
+ | 字段 | 说明 |
183
+ | --- | --- |
184
+ | `feishu.appId` / `feishu.appSecret` | 飞书应用凭证 |
185
+ | `platforms.feishu.enabled` | 是否启用飞书 |
186
+ | `platforms.ilink.enabled` | 是否启用微信 iLink |
187
+ | `port` | 本地 Web 配置面板和中继服务端口 |
188
+ | `gitTimeoutSeconds` | `/git` 命令超时时间,默认 180 |
189
+ | `*.enabled` | 是否启用对应 AI Agent |
190
+ | `*.defaultAgent` | `/new` 未指定 Agent 时使用哪个工具 |
191
+ | `cursor.path` / `codex.path` | CLI 可执行文件路径;留空时自动探测或使用 PATH |
192
+ | `claude.apiKey` / `claude.baseUrl` | 第三方 Anthropic 兼容网关配置;官方 Claude 用户留空 |
276
193
 
277
- > `cursor.path` / `codex.path` 由首次启动时的自动探测填入,一般无需手动修改。
278
-
279
- #### 第三方 API(如 DeepSeek):填 `claude.apiKey` 与 `claude.baseUrl`
280
-
281
- 若你通过 **Anthropic 兼容网关**(例如 DeepSeek 的 `/anthropic` 端点)调用模型,需要把网关凭证填到 `config.json` 的 `claude.apiKey` 与 `claude.baseUrl`。**官方 Claude 用户**(本机已通过 `claude` CLI 完成 OAuth 登录)保持这两项 `""` 即可,无需任何额外配置。
282
-
283
- 两条等价的填写路径:
284
-
285
- **1. Web 配置向导(推荐)**
286
-
287
- 打开 `http://127.0.0.1:18080`(首次启动自动弹出,已在运行的实例也可手动访问),在「Claude Agent」一节顶部把「API 来源」从 **官方 API(Anthropic 直连)** 切换到 **第三方 API(自定义网关)**——切换后会出现 API Key / Base URL 两个输入框,填进去保存即可。**切回官方模式后保存,已填的密钥会被自动清空**,不会残留在 `config.json` 中。
288
-
289
- **2. 直接编辑 `config.json`**
290
-
291
- ```json
292
- {
293
- "claude": {
294
- "model": "",
295
- "effort": "",
296
- "apiKey": "你的_API_密钥",
297
- "baseUrl": "https://api.deepseek.com/anthropic"
298
- }
299
- }
300
- ```
301
-
302
- > ChatCCC 不会把这两个值写入主进程的环境变量;它们仅在调用 Claude Agent SDK 时被注入到 SDK 拉起的子进程,跟主进程 env 完全隔离。两项留空 / 缺失时,子进程沿用主进程默认的鉴权行为(即官方 Claude 的 OAuth)。
303
-
304
- > 所有运行参数(端口、`/git` 超时、各 AI 工具模型 / 路径等)都在第 4 节展示的 `config.json` 里配置,不再使用 `CHATCCC_*` 环境变量。多实例共存只需在每个实例的 `config.json` 里把 `port` 设为不同值即可(例如 `18080` / `18081`),ChatCCC 启动时会自动清理各自端口上的旧进程。
305
-
306
- > **权限说明**:目前 ChatCCC 以 `bypassPermissions` 模式运行,即跳过所有权限确认、允许所有操作。后续会考虑引入细粒度权限控制,让你可以按需放行特定操作。
307
-
308
- > **Linux 用户注意**:不能将项目装在 `/root` 目录下运行。
194
+ > 当前 ChatCCC `bypassPermissions` 模式运行,会跳过 Agent 操作确认。请只在可信环境中使用。
309
195
 
310
196
  ### 5. 开始使用
311
197
 
312
- 在飞书中找到你的机器人,发送 `/new`(使用 `config.json` 中 `defaultAgent: true` 的默认 Agent)或 `/new claude` / `/new cursor` / `/new codex`,机器人会自动创建一个群聊并把 AI 会话绑定到该群。之后直接在群里发消息就能对话。
313
-
314
- ### 可用指令
198
+ **飞书:** 找到你的机器人,发送 `/new`、`/new claude`、`/new cursor` `/new codex`。机器人会创建一个新群并绑定 AI 会话,之后直接在群里聊天即可。
315
199
 
200
+ **微信:** 扫码登录后,在机器人私聊里发送 `/new` 或指定 Agent 的 `/new ...` 命令即可开始。功能与飞书基本一致,但展示为纯文本。
316
201
 
317
- | 指令 | 作用 |
318
- | --------------- | ---------------------------- |
319
- | `/new` | 使用默认 Agent 创建新会话 |
320
- | `/new claude` | 创建新的 Claude Code 会话 |
321
- | `/new cursor` | 创建新的 Cursor 会话 |
322
- | `/new codex` | 创建新的 Codex 会话(OpenAI) |
323
- | `/stop` | 停止当前正在生成的回复 |
324
- | `/status` | 查看当前会话的状态(轮数、模型、上下文 token 等) |
325
- | `/cd` | 查看/设置当前会话的默认工作目录 |
326
- | `/sessions` | 查看所有会话状态 |
327
- | `/newh` | 重置当前会话(创建新 Session,保留工作目录,同一群内继续) |
328
- | `/git <子命令>` | 在**当前会话工作目录**执行 `git ...` 并把 stdout/stderr 回发到群里(仅会话群内可用,超时见 `config.json` 的 `gitTimeoutSeconds` 字段) |
329
- | `/restart` | 重启机器人进程 |
202
+ ## 可用指令
330
203
 
204
+ | 指令 | 作用 |
205
+ | --- | --- |
206
+ | `/new` | 使用默认 Agent 创建新会话 |
207
+ | `/new claude` | 创建 Claude Code 会话 |
208
+ | `/new cursor` | 创建 Cursor 会话 |
209
+ | `/new codex` | 创建 Codex 会话 |
210
+ | `/newh` | 重置当前会话,保留工作目录 |
211
+ | `/stop` | 停止当前回复 |
212
+ | `/status` | 查看当前会话状态 |
213
+ | `/cd` | 查看或设置当前会话工作目录 |
214
+ | `/sessions` | 查看所有会话状态 |
215
+ | `/git <子命令>` | 在当前会话工作目录执行 `git ...` 并回传输出 |
216
+ | `/restart` | 重启机器人进程 |
331
217
 
332
218
  ---
333
219
 
334
220
  ## 技术栈
335
221
 
336
- TypeScript / Node.js >= 20 / tsx / Anthropic Claude Agent SDK / Cursor Agent CLI / Codex CLI (OpenAI) / 飞书 WebSocket API / CardKit
222
+ TypeScript / Node.js >= 20 / tsx / Anthropic Claude Agent SDK / Cursor Agent CLI / Codex CLI / 飞书 WebSocket API / CardKit / 微信 iLink
package/bin/chatccc.mjs CHANGED
@@ -1,24 +1,24 @@
1
- #!/usr/bin/env node
2
- import { spawnSync } from "node:child_process";
3
- import { createRequire } from "node:module";
4
- import { dirname, join } from "node:path";
5
-
6
- const require = createRequire(import.meta.url);
7
- // 相对 bin/chatccc.mjs 解析 package.json,包根目录不依赖 cwd,也不会多退一级到 node_modules
8
- const pkgRoot = dirname(require.resolve("../package.json"));
9
- const indexTs = join(pkgRoot, "src", "index.ts");
10
- const tsxCli = require.resolve("tsx/cli");
11
-
12
- const result = spawnSync(process.execPath, [tsxCli, indexTs, ...process.argv.slice(2)], {
13
- stdio: "inherit",
14
- cwd: process.cwd(),
15
- env: process.env,
16
- });
17
-
18
- const code = result.status === null ? 1 : result.status;
19
- if (code !== 0) {
20
- console.error("[ 未启动 ]");
21
- console.error("chatccc 子进程已结束,服务没有在后台运行。");
22
- }
23
-
1
+ #!/usr/bin/env node
2
+ import { spawnSync } from "node:child_process";
3
+ import { createRequire } from "node:module";
4
+ import { dirname, join } from "node:path";
5
+
6
+ const require = createRequire(import.meta.url);
7
+ // 相对 bin/chatccc.mjs 解析 package.json,包根目录不依赖 cwd,也不会多退一级到 node_modules
8
+ const pkgRoot = dirname(require.resolve("../package.json"));
9
+ const indexTs = join(pkgRoot, "src", "index.ts");
10
+ const tsxCli = require.resolve("tsx/cli");
11
+
12
+ const result = spawnSync(process.execPath, [tsxCli, indexTs, ...process.argv.slice(2)], {
13
+ stdio: "inherit",
14
+ cwd: process.cwd(),
15
+ env: process.env,
16
+ });
17
+
18
+ const code = result.status === null ? 1 : result.status;
19
+ if (code !== 0) {
20
+ console.error("[ 未启动 ]");
21
+ console.error("chatccc 子进程已结束,服务没有在后台运行。");
22
+ }
23
+
24
24
  process.exit(code);
@@ -1,30 +1,34 @@
1
- {
2
- "feishu": {
3
- "appId": "",
4
- "appSecret": ""
5
- },
6
- "port": 18080,
7
- "gitTimeoutSeconds": 180,
8
- "allowInterrupt": false,
9
- "claude": {
10
- "enabled": false,
11
- "defaultAgent": true,
12
- "model": "",
13
- "effort": "",
14
- "apiKey": "",
15
- "baseUrl": ""
16
- },
17
- "cursor": {
18
- "enabled": false,
19
- "defaultAgent": false,
20
- "path": "",
21
- "model": ""
22
- },
23
- "codex": {
24
- "enabled": false,
25
- "defaultAgent": false,
26
- "path": "",
27
- "model": "",
28
- "effort": ""
29
- }
30
- }
1
+ {
2
+ "feishu": {
3
+ "appId": "",
4
+ "appSecret": ""
5
+ },
6
+ "platforms": {
7
+ "feishu": { "enabled": true },
8
+ "ilink": { "enabled": true, "reuseTokenOnStart": true }
9
+ },
10
+ "port": 18080,
11
+ "gitTimeoutSeconds": 180,
12
+ "allowInterrupt": false,
13
+ "claude": {
14
+ "enabled": false,
15
+ "defaultAgent": true,
16
+ "model": "",
17
+ "effort": "",
18
+ "apiKey": "",
19
+ "baseUrl": ""
20
+ },
21
+ "cursor": {
22
+ "enabled": false,
23
+ "defaultAgent": false,
24
+ "path": "",
25
+ "model": ""
26
+ },
27
+ "codex": {
28
+ "enabled": false,
29
+ "defaultAgent": false,
30
+ "path": "",
31
+ "model": "",
32
+ "effort": ""
33
+ }
34
+ }