@diggerhq/anyware 0.7.33 → 0.7.34
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/dist/api/wsClient.d.ts +34 -0
- package/dist/api/wsClient.d.ts.map +1 -1
- package/dist/api/wsClient.js +214 -0
- package/dist/api/wsClient.js.map +1 -1
- package/dist/main.d.ts +1 -1
- package/dist/main.js +14 -113
- package/dist/main.js.map +1 -1
- package/dist/server/display.d.ts +5 -0
- package/dist/server/display.d.ts.map +1 -0
- package/dist/server/display.js +21 -0
- package/dist/server/display.js.map +1 -0
- package/dist/server/index.d.ts +5 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +94 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/lockfile.d.ts +3 -0
- package/dist/server/lockfile.d.ts.map +1 -0
- package/dist/server/lockfile.js +32 -0
- package/dist/server/lockfile.js.map +1 -0
- package/dist/server/sessionManager.d.ts +20 -0
- package/dist/server/sessionManager.d.ts.map +1 -0
- package/dist/server/sessionManager.js +112 -0
- package/dist/server/sessionManager.js.map +1 -0
- package/package.json +5 -2
- package/dist/claude/claudeLocal.d.ts +0 -17
- package/dist/claude/claudeLocal.d.ts.map +0 -1
- package/dist/claude/claudeLocal.js +0 -171
- package/dist/claude/claudeLocal.js.map +0 -1
- package/dist/claude/claudeLocalLauncher.d.ts +0 -14
- package/dist/claude/claudeLocalLauncher.d.ts.map +0 -1
- package/dist/claude/claudeLocalLauncher.js +0 -167
- package/dist/claude/claudeLocalLauncher.js.map +0 -1
- package/dist/claude/claudeRemote.d.ts +0 -27
- package/dist/claude/claudeRemote.d.ts.map +0 -1
- package/dist/claude/claudeRemote.js +0 -250
- package/dist/claude/claudeRemote.js.map +0 -1
- package/dist/claude/claudeRemoteLauncher.d.ts +0 -15
- package/dist/claude/claudeRemoteLauncher.d.ts.map +0 -1
- package/dist/claude/claudeRemoteLauncher.js +0 -182
- package/dist/claude/claudeRemoteLauncher.js.map +0 -1
- package/dist/claude/loop.d.ts +0 -24
- package/dist/claude/loop.d.ts.map +0 -1
- package/dist/claude/loop.js +0 -52
- package/dist/claude/loop.js.map +0 -1
- package/dist/claude/sessionScanner.d.ts +0 -102
- package/dist/claude/sessionScanner.d.ts.map +0 -1
- package/dist/claude/sessionScanner.js +0 -241
- package/dist/claude/sessionScanner.js.map +0 -1
- package/dist/hooks/generateHookSettings.d.ts +0 -20
- package/dist/hooks/generateHookSettings.d.ts.map +0 -1
- package/dist/hooks/generateHookSettings.js +0 -126
- package/dist/hooks/generateHookSettings.js.map +0 -1
- package/dist/hooks/hookServer.d.ts +0 -45
- package/dist/hooks/hookServer.d.ts.map +0 -1
- package/dist/hooks/hookServer.js +0 -83
- package/dist/hooks/hookServer.js.map +0 -1
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { createServer } from 'http';
|
|
2
|
+
import { acquireLock, releaseLock } from './lockfile.js';
|
|
3
|
+
import { SessionManager } from './sessionManager.js';
|
|
4
|
+
import { displayServerInfo } from './display.js';
|
|
5
|
+
import { createServerWSClient } from '../api/wsClient.js';
|
|
6
|
+
import { loadConfig } from '../config/config.js';
|
|
7
|
+
export async function startServer(opts) {
|
|
8
|
+
// Enforce single server
|
|
9
|
+
acquireLock();
|
|
10
|
+
const port = opts.port || 7234;
|
|
11
|
+
const cwd = opts.cwd || process.cwd();
|
|
12
|
+
const config = loadConfig();
|
|
13
|
+
if (!config.userId || !config.accessToken) {
|
|
14
|
+
throw new Error('Not logged in. Please run "anyware login" first.');
|
|
15
|
+
}
|
|
16
|
+
console.log('Starting anyware server...');
|
|
17
|
+
console.log(`Default working directory: ${cwd}`);
|
|
18
|
+
// Connect to cloud via WebSocket
|
|
19
|
+
const wsClient = await createServerWSClient({
|
|
20
|
+
userId: config.userId,
|
|
21
|
+
deviceId: config.deviceId,
|
|
22
|
+
});
|
|
23
|
+
const sessionManager = new SessionManager(wsClient, cwd);
|
|
24
|
+
// Handle messages from cloud
|
|
25
|
+
wsClient.on('start_session', async (data) => {
|
|
26
|
+
const { sessionId, userId, cwd: sessionCwd } = data;
|
|
27
|
+
console.log(`[server] Starting session ${sessionId} in ${sessionCwd || cwd}`);
|
|
28
|
+
try {
|
|
29
|
+
await sessionManager.startSession({ sessionId, userId, cwd: sessionCwd });
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
console.error(`[server] Failed to start session ${sessionId}:`, error);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
wsClient.on('user_input', (data) => {
|
|
36
|
+
const { sessionId, message, images } = data;
|
|
37
|
+
try {
|
|
38
|
+
sessionManager.sendUserMessage(sessionId, message, images);
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
console.error(`[server] Failed to send user input to session ${sessionId}:`, error);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
wsClient.on('permission_response', (data) => {
|
|
45
|
+
const { sessionId, response } = data;
|
|
46
|
+
try {
|
|
47
|
+
sessionManager.sendPermissionResponse(sessionId, response);
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
console.error(`[server] Failed to send permission response to session ${sessionId}:`, error);
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
wsClient.on('stop_session', async (data) => {
|
|
54
|
+
const { sessionId } = data;
|
|
55
|
+
console.log(`[server] Stopping session ${sessionId}`);
|
|
56
|
+
try {
|
|
57
|
+
await sessionManager.stopSession(sessionId);
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
console.error(`[server] Failed to stop session ${sessionId}:`, error);
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
// Create HTTP server for health checks
|
|
64
|
+
const server = createServer((req, res) => {
|
|
65
|
+
if (req.url === '/health') {
|
|
66
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
67
|
+
res.end(JSON.stringify({
|
|
68
|
+
status: 'ok',
|
|
69
|
+
sessions: sessionManager.getStats(),
|
|
70
|
+
cwd,
|
|
71
|
+
}));
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
res.writeHead(404);
|
|
75
|
+
res.end('Not Found');
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
server.listen(port, '127.0.0.1', () => {
|
|
79
|
+
displayServerInfo({ port, sessionUrl: wsClient.getSessionUrl() });
|
|
80
|
+
});
|
|
81
|
+
// Cleanup on exit
|
|
82
|
+
const cleanup = () => {
|
|
83
|
+
console.log('\nShutting down server...');
|
|
84
|
+
releaseLock();
|
|
85
|
+
server.close();
|
|
86
|
+
wsClient.close();
|
|
87
|
+
process.exit(0);
|
|
88
|
+
};
|
|
89
|
+
process.on('SIGINT', cleanup);
|
|
90
|
+
process.on('SIGTERM', cleanup);
|
|
91
|
+
// Block forever (main event loop keeps running)
|
|
92
|
+
await new Promise(() => { });
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lockfile.d.ts","sourceRoot":"","sources":["../../src/server/lockfile.ts"],"names":[],"mappings":"AAMA,wBAAgB,WAAW,IAAI,IAAI,CAsBlC;AAED,wBAAgB,WAAW,IAAI,IAAI,CAIlC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { writeFileSync, readFileSync, unlinkSync } from 'fs';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { homedir } from 'os';
|
|
4
|
+
const LOCK_FILE = join(homedir(), '.anyware', 'server.lock');
|
|
5
|
+
export function acquireLock() {
|
|
6
|
+
try {
|
|
7
|
+
const existing = readFileSync(LOCK_FILE, 'utf-8');
|
|
8
|
+
const { pid } = JSON.parse(existing);
|
|
9
|
+
// Check if process still running
|
|
10
|
+
try {
|
|
11
|
+
process.kill(pid, 0);
|
|
12
|
+
// Process exists
|
|
13
|
+
throw new Error(`Anyware server already running (PID ${pid}).\n` +
|
|
14
|
+
`Please terminate the other server before launching a new one.`);
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
// Process dead, stale lockfile
|
|
18
|
+
unlinkSync(LOCK_FILE);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
// No lockfile, proceed
|
|
23
|
+
}
|
|
24
|
+
writeFileSync(LOCK_FILE, JSON.stringify({ pid: process.pid, port: 7234 }));
|
|
25
|
+
}
|
|
26
|
+
export function releaseLock() {
|
|
27
|
+
try {
|
|
28
|
+
unlinkSync(LOCK_FILE);
|
|
29
|
+
}
|
|
30
|
+
catch { }
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=lockfile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lockfile.js","sourceRoot":"","sources":["../../src/server/lockfile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAE7B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;AAE7D,MAAM,UAAU,WAAW;IACzB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAErC,iCAAiC;QACjC,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACrB,iBAAiB;YACjB,MAAM,IAAI,KAAK,CACb,uCAAuC,GAAG,MAAM;gBAChD,+DAA+D,CAChE,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,+BAA+B;YAC/B,UAAU,CAAC,SAAS,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,uBAAuB;IACzB,CAAC;IAED,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,IAAI,CAAC;QACH,UAAU,CAAC,SAAS,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ServerWSClient, ImageAttachment } from '../api/wsClient.js';
|
|
2
|
+
export declare class SessionManager {
|
|
3
|
+
private wsClient;
|
|
4
|
+
private sessions;
|
|
5
|
+
private defaultCwd;
|
|
6
|
+
constructor(wsClient: ServerWSClient, defaultCwd: string);
|
|
7
|
+
startSession(opts: {
|
|
8
|
+
sessionId: string;
|
|
9
|
+
userId: string;
|
|
10
|
+
cwd?: string;
|
|
11
|
+
}): Promise<void>;
|
|
12
|
+
private runSDKSession;
|
|
13
|
+
sendUserMessage(sessionId: string, message: string, images?: ImageAttachment[]): void;
|
|
14
|
+
sendPermissionResponse(sessionId: string, response: 'yes' | 'no'): void;
|
|
15
|
+
stopSession(sessionId: string): Promise<void>;
|
|
16
|
+
getStats(): {
|
|
17
|
+
active: number;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=sessionManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionManager.d.ts","sourceRoot":"","sources":["../../src/server/sessionManager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAe1E,qBAAa,cAAc;IAIb,OAAO,CAAC,QAAQ;IAH5B,OAAO,CAAC,QAAQ,CAAoC;IACpD,OAAO,CAAC,UAAU,CAAS;gBAEP,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM;IAI1D,YAAY,CAAC,IAAI,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YA2B9E,aAAa;IAmC3B,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,eAAe,EAAE,GAAG,IAAI;IAiCrF,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,GAAG,IAAI,GAAG,IAAI;IAQjE,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASnD,QAAQ,IAAI;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE;CAK/B"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { query } from '../claude/sdk/query.js';
|
|
2
|
+
import { Stream } from '../claude/sdk/stream.js';
|
|
3
|
+
export class SessionManager {
|
|
4
|
+
wsClient;
|
|
5
|
+
sessions = new Map();
|
|
6
|
+
defaultCwd;
|
|
7
|
+
constructor(wsClient, defaultCwd) {
|
|
8
|
+
this.wsClient = wsClient;
|
|
9
|
+
this.defaultCwd = defaultCwd;
|
|
10
|
+
}
|
|
11
|
+
async startSession(opts) {
|
|
12
|
+
if (this.sessions.has(opts.sessionId)) {
|
|
13
|
+
throw new Error('Session already exists');
|
|
14
|
+
}
|
|
15
|
+
// Use session-specific directory or fall back to server default
|
|
16
|
+
const sessionCwd = opts.cwd || this.defaultCwd;
|
|
17
|
+
const abortController = new AbortController();
|
|
18
|
+
const messageQueue = new Stream();
|
|
19
|
+
const session = {
|
|
20
|
+
sessionId: opts.sessionId,
|
|
21
|
+
abortController,
|
|
22
|
+
messageQueue,
|
|
23
|
+
status: 'active',
|
|
24
|
+
};
|
|
25
|
+
this.sessions.set(opts.sessionId, session);
|
|
26
|
+
// Start SDK session in background with session-specific directory
|
|
27
|
+
this.runSDKSession(session, sessionCwd).catch(async (error) => {
|
|
28
|
+
await this.wsClient.sendSessionError(opts.sessionId, error);
|
|
29
|
+
this.sessions.delete(opts.sessionId);
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
async runSDKSession(session, cwd) {
|
|
33
|
+
const queryInstance = query({
|
|
34
|
+
prompt: session.messageQueue,
|
|
35
|
+
options: {
|
|
36
|
+
cwd,
|
|
37
|
+
abort: session.abortController.signal,
|
|
38
|
+
permissionMode: 'default',
|
|
39
|
+
canCallTool: async (toolName, input) => {
|
|
40
|
+
// Send permission request to cloud/web
|
|
41
|
+
await this.wsClient.sendPermissionRequest(session.sessionId, toolName, input);
|
|
42
|
+
// Wait for web UI response
|
|
43
|
+
session.status = 'waiting_permission';
|
|
44
|
+
const response = await new Promise((resolve) => {
|
|
45
|
+
session.pendingPermission = { toolName, input, resolve };
|
|
46
|
+
});
|
|
47
|
+
session.status = 'active';
|
|
48
|
+
return response === 'yes'
|
|
49
|
+
? { behavior: 'allow', updatedInput: input }
|
|
50
|
+
: { behavior: 'deny', message: 'User denied permission' };
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
// Forward all SDK events to cloud
|
|
55
|
+
for await (const message of queryInstance) {
|
|
56
|
+
await this.wsClient.sendClaudeEvent(message, session.sessionId);
|
|
57
|
+
if (message.type === 'system' && 'session_id' in message) {
|
|
58
|
+
session.claudeSessionId = message.session_id;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
sendUserMessage(sessionId, message, images) {
|
|
63
|
+
const session = this.sessions.get(sessionId);
|
|
64
|
+
if (!session)
|
|
65
|
+
throw new Error('Session not found');
|
|
66
|
+
// Build content array with text and images
|
|
67
|
+
const content = [
|
|
68
|
+
{ type: 'text', text: message }
|
|
69
|
+
];
|
|
70
|
+
if (images && images.length > 0) {
|
|
71
|
+
for (const img of images) {
|
|
72
|
+
content.push({
|
|
73
|
+
type: 'image',
|
|
74
|
+
source: {
|
|
75
|
+
type: 'base64',
|
|
76
|
+
media_type: img.mimeType,
|
|
77
|
+
data: img.data,
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
const userMessage = {
|
|
83
|
+
type: 'user',
|
|
84
|
+
message: {
|
|
85
|
+
role: 'user',
|
|
86
|
+
content,
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
session.messageQueue.enqueue(userMessage);
|
|
90
|
+
}
|
|
91
|
+
sendPermissionResponse(sessionId, response) {
|
|
92
|
+
const session = this.sessions.get(sessionId);
|
|
93
|
+
if (!session?.pendingPermission)
|
|
94
|
+
throw new Error('No pending permission');
|
|
95
|
+
session.pendingPermission.resolve(response);
|
|
96
|
+
session.pendingPermission = undefined;
|
|
97
|
+
}
|
|
98
|
+
async stopSession(sessionId) {
|
|
99
|
+
const session = this.sessions.get(sessionId);
|
|
100
|
+
if (!session)
|
|
101
|
+
return;
|
|
102
|
+
session.status = 'stopping';
|
|
103
|
+
session.abortController.abort();
|
|
104
|
+
this.sessions.delete(sessionId);
|
|
105
|
+
}
|
|
106
|
+
getStats() {
|
|
107
|
+
return {
|
|
108
|
+
active: this.sessions.size,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=sessionManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionManager.js","sourceRoot":"","sources":["../../src/server/sessionManager.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@diggerhq/anyware",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.34",
|
|
4
4
|
"description": "Anyware CLI - Claude Code with remote control",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/main.js",
|
|
@@ -18,14 +18,17 @@
|
|
|
18
18
|
"typecheck": "tsc --noEmit"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
+
"chalk": "^5.6.2",
|
|
22
|
+
"chokidar": "^4.0.0",
|
|
21
23
|
"commander": "^12.1.0",
|
|
22
24
|
"open": "^10.1.0",
|
|
25
|
+
"qrcode-terminal": "^0.12.0",
|
|
23
26
|
"ws": "^8.18.0",
|
|
24
|
-
"chokidar": "^4.0.0",
|
|
25
27
|
"zod": "^3.23.0"
|
|
26
28
|
},
|
|
27
29
|
"devDependencies": {
|
|
28
30
|
"@types/node": "^22.0.0",
|
|
31
|
+
"@types/qrcode-terminal": "^0.12.2",
|
|
29
32
|
"@types/ws": "^8.5.0",
|
|
30
33
|
"tsx": "^4.19.0",
|
|
31
34
|
"typescript": "^5.6.0"
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
export interface ClaudeLocalOptions {
|
|
2
|
-
abort: AbortSignal;
|
|
3
|
-
sessionId: string | null;
|
|
4
|
-
path: string;
|
|
5
|
-
onSessionFound: (id: string) => void;
|
|
6
|
-
onThinkingChange?: (thinking: boolean) => void;
|
|
7
|
-
claudeArgs?: string[];
|
|
8
|
-
/** Path to temporary settings file with SessionStart hook (required for session tracking) */
|
|
9
|
-
hookSettingsPath: string;
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Spawn Claude Code in local (interactive) mode
|
|
13
|
-
* - Uses inherited stdio so user can interact directly
|
|
14
|
-
* - Uses fd3 pipe for thinking state tracking (optional)
|
|
15
|
-
*/
|
|
16
|
-
export declare function claudeLocal(opts: ClaudeLocalOptions): Promise<string | null>;
|
|
17
|
-
//# sourceMappingURL=claudeLocal.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"claudeLocal.d.ts","sourceRoot":"","sources":["../../src/claude/claudeLocal.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,6FAA6F;IAC7F,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AA4CD;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA+IlF"}
|
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
import { spawn } from 'node:child_process';
|
|
2
|
-
import { createInterface } from 'node:readline';
|
|
3
|
-
import { existsSync, mkdirSync } from 'node:fs';
|
|
4
|
-
import { join, resolve } from 'node:path';
|
|
5
|
-
import { homedir } from 'node:os';
|
|
6
|
-
/**
|
|
7
|
-
* Get the project path for Claude Code sessions
|
|
8
|
-
* Claude uses the resolved path with special chars replaced by dashes
|
|
9
|
-
*/
|
|
10
|
-
function getProjectPath(workingDirectory) {
|
|
11
|
-
const projectId = resolve(workingDirectory).replace(/[\\\/.:]/g, '-');
|
|
12
|
-
const claudeConfigDir = process.env.CLAUDE_CONFIG_DIR || join(homedir(), '.claude');
|
|
13
|
-
return join(claudeConfigDir, 'projects', projectId);
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Check if a Claude session exists
|
|
17
|
-
*/
|
|
18
|
-
function claudeCheckSession(sessionId, workingDirectory) {
|
|
19
|
-
const projectDir = getProjectPath(workingDirectory);
|
|
20
|
-
const sessionFile = join(projectDir, `${sessionId}.jsonl`);
|
|
21
|
-
return existsSync(sessionFile);
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Find the claude binary path
|
|
25
|
-
*/
|
|
26
|
-
function findClaudePath() {
|
|
27
|
-
// Try common locations
|
|
28
|
-
const paths = [
|
|
29
|
-
join(homedir(), '.claude', 'local', 'claude'), // Claude Code default install location
|
|
30
|
-
'/usr/local/bin/claude',
|
|
31
|
-
'/opt/homebrew/bin/claude',
|
|
32
|
-
join(homedir(), '.local', 'bin', 'claude'),
|
|
33
|
-
join(homedir(), '.npm-global', 'bin', 'claude'),
|
|
34
|
-
];
|
|
35
|
-
for (const p of paths) {
|
|
36
|
-
if (existsSync(p)) {
|
|
37
|
-
return p;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
// Fall back to PATH
|
|
41
|
-
return 'claude';
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Spawn Claude Code in local (interactive) mode
|
|
45
|
-
* - Uses inherited stdio so user can interact directly
|
|
46
|
-
* - Uses fd3 pipe for thinking state tracking (optional)
|
|
47
|
-
*/
|
|
48
|
-
export async function claudeLocal(opts) {
|
|
49
|
-
// Ensure project directory exists
|
|
50
|
-
const projectDir = getProjectPath(opts.path);
|
|
51
|
-
mkdirSync(projectDir, { recursive: true });
|
|
52
|
-
// Check if claudeArgs contains --continue or --resume
|
|
53
|
-
const hasContinueFlag = opts.claudeArgs?.includes('--continue');
|
|
54
|
-
const hasResumeFlag = opts.claudeArgs?.includes('--resume');
|
|
55
|
-
const hasUserSessionControl = hasContinueFlag || hasResumeFlag;
|
|
56
|
-
// Determine if we have an existing session to resume
|
|
57
|
-
let startFrom = opts.sessionId;
|
|
58
|
-
if (opts.sessionId && !claudeCheckSession(opts.sessionId, opts.path)) {
|
|
59
|
-
startFrom = null;
|
|
60
|
-
}
|
|
61
|
-
// Thinking state tracking
|
|
62
|
-
let thinking = false;
|
|
63
|
-
let stopThinkingTimeout = null;
|
|
64
|
-
const updateThinking = (newThinking) => {
|
|
65
|
-
if (thinking !== newThinking) {
|
|
66
|
-
thinking = newThinking;
|
|
67
|
-
if (opts.onThinkingChange) {
|
|
68
|
-
opts.onThinkingChange(thinking);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
};
|
|
72
|
-
const claudePath = findClaudePath();
|
|
73
|
-
try {
|
|
74
|
-
process.stdin.pause();
|
|
75
|
-
await new Promise((resolve, reject) => {
|
|
76
|
-
const args = [];
|
|
77
|
-
// Only add --resume if we have an existing session and user didn't pass their own flags
|
|
78
|
-
if (!hasUserSessionControl && startFrom) {
|
|
79
|
-
args.push('--resume', startFrom);
|
|
80
|
-
}
|
|
81
|
-
// Add custom Claude arguments
|
|
82
|
-
if (opts.claudeArgs) {
|
|
83
|
-
args.push(...opts.claudeArgs);
|
|
84
|
-
}
|
|
85
|
-
// Add hook settings for session tracking (always passed)
|
|
86
|
-
args.push('--settings', opts.hookSettingsPath);
|
|
87
|
-
const child = spawn(claudePath, args, {
|
|
88
|
-
stdio: ['inherit', 'inherit', 'inherit', 'pipe'],
|
|
89
|
-
signal: opts.abort,
|
|
90
|
-
cwd: opts.path,
|
|
91
|
-
env: process.env,
|
|
92
|
-
});
|
|
93
|
-
// Listen to fd3 for thinking state tracking (if available)
|
|
94
|
-
if (child.stdio[3]) {
|
|
95
|
-
const rl = createInterface({
|
|
96
|
-
input: child.stdio[3],
|
|
97
|
-
crlfDelay: Infinity,
|
|
98
|
-
});
|
|
99
|
-
const activeFetches = new Map();
|
|
100
|
-
rl.on('line', (line) => {
|
|
101
|
-
try {
|
|
102
|
-
const message = JSON.parse(line);
|
|
103
|
-
switch (message.type) {
|
|
104
|
-
case 'fetch-start':
|
|
105
|
-
activeFetches.set(message.id, {
|
|
106
|
-
hostname: message.hostname,
|
|
107
|
-
path: message.path,
|
|
108
|
-
startTime: message.timestamp,
|
|
109
|
-
});
|
|
110
|
-
if (stopThinkingTimeout) {
|
|
111
|
-
clearTimeout(stopThinkingTimeout);
|
|
112
|
-
stopThinkingTimeout = null;
|
|
113
|
-
}
|
|
114
|
-
updateThinking(true);
|
|
115
|
-
break;
|
|
116
|
-
case 'fetch-end':
|
|
117
|
-
activeFetches.delete(message.id);
|
|
118
|
-
if (activeFetches.size === 0 && thinking && !stopThinkingTimeout) {
|
|
119
|
-
stopThinkingTimeout = setTimeout(() => {
|
|
120
|
-
if (activeFetches.size === 0) {
|
|
121
|
-
updateThinking(false);
|
|
122
|
-
}
|
|
123
|
-
stopThinkingTimeout = null;
|
|
124
|
-
}, 500);
|
|
125
|
-
}
|
|
126
|
-
break;
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
catch {
|
|
130
|
-
// Ignore non-JSON lines
|
|
131
|
-
}
|
|
132
|
-
});
|
|
133
|
-
rl.on('error', (err) => {
|
|
134
|
-
console.error('[local] Error reading fd3:', err);
|
|
135
|
-
});
|
|
136
|
-
child.on('exit', () => {
|
|
137
|
-
if (stopThinkingTimeout) {
|
|
138
|
-
clearTimeout(stopThinkingTimeout);
|
|
139
|
-
}
|
|
140
|
-
updateThinking(false);
|
|
141
|
-
});
|
|
142
|
-
}
|
|
143
|
-
child.on('error', (error) => {
|
|
144
|
-
// Ignore abort errors - they're expected when switching modes
|
|
145
|
-
if (error.code !== 'ABORT_ERR' && error.name !== 'AbortError') {
|
|
146
|
-
console.error('[local] Spawn error:', error);
|
|
147
|
-
}
|
|
148
|
-
});
|
|
149
|
-
child.on('exit', (code, signal) => {
|
|
150
|
-
if (signal === 'SIGTERM' && opts.abort.aborted) {
|
|
151
|
-
resolve();
|
|
152
|
-
}
|
|
153
|
-
else if (signal) {
|
|
154
|
-
reject(new Error(`Process terminated with signal: ${signal}`));
|
|
155
|
-
}
|
|
156
|
-
else {
|
|
157
|
-
resolve();
|
|
158
|
-
}
|
|
159
|
-
});
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
finally {
|
|
163
|
-
process.stdin.resume();
|
|
164
|
-
if (stopThinkingTimeout) {
|
|
165
|
-
clearTimeout(stopThinkingTimeout);
|
|
166
|
-
}
|
|
167
|
-
updateThinking(false);
|
|
168
|
-
}
|
|
169
|
-
return startFrom;
|
|
170
|
-
}
|
|
171
|
-
//# sourceMappingURL=claudeLocal.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"claudeLocal.js","sourceRoot":"","sources":["../../src/claude/claudeLocal.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { Session } from './session.js';
|
|
2
|
-
export type LocalExitReason = 'switch' | 'exit';
|
|
3
|
-
export interface LocalLauncherOptions {
|
|
4
|
-
session: Session;
|
|
5
|
-
onThinkingChange?: (thinking: boolean) => void;
|
|
6
|
-
/** Called when Claude finishes responding (idle state) */
|
|
7
|
-
onIdle?: () => void;
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* Launch Claude in local mode with session scanning
|
|
11
|
-
* Returns 'switch' if we should switch to remote mode, 'exit' if we should exit
|
|
12
|
-
*/
|
|
13
|
-
export declare function claudeLocalLauncher(opts: LocalLauncherOptions): Promise<LocalExitReason>;
|
|
14
|
-
//# sourceMappingURL=claudeLocalLauncher.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"claudeLocalLauncher.d.ts","sourceRoot":"","sources":["../../src/claude/claudeLocalLauncher.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAI5C,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEhD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,eAAe,CAAC,CAgL9F"}
|