termify-agent 1.0.0
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 +201 -0
- package/bin/termify-agent.js +3 -0
- package/dist/agent.d.ts +67 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +167 -0
- package/dist/agent.js.map +1 -0
- package/dist/auth.d.ts +13 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +140 -0
- package/dist/auth.js.map +1 -0
- package/dist/config.d.ts +16 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +51 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +190 -0
- package/dist/index.js.map +1 -0
- package/dist/pty-manager.d.ts +70 -0
- package/dist/pty-manager.d.ts.map +1 -0
- package/dist/pty-manager.js +189 -0
- package/dist/pty-manager.js.map +1 -0
- package/dist/utils/logger.d.ts +13 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +61 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/machine-id.d.ts +16 -0
- package/dist/utils/machine-id.d.ts.map +1 -0
- package/dist/utils/machine-id.js +30 -0
- package/dist/utils/machine-id.js.map +1 -0
- package/dist/ws-client.d.ts +130 -0
- package/dist/ws-client.d.ts.map +1 -0
- package/dist/ws-client.js +303 -0
- package/dist/ws-client.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { machineIdSync } from 'node-machine-id';
|
|
2
|
+
import os from 'os';
|
|
3
|
+
import crypto from 'crypto';
|
|
4
|
+
/**
|
|
5
|
+
* Get a unique machine identifier
|
|
6
|
+
* Uses node-machine-id with fallback to hostname-based hash
|
|
7
|
+
*/
|
|
8
|
+
export function getMachineId() {
|
|
9
|
+
try {
|
|
10
|
+
return machineIdSync(true); // true = use original ID, no hash
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
// Fallback: generate ID from hostname + username + platform
|
|
14
|
+
const fallbackData = `${os.hostname()}-${os.userInfo().username}-${os.platform()}`;
|
|
15
|
+
return crypto.createHash('sha256').update(fallbackData).digest('hex').substring(0, 32);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Get system information for agent registration
|
|
20
|
+
*/
|
|
21
|
+
export function getSystemInfo() {
|
|
22
|
+
return {
|
|
23
|
+
os: os.platform(),
|
|
24
|
+
hostname: os.hostname(),
|
|
25
|
+
arch: os.arch(),
|
|
26
|
+
platform: `${os.platform()} ${os.release()}`,
|
|
27
|
+
username: os.userInfo().username,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=machine-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"machine-id.js","sourceRoot":"","sources":["../../src/utils/machine-id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B;;;GAGG;AACH,MAAM,UAAU,YAAY;IAC1B,IAAI,CAAC;QACH,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,kCAAkC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,4DAA4D;QAC5D,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC;QACnF,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACzF,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAO3B,OAAO;QACL,EAAE,EAAE,EAAE,CAAC,QAAQ,EAAE;QACjB,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE;QACvB,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE;QACf,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE;QAC5C,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ;KACjC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
type AgentToServerMessage = {
|
|
3
|
+
type: 'agent.auth';
|
|
4
|
+
accessToken: string;
|
|
5
|
+
version: string;
|
|
6
|
+
machineId: string;
|
|
7
|
+
os: string;
|
|
8
|
+
hostname: string;
|
|
9
|
+
arch: string;
|
|
10
|
+
} | {
|
|
11
|
+
type: 'agent.terminal.output';
|
|
12
|
+
terminalId: string;
|
|
13
|
+
data: string;
|
|
14
|
+
} | {
|
|
15
|
+
type: 'agent.terminal.status';
|
|
16
|
+
terminalId: string;
|
|
17
|
+
status: 'RUNNING' | 'STOPPED' | 'CRASHED';
|
|
18
|
+
error?: string;
|
|
19
|
+
} | {
|
|
20
|
+
type: 'agent.terminal.cwd';
|
|
21
|
+
terminalId: string;
|
|
22
|
+
cwd: string;
|
|
23
|
+
} | {
|
|
24
|
+
type: 'agent.terminal.working';
|
|
25
|
+
terminalId: string;
|
|
26
|
+
isWorking: boolean;
|
|
27
|
+
} | {
|
|
28
|
+
type: 'agent.terminal.exit';
|
|
29
|
+
terminalId: string;
|
|
30
|
+
exitCode: number;
|
|
31
|
+
} | {
|
|
32
|
+
type: 'agent.ping';
|
|
33
|
+
};
|
|
34
|
+
export interface WSClientEvents {
|
|
35
|
+
connected: (agentId: string, agentName: string) => void;
|
|
36
|
+
disconnected: (reason: string) => void;
|
|
37
|
+
authFailed: (error: string) => void;
|
|
38
|
+
terminalCreate: (terminalId: string, cols: number, rows: number, options: {
|
|
39
|
+
cwd?: string;
|
|
40
|
+
shell?: string;
|
|
41
|
+
env?: Record<string, string>;
|
|
42
|
+
}) => void;
|
|
43
|
+
terminalInput: (terminalId: string, data: string) => void;
|
|
44
|
+
terminalResize: (terminalId: string, cols: number, rows: number) => void;
|
|
45
|
+
terminalStop: (terminalId: string) => void;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* WebSocket client for connecting to Termify server
|
|
49
|
+
*/
|
|
50
|
+
export declare class WSClient extends EventEmitter {
|
|
51
|
+
private ws;
|
|
52
|
+
private pingInterval;
|
|
53
|
+
private pongTimeout;
|
|
54
|
+
private reconnectTimeout;
|
|
55
|
+
private isConnected;
|
|
56
|
+
private shouldReconnect;
|
|
57
|
+
private reconnectAttempts;
|
|
58
|
+
private maxReconnectAttempts;
|
|
59
|
+
/**
|
|
60
|
+
* Connect to the Termify server
|
|
61
|
+
*/
|
|
62
|
+
connect(): void;
|
|
63
|
+
private doConnect;
|
|
64
|
+
/**
|
|
65
|
+
* Send authentication message
|
|
66
|
+
*/
|
|
67
|
+
private authenticate;
|
|
68
|
+
/**
|
|
69
|
+
* Handle incoming message from server
|
|
70
|
+
*/
|
|
71
|
+
private handleMessage;
|
|
72
|
+
/**
|
|
73
|
+
* Handle connection close
|
|
74
|
+
*/
|
|
75
|
+
private handleClose;
|
|
76
|
+
/**
|
|
77
|
+
* Schedule a reconnection attempt
|
|
78
|
+
*/
|
|
79
|
+
private scheduleReconnect;
|
|
80
|
+
/**
|
|
81
|
+
* Start ping interval for keepalive
|
|
82
|
+
*/
|
|
83
|
+
private startPingInterval;
|
|
84
|
+
/**
|
|
85
|
+
* Stop ping interval
|
|
86
|
+
*/
|
|
87
|
+
private stopPingInterval;
|
|
88
|
+
/**
|
|
89
|
+
* Send ping message
|
|
90
|
+
*/
|
|
91
|
+
private sendPing;
|
|
92
|
+
/**
|
|
93
|
+
* Handle pong response
|
|
94
|
+
*/
|
|
95
|
+
private handlePong;
|
|
96
|
+
/**
|
|
97
|
+
* Send a message to the server
|
|
98
|
+
*/
|
|
99
|
+
send(message: AgentToServerMessage): boolean;
|
|
100
|
+
/**
|
|
101
|
+
* Send terminal output to server
|
|
102
|
+
*/
|
|
103
|
+
sendTerminalOutput(terminalId: string, data: string): void;
|
|
104
|
+
/**
|
|
105
|
+
* Send terminal status update
|
|
106
|
+
*/
|
|
107
|
+
sendTerminalStatus(terminalId: string, status: 'RUNNING' | 'STOPPED' | 'CRASHED', error?: string): void;
|
|
108
|
+
/**
|
|
109
|
+
* Send terminal CWD update
|
|
110
|
+
*/
|
|
111
|
+
sendTerminalCwd(terminalId: string, cwd: string): void;
|
|
112
|
+
/**
|
|
113
|
+
* Send terminal working state
|
|
114
|
+
*/
|
|
115
|
+
sendTerminalWorking(terminalId: string, isWorking: boolean): void;
|
|
116
|
+
/**
|
|
117
|
+
* Send terminal exit notification
|
|
118
|
+
*/
|
|
119
|
+
sendTerminalExit(terminalId: string, exitCode: number): void;
|
|
120
|
+
/**
|
|
121
|
+
* Disconnect from the server
|
|
122
|
+
*/
|
|
123
|
+
disconnect(): void;
|
|
124
|
+
/**
|
|
125
|
+
* Check if connected
|
|
126
|
+
*/
|
|
127
|
+
get connected(): boolean;
|
|
128
|
+
}
|
|
129
|
+
export {};
|
|
130
|
+
//# sourceMappingURL=ws-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws-client.d.ts","sourceRoot":"","sources":["../src/ws-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAWtC,KAAK,oBAAoB,GACrB;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC3H;IAAE,IAAI,EAAE,uBAAuB,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACnE;IAAE,IAAI,EAAE,uBAAuB,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAChH;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC/D;IAAE,IAAI,EAAE,wBAAwB,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,GAC1E;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACrE;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,CAAC;AAW3B,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACxD,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,cAAc,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;QACxE,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC9B,KAAK,IAAI,CAAC;IACX,aAAa,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,cAAc,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACzE,YAAY,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5C;AAED;;GAEG;AACH,qBAAa,QAAS,SAAQ,YAAY;IACxC,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,WAAW,CAA+B;IAClD,OAAO,CAAC,gBAAgB,CAA+B;IACvD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,eAAe,CAAQ;IAC/B,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,oBAAoB,CAAM;IAElC;;OAEG;IACH,OAAO,IAAI,IAAI;IAiBf,OAAO,CAAC,SAAS;IA+BjB;;OAEG;IACH,OAAO,CAAC,YAAY;IAkBpB;;OAEG;IACH,OAAO,CAAC,aAAa;IAwDrB;;OAEG;IACH,OAAO,CAAC,WAAW;IAYnB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA0BzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAUzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAWxB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAUhB;;OAEG;IACH,OAAO,CAAC,UAAU;IAOlB;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO;IAe5C;;OAEG;IACH,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAQ1D;;OAEG;IACH,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IASvG;;OAEG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAQtD;;OAEG;IACH,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,IAAI;IAQjE;;OAEG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAQ5D;;OAEG;IACH,UAAU,IAAI,IAAI;IAmBlB;;OAEG;IACH,IAAI,SAAS,IAAI,OAAO,CAEvB;CACF"}
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
import WebSocket from 'ws';
|
|
2
|
+
import { EventEmitter } from 'events';
|
|
3
|
+
import { getConfig, setLastConnected } from './config.js';
|
|
4
|
+
import { getMachineId, getSystemInfo } from './utils/machine-id.js';
|
|
5
|
+
import { logger } from './utils/logger.js';
|
|
6
|
+
const VERSION = '1.0.0';
|
|
7
|
+
const PING_INTERVAL = 30000; // 30 seconds
|
|
8
|
+
const PONG_TIMEOUT = 10000; // 10 seconds
|
|
9
|
+
const AGENT_WS_RECONNECT_DELAY = 5000; // 5 seconds
|
|
10
|
+
/**
|
|
11
|
+
* WebSocket client for connecting to Termify server
|
|
12
|
+
*/
|
|
13
|
+
export class WSClient extends EventEmitter {
|
|
14
|
+
ws = null;
|
|
15
|
+
pingInterval = null;
|
|
16
|
+
pongTimeout = null;
|
|
17
|
+
reconnectTimeout = null;
|
|
18
|
+
isConnected = false;
|
|
19
|
+
shouldReconnect = true;
|
|
20
|
+
reconnectAttempts = 0;
|
|
21
|
+
maxReconnectAttempts = 10;
|
|
22
|
+
/**
|
|
23
|
+
* Connect to the Termify server
|
|
24
|
+
*/
|
|
25
|
+
connect() {
|
|
26
|
+
const config = getConfig();
|
|
27
|
+
if (!config.accessToken) {
|
|
28
|
+
logger.error('Not logged in. Run `termify-agent login` first.');
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (this.ws && this.ws.readyState === WebSocket.OPEN) {
|
|
32
|
+
logger.warn('Already connected');
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
this.shouldReconnect = true;
|
|
36
|
+
this.doConnect();
|
|
37
|
+
}
|
|
38
|
+
doConnect() {
|
|
39
|
+
const config = getConfig();
|
|
40
|
+
const wsUrl = config.wsUrl;
|
|
41
|
+
logger.info(`Connecting to ${wsUrl}...`);
|
|
42
|
+
try {
|
|
43
|
+
this.ws = new WebSocket(wsUrl);
|
|
44
|
+
this.ws.on('open', () => {
|
|
45
|
+
logger.debug('WebSocket connected, authenticating...');
|
|
46
|
+
this.authenticate();
|
|
47
|
+
});
|
|
48
|
+
this.ws.on('message', (data) => {
|
|
49
|
+
this.handleMessage(data);
|
|
50
|
+
});
|
|
51
|
+
this.ws.on('close', (code, reason) => {
|
|
52
|
+
this.handleClose(code, reason.toString());
|
|
53
|
+
});
|
|
54
|
+
this.ws.on('error', (error) => {
|
|
55
|
+
logger.error(`WebSocket error: ${error.message}`);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
logger.error(`Failed to connect: ${error}`);
|
|
60
|
+
this.scheduleReconnect();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Send authentication message
|
|
65
|
+
*/
|
|
66
|
+
authenticate() {
|
|
67
|
+
const config = getConfig();
|
|
68
|
+
const systemInfo = getSystemInfo();
|
|
69
|
+
const machineId = getMachineId();
|
|
70
|
+
const authMessage = {
|
|
71
|
+
type: 'agent.auth',
|
|
72
|
+
accessToken: config.accessToken,
|
|
73
|
+
version: VERSION,
|
|
74
|
+
machineId,
|
|
75
|
+
os: systemInfo.os,
|
|
76
|
+
hostname: systemInfo.hostname,
|
|
77
|
+
arch: systemInfo.arch,
|
|
78
|
+
};
|
|
79
|
+
this.send(authMessage);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Handle incoming message from server
|
|
83
|
+
*/
|
|
84
|
+
handleMessage(data) {
|
|
85
|
+
try {
|
|
86
|
+
const message = JSON.parse(data.toString());
|
|
87
|
+
switch (message.type) {
|
|
88
|
+
case 'server.auth.result':
|
|
89
|
+
if (message.success) {
|
|
90
|
+
this.isConnected = true;
|
|
91
|
+
this.reconnectAttempts = 0;
|
|
92
|
+
setLastConnected();
|
|
93
|
+
this.startPingInterval();
|
|
94
|
+
logger.success(`Connected as ${message.agentName} (${message.agentId})`);
|
|
95
|
+
this.emit('connected', message.agentId, message.agentName);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
logger.error(`Authentication failed: ${message.error}`);
|
|
99
|
+
this.shouldReconnect = false;
|
|
100
|
+
this.emit('authFailed', message.error || 'Unknown error');
|
|
101
|
+
this.disconnect();
|
|
102
|
+
}
|
|
103
|
+
break;
|
|
104
|
+
case 'server.terminal.create':
|
|
105
|
+
logger.debug(`Create terminal: ${message.terminalId}`);
|
|
106
|
+
this.emit('terminalCreate', message.terminalId, message.cols, message.rows, {
|
|
107
|
+
cwd: message.cwd,
|
|
108
|
+
shell: message.shell,
|
|
109
|
+
env: message.env,
|
|
110
|
+
});
|
|
111
|
+
break;
|
|
112
|
+
case 'server.terminal.input':
|
|
113
|
+
this.emit('terminalInput', message.terminalId, message.data);
|
|
114
|
+
break;
|
|
115
|
+
case 'server.terminal.resize':
|
|
116
|
+
logger.debug(`Resize terminal ${message.terminalId} to ${message.cols}x${message.rows}`);
|
|
117
|
+
this.emit('terminalResize', message.terminalId, message.cols, message.rows);
|
|
118
|
+
break;
|
|
119
|
+
case 'server.terminal.stop':
|
|
120
|
+
logger.debug(`Stop terminal: ${message.terminalId}`);
|
|
121
|
+
this.emit('terminalStop', message.terminalId);
|
|
122
|
+
break;
|
|
123
|
+
case 'server.pong':
|
|
124
|
+
this.handlePong();
|
|
125
|
+
break;
|
|
126
|
+
default:
|
|
127
|
+
logger.warn(`Unknown message type: ${message.type}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
logger.error(`Failed to parse message: ${error}`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Handle connection close
|
|
136
|
+
*/
|
|
137
|
+
handleClose(code, reason) {
|
|
138
|
+
this.isConnected = false;
|
|
139
|
+
this.stopPingInterval();
|
|
140
|
+
logger.warn(`Disconnected: ${reason || 'Connection closed'} (code: ${code})`);
|
|
141
|
+
this.emit('disconnected', reason || 'Connection closed');
|
|
142
|
+
if (this.shouldReconnect) {
|
|
143
|
+
this.scheduleReconnect();
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Schedule a reconnection attempt
|
|
148
|
+
*/
|
|
149
|
+
scheduleReconnect() {
|
|
150
|
+
if (this.reconnectTimeout) {
|
|
151
|
+
clearTimeout(this.reconnectTimeout);
|
|
152
|
+
}
|
|
153
|
+
this.reconnectAttempts++;
|
|
154
|
+
if (this.reconnectAttempts > this.maxReconnectAttempts) {
|
|
155
|
+
logger.error('Max reconnection attempts reached. Giving up.');
|
|
156
|
+
this.shouldReconnect = false;
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
// Exponential backoff with jitter
|
|
160
|
+
const delay = Math.min(AGENT_WS_RECONNECT_DELAY * Math.pow(2, this.reconnectAttempts - 1) + Math.random() * 1000, 60000 // Max 60 seconds
|
|
161
|
+
);
|
|
162
|
+
logger.info(`Reconnecting in ${Math.round(delay / 1000)}s (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts})...`);
|
|
163
|
+
this.reconnectTimeout = setTimeout(() => {
|
|
164
|
+
this.doConnect();
|
|
165
|
+
}, delay);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Start ping interval for keepalive
|
|
169
|
+
*/
|
|
170
|
+
startPingInterval() {
|
|
171
|
+
this.stopPingInterval();
|
|
172
|
+
this.pingInterval = setInterval(() => {
|
|
173
|
+
if (this.isConnected) {
|
|
174
|
+
this.sendPing();
|
|
175
|
+
}
|
|
176
|
+
}, PING_INTERVAL);
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Stop ping interval
|
|
180
|
+
*/
|
|
181
|
+
stopPingInterval() {
|
|
182
|
+
if (this.pingInterval) {
|
|
183
|
+
clearInterval(this.pingInterval);
|
|
184
|
+
this.pingInterval = null;
|
|
185
|
+
}
|
|
186
|
+
if (this.pongTimeout) {
|
|
187
|
+
clearTimeout(this.pongTimeout);
|
|
188
|
+
this.pongTimeout = null;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Send ping message
|
|
193
|
+
*/
|
|
194
|
+
sendPing() {
|
|
195
|
+
this.send({ type: 'agent.ping' });
|
|
196
|
+
// Set timeout for pong response
|
|
197
|
+
this.pongTimeout = setTimeout(() => {
|
|
198
|
+
logger.warn('Pong timeout, reconnecting...');
|
|
199
|
+
this.ws?.terminate();
|
|
200
|
+
}, PONG_TIMEOUT);
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Handle pong response
|
|
204
|
+
*/
|
|
205
|
+
handlePong() {
|
|
206
|
+
if (this.pongTimeout) {
|
|
207
|
+
clearTimeout(this.pongTimeout);
|
|
208
|
+
this.pongTimeout = null;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Send a message to the server
|
|
213
|
+
*/
|
|
214
|
+
send(message) {
|
|
215
|
+
if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {
|
|
216
|
+
logger.warn('Cannot send: not connected');
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
try {
|
|
220
|
+
this.ws.send(JSON.stringify(message));
|
|
221
|
+
return true;
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
logger.error(`Failed to send message: ${error}`);
|
|
225
|
+
return false;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Send terminal output to server
|
|
230
|
+
*/
|
|
231
|
+
sendTerminalOutput(terminalId, data) {
|
|
232
|
+
this.send({
|
|
233
|
+
type: 'agent.terminal.output',
|
|
234
|
+
terminalId,
|
|
235
|
+
data,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Send terminal status update
|
|
240
|
+
*/
|
|
241
|
+
sendTerminalStatus(terminalId, status, error) {
|
|
242
|
+
this.send({
|
|
243
|
+
type: 'agent.terminal.status',
|
|
244
|
+
terminalId,
|
|
245
|
+
status,
|
|
246
|
+
error,
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Send terminal CWD update
|
|
251
|
+
*/
|
|
252
|
+
sendTerminalCwd(terminalId, cwd) {
|
|
253
|
+
this.send({
|
|
254
|
+
type: 'agent.terminal.cwd',
|
|
255
|
+
terminalId,
|
|
256
|
+
cwd,
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Send terminal working state
|
|
261
|
+
*/
|
|
262
|
+
sendTerminalWorking(terminalId, isWorking) {
|
|
263
|
+
this.send({
|
|
264
|
+
type: 'agent.terminal.working',
|
|
265
|
+
terminalId,
|
|
266
|
+
isWorking,
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Send terminal exit notification
|
|
271
|
+
*/
|
|
272
|
+
sendTerminalExit(terminalId, exitCode) {
|
|
273
|
+
this.send({
|
|
274
|
+
type: 'agent.terminal.exit',
|
|
275
|
+
terminalId,
|
|
276
|
+
exitCode,
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Disconnect from the server
|
|
281
|
+
*/
|
|
282
|
+
disconnect() {
|
|
283
|
+
this.shouldReconnect = false;
|
|
284
|
+
if (this.reconnectTimeout) {
|
|
285
|
+
clearTimeout(this.reconnectTimeout);
|
|
286
|
+
this.reconnectTimeout = null;
|
|
287
|
+
}
|
|
288
|
+
this.stopPingInterval();
|
|
289
|
+
if (this.ws) {
|
|
290
|
+
this.ws.close();
|
|
291
|
+
this.ws = null;
|
|
292
|
+
}
|
|
293
|
+
this.isConnected = false;
|
|
294
|
+
logger.info('Disconnected');
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Check if connected
|
|
298
|
+
*/
|
|
299
|
+
get connected() {
|
|
300
|
+
return this.isConnected;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
//# sourceMappingURL=ws-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws-client.js","sourceRoot":"","sources":["../src/ws-client.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "termify-agent",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Termify Agent CLI - Connect your local terminal to Termify",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"termify-agent": "./bin/termify-agent.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"dev": "tsc --watch",
|
|
13
|
+
"start": "node dist/index.js",
|
|
14
|
+
"lint": "eslint src --ext .ts",
|
|
15
|
+
"clean": "rm -rf dist"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"termify",
|
|
19
|
+
"terminal",
|
|
20
|
+
"agent",
|
|
21
|
+
"cli"
|
|
22
|
+
],
|
|
23
|
+
"author": "justdiego",
|
|
24
|
+
"license": "MIT",
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"chalk": "^5.3.0",
|
|
27
|
+
"commander": "^12.0.0",
|
|
28
|
+
"conf": "^12.0.0",
|
|
29
|
+
"node-machine-id": "^1.1.12",
|
|
30
|
+
"node-pty": "^1.0.0",
|
|
31
|
+
"open": "^10.0.0",
|
|
32
|
+
"ora": "^8.0.1",
|
|
33
|
+
"ws": "^8.16.0"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@types/node": "^20.11.0",
|
|
37
|
+
"@types/ws": "^8.5.10",
|
|
38
|
+
"typescript": "^5.3.0"
|
|
39
|
+
},
|
|
40
|
+
"engines": {
|
|
41
|
+
"node": ">=18.0.0"
|
|
42
|
+
},
|
|
43
|
+
"files": [
|
|
44
|
+
"dist",
|
|
45
|
+
"bin"
|
|
46
|
+
]
|
|
47
|
+
}
|