@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.
- package/LICENSE +21 -0
- package/README.md +153 -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/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 +83 -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 +6 -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/vortex-tunnel.d.ts +9 -0
- package/dist/vortex-tunnel.d.ts.map +1 -0
- package/dist/vortex-tunnel.js +355 -0
- package/dist/vortex-tunnel.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 +2029 -0
- package/dist/web-server.js.map +1 -0
- package/install.sh +329 -0
- package/package.json +67 -0
- package/public/index.html +639 -0
- package/public/js/terminal-asr.js +435 -0
- package/public/js/terminal.js +517 -0
- package/public/js/voice-input.js +422 -0
- package/scripts/postinstall.js +66 -0
- 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
|
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":"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"}
|
package/dist/session.js
ADDED
|
@@ -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"}
|