@leverageaiapps/locus 1.0.3

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 (50) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +153 -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/config.d.ts +7 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +84 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/context-extractor.d.ts +17 -0
  12. package/dist/context-extractor.d.ts.map +1 -0
  13. package/dist/context-extractor.js +118 -0
  14. package/dist/context-extractor.js.map +1 -0
  15. package/dist/index.d.ts +3 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +83 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/pty.d.ts +20 -0
  20. package/dist/pty.d.ts.map +1 -0
  21. package/dist/pty.js +148 -0
  22. package/dist/pty.js.map +1 -0
  23. package/dist/relay.d.ts +5 -0
  24. package/dist/relay.d.ts.map +1 -0
  25. package/dist/relay.js +131 -0
  26. package/dist/relay.js.map +1 -0
  27. package/dist/session.d.ts +6 -0
  28. package/dist/session.d.ts.map +1 -0
  29. package/dist/session.js +250 -0
  30. package/dist/session.js.map +1 -0
  31. package/dist/voice-recognition-modelscope.d.ts +50 -0
  32. package/dist/voice-recognition-modelscope.d.ts.map +1 -0
  33. package/dist/voice-recognition-modelscope.js +171 -0
  34. package/dist/voice-recognition-modelscope.js.map +1 -0
  35. package/dist/vortex-tunnel.d.ts +9 -0
  36. package/dist/vortex-tunnel.d.ts.map +1 -0
  37. package/dist/vortex-tunnel.js +355 -0
  38. package/dist/vortex-tunnel.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 +2029 -0
  42. package/dist/web-server.js.map +1 -0
  43. package/install.sh +329 -0
  44. package/package.json +67 -0
  45. package/public/index.html +639 -0
  46. package/public/js/terminal-asr.js +435 -0
  47. package/public/js/terminal.js +517 -0
  48. package/public/js/voice-input.js +422 -0
  49. package/scripts/postinstall.js +66 -0
  50. package/scripts/verify-install.js +128 -0
@@ -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,OAAO,CAAC;KACb,WAAW,CAAC,qDAAqD,CAAC;KAClE,OAAO,CAAC,OAAO,CAAC;KAChB,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,MAAM,CAAC,qBAAqB,EAAE,gEAAgE,CAAC;KAC/F,kBAAkB,CAAC,IAAI,CAAC;KACxB,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IAC/B,gEAAgE;IAChE,MAAM,IAAA,sBAAY,EAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE;QACnD,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,UAAU,EAAE,OAAO,CAAC,OAAO;KAC9B,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEP,OAAO;KACF,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,iBAAiB,CAAC;KAC9B,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,6 @@
1
+ export interface SessionOptions {
2
+ debugAsr?: boolean;
3
+ gatewayUrl?: string;
4
+ }
5
+ export declare function startSession(machineName: string, userPin?: string, command?: string[], options?: SessionOptions): Promise<void>;
6
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AA6GA,MAAM,WAAW,cAAc;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;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,CAiIzI"}
@@ -0,0 +1,250 @@
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.startSession = startSession;
37
+ const qrcode = __importStar(require("qrcode-terminal"));
38
+ const net = __importStar(require("net"));
39
+ const http = __importStar(require("http"));
40
+ const pty_1 = require("./pty");
41
+ const web_server_1 = require("./web-server");
42
+ const vortex_tunnel_1 = require("./vortex-tunnel");
43
+ const MIN_PORT = 8000;
44
+ const MAX_PORT = 65535;
45
+ /**
46
+ * Validate PIN format (6 digits)
47
+ */
48
+ function validatePIN(pin) {
49
+ return /^\d{6}$/.test(pin);
50
+ }
51
+ /**
52
+ * Check if a port is available
53
+ */
54
+ function isPortAvailable(port) {
55
+ return new Promise((resolve) => {
56
+ const server = net.createServer();
57
+ server.listen(port, () => {
58
+ server.once('close', () => {
59
+ resolve(true);
60
+ });
61
+ server.close();
62
+ });
63
+ server.on('error', () => {
64
+ resolve(false);
65
+ });
66
+ });
67
+ }
68
+ /**
69
+ * Find an available port in the specified range
70
+ */
71
+ async function findAvailablePort() {
72
+ const maxAttempts = 100;
73
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
74
+ const port = Math.floor(Math.random() * (MAX_PORT - MIN_PORT + 1)) + MIN_PORT;
75
+ if (await isPortAvailable(port)) {
76
+ return port;
77
+ }
78
+ }
79
+ throw new Error(`Unable to find available port after ${maxAttempts} attempts`);
80
+ }
81
+ /**
82
+ * Verify that the web server is actually accessible
83
+ */
84
+ function verifyServerStarted(port) {
85
+ return new Promise((resolve, reject) => {
86
+ const maxAttempts = 10;
87
+ let attempts = 0;
88
+ const checkServer = () => {
89
+ attempts++;
90
+ const req = http.get(`http://localhost:${port}/health`, (res) => {
91
+ // Server is responding, even if with 404 (health endpoint doesn't exist)
92
+ // The important thing is that the server is reachable
93
+ resolve();
94
+ });
95
+ req.on('error', (err) => {
96
+ if (attempts >= maxAttempts) {
97
+ reject(new Error(`Server failed to start on port ${port} after ${maxAttempts} attempts`));
98
+ }
99
+ else {
100
+ // Try again after a short delay
101
+ setTimeout(checkServer, 200);
102
+ }
103
+ });
104
+ req.setTimeout(1000, () => {
105
+ req.destroy();
106
+ if (attempts >= maxAttempts) {
107
+ reject(new Error(`Server startup timeout on port ${port}`));
108
+ }
109
+ else {
110
+ setTimeout(checkServer, 200);
111
+ }
112
+ });
113
+ };
114
+ checkServer();
115
+ });
116
+ }
117
+ /**
118
+ * Generate QR code for terminal
119
+ */
120
+ function displayQRCode(url) {
121
+ console.log('');
122
+ console.log(' 📱 Scan this QR code with your phone:');
123
+ console.log('');
124
+ qrcode.generate(url, { small: true }, (qr) => {
125
+ console.log(qr);
126
+ });
127
+ console.log('');
128
+ console.log(` 📱 Or open: ${url}`);
129
+ console.log('');
130
+ }
131
+ async function startSession(machineName, userPin, command, options = {}) {
132
+ console.log('');
133
+ console.log(' 🚀 Locus - Code anywhere from your pocket');
134
+ console.log('');
135
+ // Bypass system proxy to avoid issues with Shadowrocket, Clash, etc.
136
+ // These proxies can interfere with localhost connections
137
+ delete process.env.HTTP_PROXY;
138
+ delete process.env.HTTPS_PROXY;
139
+ delete process.env.http_proxy;
140
+ delete process.env.https_proxy;
141
+ delete process.env.ALL_PROXY;
142
+ delete process.env.all_proxy;
143
+ // Set NO_PROXY to ensure local connections bypass any remaining proxy
144
+ process.env.NO_PROXY = 'localhost,127.0.0.1,*.local';
145
+ process.env.no_proxy = process.env.NO_PROXY;
146
+ try {
147
+ // Handle PIN - default is no PIN (direct access)
148
+ let pin = '';
149
+ if (userPin) {
150
+ // User specified a PIN, validate it
151
+ if (validatePIN(userPin)) {
152
+ pin = userPin;
153
+ }
154
+ else {
155
+ throw new Error('PIN must be exactly 6 digits');
156
+ }
157
+ }
158
+ // If no PIN provided, pin remains empty string (no authentication)
159
+ // Show progress steps
160
+ console.log(' Finding available port...');
161
+ const port = await findAvailablePort();
162
+ console.log(` Using port: ${port}`);
163
+ console.log(' Starting local server...');
164
+ await (0, web_server_1.startWebServer)(port, pin, { debugAsr: options.debugAsr });
165
+ // Verify server is accessible before creating tunnel
166
+ await verifyServerStarted(port);
167
+ console.log(' Creating tunnel...');
168
+ let tunnelUrl;
169
+ try {
170
+ tunnelUrl = await (0, vortex_tunnel_1.startTunnel)(port, options.gatewayUrl);
171
+ }
172
+ catch (error) {
173
+ console.log('');
174
+ console.log(' ❌ Failed to create tunnel:');
175
+ console.log('');
176
+ console.log(error instanceof Error ? error.message : String(error));
177
+ console.log('');
178
+ process.exit(1);
179
+ }
180
+ // Display QR code and connection info
181
+ displayQRCode(tunnelUrl);
182
+ // Show PIN info after QR code
183
+ if (pin) {
184
+ console.log(` 🔐 PIN for web access: ${pin}`);
185
+ }
186
+ else {
187
+ console.log(' 🔓 No PIN required - direct access enabled');
188
+ }
189
+ console.log('');
190
+ console.log(' Started.');
191
+ console.log('');
192
+ // Determine what to run
193
+ let commandToRun;
194
+ let argsToRun;
195
+ if (command && command.length > 0) {
196
+ // Check if first argument contains spaces (quoted command)
197
+ if (command.length === 1 && command[0].includes(' ')) {
198
+ // Single quoted command like "claude --dangerously-skip-permissions"
199
+ const parts = command[0].split(' ');
200
+ commandToRun = parts[0];
201
+ argsToRun = parts.slice(1);
202
+ }
203
+ else {
204
+ // Normal command with separate arguments
205
+ commandToRun = command[0];
206
+ argsToRun = command.slice(1);
207
+ }
208
+ }
209
+ else {
210
+ // No command provided, just start a shell
211
+ const shell = process.env.SHELL || '/bin/zsh';
212
+ commandToRun = shell;
213
+ argsToRun = [];
214
+ }
215
+ // Spawn the command in PTY
216
+ (0, pty_1.spawnPTY)({
217
+ command: commandToRun,
218
+ args: argsToRun,
219
+ cwd: process.cwd(),
220
+ });
221
+ // Handle command exit
222
+ (0, pty_1.onPTYExit)((code) => {
223
+ console.log('');
224
+ if (command && command.length > 0) {
225
+ console.log(` ${command.join(' ')} exited. Session ended.`);
226
+ }
227
+ else {
228
+ console.log(' Terminal session ended.');
229
+ }
230
+ cleanup();
231
+ });
232
+ // Cleanup function
233
+ const cleanup = () => {
234
+ (0, pty_1.killPTY)();
235
+ (0, web_server_1.stopWebServer)();
236
+ (0, vortex_tunnel_1.stopTunnel)();
237
+ process.exit(0);
238
+ };
239
+ // Handle Ctrl+C
240
+ process.on('SIGINT', cleanup);
241
+ process.on('SIGTERM', cleanup);
242
+ }
243
+ catch (error) {
244
+ console.error(' ✗ Failed to start session:', error);
245
+ (0, web_server_1.stopWebServer)();
246
+ (0, vortex_tunnel_1.stopTunnel)();
247
+ process.exit(1);
248
+ }
249
+ }
250
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import { EventEmitter } from 'events';
2
+ interface ModelScopeConfig {
3
+ apiKey?: string;
4
+ apiUrl?: string;
5
+ model?: string;
6
+ language?: string;
7
+ maxContextLength?: number;
8
+ }
9
+ export declare class VoiceRecognitionModelScope extends EventEmitter {
10
+ private apiKey;
11
+ private apiUrl;
12
+ private model;
13
+ private language;
14
+ private maxContextLength;
15
+ private audioBuffer;
16
+ private isRecording;
17
+ private streamingSession;
18
+ private contextText;
19
+ constructor(config?: ModelScopeConfig);
20
+ /**
21
+ * Update the context for better recognition accuracy
22
+ */
23
+ updateContext(terminalOutput: string[]): void;
24
+ /**
25
+ * Start streaming recognition
26
+ */
27
+ startStreamingRecognition(): Promise<void>;
28
+ /**
29
+ * Send audio chunk for recognition
30
+ */
31
+ sendAudioChunk(audioData: Buffer): Promise<void>;
32
+ /**
33
+ * Stop recognition
34
+ */
35
+ stopRecognition(): void;
36
+ /**
37
+ * Check if API is properly configured
38
+ */
39
+ isConfigured(): boolean;
40
+ /**
41
+ * Get current context
42
+ */
43
+ getContext(): string;
44
+ /**
45
+ * Set maximum context length
46
+ */
47
+ setMaxContextLength(length: number): void;
48
+ }
49
+ export {};
50
+ //# sourceMappingURL=voice-recognition-modelscope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice-recognition-modelscope.d.ts","sourceRoot":"","sources":["../src/voice-recognition-modelscope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAItC,UAAU,gBAAgB;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAQD,qBAAa,0BAA2B,SAAQ,YAAY;IACxD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,WAAW,CAAc;gBAErB,MAAM,GAAE,gBAAqB;IAazC;;OAEG;IACI,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,IAAI;IAcpD;;OAEG;IACU,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC;IAuCvD;;OAEG;IACU,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA2E7D;;OAEG;IACI,eAAe,IAAI,IAAI;IAO9B;;OAEG;IACI,YAAY,IAAI,OAAO;IAI9B;;OAEG;IACI,UAAU,IAAI,MAAM;IAI3B;;OAEG;IACI,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;CAGnD"}