@phuetz/code-buddy 0.1.22 → 0.1.24

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 (113) hide show
  1. package/README.md +22 -2
  2. package/dist/agent/codebuddy-agent.d.ts +10 -0
  3. package/dist/agent/codebuddy-agent.js +13 -0
  4. package/dist/agent/codebuddy-agent.js.map +1 -1
  5. package/dist/agent/execution/agent-executor.d.ts +4 -0
  6. package/dist/agent/execution/agent-executor.js +12 -0
  7. package/dist/agent/execution/agent-executor.js.map +1 -1
  8. package/dist/agent/execution/tool-selection-strategy.d.ts +2 -0
  9. package/dist/agent/execution/tool-selection-strategy.js +8 -0
  10. package/dist/agent/execution/tool-selection-strategy.js.map +1 -1
  11. package/dist/agent/facades/infrastructure-facade.d.ts +6 -0
  12. package/dist/agent/facades/infrastructure-facade.js +15 -0
  13. package/dist/agent/facades/infrastructure-facade.js.map +1 -1
  14. package/dist/agent/tool-handler.d.ts +6 -0
  15. package/dist/agent/tool-handler.js +18 -0
  16. package/dist/agent/tool-handler.js.map +1 -1
  17. package/dist/browser-automation/browser-manager.d.ts +23 -0
  18. package/dist/browser-automation/browser-manager.js +39 -0
  19. package/dist/browser-automation/browser-manager.js.map +1 -1
  20. package/dist/browser-automation/browser-tool.d.ts +30 -1
  21. package/dist/browser-automation/browser-tool.js +161 -0
  22. package/dist/browser-automation/browser-tool.js.map +1 -1
  23. package/dist/canvas/a2ui-manager.d.ts +44 -1
  24. package/dist/canvas/a2ui-manager.js +148 -23
  25. package/dist/canvas/a2ui-manager.js.map +1 -1
  26. package/dist/canvas/a2ui-server.d.ts +5 -0
  27. package/dist/canvas/a2ui-server.js +26 -0
  28. package/dist/canvas/a2ui-server.js.map +1 -1
  29. package/dist/canvas/a2ui-tool.d.ts +15 -1
  30. package/dist/canvas/a2ui-tool.js +76 -0
  31. package/dist/canvas/a2ui-tool.js.map +1 -1
  32. package/dist/canvas/a2ui-types.d.ts +19 -1
  33. package/dist/canvas/a2ui-types.js.map +1 -1
  34. package/dist/channels/imessage/index.d.ts +47 -18
  35. package/dist/channels/imessage/index.js +203 -17
  36. package/dist/channels/imessage/index.js.map +1 -1
  37. package/dist/codebuddy/client.d.ts +13 -1
  38. package/dist/codebuddy/client.js +191 -13
  39. package/dist/codebuddy/client.js.map +1 -1
  40. package/dist/codebuddy/tool-definitions/browser-tools.js +84 -1
  41. package/dist/codebuddy/tool-definitions/browser-tools.js.map +1 -1
  42. package/dist/codebuddy/tool-definitions/canvas-tools.js +7 -0
  43. package/dist/codebuddy/tool-definitions/canvas-tools.js.map +1 -1
  44. package/dist/commands/cli/device-commands.d.ts +8 -0
  45. package/dist/commands/cli/device-commands.js +114 -0
  46. package/dist/commands/cli/device-commands.js.map +1 -0
  47. package/dist/config/constants.d.ts +52 -14
  48. package/dist/config/constants.js +25 -13
  49. package/dist/config/constants.js.map +1 -1
  50. package/dist/config/model-tools.js +125 -10
  51. package/dist/config/model-tools.js.map +1 -1
  52. package/dist/config/toml-config.d.ts +13 -0
  53. package/dist/config/toml-config.js +74 -15
  54. package/dist/config/toml-config.js.map +1 -1
  55. package/dist/doctor/index.js +2 -0
  56. package/dist/doctor/index.js.map +1 -1
  57. package/dist/hooks/advanced-hooks.js +72 -11
  58. package/dist/hooks/advanced-hooks.js.map +1 -1
  59. package/dist/hooks/smart-hooks.js +63 -14
  60. package/dist/hooks/smart-hooks.js.map +1 -1
  61. package/dist/index.js +4 -0
  62. package/dist/index.js.map +1 -1
  63. package/dist/interpreter/interpreter-service.d.ts +2 -0
  64. package/dist/interpreter/interpreter-service.js +78 -9
  65. package/dist/interpreter/interpreter-service.js.map +1 -1
  66. package/dist/mcp/config.js +10 -0
  67. package/dist/mcp/config.js.map +1 -1
  68. package/dist/memory/hybrid-search.d.ts +10 -0
  69. package/dist/memory/hybrid-search.js +110 -3
  70. package/dist/memory/hybrid-search.js.map +1 -1
  71. package/dist/memory/icm-bridge.d.ts +65 -0
  72. package/dist/memory/icm-bridge.js +125 -0
  73. package/dist/memory/icm-bridge.js.map +1 -0
  74. package/dist/nodes/device-node.d.ts +29 -9
  75. package/dist/nodes/device-node.js +247 -23
  76. package/dist/nodes/device-node.js.map +1 -1
  77. package/dist/nodes/platform-commands.d.ts +24 -0
  78. package/dist/nodes/platform-commands.js +70 -0
  79. package/dist/nodes/platform-commands.js.map +1 -0
  80. package/dist/nodes/transports/adb-transport.d.ts +22 -0
  81. package/dist/nodes/transports/adb-transport.js +115 -0
  82. package/dist/nodes/transports/adb-transport.js.map +1 -0
  83. package/dist/nodes/transports/base-transport.d.ts +55 -0
  84. package/dist/nodes/transports/base-transport.js +8 -0
  85. package/dist/nodes/transports/base-transport.js.map +1 -0
  86. package/dist/nodes/transports/local-transport.d.ts +18 -0
  87. package/dist/nodes/transports/local-transport.js +72 -0
  88. package/dist/nodes/transports/local-transport.js.map +1 -0
  89. package/dist/nodes/transports/ssh-transport.d.ts +25 -0
  90. package/dist/nodes/transports/ssh-transport.js +145 -0
  91. package/dist/nodes/transports/ssh-transport.js.map +1 -0
  92. package/dist/tools/device-tool.d.ts +22 -0
  93. package/dist/tools/device-tool.js +111 -0
  94. package/dist/tools/device-tool.js.map +1 -0
  95. package/dist/tools/hooks/default-hooks.js +29 -0
  96. package/dist/tools/hooks/default-hooks.js.map +1 -1
  97. package/dist/tools/registry/misc-tools.d.ts +24 -0
  98. package/dist/tools/registry/misc-tools.js +165 -0
  99. package/dist/tools/registry/misc-tools.js.map +1 -1
  100. package/dist/tools/skill-discovery-tool.d.ts +41 -0
  101. package/dist/tools/skill-discovery-tool.js +104 -0
  102. package/dist/tools/skill-discovery-tool.js.map +1 -0
  103. package/dist/tools/tool-selector.js +5 -1
  104. package/dist/tools/tool-selector.js.map +1 -1
  105. package/dist/tools/types.d.ts +2 -0
  106. package/dist/utils/config-validation/schema.d.ts +2 -2
  107. package/dist/utils/model-utils.d.ts +1 -1
  108. package/dist/utils/model-utils.js +5 -3
  109. package/dist/utils/model-utils.js.map +1 -1
  110. package/dist/utils/rtk-compressor.d.ts +36 -0
  111. package/dist/utils/rtk-compressor.js +86 -0
  112. package/dist/utils/rtk-compressor.js.map +1 -0
  113. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"hybrid-search.js","sourceRoot":"","sources":["../../src/memory/hybrid-search.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hybrid-search.js","sourceRoot":"","sources":["../../src/memory/hybrid-search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * ICM (Infinite Context Memory) Bridge
3
+ *
4
+ * Wraps ICM's MCP tools into Code Buddy's memory lifecycle.
5
+ * ICM provides persistent cross-session memory via episodic + semantic
6
+ * dual architecture through 16 MCP tools.
7
+ *
8
+ * All methods fail silently (log warning) if ICM is not available.
9
+ *
10
+ * @see https://github.com/rtk-ai/icm
11
+ */
12
+ /**
13
+ * Minimal MCP manager interface for calling tools
14
+ */
15
+ export interface MCPToolCaller {
16
+ callTool(serverName: string, toolName: string, args: Record<string, unknown>): Promise<unknown>;
17
+ getConnectedServers(): string[];
18
+ }
19
+ export interface EpisodeMetadata {
20
+ source?: string;
21
+ tags?: string[];
22
+ sessionId?: string;
23
+ turnNumber?: number;
24
+ [key: string]: unknown;
25
+ }
26
+ export interface MemorySearchOptions {
27
+ limit?: number;
28
+ threshold?: number;
29
+ tags?: string[];
30
+ }
31
+ export interface MemoryEntry {
32
+ id: string;
33
+ content: string;
34
+ metadata?: Record<string, unknown>;
35
+ score?: number;
36
+ createdAt?: string;
37
+ }
38
+ /**
39
+ * Bridge between Code Buddy and ICM MCP server
40
+ */
41
+ export declare class ICMBridge {
42
+ private mcpCaller;
43
+ private available;
44
+ private readonly serverName;
45
+ /**
46
+ * Initialize the bridge by checking if ICM server is connected
47
+ */
48
+ initialize(mcpCaller: MCPToolCaller): Promise<void>;
49
+ /**
50
+ * Check if ICM MCP server is connected and available
51
+ */
52
+ isAvailable(): boolean;
53
+ /**
54
+ * Store an episode (conversation turn, event) in ICM memory
55
+ */
56
+ storeEpisode(content: string, metadata?: EpisodeMetadata): Promise<void>;
57
+ /**
58
+ * Search ICM memory for relevant entries
59
+ */
60
+ searchMemory(query: string, options?: MemorySearchOptions): Promise<MemoryEntry[]>;
61
+ /**
62
+ * Get recent memories/episodes from ICM
63
+ */
64
+ getRecentContext(limit?: number): Promise<MemoryEntry[]>;
65
+ }
@@ -0,0 +1,125 @@
1
+ /**
2
+ * ICM (Infinite Context Memory) Bridge
3
+ *
4
+ * Wraps ICM's MCP tools into Code Buddy's memory lifecycle.
5
+ * ICM provides persistent cross-session memory via episodic + semantic
6
+ * dual architecture through 16 MCP tools.
7
+ *
8
+ * All methods fail silently (log warning) if ICM is not available.
9
+ *
10
+ * @see https://github.com/rtk-ai/icm
11
+ */
12
+ import { logger } from '../utils/logger.js';
13
+ /**
14
+ * Bridge between Code Buddy and ICM MCP server
15
+ */
16
+ export class ICMBridge {
17
+ mcpCaller = null;
18
+ available = false;
19
+ serverName = 'icm';
20
+ /**
21
+ * Initialize the bridge by checking if ICM server is connected
22
+ */
23
+ async initialize(mcpCaller) {
24
+ this.mcpCaller = mcpCaller;
25
+ try {
26
+ const servers = mcpCaller.getConnectedServers();
27
+ this.available = servers.includes(this.serverName);
28
+ if (this.available) {
29
+ logger.info('ICM memory bridge initialized');
30
+ }
31
+ else {
32
+ logger.debug('ICM MCP server not connected — memory bridge inactive');
33
+ }
34
+ }
35
+ catch (error) {
36
+ logger.warn('Failed to initialize ICM bridge', {
37
+ error: error instanceof Error ? error.message : String(error),
38
+ });
39
+ this.available = false;
40
+ }
41
+ }
42
+ /**
43
+ * Check if ICM MCP server is connected and available
44
+ */
45
+ isAvailable() {
46
+ return this.available;
47
+ }
48
+ /**
49
+ * Store an episode (conversation turn, event) in ICM memory
50
+ */
51
+ async storeEpisode(content, metadata) {
52
+ if (!this.available || !this.mcpCaller)
53
+ return;
54
+ try {
55
+ await this.mcpCaller.callTool(this.serverName, 'create_memory', {
56
+ content,
57
+ metadata: metadata || {},
58
+ });
59
+ logger.debug('Stored episode in ICM', { contentLength: content.length });
60
+ }
61
+ catch (error) {
62
+ logger.warn('Failed to store episode in ICM', {
63
+ error: error instanceof Error ? error.message : String(error),
64
+ });
65
+ }
66
+ }
67
+ /**
68
+ * Search ICM memory for relevant entries
69
+ */
70
+ async searchMemory(query, options) {
71
+ if (!this.available || !this.mcpCaller)
72
+ return [];
73
+ try {
74
+ const result = await this.mcpCaller.callTool(this.serverName, 'search_memory', {
75
+ query,
76
+ limit: options?.limit ?? 10,
77
+ threshold: options?.threshold,
78
+ tags: options?.tags,
79
+ });
80
+ // ICM returns results as an array of memory entries
81
+ if (Array.isArray(result)) {
82
+ return result;
83
+ }
84
+ // Handle wrapped response
85
+ const response = result;
86
+ if (Array.isArray(response.memories)) {
87
+ return response.memories;
88
+ }
89
+ return [];
90
+ }
91
+ catch (error) {
92
+ logger.warn('ICM memory search failed', {
93
+ error: error instanceof Error ? error.message : String(error),
94
+ });
95
+ return [];
96
+ }
97
+ }
98
+ /**
99
+ * Get recent memories/episodes from ICM
100
+ */
101
+ async getRecentContext(limit = 10) {
102
+ if (!this.available || !this.mcpCaller)
103
+ return [];
104
+ try {
105
+ const result = await this.mcpCaller.callTool(this.serverName, 'get_recent_memories', {
106
+ limit,
107
+ });
108
+ if (Array.isArray(result)) {
109
+ return result;
110
+ }
111
+ const response = result;
112
+ if (Array.isArray(response.memories)) {
113
+ return response.memories;
114
+ }
115
+ return [];
116
+ }
117
+ catch (error) {
118
+ logger.warn('ICM get recent context failed', {
119
+ error: error instanceof Error ? error.message : String(error),
120
+ });
121
+ return [];
122
+ }
123
+ }
124
+ }
125
+ //# sourceMappingURL=icm-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icm-bridge.js","sourceRoot":"","sources":["../../src/memory/icm-bridge.ts"],"names":[],"mappings":"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"}
@@ -1,19 +1,26 @@
1
1
  /**
2
2
  * Device Node System
3
3
  *
4
- * Manages paired device nodes (macOS, iOS, Android) with capabilities
5
- * like camera, screen recording, location, notifications, and system commands.
4
+ * Manages paired device nodes (macOS, Linux, Android) with real transport
5
+ * connections (SSH, ADB, local). Capabilities are auto-detected from
6
+ * the connected device.
6
7
  */
7
- export type DeviceType = 'macos' | 'ios' | 'android';
8
- export type DeviceCapability = 'camera' | 'screen_record' | 'location' | 'notifications' | 'system_run';
8
+ import type { ExecuteResult } from './transports/base-transport.js';
9
+ export type DeviceType = 'macos' | 'linux' | 'android' | 'local';
10
+ export type DeviceCapability = 'camera' | 'screen_record' | 'location' | 'notifications' | 'system_run' | 'file_transfer' | 'screenshot';
11
+ export type TransportType = 'ssh' | 'adb' | 'local';
9
12
  export interface DeviceNode {
10
13
  id: string;
11
14
  name: string;
12
15
  type: DeviceType;
16
+ transportType: TransportType;
13
17
  capabilities: DeviceCapability[];
14
18
  paired: boolean;
15
19
  lastSeen: number;
16
20
  address?: string;
21
+ port?: number;
22
+ username?: string;
23
+ keyPath?: string;
17
24
  }
18
25
  export interface LocationCoords {
19
26
  lat: number;
@@ -22,19 +29,32 @@ export interface LocationCoords {
22
29
  export declare class DeviceNodeManager {
23
30
  private static instance;
24
31
  private devices;
32
+ private transports;
33
+ constructor();
25
34
  static getInstance(): DeviceNodeManager;
26
35
  static resetInstance(): void;
27
- pairDevice(id: string, name: string, type: DeviceType, capabilities: DeviceCapability[]): DeviceNode;
36
+ private loadDevices;
37
+ private saveDevices;
38
+ private createTransport;
39
+ private getTransport;
40
+ pairDevice(id: string, name: string, transportType: TransportType, options?: {
41
+ address?: string;
42
+ port?: number;
43
+ username?: string;
44
+ keyPath?: string;
45
+ }): Promise<DeviceNode>;
28
46
  unpairDevice(id: string): boolean;
29
47
  getDevice(id: string): DeviceNode | undefined;
30
48
  listDevices(): DeviceNode[];
31
49
  listPairedDevices(): DeviceNode[];
32
50
  isDevicePaired(id: string): boolean;
33
- cameraSnap(deviceId: string): string | null;
34
- screenRecord(deviceId: string, duration?: number): string | null;
35
- getLocation(deviceId: string): LocationCoords | null;
51
+ cameraSnap(deviceId: string): Promise<string | null>;
52
+ screenRecord(deviceId: string, duration?: number): Promise<string | null>;
53
+ screenshot(deviceId: string): Promise<string | null>;
54
+ getLocation(deviceId: string): Promise<LocationCoords | null>;
36
55
  sendNotification(deviceId: string, title: string, body: string): boolean;
37
- systemRun(deviceId: string, command: string): string | null;
56
+ systemRun(deviceId: string, command: string): Promise<ExecuteResult | null>;
38
57
  generatePairingCode(): string;
39
58
  updateLastSeen(deviceId: string): boolean;
59
+ private toPlatform;
40
60
  }
@@ -1,16 +1,30 @@
1
1
  /**
2
2
  * Device Node System
3
3
  *
4
- * Manages paired device nodes (macOS, iOS, Android) with capabilities
5
- * like camera, screen recording, location, notifications, and system commands.
4
+ * Manages paired device nodes (macOS, Linux, Android) with real transport
5
+ * connections (SSH, ADB, local). Capabilities are auto-detected from
6
+ * the connected device.
6
7
  */
8
+ import * as fs from 'fs';
9
+ import * as path from 'path';
10
+ import * as os from 'os';
7
11
  import { logger } from '../utils/logger.js';
12
+ import { getPlatformCommands } from './platform-commands.js';
13
+ // ============================================================================
14
+ // Constants
15
+ // ============================================================================
16
+ const DEVICES_FILE = path.join(os.homedir(), '.codebuddy', 'devices.json');
17
+ const DEVICES_VERSION = 1;
8
18
  // ============================================================================
9
19
  // DeviceNodeManager
10
20
  // ============================================================================
11
21
  export class DeviceNodeManager {
12
22
  static instance = null;
13
23
  devices = new Map();
24
+ transports = new Map();
25
+ constructor() {
26
+ this.loadDevices();
27
+ }
14
28
  static getInstance() {
15
29
  if (!DeviceNodeManager.instance) {
16
30
  DeviceNodeManager.instance = new DeviceNodeManager();
@@ -20,22 +34,156 @@ export class DeviceNodeManager {
20
34
  static resetInstance() {
21
35
  DeviceNodeManager.instance = null;
22
36
  }
23
- pairDevice(id, name, type, capabilities) {
24
- logger.info(`Pairing device: ${name} (${id})`);
37
+ // ==========================================================================
38
+ // Persistence
39
+ // ==========================================================================
40
+ loadDevices() {
41
+ try {
42
+ if (fs.existsSync(DEVICES_FILE)) {
43
+ const raw = fs.readFileSync(DEVICES_FILE, 'utf-8');
44
+ const data = JSON.parse(raw);
45
+ if (data.version === DEVICES_VERSION && Array.isArray(data.devices)) {
46
+ for (const d of data.devices) {
47
+ this.devices.set(d.id, d);
48
+ }
49
+ }
50
+ }
51
+ }
52
+ catch {
53
+ logger.debug('No persisted devices found or failed to load');
54
+ }
55
+ }
56
+ saveDevices() {
57
+ try {
58
+ const dir = path.dirname(DEVICES_FILE);
59
+ if (!fs.existsSync(dir)) {
60
+ fs.mkdirSync(dir, { recursive: true });
61
+ }
62
+ const data = {
63
+ version: DEVICES_VERSION,
64
+ devices: Array.from(this.devices.values()),
65
+ };
66
+ fs.writeFileSync(DEVICES_FILE, JSON.stringify(data, null, 2), 'utf-8');
67
+ }
68
+ catch (err) {
69
+ logger.warn('Failed to save devices', {
70
+ error: err instanceof Error ? err.message : String(err),
71
+ });
72
+ }
73
+ }
74
+ // ==========================================================================
75
+ // Transport Management
76
+ // ==========================================================================
77
+ async createTransport(device) {
78
+ switch (device.transportType) {
79
+ case 'ssh': {
80
+ const { SSHTransport } = await import('./transports/ssh-transport.js');
81
+ return new SSHTransport({
82
+ deviceId: device.id,
83
+ name: device.name,
84
+ address: device.address,
85
+ port: device.port,
86
+ username: device.username,
87
+ keyPath: device.keyPath,
88
+ });
89
+ }
90
+ case 'adb': {
91
+ const { ADBTransport } = await import('./transports/adb-transport.js');
92
+ return new ADBTransport({
93
+ deviceId: device.id,
94
+ name: device.name,
95
+ address: device.address,
96
+ port: device.port,
97
+ });
98
+ }
99
+ case 'local': {
100
+ const { LocalTransport } = await import('./transports/local-transport.js');
101
+ return new LocalTransport();
102
+ }
103
+ default:
104
+ throw new Error(`Unknown transport type: ${device.transportType}`);
105
+ }
106
+ }
107
+ async getTransport(deviceId) {
108
+ const existing = this.transports.get(deviceId);
109
+ if (existing && existing.isConnected()) {
110
+ return existing;
111
+ }
112
+ const device = this.devices.get(deviceId);
113
+ if (!device)
114
+ return null;
115
+ const transport = await this.createTransport(device);
116
+ await transport.connect();
117
+ this.transports.set(deviceId, transport);
118
+ return transport;
119
+ }
120
+ // ==========================================================================
121
+ // Device Pairing
122
+ // ==========================================================================
123
+ async pairDevice(id, name, transportType, options = {}) {
124
+ logger.info(`Pairing device: ${name} (${id}) via ${transportType}`);
125
+ // Determine device type from transport
126
+ let type;
127
+ switch (transportType) {
128
+ case 'adb':
129
+ type = 'android';
130
+ break;
131
+ case 'local':
132
+ type = 'local';
133
+ break;
134
+ default:
135
+ type = 'macos';
136
+ break; // SSH defaults to macOS, refined by capability detection
137
+ }
25
138
  const device = {
26
139
  id,
27
140
  name,
28
141
  type,
29
- capabilities,
142
+ transportType,
143
+ capabilities: [],
30
144
  paired: true,
31
145
  lastSeen: Date.now(),
146
+ address: options.address,
147
+ port: options.port,
148
+ username: options.username,
149
+ keyPath: options.keyPath,
32
150
  };
33
151
  this.devices.set(id, device);
152
+ // Connect and auto-detect capabilities
153
+ try {
154
+ const transport = await this.createTransport(device);
155
+ await transport.connect();
156
+ this.transports.set(id, transport);
157
+ const caps = await transport.getCapabilities();
158
+ device.capabilities = caps;
159
+ // Refine type for SSH connections
160
+ if (transportType === 'ssh') {
161
+ const uname = await transport.execute('uname -s');
162
+ const platform = uname.stdout.trim().toLowerCase();
163
+ if (platform === 'linux') {
164
+ device.type = 'linux';
165
+ }
166
+ }
167
+ logger.info(`Device paired with capabilities: ${caps.join(', ')}`, { id, name });
168
+ }
169
+ catch (err) {
170
+ logger.warn(`Device paired but connection failed: ${err instanceof Error ? err.message : String(err)}`);
171
+ device.capabilities = ['system_run'];
172
+ }
173
+ this.saveDevices();
34
174
  return device;
35
175
  }
36
176
  unpairDevice(id) {
37
177
  logger.info(`Unpairing device: ${id}`);
38
- return this.devices.delete(id);
178
+ const transport = this.transports.get(id);
179
+ if (transport) {
180
+ transport.disconnect().catch(() => { });
181
+ this.transports.delete(id);
182
+ }
183
+ const deleted = this.devices.delete(id);
184
+ if (deleted)
185
+ this.saveDevices();
186
+ return deleted;
39
187
  }
40
188
  getDevice(id) {
41
189
  return this.devices.get(id);
@@ -50,33 +198,98 @@ export class DeviceNodeManager {
50
198
  const device = this.devices.get(id);
51
199
  return device?.paired === true;
52
200
  }
53
- cameraSnap(deviceId) {
201
+ // ==========================================================================
202
+ // Device Actions (using real transports)
203
+ // ==========================================================================
204
+ async cameraSnap(deviceId) {
54
205
  const device = this.devices.get(deviceId);
55
206
  if (!device || !device.capabilities.includes('camera')) {
56
207
  logger.warn(`Device ${deviceId} does not support camera`);
57
208
  return null;
58
209
  }
59
- logger.info(`Camera snap on device ${deviceId}`);
60
- return `/tmp/snap-${deviceId}-${Date.now()}.jpg`;
210
+ const transport = await this.getTransport(deviceId);
211
+ if (!transport)
212
+ return null;
213
+ const outputPath = `/tmp/snap-${deviceId}-${Date.now()}.jpg`;
214
+ const platform = this.toPlatform(device.type);
215
+ const commands = getPlatformCommands(platform);
216
+ if (!commands)
217
+ return null;
218
+ const result = await transport.execute(commands.cameraSnap(outputPath));
219
+ if (result.exitCode !== 0) {
220
+ logger.warn(`Camera snap failed on ${deviceId}: ${result.stderr}`);
221
+ return null;
222
+ }
223
+ device.lastSeen = Date.now();
224
+ return outputPath;
61
225
  }
62
- screenRecord(deviceId, duration) {
226
+ async screenRecord(deviceId, duration) {
63
227
  const device = this.devices.get(deviceId);
64
228
  if (!device || !device.capabilities.includes('screen_record')) {
65
229
  logger.warn(`Device ${deviceId} does not support screen recording`);
66
230
  return null;
67
231
  }
232
+ const transport = await this.getTransport(deviceId);
233
+ if (!transport)
234
+ return null;
68
235
  const dur = duration || 10;
69
- logger.info(`Screen record on device ${deviceId} for ${dur}s`);
70
- return `/tmp/screen-${deviceId}-${Date.now()}.mp4`;
236
+ const outputPath = `/tmp/screen-${deviceId}-${Date.now()}.mp4`;
237
+ const platform = this.toPlatform(device.type);
238
+ const commands = getPlatformCommands(platform);
239
+ if (!commands)
240
+ return null;
241
+ const result = await transport.execute(commands.screenRecord(outputPath, dur));
242
+ if (result.exitCode !== 0) {
243
+ logger.warn(`Screen record failed on ${deviceId}: ${result.stderr}`);
244
+ return null;
245
+ }
246
+ device.lastSeen = Date.now();
247
+ return outputPath;
248
+ }
249
+ async screenshot(deviceId) {
250
+ const device = this.devices.get(deviceId);
251
+ if (!device || !device.capabilities.includes('screenshot')) {
252
+ logger.warn(`Device ${deviceId} does not support screenshots`);
253
+ return null;
254
+ }
255
+ const transport = await this.getTransport(deviceId);
256
+ if (!transport)
257
+ return null;
258
+ const outputPath = `/tmp/screenshot-${deviceId}-${Date.now()}.png`;
259
+ const platform = this.toPlatform(device.type);
260
+ const commands = getPlatformCommands(platform);
261
+ if (!commands)
262
+ return null;
263
+ const result = await transport.execute(commands.screenshot(outputPath));
264
+ if (result.exitCode !== 0) {
265
+ logger.warn(`Screenshot failed on ${deviceId}: ${result.stderr}`);
266
+ return null;
267
+ }
268
+ device.lastSeen = Date.now();
269
+ return outputPath;
71
270
  }
72
- getLocation(deviceId) {
271
+ async getLocation(deviceId) {
73
272
  const device = this.devices.get(deviceId);
74
273
  if (!device || !device.capabilities.includes('location')) {
75
274
  logger.warn(`Device ${deviceId} does not support location`);
76
275
  return null;
77
276
  }
78
- logger.info(`Getting location for device ${deviceId}`);
79
- return { lat: 0, lon: 0 };
277
+ const transport = await this.getTransport(deviceId);
278
+ if (!transport)
279
+ return null;
280
+ const platform = this.toPlatform(device.type);
281
+ const commands = getPlatformCommands(platform);
282
+ if (!commands)
283
+ return null;
284
+ const result = await transport.execute(commands.getLocation());
285
+ device.lastSeen = Date.now();
286
+ try {
287
+ const parsed = JSON.parse(result.stdout);
288
+ return { lat: parsed.lat || 0, lon: parsed.lon || 0 };
289
+ }
290
+ catch {
291
+ return { lat: 0, lon: 0 };
292
+ }
80
293
  }
81
294
  sendNotification(deviceId, title, body) {
82
295
  const device = this.devices.get(deviceId);
@@ -87,18 +300,18 @@ export class DeviceNodeManager {
87
300
  logger.info(`Sending notification to ${deviceId}: ${title}`);
88
301
  return true;
89
302
  }
90
- systemRun(deviceId, command) {
303
+ async systemRun(deviceId, command) {
91
304
  const device = this.devices.get(deviceId);
92
305
  if (!device || !device.capabilities.includes('system_run')) {
93
306
  logger.warn(`Device ${deviceId} does not support system_run`);
94
307
  return null;
95
308
  }
96
- if (device.type !== 'macos') {
97
- logger.warn(`system_run only supported on macOS, device ${deviceId} is ${device.type}`);
309
+ const transport = await this.getTransport(deviceId);
310
+ if (!transport)
98
311
  return null;
99
- }
100
- logger.info(`Running command on device ${deviceId}: ${command}`);
101
- return `stub: executed "${command}" on ${deviceId}`;
312
+ const result = await transport.execute(command);
313
+ device.lastSeen = Date.now();
314
+ return result;
102
315
  }
103
316
  generatePairingCode() {
104
317
  const code = Math.floor(100000 + Math.random() * 900000).toString();
@@ -107,11 +320,22 @@ export class DeviceNodeManager {
107
320
  }
108
321
  updateLastSeen(deviceId) {
109
322
  const device = this.devices.get(deviceId);
110
- if (!device) {
323
+ if (!device)
111
324
  return false;
112
- }
113
325
  device.lastSeen = Date.now();
114
326
  return true;
115
327
  }
328
+ // ==========================================================================
329
+ // Helpers
330
+ // ==========================================================================
331
+ toPlatform(type) {
332
+ switch (type) {
333
+ case 'macos': return 'macos';
334
+ case 'linux': return 'linux';
335
+ case 'android': return 'android';
336
+ case 'local': return os.platform() === 'darwin' ? 'macos' : 'linux';
337
+ default: return 'unknown';
338
+ }
339
+ }
116
340
  }
117
341
  //# sourceMappingURL=device-node.js.map