@caoruhua/open-claude-remote 0.1.6 → 0.2.3

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 (132) hide show
  1. package/README.md +514 -11
  2. package/dist/backend/src/api/config-routes.d.ts +2 -2
  3. package/dist/backend/src/api/config-routes.d.ts.map +1 -1
  4. package/dist/backend/src/api/config-routes.js +21 -6
  5. package/dist/backend/src/api/config-routes.js.map +1 -1
  6. package/dist/backend/src/api/health-routes.d.ts +4 -1
  7. package/dist/backend/src/api/health-routes.d.ts.map +1 -1
  8. package/dist/backend/src/api/health-routes.js +20 -2
  9. package/dist/backend/src/api/health-routes.js.map +1 -1
  10. package/dist/backend/src/api/hook-routes.d.ts +2 -2
  11. package/dist/backend/src/api/hook-routes.d.ts.map +1 -1
  12. package/dist/backend/src/api/hook-routes.js +10 -3
  13. package/dist/backend/src/api/hook-routes.js.map +1 -1
  14. package/dist/backend/src/api/instance-routes.d.ts +5 -3
  15. package/dist/backend/src/api/instance-routes.d.ts.map +1 -1
  16. package/dist/backend/src/api/instance-routes.js +48 -45
  17. package/dist/backend/src/api/instance-routes.js.map +1 -1
  18. package/dist/backend/src/api/router.d.ts +4 -12
  19. package/dist/backend/src/api/router.d.ts.map +1 -1
  20. package/dist/backend/src/api/router.js +28 -20
  21. package/dist/backend/src/api/router.js.map +1 -1
  22. package/dist/backend/src/api/status-routes.d.ts +2 -2
  23. package/dist/backend/src/api/status-routes.d.ts.map +1 -1
  24. package/dist/backend/src/api/status-routes.js +11 -6
  25. package/dist/backend/src/api/status-routes.js.map +1 -1
  26. package/dist/backend/src/attach.d.ts +1 -1
  27. package/dist/backend/src/attach.d.ts.map +1 -1
  28. package/dist/backend/src/attach.js +25 -71
  29. package/dist/backend/src/attach.js.map +1 -1
  30. package/dist/backend/src/cli-utils.d.ts +24 -1
  31. package/dist/backend/src/cli-utils.d.ts.map +1 -1
  32. package/dist/backend/src/cli-utils.js +73 -37
  33. package/dist/backend/src/cli-utils.js.map +1 -1
  34. package/dist/backend/src/cli.d.ts +22 -2
  35. package/dist/backend/src/cli.d.ts.map +1 -1
  36. package/dist/backend/src/cli.js +328 -23
  37. package/dist/backend/src/cli.js.map +1 -1
  38. package/dist/backend/src/config.d.ts +48 -15
  39. package/dist/backend/src/config.d.ts.map +1 -1
  40. package/dist/backend/src/config.js +126 -27
  41. package/dist/backend/src/config.js.map +1 -1
  42. package/dist/backend/src/daemon/daemon-client.d.ts +69 -0
  43. package/dist/backend/src/daemon/daemon-client.d.ts.map +1 -0
  44. package/dist/backend/src/daemon/daemon-client.js +209 -0
  45. package/dist/backend/src/daemon/daemon-client.js.map +1 -0
  46. package/dist/backend/src/daemon/daemon-entry.d.ts +8 -0
  47. package/dist/backend/src/daemon/daemon-entry.d.ts.map +1 -0
  48. package/dist/backend/src/daemon/daemon-entry.js +37 -0
  49. package/dist/backend/src/daemon/daemon-entry.js.map +1 -0
  50. package/dist/backend/src/daemon/daemon-launcher.d.ts +13 -0
  51. package/dist/backend/src/daemon/daemon-launcher.d.ts.map +1 -0
  52. package/dist/backend/src/daemon/daemon-launcher.js +62 -0
  53. package/dist/backend/src/daemon/daemon-launcher.js.map +1 -0
  54. package/dist/backend/src/index.d.ts.map +1 -1
  55. package/dist/backend/src/index.js +115 -251
  56. package/dist/backend/src/index.js.map +1 -1
  57. package/dist/backend/src/instance/index.d.ts +4 -0
  58. package/dist/backend/src/instance/index.d.ts.map +1 -0
  59. package/dist/backend/src/instance/index.js +3 -0
  60. package/dist/backend/src/instance/index.js.map +1 -0
  61. package/dist/backend/src/instance/instance-manager.d.ts +62 -0
  62. package/dist/backend/src/instance/instance-manager.d.ts.map +1 -0
  63. package/dist/backend/src/instance/instance-manager.js +194 -0
  64. package/dist/backend/src/instance/instance-manager.js.map +1 -0
  65. package/dist/backend/src/instance/instance-session.d.ts +87 -0
  66. package/dist/backend/src/instance/instance-session.d.ts.map +1 -0
  67. package/dist/backend/src/instance/instance-session.js +359 -0
  68. package/dist/backend/src/instance/instance-session.js.map +1 -0
  69. package/dist/backend/src/instance/types.d.ts +39 -0
  70. package/dist/backend/src/instance/types.d.ts.map +1 -0
  71. package/dist/backend/src/instance/types.js +2 -0
  72. package/dist/backend/src/instance/types.js.map +1 -0
  73. package/dist/backend/src/notification/notification-manager.js +1 -1
  74. package/dist/backend/src/notification/notification-manager.js.map +1 -1
  75. package/dist/backend/src/notification/notification-service-factory.js +1 -1
  76. package/dist/backend/src/notification/notification-service-factory.js.map +1 -1
  77. package/dist/backend/src/pty/virtual-pty.d.ts.map +1 -1
  78. package/dist/backend/src/pty/virtual-pty.js +6 -0
  79. package/dist/backend/src/pty/virtual-pty.js.map +1 -1
  80. package/dist/backend/src/registry/shared-token.d.ts +2 -2
  81. package/dist/backend/src/registry/shared-token.js +11 -11
  82. package/dist/backend/src/registry/shared-token.js.map +1 -1
  83. package/dist/backend/src/registry/stop-instances.d.ts +0 -25
  84. package/dist/backend/src/registry/stop-instances.d.ts.map +1 -1
  85. package/dist/backend/src/registry/stop-instances.js +6 -206
  86. package/dist/backend/src/registry/stop-instances.js.map +1 -1
  87. package/dist/backend/src/skills/index.d.ts +4 -0
  88. package/dist/backend/src/skills/index.d.ts.map +1 -0
  89. package/dist/backend/src/skills/index.js +4 -0
  90. package/dist/backend/src/skills/index.js.map +1 -0
  91. package/dist/backend/src/skills/skill-command-merger.d.ts +32 -0
  92. package/dist/backend/src/skills/skill-command-merger.d.ts.map +1 -0
  93. package/dist/backend/src/skills/skill-command-merger.js +78 -0
  94. package/dist/backend/src/skills/skill-command-merger.js.map +1 -0
  95. package/dist/backend/src/skills/skill-commands.d.ts +25 -0
  96. package/dist/backend/src/skills/skill-commands.d.ts.map +1 -0
  97. package/dist/backend/src/skills/skill-commands.js +56 -0
  98. package/dist/backend/src/skills/skill-commands.js.map +1 -0
  99. package/dist/backend/src/skills/skill-scanner.d.ts +36 -0
  100. package/dist/backend/src/skills/skill-scanner.d.ts.map +1 -0
  101. package/dist/backend/src/skills/skill-scanner.js +143 -0
  102. package/dist/backend/src/skills/skill-scanner.js.map +1 -0
  103. package/dist/backend/src/terminal/terminal-relay.d.ts +1 -0
  104. package/dist/backend/src/terminal/terminal-relay.d.ts.map +1 -1
  105. package/dist/backend/src/terminal/terminal-relay.js +6 -0
  106. package/dist/backend/src/terminal/terminal-relay.js.map +1 -1
  107. package/dist/backend/src/update.d.ts.map +1 -1
  108. package/dist/backend/src/update.js +46 -1
  109. package/dist/backend/src/update.js.map +1 -1
  110. package/dist/backend/src/utils/banner.d.ts +15 -0
  111. package/dist/backend/src/utils/banner.d.ts.map +1 -0
  112. package/dist/backend/src/utils/banner.js +95 -0
  113. package/dist/backend/src/utils/banner.js.map +1 -0
  114. package/dist/backend/src/ws/ws-server.d.ts +13 -54
  115. package/dist/backend/src/ws/ws-server.d.ts.map +1 -1
  116. package/dist/backend/src/ws/ws-server.js +57 -155
  117. package/dist/backend/src/ws/ws-server.js.map +1 -1
  118. package/dist/shared/constants.d.ts +2 -1
  119. package/dist/shared/constants.d.ts.map +1 -1
  120. package/dist/shared/constants.js +2 -1
  121. package/dist/shared/constants.js.map +1 -1
  122. package/dist/shared/defaults.d.ts.map +1 -1
  123. package/dist/shared/defaults.js +1 -5
  124. package/dist/shared/defaults.js.map +1 -1
  125. package/dist/shared/instance.d.ts +4 -9
  126. package/dist/shared/instance.d.ts.map +1 -1
  127. package/dist/shared/instance.js +0 -2
  128. package/dist/shared/instance.js.map +1 -1
  129. package/frontend-dist/assets/index-CM2xfmS8.js +152 -0
  130. package/frontend-dist/index.html +1 -1
  131. package/package.json +2 -2
  132. package/frontend-dist/assets/index-Cfhr3h3e.js +0 -152
@@ -2,89 +2,46 @@
2
2
  * claude-remote attach 命令实现
3
3
  *
4
4
  * 用法:
5
- * claude-remote attach <port|name>
5
+ * claude-remote attach <name|id>
6
6
  *
7
- * 连接到指定的实例,接管其终端输入输出。
7
+ * 通过 daemon API 查找实例,然后 WS attach 到对应实例。
8
8
  */
9
- import { homedir } from 'node:os';
10
- import { resolve } from 'node:path';
11
- import { CLAUDE_REMOTE_DIR, REGISTRY_FILENAME } from '../../shared/index.js';
12
- import { existsSync, readFileSync } from 'node:fs';
9
+ import { DEFAULT_PORT } from '../../shared/index.js';
13
10
  import { VirtualPtyManager } from './pty/virtual-pty.js';
14
11
  import { TerminalRelay } from './terminal/terminal-relay.js';
15
- import { getOrCreateSharedToken } from './registry/shared-token.js';
16
- /**
17
- * 从注册表获取实例列表。
18
- */
19
- function loadInstances(baseDir) {
20
- const registryPath = resolve(baseDir, REGISTRY_FILENAME);
21
- if (!existsSync(registryPath)) {
22
- return [];
23
- }
24
- try {
25
- const content = readFileSync(registryPath, 'utf-8');
26
- const data = JSON.parse(content);
27
- return data.instances ?? [];
28
- }
29
- catch {
30
- return [];
31
- }
32
- }
33
- /**
34
- * 查找目标实例。
35
- */
36
- function findInstance(target, instances) {
37
- // 先按端口查找
38
- const port = parseInt(target, 10);
39
- if (!isNaN(port)) {
40
- const byPort = instances.find(inst => inst.port === port);
41
- if (byPort)
42
- return byPort;
43
- }
44
- // 再按名称查找
45
- const byName = instances.find(inst => inst.name === target);
46
- return byName ?? null;
47
- }
48
- /**
49
- * 检查进程是否存活
50
- */
51
- function isProcessAlive(pid) {
52
- try {
53
- process.kill(pid, 0);
54
- return true;
55
- }
56
- catch {
57
- return false;
58
- }
59
- }
12
+ import { listInstances, getSharedToken } from './daemon/daemon-client.js';
60
13
  /**
61
14
  * 执行 attach 命令。
62
15
  */
63
16
  export async function attachInstance(options) {
64
17
  const { target } = options;
65
- // 获取配置目录
66
- const sharedConfigDir = resolve(homedir(), CLAUDE_REMOTE_DIR);
67
- // 加载实例列表
68
- const instances = loadInstances(sharedConfigDir);
69
- // 过滤存活实例
70
- const aliveInstances = instances.filter(inst => isProcessAlive(inst.pid));
71
- if (aliveInstances.length === 0) {
18
+ // 获取运行中的实例列表
19
+ let instances;
20
+ try {
21
+ instances = await listInstances();
22
+ }
23
+ catch (err) {
24
+ console.error('Failed to connect to daemon. Is it running?');
25
+ console.error(' Start it with: claude-remote');
26
+ process.exit(1);
27
+ }
28
+ if (instances.length === 0) {
72
29
  console.error('No running instances found');
73
30
  process.exit(1);
74
31
  }
75
- // 查找目标实例
76
- const instance = findInstance(target, aliveInstances);
32
+ // 查找目标实例:按名称或 ID 匹配
33
+ const instance = instances.find(inst => inst.name === target || inst.instanceId === target || inst.instanceId.startsWith(target));
77
34
  if (!instance) {
78
35
  console.error(`Instance not found: ${target}`);
79
36
  console.error('Available instances:');
80
- for (const inst of aliveInstances) {
81
- console.error(` - ${inst.name} (port ${inst.port})`);
37
+ for (const inst of instances) {
38
+ console.error(` - ${inst.name} (${inst.instanceId.substring(0, 8)})`);
82
39
  }
83
40
  process.exit(1);
84
41
  }
85
- console.log(`Connecting to instance: ${instance.name} (port ${instance.port})...`);
86
- // 获取共享 Token
87
- const { token } = getOrCreateSharedToken(sharedConfigDir);
42
+ console.log(`Connecting to instance: ${instance.name}...`);
43
+ // 获取共享 Token 用于 WS 认证
44
+ const token = getSharedToken();
88
45
  // 创建 VirtualPtyManager
89
46
  const virtualPty = new VirtualPtyManager();
90
47
  // 创建 TerminalRelay
@@ -102,8 +59,7 @@ export async function attachInstance(options) {
102
59
  virtualPty.on('data', (data) => {
103
60
  process.stdout.write(data);
104
61
  });
105
- // 处理服务端 resize 通知 → 发送本地终端尺寸
106
- // 当 WebApp 断开时,服务端广播 terminal_resize,让 attach 用真实尺寸响应
62
+ // 处理服务端 resize 通知
107
63
  virtualPty.on('server_resize', () => {
108
64
  const cols = process.stdout.columns ?? 80;
109
65
  const rows = process.stdout.rows ?? 24;
@@ -120,10 +76,8 @@ export async function attachInstance(options) {
120
76
  cleanup();
121
77
  process.exit(1);
122
78
  });
123
- // 连接到实例 - 使用 instance.host(回退为 localhost)
124
- // 注意:instance.host '0.0.0.0' 时表示监听所有接口,客户端应使用 localhost 连接
125
- const host = instance.host && instance.host !== '0.0.0.0' ? instance.host : 'localhost';
126
- const wsUrl = `ws://${host}:${instance.port}/ws`;
79
+ // 连接到 daemon WS,指定 instanceId
80
+ const wsUrl = `ws://localhost:${DEFAULT_PORT}/ws/${instance.instanceId}`;
127
81
  try {
128
82
  await virtualPty.connect(wsUrl, token);
129
83
  }
@@ -1 +1 @@
1
- {"version":3,"file":"attach.js","sourceRoot":"","sources":["../../../backend/src/attach.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"attach.js","sourceRoot":"","sources":["../../../backend/src/attach.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,6 @@
4
4
  * Extracted from cli.ts to avoid static imports in the entry point.
5
5
  */
6
6
  export interface CliOptions {
7
- port?: number;
8
7
  host?: string;
9
8
  token?: string;
10
9
  name?: string;
@@ -14,9 +13,33 @@ export interface CliOptions {
14
13
  claudeArgs: string[];
15
14
  /** attach subcommand */
16
15
  attach?: string;
16
+ /** list subcommand */
17
+ list?: boolean;
18
+ /** status subcommand */
19
+ status?: boolean;
17
20
  /** update subcommand */
18
21
  update?: boolean;
22
+ /** stop subcommand */
23
+ stop?: boolean;
19
24
  }
20
25
  export declare function parseCliArgs(argv: string[]): CliOptions;
21
26
  export declare function showHelp(): void;
27
+ /**
28
+ * Port-in-use error thrown by startServer when EADDRINUSE.
29
+ * Caught by CLI to fall back to client mode.
30
+ */
31
+ export declare class PortInUseError extends Error {
32
+ port: number;
33
+ constructor(port: number);
34
+ }
35
+ /**
36
+ * Start daemon or gracefully fall back to client mode.
37
+ *
38
+ * Flow:
39
+ * 1. Check if daemon is already running → attach as client
40
+ * 2. Try to start daemon server
41
+ * 3. If EADDRINUSE → retry daemon check (race condition: daemon may have been starting)
42
+ * → attach if found, throw if truly occupied by another process
43
+ */
44
+ export declare function startOrFallback(isDaemonRunning: () => Promise<boolean>, startServer: () => Promise<void>, attachToNewInstance: () => Promise<void>): Promise<'started' | 'attached'>;
22
45
  //# sourceMappingURL=cli-utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli-utils.d.ts","sourceRoot":"","sources":["../../../backend/src/cli-utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,wBAAwB;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wBAAwB;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAaD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CA0EvD;AAED,wBAAgB,QAAQ,IAAI,IAAI,CA8D/B"}
1
+ {"version":3,"file":"cli-utils.d.ts","sourceRoot":"","sources":["../../../backend/src/cli-utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,wBAAwB;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sBAAsB;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,wBAAwB;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,wBAAwB;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,sBAAsB;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAgFvD;AAED,wBAAgB,QAAQ,IAAI,IAAI,CA+D/B;AAED;;;GAGG;AACH,qBAAa,cAAe,SAAQ,KAAK;IACvC,IAAI,EAAE,MAAM,CAAC;gBACD,IAAI,EAAE,MAAM;CAKzB;AAED;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CACnC,eAAe,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,EACvC,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EAChC,mBAAmB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GACvC,OAAO,CAAC,SAAS,GAAG,UAAU,CAAC,CAmBjC"}
@@ -3,16 +3,6 @@
3
3
  *
4
4
  * Extracted from cli.ts to avoid static imports in the entry point.
5
5
  */
6
- function parsePort(raw) {
7
- if (!raw || !/^\d+$/.test(raw)) {
8
- throw new Error('--port requires a numeric value');
9
- }
10
- const port = Number(raw);
11
- if (!Number.isInteger(port) || port < 1 || port > 65535) {
12
- throw new Error('--port must be between 1 and 65535');
13
- }
14
- return port;
15
- }
16
6
  export function parseCliArgs(argv) {
17
7
  const options = {
18
8
  help: false,
@@ -26,15 +16,27 @@ export function parseCliArgs(argv) {
26
16
  const firstArg = argv[2];
27
17
  if (firstArg === 'attach') {
28
18
  if (argv.length <= 3) {
29
- throw new Error('attach requires a target instance (port or name)');
19
+ throw new Error('attach requires a target instance (name or id)');
30
20
  }
31
21
  options.attach = argv[3];
32
22
  return options;
33
23
  }
24
+ if (firstArg === 'list') {
25
+ options.list = true;
26
+ return options;
27
+ }
28
+ if (firstArg === 'status') {
29
+ options.status = true;
30
+ return options;
31
+ }
34
32
  if (firstArg === 'update') {
35
33
  options.update = true;
36
34
  return options;
37
35
  }
36
+ if (firstArg === 'stop') {
37
+ options.stop = true;
38
+ return options;
39
+ }
38
40
  }
39
41
  while (i < argv.length) {
40
42
  const arg = argv[i];
@@ -50,10 +52,6 @@ export function parseCliArgs(argv) {
50
52
  options.noTerminal = true;
51
53
  i++;
52
54
  }
53
- else if (arg === '--port') {
54
- options.port = parsePort(argv[++i]);
55
- i++;
56
- }
57
55
  else if (arg === '--host') {
58
56
  options.host = argv[++i];
59
57
  i++;
@@ -71,10 +69,6 @@ export function parseCliArgs(argv) {
71
69
  options.claudeArgs.push(...argv.slice(i + 1));
72
70
  break;
73
71
  }
74
- else if (arg.startsWith('--port=')) {
75
- options.port = parsePort(arg.split('=')[1]);
76
- i++;
77
- }
78
72
  else if (arg.startsWith('--host=')) {
79
73
  options.host = arg.split('=')[1];
80
74
  i++;
@@ -101,15 +95,20 @@ Claude Code Remote - Control Claude Code from your mobile browser over LAN
101
95
 
102
96
  Usage:
103
97
  claude-remote [options] [--] [claude args...]
104
- claude-remote attach <port|name>
98
+ claude-remote attach <name|id>
99
+ claude-remote list
100
+ claude-remote status
101
+ claude-remote stop
105
102
  claude-remote update
106
103
 
107
104
  Subcommands:
108
- attach <port|name> Attach to a running instance (by port or name)
105
+ attach <name|id> Attach to a running instance (by name or id)
106
+ list List all running instances
107
+ status Show daemon status (PID, port, uptime, instance count)
108
+ stop Stop the running daemon and all instances
109
109
  update Update to the latest version (auto-detects npm/pnpm)
110
110
 
111
111
  Options:
112
- --port <number> Server port (default: 3000, auto-increments if busy)
113
112
  --host <ip> Bind address (default: auto-detect LAN IP)
114
113
  --token <string> Auth token (default: shared token)
115
114
  --name <string> Instance name (default: working directory name)
@@ -117,45 +116,82 @@ Options:
117
116
  --version Show version number
118
117
  --help, -h Show this help message
119
118
 
120
- Config file:
121
- ~/.claude-remote/config.json
119
+ Config files:
120
+ Global: ~/.claude-remote/settings.json
121
+ Project: <cwd>/.claude-remote/settings.json
122
122
 
123
- Server options:
124
- port Server port (default: 3000)
123
+ Global settings:
125
124
  host Bind address (default: "0.0.0.0")
126
125
  token Auth token (default: auto-generated shared token)
127
126
  sessionTtlMs Session TTL in ms (default: 86400000 = 24h)
128
127
  authRateLimit Auth rate limit per min per IP (default: 20)
128
+ notifications Notification channels (dingtalk, wechat_work)
129
129
 
130
- Claude CLI options:
130
+ Claude CLI options (global + project):
131
131
  claudeCommand Claude CLI path (default: "claude")
132
- claudeArgs Extra Claude CLI arguments (array)
132
+ claudeArgs Extra Claude CLI arguments (array, merged & deduped)
133
133
  claudeCwd Claude working directory (default: current dir)
134
134
 
135
- Instance options:
135
+ Instance options (global + project):
136
136
  instanceName Instance name (default: working dir name)
137
137
  maxBufferLines Output buffer max lines (default: 10000)
138
138
  workspaces Allowed working directories for web-spawned instances (array)
139
139
 
140
- UI options:
140
+ UI options (global + project):
141
141
  shortcuts Quick-input buttons (array, see README for format)
142
142
  commands Custom command buttons (array, see README for format)
143
143
 
144
- Notification options:
145
- dingtalk DingTalk notification config (object)
146
- Example: { "webhookUrl": "https://oapi.dingtalk.com/..." }
147
-
148
144
  Examples:
149
- claude-remote # Start Claude Code
145
+ claude-remote # Start daemon + first instance
150
146
  claude-remote chat # Start in chat mode
151
- claude-remote --port 8080 # Use port 8080
152
147
  claude-remote --name api # Custom instance name
153
148
  claude-remote -- --dangerously-skip-permissions # Pass args to claude
154
- claude-remote attach 3001 # Attach to instance on port 3001
155
149
  claude-remote attach myproject # Attach to instance named myproject
150
+ claude-remote stop # Stop daemon and all instances
156
151
  claude-remote update # Update to latest version
157
152
 
158
153
  For more Claude Code options, run: claude --help
159
154
  `);
160
155
  }
156
+ /**
157
+ * Port-in-use error thrown by startServer when EADDRINUSE.
158
+ * Caught by CLI to fall back to client mode.
159
+ */
160
+ export class PortInUseError extends Error {
161
+ port;
162
+ constructor(port) {
163
+ super(`Port ${port} is already in use`);
164
+ this.name = 'PortInUseError';
165
+ this.port = port;
166
+ }
167
+ }
168
+ /**
169
+ * Start daemon or gracefully fall back to client mode.
170
+ *
171
+ * Flow:
172
+ * 1. Check if daemon is already running → attach as client
173
+ * 2. Try to start daemon server
174
+ * 3. If EADDRINUSE → retry daemon check (race condition: daemon may have been starting)
175
+ * → attach if found, throw if truly occupied by another process
176
+ */
177
+ export async function startOrFallback(isDaemonRunning, startServer, attachToNewInstance) {
178
+ if (await isDaemonRunning()) {
179
+ await attachToNewInstance();
180
+ return 'attached';
181
+ }
182
+ try {
183
+ await startServer();
184
+ return 'started';
185
+ }
186
+ catch (err) {
187
+ if (err instanceof PortInUseError) {
188
+ // Race condition: daemon may have been starting when we first checked
189
+ if (await isDaemonRunning()) {
190
+ await attachToNewInstance();
191
+ return 'attached';
192
+ }
193
+ }
194
+ throw err;
195
+ }
196
+ }
161
197
  //# sourceMappingURL=cli-utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli-utils.js","sourceRoot":"","sources":["../../../backend/src/cli-utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli-utils.js","sourceRoot":"","sources":["../../../backend/src/cli-utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAsBH,MAAM,UAAU,YAAY,CAAC,IAAc;IACzC,MAAM,OAAO,GAAe;QAC1B,IAAI,EAAE,KAAK;QACX,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,KAAK;QACjB,UAAU,EAAE,EAAE;KACf,CAAC;IAEF,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,8BAA8B;IAEzC,oBAAoB;IACpB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1B,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;YACpE,CAAC;YACD,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACzB,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;YACpB,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;YACtB,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;YACtB,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;YACpB,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEpB,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACrC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;YACpB,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YAC/B,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;YACvB,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,GAAG,KAAK,eAAe,EAAE,CAAC;YACnC,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;YAC1B,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5B,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACzB,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YAC7B,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1B,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5B,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACzB,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACxB,kDAAkD;YAClD,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC9C,MAAM;QACR,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACrC,OAAO,CAAC,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACjC,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACtC,OAAO,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAClC,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACrC,OAAO,CAAC,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACjC,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,CAAC;YACN,8BAA8B;YAC9B,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC7B,CAAC,EAAE,CAAC;QACN,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6Db,CAAC,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,cAAe,SAAQ,KAAK;IACvC,IAAI,CAAS;IACb,YAAY,IAAY;QACtB,KAAK,CAAC,QAAQ,IAAI,oBAAoB,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,eAAuC,EACvC,WAAgC,EAChC,mBAAwC;IAExC,IAAI,MAAM,eAAe,EAAE,EAAE,CAAC;QAC5B,MAAM,mBAAmB,EAAE,CAAC;QAC5B,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,WAAW,EAAE,CAAC;QACpB,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,cAAc,EAAE,CAAC;YAClC,sEAAsE;YACtE,IAAI,MAAM,eAAe,EAAE,EAAE,CAAC;gBAC5B,MAAM,mBAAmB,EAAE,CAAC;gBAC5B,OAAO,UAAU,CAAC;YACpB,CAAC;QACH,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -4,10 +4,10 @@
4
4
  *
5
5
  * Usage:
6
6
  * claude-remote [options] [--] [claude args...]
7
- * claude-remote attach <port|name>
7
+ * claude-remote attach <name|id>
8
+ * claude-remote stop
8
9
  *
9
10
  * Options:
10
- * --port <number> Server port (default: 3000, auto-increments if busy)
11
11
  * --host <ip> Bind address (default: auto-detect LAN IP)
12
12
  * --token <string> Auth token (default: shared token)
13
13
  * --name <string> Instance name (default: working directory name)
@@ -19,4 +19,24 @@
19
19
  * to execute at module top-level, which would cause CLI_MODE to be set
20
20
  * after the logger module has already loaded.
21
21
  */
22
+ /**
23
+ * When daemon is already running, create a new instance via API and WS-attach to it.
24
+ * This provides the same terminal experience as the first instance but runs as a client.
25
+ */
26
+ declare function attachToNewInstance(options: import('./cli-utils.js').CliOptions, context: {
27
+ config: import('./config.js').AppConfig;
28
+ daemonPid: number;
29
+ }): Promise<void>;
30
+ /**
31
+ * Handle 'list' subcommand - show all running instances
32
+ */
33
+ declare function handleListCommand(): Promise<void>;
34
+ /**
35
+ * Handle 'status' subcommand - show daemon status
36
+ */
37
+ declare function handleStatusCommand(): Promise<void>;
38
+ /**
39
+ * Format relative time for status command
40
+ */
41
+ declare function formatRelativeTime(isoString: string | null): string;
22
42
  //# sourceMappingURL=cli.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../backend/src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;GAmBG"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../backend/src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;GAmBG;AAsKH;;;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;CACnB,GACA,OAAO,CAAC,IAAI,CAAC,CAsGf;AAED;;GAEG;AACH,iBAAe,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAoEhD;AAED;;GAEG;AACH,iBAAe,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CA6DlD;AAED;;GAEG;AACH,iBAAS,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAW5D"}