primellm 0.2.0 ā 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +67 -97
- package/dist/index.d.ts +2 -147
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +328 -253
- package/dist/index.js.map +1 -0
- package/package.json +31 -30
- package/src/index.ts +411 -0
- package/tsconfig.json +27 -0
- package/cli/index.js +0 -34
- package/dist/errors.d.ts +0 -59
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js +0 -93
- package/dist/streaming.d.ts +0 -29
- package/dist/streaming.d.ts.map +0 -1
- package/dist/streaming.js +0 -64
- package/dist/tokenizer.d.ts +0 -42
- package/dist/tokenizer.d.ts.map +0 -1
- package/dist/tokenizer.js +0 -61
- package/dist/types.d.ts +0 -172
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -7
package/dist/index.js
CHANGED
|
@@ -1,279 +1,354 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
*
|
|
6
|
-
* @example
|
|
7
|
-
* import PrimeLLM from "primellm";
|
|
8
|
-
*
|
|
9
|
-
* const client = new PrimeLLM({ apiKey: "primellm_XXX" });
|
|
10
|
-
* const response = await client.chat({
|
|
11
|
-
* model: "gpt-5.1",
|
|
12
|
-
* messages: [{ role: "user", content: "Hello!" }],
|
|
13
|
-
* });
|
|
14
|
-
* console.log(response.choices[0].message.content);
|
|
15
|
-
*/
|
|
16
|
-
import { PrimeLLMError, createErrorFromStatus, } from "./errors.js";
|
|
17
|
-
import { countTokens, setTokenizerAdapter } from "./tokenizer.js";
|
|
18
|
-
import { streamReader } from "./streaming.js";
|
|
19
|
-
// Re-export types and utilities
|
|
20
|
-
export * from "./types.js";
|
|
21
|
-
export * from "./errors.js";
|
|
22
|
-
export { countTokens, setTokenizerAdapter } from "./tokenizer.js";
|
|
23
|
-
const DEFAULT_RETRY = {
|
|
24
|
-
maxAttempts: 3,
|
|
25
|
-
baseDelayMs: 300,
|
|
26
|
-
maxDelayMs: 10000,
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
5
|
};
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const figlet_1 = __importDefault(require("figlet"));
|
|
9
|
+
const ora_1 = __importDefault(require("ora"));
|
|
10
|
+
const child_process_1 = require("child_process");
|
|
11
|
+
const os_1 = require("os");
|
|
12
|
+
const fs_1 = require("fs");
|
|
13
|
+
const path_1 = require("path");
|
|
14
|
+
const open_1 = __importDefault(require("open"));
|
|
15
|
+
const enquirer_1 = __importDefault(require("enquirer"));
|
|
16
|
+
const { prompt } = enquirer_1.default;
|
|
17
|
+
// ============================================================================
|
|
18
|
+
// CONSTANTS
|
|
19
|
+
// ============================================================================
|
|
20
|
+
const PRIMELLM_BASE_URL = 'https://api.primellm.in/v1';
|
|
21
|
+
const PRIMELLM_DASHBOARD_URL = 'https://primellm.in/dashboard/api-keys';
|
|
22
|
+
// Tool installation packages
|
|
23
|
+
const TOOLS = {
|
|
24
|
+
'Claude Code': {
|
|
25
|
+
command: 'claude',
|
|
26
|
+
package: '@anthropic-ai/claude-code',
|
|
27
|
+
configName: 'claude',
|
|
28
|
+
},
|
|
29
|
+
'Codex': {
|
|
30
|
+
command: 'codex',
|
|
31
|
+
package: '@openai/codex',
|
|
32
|
+
configName: 'codex',
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
// ============================================================================
|
|
36
|
+
// SYSTEM DETECTION
|
|
37
|
+
// ============================================================================
|
|
38
|
+
function getOS() {
|
|
39
|
+
const os = (0, os_1.platform)();
|
|
40
|
+
switch (os) {
|
|
41
|
+
case 'darwin': return 'macOS';
|
|
42
|
+
case 'linux': return 'Linux';
|
|
43
|
+
case 'win32': return 'Windows';
|
|
44
|
+
default: return os;
|
|
45
|
+
}
|
|
38
46
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
throw new PrimeLLMError("PrimeLLM: apiKey is required");
|
|
57
|
-
}
|
|
58
|
-
this.apiKey = options.apiKey;
|
|
59
|
-
this.baseURL = (options.baseURL ?? "https://api.primellm.in").replace(/\/$/, "");
|
|
60
|
-
this.timeoutMs = options.timeoutMs ?? 60000;
|
|
61
|
-
this.retry = {
|
|
62
|
-
...DEFAULT_RETRY,
|
|
63
|
-
maxAttempts: options.maxRetries ?? 3,
|
|
64
|
-
};
|
|
65
|
-
// Initialize sub-clients
|
|
66
|
-
this.embeddings = new EmbeddingsClient(this);
|
|
67
|
-
this.models = new ModelsClient(this);
|
|
68
|
-
this.keys = new KeysClient(this);
|
|
69
|
-
this.credits = new CreditsClient(this);
|
|
70
|
-
this.tokens = new TokensClient();
|
|
71
|
-
this.chat = new ChatClient(this);
|
|
47
|
+
function getShell() {
|
|
48
|
+
const shell = process.env.SHELL || process.env.COMSPEC || 'unknown';
|
|
49
|
+
const shellName = shell.split(/[/\\]/).pop() || 'unknown';
|
|
50
|
+
return shellName;
|
|
51
|
+
}
|
|
52
|
+
function getNodeVersion() {
|
|
53
|
+
return process.version;
|
|
54
|
+
}
|
|
55
|
+
function commandExists(cmd) {
|
|
56
|
+
try {
|
|
57
|
+
const isWindows = (0, os_1.platform)() === 'win32';
|
|
58
|
+
const checkCmd = isWindows ? `where ${cmd}` : `which ${cmd}`;
|
|
59
|
+
(0, child_process_1.execSync)(checkCmd, { stdio: 'ignore' });
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return false;
|
|
72
64
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
throw error;
|
|
117
|
-
}
|
|
118
|
-
if (error instanceof Error && error.name === "AbortError") {
|
|
119
|
-
throw new PrimeLLMError(`Request timed out after ${this.timeoutMs}ms`);
|
|
120
|
-
}
|
|
121
|
-
// Network error - retry
|
|
122
|
-
if (attempt < this.retry.maxAttempts - 1) {
|
|
123
|
-
lastError = error;
|
|
124
|
-
await sleep(attempt, this.retry);
|
|
125
|
-
continue;
|
|
126
|
-
}
|
|
127
|
-
throw new PrimeLLMError(error.message);
|
|
128
|
-
}
|
|
129
|
-
finally {
|
|
130
|
-
clearTimeout(timeout);
|
|
131
|
-
}
|
|
65
|
+
}
|
|
66
|
+
// ============================================================================
|
|
67
|
+
// ASCII ART & DISPLAY
|
|
68
|
+
// ============================================================================
|
|
69
|
+
function displayBanner() {
|
|
70
|
+
console.clear();
|
|
71
|
+
const banner = figlet_1.default.textSync('PrimeLLM', {
|
|
72
|
+
font: 'Big',
|
|
73
|
+
horizontalLayout: 'default',
|
|
74
|
+
});
|
|
75
|
+
console.log(chalk_1.default.cyan(banner));
|
|
76
|
+
console.log(chalk_1.default.gray('ā'.repeat(60)));
|
|
77
|
+
console.log(chalk_1.default.white.bold(' Configure AI coding tools with PrimeLLM'));
|
|
78
|
+
console.log(chalk_1.default.gray('ā'.repeat(60)));
|
|
79
|
+
console.log();
|
|
80
|
+
}
|
|
81
|
+
function displaySystemInfo() {
|
|
82
|
+
console.log(chalk_1.default.white.bold('š System Information\n'));
|
|
83
|
+
const os = getOS();
|
|
84
|
+
const shell = getShell();
|
|
85
|
+
const nodeVersion = getNodeVersion();
|
|
86
|
+
console.log(` ${chalk_1.default.gray('OS:')} ${chalk_1.default.green(os)}`);
|
|
87
|
+
console.log(` ${chalk_1.default.gray('Shell:')} ${chalk_1.default.green(shell)}`);
|
|
88
|
+
console.log(` ${chalk_1.default.gray('Node:')} ${chalk_1.default.green(nodeVersion)}`);
|
|
89
|
+
console.log();
|
|
90
|
+
}
|
|
91
|
+
// ============================================================================
|
|
92
|
+
// CONFIGURATION PATHS
|
|
93
|
+
// ============================================================================
|
|
94
|
+
function getConfigPaths(tool, scope) {
|
|
95
|
+
const home = (0, os_1.homedir)();
|
|
96
|
+
if (tool === 'Claude Code') {
|
|
97
|
+
if (scope === 'system') {
|
|
98
|
+
return {
|
|
99
|
+
dir: (0, path_1.join)(home, '.claude'),
|
|
100
|
+
file: (0, path_1.join)(home, '.claude', 'config.json'),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
return {
|
|
105
|
+
dir: '.claude',
|
|
106
|
+
file: (0, path_1.join)('.claude', 'config.json'),
|
|
107
|
+
};
|
|
132
108
|
}
|
|
133
|
-
throw lastError || new PrimeLLMError("Request failed after retries");
|
|
134
109
|
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
const res = await fetch(`${this.baseURL}${path}`, {
|
|
143
|
-
method: "POST",
|
|
144
|
-
headers: {
|
|
145
|
-
"Authorization": `Bearer ${this.apiKey}`,
|
|
146
|
-
"Content-Type": "application/json",
|
|
147
|
-
},
|
|
148
|
-
body: JSON.stringify({ ...body, stream: true }),
|
|
149
|
-
signal: controller.signal,
|
|
150
|
-
});
|
|
151
|
-
if (!res.ok) {
|
|
152
|
-
const text = await res.text().catch(() => "");
|
|
153
|
-
throw createErrorFromStatus(res.status, `Streaming failed: ${res.status}`, text);
|
|
154
|
-
}
|
|
155
|
-
if (!res.body) {
|
|
156
|
-
throw new PrimeLLMError("Response body is null");
|
|
157
|
-
}
|
|
158
|
-
const reader = res.body.getReader();
|
|
159
|
-
yield* streamReader(reader);
|
|
110
|
+
else {
|
|
111
|
+
// Codex uses OpenAI-compatible config
|
|
112
|
+
if (scope === 'system') {
|
|
113
|
+
return {
|
|
114
|
+
dir: (0, path_1.join)(home, '.codex'),
|
|
115
|
+
file: (0, path_1.join)(home, '.codex', 'config.json'),
|
|
116
|
+
};
|
|
160
117
|
}
|
|
161
|
-
|
|
162
|
-
|
|
118
|
+
else {
|
|
119
|
+
return {
|
|
120
|
+
dir: '.codex',
|
|
121
|
+
file: (0, path_1.join)('.codex', 'config.json'),
|
|
122
|
+
};
|
|
163
123
|
}
|
|
164
124
|
}
|
|
165
125
|
}
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
}
|
|
173
|
-
/**
|
|
174
|
-
* Send a chat completion request
|
|
175
|
-
*/
|
|
176
|
-
async create(request) {
|
|
177
|
-
return this.client.request("/v1/chat", request);
|
|
126
|
+
function readExistingConfig(configPath) {
|
|
127
|
+
try {
|
|
128
|
+
if ((0, fs_1.existsSync)(configPath)) {
|
|
129
|
+
const content = (0, fs_1.readFileSync)(configPath, 'utf8');
|
|
130
|
+
return JSON.parse(content);
|
|
131
|
+
}
|
|
178
132
|
}
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
*
|
|
182
|
-
* @example
|
|
183
|
-
* for await (const chunk of client.chat.stream({...})) {
|
|
184
|
-
* console.log(chunk.delta?.content);
|
|
185
|
-
* }
|
|
186
|
-
*/
|
|
187
|
-
async *stream(request) {
|
|
188
|
-
yield* this.client.streamRequest("/v1/chat", request);
|
|
133
|
+
catch {
|
|
134
|
+
// Config doesn't exist or is invalid
|
|
189
135
|
}
|
|
136
|
+
return null;
|
|
190
137
|
}
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
this.client = client;
|
|
138
|
+
function writeConfig(tool, scope, apiKey) {
|
|
139
|
+
const { dir, file } = getConfigPaths(tool, scope);
|
|
140
|
+
// Create directory if it doesn't exist
|
|
141
|
+
if (!(0, fs_1.existsSync)(dir)) {
|
|
142
|
+
(0, fs_1.mkdirSync)(dir, { recursive: true });
|
|
197
143
|
}
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
144
|
+
let config;
|
|
145
|
+
if (tool === 'Claude Code') {
|
|
146
|
+
// Claude Code configuration format
|
|
147
|
+
config = {
|
|
148
|
+
apiKey: apiKey,
|
|
149
|
+
baseUrl: PRIMELLM_BASE_URL,
|
|
150
|
+
model: 'claude-sonnet-4-20250514', // Default model
|
|
151
|
+
};
|
|
203
152
|
}
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
153
|
+
else {
|
|
154
|
+
// Codex (OpenAI-compatible) configuration format
|
|
155
|
+
config = {
|
|
156
|
+
apiKey: apiKey,
|
|
157
|
+
baseUrl: PRIMELLM_BASE_URL,
|
|
158
|
+
model: 'gpt-4.1', // Default model
|
|
159
|
+
};
|
|
211
160
|
}
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
return this.client.request("/v1/models", undefined, { method: "GET" });
|
|
161
|
+
// Preserve existing config values
|
|
162
|
+
const existing = readExistingConfig(file);
|
|
163
|
+
if (existing) {
|
|
164
|
+
config = { ...existing, ...config };
|
|
217
165
|
}
|
|
166
|
+
(0, fs_1.writeFileSync)(file, JSON.stringify(config, null, 2));
|
|
218
167
|
}
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
168
|
+
// ============================================================================
|
|
169
|
+
// TOOL INSTALLATION
|
|
170
|
+
// ============================================================================
|
|
171
|
+
async function installTool(tool) {
|
|
172
|
+
const toolInfo = TOOLS[tool];
|
|
173
|
+
const spinner = (0, ora_1.default)(`Installing ${tool}...`).start();
|
|
174
|
+
try {
|
|
175
|
+
const isWindows = (0, os_1.platform)() === 'win32';
|
|
176
|
+
const npmCmd = isWindows ? 'npm.cmd' : 'npm';
|
|
177
|
+
const result = (0, child_process_1.spawnSync)(npmCmd, ['install', '-g', toolInfo.package], {
|
|
178
|
+
stdio: 'pipe',
|
|
179
|
+
shell: true,
|
|
180
|
+
});
|
|
181
|
+
if (result.status !== 0) {
|
|
182
|
+
spinner.fail(chalk_1.default.red(`Failed to install ${tool}`));
|
|
183
|
+
console.error(chalk_1.default.gray(result.stderr?.toString() || 'Unknown error'));
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
spinner.succeed(chalk_1.default.green(`${tool} installed successfully`));
|
|
187
|
+
return true;
|
|
225
188
|
}
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
return this.client.request("/v1/keys", undefined, { method: "GET" });
|
|
189
|
+
catch (error) {
|
|
190
|
+
spinner.fail(chalk_1.default.red(`Failed to install ${tool}`));
|
|
191
|
+
console.error(chalk_1.default.gray(String(error)));
|
|
192
|
+
return false;
|
|
231
193
|
}
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
194
|
+
}
|
|
195
|
+
// ============================================================================
|
|
196
|
+
// VALIDATION
|
|
197
|
+
// ============================================================================
|
|
198
|
+
function validateApiKey(key) {
|
|
199
|
+
return key.startsWith('primellm_') && key.length > 15;
|
|
200
|
+
}
|
|
201
|
+
function maskApiKey(key) {
|
|
202
|
+
if (key.length <= 12)
|
|
203
|
+
return '***';
|
|
204
|
+
return key.substring(0, 12) + '...' + key.substring(key.length - 4);
|
|
205
|
+
}
|
|
206
|
+
// ============================================================================
|
|
207
|
+
// MAIN FLOW
|
|
208
|
+
// ============================================================================
|
|
209
|
+
async function main() {
|
|
210
|
+
displayBanner();
|
|
211
|
+
displaySystemInfo();
|
|
212
|
+
const spinner = (0, ora_1.default)('Initializing...').start();
|
|
213
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
214
|
+
spinner.succeed('Ready');
|
|
215
|
+
console.log();
|
|
216
|
+
// ============ STEP 1: Tool Selection ============
|
|
217
|
+
console.log(chalk_1.default.white.bold('š§ Tool Selection\n'));
|
|
218
|
+
const { selectedTool } = await prompt({
|
|
219
|
+
type: 'select',
|
|
220
|
+
name: 'selectedTool',
|
|
221
|
+
message: 'Which tool would you like to configure?',
|
|
222
|
+
choices: ['Claude Code', 'Codex'],
|
|
223
|
+
});
|
|
224
|
+
console.log();
|
|
225
|
+
// ============ STEP 2: Tool Detection & Installation ============
|
|
226
|
+
const toolInfo = TOOLS[selectedTool];
|
|
227
|
+
const toolExists = commandExists(toolInfo.command);
|
|
228
|
+
if (toolExists) {
|
|
229
|
+
console.log(chalk_1.default.green(`ā ${selectedTool} is already installed`));
|
|
237
230
|
}
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
231
|
+
else {
|
|
232
|
+
console.log(chalk_1.default.yellow(`ā ${selectedTool} is not installed`));
|
|
233
|
+
const { confirmInstall } = await prompt({
|
|
234
|
+
type: 'confirm',
|
|
235
|
+
name: 'confirmInstall',
|
|
236
|
+
message: `Would you like to install ${selectedTool}?`,
|
|
237
|
+
initial: true,
|
|
238
|
+
});
|
|
239
|
+
if (!confirmInstall) {
|
|
240
|
+
console.log(chalk_1.default.yellow('\nā Installation cancelled. Please install manually and run again.'));
|
|
241
|
+
process.exit(0);
|
|
242
|
+
}
|
|
243
|
+
const installed = await installTool(selectedTool);
|
|
244
|
+
if (!installed) {
|
|
245
|
+
console.log(chalk_1.default.red('\nā Installation failed. Please install manually and run again.'));
|
|
246
|
+
process.exit(1);
|
|
247
|
+
}
|
|
243
248
|
}
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
249
|
+
console.log();
|
|
250
|
+
// ============ STEP 3: API Key ============
|
|
251
|
+
console.log(chalk_1.default.white.bold('š API Key Configuration\n'));
|
|
252
|
+
const { hasApiKey } = await prompt({
|
|
253
|
+
type: 'select',
|
|
254
|
+
name: 'hasApiKey',
|
|
255
|
+
message: 'Do you already have a PrimeLLM API key?',
|
|
256
|
+
choices: [
|
|
257
|
+
{ name: 'yes', message: 'Yes, I have an API key' },
|
|
258
|
+
{ name: 'no', message: 'No, I need to create one' },
|
|
259
|
+
],
|
|
260
|
+
});
|
|
261
|
+
let apiKey;
|
|
262
|
+
if (hasApiKey === 'no') {
|
|
263
|
+
console.log(chalk_1.default.cyan('\nš Opening PrimeLLM dashboard to create an API key...\n'));
|
|
264
|
+
await (0, open_1.default)(PRIMELLM_DASHBOARD_URL);
|
|
265
|
+
await prompt({
|
|
266
|
+
type: 'confirm',
|
|
267
|
+
name: 'ready',
|
|
268
|
+
message: 'Press Enter when you have created your API key...',
|
|
269
|
+
});
|
|
251
270
|
}
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
271
|
+
// Prompt for API key
|
|
272
|
+
const { inputApiKey } = await prompt({
|
|
273
|
+
type: 'password',
|
|
274
|
+
name: 'inputApiKey',
|
|
275
|
+
message: 'Enter your PrimeLLM API key:',
|
|
276
|
+
validate: (value) => {
|
|
277
|
+
if (!value)
|
|
278
|
+
return 'API key is required';
|
|
279
|
+
if (!validateApiKey(value))
|
|
280
|
+
return 'API key must start with "primellm_"';
|
|
281
|
+
return true;
|
|
282
|
+
},
|
|
283
|
+
});
|
|
284
|
+
apiKey = inputApiKey;
|
|
285
|
+
console.log(chalk_1.default.green(`ā API key validated: ${maskApiKey(apiKey)}`));
|
|
286
|
+
console.log();
|
|
287
|
+
// ============ STEP 4: Configuration Scope ============
|
|
288
|
+
console.log(chalk_1.default.white.bold('š Configuration Scope\n'));
|
|
289
|
+
const { configScope } = await prompt({
|
|
290
|
+
type: 'select',
|
|
291
|
+
name: 'configScope',
|
|
292
|
+
message: 'Choose configuration scope:',
|
|
293
|
+
choices: [
|
|
294
|
+
{ name: 'system', message: 'System-level (applies to all projects)' },
|
|
295
|
+
{ name: 'project', message: 'Project-level (current project only)' },
|
|
296
|
+
],
|
|
297
|
+
});
|
|
298
|
+
console.log();
|
|
299
|
+
// ============ STEP 5: Check Existing Config ============
|
|
300
|
+
const { file: configFile } = getConfigPaths(selectedTool, configScope);
|
|
301
|
+
const existingConfig = readExistingConfig(configFile);
|
|
302
|
+
if (existingConfig) {
|
|
303
|
+
console.log(chalk_1.default.yellow('ā Existing configuration found:\n'));
|
|
304
|
+
console.log(chalk_1.default.gray(` Base URL: ${existingConfig.baseUrl || '(not set)'}`));
|
|
305
|
+
console.log(chalk_1.default.gray(` API Key: ${existingConfig.apiKey ? maskApiKey(existingConfig.apiKey) : '(not set)'}`));
|
|
306
|
+
console.log();
|
|
307
|
+
const { confirmOverwrite } = await prompt({
|
|
308
|
+
type: 'confirm',
|
|
309
|
+
name: 'confirmOverwrite',
|
|
310
|
+
message: 'Do you want to overwrite this configuration?',
|
|
311
|
+
initial: true,
|
|
312
|
+
});
|
|
313
|
+
if (!confirmOverwrite) {
|
|
314
|
+
console.log(chalk_1.default.yellow('\nā Configuration cancelled.'));
|
|
315
|
+
process.exit(0);
|
|
316
|
+
}
|
|
317
|
+
console.log();
|
|
257
318
|
}
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
/**
|
|
264
|
-
* Count tokens in text or messages
|
|
265
|
-
*/
|
|
266
|
-
count(input) {
|
|
267
|
-
return countTokens(input);
|
|
319
|
+
// ============ STEP 6: Write Configuration ============
|
|
320
|
+
const writeSpinner = (0, ora_1.default)('Writing configuration...').start();
|
|
321
|
+
try {
|
|
322
|
+
writeConfig(selectedTool, configScope, apiKey);
|
|
323
|
+
writeSpinner.succeed(chalk_1.default.green('Configuration saved'));
|
|
268
324
|
}
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
setTokenizerAdapter(adapter);
|
|
325
|
+
catch (error) {
|
|
326
|
+
writeSpinner.fail(chalk_1.default.red('Failed to write configuration'));
|
|
327
|
+
console.error(chalk_1.default.gray(String(error)));
|
|
328
|
+
process.exit(1);
|
|
274
329
|
}
|
|
330
|
+
// ============ SUCCESS ============
|
|
331
|
+
console.log();
|
|
332
|
+
console.log(chalk_1.default.gray('ā'.repeat(60)));
|
|
333
|
+
console.log();
|
|
334
|
+
console.log(chalk_1.default.green.bold('ā
PrimeLLM configured successfully!'));
|
|
335
|
+
console.log();
|
|
336
|
+
console.log(chalk_1.default.white('You can now use:'));
|
|
337
|
+
console.log(chalk_1.default.cyan(` ${toolInfo.command}`));
|
|
338
|
+
console.log(chalk_1.default.white('with PrimeLLM as the backend.'));
|
|
339
|
+
console.log();
|
|
340
|
+
console.log(chalk_1.default.gray(`Config location: ${configFile}`));
|
|
341
|
+
console.log(chalk_1.default.gray(`Base URL: ${PRIMELLM_BASE_URL}`));
|
|
342
|
+
console.log();
|
|
343
|
+
console.log(chalk_1.default.gray('ā'.repeat(60)));
|
|
344
|
+
console.log();
|
|
345
|
+
console.log(chalk_1.default.white('Need help? Visit ') + chalk_1.default.cyan('https://primellm.in/docs'));
|
|
346
|
+
console.log();
|
|
275
347
|
}
|
|
276
|
-
//
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
348
|
+
// Run the CLI
|
|
349
|
+
main().catch((error) => {
|
|
350
|
+
console.error(chalk_1.default.red('An unexpected error occurred:'));
|
|
351
|
+
console.error(chalk_1.default.gray(String(error)));
|
|
352
|
+
process.exit(1);
|
|
353
|
+
});
|
|
354
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|