@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.
Files changed (56) hide show
  1. package/dist/api/wsClient.d.ts +34 -0
  2. package/dist/api/wsClient.d.ts.map +1 -1
  3. package/dist/api/wsClient.js +214 -0
  4. package/dist/api/wsClient.js.map +1 -1
  5. package/dist/main.d.ts +1 -1
  6. package/dist/main.js +14 -113
  7. package/dist/main.js.map +1 -1
  8. package/dist/server/display.d.ts +5 -0
  9. package/dist/server/display.d.ts.map +1 -0
  10. package/dist/server/display.js +21 -0
  11. package/dist/server/display.js.map +1 -0
  12. package/dist/server/index.d.ts +5 -0
  13. package/dist/server/index.d.ts.map +1 -0
  14. package/dist/server/index.js +94 -0
  15. package/dist/server/index.js.map +1 -0
  16. package/dist/server/lockfile.d.ts +3 -0
  17. package/dist/server/lockfile.d.ts.map +1 -0
  18. package/dist/server/lockfile.js +32 -0
  19. package/dist/server/lockfile.js.map +1 -0
  20. package/dist/server/sessionManager.d.ts +20 -0
  21. package/dist/server/sessionManager.d.ts.map +1 -0
  22. package/dist/server/sessionManager.js +112 -0
  23. package/dist/server/sessionManager.js.map +1 -0
  24. package/package.json +5 -2
  25. package/dist/claude/claudeLocal.d.ts +0 -17
  26. package/dist/claude/claudeLocal.d.ts.map +0 -1
  27. package/dist/claude/claudeLocal.js +0 -171
  28. package/dist/claude/claudeLocal.js.map +0 -1
  29. package/dist/claude/claudeLocalLauncher.d.ts +0 -14
  30. package/dist/claude/claudeLocalLauncher.d.ts.map +0 -1
  31. package/dist/claude/claudeLocalLauncher.js +0 -167
  32. package/dist/claude/claudeLocalLauncher.js.map +0 -1
  33. package/dist/claude/claudeRemote.d.ts +0 -27
  34. package/dist/claude/claudeRemote.d.ts.map +0 -1
  35. package/dist/claude/claudeRemote.js +0 -250
  36. package/dist/claude/claudeRemote.js.map +0 -1
  37. package/dist/claude/claudeRemoteLauncher.d.ts +0 -15
  38. package/dist/claude/claudeRemoteLauncher.d.ts.map +0 -1
  39. package/dist/claude/claudeRemoteLauncher.js +0 -182
  40. package/dist/claude/claudeRemoteLauncher.js.map +0 -1
  41. package/dist/claude/loop.d.ts +0 -24
  42. package/dist/claude/loop.d.ts.map +0 -1
  43. package/dist/claude/loop.js +0 -52
  44. package/dist/claude/loop.js.map +0 -1
  45. package/dist/claude/sessionScanner.d.ts +0 -102
  46. package/dist/claude/sessionScanner.d.ts.map +0 -1
  47. package/dist/claude/sessionScanner.js +0 -241
  48. package/dist/claude/sessionScanner.js.map +0 -1
  49. package/dist/hooks/generateHookSettings.d.ts +0 -20
  50. package/dist/hooks/generateHookSettings.d.ts.map +0 -1
  51. package/dist/hooks/generateHookSettings.js +0 -126
  52. package/dist/hooks/generateHookSettings.js.map +0 -1
  53. package/dist/hooks/hookServer.d.ts +0 -45
  54. package/dist/hooks/hookServer.d.ts.map +0 -1
  55. package/dist/hooks/hookServer.js +0 -83
  56. 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":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAqC;IACrE,wBAAwB;IACxB,WAAW,EAAE,CAAC;IAEd,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;IAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,8BAA8B,GAAG,EAAE,CAAC,CAAC;IAEjD,iCAAiC;IACjC,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC;QAC1C,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAEzD,6BAA6B;IAC7B,QAAQ,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,EAAE,IAAa,EAAE,EAAE;QACnD,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,IAA2D,CAAC;QAC3G,OAAO,CAAC,GAAG,CAAC,6BAA6B,SAAS,OAAO,UAAU,IAAI,GAAG,EAAE,CAAC,CAAC;QAC9E,IAAI,CAAC;YACH,MAAM,cAAc,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC;QAC5E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,oCAAoC,SAAS,GAAG,EAAE,KAAK,CAAC,CAAC;QACzE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,IAAa,EAAE,EAAE;QAC1C,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAA2G,CAAC;QACnJ,IAAI,CAAC;YACH,cAAc,CAAC,eAAe,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,iDAAiD,SAAS,GAAG,EAAE,KAAK,CAAC,CAAC;QACtF,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,EAAE,CAAC,qBAAqB,EAAE,CAAC,IAAa,EAAE,EAAE;QACnD,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAqD,CAAC;QACtF,IAAI,CAAC;YACH,cAAc,CAAC,sBAAsB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,0DAA0D,SAAS,GAAG,EAAE,KAAK,CAAC,CAAC;QAC/F,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,EAAE,CAAC,cAAc,EAAE,KAAK,EAAE,IAAa,EAAE,EAAE;QAClD,MAAM,EAAE,SAAS,EAAE,GAAG,IAA6B,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,6BAA6B,SAAS,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC;YACH,MAAM,cAAc,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,mCAAmC,SAAS,GAAG,EAAE,KAAK,CAAC,CAAC;QACxE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,uCAAuC;IACvC,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACvC,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAC1B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;gBACrB,MAAM,EAAE,IAAI;gBACZ,QAAQ,EAAE,cAAc,CAAC,QAAQ,EAAE;gBACnC,GAAG;aACJ,CAAC,CAAC,CAAC;QACN,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE;QACpC,iBAAiB,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,kBAAkB;IAClB,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QACzC,WAAW,EAAE,CAAC;QACd,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC9B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAE/B,gDAAgD;IAChD,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function acquireLock(): void;
2
+ export declare function releaseLock(): void;
3
+ //# sourceMappingURL=lockfile.d.ts.map
@@ -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.33",
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"}