@phantom-pm/os-agent 2.0.0-alpha.2

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.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,79 @@
1
+ // PHANTOM OS-Agent Edge Node
2
+ // Connects to the Phantom Core Gateway to execute OS-level commands (OpenClaws pattern)
3
+ import WebSocket from 'ws';
4
+ import { exec } from 'child_process';
5
+ import { promisify } from 'util';
6
+ const execAsync = promisify(exec);
7
+ const GATEWAY_URL = process.env.PHANTOM_GATEWAY_URL || 'ws://localhost:8080/os-claws';
8
+ const NODE_NAME = process.env.NODE_NAME || `edge-node-${Math.random().toString(36).substring(7)}`;
9
+ console.log(`[OS-Agent] Starting Phantom Edge Node: ${NODE_NAME}`);
10
+ console.log(`[OS-Agent] Connecting to Gateway: ${GATEWAY_URL}`);
11
+ let ws;
12
+ let reconnectTimer;
13
+ function connect() {
14
+ ws = new WebSocket(GATEWAY_URL);
15
+ ws.on('open', () => {
16
+ console.log(`[OS-Agent] Connected to Gateway.`);
17
+ // Identify self to gateway
18
+ ws.send(JSON.stringify({
19
+ type: 'register',
20
+ payload: { nodeName: NODE_NAME, capabilities: ['screenshot', 'mouse', 'keyboard', 'bash'] }
21
+ }));
22
+ });
23
+ ws.on('message', async (data) => {
24
+ try {
25
+ const msg = JSON.parse(data.toString());
26
+ console.log(`[OS-Agent] Received command: ${msg.type}`);
27
+ const response = await handleCommand(msg);
28
+ if (response) {
29
+ ws.send(JSON.stringify({
30
+ type: 'response',
31
+ replyTo: msg.id,
32
+ payload: response
33
+ }));
34
+ }
35
+ }
36
+ catch (err) {
37
+ console.error(`[OS-Agent] Error processing message:`, err);
38
+ }
39
+ });
40
+ ws.on('close', () => {
41
+ console.log(`[OS-Agent] Disconnected from Gateway. Reconnecting in 5s...`);
42
+ clearTimeout(reconnectTimer);
43
+ reconnectTimer = setTimeout(connect, 5000);
44
+ });
45
+ ws.on('error', (err) => {
46
+ console.error(`[OS-Agent] WebSocket Error:`, err.message);
47
+ ws.close();
48
+ });
49
+ }
50
+ async function handleCommand(msg) {
51
+ switch (msg.type) {
52
+ case 'ping':
53
+ return { status: 'ok', timestamp: Date.now() };
54
+ case 'bash':
55
+ console.log(`[OS-Agent] Executing bash: ${msg.payload.command}`);
56
+ try {
57
+ const { stdout, stderr } = await execAsync(msg.payload.command);
58
+ return { status: 'success', stdout, stderr };
59
+ }
60
+ catch (error) {
61
+ return { status: 'error', error: error.message };
62
+ }
63
+ case 'screenshot':
64
+ console.log(`[OS-Agent] Capturing screenshot...`);
65
+ // Mock screenshot for now without nut.js
66
+ return { status: 'success', imageBase64: 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGMAAQAABQABDQottAAAAABJRU5ErkJggg==' };
67
+ case 'mouse_move':
68
+ console.log(`[OS-Agent] Moving mouse to X:${msg.payload.x}, Y:${msg.payload.y}`);
69
+ return { status: 'success' };
70
+ case 'type_text':
71
+ console.log(`[OS-Agent] Typing text: ${msg.payload.text}`);
72
+ return { status: 'success' };
73
+ default:
74
+ console.warn(`[OS-Agent] Unknown command type: ${msg.type}`);
75
+ return { status: 'error', error: 'Unknown command type' };
76
+ }
77
+ }
78
+ connect();
79
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "@phantom-pm/os-agent",
3
+ "version": "2.0.0-alpha.2",
4
+ "description": "Phantom Local OS Edge Node",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "type": "module",
8
+ "scripts": {
9
+ "build": "tsc",
10
+ "main": "node dist/index.js"
11
+ },
12
+ "dependencies": {
13
+ "ws": "^8.16.0"
14
+ },
15
+ "devDependencies": {
16
+ "@types/ws": "^8.5.10",
17
+ "typescript": "^5.4.2"
18
+ }
19
+ }
package/src/index.ts ADDED
@@ -0,0 +1,95 @@
1
+ // PHANTOM OS-Agent Edge Node
2
+ // Connects to the Phantom Core Gateway to execute OS-level commands (OpenClaws pattern)
3
+
4
+ import WebSocket from 'ws';
5
+ import { exec } from 'child_process';
6
+ import { promisify } from 'util';
7
+
8
+ const execAsync = promisify(exec);
9
+
10
+ const GATEWAY_URL = process.env.PHANTOM_GATEWAY_URL || 'ws://localhost:8080/os-claws';
11
+ const NODE_NAME = process.env.NODE_NAME || `edge-node-${Math.random().toString(36).substring(7)}`;
12
+
13
+ console.log(`[OS-Agent] Starting Phantom Edge Node: ${NODE_NAME}`);
14
+ console.log(`[OS-Agent] Connecting to Gateway: ${GATEWAY_URL}`);
15
+
16
+ let ws: WebSocket;
17
+ let reconnectTimer: NodeJS.Timeout;
18
+
19
+ function connect() {
20
+ ws = new WebSocket(GATEWAY_URL);
21
+
22
+ ws.on('open', () => {
23
+ console.log(`[OS-Agent] Connected to Gateway.`);
24
+ // Identify self to gateway
25
+ ws.send(JSON.stringify({
26
+ type: 'register',
27
+ payload: { nodeName: NODE_NAME, capabilities: ['screenshot', 'mouse', 'keyboard', 'bash'] }
28
+ }));
29
+ });
30
+
31
+ ws.on('message', async (data) => {
32
+ try {
33
+ const msg = JSON.parse(data.toString());
34
+ console.log(`[OS-Agent] Received command: ${msg.type}`);
35
+
36
+ const response = await handleCommand(msg);
37
+
38
+ if (response) {
39
+ ws.send(JSON.stringify({
40
+ type: 'response',
41
+ replyTo: msg.id,
42
+ payload: response
43
+ }));
44
+ }
45
+ } catch (err) {
46
+ console.error(`[OS-Agent] Error processing message:`, err);
47
+ }
48
+ });
49
+
50
+ ws.on('close', () => {
51
+ console.log(`[OS-Agent] Disconnected from Gateway. Reconnecting in 5s...`);
52
+ clearTimeout(reconnectTimer);
53
+ reconnectTimer = setTimeout(connect, 5000);
54
+ });
55
+
56
+ ws.on('error', (err) => {
57
+ console.error(`[OS-Agent] WebSocket Error:`, err.message);
58
+ ws.close();
59
+ });
60
+ }
61
+
62
+ async function handleCommand(msg: any): Promise<any> {
63
+ switch (msg.type) {
64
+ case 'ping':
65
+ return { status: 'ok', timestamp: Date.now() };
66
+
67
+ case 'bash':
68
+ console.log(`[OS-Agent] Executing bash: ${msg.payload.command}`);
69
+ try {
70
+ const { stdout, stderr } = await execAsync(msg.payload.command);
71
+ return { status: 'success', stdout, stderr };
72
+ } catch (error: any) {
73
+ return { status: 'error', error: error.message };
74
+ }
75
+
76
+ case 'screenshot':
77
+ console.log(`[OS-Agent] Capturing screenshot...`);
78
+ // Mock screenshot for now without nut.js
79
+ return { status: 'success', imageBase64: 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGMAAQAABQABDQottAAAAABJRU5ErkJggg==' };
80
+
81
+ case 'mouse_move':
82
+ console.log(`[OS-Agent] Moving mouse to X:${msg.payload.x}, Y:${msg.payload.y}`);
83
+ return { status: 'success' };
84
+
85
+ case 'type_text':
86
+ console.log(`[OS-Agent] Typing text: ${msg.payload.text}`);
87
+ return { status: 'success' };
88
+
89
+ default:
90
+ console.warn(`[OS-Agent] Unknown command type: ${msg.type}`);
91
+ return { status: 'error', error: 'Unknown command type' };
92
+ }
93
+ }
94
+
95
+ connect();
package/tsconfig.json ADDED
@@ -0,0 +1,14 @@
1
+ {
2
+ "extends": "../../tsconfig.json",
3
+ "compilerOptions": {
4
+ "outDir": "./dist",
5
+ "rootDir": "./src",
6
+ "esModuleInterop": true,
7
+ "moduleResolution": "node",
8
+ "module": "ESNext",
9
+ "target": "ES2022"
10
+ },
11
+ "include": [
12
+ "src/**/*"
13
+ ]
14
+ }