@infrarix/locopilot 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +239 -0
- package/dist/api/index.js +79 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/middleware/rateLimiter.js +27 -0
- package/dist/api/middleware/rateLimiter.js.map +1 -0
- package/dist/api/routes/chat.js +75 -0
- package/dist/api/routes/chat.js.map +1 -0
- package/dist/api/routes/completions.js +72 -0
- package/dist/api/routes/completions.js.map +1 -0
- package/dist/api/routes/health.js +52 -0
- package/dist/api/routes/health.js.map +1 -0
- package/dist/api/routes/models.js +50 -0
- package/dist/api/routes/models.js.map +1 -0
- package/dist/api/routes/training.js +10 -0
- package/dist/api/routes/training.js.map +1 -0
- package/dist/api/services/localRouter.js +201 -0
- package/dist/api/services/localRouter.js.map +1 -0
- package/dist/api/services/localStubs.js +28 -0
- package/dist/api/services/localStubs.js.map +1 -0
- package/dist/api/services/ollama.js +22 -0
- package/dist/api/services/ollama.js.map +1 -0
- package/dist/api/types.js +3 -0
- package/dist/api/types.js.map +1 -0
- package/dist/api/utils/sse.js +78 -0
- package/dist/api/utils/sse.js.map +1 -0
- package/dist/cli/commands/doctor.js +230 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/expose.js +98 -0
- package/dist/cli/commands/expose.js.map +1 -0
- package/dist/cli/commands/init.js +340 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/login.js +116 -0
- package/dist/cli/commands/login.js.map +1 -0
- package/dist/cli/commands/logout.js +38 -0
- package/dist/cli/commands/logout.js.map +1 -0
- package/dist/cli/commands/logs.js +95 -0
- package/dist/cli/commands/logs.js.map +1 -0
- package/dist/cli/commands/models.js +106 -0
- package/dist/cli/commands/models.js.map +1 -0
- package/dist/cli/commands/start.js +132 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/train.js +211 -0
- package/dist/cli/commands/train.js.map +1 -0
- package/dist/cli/commands/usage.js +43 -0
- package/dist/cli/commands/usage.js.map +1 -0
- package/dist/cli/commands/whoami.js +54 -0
- package/dist/cli/commands/whoami.js.map +1 -0
- package/dist/cli/index.js +49 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/utils/banner.js +177 -0
- package/dist/cli/utils/banner.js.map +1 -0
- package/dist/cli/utils/paths.js +37 -0
- package/dist/cli/utils/paths.js.map +1 -0
- package/dist/cloud/client.js +157 -0
- package/dist/cloud/client.js.map +1 -0
- package/dist/shared/constants.js +39 -0
- package/dist/shared/constants.js.map +1 -0
- package/dist/shared/crypto.js +26 -0
- package/dist/shared/crypto.js.map +1 -0
- package/dist/shared/db/pool.js +83 -0
- package/dist/shared/db/pool.js.map +1 -0
- package/dist/shared/errors.js +59 -0
- package/dist/shared/errors.js.map +1 -0
- package/dist/shared/index.js +24 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/shared/ndjson.js +39 -0
- package/dist/shared/ndjson.js.map +1 -0
- package/dist/shared/runtime/ollama/index.js +55 -0
- package/dist/shared/runtime/ollama/index.js.map +1 -0
- package/dist/shared/types.js +3 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/training/adapters/axolotl.js +83 -0
- package/dist/training/adapters/axolotl.js.map +1 -0
- package/dist/training/adapters/axolotl_runner.py +38 -0
- package/dist/training/adapters/mlx.js +57 -0
- package/dist/training/adapters/mlx.js.map +1 -0
- package/dist/training/adapters/mlx_runner.py +175 -0
- package/dist/training/adapters/unsloth.js +57 -0
- package/dist/training/adapters/unsloth.js.map +1 -0
- package/dist/training/adapters/unsloth_runner.py +116 -0
- package/dist/training/index.js +47 -0
- package/dist/training/index.js.map +1 -0
- package/dist/training/types.js +18 -0
- package/dist/training/types.js.map +1 -0
- package/dist/training/validator.js +67 -0
- package/dist/training/validator.js.map +1 -0
- package/dist/worker/executor.js +98 -0
- package/dist/worker/executor.js.map +1 -0
- package/dist/worker/handlers.js +197 -0
- package/dist/worker/handlers.js.map +1 -0
- package/dist/worker/index.js +45 -0
- package/dist/worker/index.js.map +1 -0
- package/dist/worker/logStore.js +24 -0
- package/dist/worker/logStore.js.map +1 -0
- package/dist/worker/types.js +3 -0
- package/dist/worker/types.js.map +1 -0
- package/dist/worker/worker.js +12 -0
- package/dist/worker/worker.js.map +1 -0
- package/package.json +81 -0
|
@@ -0,0 +1,54 @@
|
|
|
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
|
+
const commander_1 = require("commander");
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const client_1 = require("../../cloud/client");
|
|
9
|
+
const cmd = new commander_1.Command('whoami').description('Show the currently logged-in user and plan');
|
|
10
|
+
cmd.action(async () => {
|
|
11
|
+
const token = (0, client_1.getCloudToken)();
|
|
12
|
+
if (!token) {
|
|
13
|
+
console.log(chalk_1.default.gray('\n Not logged in.'));
|
|
14
|
+
console.log(chalk_1.default.gray(' Run: ') + chalk_1.default.white('locopilot login') + '\n');
|
|
15
|
+
process.exit(0);
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
const res = await (0, client_1.callCloudAuthMe)(`Bearer ${token}`);
|
|
19
|
+
if (res.status === 401) {
|
|
20
|
+
console.error(chalk_1.default.red('\n ✖ Token rejected by cloud.'));
|
|
21
|
+
console.error(chalk_1.default.gray(' Run: ') + chalk_1.default.white('locopilot login') + ' with a fresh token.\n');
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
if (!res.ok) {
|
|
25
|
+
console.error(chalk_1.default.red(`\n ✖ Could not reach /api/auth/me (status ${res.status}).\n`));
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
const me = (await res.json());
|
|
29
|
+
const plan = me.plan ?? 'free';
|
|
30
|
+
const renews = me.current_period_end ? new Date(me.current_period_end).toLocaleDateString() : '—';
|
|
31
|
+
console.log();
|
|
32
|
+
console.log(' ' + chalk_1.default.gray('Email: ') + chalk_1.default.white(me.email));
|
|
33
|
+
console.log(' ' + chalk_1.default.gray('Plan: ') + planFmt(plan));
|
|
34
|
+
console.log(' ' + chalk_1.default.gray('Renews: ') + chalk_1.default.white(renews));
|
|
35
|
+
console.log();
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
console.error(chalk_1.default.red(`\n ✖ Network error: ${err.message}\n`));
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
function planFmt(plan) {
|
|
43
|
+
if (plan === 'pro_active')
|
|
44
|
+
return chalk_1.default.green('Pro (active)');
|
|
45
|
+
if (plan === 'pro_past_due')
|
|
46
|
+
return chalk_1.default.yellow('Pro (past due)');
|
|
47
|
+
if (plan === 'pro_canceled')
|
|
48
|
+
return chalk_1.default.gray('Pro (canceled)');
|
|
49
|
+
if (plan === 'pro_inactive')
|
|
50
|
+
return chalk_1.default.gray('Pro (inactive)');
|
|
51
|
+
return chalk_1.default.gray('Free');
|
|
52
|
+
}
|
|
53
|
+
exports.default = cmd;
|
|
54
|
+
//# sourceMappingURL=whoami.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../../src/cli/commands/whoami.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
// Recover from a deleted/inaccessible cwd before any module that touches
|
|
8
|
+
// process.cwd() loads. The shell may be sitting in a directory that has
|
|
9
|
+
// since been removed; chdir to $HOME so dotenv, fs, etc. don't crash.
|
|
10
|
+
try {
|
|
11
|
+
process.cwd();
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
process.chdir(require('os').homedir());
|
|
15
|
+
}
|
|
16
|
+
const path_1 = __importDefault(require("path"));
|
|
17
|
+
const commander_1 = require("commander");
|
|
18
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
19
|
+
const init_1 = __importDefault(require("./commands/init"));
|
|
20
|
+
const start_1 = __importDefault(require("./commands/start"));
|
|
21
|
+
const doctor_1 = __importDefault(require("./commands/doctor"));
|
|
22
|
+
const models_1 = __importDefault(require("./commands/models"));
|
|
23
|
+
const expose_1 = __importDefault(require("./commands/expose"));
|
|
24
|
+
const train_1 = __importDefault(require("./commands/train"));
|
|
25
|
+
const logs_1 = __importDefault(require("./commands/logs"));
|
|
26
|
+
const login_1 = __importDefault(require("./commands/login"));
|
|
27
|
+
const logout_1 = __importDefault(require("./commands/logout"));
|
|
28
|
+
const whoami_1 = __importDefault(require("./commands/whoami"));
|
|
29
|
+
const usage_1 = __importDefault(require("./commands/usage"));
|
|
30
|
+
// __dirname from dist/cli/ → 2 levels up = project root
|
|
31
|
+
const pkg = require(path_1.default.resolve(__dirname, '../../package.json'));
|
|
32
|
+
const program = new commander_1.Command();
|
|
33
|
+
program.name('locopilot').description('LocoPilot CLI').version(pkg.version);
|
|
34
|
+
program.addCommand(init_1.default);
|
|
35
|
+
program.addCommand(start_1.default);
|
|
36
|
+
program.addCommand(doctor_1.default);
|
|
37
|
+
program.addCommand(models_1.default);
|
|
38
|
+
program.addCommand(expose_1.default);
|
|
39
|
+
program.addCommand(train_1.default);
|
|
40
|
+
program.addCommand(logs_1.default);
|
|
41
|
+
program.addCommand(login_1.default);
|
|
42
|
+
program.addCommand(logout_1.default);
|
|
43
|
+
program.addCommand(whoami_1.default);
|
|
44
|
+
program.addCommand(usage_1.default);
|
|
45
|
+
program.parseAsync(process.argv).catch((err) => {
|
|
46
|
+
console.error(chalk_1.default.red(`\n ✖ Error: ${err.message}\n`));
|
|
47
|
+
process.exit(1);
|
|
48
|
+
});
|
|
49
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA,YAAY,CAAC;;;;;AAEb,yEAAyE;AACzE,wEAAwE;AACxE,sEAAsE;AACtE,IAAI,CAAC;IACH,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAAC,MAAM,CAAC;IACP,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,gDAAwB;AACxB,yCAAoC;AACpC,kDAA0B;AAC1B,2DAAsC;AACtC,6DAAwC;AACxC,+DAA0C;AAC1C,+DAA0C;AAC1C,+DAA0C;AAC1C,6DAAwC;AACxC,2DAAsC;AACtC,6DAAwC;AACxC,+DAA0C;AAC1C,+DAA0C;AAC1C,6DAAwC;AAExC,wDAAwD;AACxD,MAAM,GAAG,GAAG,OAAO,CAAC,cAAI,CAAC,OAAO,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAwB,CAAC;AAE1F,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAC9B,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAE5E,OAAO,CAAC,UAAU,CAAC,cAAO,CAAC,CAAC;AAC5B,OAAO,CAAC,UAAU,CAAC,eAAQ,CAAC,CAAC;AAC7B,OAAO,CAAC,UAAU,CAAC,gBAAS,CAAC,CAAC;AAC9B,OAAO,CAAC,UAAU,CAAC,gBAAS,CAAC,CAAC;AAC9B,OAAO,CAAC,UAAU,CAAC,gBAAS,CAAC,CAAC;AAC9B,OAAO,CAAC,UAAU,CAAC,eAAQ,CAAC,CAAC;AAC7B,OAAO,CAAC,UAAU,CAAC,cAAO,CAAC,CAAC;AAC5B,OAAO,CAAC,UAAU,CAAC,eAAQ,CAAC,CAAC;AAC7B,OAAO,CAAC,UAAU,CAAC,gBAAS,CAAC,CAAC;AAC9B,OAAO,CAAC,UAAU,CAAC,gBAAS,CAAC,CAAC;AAC9B,OAAO,CAAC,UAAU,CAAC,eAAQ,CAAC,CAAC;AAE7B,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;IACpD,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,gBAAgB,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;IAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,177 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.printBanner = printBanner;
|
|
40
|
+
exports.printSuccess = printSuccess;
|
|
41
|
+
exports.printWarn = printWarn;
|
|
42
|
+
exports.printError = printError;
|
|
43
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
44
|
+
const fs = __importStar(require("fs"));
|
|
45
|
+
const path = __importStar(require("path"));
|
|
46
|
+
// ─── Terminal detection ────────────────────────────────────────────────────
|
|
47
|
+
function isIterm2() {
|
|
48
|
+
return !!process.env.ITERM_SESSION_ID || process.env.TERM_PROGRAM === 'iTerm.app' || !!process.env.ITERM_PROFILE;
|
|
49
|
+
}
|
|
50
|
+
function isKitty() {
|
|
51
|
+
return process.env.TERM === 'xterm-kitty' || !!process.env.KITTY_WINDOW_ID;
|
|
52
|
+
}
|
|
53
|
+
function isWezterm() {
|
|
54
|
+
return process.env.TERM_PROGRAM === 'WezTerm';
|
|
55
|
+
}
|
|
56
|
+
function isWarp() {
|
|
57
|
+
return process.env.TERM_PROGRAM === 'WarpTerminal';
|
|
58
|
+
}
|
|
59
|
+
function supportsInlineImages() {
|
|
60
|
+
// iTerm2 protocol is supported by iTerm2, WezTerm, Warp, Tabby, etc.
|
|
61
|
+
if (isIterm2() || isWezterm() || isWarp())
|
|
62
|
+
return 'iterm2';
|
|
63
|
+
if (isKitty())
|
|
64
|
+
return 'kitty';
|
|
65
|
+
return 'ascii';
|
|
66
|
+
}
|
|
67
|
+
// ─── Logo path ────────────────────────────────────────────────────────────
|
|
68
|
+
// Looks for logo next to the compiled JS, then next to this source file
|
|
69
|
+
function findLogo() {
|
|
70
|
+
const candidates = [
|
|
71
|
+
path.join(__dirname, 'logo-banner.png'),
|
|
72
|
+
path.join(__dirname, '..', 'logo-banner.png'),
|
|
73
|
+
path.join(process.cwd(), 'logo-banner.png'),
|
|
74
|
+
];
|
|
75
|
+
for (const p of candidates) {
|
|
76
|
+
if (fs.existsSync(p))
|
|
77
|
+
return p;
|
|
78
|
+
}
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
// ─── iTerm2 / WezTerm inline image protocol ───────────────────────────────
|
|
82
|
+
// ESC ] 1337 ; File=... : <base64> BEL
|
|
83
|
+
function printIterm2Image(logoPath, widthCells = 80) {
|
|
84
|
+
const data = fs.readFileSync(logoPath);
|
|
85
|
+
const b64 = data.toString('base64');
|
|
86
|
+
const size = data.length;
|
|
87
|
+
const args = `inline=1;width=${widthCells};height=12;preserveAspectRatio=1;size=${size}`;
|
|
88
|
+
process.stdout.write(`\x1b]1337;File=${args}:${b64}\x07\n`);
|
|
89
|
+
}
|
|
90
|
+
// ─── Kitty graphics protocol ──────────────────────────────────────────────
|
|
91
|
+
// Chunked APC sequence: ESC _ G <params> ; <base64-chunk> ESC \
|
|
92
|
+
function printKittyImage(logoPath) {
|
|
93
|
+
const data = fs.readFileSync(logoPath);
|
|
94
|
+
const b64 = data.toString('base64');
|
|
95
|
+
const CHUNK = 4096;
|
|
96
|
+
let first = true;
|
|
97
|
+
for (let i = 0; i < b64.length; i += CHUNK) {
|
|
98
|
+
const chunk = b64.slice(i, i + CHUNK);
|
|
99
|
+
const more = i + CHUNK < b64.length ? 1 : 0;
|
|
100
|
+
if (first) {
|
|
101
|
+
// a=T → transmit & display
|
|
102
|
+
// f=100 → PNG format
|
|
103
|
+
// c=80,r=12 → 80 cols × 12 rows
|
|
104
|
+
process.stdout.write(`\x1b_Ga=T,f=100,c=80,r=12,m=${more};${chunk}\x1b\\`);
|
|
105
|
+
first = false;
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
process.stdout.write(`\x1b_Gm=${more};${chunk}\x1b\\`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
process.stdout.write('\n');
|
|
112
|
+
}
|
|
113
|
+
// ─── ASCII fallback ───────────────────────────────────────────────────────
|
|
114
|
+
function printAsciiSlug() {
|
|
115
|
+
const B1 = chalk_1.default.bold.hex('#1E90FF'); // Blue speed lines
|
|
116
|
+
const B2 = chalk_1.default.bold.hex('#00BFFF'); // Quick (Blue)
|
|
117
|
+
const G1 = chalk_1.default.bold.hex('#A8E63D'); // Slug (Green)
|
|
118
|
+
const G2 = chalk_1.default.hex('#4A8A15'); // Eye stalks (Dark Green)
|
|
119
|
+
const lines = [
|
|
120
|
+
` ${B2('____')} ${B2('_')} ${B2('_')} ${G1('____')} ${G1('_')} `,
|
|
121
|
+
` ${B1('===')} ${B2('/ __ \\')} _ _ ${B2('(_)')} ${B2('___')}${B2('| | __')}${G1('/ ___|')}${G1('| |_')} ${G1('_')} ${G1('__ _')} `,
|
|
122
|
+
` ${B1('====')} ${B2('/ / / /')}${B2('| | | |')}${B2('| |')}${B2('/ __|')}${B2('| |/ /')}${G1('\\___ \\')}${G1('| | | | |')}${G1('/ _` |')} `,
|
|
123
|
+
` ${B1('===')} ${B2('/ /_/ /')} ${B2('| |_| |')}${B2('| |')}${B2('(__|')} ${B2('<')} ${G1('___) |')} ${G1('| | |_| |')}${G1('(_| |')} ${G2('o o')}`,
|
|
124
|
+
` ${B1('====')} ${B2('\\___\\_\\')} ${B2('\\__,_|')}${B2('|_|')}${B2('\\___|')}${B2('_|\\_\\')}${G1('|____/')} ${G1('|_|')}${G1('\\__,_|')}${G1('\\__, |')} ${G2('| |')}`,
|
|
125
|
+
` ${G1('|___/')} ${G2('|_|')}`,
|
|
126
|
+
];
|
|
127
|
+
console.log('');
|
|
128
|
+
lines.forEach((l) => console.log(l));
|
|
129
|
+
}
|
|
130
|
+
// ─── Tagline ──────────────────────────────────────────────────────────────
|
|
131
|
+
function printTagline() {
|
|
132
|
+
const N = chalk_1.default.bold.hex('#A8E63D');
|
|
133
|
+
const B = chalk_1.default.hex('#1E90FF');
|
|
134
|
+
const dim = chalk_1.default.hex('#444444');
|
|
135
|
+
const dg = chalk_1.default.hex('#2e5a10');
|
|
136
|
+
console.log('');
|
|
137
|
+
console.log(' ' + N('⚡ LocoPilot') + ' ' + dim('v1.0') + ' ' + B('Inference. Simplified.'));
|
|
138
|
+
console.log(' ' + dg('Local-first') + dim(' · ') + dg('OpenAI Compatible') + dim(' · ') + dg('GPU Scalable'));
|
|
139
|
+
console.log('');
|
|
140
|
+
}
|
|
141
|
+
// ─── Main export ──────────────────────────────────────────────────────────
|
|
142
|
+
function printBanner() {
|
|
143
|
+
const mode = supportsInlineImages();
|
|
144
|
+
const logoPath = findLogo();
|
|
145
|
+
console.log('');
|
|
146
|
+
if (logoPath) {
|
|
147
|
+
try {
|
|
148
|
+
if (mode === 'iterm2') {
|
|
149
|
+
printIterm2Image(logoPath, 80);
|
|
150
|
+
}
|
|
151
|
+
else if (mode === 'kitty') {
|
|
152
|
+
printKittyImage(logoPath);
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
printAsciiSlug();
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
// If image rendering fails for any reason, fall back gracefully
|
|
160
|
+
printAsciiSlug();
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
printAsciiSlug();
|
|
165
|
+
}
|
|
166
|
+
printTagline();
|
|
167
|
+
}
|
|
168
|
+
function printSuccess(msg) {
|
|
169
|
+
console.log(chalk_1.default.green(' ✔ ') + msg);
|
|
170
|
+
}
|
|
171
|
+
function printWarn(msg) {
|
|
172
|
+
console.log(chalk_1.default.yellow(' ⚠ ') + msg);
|
|
173
|
+
}
|
|
174
|
+
function printError(msg) {
|
|
175
|
+
console.log(chalk_1.default.red(' ✖ ') + msg);
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=banner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"banner.js","sourceRoot":"","sources":["../../../src/cli/utils/banner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
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.SQLITE_PATH = exports.CONFIG_PATH = exports.DATA_DIR = exports.ENV_PATH = exports.HOME_DIR = void 0;
|
|
7
|
+
exports.ensureHomeDir = ensureHomeDir;
|
|
8
|
+
exports.loadEnv = loadEnv;
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const os_1 = __importDefault(require("os"));
|
|
11
|
+
const fs_1 = __importDefault(require("fs"));
|
|
12
|
+
const dotenv_1 = __importDefault(require("dotenv"));
|
|
13
|
+
exports.HOME_DIR = path_1.default.join(os_1.default.homedir(), '.locopilot');
|
|
14
|
+
exports.ENV_PATH = path_1.default.join(exports.HOME_DIR, '.env');
|
|
15
|
+
exports.DATA_DIR = path_1.default.join(exports.HOME_DIR, 'data');
|
|
16
|
+
exports.CONFIG_PATH = path_1.default.join(exports.HOME_DIR, 'config.json');
|
|
17
|
+
exports.SQLITE_PATH = path_1.default.join(exports.HOME_DIR, 'db.sqlite');
|
|
18
|
+
function ensureHomeDir() {
|
|
19
|
+
if (!fs_1.default.existsSync(exports.HOME_DIR))
|
|
20
|
+
fs_1.default.mkdirSync(exports.HOME_DIR, { recursive: true });
|
|
21
|
+
if (!fs_1.default.existsSync(exports.DATA_DIR))
|
|
22
|
+
fs_1.default.mkdirSync(exports.DATA_DIR, { recursive: true });
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Load .env from an explicit path. dotenv internally calls process.cwd() even
|
|
26
|
+
* when given an explicit path, which throws if the shell is in a deleted dir.
|
|
27
|
+
* Wrap in try/catch so env loading is best-effort and never crashes the CLI.
|
|
28
|
+
*/
|
|
29
|
+
function loadEnv(envPath = exports.ENV_PATH) {
|
|
30
|
+
try {
|
|
31
|
+
dotenv_1.default.config({ path: envPath });
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// best-effort: continue without env
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/cli/utils/paths.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;;;;AAab,sCAGC;AAOD,0BAMC;AA3BD,gDAAwB;AACxB,4CAAoB;AACpB,4CAAoB;AACpB,oDAA4B;AAEf,QAAA,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;AACjD,QAAA,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,gBAAQ,EAAE,MAAM,CAAC,CAAC;AACvC,QAAA,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,gBAAQ,EAAE,MAAM,CAAC,CAAC;AACvC,QAAA,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,gBAAQ,EAAE,aAAa,CAAC,CAAC;AACjD,QAAA,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,gBAAQ,EAAE,WAAW,CAAC,CAAC;AAE5D,SAAgB,aAAa;IAC3B,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,gBAAQ,CAAC;QAAE,YAAE,CAAC,SAAS,CAAC,gBAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1E,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,gBAAQ,CAAC;QAAE,YAAE,CAAC,SAAS,CAAC,gBAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC5E,CAAC;AAED;;;;GAIG;AACH,SAAgB,OAAO,CAAC,UAAkB,gBAAQ;IAChD,IAAI,CAAC;QACH,gBAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,oCAAoC;IACtC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ProSubscriptionRequiredError = exports.CLOUD_URL = void 0;
|
|
4
|
+
exports.readCloudConfig = readCloudConfig;
|
|
5
|
+
exports.getCloudToken = getCloudToken;
|
|
6
|
+
exports.isProUser = isProUser;
|
|
7
|
+
exports.throwIfProRequired = throwIfProRequired;
|
|
8
|
+
exports.callCloudInference = callCloudInference;
|
|
9
|
+
exports.callCloudTrain = callCloudTrain;
|
|
10
|
+
exports.callCloudTrainStatus = callCloudTrainStatus;
|
|
11
|
+
exports.callCloudTrainLogs = callCloudTrainLogs;
|
|
12
|
+
exports.callCloudHealth = callCloudHealth;
|
|
13
|
+
exports.callCloudAuthVerify = callCloudAuthVerify;
|
|
14
|
+
exports.callCloudTunnel = callCloudTunnel;
|
|
15
|
+
exports.callCloudAuthMe = callCloudAuthMe;
|
|
16
|
+
exports.callCloudUsage = callCloudUsage;
|
|
17
|
+
exports.callCloudModels = callCloudModels;
|
|
18
|
+
exports.ensureConfigDir = ensureConfigDir;
|
|
19
|
+
const fs_1 = require("fs");
|
|
20
|
+
const os_1 = require("os");
|
|
21
|
+
const path_1 = require("path");
|
|
22
|
+
// Resolution order: LOCOPILOT_CLOUD_URL (legacy) → INFRARIX_API_URL
|
|
23
|
+
// (unified platform) → default. The unified Infrarix Platform backend
|
|
24
|
+
// preserves LocoPilot's /api/* contract end-to-end.
|
|
25
|
+
exports.CLOUD_URL = process.env.LOCOPILOT_CLOUD_URL ?? process.env.INFRARIX_API_URL ?? 'https://api.infrarix.com';
|
|
26
|
+
const CLOUD_TIMEOUT_MS = 30_000;
|
|
27
|
+
const CONFIG_DIR = (0, path_1.join)((0, os_1.homedir)(), '.locopilot');
|
|
28
|
+
const CONFIG_PATH = (0, path_1.join)(CONFIG_DIR, 'config.json');
|
|
29
|
+
/** Reads ~/.locopilot/config.json. Returns null if absent or invalid. */
|
|
30
|
+
function readCloudConfig() {
|
|
31
|
+
try {
|
|
32
|
+
const raw = (0, fs_1.readFileSync)(CONFIG_PATH, 'utf-8');
|
|
33
|
+
const cfg = JSON.parse(raw);
|
|
34
|
+
if (typeof cfg.token === 'string' && cfg.token.startsWith('qs_')) {
|
|
35
|
+
return { token: cfg.token };
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// file missing or malformed
|
|
40
|
+
}
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
/** Returns the stored qs_ token, or null if not logged in. */
|
|
44
|
+
function getCloudToken() {
|
|
45
|
+
return readCloudConfig()?.token ?? null;
|
|
46
|
+
}
|
|
47
|
+
/** True only when a valid qs_ token exists in ~/.locopilot/config.json.
|
|
48
|
+
* Note: this proves the user has *logged in*, NOT that they have an active
|
|
49
|
+
* Pro subscription. Subscription status is enforced server-side and may
|
|
50
|
+
* return 403 `pro_subscription_required` even with a valid token. */
|
|
51
|
+
function isProUser() {
|
|
52
|
+
return getCloudToken() !== null;
|
|
53
|
+
}
|
|
54
|
+
/** Thrown when the cloud backend rejects a request because the user's
|
|
55
|
+
* Pro subscription is missing, expired, past-due, or canceled. */
|
|
56
|
+
class ProSubscriptionRequiredError extends Error {
|
|
57
|
+
upgradeUrl;
|
|
58
|
+
constructor(upgradeUrl, message) {
|
|
59
|
+
super(message ?? 'pro_subscription_required');
|
|
60
|
+
this.upgradeUrl = upgradeUrl;
|
|
61
|
+
this.name = 'ProSubscriptionRequiredError';
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports.ProSubscriptionRequiredError = ProSubscriptionRequiredError;
|
|
65
|
+
/** Inspects a 403 response. If body matches the Pro-required shape, throws
|
|
66
|
+
* ProSubscriptionRequiredError; otherwise returns the response unchanged.
|
|
67
|
+
* Reads via .clone() so callers can still consume the original body. */
|
|
68
|
+
async function throwIfProRequired(res) {
|
|
69
|
+
if (res.status !== 403)
|
|
70
|
+
return res;
|
|
71
|
+
let body = null;
|
|
72
|
+
try {
|
|
73
|
+
body = (await res.clone().json());
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return res;
|
|
77
|
+
}
|
|
78
|
+
if (body?.error === 'pro_subscription_required') {
|
|
79
|
+
throw new ProSubscriptionRequiredError(body.upgrade_url ?? 'https://locopilot.com/dashboard', body.message);
|
|
80
|
+
}
|
|
81
|
+
return res;
|
|
82
|
+
}
|
|
83
|
+
// ── Cloud API calls ──────────────────────────────────────────────────────────
|
|
84
|
+
async function callCloudInference(body, authHeader, signal) {
|
|
85
|
+
const res = await fetch(`${exports.CLOUD_URL}/api/inference`, {
|
|
86
|
+
method: 'POST',
|
|
87
|
+
headers: { 'Content-Type': 'application/json', Authorization: authHeader },
|
|
88
|
+
body: JSON.stringify(body),
|
|
89
|
+
signal: signal ?? AbortSignal.timeout(CLOUD_TIMEOUT_MS),
|
|
90
|
+
});
|
|
91
|
+
return throwIfProRequired(res);
|
|
92
|
+
}
|
|
93
|
+
async function callCloudTrain(body, authHeader) {
|
|
94
|
+
const res = await fetch(`${exports.CLOUD_URL}/api/train`, {
|
|
95
|
+
method: 'POST',
|
|
96
|
+
headers: { 'Content-Type': 'application/json', Authorization: authHeader },
|
|
97
|
+
body: JSON.stringify(body),
|
|
98
|
+
signal: AbortSignal.timeout(CLOUD_TIMEOUT_MS),
|
|
99
|
+
});
|
|
100
|
+
return throwIfProRequired(res);
|
|
101
|
+
}
|
|
102
|
+
async function callCloudTrainStatus(jobId, authHeader) {
|
|
103
|
+
return fetch(`${exports.CLOUD_URL}/api/train/${encodeURIComponent(jobId)}`, {
|
|
104
|
+
headers: { Authorization: authHeader },
|
|
105
|
+
signal: AbortSignal.timeout(CLOUD_TIMEOUT_MS),
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
async function callCloudTrainLogs(jobId, authHeader) {
|
|
109
|
+
return fetch(`${exports.CLOUD_URL}/api/train/${encodeURIComponent(jobId)}/logs`, {
|
|
110
|
+
headers: { Authorization: authHeader },
|
|
111
|
+
signal: AbortSignal.timeout(CLOUD_TIMEOUT_MS),
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
async function callCloudHealth(authHeader) {
|
|
115
|
+
return fetch(`${exports.CLOUD_URL}/api/health`, {
|
|
116
|
+
headers: { Authorization: authHeader },
|
|
117
|
+
signal: AbortSignal.timeout(5_000),
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
async function callCloudAuthVerify(authHeader, signal) {
|
|
121
|
+
return fetch(`${exports.CLOUD_URL}/api/auth/verify`, {
|
|
122
|
+
headers: { Authorization: authHeader },
|
|
123
|
+
signal: signal ?? AbortSignal.timeout(10_000),
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
async function callCloudTunnel(authHeader, signal) {
|
|
127
|
+
const res = await fetch(`${exports.CLOUD_URL}/api/tunnel`, {
|
|
128
|
+
method: 'POST',
|
|
129
|
+
headers: { 'Content-Type': 'application/json', Authorization: authHeader },
|
|
130
|
+
body: '{}',
|
|
131
|
+
signal: signal ?? AbortSignal.timeout(CLOUD_TIMEOUT_MS),
|
|
132
|
+
});
|
|
133
|
+
return throwIfProRequired(res);
|
|
134
|
+
}
|
|
135
|
+
async function callCloudAuthMe(authHeader, signal) {
|
|
136
|
+
return fetch(`${exports.CLOUD_URL}/api/auth/me`, {
|
|
137
|
+
headers: { Authorization: authHeader },
|
|
138
|
+
signal: signal ?? AbortSignal.timeout(10_000),
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
async function callCloudUsage(authHeader, signal) {
|
|
142
|
+
return fetch(`${exports.CLOUD_URL}/api/usage`, {
|
|
143
|
+
headers: { Authorization: authHeader },
|
|
144
|
+
signal: signal ?? AbortSignal.timeout(10_000),
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
async function callCloudModels(authHeader, signal) {
|
|
148
|
+
return fetch(`${exports.CLOUD_URL}/api/models`, {
|
|
149
|
+
headers: { Authorization: authHeader },
|
|
150
|
+
signal: signal ?? AbortSignal.timeout(10_000),
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
/** Ensures ~/.locopilot/ directory exists. Called from init and login commands. */
|
|
154
|
+
function ensureConfigDir() {
|
|
155
|
+
(0, fs_1.mkdirSync)(CONFIG_DIR, { recursive: true });
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/cloud/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EMITTER_POLL_TICK_MS = exports.JOB_STATUS_POLL_MS = exports.LOG_EMITTER_WAIT_MS = exports.OLLAMA_HEALTH_TIMEOUT_MS = exports.OLLAMA_LIST_TIMEOUT_MS = exports.CHARS_PER_TOKEN = exports.OLLAMA_HOST = exports.API_PORT = exports.PROVIDERS = exports.VALID_FRAMEWORKS = exports.DATASET_VALIDATION_LINES = exports.MIN_DATASET_EXAMPLES = exports.TRAINING_DEFAULTS = exports.DEFAULT_RATE_WINDOW_SECONDS = exports.DEFAULT_RATE_LIMIT_RPM = exports.SSE_FLUSH_INTERVAL_MS = void 0;
|
|
4
|
+
exports.SSE_FLUSH_INTERVAL_MS = 50;
|
|
5
|
+
exports.DEFAULT_RATE_LIMIT_RPM = parseInt(process.env.RATE_LIMIT_RPM ?? '') || 60;
|
|
6
|
+
exports.DEFAULT_RATE_WINDOW_SECONDS = 60;
|
|
7
|
+
// Free-tier training defaults — conservative for consumer hardware.
|
|
8
|
+
// Pro tier uses larger values set cloud-side by the private adapters.
|
|
9
|
+
exports.TRAINING_DEFAULTS = Object.freeze({
|
|
10
|
+
epochs: 3,
|
|
11
|
+
batchSize: 2, // conservative for local VRAM
|
|
12
|
+
gradientAccumulation: 4,
|
|
13
|
+
learningRate: 2e-4,
|
|
14
|
+
loraR: 8, // smaller rank = less memory on free tier
|
|
15
|
+
loraAlpha: 16, // matched to loraR ratio
|
|
16
|
+
maxSeqLength: 2048,
|
|
17
|
+
});
|
|
18
|
+
exports.MIN_DATASET_EXAMPLES = 10;
|
|
19
|
+
exports.DATASET_VALIDATION_LINES = 5;
|
|
20
|
+
exports.VALID_FRAMEWORKS = Object.freeze(['unsloth', 'axolotl', 'mlx']);
|
|
21
|
+
exports.PROVIDERS = Object.freeze({
|
|
22
|
+
LOCAL: 'local',
|
|
23
|
+
REMOTE: 'remote',
|
|
24
|
+
NOT_FOUND: 'not_found',
|
|
25
|
+
});
|
|
26
|
+
exports.API_PORT = parseInt(process.env.API_PORT ?? '') || 8080;
|
|
27
|
+
exports.OLLAMA_HOST = process.env.OLLAMA_HOST ?? 'http://localhost:11434';
|
|
28
|
+
exports.CHARS_PER_TOKEN = 4;
|
|
29
|
+
// ── Ollama HTTP timeouts ────────────────────────────────────────────────────
|
|
30
|
+
exports.OLLAMA_LIST_TIMEOUT_MS = 8_000;
|
|
31
|
+
exports.OLLAMA_HEALTH_TIMEOUT_MS = 5_000;
|
|
32
|
+
// ── Training worker SSE polling ─────────────────────────────────────────────
|
|
33
|
+
// How long to wait for the executor to register a log emitter after the job
|
|
34
|
+
// is created (handles client SSE-connect race) and how often to poll for
|
|
35
|
+
// terminal state once a stream is open.
|
|
36
|
+
exports.LOG_EMITTER_WAIT_MS = 5_000;
|
|
37
|
+
exports.JOB_STATUS_POLL_MS = 5_000;
|
|
38
|
+
exports.EMITTER_POLL_TICK_MS = 100;
|
|
39
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/shared/constants.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;AAEA,QAAA,qBAAqB,GAAG,EAAE,CAAC;AAE3B,QAAA,sBAAsB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AAE1E,QAAA,2BAA2B,GAAG,EAAE,CAAC;AAE9C,oEAAoE;AACpE,sEAAsE;AACzD,QAAA,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7C,MAAM,EAAE,CAAC;IACT,SAAS,EAAE,CAAC,EAAE,8BAA8B;IAC5C,oBAAoB,EAAE,CAAC;IACvB,YAAY,EAAE,IAAI;IAClB,KAAK,EAAE,CAAC,EAAE,0CAA0C;IACpD,SAAS,EAAE,EAAE,EAAE,yBAAyB;IACxC,YAAY,EAAE,IAAI;CACV,CAAC,CAAC;AAEC,QAAA,oBAAoB,GAAG,EAAE,CAAC;AAE1B,QAAA,wBAAwB,GAAG,CAAC,CAAC;AAE7B,QAAA,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,CAAU,CAAC,CAAC;AAIzE,QAAA,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;IACrC,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,WAAW;CACd,CAAC,CAAC;AAIC,QAAA,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC;AAExD,QAAA,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,wBAAwB,CAAC;AAElE,QAAA,eAAe,GAAG,CAAC,CAAC;AAEjC,+EAA+E;AAClE,QAAA,sBAAsB,GAAG,KAAK,CAAC;AAC/B,QAAA,wBAAwB,GAAG,KAAK,CAAC;AAE9C,+EAA+E;AAC/E,4EAA4E;AAC5E,yEAAyE;AACzE,wCAAwC;AAC3B,QAAA,mBAAmB,GAAG,KAAK,CAAC;AAC5B,QAAA,kBAAkB,GAAG,KAAK,CAAC;AAC3B,QAAA,oBAAoB,GAAG,GAAG,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
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.KEY_PREFIX = void 0;
|
|
7
|
+
exports.hashApiKey = hashApiKey;
|
|
8
|
+
exports.generateApiKey = generateApiKey;
|
|
9
|
+
exports.extractBearerToken = extractBearerToken;
|
|
10
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
11
|
+
exports.KEY_PREFIX = 'tsk_';
|
|
12
|
+
function hashApiKey(rawKey) {
|
|
13
|
+
return crypto_1.default.createHash('sha256').update(rawKey).digest('hex');
|
|
14
|
+
}
|
|
15
|
+
function generateApiKey() {
|
|
16
|
+
const rawKey = `${exports.KEY_PREFIX}${crypto_1.default.randomBytes(24).toString('hex')}`;
|
|
17
|
+
const keyHash = hashApiKey(rawKey);
|
|
18
|
+
return { rawKey, keyHash };
|
|
19
|
+
}
|
|
20
|
+
function extractBearerToken(authHeader) {
|
|
21
|
+
if (!authHeader || !authHeader.startsWith('Bearer '))
|
|
22
|
+
return null;
|
|
23
|
+
const token = authHeader.slice(7).trim();
|
|
24
|
+
return token.length > 0 ? token : null;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=crypto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/shared/crypto.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;;;;AAMb,gCAEC;AAED,wCAIC;AAED,gDAIC;AAlBD,oDAA4B;AAEf,QAAA,UAAU,GAAG,MAAM,CAAC;AAEjC,SAAgB,UAAU,CAAC,MAAc;IACvC,OAAO,gBAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAClE,CAAC;AAED,SAAgB,cAAc;IAC5B,MAAM,MAAM,GAAG,GAAG,kBAAU,GAAG,gBAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;IACxE,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IACnC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAC7B,CAAC;AAED,SAAgB,kBAAkB,CAAC,UAA8B;IAC/D,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IAClE,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACzC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACzC,CAAC"}
|