@caoruhua/open-claude-remote 0.2.4 → 0.3.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 (66) hide show
  1. package/README.md +52 -2
  2. package/dist/backend/src/api/config-routes.d.ts.map +1 -1
  3. package/dist/backend/src/api/config-routes.js +120 -57
  4. package/dist/backend/src/api/config-routes.js.map +1 -1
  5. package/dist/backend/src/api/router.d.ts +4 -0
  6. package/dist/backend/src/api/router.d.ts.map +1 -1
  7. package/dist/backend/src/api/router.js +6 -1
  8. package/dist/backend/src/api/router.js.map +1 -1
  9. package/dist/backend/src/api/status-routes.d.ts +7 -1
  10. package/dist/backend/src/api/status-routes.d.ts.map +1 -1
  11. package/dist/backend/src/api/status-routes.js +22 -1
  12. package/dist/backend/src/api/status-routes.js.map +1 -1
  13. package/dist/backend/src/cli.d.ts.map +1 -1
  14. package/dist/backend/src/cli.js +3 -17
  15. package/dist/backend/src/cli.js.map +1 -1
  16. package/dist/backend/src/config.d.ts +20 -0
  17. package/dist/backend/src/config.d.ts.map +1 -1
  18. package/dist/backend/src/config.js +45 -0
  19. package/dist/backend/src/config.js.map +1 -1
  20. package/dist/backend/src/daemon/daemon-entry.d.ts +1 -0
  21. package/dist/backend/src/daemon/daemon-entry.js +2 -1
  22. package/dist/backend/src/daemon/daemon-entry.js.map +1 -1
  23. package/dist/backend/src/daemon/daemon-guard.d.ts +17 -0
  24. package/dist/backend/src/daemon/daemon-guard.d.ts.map +1 -0
  25. package/dist/backend/src/daemon/daemon-guard.js +78 -0
  26. package/dist/backend/src/daemon/daemon-guard.js.map +1 -0
  27. package/dist/backend/src/index.d.ts.map +1 -1
  28. package/dist/backend/src/index.js +70 -4
  29. package/dist/backend/src/index.js.map +1 -1
  30. package/dist/backend/src/instance/instance-session.d.ts +26 -0
  31. package/dist/backend/src/instance/instance-session.d.ts.map +1 -1
  32. package/dist/backend/src/instance/instance-session.js +118 -13
  33. package/dist/backend/src/instance/instance-session.js.map +1 -1
  34. package/dist/backend/src/skills/skill-command-merger.d.ts.map +1 -1
  35. package/dist/backend/src/skills/skill-command-merger.js +6 -0
  36. package/dist/backend/src/skills/skill-command-merger.js.map +1 -1
  37. package/dist/backend/src/terminal/terminal-relay.d.ts +2 -1
  38. package/dist/backend/src/terminal/terminal-relay.d.ts.map +1 -1
  39. package/dist/backend/src/terminal/terminal-relay.js +9 -4
  40. package/dist/backend/src/terminal/terminal-relay.js.map +1 -1
  41. package/dist/backend/src/utils/banner.d.ts +9 -0
  42. package/dist/backend/src/utils/banner.d.ts.map +1 -1
  43. package/dist/backend/src/utils/banner.js +26 -2
  44. package/dist/backend/src/utils/banner.js.map +1 -1
  45. package/dist/backend/src/utils/file-lock.d.ts.map +1 -1
  46. package/dist/backend/src/utils/file-lock.js +21 -2
  47. package/dist/backend/src/utils/file-lock.js.map +1 -1
  48. package/dist/backend/src/utils/ip-monitor.d.ts +17 -1
  49. package/dist/backend/src/utils/ip-monitor.d.ts.map +1 -1
  50. package/dist/backend/src/utils/ip-monitor.js +78 -3
  51. package/dist/backend/src/utils/ip-monitor.js.map +1 -1
  52. package/dist/backend/src/utils/network.d.ts +36 -0
  53. package/dist/backend/src/utils/network.d.ts.map +1 -1
  54. package/dist/backend/src/utils/network.js +125 -0
  55. package/dist/backend/src/utils/network.js.map +1 -1
  56. package/dist/shared/defaults.d.ts.map +1 -1
  57. package/dist/shared/defaults.js +0 -1
  58. package/dist/shared/defaults.js.map +1 -1
  59. package/dist/shared/ws-protocol.d.ts +17 -2
  60. package/dist/shared/ws-protocol.d.ts.map +1 -1
  61. package/frontend-dist/assets/index-DlG_4fGj.css +32 -0
  62. package/frontend-dist/assets/index-FfUR0j1j.js +152 -0
  63. package/frontend-dist/index.html +2 -2
  64. package/package.json +1 -1
  65. package/frontend-dist/assets/index-BKudo1Dw.css +0 -32
  66. package/frontend-dist/assets/index-CM2xfmS8.js +0 -152
package/README.md CHANGED
@@ -49,8 +49,22 @@ Scan the QR code shown in your terminal with your phone. The auth token is auto-
49
49
  - Real-time terminal output streamed to your phone
50
50
  - Full ANSI color rendering via xterm.js
51
51
  - 10K-line scrollback buffer, auto-restored on reconnect
52
+ - **Multi-network support** — displays all available IPs (WiFi, VPN, Ethernet) on startup
52
53
  - LAN IP change notification with new connection URL
53
- - Smart auto-scroll with a "scroll to bottom" floating button
54
+ - Smart auto-scroll with a "scroll to bottom" floating button — respects your scroll position when browsing history
55
+ - **Tap-to-focus** — clicking anywhere in the terminal automatically focuses the input bar for a seamless typing experience
56
+
57
+ ### Multi-Network Access (WiFi + VPN)
58
+
59
+ Access Claude Code Remote from multiple network interfaces simultaneously:
60
+
61
+ - **Automatic network detection** — discovers all available IPv4 interfaces on startup
62
+ - **VPN support** — detects common VPN interfaces (WireGuard, Tailscale, ZeroTier, PPP, etc.)
63
+ - **Custom CIDR ranges** — configure `customPrivateRanges` to add company-specific networks
64
+ - **Network change notifications** — WebSocket `network_changed` events notify clients when interfaces change
65
+ - **Unified CORS** — all detected IPs are automatically added to the CORS allowlist
66
+
67
+ Example: When connected to both WiFi (192.168.x.x) and company VPN (30.x.x.x), both addresses are displayed on startup and accessible via the web UI.
54
68
 
55
69
  ### Quick Actions
56
70
  - One-tap keys: Esc, Enter, Tab, arrows, Shift+Tab
@@ -209,6 +223,7 @@ Config file: `~/.claude-remote/settings.json` (legacy `config.json` is auto-migr
209
223
  | `workspaces` | string[] | [] | Allowed working directories for web-spawned instances |
210
224
  | `settingsDirs` | string[] | ["~/.claude/", "~/.claude-remote/settings/"] | Directories to scan for settings files |
211
225
  | `notifications` | object | — | Notification channels config (see below) |
226
+ | `customPrivateRanges` | string[] | [] | Custom CIDR ranges for CORS allowlist (e.g., `["30.0.0.0/8"]` for VPN networks) |
212
227
 
213
228
  > **Note**: Port is fixed at 8866. All instances run in a single daemon process.
214
229
 
@@ -222,6 +237,16 @@ Config file: `~/.claude-remote/settings.json` (legacy `config.json` is auto-migr
222
237
 
223
238
  **Priority**: CLI args > config file > defaults (except `claudeArgs` which is merged)
224
239
 
240
+ ### Project-level Configuration
241
+
242
+ Shortcuts and commands are automatically saved per-project when configured through the Web UI with an active instance:
243
+
244
+ - Configuration is stored in `<project-dir>/.claude-remote/settings.json`
245
+ - When opening settings from an instance view, `shortcuts` and `commands` changes are saved to the project directory
246
+ - When opening settings without an active instance, changes are saved to the global config (`~/.claude-remote/settings.json`)
247
+
248
+ This allows each project to have its own set of commands while sharing global settings like notifications.
249
+
225
250
  ### Shortcuts
226
251
 
227
252
  Quick-input buttons displayed below the terminal.
@@ -533,8 +558,22 @@ claude-remote
533
558
  - 实时终端输出推送到手机
534
559
  - 通过 xterm.js 完整渲染 ANSI 颜色
535
560
  - 1万行滚动缓冲区,重连时自动恢复
561
+ - **多网络支持** — 启动时显示所有可用 IP(WiFi、VPN、以太网)
536
562
  - 局域网 IP 变更通知,附带新连接地址
537
- - 智能自动滚动,配有"滚动到底部"悬浮按钮
563
+ - 智能自动滚动,配有"滚动到底部"悬浮按钮 — 浏览历史时尊重你的滚动位置
564
+ - **点击聚焦** — 点击终端任意位置自动聚焦输入框,打字体验更流畅
565
+
566
+ ### 多网络访问(WiFi + VPN)
567
+
568
+ 同时从多个网络接口访问 Claude Code Remote:
569
+
570
+ - **自动网络检测** — 启动时自动发现所有可用的 IPv4 接口
571
+ - **VPN 支持** — 自动识别常见 VPN 接口(WireGuard、Tailscale、ZeroTier、PPP 等)
572
+ - **自定义 CIDR 网段** — 配置 `customPrivateRanges` 添加公司特定网络
573
+ - **网络变更通知** — WebSocket `network_changed` 事件在接口变化时通知客户端
574
+ - **统一 CORS** — 所有检测到的 IP 自动添加到 CORS 白名单
575
+
576
+ 示例:当同时连接 WiFi(192.168.x.x)和公司 VPN(30.x.x.x)时,启动时会显示两个地址,都可以通过 Web UI 访问。
538
577
 
539
578
  ### 快捷操作
540
579
  - 一键发送:Esc、Enter、Tab、方向键、Shift+Tab
@@ -693,6 +732,7 @@ claude-remote update
693
732
  | `workspaces` | string[] | [] | Web 生成实例允许的工作目录 |
694
733
  | `settingsDirs` | string[] | ["~/.claude/", "~/.claude-remote/settings/"] | 设置文件扫描目录 |
695
734
  | `notifications` | object | — | 通知渠道配置(见下文) |
735
+ | `customPrivateRanges` | string[] | [] | CORS 白名单的自定义 CIDR 网段(如 `["30.0.0.0/8"]` 用于 VPN 网络) |
696
736
 
697
737
  > **注意**:端口固定为 8866。所有实例运行在单个守护进程中。
698
738
 
@@ -706,6 +746,16 @@ claude-remote update
706
746
 
707
747
  **优先级**:CLI 参数 > 配置文件 > 默认值(`claudeArgs` 除外,它是合并的)
708
748
 
749
+ ### 项目级配置
750
+
751
+ 通过 Web UI 配置时,快捷键和命令会自动按项目保存:
752
+
753
+ - 配置存储在 `<项目目录>/.claude-remote/settings.json`
754
+ - 从实例视图打开设置时,`shortcuts` 和 `commands` 的变更会保存到项目目录
755
+ - 没有活跃实例时打开设置,变更会保存到全局配置(`~/.claude-remote/settings.json`)
756
+
757
+ 这样每个项目可以有自己的一组命令,同时共享通知等全局设置。
758
+
709
759
  ### 快捷键
710
760
 
711
761
  终端下方显示的快捷输入按钮。
@@ -1 +1 @@
1
- {"version":3,"file":"config-routes.d.ts","sourceRoot":"","sources":["../../../../backend/src/api/config-routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAKjC,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAoBxD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AACnF,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,iDAAiD,CAAC;AAClG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AA+GvE,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,UAAU,EACtB,mBAAmB,CAAC,EAAE,mBAAmB,EACzC,0BAA0B,CAAC,EAAE,0BAA0B,EACvD,eAAe,CAAC,EAAE,eAAe,GAChC,MAAM,CA+MR"}
1
+ {"version":3,"file":"config-routes.d.ts","sourceRoot":"","sources":["../../../../backend/src/api/config-routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAKjC,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AA0BxD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AACnF,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,iDAAiD,CAAC;AAClG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAgHvE,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,UAAU,EACtB,mBAAmB,CAAC,EAAE,mBAAmB,EACzC,0BAA0B,CAAC,EAAE,0BAA0B,EACvD,eAAe,CAAC,EAAE,eAAe,GAChC,MAAM,CAiRR"}
@@ -1,17 +1,17 @@
1
1
  import { Router } from 'express';
2
- import { readFile, writeFile } from 'fs/promises';
2
+ import { writeFile } from 'fs/promises';
3
3
  import { existsSync, mkdirSync } from 'fs';
4
4
  import { join } from 'path';
5
- import { homedir } from 'os';
5
+ import { homedir } from 'node:os';
6
6
  import { createAuthRoutes } from './auth-routes.js';
7
7
  import { logger } from '../logger/logger.js';
8
8
  import { withFileLockAsync } from '../utils/file-lock.js';
9
- import { fillDefaultShortcuts, fillDefaultCommands, } from '../config.js';
9
+ import { fillDefaultShortcuts, fillDefaultCommands, loadUserConfig as loadUserConfigSync, loadWorkdirConfig, mergeConfigs, saveWorkdirConfig, getWorkdirConfigLock, } from '../config.js';
10
10
  import { scanSkills, convertSkillsToCommands, mergeSkillCommands, } from '../skills/index.js';
11
11
  import { getNotificationStatus, } from '../../../shared/index.js';
12
- const CONFIG_DIR = join(homedir(), '.claude-remote');
13
- const CONFIG_FILE = join(CONFIG_DIR, 'settings.json');
14
- const CONFIG_LOCK = CONFIG_FILE + '.lock';
12
+ function getGlobalConfigLock() {
13
+ return getGlobalConfigFile() + '.lock';
14
+ }
15
15
  /**
16
16
  * 验证配置结构
17
17
  */
@@ -100,31 +100,29 @@ function validateConfigStructure(config) {
100
100
  return true;
101
101
  }
102
102
  /**
103
- * 读取用户配置文件
103
+ * 获取全局配置目录路径
104
104
  */
105
- async function loadUserConfig() {
106
- try {
107
- if (!existsSync(CONFIG_FILE)) {
108
- return null;
109
- }
110
- const content = await readFile(CONFIG_FILE, 'utf-8');
111
- return JSON.parse(content);
112
- }
113
- catch (error) {
114
- logger.error({ error, path: CONFIG_FILE }, 'Failed to load user config');
115
- return null;
116
- }
105
+ function getGlobalConfigDir() {
106
+ return join(homedir(), '.claude-remote');
107
+ }
108
+ /**
109
+ * 获取全局配置文件路径
110
+ */
111
+ function getGlobalConfigFile() {
112
+ return join(getGlobalConfigDir(), 'settings.json');
117
113
  }
118
114
  /**
119
115
  * 保存配置文件
120
116
  */
121
117
  async function saveUserConfig(config) {
118
+ const configDir = getGlobalConfigDir();
119
+ const configFile = getGlobalConfigFile();
122
120
  // 确保目录存在
123
- if (!existsSync(CONFIG_DIR)) {
124
- mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });
121
+ if (!existsSync(configDir)) {
122
+ mkdirSync(configDir, { recursive: true, mode: 0o700 });
125
123
  }
126
124
  // 直接写入文件
127
- await writeFile(CONFIG_FILE, JSON.stringify(config, null, 2), { mode: 0o600 });
125
+ await writeFile(configFile, JSON.stringify(config, null, 2), { mode: 0o600 });
128
126
  }
129
127
  export function createConfigRoutes(authModule, notificationManager, notificationServiceFactory, instanceManager) {
130
128
  const router = Router();
@@ -132,50 +130,83 @@ export function createConfigRoutes(authModule, notificationManager, notification
132
130
  router.use(createAuthRoutes(authModule));
133
131
  /**
134
132
  * GET /api/config - 获取用户配置
133
+ * 支持实例隔离:查询哪个实例就返回该实例对应的合并配置(全局 + 项目配置)
135
134
  */
136
135
  router.get('/config', authModule.requireAuth.bind(authModule), async (req, res) => {
137
136
  try {
138
- const config = await loadUserConfig();
139
- if (!config) {
140
- // 配置文件不存在,返回 null 让前端使用自己的默认值
141
- res.json({ config: null, configPath: CONFIG_FILE });
142
- return;
137
+ const instanceId = req.query.instanceId;
138
+ // 1. 加载全局配置
139
+ const globalConfig = loadUserConfigSync();
140
+ // 2. 确定工作目录和项目配置
141
+ let cwd;
142
+ let workdirConfig = {};
143
+ if (instanceId) {
144
+ // 传入 instanceId,使用该实例的 cwd
145
+ const instance = instanceManager?.getInstance(instanceId);
146
+ if (instance) {
147
+ cwd = instance.cwd;
148
+ workdirConfig = loadWorkdirConfig(cwd);
149
+ logger.debug({ instanceId, cwd }, 'Using specified instance for config');
150
+ }
151
+ else {
152
+ // 实例不存在,fallback 到全局配置的 claudeCwd
153
+ cwd = globalConfig.claudeCwd ?? process.cwd();
154
+ workdirConfig = loadWorkdirConfig(cwd);
155
+ logger.warn({ instanceId, fallbackCwd: cwd }, 'Instance not found, using fallback cwd');
156
+ }
143
157
  }
144
- // 懒填充默认值(不持久化,仅返回时填充)
145
- // 好处:配置文件保持精简,默认值更新时用户自动受益
146
- let filledConfig = config;
147
- if (!config.shortcuts) {
148
- filledConfig = fillDefaultShortcuts(filledConfig);
158
+ else {
159
+ // 没有指定实例,检查活跃实例
160
+ const activeInstances = instanceManager?.listInstances() ?? [];
161
+ if (activeInstances.length > 0) {
162
+ // 使用第一个实例的 cwd
163
+ cwd = activeInstances[0].cwd;
164
+ workdirConfig = loadWorkdirConfig(cwd);
165
+ logger.debug({ instanceId: activeInstances[0].instanceId, cwd }, 'Using first instance for config');
166
+ }
167
+ else if (globalConfig.claudeCwd) {
168
+ // 无实例但有全局配置的 claudeCwd
169
+ cwd = globalConfig.claudeCwd;
170
+ workdirConfig = loadWorkdirConfig(cwd);
171
+ }
172
+ else {
173
+ // 最后 fallback
174
+ cwd = process.cwd();
175
+ logger.warn({ fallbackCwd: cwd }, 'No instance, falling back to process.cwd()');
176
+ }
149
177
  }
150
- if (!config.commands) {
151
- filledConfig = fillDefaultCommands(filledConfig);
178
+ // 3. 合并全局配置和项目配置
179
+ let mergedConfig = mergeConfigs(globalConfig, workdirConfig);
180
+ // 4. 填充默认值
181
+ if (!mergedConfig.shortcuts) {
182
+ mergedConfig = fillDefaultShortcuts(mergedConfig);
152
183
  }
153
- // 扫描并合并 Skill Commands
154
- const claudeCwd = filledConfig.claudeCwd ?? process.cwd();
155
- if (!filledConfig.claudeCwd) {
156
- logger.warn({ fallbackCwd: claudeCwd }, 'claudeCwd not set in config, falling back to process.cwd() for skill scan');
184
+ if (!mergedConfig.commands) {
185
+ mergedConfig = fillDefaultCommands(mergedConfig);
157
186
  }
158
- const skills = scanSkills(claudeCwd);
187
+ // 5. 扫描项目目录下的 skills(使用正确的 cwd)
188
+ const skills = scanSkills(cwd);
159
189
  const skillCommands = convertSkillsToCommands(skills);
160
- const mergeResult = mergeSkillCommands(filledConfig.commands ?? [], skillCommands);
161
- filledConfig = { ...filledConfig, commands: mergeResult.commands };
190
+ const mergeResult = mergeSkillCommands(mergedConfig.commands ?? [], skillCommands);
191
+ mergedConfig = { ...mergedConfig, commands: mergeResult.commands };
162
192
  if (mergeResult.added > 0 || mergeResult.removed > 0) {
163
193
  logger.info({
164
194
  added: mergeResult.added,
165
195
  removed: mergeResult.removed,
166
196
  preserved: mergeResult.preserved,
167
197
  total: mergeResult.total,
198
+ cwd,
168
199
  }, 'Skill commands merged');
169
200
  }
170
201
  // 安全处理:不暴露敏感字段(token、webhook URL 等)
171
- const { token: _, notifications: _notif, ...safeConfig } = filledConfig;
202
+ const { token: _, notifications: _notif, ...safeConfig } = mergedConfig;
172
203
  // 构建通知配置的安全视图
173
- const safeNotifications = getNotificationStatus(filledConfig.notifications);
204
+ const safeNotifications = getNotificationStatus(mergedConfig.notifications);
174
205
  const responseConfig = {
175
206
  ...safeConfig,
176
207
  notifications: safeNotifications,
177
208
  };
178
- res.json({ config: responseConfig, configPath: CONFIG_FILE });
209
+ res.json({ config: responseConfig, configPath: getGlobalConfigFile() });
179
210
  }
180
211
  catch (error) {
181
212
  logger.error({ error }, 'Failed to get config');
@@ -184,35 +215,67 @@ export function createConfigRoutes(authModule, notificationManager, notification
184
215
  });
185
216
  /**
186
217
  * PUT /api/config - 更新用户配置
218
+ * 支持实例隔离:项目级配置保存到项目目录,全局配置保存到用户目录
187
219
  */
188
220
  router.put('/config', authModule.requireAuth.bind(authModule), async (req, res) => {
189
221
  try {
222
+ const instanceId = req.query.instanceId;
190
223
  const newConfig = req.body;
191
224
  // 验证配置结构
192
225
  if (!validateConfigStructure(newConfig)) {
193
226
  res.status(400).json({ error: 'Invalid config structure' });
194
227
  return;
195
228
  }
196
- // 文件锁保护 read-modify-write,防止与其他模块并发写入冲突
197
- await withFileLockAsync(CONFIG_LOCK, async () => {
198
- // 合并现有配置和新配置(前端可能只发送部分字段)
199
- const existingConfig = (await loadUserConfig()) ?? {};
200
- const mergedConfig = { ...existingConfig, ...newConfig };
229
+ // 分离项目级配置和全局配置
230
+ const { shortcuts, commands, ...globalFields } = newConfig;
231
+ // 判断 shortcuts/commands 的保存位置:
232
+ // - instanceId 且实例存在 保存到项目配置
233
+ // - instanceId 或实例不存在 保存到全局配置(向后兼容)
234
+ const instance = instanceId ? instanceManager?.getInstance(instanceId) : undefined;
235
+ const hasProjectFields = shortcuts !== undefined || commands !== undefined;
236
+ // 1. 保存全局配置
237
+ await withFileLockAsync(getGlobalConfigLock(), async () => {
238
+ const existingGlobal = loadUserConfigSync();
239
+ const mergedGlobal = {
240
+ ...existingGlobal,
241
+ ...globalFields,
242
+ };
243
+ // 无实例时,shortcuts/commands 保存到全局配置(向后兼容)
244
+ if (!(instance && hasProjectFields)) {
245
+ if (shortcuts !== undefined)
246
+ mergedGlobal.shortcuts = shortcuts;
247
+ if (commands !== undefined)
248
+ mergedGlobal.commands = commands;
249
+ }
201
250
  // 处理通知配置:逐渠道深合并,保留已有字段(如 enabled)
202
251
  if (newConfig.notifications) {
203
- const existingNotif = existingConfig.notifications ?? {};
252
+ const existingNotif = existingGlobal.notifications ?? {};
204
253
  const merged = { ...existingNotif };
205
- // 逐渠道合并:新值覆盖,但保留已有字段
206
254
  if (newConfig.notifications.dingtalk) {
207
255
  merged.dingtalk = { ...existingNotif.dingtalk, ...newConfig.notifications.dingtalk };
208
256
  }
209
257
  if (newConfig.notifications.wechat_work) {
210
258
  merged.wechat_work = { ...existingNotif.wechat_work, ...newConfig.notifications.wechat_work };
211
259
  }
212
- mergedConfig.notifications = merged;
260
+ mergedGlobal.notifications = merged;
213
261
  }
214
- await saveUserConfig(mergedConfig);
262
+ await saveUserConfig(mergedGlobal);
215
263
  });
264
+ // 2. 保存项目级配置(有实例时保存 shortcuts/commands)
265
+ let projectConfigPath;
266
+ if (instance && hasProjectFields) {
267
+ const projectLock = getWorkdirConfigLock(instance.cwd);
268
+ await withFileLockAsync(projectLock, async () => {
269
+ const existingProject = loadWorkdirConfig(instance.cwd);
270
+ const mergedProject = {
271
+ ...existingProject,
272
+ ...(shortcuts !== undefined && { shortcuts }),
273
+ ...(commands !== undefined && { commands }),
274
+ };
275
+ await saveWorkdirConfig(instance.cwd, mergedProject);
276
+ projectConfigPath = instance.cwd;
277
+ });
278
+ }
216
279
  // 触发服务缓存刷新(当前实例即时生效)
217
280
  if (notificationServiceFactory) {
218
281
  notificationServiceFactory.refresh();
@@ -224,8 +287,8 @@ export function createConfigRoutes(authModule, notificationManager, notification
224
287
  source: 'config_update',
225
288
  });
226
289
  }
227
- logger.info({ configPath: CONFIG_FILE }, 'User config updated');
228
- res.json({ success: true, configPath: CONFIG_FILE });
290
+ logger.info({ configPath: getGlobalConfigFile(), instanceId, projectConfigPath }, 'User config updated');
291
+ res.json({ success: true, configPath: getGlobalConfigFile() });
229
292
  }
230
293
  catch (error) {
231
294
  logger.error({ error }, 'Failed to update config');
@@ -250,8 +313,8 @@ export function createConfigRoutes(authModule, notificationManager, notification
250
313
  return;
251
314
  }
252
315
  // 文件锁保护 read-modify-write,返回结果供外部统一处理响应
253
- const result = await withFileLockAsync(CONFIG_LOCK, async () => {
254
- const config = (await loadUserConfig()) ?? {};
316
+ const result = await withFileLockAsync(getGlobalConfigLock(), async () => {
317
+ const config = loadUserConfigSync() ?? {};
255
318
  const notifications = config.notifications ?? {};
256
319
  // 检查渠道是否已配置
257
320
  if (channel === 'dingtalk') {
@@ -1 +1 @@
1
- {"version":3,"file":"config-routes.js","sourceRoot":"","sources":["../../../../backend/src/api/config-routes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config-routes.js","sourceRoot":"","sources":["../../../../backend/src/api/config-routes.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,10 @@ export interface ApiRouterOptions {
10
10
  pushService?: PushService;
11
11
  notificationManager?: NotificationManager;
12
12
  notificationServiceFactory?: NotificationServiceFactory;
13
+ /** 服务监听端口 */
14
+ port: number;
15
+ /** 自定义私有网段(CIDR 格式) */
16
+ customPrivateRanges?: string[];
13
17
  /** 关闭 daemon 的回调 */
14
18
  onShutdown?: () => void;
15
19
  }
@@ -1 +1 @@
1
- {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../../../backend/src/api/router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAQjC,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AACnF,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,iDAAiD,CAAC;AAGlG,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,UAAU,CAAC;IACvB,eAAe,EAAE,eAAe,CAAC;IACjC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,0BAA0B,CAAC,EAAE,0BAA0B,CAAC;IACxD,oBAAoB;IACpB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CA8C9D"}
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../../../backend/src/api/router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAQjC,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AACnF,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,iDAAiD,CAAC;AAGlG,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,UAAU,CAAC;IACvB,eAAe,EAAE,eAAe,CAAC;IACjC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,0BAA0B,CAAC,EAAE,0BAA0B,CAAC;IACxD,aAAa;IACb,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,oBAAoB;IACpB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAmD9D"}
@@ -11,7 +11,12 @@ export function createApiRouter(opts) {
11
11
  const router = Router();
12
12
  router.use(createHealthRoutes(opts.instanceManager));
13
13
  router.use(createAuthRoutes(opts.authModule));
14
- router.use(createStatusRoutes(opts.authModule, opts.instanceManager));
14
+ router.use(createStatusRoutes({
15
+ authModule: opts.authModule,
16
+ instanceManager: opts.instanceManager,
17
+ port: opts.port,
18
+ customPrivateRanges: opts.customPrivateRanges,
19
+ }));
15
20
  router.use(createHookRoutes(opts.instanceManager));
16
21
  router.use(createConfigRoutes(opts.authModule, opts.notificationManager, opts.notificationServiceFactory, opts.instanceManager));
17
22
  if (opts.pushService) {
@@ -1 +1 @@
1
- {"version":3,"file":"router.js","sourceRoot":"","sources":["../../../../backend/src/api/router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAMxD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAY7C,MAAM,UAAU,eAAe,CAAC,IAAsB;IACpD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IAExB,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;IACrD,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAC9C,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;IACtE,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;IACnD,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAC3B,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,mBAAmB,EACxB,IAAI,CAAC,0BAA0B,EAC/B,IAAI,CAAC,eAAe,CACrB,CAAC,CAAC;IAEH,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;IAExE,4DAA4D;IAC5D,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACpC,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC;YACpD,MAAM,WAAW,GAAG,EAAE,KAAK,WAAW,IAAI,EAAE,KAAK,KAAK,IAAI,EAAE,KAAK,kBAAkB,CAAC;YACpF,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;gBAC7C,OAAO;YACT,CAAC;YAED,uCAAuC;YACvC,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,IAA6B,CAAC;YACtD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,8EAA8E,EAAE,CAAC,CAAC;gBAChH,OAAO;YACT,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;YACtD,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;YACvB,2CAA2C;YAC3C,UAAU,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../../../backend/src/api/router.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,11 @@
1
1
  import { Router } from 'express';
2
2
  import { AuthModule } from '../auth/auth-middleware.js';
3
3
  import type { InstanceManager } from '../instance/instance-manager.js';
4
- export declare function createStatusRoutes(authModule: AuthModule, instanceManager: InstanceManager): Router;
4
+ export interface StatusRoutesOptions {
5
+ authModule: AuthModule;
6
+ instanceManager: InstanceManager;
7
+ port: number;
8
+ customPrivateRanges?: string[];
9
+ }
10
+ export declare function createStatusRoutes(opts: StatusRoutesOptions): Router;
5
11
  //# sourceMappingURL=status-routes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"status-routes.d.ts","sourceRoot":"","sources":["../../../../backend/src/api/status-routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAEvE,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,eAAe,GAAG,MAAM,CAwBnG"}
1
+ {"version":3,"file":"status-routes.d.ts","sourceRoot":"","sources":["../../../../backend/src/api/status-routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAIvE,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,UAAU,CAAC;IACvB,eAAe,EAAE,eAAe,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;CAChC;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CA+CpE"}
@@ -1,5 +1,7 @@
1
1
  import { Router } from 'express';
2
- export function createStatusRoutes(authModule, instanceManager) {
2
+ import { getAllNetworkInterfaces, isInCidrRange } from '../utils/network.js';
3
+ export function createStatusRoutes(opts) {
4
+ const { authModule, instanceManager, port, customPrivateRanges: customRanges = [] } = opts;
3
5
  const router = Router();
4
6
  // Session validation endpoint - checks if user is authenticated
5
7
  router.get('/status', authModule.requireAuth, (_req, res) => {
@@ -17,6 +19,25 @@ export function createStatusRoutes(authModule, instanceManager) {
17
19
  connectedClients: session.clientCount,
18
20
  });
19
21
  });
22
+ // Network information endpoint - returns all available network interfaces
23
+ router.get('/network', authModule.requireAuth, (_req, res) => {
24
+ const interfaces = getAllNetworkInterfaces();
25
+ const networkInfo = interfaces.map(iface => {
26
+ const isCustom = customRanges.some(range => isInCidrRange(iface.address, range));
27
+ return {
28
+ name: iface.name,
29
+ address: iface.address,
30
+ type: iface.isVpn ? 'vpn' : iface.isPrivate ? 'private' : isCustom ? 'custom' : 'public',
31
+ isVpn: iface.isVpn,
32
+ isPrivate: iface.isPrivate,
33
+ url: `http://${iface.address}:${port}`,
34
+ };
35
+ });
36
+ res.json({
37
+ interfaces: networkInfo,
38
+ preferredUrl: `http://127.0.0.1:${port}`,
39
+ });
40
+ });
20
41
  return router;
21
42
  }
22
43
  //# sourceMappingURL=status-routes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"status-routes.js","sourceRoot":"","sources":["../../../../backend/src/api/status-routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAIjC,MAAM,UAAU,kBAAkB,CAAC,UAAsB,EAAE,eAAgC;IACzF,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IAExB,gEAAgE;IAChE,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QAC1D,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,GAAG,CAAC,qBAAqB,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACrE,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,UAAoB,CAAC;QACnD,MAAM,OAAO,GAAG,eAAe,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QAExD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;YAClC,OAAO;QACT,CAAC;QAED,GAAG,CAAC,IAAI,CAAC;YACP,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,gBAAgB,EAAE,OAAO,CAAC,WAAW;SACtC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"status-routes.js","sourceRoot":"","sources":["../../../../backend/src/api/status-routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGjC,OAAO,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAU7E,MAAM,UAAU,kBAAkB,CAAC,IAAyB;IAC1D,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,IAAI,EAAE,mBAAmB,EAAE,YAAY,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC;IAC3F,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IAExB,gEAAgE;IAChE,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QAC1D,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,GAAG,CAAC,qBAAqB,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACrE,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,UAAoB,CAAC;QACnD,MAAM,OAAO,GAAG,eAAe,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QAExD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;YAClC,OAAO;QACT,CAAC;QAED,GAAG,CAAC,IAAI,CAAC;YACP,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,gBAAgB,EAAE,OAAO,CAAC,WAAW;SACtC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,0EAA0E;IAC1E,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QAC3D,MAAM,UAAU,GAAG,uBAAuB,EAAE,CAAC;QAE7C,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YACzC,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;YACjF,OAAO;gBACL,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;gBACxF,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,GAAG,EAAE,UAAU,KAAK,CAAC,OAAO,IAAI,IAAI,EAAE;aACvC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,IAAI,CAAC;YACP,UAAU,EAAE,WAAW;YACvB,YAAY,EAAE,oBAAoB,IAAI,EAAE;SACzC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../backend/src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;GAmBG;AAmLH;;;GAGG;AACH,iBAAe,mBAAmB,CAChC,OAAO,EAAE,OAAO,gBAAgB,EAAE,UAAU,EAC5C,OAAO,EAAE;IACP,MAAM,EAAE,OAAO,aAAa,EAAE,SAAS,CAAC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B,GACA,OAAO,CAAC,IAAI,CAAC,CAmHf;AAED;;GAEG;AACH,iBAAe,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAoEhD;AAED;;GAEG;AACH,iBAAe,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAyElD;AAED;;GAEG;AACH,iBAAS,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAW5D"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../backend/src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;GAmBG;AAqKH;;;GAGG;AACH,iBAAe,mBAAmB,CAChC,OAAO,EAAE,OAAO,gBAAgB,EAAE,UAAU,EAC5C,OAAO,EAAE;IACP,MAAM,EAAE,OAAO,aAAa,EAAE,SAAS,CAAC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B,GACA,OAAO,CAAC,IAAI,CAAC,CAmHf;AAED;;GAEG;AACH,iBAAe,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAoEhD;AAED;;GAEG;AACH,iBAAe,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAyElD;AAED;;GAEG;AACH,iBAAS,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAW5D"}
@@ -85,7 +85,7 @@ void (async () => {
85
85
  process.exit(1);
86
86
  }
87
87
  // Ensure daemon is running, then attach as client
88
- const { isDaemonRunning, checkDaemonVersion, smartRestartDaemon } = await import('./daemon/daemon-client.js');
88
+ const { isDaemonRunning, checkDaemonVersion } = await import('./daemon/daemon-client.js');
89
89
  const { launchDaemon } = await import('./daemon/daemon-launcher.js');
90
90
  const { DEFAULT_PORT } = await import('../../shared/index.js');
91
91
  let daemonPid;
@@ -121,22 +121,8 @@ void (async () => {
121
121
  // Collect warnings to display in banner
122
122
  const versionWarnings = [];
123
123
  if (versionCheck.needsRestart) {
124
- const versionMsg = `Daemon outdated: ${versionCheck.daemonVersion} → ${versionCheck.cliVersion}`;
125
- const result = await smartRestartDaemon();
126
- if (result.restarted) {
127
- process.stderr.write('Daemon restarted with latest version.\n');
128
- // After restart, daemon PID needs to be fetched from status API
129
- }
130
- else if (result.reason === 'has_instances') {
131
- versionWarnings.push(versionMsg);
132
- versionWarnings.push('Instances are running on old version.');
133
- versionWarnings.push('Run: claude-remote stop');
134
- }
135
- else if (result.reason === 'stop_failed') {
136
- versionWarnings.push(versionMsg);
137
- versionWarnings.push('Failed to stop daemon.');
138
- versionWarnings.push('Run: claude-remote stop');
139
- }
124
+ versionWarnings.push(`Daemon outdated: ${versionCheck.daemonVersion} → ${versionCheck.cliVersion}`);
125
+ versionWarnings.push('Run `claude-remote stop && claude-remote` to restart.');
140
126
  }
141
127
  // Store warnings for banner display
142
128
  process.env.CLI_VERSION_WARNINGS = JSON.stringify(versionWarnings);