@leverageaiapps/locus-dev 1.1.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/Dockerfile +29 -0
- 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/debug-logger.d.ts +19 -0
- package/dist/debug-logger.d.ts.map +1 -0
- package/dist/debug-logger.js +48 -0
- package/dist/debug-logger.js.map +1 -0
- package/dist/exec.d.ts +20 -0
- package/dist/exec.d.ts.map +1 -0
- package/dist/exec.js +158 -0
- package/dist/exec.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 +7 -0
- package/dist/pty.d.ts.map +1 -0
- package/dist/pty.js +27 -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 +589 -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 +2096 -0
- package/dist/web-server.js.map +1 -0
- package/docs/CNAME +1 -0
- package/docs/index.html +492 -0
- package/docs/install.sh +329 -0
- package/install.sh +329 -0
- package/package.json +69 -0
- package/scripts/postinstall.js +66 -0
- package/scripts/verify-install.js +128 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Debug Logger - Sends logs to Debug Dashboard
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.logOut = exports.logIn = void 0;
|
|
7
|
+
exports.initDebugLogger = initDebugLogger;
|
|
8
|
+
exports.setDebugSession = setDebugSession;
|
|
9
|
+
exports.debugLog = debugLog;
|
|
10
|
+
let debugUrl = null;
|
|
11
|
+
let sessionId = null;
|
|
12
|
+
function initDebugLogger(url = 'http://localhost:4000', session) {
|
|
13
|
+
debugUrl = url;
|
|
14
|
+
sessionId = session || null;
|
|
15
|
+
console.log(`[Debug] Logger initialized: ${url}`);
|
|
16
|
+
}
|
|
17
|
+
function setDebugSession(session) {
|
|
18
|
+
sessionId = session;
|
|
19
|
+
}
|
|
20
|
+
function debugLog(entry) {
|
|
21
|
+
const fullEntry = {
|
|
22
|
+
source: entry.source || 'locus',
|
|
23
|
+
direction: entry.direction,
|
|
24
|
+
type: entry.type,
|
|
25
|
+
message: entry.message,
|
|
26
|
+
session: entry.session || sessionId || undefined,
|
|
27
|
+
data: entry.data
|
|
28
|
+
};
|
|
29
|
+
// Always log to console
|
|
30
|
+
const arrow = entry.direction === 'in' ? '←' : '→';
|
|
31
|
+
console.log(` [${fullEntry.source.toUpperCase()}] ${arrow} ${fullEntry.type}: ${fullEntry.message}`);
|
|
32
|
+
// Send to debug dashboard if configured
|
|
33
|
+
if (debugUrl) {
|
|
34
|
+
fetch(`${debugUrl}/log`, {
|
|
35
|
+
method: 'POST',
|
|
36
|
+
headers: { 'Content-Type': 'application/json' },
|
|
37
|
+
body: JSON.stringify(fullEntry)
|
|
38
|
+
}).catch(() => {
|
|
39
|
+
// Ignore errors - dashboard might not be running
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// Convenience functions
|
|
44
|
+
const logIn = (type, message, data) => debugLog({ direction: 'in', type, message, data });
|
|
45
|
+
exports.logIn = logIn;
|
|
46
|
+
const logOut = (type, message, data) => debugLog({ direction: 'out', type, message, data });
|
|
47
|
+
exports.logOut = logOut;
|
|
48
|
+
//# sourceMappingURL=debug-logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug-logger.js","sourceRoot":"","sources":["../src/debug-logger.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAKH,0CAIC;AAED,0CAEC;AAWD,4BAwBC;AA9CD,IAAI,QAAQ,GAAkB,IAAI,CAAC;AACnC,IAAI,SAAS,GAAkB,IAAI,CAAC;AAEpC,SAAgB,eAAe,CAAC,MAAc,uBAAuB,EAAE,OAAgB;IACnF,QAAQ,GAAG,GAAG,CAAC;IACf,SAAS,GAAG,OAAO,IAAI,IAAI,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,+BAA+B,GAAG,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,SAAgB,eAAe,CAAC,OAAe;IAC3C,SAAS,GAAG,OAAO,CAAC;AACxB,CAAC;AAWD,SAAgB,QAAQ,CAAC,KAAqD;IAC1E,MAAM,SAAS,GAAa;QACxB,MAAM,EAAG,KAAK,CAAC,MAAc,IAAI,OAAO;QACxC,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,SAAS,IAAI,SAAS;QAChD,IAAI,EAAE,KAAK,CAAC,IAAI;KACnB,CAAC;IAEF,wBAAwB;IACxB,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,MAAM,SAAS,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,KAAK,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;IAEtG,wCAAwC;IACxC,IAAI,QAAQ,EAAE,CAAC;QACX,KAAK,CAAC,GAAG,QAAQ,MAAM,EAAE;YACrB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;SAClC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YACV,iDAAiD;QACrD,CAAC,CAAC,CAAC;IACP,CAAC;AACL,CAAC;AAED,wBAAwB;AACjB,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,OAAe,EAAE,IAAU,EAAE,EAAE,CAC/D,QAAQ,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;AAD1C,QAAA,KAAK,SACqC;AAEhD,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,OAAe,EAAE,IAAU,EAAE,EAAE,CAChE,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;AAD3C,QAAA,MAAM,UACqC"}
|
package/dist/exec.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import * as pty from 'node-pty';
|
|
2
|
+
export interface ExecOptions {
|
|
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 spawnExec(options?: ExecOptions): pty.IPty;
|
|
14
|
+
export declare function writeToExec(data: string): void;
|
|
15
|
+
export declare function resizeExec(cols: number, rows: number): void;
|
|
16
|
+
export declare function killExec(): void;
|
|
17
|
+
export declare function onExecData(callback: (data: string) => void): void;
|
|
18
|
+
export declare function onExecExit(callback: (code: number) => void): void;
|
|
19
|
+
export declare function isExecRunning(): boolean;
|
|
20
|
+
//# sourceMappingURL=exec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../src/exec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAGhC,MAAM,WAAW,WAAW;IACxB,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;AAqBD,wBAAgB,SAAS,CAAC,OAAO,GAAE,WAAgB,GAAG,GAAG,CAAC,IAAI,CA4D7D;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAI9C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAM3D;AAED,wBAAgB,QAAQ,IAAI,IAAI,CAU/B;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAEjE;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAEjE;AAED,wBAAgB,aAAa,IAAI,OAAO,CAEvC"}
|
package/dist/exec.js
ADDED
|
@@ -0,0 +1,158 @@
|
|
|
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.spawnExec = spawnExec;
|
|
38
|
+
exports.writeToExec = writeToExec;
|
|
39
|
+
exports.resizeExec = resizeExec;
|
|
40
|
+
exports.killExec = killExec;
|
|
41
|
+
exports.onExecData = onExecData;
|
|
42
|
+
exports.onExecExit = onExecExit;
|
|
43
|
+
exports.isExecRunning = isExecRunning;
|
|
44
|
+
const pty = __importStar(require("node-pty"));
|
|
45
|
+
let ptyProcess = null;
|
|
46
|
+
let dataCallback = null;
|
|
47
|
+
let exitCallback = null;
|
|
48
|
+
// Track terminal size
|
|
49
|
+
let localCols = 80;
|
|
50
|
+
let localRows = 24;
|
|
51
|
+
// Get local terminal size
|
|
52
|
+
function getLocalSize() {
|
|
53
|
+
return { cols: localCols, rows: localRows };
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Strip ANSI escape codes from output
|
|
57
|
+
*/
|
|
58
|
+
function stripAnsi(str) {
|
|
59
|
+
// Remove all ANSI escape sequences
|
|
60
|
+
// This regex matches:
|
|
61
|
+
// - CSI sequences: ESC [ ... final_byte
|
|
62
|
+
// - OSC sequences: ESC ] ... ST
|
|
63
|
+
// - Simple escapes: ESC followed by single char
|
|
64
|
+
return str
|
|
65
|
+
.replace(/\x1b\[[0-9;]*[a-zA-Z]/g, '') // CSI sequences (colors, cursor, etc.)
|
|
66
|
+
.replace(/\x1b\][^\x07]*\x07/g, '') // OSC sequences (title, etc.)
|
|
67
|
+
.replace(/\x1b\][^\x1b]*\x1b\\/g, '') // OSC with ST terminator
|
|
68
|
+
.replace(/\x1b[PX^_][^\x1b]*\x1b\\/g, '') // DCS, SOS, PM, APC sequences
|
|
69
|
+
.replace(/\x1b[@-Z\\-_]/g, '') // Fe sequences
|
|
70
|
+
.replace(/\x1b[ -/][0-9;]*[@-~]/g, '') // Other escape sequences
|
|
71
|
+
.replace(/[\x00-\x08\x0b\x0c\x0e-\x1f]/g, ''); // Control characters except \t, \n, \r
|
|
72
|
+
}
|
|
73
|
+
function spawnExec(options = {}) {
|
|
74
|
+
// Default to user's shell
|
|
75
|
+
const shell = process.env.SHELL || '/bin/bash';
|
|
76
|
+
const command = options.command || shell;
|
|
77
|
+
const args = options.args || [];
|
|
78
|
+
localCols = options.cols || process.stdout.columns || 80;
|
|
79
|
+
localRows = options.rows || process.stdout.rows || 24;
|
|
80
|
+
const cwd = options.cwd || process.cwd();
|
|
81
|
+
// Environment setup
|
|
82
|
+
const env = {
|
|
83
|
+
...process.env,
|
|
84
|
+
PATH: process.env.PATH || '/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin',
|
|
85
|
+
TERM: 'xterm-256color',
|
|
86
|
+
COLORTERM: 'truecolor',
|
|
87
|
+
};
|
|
88
|
+
// Spawn PTY process
|
|
89
|
+
ptyProcess = pty.spawn(command, args, {
|
|
90
|
+
name: 'xterm-256color',
|
|
91
|
+
cols: localCols,
|
|
92
|
+
rows: localRows,
|
|
93
|
+
cwd,
|
|
94
|
+
env,
|
|
95
|
+
});
|
|
96
|
+
// Handle PTY output - strip ANSI codes before sending
|
|
97
|
+
ptyProcess.onData((data) => {
|
|
98
|
+
// Write original to local terminal (with colors)
|
|
99
|
+
process.stdout.write(data);
|
|
100
|
+
// Send stripped version to callback (for remote clients)
|
|
101
|
+
if (dataCallback) {
|
|
102
|
+
const stripped = stripAnsi(data);
|
|
103
|
+
if (stripped) {
|
|
104
|
+
dataCallback(stripped);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
// Handle PTY exit
|
|
109
|
+
ptyProcess.onExit(({ exitCode }) => {
|
|
110
|
+
if (exitCallback) {
|
|
111
|
+
exitCallback(exitCode);
|
|
112
|
+
}
|
|
113
|
+
ptyProcess = null;
|
|
114
|
+
});
|
|
115
|
+
// Forward local stdin to PTY
|
|
116
|
+
if (process.stdin.isTTY) {
|
|
117
|
+
process.stdin.setRawMode(true);
|
|
118
|
+
}
|
|
119
|
+
process.stdin.resume();
|
|
120
|
+
process.stdin.on('data', (data) => {
|
|
121
|
+
if (ptyProcess) {
|
|
122
|
+
ptyProcess.write(data.toString());
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
return ptyProcess;
|
|
126
|
+
}
|
|
127
|
+
function writeToExec(data) {
|
|
128
|
+
if (ptyProcess) {
|
|
129
|
+
ptyProcess.write(data);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
function resizeExec(cols, rows) {
|
|
133
|
+
localCols = cols;
|
|
134
|
+
localRows = rows;
|
|
135
|
+
if (ptyProcess) {
|
|
136
|
+
ptyProcess.resize(cols, rows);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
function killExec() {
|
|
140
|
+
if (ptyProcess) {
|
|
141
|
+
ptyProcess.kill();
|
|
142
|
+
ptyProcess = null;
|
|
143
|
+
}
|
|
144
|
+
// Restore terminal
|
|
145
|
+
if (process.stdin.isTTY) {
|
|
146
|
+
process.stdin.setRawMode(false);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
function onExecData(callback) {
|
|
150
|
+
dataCallback = callback;
|
|
151
|
+
}
|
|
152
|
+
function onExecExit(callback) {
|
|
153
|
+
exitCallback = callback;
|
|
154
|
+
}
|
|
155
|
+
function isExecRunning() {
|
|
156
|
+
return ptyProcess !== null;
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=exec.js.map
|
package/dist/exec.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../src/exec.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,83 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
const commander_1 = require("commander");
|
|
38
|
+
const session_1 = require("./session");
|
|
39
|
+
const config_1 = require("./config");
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
// Read version from package.json
|
|
43
|
+
const packageJsonPath = path.join(__dirname, '..', 'package.json');
|
|
44
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
|
|
45
|
+
const version = packageJson.version;
|
|
46
|
+
const program = new commander_1.Command();
|
|
47
|
+
program
|
|
48
|
+
.name('locus')
|
|
49
|
+
.description('Locus - Forward your terminal to your mobile device')
|
|
50
|
+
.version(version)
|
|
51
|
+
.argument('[command...]', 'Command to run (default: none, opens terminal only)')
|
|
52
|
+
.option('-n, --name <name>', 'Machine name to display', process.env.HOSTNAME || 'My Computer')
|
|
53
|
+
.option('--pin <pin>', 'Set a 6-digit PIN for web access security (default: no PIN, direct access)')
|
|
54
|
+
.option('--debug-asr', 'Enable verbose ASR (voice recognition) logging')
|
|
55
|
+
.option('-g, --gateway <url>', 'Vortex gateway URL (default: https://vortex.futuretech.social)')
|
|
56
|
+
.allowUnknownOption(true)
|
|
57
|
+
.action(async (command, options) => {
|
|
58
|
+
// PIN is optional - if not provided, no authentication required
|
|
59
|
+
await (0, session_1.startSession)(options.name, options.pin, command, {
|
|
60
|
+
debugAsr: options.debugAsr,
|
|
61
|
+
gatewayUrl: options.gateway
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
program
|
|
65
|
+
.command('config')
|
|
66
|
+
.description('Configure Locus')
|
|
67
|
+
.option('-s, --server <url>', 'Set server URL')
|
|
68
|
+
.option('--show', 'Show current configuration')
|
|
69
|
+
.action((options) => {
|
|
70
|
+
if (options.show) {
|
|
71
|
+
const config = (0, config_1.getConfig)();
|
|
72
|
+
console.log('Current configuration:');
|
|
73
|
+
console.log(` Server URL: ${config.serverUrl}`);
|
|
74
|
+
console.log(` Machine ID: ${config.machineId}`);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (options.server) {
|
|
78
|
+
(0, config_1.setConfig)({ serverUrl: options.server });
|
|
79
|
+
console.log(`Server URL set to: ${options.server}`);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
program.parse();
|
|
83
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,yCAAoC;AACpC,uCAAyC;AACzC,qCAAgD;AAChD,uCAAyB;AACzB,2CAA6B;AAE7B,iCAAiC;AACjC,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;AACnE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;AAC1E,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;AAEpC,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACF,IAAI,CAAC,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,7 @@
|
|
|
1
|
+
export { spawnExec as spawnPTY, writeToExec as writeToPTY, killExec as killPTY, onExecData as onPTYData, onExecExit as onPTYExit, isExecRunning as isPTYRunning, ExecOptions as PTYOptions } from './exec';
|
|
2
|
+
export declare function getLocalSize(): {
|
|
3
|
+
cols: number;
|
|
4
|
+
rows: number;
|
|
5
|
+
};
|
|
6
|
+
export declare function resizePTY(cols: number, rows: number): void;
|
|
7
|
+
//# sourceMappingURL=pty.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pty.d.ts","sourceRoot":"","sources":["../src/pty.ts"],"names":[],"mappings":"AACA,OAAO,EACH,SAAS,IAAI,QAAQ,EACrB,WAAW,IAAI,UAAU,EACzB,QAAQ,IAAI,OAAO,EACnB,UAAU,IAAI,SAAS,EACvB,UAAU,IAAI,SAAS,EACvB,aAAa,IAAI,YAAY,EAC7B,WAAW,IAAI,UAAU,EAC5B,MAAM,QAAQ,CAAC;AAOhB,wBAAgB,YAAY,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAE7D;AAGD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAI1D"}
|
package/dist/pty.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isPTYRunning = exports.onPTYExit = exports.onPTYData = exports.killPTY = exports.writeToPTY = exports.spawnPTY = void 0;
|
|
4
|
+
exports.getLocalSize = getLocalSize;
|
|
5
|
+
exports.resizePTY = resizePTY;
|
|
6
|
+
// Re-export exec functions for compatibility during transition
|
|
7
|
+
var exec_1 = require("./exec");
|
|
8
|
+
Object.defineProperty(exports, "spawnPTY", { enumerable: true, get: function () { return exec_1.spawnExec; } });
|
|
9
|
+
Object.defineProperty(exports, "writeToPTY", { enumerable: true, get: function () { return exec_1.writeToExec; } });
|
|
10
|
+
Object.defineProperty(exports, "killPTY", { enumerable: true, get: function () { return exec_1.killExec; } });
|
|
11
|
+
Object.defineProperty(exports, "onPTYData", { enumerable: true, get: function () { return exec_1.onExecData; } });
|
|
12
|
+
Object.defineProperty(exports, "onPTYExit", { enumerable: true, get: function () { return exec_1.onExecExit; } });
|
|
13
|
+
Object.defineProperty(exports, "isPTYRunning", { enumerable: true, get: function () { return exec_1.isExecRunning; } });
|
|
14
|
+
// Stub functions for terminal size (not needed in exec mode)
|
|
15
|
+
let localCols = 80;
|
|
16
|
+
let localRows = 24;
|
|
17
|
+
// Get local terminal size (stub for compatibility)
|
|
18
|
+
function getLocalSize() {
|
|
19
|
+
return { cols: localCols, rows: localRows };
|
|
20
|
+
}
|
|
21
|
+
// Resize PTY (stub for compatibility in exec mode)
|
|
22
|
+
function resizePTY(cols, rows) {
|
|
23
|
+
// No-op in exec mode, terminal size is not managed
|
|
24
|
+
localCols = cols;
|
|
25
|
+
localRows = rows;
|
|
26
|
+
}
|
|
27
|
+
//# 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":";;;AAgBA,oCAEC;AAGD,8BAIC;AAzBD,+DAA+D;AAC/D,+BAQgB;AAPZ,gGAAA,SAAS,OAAY;AACrB,kGAAA,WAAW,OAAc;AACzB,+FAAA,QAAQ,OAAW;AACnB,iGAAA,UAAU,OAAa;AACvB,iGAAA,UAAU,OAAa;AACvB,oGAAA,aAAa,OAAgB;AAIjC,6DAA6D;AAC7D,IAAI,SAAS,GAAG,EAAE,CAAC;AACnB,IAAI,SAAS,GAAG,EAAE,CAAC;AAEnB,mDAAmD;AACnD,SAAgB,YAAY;IACxB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AAChD,CAAC;AAED,mDAAmD;AACnD,SAAgB,SAAS,CAAC,IAAY,EAAE,IAAY;IAChD,mDAAmD;IACnD,SAAS,GAAG,IAAI,CAAC;IACjB,SAAS,GAAG,IAAI,CAAC;AACrB,CAAC"}
|
package/dist/relay.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay.d.ts","sourceRoot":"","sources":["../src/relay.ts"],"names":[],"mappings":"AAkCA,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CA+ErE;AAED,wBAAgB,SAAS,IAAI,IAAI,CAiBhC;AAED,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAGD,wBAAgB,aAAa,IAAI,IAAI,CAEpC"}
|
package/dist/relay.js
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.startRelay = startRelay;
|
|
7
|
+
exports.stopRelay = stopRelay;
|
|
8
|
+
exports.isRelayRunning = isRelayRunning;
|
|
9
|
+
exports.onLocalResize = onLocalResize;
|
|
10
|
+
const axios_1 = __importDefault(require("axios"));
|
|
11
|
+
const pty_1 = require("./pty");
|
|
12
|
+
let isRunning = false;
|
|
13
|
+
let pollInterval = null;
|
|
14
|
+
let outputBuffer = [];
|
|
15
|
+
let flushTimer = null;
|
|
16
|
+
const POLL_INTERVAL = 100; // Poll for input every 100ms
|
|
17
|
+
const FLUSH_INTERVAL = 50; // Flush output every 50ms
|
|
18
|
+
// Track web client size
|
|
19
|
+
let webCols = 0;
|
|
20
|
+
let webRows = 0;
|
|
21
|
+
// Calculate and apply minimum size
|
|
22
|
+
function applyMinSize() {
|
|
23
|
+
const local = (0, pty_1.getLocalSize)();
|
|
24
|
+
// If web client hasn't connected yet, use local size
|
|
25
|
+
if (webCols === 0 || webRows === 0) {
|
|
26
|
+
return; // Don't resize yet
|
|
27
|
+
}
|
|
28
|
+
// Use minimum of both dimensions (byobu-style)
|
|
29
|
+
const minCols = Math.min(local.cols, webCols);
|
|
30
|
+
const minRows = Math.min(local.rows, webRows);
|
|
31
|
+
// Only resize if we have valid dimensions
|
|
32
|
+
if (minCols > 0 && minRows > 0) {
|
|
33
|
+
(0, pty_1.resizePTY)(minCols, minRows);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function startRelay(sessionId, serverUrl) {
|
|
37
|
+
isRunning = true;
|
|
38
|
+
console.log(' [Relay] Starting HTTP relay...');
|
|
39
|
+
// Set up PTY data forwarding
|
|
40
|
+
(0, pty_1.onPTYData)((data) => {
|
|
41
|
+
outputBuffer.push(data);
|
|
42
|
+
});
|
|
43
|
+
// Handle PTY exit
|
|
44
|
+
(0, pty_1.onPTYExit)(async (code) => {
|
|
45
|
+
try {
|
|
46
|
+
await axios_1.default.post(`${serverUrl}/api/terminal?sessionId=${sessionId}`, {
|
|
47
|
+
type: 'exit',
|
|
48
|
+
code,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// Ignore errors on exit
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
// Start output flushing
|
|
56
|
+
flushTimer = setInterval(async () => {
|
|
57
|
+
if (outputBuffer.length === 0)
|
|
58
|
+
return;
|
|
59
|
+
const dataToSend = outputBuffer.join('');
|
|
60
|
+
outputBuffer = [];
|
|
61
|
+
try {
|
|
62
|
+
await axios_1.default.post(`${serverUrl}/api/terminal?sessionId=${sessionId}`, {
|
|
63
|
+
type: 'output',
|
|
64
|
+
data: dataToSend,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
if (process.env.DEBUG) {
|
|
69
|
+
console.error(' [Relay] Failed to send output:', error);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}, FLUSH_INTERVAL);
|
|
73
|
+
// Start polling for input and resize events
|
|
74
|
+
pollInterval = setInterval(async () => {
|
|
75
|
+
if (!isRunning)
|
|
76
|
+
return;
|
|
77
|
+
try {
|
|
78
|
+
const response = await axios_1.default.get(`${serverUrl}/api/terminal`, {
|
|
79
|
+
params: { sessionId, mode: 'input' },
|
|
80
|
+
timeout: 5000,
|
|
81
|
+
});
|
|
82
|
+
const { inputs, resize } = response.data;
|
|
83
|
+
// Handle resize from web client
|
|
84
|
+
if (resize && resize.cols && resize.rows) {
|
|
85
|
+
webCols = resize.cols;
|
|
86
|
+
webRows = resize.rows;
|
|
87
|
+
applyMinSize();
|
|
88
|
+
}
|
|
89
|
+
// Handle input from web client
|
|
90
|
+
if (inputs && Array.isArray(inputs)) {
|
|
91
|
+
for (const input of inputs) {
|
|
92
|
+
// Debug: log input
|
|
93
|
+
if (process.env.DEBUG) {
|
|
94
|
+
const hex = Array.from(Buffer.from(input)).map(b => b.toString(16).padStart(2, '0')).join(' ');
|
|
95
|
+
console.log(`[Debug] Sending to PTY: "${input.replace(/\r/g, '\\r').replace(/\n/g, '\\n')}" [${hex}]`);
|
|
96
|
+
}
|
|
97
|
+
(0, pty_1.writeToPTY)(input);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
if (process.env.DEBUG) {
|
|
103
|
+
console.error(' [Relay] Failed to poll input:', error);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}, POLL_INTERVAL);
|
|
107
|
+
console.log(' [Relay] ✓ HTTP relay started');
|
|
108
|
+
}
|
|
109
|
+
function stopRelay() {
|
|
110
|
+
isRunning = false;
|
|
111
|
+
if (pollInterval) {
|
|
112
|
+
clearInterval(pollInterval);
|
|
113
|
+
pollInterval = null;
|
|
114
|
+
}
|
|
115
|
+
if (flushTimer) {
|
|
116
|
+
clearInterval(flushTimer);
|
|
117
|
+
flushTimer = null;
|
|
118
|
+
}
|
|
119
|
+
outputBuffer = [];
|
|
120
|
+
webCols = 0;
|
|
121
|
+
webRows = 0;
|
|
122
|
+
console.log(' [Relay] Stopped');
|
|
123
|
+
}
|
|
124
|
+
function isRelayRunning() {
|
|
125
|
+
return isRunning;
|
|
126
|
+
}
|
|
127
|
+
// Called when local terminal resizes
|
|
128
|
+
function onLocalResize() {
|
|
129
|
+
applyMinSize();
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=relay.js.map
|
|
@@ -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":"AA8GA,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"}
|