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
package/dist/config.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import Conf from 'conf';
|
|
2
|
+
import { getMachineId } from './utils/machine-id.js';
|
|
3
|
+
const DEFAULT_SERVER_URL = 'https://api.termify.io';
|
|
4
|
+
const DEFAULT_WS_URL = 'wss://api.termify.io/ws/agent';
|
|
5
|
+
const config = new Conf({
|
|
6
|
+
projectName: 'termify-agent',
|
|
7
|
+
defaults: {
|
|
8
|
+
accessToken: null,
|
|
9
|
+
agentId: null,
|
|
10
|
+
machineId: getMachineId(),
|
|
11
|
+
serverUrl: DEFAULT_SERVER_URL,
|
|
12
|
+
wsUrl: DEFAULT_WS_URL,
|
|
13
|
+
lastConnected: null,
|
|
14
|
+
},
|
|
15
|
+
});
|
|
16
|
+
export function getConfig() {
|
|
17
|
+
return {
|
|
18
|
+
accessToken: config.get('accessToken'),
|
|
19
|
+
agentId: config.get('agentId'),
|
|
20
|
+
machineId: config.get('machineId'),
|
|
21
|
+
serverUrl: config.get('serverUrl'),
|
|
22
|
+
wsUrl: config.get('wsUrl'),
|
|
23
|
+
lastConnected: config.get('lastConnected'),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export function setAccessToken(token, agentId) {
|
|
27
|
+
config.set('accessToken', token);
|
|
28
|
+
config.set('agentId', agentId);
|
|
29
|
+
}
|
|
30
|
+
export function setServerUrl(url) {
|
|
31
|
+
config.set('serverUrl', url);
|
|
32
|
+
// Derive WebSocket URL from server URL
|
|
33
|
+
const wsUrl = url.replace(/^http/, 'ws') + '/ws/agent';
|
|
34
|
+
config.set('wsUrl', wsUrl);
|
|
35
|
+
}
|
|
36
|
+
export function setLastConnected() {
|
|
37
|
+
config.set('lastConnected', new Date().toISOString());
|
|
38
|
+
}
|
|
39
|
+
export function clearConfig() {
|
|
40
|
+
config.set('accessToken', null);
|
|
41
|
+
config.set('agentId', null);
|
|
42
|
+
config.set('lastConnected', null);
|
|
43
|
+
}
|
|
44
|
+
export function isConfigured() {
|
|
45
|
+
const cfg = getConfig();
|
|
46
|
+
return cfg.accessToken !== null && cfg.agentId !== null;
|
|
47
|
+
}
|
|
48
|
+
export function getConfigPath() {
|
|
49
|
+
return config.path;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAWrD,MAAM,kBAAkB,GAAG,wBAAwB,CAAC;AACpD,MAAM,cAAc,GAAG,+BAA+B,CAAC;AAEvD,MAAM,MAAM,GAAG,IAAI,IAAI,CAAc;IACnC,WAAW,EAAE,eAAe;IAC5B,QAAQ,EAAE;QACR,WAAW,EAAE,IAAI;QACjB,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,YAAY,EAAE;QACzB,SAAS,EAAE,kBAAkB;QAC7B,KAAK,EAAE,cAAc;QACrB,aAAa,EAAE,IAAI;KACpB;CACF,CAAC,CAAC;AAEH,MAAM,UAAU,SAAS;IACvB,OAAO;QACL,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC;QACtC,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;QAC9B,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC;QAClC,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC;QAClC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;QAC1B,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC;KAC3C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAa,EAAE,OAAe;IAC3D,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IACjC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IAC7B,uCAAuC;IACvC,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,WAAW,CAAC;IACvD,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IAChC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC5B,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;IACxB,OAAO,GAAG,CAAC,WAAW,KAAK,IAAI,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -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,190 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import ora from 'ora';
|
|
5
|
+
import { Agent } from './agent.js';
|
|
6
|
+
import { login, logout } from './auth.js';
|
|
7
|
+
import { getConfig, isConfigured, getConfigPath } from './config.js';
|
|
8
|
+
import { setLogLevel, setQuietMode } from './utils/logger.js';
|
|
9
|
+
import { getSystemInfo } from './utils/machine-id.js';
|
|
10
|
+
const VERSION = '1.0.0';
|
|
11
|
+
const program = new Command();
|
|
12
|
+
program
|
|
13
|
+
.name('termify-agent')
|
|
14
|
+
.description('Termify Agent - Connect your local terminal to Termify')
|
|
15
|
+
.version(VERSION);
|
|
16
|
+
// Global options
|
|
17
|
+
program
|
|
18
|
+
.option('-q, --quiet', 'Suppress non-error output')
|
|
19
|
+
.option('-v, --verbose', 'Enable verbose logging')
|
|
20
|
+
.hook('preAction', (thisCommand) => {
|
|
21
|
+
const opts = thisCommand.opts();
|
|
22
|
+
if (opts.quiet)
|
|
23
|
+
setQuietMode(true);
|
|
24
|
+
if (opts.verbose)
|
|
25
|
+
setLogLevel('debug');
|
|
26
|
+
});
|
|
27
|
+
/**
|
|
28
|
+
* Login command - authenticate with Termify
|
|
29
|
+
*/
|
|
30
|
+
program
|
|
31
|
+
.command('login')
|
|
32
|
+
.description('Authenticate with Termify')
|
|
33
|
+
.option('-s, --server <url>', 'Termify server URL')
|
|
34
|
+
.option('-c, --code <code>', 'Pairing code (if you already have one)')
|
|
35
|
+
.action(async (options) => {
|
|
36
|
+
const success = await login({
|
|
37
|
+
serverUrl: options.server,
|
|
38
|
+
pairingCode: options.code,
|
|
39
|
+
});
|
|
40
|
+
process.exit(success ? 0 : 1);
|
|
41
|
+
});
|
|
42
|
+
/**
|
|
43
|
+
* Logout command - clear credentials
|
|
44
|
+
*/
|
|
45
|
+
program
|
|
46
|
+
.command('logout')
|
|
47
|
+
.description('Log out and clear stored credentials')
|
|
48
|
+
.action(async () => {
|
|
49
|
+
await logout();
|
|
50
|
+
process.exit(0);
|
|
51
|
+
});
|
|
52
|
+
/**
|
|
53
|
+
* Start command - run the agent
|
|
54
|
+
*/
|
|
55
|
+
program
|
|
56
|
+
.command('start')
|
|
57
|
+
.description('Start the agent and connect to Termify')
|
|
58
|
+
.option('-d, --daemon', 'Run as background daemon (not implemented yet)')
|
|
59
|
+
.action(async (options) => {
|
|
60
|
+
if (!isConfigured()) {
|
|
61
|
+
console.log(chalk.red('Error: Not logged in.'));
|
|
62
|
+
console.log(chalk.gray('Run `termify-agent login` first.'));
|
|
63
|
+
process.exit(1);
|
|
64
|
+
}
|
|
65
|
+
if (options.daemon) {
|
|
66
|
+
console.log(chalk.yellow('Daemon mode is not yet implemented.'));
|
|
67
|
+
console.log(chalk.gray('For now, run the agent in a terminal or use a process manager like pm2.'));
|
|
68
|
+
process.exit(1);
|
|
69
|
+
}
|
|
70
|
+
const agent = new Agent();
|
|
71
|
+
console.log(chalk.bold('\n🚀 Termify Agent\n'));
|
|
72
|
+
const spinner = ora('Connecting to Termify...').start();
|
|
73
|
+
agent.on('connected', (agentId, agentName) => {
|
|
74
|
+
spinner.succeed(chalk.green(`Connected as ${agentName}`));
|
|
75
|
+
console.log(chalk.gray(` Agent ID: ${agentId}`));
|
|
76
|
+
console.log(chalk.gray(` Terminals: ${agent.terminalCount}`));
|
|
77
|
+
console.log(chalk.gray('\nWaiting for terminal requests... (Ctrl+C to stop)\n'));
|
|
78
|
+
});
|
|
79
|
+
agent.on('disconnected', (reason) => {
|
|
80
|
+
console.log(chalk.yellow(`\nDisconnected: ${reason}`));
|
|
81
|
+
console.log(chalk.gray('Attempting to reconnect...'));
|
|
82
|
+
});
|
|
83
|
+
agent.on('authFailed', (error) => {
|
|
84
|
+
spinner.fail(chalk.red(`Authentication failed: ${error}`));
|
|
85
|
+
console.log(chalk.gray('\nYour credentials may have expired.'));
|
|
86
|
+
console.log(chalk.gray('Run `termify-agent login` to re-authenticate.'));
|
|
87
|
+
process.exit(1);
|
|
88
|
+
});
|
|
89
|
+
agent.on('stopped', () => {
|
|
90
|
+
console.log(chalk.gray('\nAgent stopped.'));
|
|
91
|
+
});
|
|
92
|
+
const started = agent.start({ daemon: options.daemon });
|
|
93
|
+
if (!started) {
|
|
94
|
+
spinner.fail('Failed to start agent');
|
|
95
|
+
process.exit(1);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
/**
|
|
99
|
+
* Stop command - placeholder for daemon mode
|
|
100
|
+
*/
|
|
101
|
+
program
|
|
102
|
+
.command('stop')
|
|
103
|
+
.description('Stop the running agent daemon')
|
|
104
|
+
.action(() => {
|
|
105
|
+
console.log(chalk.yellow('Daemon mode is not yet implemented.'));
|
|
106
|
+
console.log(chalk.gray('Use Ctrl+C to stop the foreground agent.'));
|
|
107
|
+
process.exit(1);
|
|
108
|
+
});
|
|
109
|
+
/**
|
|
110
|
+
* Status command - show current status
|
|
111
|
+
*/
|
|
112
|
+
program
|
|
113
|
+
.command('status')
|
|
114
|
+
.description('Show agent status and configuration')
|
|
115
|
+
.action(() => {
|
|
116
|
+
const config = getConfig();
|
|
117
|
+
const systemInfo = getSystemInfo();
|
|
118
|
+
console.log(chalk.bold('\n📊 Termify Agent Status\n'));
|
|
119
|
+
// Login status
|
|
120
|
+
if (isConfigured()) {
|
|
121
|
+
console.log(chalk.green('✓ Logged in'));
|
|
122
|
+
console.log(chalk.gray(` Agent ID: ${config.agentId}`));
|
|
123
|
+
console.log(chalk.gray(` Last connected: ${config.lastConnected || 'Never'}`));
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
console.log(chalk.red('✗ Not logged in'));
|
|
127
|
+
console.log(chalk.gray(' Run `termify-agent login` to authenticate'));
|
|
128
|
+
}
|
|
129
|
+
console.log();
|
|
130
|
+
// Configuration
|
|
131
|
+
console.log(chalk.bold('Configuration'));
|
|
132
|
+
console.log(chalk.gray(` Server URL: ${config.serverUrl}`));
|
|
133
|
+
console.log(chalk.gray(` Config file: ${getConfigPath()}`));
|
|
134
|
+
console.log();
|
|
135
|
+
// System info
|
|
136
|
+
console.log(chalk.bold('System'));
|
|
137
|
+
console.log(chalk.gray(` Machine ID: ${config.machineId}`));
|
|
138
|
+
console.log(chalk.gray(` Hostname: ${systemInfo.hostname}`));
|
|
139
|
+
console.log(chalk.gray(` OS: ${systemInfo.os}`));
|
|
140
|
+
console.log(chalk.gray(` Arch: ${systemInfo.arch}`));
|
|
141
|
+
console.log();
|
|
142
|
+
});
|
|
143
|
+
/**
|
|
144
|
+
* Config command - manage configuration
|
|
145
|
+
*/
|
|
146
|
+
program
|
|
147
|
+
.command('config')
|
|
148
|
+
.description('Show or modify configuration')
|
|
149
|
+
.option('--server <url>', 'Set server URL')
|
|
150
|
+
.option('--show', 'Show current configuration')
|
|
151
|
+
.action(async (options) => {
|
|
152
|
+
if (options.server) {
|
|
153
|
+
const { setServerUrl } = await import('./config.js');
|
|
154
|
+
setServerUrl(options.server);
|
|
155
|
+
console.log(chalk.green(`✓ Server URL updated to: ${options.server}`));
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
// Default: show config
|
|
159
|
+
const config = getConfig();
|
|
160
|
+
console.log(chalk.bold('\n⚙️ Configuration\n'));
|
|
161
|
+
console.log(JSON.stringify(config, null, 2));
|
|
162
|
+
console.log(chalk.gray(`\nConfig file: ${getConfigPath()}`));
|
|
163
|
+
});
|
|
164
|
+
/**
|
|
165
|
+
* Logs command - placeholder
|
|
166
|
+
*/
|
|
167
|
+
program
|
|
168
|
+
.command('logs')
|
|
169
|
+
.description('View agent logs')
|
|
170
|
+
.option('-f, --follow', 'Follow log output')
|
|
171
|
+
.option('-n, --lines <number>', 'Number of lines to show', '50')
|
|
172
|
+
.action(() => {
|
|
173
|
+
console.log(chalk.yellow('Log viewing is not yet implemented.'));
|
|
174
|
+
console.log(chalk.gray('Logs are printed to stdout when running in foreground mode.'));
|
|
175
|
+
});
|
|
176
|
+
// Show help if no command
|
|
177
|
+
if (process.argv.length === 2) {
|
|
178
|
+
console.log(chalk.bold(`
|
|
179
|
+
╔════════════════════════════════════════════╗
|
|
180
|
+
║ ║
|
|
181
|
+
║ 🖥️ Termify Agent v${VERSION} ║
|
|
182
|
+
║ ║
|
|
183
|
+
║ Connect your local terminal to Termify ║
|
|
184
|
+
║ ║
|
|
185
|
+
╚════════════════════════════════════════════╝
|
|
186
|
+
`));
|
|
187
|
+
program.help();
|
|
188
|
+
}
|
|
189
|
+
program.parse();
|
|
190
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import * as pty from 'node-pty';
|
|
2
|
+
export interface PTYOptions {
|
|
3
|
+
cols?: number;
|
|
4
|
+
rows?: number;
|
|
5
|
+
cwd?: string;
|
|
6
|
+
shell?: string;
|
|
7
|
+
env?: Record<string, string>;
|
|
8
|
+
}
|
|
9
|
+
export interface PTYInstance {
|
|
10
|
+
id: string;
|
|
11
|
+
pty: pty.IPty;
|
|
12
|
+
cols: number;
|
|
13
|
+
rows: number;
|
|
14
|
+
}
|
|
15
|
+
type DataCallback = (terminalId: string, data: string) => void;
|
|
16
|
+
type ExitCallback = (terminalId: string, exitCode: number) => void;
|
|
17
|
+
/**
|
|
18
|
+
* Manages local PTY instances for agent terminals
|
|
19
|
+
*/
|
|
20
|
+
export declare class PTYManager {
|
|
21
|
+
private instances;
|
|
22
|
+
private onData;
|
|
23
|
+
private onExit;
|
|
24
|
+
/**
|
|
25
|
+
* Get the default shell for the current platform
|
|
26
|
+
*/
|
|
27
|
+
private getDefaultShell;
|
|
28
|
+
/**
|
|
29
|
+
* Set callback for terminal output
|
|
30
|
+
*/
|
|
31
|
+
setDataHandler(callback: DataCallback): void;
|
|
32
|
+
/**
|
|
33
|
+
* Set callback for terminal exit
|
|
34
|
+
*/
|
|
35
|
+
setExitHandler(callback: ExitCallback): void;
|
|
36
|
+
/**
|
|
37
|
+
* Create a new PTY instance
|
|
38
|
+
*/
|
|
39
|
+
create(terminalId: string, options?: PTYOptions): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Write data to a terminal
|
|
42
|
+
*/
|
|
43
|
+
write(terminalId: string, data: string): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Resize a terminal
|
|
46
|
+
*/
|
|
47
|
+
resize(terminalId: string, cols: number, rows: number): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Kill a terminal
|
|
50
|
+
*/
|
|
51
|
+
kill(terminalId: string): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Get current working directory of a terminal
|
|
54
|
+
*/
|
|
55
|
+
getCwd(terminalId: string): string | null;
|
|
56
|
+
/**
|
|
57
|
+
* Check if a terminal exists
|
|
58
|
+
*/
|
|
59
|
+
has(terminalId: string): boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Get count of active terminals
|
|
62
|
+
*/
|
|
63
|
+
get count(): number;
|
|
64
|
+
/**
|
|
65
|
+
* Kill all terminals
|
|
66
|
+
*/
|
|
67
|
+
killAll(): void;
|
|
68
|
+
}
|
|
69
|
+
export {};
|
|
70
|
+
//# sourceMappingURL=pty-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pty-manager.d.ts","sourceRoot":"","sources":["../src/pty-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAIhC,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,KAAK,YAAY,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;AAC/D,KAAK,YAAY,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;AAEnE;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,SAAS,CAAuC;IACxD,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,MAAM,CAA6B;IAE3C;;OAEG;IACH,OAAO,CAAC,eAAe;IAOvB;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;IAI5C;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;IAI5C;;OAEG;IACH,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,UAAe,GAAG,OAAO;IA+D7D;;OAEG;IACH,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IAgBhD;;OAEG;IACH,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IAmB/D;;OAEG;IACH,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAkBjC;;OAEG;IACH,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAWzC;;OAEG;IACH,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAIhC;;OAEG;IACH,IAAI,KAAK,IAAI,MAAM,CAElB;IAED;;OAEG;IACH,OAAO,IAAI,IAAI;CAYhB"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import * as pty from 'node-pty';
|
|
2
|
+
import os from 'os';
|
|
3
|
+
import { logger } from './utils/logger.js';
|
|
4
|
+
/**
|
|
5
|
+
* Manages local PTY instances for agent terminals
|
|
6
|
+
*/
|
|
7
|
+
export class PTYManager {
|
|
8
|
+
instances = new Map();
|
|
9
|
+
onData = null;
|
|
10
|
+
onExit = null;
|
|
11
|
+
/**
|
|
12
|
+
* Get the default shell for the current platform
|
|
13
|
+
*/
|
|
14
|
+
getDefaultShell() {
|
|
15
|
+
if (os.platform() === 'win32') {
|
|
16
|
+
return process.env.COMSPEC || 'cmd.exe';
|
|
17
|
+
}
|
|
18
|
+
return process.env.SHELL || '/bin/bash';
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Set callback for terminal output
|
|
22
|
+
*/
|
|
23
|
+
setDataHandler(callback) {
|
|
24
|
+
this.onData = callback;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Set callback for terminal exit
|
|
28
|
+
*/
|
|
29
|
+
setExitHandler(callback) {
|
|
30
|
+
this.onExit = callback;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Create a new PTY instance
|
|
34
|
+
*/
|
|
35
|
+
create(terminalId, options = {}) {
|
|
36
|
+
if (this.instances.has(terminalId)) {
|
|
37
|
+
logger.warn(`Terminal ${terminalId} already exists`);
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
const cols = options.cols || 80;
|
|
41
|
+
const rows = options.rows || 24;
|
|
42
|
+
const shell = options.shell || this.getDefaultShell();
|
|
43
|
+
const cwd = options.cwd || os.homedir();
|
|
44
|
+
// Merge environment variables
|
|
45
|
+
const env = {
|
|
46
|
+
...process.env,
|
|
47
|
+
...options.env,
|
|
48
|
+
TERM: 'xterm-256color',
|
|
49
|
+
COLORTERM: 'truecolor',
|
|
50
|
+
};
|
|
51
|
+
logger.debug(`Creating PTY: shell=${shell}, cwd=${cwd}, cols=${cols}, rows=${rows}`);
|
|
52
|
+
try {
|
|
53
|
+
const ptyProcess = pty.spawn(shell, [], {
|
|
54
|
+
name: 'xterm-256color',
|
|
55
|
+
cols,
|
|
56
|
+
rows,
|
|
57
|
+
cwd,
|
|
58
|
+
env: env,
|
|
59
|
+
});
|
|
60
|
+
const instance = {
|
|
61
|
+
id: terminalId,
|
|
62
|
+
pty: ptyProcess,
|
|
63
|
+
cols,
|
|
64
|
+
rows,
|
|
65
|
+
};
|
|
66
|
+
this.instances.set(terminalId, instance);
|
|
67
|
+
// Handle output
|
|
68
|
+
ptyProcess.onData((data) => {
|
|
69
|
+
if (this.onData) {
|
|
70
|
+
this.onData(terminalId, data);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
// Handle exit
|
|
74
|
+
ptyProcess.onExit(({ exitCode }) => {
|
|
75
|
+
logger.debug(`Terminal ${terminalId} exited with code ${exitCode}`);
|
|
76
|
+
this.instances.delete(terminalId);
|
|
77
|
+
if (this.onExit) {
|
|
78
|
+
this.onExit(terminalId, exitCode);
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
logger.info(`Created terminal ${terminalId}`);
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
logger.error(`Failed to create terminal ${terminalId}: ${error}`);
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Write data to a terminal
|
|
91
|
+
*/
|
|
92
|
+
write(terminalId, data) {
|
|
93
|
+
const instance = this.instances.get(terminalId);
|
|
94
|
+
if (!instance) {
|
|
95
|
+
logger.warn(`Terminal ${terminalId} not found`);
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
try {
|
|
99
|
+
instance.pty.write(data);
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
logger.error(`Failed to write to terminal ${terminalId}: ${error}`);
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Resize a terminal
|
|
109
|
+
*/
|
|
110
|
+
resize(terminalId, cols, rows) {
|
|
111
|
+
const instance = this.instances.get(terminalId);
|
|
112
|
+
if (!instance) {
|
|
113
|
+
logger.warn(`Terminal ${terminalId} not found`);
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
try {
|
|
117
|
+
instance.pty.resize(cols, rows);
|
|
118
|
+
instance.cols = cols;
|
|
119
|
+
instance.rows = rows;
|
|
120
|
+
logger.debug(`Resized terminal ${terminalId} to ${cols}x${rows}`);
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
logger.error(`Failed to resize terminal ${terminalId}: ${error}`);
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Kill a terminal
|
|
130
|
+
*/
|
|
131
|
+
kill(terminalId) {
|
|
132
|
+
const instance = this.instances.get(terminalId);
|
|
133
|
+
if (!instance) {
|
|
134
|
+
logger.warn(`Terminal ${terminalId} not found`);
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
try {
|
|
138
|
+
instance.pty.kill();
|
|
139
|
+
this.instances.delete(terminalId);
|
|
140
|
+
logger.info(`Killed terminal ${terminalId}`);
|
|
141
|
+
return true;
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
logger.error(`Failed to kill terminal ${terminalId}: ${error}`);
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Get current working directory of a terminal
|
|
150
|
+
*/
|
|
151
|
+
getCwd(terminalId) {
|
|
152
|
+
const instance = this.instances.get(terminalId);
|
|
153
|
+
if (!instance) {
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
// node-pty doesn't provide cwd directly, this would need OS-specific implementation
|
|
157
|
+
// For now, return null and let the shell report it via escape sequences
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Check if a terminal exists
|
|
162
|
+
*/
|
|
163
|
+
has(terminalId) {
|
|
164
|
+
return this.instances.has(terminalId);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Get count of active terminals
|
|
168
|
+
*/
|
|
169
|
+
get count() {
|
|
170
|
+
return this.instances.size;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Kill all terminals
|
|
174
|
+
*/
|
|
175
|
+
killAll() {
|
|
176
|
+
for (const [id, instance] of this.instances) {
|
|
177
|
+
try {
|
|
178
|
+
instance.pty.kill();
|
|
179
|
+
logger.debug(`Killed terminal ${id}`);
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
logger.error(`Failed to kill terminal ${id}: ${error}`);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
this.instances.clear();
|
|
186
|
+
logger.info('All terminals killed');
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=pty-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pty-manager.js","sourceRoot":"","sources":["../src/pty-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
2
|
+
export declare function setLogLevel(level: LogLevel): void;
|
|
3
|
+
export declare function setQuietMode(quiet: boolean): void;
|
|
4
|
+
export declare const logger: {
|
|
5
|
+
debug(message: string, ...args: unknown[]): void;
|
|
6
|
+
info(message: string, ...args: unknown[]): void;
|
|
7
|
+
success(message: string, ...args: unknown[]): void;
|
|
8
|
+
warn(message: string, ...args: unknown[]): void;
|
|
9
|
+
error(message: string, ...args: unknown[]): void;
|
|
10
|
+
print(message: string): void;
|
|
11
|
+
critical(message: string): void;
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAY3D,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAEjD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAEjD;AAWD,eAAO,MAAM,MAAM;mBACF,MAAM,WAAW,OAAO,EAAE,GAAG,IAAI;kBAMlC,MAAM,WAAW,OAAO,EAAE,GAAG,IAAI;qBAM9B,MAAM,WAAW,OAAO,EAAE,GAAG,IAAI;kBAMpC,MAAM,WAAW,OAAO,EAAE,GAAG,IAAI;mBAMhC,MAAM,WAAW,OAAO,EAAE,GAAG,IAAI;mBAOjC,MAAM,GAAG,IAAI;sBAOV,MAAM,GAAG,IAAI;CAGhC,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
let currentLogLevel = 'info';
|
|
3
|
+
let quietMode = false;
|
|
4
|
+
const LOG_LEVELS = {
|
|
5
|
+
debug: 0,
|
|
6
|
+
info: 1,
|
|
7
|
+
warn: 2,
|
|
8
|
+
error: 3,
|
|
9
|
+
};
|
|
10
|
+
export function setLogLevel(level) {
|
|
11
|
+
currentLogLevel = level;
|
|
12
|
+
}
|
|
13
|
+
export function setQuietMode(quiet) {
|
|
14
|
+
quietMode = quiet;
|
|
15
|
+
}
|
|
16
|
+
function shouldLog(level) {
|
|
17
|
+
if (quietMode && level !== 'error')
|
|
18
|
+
return false;
|
|
19
|
+
return LOG_LEVELS[level] >= LOG_LEVELS[currentLogLevel];
|
|
20
|
+
}
|
|
21
|
+
function timestamp() {
|
|
22
|
+
return new Date().toISOString().replace('T', ' ').substring(0, 19);
|
|
23
|
+
}
|
|
24
|
+
export const logger = {
|
|
25
|
+
debug(message, ...args) {
|
|
26
|
+
if (shouldLog('debug')) {
|
|
27
|
+
console.log(chalk.gray(`[${timestamp()}] [DEBUG] ${message}`), ...args);
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
info(message, ...args) {
|
|
31
|
+
if (shouldLog('info')) {
|
|
32
|
+
console.log(chalk.blue(`[${timestamp()}] [INFO] ${message}`), ...args);
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
success(message, ...args) {
|
|
36
|
+
if (shouldLog('info')) {
|
|
37
|
+
console.log(chalk.green(`[${timestamp()}] [SUCCESS] ${message}`), ...args);
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
warn(message, ...args) {
|
|
41
|
+
if (shouldLog('warn')) {
|
|
42
|
+
console.warn(chalk.yellow(`[${timestamp()}] [WARN] ${message}`), ...args);
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
error(message, ...args) {
|
|
46
|
+
if (shouldLog('error')) {
|
|
47
|
+
console.error(chalk.red(`[${timestamp()}] [ERROR] ${message}`), ...args);
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
// For user-facing messages (always shown unless quiet)
|
|
51
|
+
print(message) {
|
|
52
|
+
if (!quietMode) {
|
|
53
|
+
console.log(message);
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
// For critical messages (always shown)
|
|
57
|
+
critical(message) {
|
|
58
|
+
console.error(chalk.red.bold(message));
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,IAAI,eAAe,GAAa,MAAM,CAAC;AACvC,IAAI,SAAS,GAAG,KAAK,CAAC;AAEtB,MAAM,UAAU,GAA6B;IAC3C,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,KAAe;IACzC,eAAe,GAAG,KAAK,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,SAAS,GAAG,KAAK,CAAC;AACpB,CAAC;AAED,SAAS,SAAS,CAAC,KAAe;IAChC,IAAI,SAAS,IAAI,KAAK,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IACjD,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,eAAe,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,KAAK,CAAC,OAAe,EAAE,GAAG,IAAe;QACvC,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,SAAS,EAAE,aAAa,OAAO,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,GAAG,IAAe;QACtC,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,SAAS,EAAE,YAAY,OAAO,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAED,OAAO,CAAC,OAAe,EAAE,GAAG,IAAe;QACzC,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,SAAS,EAAE,eAAe,OAAO,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,GAAG,IAAe;QACtC,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,SAAS,EAAE,YAAY,OAAO,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,GAAG,IAAe;QACvC,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,SAAS,EAAE,aAAa,OAAO,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,uDAAuD;IACvD,KAAK,CAAC,OAAe;QACnB,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,uCAAuC;IACvC,QAAQ,CAAC,OAAe;QACtB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACzC,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Get a unique machine identifier
|
|
3
|
+
* Uses node-machine-id with fallback to hostname-based hash
|
|
4
|
+
*/
|
|
5
|
+
export declare function getMachineId(): string;
|
|
6
|
+
/**
|
|
7
|
+
* Get system information for agent registration
|
|
8
|
+
*/
|
|
9
|
+
export declare function getSystemInfo(): {
|
|
10
|
+
os: string;
|
|
11
|
+
hostname: string;
|
|
12
|
+
arch: string;
|
|
13
|
+
platform: string;
|
|
14
|
+
username: string;
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=machine-id.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"machine-id.d.ts","sourceRoot":"","sources":["../../src/utils/machine-id.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAQrC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAQA"}
|