@wu529778790/open-im 1.7.1-beta.3 → 1.7.1-beta.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.
package/README.md CHANGED
@@ -14,19 +14,6 @@ Multi-platform IM bridge for AI CLI tools. Connect Telegram, Feishu, WeCom, Ding
14
14
  - Isolated sessions: each user gets an independent local session, and `/new` resets it
15
15
  - Built-in commands: `/help`, `/new`, `/cd`, `/pwd`, `/status`
16
16
 
17
- ## Coverage Matrix
18
-
19
- Capability levels: `Native` = fully supported in-channel, `Fallback` = degraded behavior or text fallback, `None` = not currently supported.
20
-
21
- | Platform | Text Inbound | Image Inbound | File Inbound | Voice Inbound | Video Inbound | Streaming Reply | Image Reply | Card Reply |
22
- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
23
- | Telegram | Native | Native | Native | Native | Native | Native | Native | Native |
24
- | Feishu | Native | Native | Native | Fallback | Fallback | Native | Native | Native |
25
- | QQ | Native | Fallback | Fallback | Fallback | Fallback | None | Fallback | Fallback |
26
- | WeCom | Native | Fallback | Fallback | Fallback | Fallback | Native | Native | Native |
27
- | DingTalk | Native | Fallback | Fallback | Fallback | Fallback | Native | Fallback | Native |
28
- | WeChat (experimental) | Native | Fallback | Fallback | Fallback | Fallback | Native | Fallback | Native |
29
-
30
17
  ## Requirements
31
18
 
32
19
  - Node.js >= 20
@@ -50,12 +37,13 @@ The config file is stored at `~/.open-im/config.json` by default.
50
37
 
51
38
  ## CLI Commands
52
39
 
53
- | Command | Description |
54
- | ---- | ---- |
55
- | `open-im init` | Initialize or append configuration without starting the service |
56
- | `open-im start` | Run the service in the background |
57
- | `open-im stop` | Stop the background service |
58
- | `open-im dev` | Run in the foreground for development/debugging |
40
+ | Command | Description |
41
+ | ----------------- | ---------------------------------------------------------------- |
42
+ | `open-im init` | Initialize or append configuration without starting the service |
43
+ | `open-im start` | Run the service in the background |
44
+ | `open-im stop` | Stop the background service |
45
+ | `open-im dev` | Run in the foreground for development/debugging |
46
+ | `open-im dashboard` | Run only the config web UI (no bridge) |
59
47
 
60
48
  ## Server Deployment & Config Page
61
49
 
@@ -65,106 +53,50 @@ Open the config page at [`http://127.0.0.1:39282`](http://127.0.0.1:39282) (or t
65
53
 
66
54
  - **Dashboard** – Configured / Enabled platform count and service status (Idle or Running)
67
55
  - **Platforms** – Enable and configure Telegram, Feishu, QQ, WeCom, and DingTalk (credentials, proxy, per-platform AI tool, allowed user IDs). Each platform has a “Test Configuration” button.
68
- - **AI Tooling** – **General**: default AI tool (Claude / Codex / CodeBuddy), work directory, hook port, log level. **Per-tool tabs**: Claude (CLI path, timeout, proxy, config path, ANTHROPIC_* fields), Codex (CLI path, timeout, proxy), CodeBuddy (CLI path, timeout).
56
+ - **AI Tooling** – **General**: default AI tool (Claude / Codex / CodeBuddy), work directory, hook port, log level. **Per-tool tabs**: Claude (CLI path, timeout, proxy, config path, ANTHROPIC\_\* fields), Codex (CLI path, timeout, proxy), CodeBuddy (CLI path, timeout).
69
57
  - **Service control** – Validate config, Save, Start bridge, Stop bridge.
70
58
 
71
59
  WeChat is not in the web UI; configure it in `~/.open-im/config.json` or via `open-im init` if needed.
72
60
 
73
- - `open-im start` serves both the config page and the bridge.
61
+ - `open-im start` serves both the config page and the bridge on your local machine.
74
62
  - `open-im dev` opens the page automatically only when setup is incomplete.
75
- - To open the page when config already exists, run `open-im start` and visit the URL above.
76
-
77
- ### On a headless server (no GUI)
78
-
79
- Many servers do not have a desktop environment or browser. In that case, trying to auto-launch a browser (`xdg-open`, `open`, `start`) is unnecessary and may even fail. Use these patterns instead.
80
-
81
- #### 1) Disable automatic browser launch
82
-
83
- On the server:
84
-
85
- ```bash
86
- export OPEN_IM_NO_BROWSER=1
87
- open-im start
88
- ```
89
-
90
- This starts the bridge and the config web server in the background without attempting to open a browser.
91
-
92
- #### 2) Verify that the config page is listening on the server
93
-
94
- On the server:
95
-
96
- ```bash
97
- ss -lntp | grep 39282 # or: netstat -lntp | grep 39282
98
- curl -v http://127.0.0.1:39282/
99
- ```
100
-
101
- If you see a `LISTEN` line for `127.0.0.1:39282` and `curl` returns HTML, the config UI is running.
102
-
103
- #### 3) Safest option: SSH tunnel to local browser
104
-
105
- Instead of exposing port 39282 to the public internet, use SSH port forwarding:
106
-
107
- ```bash
108
- # On your local machine:
109
- ssh -L 39282:127.0.0.1:39282 user@your-server-ip
110
- ```
111
-
112
- Then open in your local browser:
113
-
114
- ```text
115
- http://127.0.0.1:39282/
116
- ```
117
-
118
- This safely tunnels the config page from the server to your local browser.
119
-
120
- #### 4) Optional: Remote access with one-time login link
121
-
122
- If you want to open the config UI directly from another device without SSH tunneling, you can bind the web config server to all interfaces and use a one-time login URL:
63
+ - To open the page when config already exists, you can also run `open-im dashboard` to launch the config UI only (without starting the bridge).
123
64
 
124
- - **Bind to all interfaces and keep the browser closed on the server:**
65
+ ### Recommended server workflow
125
66
 
126
- ```bash
127
- export OPEN_IM_NO_BROWSER=1
128
- export OPEN_IM_WEB_HOST=0.0.0.0
129
- open-im start
130
- ```
67
+ On a remote server, the simplest and safest pattern is:
131
68
 
132
- - By default, `OPEN_IM_WEB_HOST` is `127.0.0.1` (local only).
133
- - Setting it to `0.0.0.0` makes the config page listen on all interfaces.
69
+ 1. **Use `dashboard` to configure via browser**
134
70
 
135
- - **On startup, open-im will log a one-time login URL**, for example:
71
+ On the server:
136
72
 
137
- ```text
138
- ━━━━━━━━ Web Config Login ━━━━━━━━
139
- Host binding : 0.0.0.0
140
- Login URL : http://127.0.0.1:39282/?login_token=xxxx
141
- Note: replace 127.0.0.1 with your server IP or hostname when opening from another device.
142
- This login link is valid for approximately 15 minutes and can be used only once.
143
- After login, subsequent requests will use a short-lived session cookie.
144
- ```
73
+ ```bash
74
+ export OPEN_IM_NO_BROWSER=1
75
+ # Optional: bind to all interfaces if you want to open from another device
76
+ # export OPEN_IM_WEB_HOST=0.0.0.0
77
+ open-im dashboard
78
+ ```
145
79
 
146
- - **From your laptop/phone**, replace `127.0.0.1` with the server IP or hostname and open the URL in a browser:
80
+ - This starts only the config web UI (no bridge yet).
81
+ - If `OPEN_IM_WEB_HOST` is `0.0.0.0`, the server will print a one-time login URL like:
147
82
 
148
- ```text
149
- http://your-server-ip:39282/?login_token=xxxx
150
- ```
83
+ ```text
84
+ http://your-server-ip:39282/?login_token=xxxx
85
+ ```
151
86
 
152
- The first successful visit:
87
+ - Open this URL in your browser, complete all platform/AI settings, then click **Start bridge** in the web UI.
153
88
 
154
- - Consumes the one-time `login_token` (subsequent uses will fail with 401);
155
- - Creates a short-lived session and sets a `openim_session` cookie in your browser;
156
- - Redirects you to the config page without query parameters.
89
+ 2. **Run the bridge as a background service**
157
90
 
158
- After that, as long as the `openim_session` cookie is valid and the process is still running, you can continue visiting:
91
+ After configuration is saved, you have two options:
92
+ - Start from the web UI: use the **Start bridge** button on the Service panel.
93
+ - Or start from the CLI:
159
94
 
160
- ```text
161
- http://your-server-ip:39282/
162
- ```
95
+ ```bash
96
+ open-im start
97
+ ```
163
98
 
164
- > Security notes:
165
- >
166
- > - Binding `OPEN_IM_WEB_HOST=0.0.0.0` exposes the config port on all interfaces. Always combine this with firewall rules / security groups and consider fronting the port with HTTPS + auth via a reverse proxy.
167
- > - When in doubt, prefer SSH tunneling (step 3) over direct exposure.
99
+ This runs the full bridge in the background using the saved config.
168
100
 
169
101
  ## Session Behavior
170
102
 
@@ -315,46 +247,46 @@ The following is valid JSON and can be saved directly as `~/.open-im/config.json
315
247
 
316
248
  ### Common Environment Variables
317
249
 
318
- | Variable | Description |
319
- | ---- | ---- |
320
- | `AI_COMMAND` | Select `claude`, `codex`, or `codebuddy` |
321
- | `CLAUDE_WORK_DIR` | Default session working directory |
322
- | `LOG_DIR` | Log directory |
323
- | `LOG_LEVEL` | Log level |
324
- | `HOOK_PORT` | Permission service port |
325
- | `CODEX_PROXY` | Proxy used by Codex to access `chatgpt.com` |
326
- | `OPENAI_API_KEY` | Codex API key, can replace `codex login` |
327
- | `CODEBUDDY_CLI_PATH` | Override CodeBuddy CLI path |
328
- | `CODEBUDDY_TIMEOUT_MS` | Override CodeBuddy timeout |
329
- | `CODEBUDDY_SKIP_PERMISSIONS` | Override CodeBuddy skip-permissions behavior |
330
- | `CODEBUDDY_IDLE_TIMEOUT_MS` | Abort CodeBuddy when it stays silent for too long |
331
- | `CODEBUDDY_API_KEY` | CodeBuddy API key, can replace `codebuddy login` |
332
- | `CODEBUDDY_AUTH_TOKEN` | CodeBuddy auth token, can replace `codebuddy login` |
333
- | `TELEGRAM_BOT_TOKEN` | Telegram bot token |
334
- | `TELEGRAM_PROXY` | Telegram proxy URL |
335
- | `TELEGRAM_ALLOWED_USER_IDS` | Telegram allowlist |
336
- | `FEISHU_APP_ID` | Feishu app ID |
337
- | `FEISHU_APP_SECRET` | Feishu app secret |
338
- | `FEISHU_ALLOWED_USER_IDS` | Feishu allowlist |
339
- | `QQ_BOT_APPID` | QQ bot app ID |
340
- | `QQ_BOT_SECRET` | QQ bot app secret |
341
- | `QQ_BOT_SANDBOX` | QQ bot sandbox mode (`1` / `true` to enable, disabled by default) |
342
- | `QQ_ALLOWED_USER_IDS` | QQ allowlist |
343
- | `DINGTALK_CLIENT_ID` | DingTalk client ID / AppKey |
344
- | `DINGTALK_CLIENT_SECRET` | DingTalk client secret / AppSecret |
345
- | `DINGTALK_CARD_TEMPLATE_ID` | DingTalk AI card template ID; enables single-message streaming replies |
346
- | `DINGTALK_ALLOWED_USER_IDS` | DingTalk allowlist |
347
- | `WEWORK_CORP_ID` | WeCom bot ID |
348
- | `WEWORK_SECRET` | WeCom secret |
349
- | `WEWORK_WS_URL` | WeCom WebSocket URL |
350
- | `WEWORK_ALLOWED_USER_IDS` | WeCom allowlist |
351
- | `WECHAT_APP_ID` | WeChat standard mode app ID |
352
- | `WECHAT_APP_SECRET` | WeChat standard mode app secret |
353
- | `WECHAT_TOKEN` | WeChat AGP mode token |
354
- | `WECHAT_GUID` | WeChat AGP mode GUID |
355
- | `WECHAT_USER_ID` | WeChat AGP mode user ID |
356
- | `WECHAT_WS_URL` | WeChat WebSocket URL |
357
- | `WECHAT_ALLOWED_USER_IDS` | WeChat allowlist |
250
+ | Variable | Description |
251
+ | ---------------------------- | ---------------------------------------------------------------------- |
252
+ | `AI_COMMAND` | Select `claude`, `codex`, or `codebuddy` |
253
+ | `CLAUDE_WORK_DIR` | Default session working directory |
254
+ | `LOG_DIR` | Log directory |
255
+ | `LOG_LEVEL` | Log level |
256
+ | `HOOK_PORT` | Permission service port |
257
+ | `CODEX_PROXY` | Proxy used by Codex to access `chatgpt.com` |
258
+ | `OPENAI_API_KEY` | Codex API key, can replace `codex login` |
259
+ | `CODEBUDDY_CLI_PATH` | Override CodeBuddy CLI path |
260
+ | `CODEBUDDY_TIMEOUT_MS` | Override CodeBuddy timeout |
261
+ | `CODEBUDDY_SKIP_PERMISSIONS` | Override CodeBuddy skip-permissions behavior |
262
+ | `CODEBUDDY_IDLE_TIMEOUT_MS` | Abort CodeBuddy when it stays silent for too long |
263
+ | `CODEBUDDY_API_KEY` | CodeBuddy API key, can replace `codebuddy login` |
264
+ | `CODEBUDDY_AUTH_TOKEN` | CodeBuddy auth token, can replace `codebuddy login` |
265
+ | `TELEGRAM_BOT_TOKEN` | Telegram bot token |
266
+ | `TELEGRAM_PROXY` | Telegram proxy URL |
267
+ | `TELEGRAM_ALLOWED_USER_IDS` | Telegram allowlist |
268
+ | `FEISHU_APP_ID` | Feishu app ID |
269
+ | `FEISHU_APP_SECRET` | Feishu app secret |
270
+ | `FEISHU_ALLOWED_USER_IDS` | Feishu allowlist |
271
+ | `QQ_BOT_APPID` | QQ bot app ID |
272
+ | `QQ_BOT_SECRET` | QQ bot app secret |
273
+ | `QQ_BOT_SANDBOX` | QQ bot sandbox mode (`1` / `true` to enable, disabled by default) |
274
+ | `QQ_ALLOWED_USER_IDS` | QQ allowlist |
275
+ | `DINGTALK_CLIENT_ID` | DingTalk client ID / AppKey |
276
+ | `DINGTALK_CLIENT_SECRET` | DingTalk client secret / AppSecret |
277
+ | `DINGTALK_CARD_TEMPLATE_ID` | DingTalk AI card template ID; enables single-message streaming replies |
278
+ | `DINGTALK_ALLOWED_USER_IDS` | DingTalk allowlist |
279
+ | `WEWORK_CORP_ID` | WeCom bot ID |
280
+ | `WEWORK_SECRET` | WeCom secret |
281
+ | `WEWORK_WS_URL` | WeCom WebSocket URL |
282
+ | `WEWORK_ALLOWED_USER_IDS` | WeCom allowlist |
283
+ | `WECHAT_APP_ID` | WeChat standard mode app ID |
284
+ | `WECHAT_APP_SECRET` | WeChat standard mode app secret |
285
+ | `WECHAT_TOKEN` | WeChat AGP mode token |
286
+ | `WECHAT_GUID` | WeChat AGP mode GUID |
287
+ | `WECHAT_USER_ID` | WeChat AGP mode user ID |
288
+ | `WECHAT_WS_URL` | WeChat WebSocket URL |
289
+ | `WECHAT_ALLOWED_USER_IDS` | WeChat allowlist |
358
290
 
359
291
  ### Platform Setup Sources
360
292
 
@@ -375,15 +307,15 @@ DingTalk AI card templates are already compatible with the official "Search Resu
375
307
 
376
308
  ## IM Commands
377
309
 
378
- | Command | Description |
379
- | ---- | ---- |
380
- | `/help` | Show help |
381
- | `/new` | Start a new session |
382
- | `/status` | Show AI tool, version, session directory, and session ID |
383
- | `/cd <path>` | Change the session working directory |
384
- | `/pwd` | Show the current session working directory |
385
- | `/allow` `/y` | Approve a permission request |
386
- | `/deny` `/n` | Reject a permission request |
310
+ | Command | Description |
311
+ | ------------- | -------------------------------------------------------- |
312
+ | `/help` | Show help |
313
+ | `/new` | Start a new session |
314
+ | `/status` | Show AI tool, version, session directory, and session ID |
315
+ | `/cd <path>` | Change the session working directory |
316
+ | `/pwd` | Show the current session working directory |
317
+ | `/allow` `/y` | Approve a permission request |
318
+ | `/deny` `/n` | Reject a permission request |
387
319
 
388
320
  ## Troubleshooting
389
321
 
package/README.zh-CN.md CHANGED
@@ -14,19 +14,6 @@
14
14
  - 会话隔离:每个用户独立维护本地会话,`/new` 可重置
15
15
  - 常用命令:支持 `/help`、`/new`、`/cd`、`/pwd`、`/status`
16
16
 
17
- ## 覆盖矩阵
18
-
19
- 能力等级说明:`Native` 表示平台内原生支持,`Fallback` 表示有降级方案或文本兜底,`None` 表示当前暂不支持。
20
-
21
- | 平台 | 文本输入 | 图片输入 | 文件输入 | 语音输入 | 视频输入 | 流式回复 | 图片回复 | 卡片回复 |
22
- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
23
- | Telegram | Native | Native | Native | Native | Native | Native | Native | Native |
24
- | 飞书 | Native | Native | Native | Fallback | Fallback | Native | Native | Native |
25
- | QQ | Native | Fallback | Fallback | Fallback | Fallback | None | Fallback | Fallback |
26
- | 企业微信 | Native | Fallback | Fallback | Fallback | Fallback | Native | Native | Native |
27
- | 钉钉 | Native | Fallback | Fallback | Fallback | Fallback | Native | Fallback | Native |
28
- | 微信(测试中) | Native | Fallback | Fallback | Fallback | Fallback | Native | Fallback | Native |
29
-
30
17
  ## 环境要求
31
18
 
32
19
  - Node.js >= 20
@@ -50,12 +37,13 @@ open-im start
50
37
 
51
38
  ## CLI 命令
52
39
 
53
- | 命令 | 说明 |
54
- | ---- | ---- |
55
- | `open-im init` | 初始化或追加配置,不启动服务 |
56
- | `open-im start` | 后台运行服务 |
57
- | `open-im stop` | 停止后台服务 |
58
- | `open-im dev` | 前台运行(调试模式) |
40
+ | 命令 | 说明 |
41
+ | ----------------- | ------------------------------ |
42
+ | `open-im init` | 初始化或追加配置,不启动服务 |
43
+ | `open-im start` | 后台运行服务 |
44
+ | `open-im stop` | 停止后台服务 |
45
+ | `open-im dev` | 前台运行(调试模式) |
46
+ | `open-im dashboard` | 仅启动 Web 配置页(不启动桥接服务) |
59
47
 
60
48
  ## 服务器部署与图形化配置
61
49
 
@@ -71,106 +59,50 @@ open-im start
71
59
 
72
60
  - **概览** – 已配置/已启用平台数量、服务状态(未启动或运行中)
73
61
  - **平台配置** – 启用并填写 Telegram、飞书、QQ、企业微信、钉钉的凭证(Bot Token/App ID/Secret、代理、该平台使用的 AI 工具、白名单用户 ID)。每个平台提供「校验配置」按钮
74
- - **AI 工具配置** – **公共**:默认 AI 工具(Claude / Codex / CodeBuddy)、工作目录、Hook 端口、日志级别。**分工具**:Claude(CLI 路径、超时、代理、配置路径、ANTHROPIC_* 等)、Codex(CLI 路径、超时、代理)、CodeBuddy(CLI 路径、超时)
62
+ - **AI 工具配置** – **公共**:默认 AI 工具(Claude / Codex / CodeBuddy)、工作目录、Hook 端口、日志级别。**分工具**:Claude(CLI 路径、超时、代理、配置路径、ANTHROPIC\_\* 等)、Codex(CLI 路径、超时、代理)、CodeBuddy(CLI 路径、超时)
75
63
  - **服务控制** – 校验配置、保存、启动桥接、停止桥接
76
64
 
77
65
  微信暂不在网页中配置,如需使用请在 `~/.open-im/config.json` 中手动配置或通过 `open-im init` 引导。
78
66
 
79
- - `open-im start` 会同时启动桥接服务并提供该配置页
80
- - `open-im dev` 仅在未完成配置时自动打开页面
81
- - 已有配置但想手动打开时,执行 `open-im start` 后访问上述地址即可
82
-
83
- ### 在服务器上部署(无图形界面)
84
-
85
- 很多服务器没有桌面环境和浏览器,此时「自动打开浏览器」既没意义,还可能因为缺少 `xdg-open` 报错。推荐如下用法:
86
-
87
- #### 1)关闭自动打开浏览器
88
-
89
- 在服务器上设置环境变量,然后启动:
90
-
91
- ```bash
92
- export OPEN_IM_NO_BROWSER=1
93
- open-im start
94
- ```
95
-
96
- 这样只会在后台启动服务与配置页面,不会尝试执行 `xdg-open` / `open` / `start`。
97
-
98
- #### 2)检查配置页面是否已在服务器本机监听
99
-
100
- 在服务器上执行:
101
-
102
- ```bash
103
- ss -lntp | grep 39282 # 或 netstat -lntp | grep 39282
104
- curl -v http://127.0.0.1:39282/
105
- ```
106
-
107
- 若看到 `LISTEN 0 ... 127.0.0.1:39282` 且 `curl` 返回 HTML,则说明 Web 配置页已正常启动。
108
-
109
- #### 3)推荐方式:通过 SSH 隧道在本地浏览器访问
110
-
111
- 不建议直接对外开放 39282 端口,而是使用 SSH 端口转发:
112
-
113
- ```bash
114
- # 在本地电脑执行,将本地 39282 转发到服务器 127.0.0.1:39282
115
- ssh -L 39282:127.0.0.1:39282 user@your-server-ip
116
- ```
117
-
118
- 然后在本地浏览器访问:
119
-
120
- ```text
121
- http://127.0.0.1:39282/
122
- ```
123
-
124
- 即可打开服务器上的配置页面。
125
-
126
- #### 4)可选:在服务器上直接访问的一次性登录链接
127
-
128
- 如果你确实希望在服务器上绑定到公网 IP,从其他设备直接访问配置页面,可以:
67
+ - `open-im start` 会同时启动桥接服务并提供该配置页(本机场景)。
68
+ - `open-im dev` 仅在未完成配置时自动打开页面。
69
+ - 已有配置但想单独打开配置页时,可以使用 `open-im dashboard` 启动仅 Web 配置服务。
129
70
 
130
- - **将 Web 配置服务绑定到所有网卡:**
71
+ ### 推荐的服务器端使用方式
131
72
 
132
- ```bash
133
- export OPEN_IM_NO_BROWSER=1
134
- export OPEN_IM_WEB_HOST=0.0.0.0
135
- open-im start
136
- ```
73
+ 在远程服务器上,建议的最简单、安全的方式是:
137
74
 
138
- - 默认情况下,`OPEN_IM_WEB_HOST` 为 `127.0.0.1`(仅本机访问)。
139
- - 设置为 `0.0.0.0` 后,配置页面会监听在所有网卡上。
75
+ 1. **先通过 `dashboard` 在浏览器里完成配置**
140
76
 
141
- - **启动后,open-im 会在日志中输出一次性登录链接**,类似:
77
+ 在服务器上执行:
142
78
 
143
- ```text
144
- ━━━━━━━━ Web Config Login ━━━━━━━━
145
- Host binding : 0.0.0.0
146
- Login URL : http://127.0.0.1:39282/?login_token=xxxx
147
- Note: replace 127.0.0.1 with your server IP or hostname when opening from another device.
148
- This login link is valid for approximately 15 minutes and can be used only once.
149
- After login, subsequent requests will use a short-lived session cookie.
150
- ```
79
+ ```bash
80
+ export OPEN_IM_NO_BROWSER=1
81
+ # 可选:如果希望从其他设备访问配置页,可以绑定到所有网卡
82
+ # export OPEN_IM_WEB_HOST=0.0.0.0
83
+ open-im dashboard
84
+ ```
151
85
 
152
- - **在本地电脑或手机浏览器中**,将 `127.0.0.1` 换成服务器 IP 或域名,打开该链接:
86
+ - 这只会启动 Web 配置页,不会同时启动桥接服务。
87
+ - 若设置了 `OPEN_IM_WEB_HOST=0.0.0.0`,服务端会输出一次性登录链接,例如:
153
88
 
154
- ```text
155
- http://your-server-ip:39282/?login_token=xxxx
156
- ```
89
+ ```text
90
+ http://your-server-ip:39282/?login_token=xxxx
91
+ ```
157
92
 
158
- 第一次成功访问会:
93
+ - 在浏览器中打开该链接,按照页面提示完成各个平台 / AI 工具配置,最后在页面中点击 **「Start bridge」** 按钮启动桥接服务。
159
94
 
160
- - 消费掉这枚一次性 `login_token`(后续再访问同一链接会 401);
161
- - 在浏览器中创建一个短期会话,设置 `openim_session` Cookie;
162
- - 自动重定向到不带参数的配置页。
95
+ 2. **后台运行桥接服务**
163
96
 
164
- 之后,只要 `openim_session` Cookie 仍然有效、进程仍在运行,就可以直接访问:
97
+ 配置保存后,有两种启动方式:
98
+ - 在 Web 页面 Service 面板中直接点击 **「Start bridge」**;
99
+ - 或者在服务器上运行:
165
100
 
166
- ```text
167
- http://your-server-ip:39282/
168
- ```
101
+ ```bash
102
+ open-im start
103
+ ```
169
104
 
170
- > 安全提示:
171
- >
172
- > - 将 `OPEN_IM_WEB_HOST=0.0.0.0` 意味着该端口会对所有网卡开放,请务必结合防火墙/安全组、尽量配合 HTTPS + 反向代理(例如 Nginx/Caddy 的 Basic Auth 或 OIDC 登录)一起使用。
173
- > - 如无把握,优先使用上面的 SSH 隧道方案(第 3 步),安全性更高。
105
+ 这会根据已保存的配置,在后台长期运行桥接服务。
174
106
 
175
107
  ## 会话说明
176
108
 
@@ -321,46 +253,46 @@ codebuddy login
321
253
 
322
254
  ### 常用环境变量
323
255
 
324
- | 变量 | 说明 |
325
- | ---- | ---- |
326
- | `AI_COMMAND` | 选择 `claude` / `codex` / `codebuddy` |
327
- | `CLAUDE_WORK_DIR` | 默认会话目录 |
328
- | `LOG_DIR` | 日志目录 |
329
- | `LOG_LEVEL` | 日志级别 |
330
- | `HOOK_PORT` | 权限服务端口 |
331
- | `CODEX_PROXY` | Codex 访问 `chatgpt.com` 的代理 |
332
- | `OPENAI_API_KEY` | Codex API Key,可替代 `codex login` |
333
- | `CODEBUDDY_CLI_PATH` | 覆盖 CodeBuddy CLI 路径 |
334
- | `CODEBUDDY_TIMEOUT_MS` | 覆盖 CodeBuddy 超时 |
335
- | `CODEBUDDY_SKIP_PERMISSIONS` | 覆盖 CodeBuddy 的跳过权限确认行为 |
336
- | `CODEBUDDY_IDLE_TIMEOUT_MS` | CodeBuddy 长时间无输出时自动终止 |
337
- | `CODEBUDDY_API_KEY` | CodeBuddy API Key,可替代 `codebuddy login` |
338
- | `CODEBUDDY_AUTH_TOKEN` | CodeBuddy Auth Token,可替代 `codebuddy login` |
339
- | `TELEGRAM_BOT_TOKEN` | Telegram Bot Token |
340
- | `TELEGRAM_PROXY` | Telegram 代理地址 |
341
- | `TELEGRAM_ALLOWED_USER_IDS` | Telegram 白名单 |
342
- | `FEISHU_APP_ID` | 飞书 App ID |
343
- | `FEISHU_APP_SECRET` | 飞书 App Secret |
344
- | `FEISHU_ALLOWED_USER_IDS` | 飞书白名单 |
345
- | `QQ_BOT_APPID` | QQ 机器人 App ID |
346
- | `QQ_BOT_SECRET` | QQ 机器人 App Secret |
347
- | `QQ_BOT_SANDBOX` | QQ 机器人沙箱模式(`1`/`true` 启用,默认关闭) |
348
- | `QQ_ALLOWED_USER_IDS` | QQ 白名单 |
349
- | `DINGTALK_CLIENT_ID` | 钉钉应用 Client ID / AppKey |
350
- | `DINGTALK_CLIENT_SECRET` | 钉钉应用 Client Secret / AppSecret |
351
- | `DINGTALK_CARD_TEMPLATE_ID` | 钉钉 AI 卡片模板 ID,配置后启用单条流式回复 |
352
- | `DINGTALK_ALLOWED_USER_IDS` | 钉钉白名单 |
353
- | `WEWORK_CORP_ID` | 企业微信 Bot ID |
354
- | `WEWORK_SECRET` | 企业微信 Secret |
355
- | `WEWORK_WS_URL` | 企业微信 WebSocket 地址 |
356
- | `WEWORK_ALLOWED_USER_IDS` | 企业微信白名单 |
357
- | `WECHAT_APP_ID` | 微信标准模式 App ID |
358
- | `WECHAT_APP_SECRET` | 微信标准模式 App Secret |
359
- | `WECHAT_TOKEN` | 微信 AGP 模式 Token |
360
- | `WECHAT_GUID` | 微信 AGP 模式 GUID |
361
- | `WECHAT_USER_ID` | 微信 AGP 模式 User ID |
362
- | `WECHAT_WS_URL` | 微信 WebSocket 地址 |
363
- | `WECHAT_ALLOWED_USER_IDS` | 微信白名单 |
256
+ | 变量 | 说明 |
257
+ | ---------------------------- | ---------------------------------------------- |
258
+ | `AI_COMMAND` | 选择 `claude` / `codex` / `codebuddy` |
259
+ | `CLAUDE_WORK_DIR` | 默认会话目录 |
260
+ | `LOG_DIR` | 日志目录 |
261
+ | `LOG_LEVEL` | 日志级别 |
262
+ | `HOOK_PORT` | 权限服务端口 |
263
+ | `CODEX_PROXY` | Codex 访问 `chatgpt.com` 的代理 |
264
+ | `OPENAI_API_KEY` | Codex API Key,可替代 `codex login` |
265
+ | `CODEBUDDY_CLI_PATH` | 覆盖 CodeBuddy CLI 路径 |
266
+ | `CODEBUDDY_TIMEOUT_MS` | 覆盖 CodeBuddy 超时 |
267
+ | `CODEBUDDY_SKIP_PERMISSIONS` | 覆盖 CodeBuddy 的跳过权限确认行为 |
268
+ | `CODEBUDDY_IDLE_TIMEOUT_MS` | CodeBuddy 长时间无输出时自动终止 |
269
+ | `CODEBUDDY_API_KEY` | CodeBuddy API Key,可替代 `codebuddy login` |
270
+ | `CODEBUDDY_AUTH_TOKEN` | CodeBuddy Auth Token,可替代 `codebuddy login` |
271
+ | `TELEGRAM_BOT_TOKEN` | Telegram Bot Token |
272
+ | `TELEGRAM_PROXY` | Telegram 代理地址 |
273
+ | `TELEGRAM_ALLOWED_USER_IDS` | Telegram 白名单 |
274
+ | `FEISHU_APP_ID` | 飞书 App ID |
275
+ | `FEISHU_APP_SECRET` | 飞书 App Secret |
276
+ | `FEISHU_ALLOWED_USER_IDS` | 飞书白名单 |
277
+ | `QQ_BOT_APPID` | QQ 机器人 App ID |
278
+ | `QQ_BOT_SECRET` | QQ 机器人 App Secret |
279
+ | `QQ_BOT_SANDBOX` | QQ 机器人沙箱模式(`1`/`true` 启用,默认关闭) |
280
+ | `QQ_ALLOWED_USER_IDS` | QQ 白名单 |
281
+ | `DINGTALK_CLIENT_ID` | 钉钉应用 Client ID / AppKey |
282
+ | `DINGTALK_CLIENT_SECRET` | 钉钉应用 Client Secret / AppSecret |
283
+ | `DINGTALK_CARD_TEMPLATE_ID` | 钉钉 AI 卡片模板 ID,配置后启用单条流式回复 |
284
+ | `DINGTALK_ALLOWED_USER_IDS` | 钉钉白名单 |
285
+ | `WEWORK_CORP_ID` | 企业微信 Bot ID |
286
+ | `WEWORK_SECRET` | 企业微信 Secret |
287
+ | `WEWORK_WS_URL` | 企业微信 WebSocket 地址 |
288
+ | `WEWORK_ALLOWED_USER_IDS` | 企业微信白名单 |
289
+ | `WECHAT_APP_ID` | 微信标准模式 App ID |
290
+ | `WECHAT_APP_SECRET` | 微信标准模式 App Secret |
291
+ | `WECHAT_TOKEN` | 微信 AGP 模式 Token |
292
+ | `WECHAT_GUID` | 微信 AGP 模式 GUID |
293
+ | `WECHAT_USER_ID` | 微信 AGP 模式 User ID |
294
+ | `WECHAT_WS_URL` | 微信 WebSocket 地址 |
295
+ | `WECHAT_ALLOWED_USER_IDS` | 微信白名单 |
364
296
 
365
297
  ### 平台配置来源
366
298
 
@@ -381,15 +313,15 @@ codebuddy login
381
313
 
382
314
  ## IM 内命令
383
315
 
384
- | 命令 | 说明 |
385
- | ---- | ---- |
386
- | `/help` | 显示帮助 |
387
- | `/new` | 开始新会话 |
388
- | `/status` | 显示 AI 工具、版本、会话目录、会话 ID |
389
- | `/cd <路径>` | 切换会话目录 |
390
- | `/pwd` | 显示当前会话目录 |
391
- | `/allow` `/y` | 允许权限请求 |
392
- | `/deny` `/n` | 拒绝权限请求 |
316
+ | 命令 | 说明 |
317
+ | ------------- | ------------------------------------- |
318
+ | `/help` | 显示帮助 |
319
+ | `/new` | 开始新会话 |
320
+ | `/status` | 显示 AI 工具、版本、会话目录、会话 ID |
321
+ | `/cd <路径>` | 切换会话目录 |
322
+ | `/pwd` | 显示当前会话目录 |
323
+ | `/allow` `/y` | 允许权限请求 |
324
+ | `/deny` `/n` | 拒绝权限请求 |
393
325
 
394
326
  ## 故障排除
395
327
 
package/dist/cli.js CHANGED
@@ -120,11 +120,11 @@ async function cmdDev() {
120
120
  }
121
121
  async function cmdDashboard() {
122
122
  // Start web config server in persistent mode (no timeout)
123
- const { startWebConfigServer, openWebConfigUrl } = await import("./config-web.js");
123
+ const { startWebConfigServer } = await import("./config-web.js");
124
124
  const server = await startWebConfigServer({ mode: "dev", cwd: process.cwd(), persistent: true });
125
- console.log(`\nDashboard: ${server.url}`);
125
+ const url = server.loginUrl ?? server.url;
126
+ console.log(`\nDashboard: ${url}`);
126
127
  console.log("Press Ctrl+C to close.\n");
127
- openWebConfigUrl();
128
128
  await server.waitForResult;
129
129
  }
130
130
  function showHelp(exitCode = 0) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wu529778790/open-im",
3
- "version": "1.7.1-beta.3",
3
+ "version": "1.7.1-beta.5",
4
4
  "description": "Multi-platform IM bridge for AI CLI tools (Claude, Codex, CodeBuddy)",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",