@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.
Files changed (49) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +165 -0
  3. package/dist/capture.d.ts +3 -0
  4. package/dist/capture.d.ts.map +1 -0
  5. package/dist/capture.js +134 -0
  6. package/dist/capture.js.map +1 -0
  7. package/dist/cloudflare-tunnel.d.ts +9 -0
  8. package/dist/cloudflare-tunnel.d.ts.map +1 -0
  9. package/dist/cloudflare-tunnel.js +218 -0
  10. package/dist/cloudflare-tunnel.js.map +1 -0
  11. package/dist/config.d.ts +7 -0
  12. package/dist/config.d.ts.map +1 -0
  13. package/dist/config.js +84 -0
  14. package/dist/config.js.map +1 -0
  15. package/dist/context-extractor.d.ts +17 -0
  16. package/dist/context-extractor.d.ts.map +1 -0
  17. package/dist/context-extractor.js +118 -0
  18. package/dist/context-extractor.js.map +1 -0
  19. package/dist/index.d.ts +3 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +45 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/pty.d.ts +20 -0
  24. package/dist/pty.d.ts.map +1 -0
  25. package/dist/pty.js +148 -0
  26. package/dist/pty.js.map +1 -0
  27. package/dist/relay.d.ts +5 -0
  28. package/dist/relay.d.ts.map +1 -0
  29. package/dist/relay.js +131 -0
  30. package/dist/relay.js.map +1 -0
  31. package/dist/session.d.ts +5 -0
  32. package/dist/session.d.ts.map +1 -0
  33. package/dist/session.js +257 -0
  34. package/dist/session.js.map +1 -0
  35. package/dist/voice-recognition-modelscope.d.ts +50 -0
  36. package/dist/voice-recognition-modelscope.d.ts.map +1 -0
  37. package/dist/voice-recognition-modelscope.js +171 -0
  38. package/dist/voice-recognition-modelscope.js.map +1 -0
  39. package/dist/web-server.d.ts +6 -0
  40. package/dist/web-server.d.ts.map +1 -0
  41. package/dist/web-server.js +1971 -0
  42. package/dist/web-server.js.map +1 -0
  43. package/package.json +66 -0
  44. package/public/index.html +639 -0
  45. package/public/js/terminal-asr.js +508 -0
  46. package/public/js/terminal.js +514 -0
  47. package/public/js/voice-input.js +422 -0
  48. package/scripts/postinstall.js +66 -0
  49. 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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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pty.js","sourceRoot":"","sources":["../src/pty.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function startRelay(sessionId: string, serverUrl: string): void;
2
+ export declare function stopRelay(): void;
3
+ export declare function isRelayRunning(): boolean;
4
+ export declare function onLocalResize(): void;
5
+ //# sourceMappingURL=relay.d.ts.map
@@ -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,5 @@
1
+ export interface SessionOptions {
2
+ debugAsr?: boolean;
3
+ }
4
+ export declare function startSession(machineName: string, userPin?: string, command?: string[], options?: SessionOptions): Promise<void>;
5
+ //# sourceMappingURL=session.d.ts.map
@@ -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"}