@leverageaiapps/leverageai-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/LICENSE +21 -0
- package/README.md +175 -0
- package/dist/capture.d.ts +3 -0
- package/dist/capture.d.ts.map +1 -0
- package/dist/capture.js +134 -0
- package/dist/capture.js.map +1 -0
- package/dist/cloudflare-tunnel.d.ts +9 -0
- package/dist/cloudflare-tunnel.d.ts.map +1 -0
- package/dist/cloudflare-tunnel.js +218 -0
- package/dist/cloudflare-tunnel.js.map +1 -0
- package/dist/config.d.ts +7 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +84 -0
- package/dist/config.js.map +1 -0
- package/dist/context-extractor.d.ts +17 -0
- package/dist/context-extractor.d.ts.map +1 -0
- package/dist/context-extractor.js +118 -0
- package/dist/context-extractor.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +85 -0
- package/dist/index.js.map +1 -0
- package/dist/pty.d.ts +20 -0
- package/dist/pty.d.ts.map +1 -0
- package/dist/pty.js +148 -0
- package/dist/pty.js.map +1 -0
- package/dist/relay.d.ts +5 -0
- package/dist/relay.d.ts.map +1 -0
- package/dist/relay.js +131 -0
- package/dist/relay.js.map +1 -0
- package/dist/session.d.ts +5 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +250 -0
- package/dist/session.js.map +1 -0
- package/dist/voice-recognition-modelscope.d.ts +50 -0
- package/dist/voice-recognition-modelscope.d.ts.map +1 -0
- package/dist/voice-recognition-modelscope.js +171 -0
- package/dist/voice-recognition-modelscope.js.map +1 -0
- package/dist/web-server.d.ts +6 -0
- package/dist/web-server.d.ts.map +1 -0
- package/dist/web-server.js +1981 -0
- package/dist/web-server.js.map +1 -0
- package/package.json +66 -0
- package/public/index.html +639 -0
- package/public/js/terminal-asr.js +435 -0
- package/public/js/terminal.js +514 -0
- package/public/js/voice-input.js +422 -0
- package/scripts/postinstall.js +66 -0
- package/scripts/verify-install.js +124 -0
package/dist/config.js
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.getConfig = getConfig;
|
|
37
|
+
exports.setConfig = setConfig;
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const os = __importStar(require("os"));
|
|
41
|
+
const CONFIG_DIR = path.join(os.homedir(), '.codingin');
|
|
42
|
+
const CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');
|
|
43
|
+
const DEFAULT_CONFIG = {
|
|
44
|
+
serverUrl: process.env.CODINGIN_SERVER_URL || 'https://codingin.futuretech.social',
|
|
45
|
+
machineId: generateMachineId(),
|
|
46
|
+
};
|
|
47
|
+
function generateMachineId() {
|
|
48
|
+
const chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
|
|
49
|
+
let result = '';
|
|
50
|
+
for (let i = 0; i < 16; i++) {
|
|
51
|
+
result += chars.charAt(Math.floor(Math.random() * chars.length));
|
|
52
|
+
}
|
|
53
|
+
return result;
|
|
54
|
+
}
|
|
55
|
+
function getConfig() {
|
|
56
|
+
try {
|
|
57
|
+
if (fs.existsSync(CONFIG_FILE)) {
|
|
58
|
+
const data = fs.readFileSync(CONFIG_FILE, 'utf-8');
|
|
59
|
+
return { ...DEFAULT_CONFIG, ...JSON.parse(data) };
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
console.error('Error reading config:', error);
|
|
64
|
+
}
|
|
65
|
+
// Create default config
|
|
66
|
+
setConfig(DEFAULT_CONFIG);
|
|
67
|
+
return DEFAULT_CONFIG;
|
|
68
|
+
}
|
|
69
|
+
function setConfig(updates) {
|
|
70
|
+
try {
|
|
71
|
+
if (!fs.existsSync(CONFIG_DIR)) {
|
|
72
|
+
fs.mkdirSync(CONFIG_DIR, { recursive: true });
|
|
73
|
+
}
|
|
74
|
+
const current = fs.existsSync(CONFIG_FILE)
|
|
75
|
+
? JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf-8'))
|
|
76
|
+
: DEFAULT_CONFIG;
|
|
77
|
+
const newConfig = { ...current, ...updates };
|
|
78
|
+
fs.writeFileSync(CONFIG_FILE, JSON.stringify(newConfig, null, 2));
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
console.error('Error writing config:', error);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA,8BAaC;AAED,8BAeC;AAxDD,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AAEzB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AACxD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAOzD,MAAM,cAAc,GAAW;IAC3B,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,oCAAoC;IAClF,SAAS,EAAE,iBAAiB,EAAE;CACjC,CAAC;AAEF,SAAS,iBAAiB;IACtB,MAAM,KAAK,GAAG,sCAAsC,CAAC;IACrD,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,SAAgB,SAAS;IACrB,IAAI,CAAC;QACD,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YACnD,OAAO,EAAE,GAAG,cAAc,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACtD,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC;IAED,wBAAwB;IACxB,SAAS,CAAC,cAAc,CAAC,CAAC;IAC1B,OAAO,cAAc,CAAC;AAC1B,CAAC;AAED,SAAgB,SAAS,CAAC,OAAwB;IAC9C,IAAI,CAAC;QACD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC7B,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,OAAO,GAAG,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;YACtC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YACnD,CAAC,CAAC,cAAc,CAAC;QAErB,MAAM,SAAS,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC;QAC7C,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface ExtractedContext {
|
|
2
|
+
techTerms: string[];
|
|
3
|
+
filePaths: string[];
|
|
4
|
+
recentCommands: string[];
|
|
5
|
+
codeKeywords: string[];
|
|
6
|
+
}
|
|
7
|
+
export declare class ContextExtractor {
|
|
8
|
+
private static readonly TECH_PATTERNS;
|
|
9
|
+
private static readonly COMMON_TECH_TERMS;
|
|
10
|
+
static extractFromBuffer(buffer: string[], limit?: number): ExtractedContext;
|
|
11
|
+
static generateHotwords(context: ExtractedContext): Array<{
|
|
12
|
+
word: string;
|
|
13
|
+
boost: number;
|
|
14
|
+
}>;
|
|
15
|
+
static compressContext(buffer: string[], maxTokens?: number): string;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=context-extractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-extractor.d.ts","sourceRoot":"","sources":["../src/context-extractor.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC7B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,qBAAa,gBAAgB;IACzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAOnC;IAEF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAQvC;IAEF,MAAM,CAAC,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,KAAK,GAAE,MAAY,GAAG,gBAAgB;IAqDjF,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,GAAG,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IA+B1F,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,SAAS,GAAE,MAAY,GAAG,MAAM;CA+B5E"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ContextExtractor = void 0;
|
|
4
|
+
class ContextExtractor {
|
|
5
|
+
static extractFromBuffer(buffer, limit = 100) {
|
|
6
|
+
const recentLines = buffer.slice(-limit).join('\n');
|
|
7
|
+
const techTerms = new Set();
|
|
8
|
+
const filePaths = new Set();
|
|
9
|
+
const commands = new Set();
|
|
10
|
+
const codeKeywords = new Set();
|
|
11
|
+
this.COMMON_TECH_TERMS.forEach(term => techTerms.add(term));
|
|
12
|
+
let match;
|
|
13
|
+
while ((match = this.TECH_PATTERNS.functions.exec(recentLines)) !== null) {
|
|
14
|
+
if (match[2])
|
|
15
|
+
codeKeywords.add(match[2]);
|
|
16
|
+
}
|
|
17
|
+
this.TECH_PATTERNS.imports.lastIndex = 0;
|
|
18
|
+
while ((match = this.TECH_PATTERNS.imports.exec(recentLines)) !== null) {
|
|
19
|
+
if (match[2])
|
|
20
|
+
techTerms.add(match[2]);
|
|
21
|
+
}
|
|
22
|
+
this.TECH_PATTERNS.packages.lastIndex = 0;
|
|
23
|
+
while ((match = this.TECH_PATTERNS.packages.exec(recentLines)) !== null) {
|
|
24
|
+
if (match[3])
|
|
25
|
+
techTerms.add(match[3]);
|
|
26
|
+
}
|
|
27
|
+
this.TECH_PATTERNS.fileExtensions.lastIndex = 0;
|
|
28
|
+
while ((match = this.TECH_PATTERNS.fileExtensions.exec(recentLines)) !== null) {
|
|
29
|
+
if (match[0])
|
|
30
|
+
filePaths.add(match[0]);
|
|
31
|
+
}
|
|
32
|
+
this.TECH_PATTERNS.commands.lastIndex = 0;
|
|
33
|
+
while ((match = this.TECH_PATTERNS.commands.exec(recentLines)) !== null) {
|
|
34
|
+
if (match[1])
|
|
35
|
+
commands.add(match[1]);
|
|
36
|
+
}
|
|
37
|
+
const pathMatches = recentLines.match(/[\.\/]?(?:[\w\-]+\/)+[\w\-\.]+/g);
|
|
38
|
+
if (pathMatches) {
|
|
39
|
+
pathMatches.forEach(path => {
|
|
40
|
+
if (path.length > 3 && path.includes('/')) {
|
|
41
|
+
filePaths.add(path);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
techTerms: Array.from(techTerms).slice(0, 50),
|
|
47
|
+
filePaths: Array.from(filePaths).slice(0, 20),
|
|
48
|
+
recentCommands: Array.from(commands).slice(0, 10),
|
|
49
|
+
codeKeywords: Array.from(codeKeywords).slice(0, 30),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
static generateHotwords(context) {
|
|
53
|
+
const hotwords = [];
|
|
54
|
+
context.techTerms.forEach(term => {
|
|
55
|
+
hotwords.push({ word: term, boost: 2.0 });
|
|
56
|
+
});
|
|
57
|
+
context.codeKeywords.forEach(keyword => {
|
|
58
|
+
hotwords.push({ word: keyword, boost: 3.0 });
|
|
59
|
+
});
|
|
60
|
+
context.filePaths.forEach(path => {
|
|
61
|
+
const filename = path.split('/').pop();
|
|
62
|
+
if (filename) {
|
|
63
|
+
hotwords.push({ word: filename, boost: 2.5 });
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
context.recentCommands.forEach(cmd => {
|
|
67
|
+
hotwords.push({ word: cmd, boost: 1.5 });
|
|
68
|
+
});
|
|
69
|
+
hotwords.push({ word: 'leverageaiagent', boost: 4.0 });
|
|
70
|
+
hotwords.push({ word: 'Claude', boost: 3.5 });
|
|
71
|
+
hotwords.push({ word: '语音', boost: 3.0 });
|
|
72
|
+
hotwords.push({ word: '识别', boost: 3.0 });
|
|
73
|
+
hotwords.push({ word: '输入', boost: 2.5 });
|
|
74
|
+
return hotwords.slice(0, 100);
|
|
75
|
+
}
|
|
76
|
+
static compressContext(buffer, maxTokens = 200) {
|
|
77
|
+
const context = this.extractFromBuffer(buffer);
|
|
78
|
+
const parts = [];
|
|
79
|
+
if (context.techTerms.length > 0) {
|
|
80
|
+
parts.push(`Tech: ${context.techTerms.slice(0, 10).join(', ')}`);
|
|
81
|
+
}
|
|
82
|
+
if (context.codeKeywords.length > 0) {
|
|
83
|
+
parts.push(`Code: ${context.codeKeywords.slice(0, 10).join(', ')}`);
|
|
84
|
+
}
|
|
85
|
+
if (context.recentCommands.length > 0) {
|
|
86
|
+
parts.push(`Commands: ${context.recentCommands.slice(0, 5).join(', ')}`);
|
|
87
|
+
}
|
|
88
|
+
const recentText = buffer.slice(-10).join(' ').substring(0, 500);
|
|
89
|
+
if (recentText) {
|
|
90
|
+
parts.push(`Recent: ${recentText}`);
|
|
91
|
+
}
|
|
92
|
+
const compressed = parts.join(' | ');
|
|
93
|
+
const words = compressed.split(/\s+/);
|
|
94
|
+
if (words.length > maxTokens) {
|
|
95
|
+
return words.slice(0, maxTokens).join(' ');
|
|
96
|
+
}
|
|
97
|
+
return compressed;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
exports.ContextExtractor = ContextExtractor;
|
|
101
|
+
ContextExtractor.TECH_PATTERNS = {
|
|
102
|
+
functions: /\b(function|const|let|var|class|interface|type|enum)\s+(\w+)/g,
|
|
103
|
+
imports: /\b(import|require|from)\s+['"]([\w\-\/@]+)['"]/g,
|
|
104
|
+
packages: /\b(npm|yarn|pnpm|pip|cargo|go get)\s+(install|add|i)\s+([\w\-@\/]+)/g,
|
|
105
|
+
fileExtensions: /\b\w+\.(ts|tsx|js|jsx|py|rs|go|java|cpp|c|h|hpp|css|html|json|yaml|yml|md)\b/g,
|
|
106
|
+
commands: /\$\s*(\w+)/g,
|
|
107
|
+
chinese: /[\u4e00-\u9fa5]+/g,
|
|
108
|
+
};
|
|
109
|
+
ContextExtractor.COMMON_TECH_TERMS = [
|
|
110
|
+
'React', 'TypeScript', 'JavaScript', 'Python', 'Rust', 'Go',
|
|
111
|
+
'Docker', 'Kubernetes', 'Git', 'GitHub', 'npm', 'yarn',
|
|
112
|
+
'async', 'await', 'promise', 'callback', 'API', 'REST',
|
|
113
|
+
'GraphQL', 'WebSocket', 'HTTP', 'HTTPS', 'TCP', 'UDP',
|
|
114
|
+
'frontend', 'backend', 'database', 'server', 'client',
|
|
115
|
+
'component', 'module', 'package', 'library', 'framework',
|
|
116
|
+
'Claude', 'leverageaiagent', 'terminal', 'console', 'debug',
|
|
117
|
+
];
|
|
118
|
+
//# sourceMappingURL=context-extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-extractor.js","sourceRoot":"","sources":["../src/context-extractor.ts"],"names":[],"mappings":"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"}
|
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,85 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
const commander_1 = require("commander");
|
|
38
|
+
const session_1 = require("./session");
|
|
39
|
+
const config_1 = require("./config");
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
// Read version from package.json
|
|
43
|
+
const packageJsonPath = path.join(__dirname, '..', 'package.json');
|
|
44
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
|
|
45
|
+
const version = packageJson.version;
|
|
46
|
+
const program = new commander_1.Command();
|
|
47
|
+
program
|
|
48
|
+
.name('leverageaiagent')
|
|
49
|
+
.description('LeverageAI Agent - Forward Claude Code to your mobile device')
|
|
50
|
+
.version(version);
|
|
51
|
+
program
|
|
52
|
+
.command('start')
|
|
53
|
+
.description('Start a new LeverageAI Agent session')
|
|
54
|
+
.argument('[command...]', 'Command to run (default: none, opens terminal only)')
|
|
55
|
+
.option('-n, --name <name>', 'Machine name to display', process.env.HOSTNAME || 'My Computer')
|
|
56
|
+
.option('--pin <pin>', 'Set a 6-digit PIN for web access security (default: no PIN, direct access)')
|
|
57
|
+
.option('--debug-asr', 'Enable verbose ASR (voice recognition) logging')
|
|
58
|
+
.allowUnknownOption(true)
|
|
59
|
+
.action(async (command, options) => {
|
|
60
|
+
console.log('');
|
|
61
|
+
console.log(' 🚀 LeverageAI Agent - Coding anywhere in your pocket');
|
|
62
|
+
console.log('');
|
|
63
|
+
// PIN is optional - if not provided, no authentication required
|
|
64
|
+
await (0, session_1.startSession)(options.name, options.pin, command, { debugAsr: options.debugAsr });
|
|
65
|
+
});
|
|
66
|
+
program
|
|
67
|
+
.command('config')
|
|
68
|
+
.description('Configure LeverageAI Agent')
|
|
69
|
+
.option('-s, --server <url>', 'Set server URL')
|
|
70
|
+
.option('--show', 'Show current configuration')
|
|
71
|
+
.action((options) => {
|
|
72
|
+
if (options.show) {
|
|
73
|
+
const config = (0, config_1.getConfig)();
|
|
74
|
+
console.log('Current configuration:');
|
|
75
|
+
console.log(` Server URL: ${config.serverUrl}`);
|
|
76
|
+
console.log(` Machine ID: ${config.machineId}`);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
if (options.server) {
|
|
80
|
+
(0, config_1.setConfig)({ serverUrl: options.server });
|
|
81
|
+
console.log(`Server URL set to: ${options.server}`);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
program.parse();
|
|
85
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,yCAAoC;AACpC,uCAAyC;AACzC,qCAAgD;AAChD,uCAAyB;AACzB,2CAA6B;AAE7B,iCAAiC;AACjC,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;AACnE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;AAC1E,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;AAEpC,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACF,IAAI,CAAC,iBAAiB,CAAC;KACvB,WAAW,CAAC,8DAA8D,CAAC;KAC3E,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB,OAAO;KACF,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,sCAAsC,CAAC;KACnD,QAAQ,CAAC,cAAc,EAAE,qDAAqD,CAAC;KAC/E,MAAM,CAAC,mBAAmB,EAAE,yBAAyB,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa,CAAC;KAC7F,MAAM,CAAC,aAAa,EAAE,4EAA4E,CAAC;KACnG,MAAM,CAAC,aAAa,EAAE,gDAAgD,CAAC;KACvE,kBAAkB,CAAC,IAAI,CAAC;KACxB,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IAC/B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,gEAAgE;IAChE,MAAM,IAAA,sBAAY,EAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC3F,CAAC,CAAC,CAAC;AAEP,OAAO;KACF,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,4BAA4B,CAAC;KACzC,MAAM,CAAC,oBAAoB,EAAE,gBAAgB,CAAC;KAC9C,MAAM,CAAC,QAAQ,EAAE,4BAA4B,CAAC;KAC9C,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;IAChB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,IAAA,kBAAS,GAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QACjD,OAAO;IACX,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACjB,IAAA,kBAAS,EAAC,EAAE,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,sBAAsB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACxD,CAAC;AACL,CAAC,CAAC,CAAC;AAEP,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
package/dist/pty.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import * as pty from 'node-pty';
|
|
2
|
+
export interface PTYOptions {
|
|
3
|
+
cols?: number;
|
|
4
|
+
rows?: number;
|
|
5
|
+
command?: string;
|
|
6
|
+
args?: string[];
|
|
7
|
+
cwd?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function getLocalSize(): {
|
|
10
|
+
cols: number;
|
|
11
|
+
rows: number;
|
|
12
|
+
};
|
|
13
|
+
export declare function spawnPTY(options?: PTYOptions): pty.IPty;
|
|
14
|
+
export declare function writeToPTY(data: string): void;
|
|
15
|
+
export declare function resizePTY(cols: number, rows: number): void;
|
|
16
|
+
export declare function killPTY(): void;
|
|
17
|
+
export declare function onPTYData(callback: (data: string) => void): void;
|
|
18
|
+
export declare function onPTYExit(callback: (code: number) => void): void;
|
|
19
|
+
export declare function isPTYRunning(): boolean;
|
|
20
|
+
//# sourceMappingURL=pty.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pty.d.ts","sourceRoot":"","sources":["../src/pty.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAIhC,MAAM,WAAW,UAAU;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CAChB;AAWD,wBAAgB,YAAY,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAE7D;AAED,wBAAgB,QAAQ,CAAC,OAAO,GAAE,UAAe,GAAG,GAAG,CAAC,IAAI,CAsE3D;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAI7C;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAI1D;AAED,wBAAgB,OAAO,IAAI,IAAI,CAU9B;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAEhE;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAEhE;AAED,wBAAgB,YAAY,IAAI,OAAO,CAEtC"}
|
package/dist/pty.js
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.getLocalSize = getLocalSize;
|
|
37
|
+
exports.spawnPTY = spawnPTY;
|
|
38
|
+
exports.writeToPTY = writeToPTY;
|
|
39
|
+
exports.resizePTY = resizePTY;
|
|
40
|
+
exports.killPTY = killPTY;
|
|
41
|
+
exports.onPTYData = onPTYData;
|
|
42
|
+
exports.onPTYExit = onPTYExit;
|
|
43
|
+
exports.isPTYRunning = isPTYRunning;
|
|
44
|
+
const pty = __importStar(require("node-pty"));
|
|
45
|
+
const relay_1 = require("./relay");
|
|
46
|
+
let ptyProcess = null;
|
|
47
|
+
let dataCallback = null;
|
|
48
|
+
let exitCallback = null;
|
|
49
|
+
// Track local terminal size
|
|
50
|
+
let localCols = 80;
|
|
51
|
+
let localRows = 24;
|
|
52
|
+
// Get local terminal size
|
|
53
|
+
function getLocalSize() {
|
|
54
|
+
return { cols: localCols, rows: localRows };
|
|
55
|
+
}
|
|
56
|
+
function spawnPTY(options = {}) {
|
|
57
|
+
// Default to user's shell
|
|
58
|
+
const shell = process.env.SHELL || '/bin/zsh';
|
|
59
|
+
const command = options.command || shell;
|
|
60
|
+
const args = options.args || [];
|
|
61
|
+
localCols = options.cols || process.stdout.columns || 80;
|
|
62
|
+
localRows = options.rows || process.stdout.rows || 24;
|
|
63
|
+
const cwd = options.cwd || process.cwd();
|
|
64
|
+
// Ensure we have a clean environment with PATH
|
|
65
|
+
const env = {
|
|
66
|
+
...process.env,
|
|
67
|
+
PATH: process.env.PATH || '/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin',
|
|
68
|
+
TERM: 'xterm-256color',
|
|
69
|
+
};
|
|
70
|
+
ptyProcess = pty.spawn(command, args, {
|
|
71
|
+
name: 'xterm-256color',
|
|
72
|
+
cols: localCols,
|
|
73
|
+
rows: localRows,
|
|
74
|
+
cwd,
|
|
75
|
+
env,
|
|
76
|
+
});
|
|
77
|
+
// Handle PTY output - forward to both console and callback
|
|
78
|
+
ptyProcess.onData((data) => {
|
|
79
|
+
// Write to local terminal (mirror)
|
|
80
|
+
process.stdout.write(data);
|
|
81
|
+
// Also send to web client via callback
|
|
82
|
+
if (dataCallback) {
|
|
83
|
+
dataCallback(data);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
// Handle PTY exit
|
|
87
|
+
ptyProcess.onExit(({ exitCode }) => {
|
|
88
|
+
if (exitCallback) {
|
|
89
|
+
exitCallback(exitCode);
|
|
90
|
+
}
|
|
91
|
+
ptyProcess = null;
|
|
92
|
+
});
|
|
93
|
+
// Forward local stdin to PTY (for local terminal interaction)
|
|
94
|
+
if (process.stdin.isTTY) {
|
|
95
|
+
process.stdin.setRawMode(true);
|
|
96
|
+
}
|
|
97
|
+
process.stdin.resume();
|
|
98
|
+
process.stdin.on('data', (data) => {
|
|
99
|
+
if (ptyProcess) {
|
|
100
|
+
ptyProcess.write(data.toString());
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
// Handle terminal resize from local terminal
|
|
104
|
+
process.stdout.on('resize', () => {
|
|
105
|
+
if (process.stdout.columns && process.stdout.rows) {
|
|
106
|
+
localCols = process.stdout.columns;
|
|
107
|
+
localRows = process.stdout.rows;
|
|
108
|
+
// Notify relay to recalculate min size
|
|
109
|
+
try {
|
|
110
|
+
(0, relay_1.onLocalResize)();
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
// Relay might not be initialized yet
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
return ptyProcess;
|
|
118
|
+
}
|
|
119
|
+
function writeToPTY(data) {
|
|
120
|
+
if (ptyProcess) {
|
|
121
|
+
ptyProcess.write(data);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
function resizePTY(cols, rows) {
|
|
125
|
+
if (ptyProcess) {
|
|
126
|
+
ptyProcess.resize(cols, rows);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function killPTY() {
|
|
130
|
+
if (ptyProcess) {
|
|
131
|
+
ptyProcess.kill();
|
|
132
|
+
ptyProcess = null;
|
|
133
|
+
}
|
|
134
|
+
// Restore terminal
|
|
135
|
+
if (process.stdin.isTTY) {
|
|
136
|
+
process.stdin.setRawMode(false);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
function onPTYData(callback) {
|
|
140
|
+
dataCallback = callback;
|
|
141
|
+
}
|
|
142
|
+
function onPTYExit(callback) {
|
|
143
|
+
exitCallback = callback;
|
|
144
|
+
}
|
|
145
|
+
function isPTYRunning() {
|
|
146
|
+
return ptyProcess !== null;
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=pty.js.map
|
package/dist/pty.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pty.js","sourceRoot":"","sources":["../src/pty.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBA,oCAEC;AAED,4BAsEC;AAED,gCAIC;AAED,8BAIC;AAED,0BAUC;AAED,8BAEC;AAED,8BAEC;AAED,oCAEC;AAnID,8CAAgC;AAEhC,mCAAwC;AAUxC,IAAI,UAAU,GAAoB,IAAI,CAAC;AACvC,IAAI,YAAY,GAAoC,IAAI,CAAC;AACzD,IAAI,YAAY,GAAoC,IAAI,CAAC;AAEzD,4BAA4B;AAC5B,IAAI,SAAS,GAAG,EAAE,CAAC;AACnB,IAAI,SAAS,GAAG,EAAE,CAAC;AAEnB,0BAA0B;AAC1B,SAAgB,YAAY;IACxB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AAChD,CAAC;AAED,SAAgB,QAAQ,CAAC,UAAsB,EAAE;IAC7C,0BAA0B;IAC1B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,UAAU,CAAC;IAC9C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC;IACzC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;IAChC,SAAS,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IACzD,SAAS,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;IACtD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAGzC,+CAA+C;IAC/C,MAAM,GAAG,GAAG;QACR,GAAG,OAAO,CAAC,GAAG;QACd,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,8CAA8C;QACxE,IAAI,EAAE,gBAAgB;KACI,CAAC;IAE/B,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;QAClC,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,SAAS;QACf,GAAG;QACH,GAAG;KACN,CAAC,CAAC;IAEH,2DAA2D;IAC3D,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACvB,mCAAmC;QACnC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE3B,uCAAuC;QACvC,IAAI,YAAY,EAAE,CAAC;YACf,YAAY,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,kBAAkB;IAClB,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC/B,IAAI,YAAY,EAAE,CAAC;YACf,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC3B,CAAC;QACD,UAAU,GAAG,IAAI,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,8DAA8D;IAC9D,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IACvB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QAC9B,IAAI,UAAU,EAAE,CAAC;YACb,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACtC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,6CAA6C;IAC7C,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QAC7B,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAChD,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;YACnC,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;YAChC,uCAAuC;YACvC,IAAI,CAAC;gBACD,IAAA,qBAAa,GAAE,CAAC;YACpB,CAAC;YAAC,MAAM,CAAC;gBACL,qCAAqC;YACzC,CAAC;QACL,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,UAAU,CAAC;AACtB,CAAC;AAED,SAAgB,UAAU,CAAC,IAAY;IACnC,IAAI,UAAU,EAAE,CAAC;QACb,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;AACL,CAAC;AAED,SAAgB,SAAS,CAAC,IAAY,EAAE,IAAY;IAChD,IAAI,UAAU,EAAE,CAAC;QACb,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAClC,CAAC;AACL,CAAC;AAED,SAAgB,OAAO;IACnB,IAAI,UAAU,EAAE,CAAC;QACb,UAAU,CAAC,IAAI,EAAE,CAAC;QAClB,UAAU,GAAG,IAAI,CAAC;IACtB,CAAC;IAED,mBAAmB;IACnB,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;AACL,CAAC;AAED,SAAgB,SAAS,CAAC,QAAgC;IACtD,YAAY,GAAG,QAAQ,CAAC;AAC5B,CAAC;AAED,SAAgB,SAAS,CAAC,QAAgC;IACtD,YAAY,GAAG,QAAQ,CAAC;AAC5B,CAAC;AAED,SAAgB,YAAY;IACxB,OAAO,UAAU,KAAK,IAAI,CAAC;AAC/B,CAAC"}
|
package/dist/relay.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay.d.ts","sourceRoot":"","sources":["../src/relay.ts"],"names":[],"mappings":"AAkCA,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CA+ErE;AAED,wBAAgB,SAAS,IAAI,IAAI,CAiBhC;AAED,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAGD,wBAAgB,aAAa,IAAI,IAAI,CAEpC"}
|
package/dist/relay.js
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.startRelay = startRelay;
|
|
7
|
+
exports.stopRelay = stopRelay;
|
|
8
|
+
exports.isRelayRunning = isRelayRunning;
|
|
9
|
+
exports.onLocalResize = onLocalResize;
|
|
10
|
+
const axios_1 = __importDefault(require("axios"));
|
|
11
|
+
const pty_1 = require("./pty");
|
|
12
|
+
let isRunning = false;
|
|
13
|
+
let pollInterval = null;
|
|
14
|
+
let outputBuffer = [];
|
|
15
|
+
let flushTimer = null;
|
|
16
|
+
const POLL_INTERVAL = 100; // Poll for input every 100ms
|
|
17
|
+
const FLUSH_INTERVAL = 50; // Flush output every 50ms
|
|
18
|
+
// Track web client size
|
|
19
|
+
let webCols = 0;
|
|
20
|
+
let webRows = 0;
|
|
21
|
+
// Calculate and apply minimum size
|
|
22
|
+
function applyMinSize() {
|
|
23
|
+
const local = (0, pty_1.getLocalSize)();
|
|
24
|
+
// If web client hasn't connected yet, use local size
|
|
25
|
+
if (webCols === 0 || webRows === 0) {
|
|
26
|
+
return; // Don't resize yet
|
|
27
|
+
}
|
|
28
|
+
// Use minimum of both dimensions (byobu-style)
|
|
29
|
+
const minCols = Math.min(local.cols, webCols);
|
|
30
|
+
const minRows = Math.min(local.rows, webRows);
|
|
31
|
+
// Only resize if we have valid dimensions
|
|
32
|
+
if (minCols > 0 && minRows > 0) {
|
|
33
|
+
(0, pty_1.resizePTY)(minCols, minRows);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function startRelay(sessionId, serverUrl) {
|
|
37
|
+
isRunning = true;
|
|
38
|
+
console.log(' [Relay] Starting HTTP relay...');
|
|
39
|
+
// Set up PTY data forwarding
|
|
40
|
+
(0, pty_1.onPTYData)((data) => {
|
|
41
|
+
outputBuffer.push(data);
|
|
42
|
+
});
|
|
43
|
+
// Handle PTY exit
|
|
44
|
+
(0, pty_1.onPTYExit)(async (code) => {
|
|
45
|
+
try {
|
|
46
|
+
await axios_1.default.post(`${serverUrl}/api/terminal?sessionId=${sessionId}`, {
|
|
47
|
+
type: 'exit',
|
|
48
|
+
code,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// Ignore errors on exit
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
// Start output flushing
|
|
56
|
+
flushTimer = setInterval(async () => {
|
|
57
|
+
if (outputBuffer.length === 0)
|
|
58
|
+
return;
|
|
59
|
+
const dataToSend = outputBuffer.join('');
|
|
60
|
+
outputBuffer = [];
|
|
61
|
+
try {
|
|
62
|
+
await axios_1.default.post(`${serverUrl}/api/terminal?sessionId=${sessionId}`, {
|
|
63
|
+
type: 'output',
|
|
64
|
+
data: dataToSend,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
if (process.env.DEBUG) {
|
|
69
|
+
console.error(' [Relay] Failed to send output:', error);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}, FLUSH_INTERVAL);
|
|
73
|
+
// Start polling for input and resize events
|
|
74
|
+
pollInterval = setInterval(async () => {
|
|
75
|
+
if (!isRunning)
|
|
76
|
+
return;
|
|
77
|
+
try {
|
|
78
|
+
const response = await axios_1.default.get(`${serverUrl}/api/terminal`, {
|
|
79
|
+
params: { sessionId, mode: 'input' },
|
|
80
|
+
timeout: 5000,
|
|
81
|
+
});
|
|
82
|
+
const { inputs, resize } = response.data;
|
|
83
|
+
// Handle resize from web client
|
|
84
|
+
if (resize && resize.cols && resize.rows) {
|
|
85
|
+
webCols = resize.cols;
|
|
86
|
+
webRows = resize.rows;
|
|
87
|
+
applyMinSize();
|
|
88
|
+
}
|
|
89
|
+
// Handle input from web client
|
|
90
|
+
if (inputs && Array.isArray(inputs)) {
|
|
91
|
+
for (const input of inputs) {
|
|
92
|
+
// Debug: log input
|
|
93
|
+
if (process.env.DEBUG) {
|
|
94
|
+
const hex = Array.from(Buffer.from(input)).map(b => b.toString(16).padStart(2, '0')).join(' ');
|
|
95
|
+
console.log(`[Debug] Sending to PTY: "${input.replace(/\r/g, '\\r').replace(/\n/g, '\\n')}" [${hex}]`);
|
|
96
|
+
}
|
|
97
|
+
(0, pty_1.writeToPTY)(input);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
if (process.env.DEBUG) {
|
|
103
|
+
console.error(' [Relay] Failed to poll input:', error);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}, POLL_INTERVAL);
|
|
107
|
+
console.log(' [Relay] ✓ HTTP relay started');
|
|
108
|
+
}
|
|
109
|
+
function stopRelay() {
|
|
110
|
+
isRunning = false;
|
|
111
|
+
if (pollInterval) {
|
|
112
|
+
clearInterval(pollInterval);
|
|
113
|
+
pollInterval = null;
|
|
114
|
+
}
|
|
115
|
+
if (flushTimer) {
|
|
116
|
+
clearInterval(flushTimer);
|
|
117
|
+
flushTimer = null;
|
|
118
|
+
}
|
|
119
|
+
outputBuffer = [];
|
|
120
|
+
webCols = 0;
|
|
121
|
+
webRows = 0;
|
|
122
|
+
console.log(' [Relay] Stopped');
|
|
123
|
+
}
|
|
124
|
+
function isRelayRunning() {
|
|
125
|
+
return isRunning;
|
|
126
|
+
}
|
|
127
|
+
// Called when local terminal resizes
|
|
128
|
+
function onLocalResize() {
|
|
129
|
+
applyMinSize();
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=relay.js.map
|