@leverageaiapps/theseus-server 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 +165 -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 +45 -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 +257 -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 +1971 -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 +508 -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
|
@@ -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: 'Theseus', 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', 'Theseus', '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,45 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const commander_1 = require("commander");
|
|
5
|
+
const session_1 = require("./session");
|
|
6
|
+
const config_1 = require("./config");
|
|
7
|
+
const program = new commander_1.Command();
|
|
8
|
+
program
|
|
9
|
+
.name('theseus')
|
|
10
|
+
.description('Theseus - Forward Claude Code to your mobile device')
|
|
11
|
+
.version('0.1.0');
|
|
12
|
+
program
|
|
13
|
+
.command('start')
|
|
14
|
+
.description('Start a new Theseus session')
|
|
15
|
+
.argument('[command...]', 'Command to run (default: none, opens terminal only)')
|
|
16
|
+
.option('-n, --name <name>', 'Machine name to display', process.env.HOSTNAME || 'My Computer')
|
|
17
|
+
.option('-p, --pin <pin>', 'Set a 6-digit PIN for web access security (auto-generated if not provided)')
|
|
18
|
+
.option('--debug-asr', 'Enable verbose ASR (voice recognition) logging')
|
|
19
|
+
.allowUnknownOption(true)
|
|
20
|
+
.action(async (command, options) => {
|
|
21
|
+
console.log('');
|
|
22
|
+
console.log(' 🚀 Theseus - Coding anywhere in your pocket');
|
|
23
|
+
console.log('');
|
|
24
|
+
await (0, session_1.startSession)(options.name, options.pin, command, { debugAsr: options.debugAsr });
|
|
25
|
+
});
|
|
26
|
+
program
|
|
27
|
+
.command('config')
|
|
28
|
+
.description('Configure Theseus')
|
|
29
|
+
.option('-s, --server <url>', 'Set server URL')
|
|
30
|
+
.option('--show', 'Show current configuration')
|
|
31
|
+
.action((options) => {
|
|
32
|
+
if (options.show) {
|
|
33
|
+
const config = (0, config_1.getConfig)();
|
|
34
|
+
console.log('Current configuration:');
|
|
35
|
+
console.log(` Server URL: ${config.serverUrl}`);
|
|
36
|
+
console.log(` Machine ID: ${config.machineId}`);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (options.server) {
|
|
40
|
+
(0, config_1.setConfig)({ serverUrl: options.server });
|
|
41
|
+
console.log(`Server URL set to: ${options.server}`);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
program.parse();
|
|
45
|
+
//# 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;AAEhD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACF,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,qDAAqD,CAAC;KAClE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB,OAAO;KACF,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,6BAA6B,CAAC;KAC1C,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,iBAAiB,EAAE,4EAA4E,CAAC;KACvG,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,+CAA+C,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,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,mBAAmB,CAAC;KAChC,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":"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"}
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay.js","sourceRoot":"","sources":["../src/relay.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAoHA,MAAM,WAAW,cAAc;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgIzI"}
|