@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.
- package/README.md +514 -11
- package/dist/backend/src/api/config-routes.d.ts +2 -2
- package/dist/backend/src/api/config-routes.d.ts.map +1 -1
- package/dist/backend/src/api/config-routes.js +21 -6
- package/dist/backend/src/api/config-routes.js.map +1 -1
- package/dist/backend/src/api/health-routes.d.ts +4 -1
- package/dist/backend/src/api/health-routes.d.ts.map +1 -1
- package/dist/backend/src/api/health-routes.js +20 -2
- package/dist/backend/src/api/health-routes.js.map +1 -1
- package/dist/backend/src/api/hook-routes.d.ts +2 -2
- package/dist/backend/src/api/hook-routes.d.ts.map +1 -1
- package/dist/backend/src/api/hook-routes.js +10 -3
- package/dist/backend/src/api/hook-routes.js.map +1 -1
- package/dist/backend/src/api/instance-routes.d.ts +5 -3
- package/dist/backend/src/api/instance-routes.d.ts.map +1 -1
- package/dist/backend/src/api/instance-routes.js +48 -45
- package/dist/backend/src/api/instance-routes.js.map +1 -1
- package/dist/backend/src/api/router.d.ts +4 -12
- package/dist/backend/src/api/router.d.ts.map +1 -1
- package/dist/backend/src/api/router.js +28 -20
- package/dist/backend/src/api/router.js.map +1 -1
- package/dist/backend/src/api/status-routes.d.ts +2 -2
- package/dist/backend/src/api/status-routes.d.ts.map +1 -1
- package/dist/backend/src/api/status-routes.js +11 -6
- package/dist/backend/src/api/status-routes.js.map +1 -1
- package/dist/backend/src/attach.d.ts +1 -1
- package/dist/backend/src/attach.d.ts.map +1 -1
- package/dist/backend/src/attach.js +25 -71
- package/dist/backend/src/attach.js.map +1 -1
- package/dist/backend/src/cli-utils.d.ts +24 -1
- package/dist/backend/src/cli-utils.d.ts.map +1 -1
- package/dist/backend/src/cli-utils.js +73 -37
- package/dist/backend/src/cli-utils.js.map +1 -1
- package/dist/backend/src/cli.d.ts +22 -2
- package/dist/backend/src/cli.d.ts.map +1 -1
- package/dist/backend/src/cli.js +328 -23
- package/dist/backend/src/cli.js.map +1 -1
- package/dist/backend/src/config.d.ts +48 -15
- package/dist/backend/src/config.d.ts.map +1 -1
- package/dist/backend/src/config.js +126 -27
- package/dist/backend/src/config.js.map +1 -1
- package/dist/backend/src/daemon/daemon-client.d.ts +69 -0
- package/dist/backend/src/daemon/daemon-client.d.ts.map +1 -0
- package/dist/backend/src/daemon/daemon-client.js +209 -0
- package/dist/backend/src/daemon/daemon-client.js.map +1 -0
- package/dist/backend/src/daemon/daemon-entry.d.ts +8 -0
- package/dist/backend/src/daemon/daemon-entry.d.ts.map +1 -0
- package/dist/backend/src/daemon/daemon-entry.js +37 -0
- package/dist/backend/src/daemon/daemon-entry.js.map +1 -0
- package/dist/backend/src/daemon/daemon-launcher.d.ts +13 -0
- package/dist/backend/src/daemon/daemon-launcher.d.ts.map +1 -0
- package/dist/backend/src/daemon/daemon-launcher.js +62 -0
- package/dist/backend/src/daemon/daemon-launcher.js.map +1 -0
- package/dist/backend/src/index.d.ts.map +1 -1
- package/dist/backend/src/index.js +115 -251
- package/dist/backend/src/index.js.map +1 -1
- package/dist/backend/src/instance/index.d.ts +4 -0
- package/dist/backend/src/instance/index.d.ts.map +1 -0
- package/dist/backend/src/instance/index.js +3 -0
- package/dist/backend/src/instance/index.js.map +1 -0
- package/dist/backend/src/instance/instance-manager.d.ts +62 -0
- package/dist/backend/src/instance/instance-manager.d.ts.map +1 -0
- package/dist/backend/src/instance/instance-manager.js +194 -0
- package/dist/backend/src/instance/instance-manager.js.map +1 -0
- package/dist/backend/src/instance/instance-session.d.ts +87 -0
- package/dist/backend/src/instance/instance-session.d.ts.map +1 -0
- package/dist/backend/src/instance/instance-session.js +359 -0
- package/dist/backend/src/instance/instance-session.js.map +1 -0
- package/dist/backend/src/instance/types.d.ts +39 -0
- package/dist/backend/src/instance/types.d.ts.map +1 -0
- package/dist/backend/src/instance/types.js +2 -0
- package/dist/backend/src/instance/types.js.map +1 -0
- package/dist/backend/src/notification/notification-manager.js +1 -1
- package/dist/backend/src/notification/notification-manager.js.map +1 -1
- package/dist/backend/src/notification/notification-service-factory.js +1 -1
- package/dist/backend/src/notification/notification-service-factory.js.map +1 -1
- package/dist/backend/src/pty/virtual-pty.d.ts.map +1 -1
- package/dist/backend/src/pty/virtual-pty.js +6 -0
- package/dist/backend/src/pty/virtual-pty.js.map +1 -1
- package/dist/backend/src/registry/shared-token.d.ts +2 -2
- package/dist/backend/src/registry/shared-token.js +11 -11
- package/dist/backend/src/registry/shared-token.js.map +1 -1
- package/dist/backend/src/registry/stop-instances.d.ts +0 -25
- package/dist/backend/src/registry/stop-instances.d.ts.map +1 -1
- package/dist/backend/src/registry/stop-instances.js +6 -206
- package/dist/backend/src/registry/stop-instances.js.map +1 -1
- package/dist/backend/src/skills/index.d.ts +4 -0
- package/dist/backend/src/skills/index.d.ts.map +1 -0
- package/dist/backend/src/skills/index.js +4 -0
- package/dist/backend/src/skills/index.js.map +1 -0
- package/dist/backend/src/skills/skill-command-merger.d.ts +32 -0
- package/dist/backend/src/skills/skill-command-merger.d.ts.map +1 -0
- package/dist/backend/src/skills/skill-command-merger.js +78 -0
- package/dist/backend/src/skills/skill-command-merger.js.map +1 -0
- package/dist/backend/src/skills/skill-commands.d.ts +25 -0
- package/dist/backend/src/skills/skill-commands.d.ts.map +1 -0
- package/dist/backend/src/skills/skill-commands.js +56 -0
- package/dist/backend/src/skills/skill-commands.js.map +1 -0
- package/dist/backend/src/skills/skill-scanner.d.ts +36 -0
- package/dist/backend/src/skills/skill-scanner.d.ts.map +1 -0
- package/dist/backend/src/skills/skill-scanner.js +143 -0
- package/dist/backend/src/skills/skill-scanner.js.map +1 -0
- package/dist/backend/src/terminal/terminal-relay.d.ts +1 -0
- package/dist/backend/src/terminal/terminal-relay.d.ts.map +1 -1
- package/dist/backend/src/terminal/terminal-relay.js +6 -0
- package/dist/backend/src/terminal/terminal-relay.js.map +1 -1
- package/dist/backend/src/update.d.ts.map +1 -1
- package/dist/backend/src/update.js +46 -1
- package/dist/backend/src/update.js.map +1 -1
- package/dist/backend/src/utils/banner.d.ts +15 -0
- package/dist/backend/src/utils/banner.d.ts.map +1 -0
- package/dist/backend/src/utils/banner.js +95 -0
- package/dist/backend/src/utils/banner.js.map +1 -0
- package/dist/backend/src/ws/ws-server.d.ts +13 -54
- package/dist/backend/src/ws/ws-server.d.ts.map +1 -1
- package/dist/backend/src/ws/ws-server.js +57 -155
- package/dist/backend/src/ws/ws-server.js.map +1 -1
- package/dist/shared/constants.d.ts +2 -1
- package/dist/shared/constants.d.ts.map +1 -1
- package/dist/shared/constants.js +2 -1
- package/dist/shared/constants.js.map +1 -1
- package/dist/shared/defaults.d.ts.map +1 -1
- package/dist/shared/defaults.js +1 -5
- package/dist/shared/defaults.js.map +1 -1
- package/dist/shared/instance.d.ts +4 -9
- package/dist/shared/instance.d.ts.map +1 -1
- package/dist/shared/instance.js +0 -2
- package/dist/shared/instance.js.map +1 -1
- package/frontend-dist/assets/index-CM2xfmS8.js +152 -0
- package/frontend-dist/index.html +1 -1
- package/package.json +2 -2
- 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 <
|
|
5
|
+
* claude-remote attach <name|id>
|
|
6
6
|
*
|
|
7
|
-
*
|
|
7
|
+
* 通过 daemon API 查找实例,然后 WS attach 到对应实例。
|
|
8
8
|
*/
|
|
9
|
-
import {
|
|
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 {
|
|
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
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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 =
|
|
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
|
|
81
|
-
console.error(` - ${inst.name} (
|
|
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}
|
|
86
|
-
// 获取共享 Token
|
|
87
|
-
const
|
|
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
|
-
//
|
|
124
|
-
|
|
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":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"attach.js","sourceRoot":"","sources":["../../../backend/src/attach.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAQ1E;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAsB;IACzD,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAE3B,aAAa;IACb,IAAI,SAAmE,CAAC;IACxE,IAAI,CAAC;QACH,SAAS,GAAG,MAAM,aAAa,EAAE,CAAC;IACpC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;QAC7D,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,oBAAoB;IACpB,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAC7B,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,UAAU,KAAK,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,CACjG,CAAC;IAEF,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,uBAAuB,MAAM,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACtC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,OAAO,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;QACzE,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,2BAA2B,QAAQ,CAAC,IAAI,KAAK,CAAC,CAAC;IAE3D,sBAAsB;IACtB,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;IAE/B,uBAAuB;IACvB,MAAM,UAAU,GAAG,IAAI,iBAAiB,EAAE,CAAC;IAE3C,mBAAmB;IACnB,MAAM,KAAK,GAAG,IAAI,aAAa,CAAC,UAAU,CAAC,CAAC;IAE5C,SAAS;IACT,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,IAAI,QAAQ;YAAE,OAAO;QACrB,QAAQ,GAAG,IAAI,CAAC;QAChB,UAAU,CAAC,OAAO,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,EAAE,CAAC;IACf,CAAC,CAAC;IAEF,qBAAqB;IACrB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;QACrC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,kBAAkB;IAClB,UAAU,CAAC,EAAE,CAAC,eAAe,EAAE,GAAG,EAAE;QAClC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACvC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,SAAS;IACT,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,SAAiB,EAAE,EAAE;QAC1C,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACnC,OAAO,EAAE,CAAC;QACV,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE;QACpC,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QAChD,OAAO,EAAE,CAAC;QACV,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,gCAAgC;IAChC,MAAM,KAAK,GAAG,kBAAkB,YAAY,OAAO,QAAQ,CAAC,UAAU,EAAE,CAAC;IAEzE,IAAI,CAAC;QACH,MAAM,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC9E,OAAO,EAAE,CAAC;QACV,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,SAAS;IACT,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;IACvC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAE9B,mBAAmB;IACnB,KAAK,CAAC,KAAK,EAAE,CAAC;IAEd,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IAEtD,SAAS;IACT,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAClC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACxB,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;YAClC,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;YACzB,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -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,
|
|
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 (
|
|
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 <
|
|
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 <
|
|
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
|
|
121
|
-
~/.claude-remote/
|
|
119
|
+
Config files:
|
|
120
|
+
Global: ~/.claude-remote/settings.json
|
|
121
|
+
Project: <cwd>/.claude-remote/settings.json
|
|
122
122
|
|
|
123
|
-
|
|
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
|
|
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":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"cli-utils.js","sourceRoot":"","sources":["../../../backend/src/cli-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Usage:
|
|
6
6
|
* claude-remote [options] [--] [claude args...]
|
|
7
|
-
* claude-remote attach <
|
|
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"}
|