zeroauth 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/dist/api/authorizer.d.ts +12 -0
- package/dist/api/authorizer.d.ts.map +1 -0
- package/dist/api/authorizer.js +157 -0
- package/dist/api/authorizer.js.map +1 -0
- package/dist/api/config/intent-config.d.ts +45 -0
- package/dist/api/config/intent-config.d.ts.map +1 -0
- package/dist/api/config/intent-config.js +95 -0
- package/dist/api/config/intent-config.js.map +1 -0
- package/dist/api/index.d.ts +4 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +722 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/routing/intent-router.d.ts +56 -0
- package/dist/api/routing/intent-router.d.ts.map +1 -0
- package/dist/api/routing/intent-router.js +140 -0
- package/dist/api/routing/intent-router.js.map +1 -0
- package/dist/api/routing/intent-validator.d.ts +83 -0
- package/dist/api/routing/intent-validator.d.ts.map +1 -0
- package/dist/api/routing/intent-validator.js +187 -0
- package/dist/api/routing/intent-validator.js.map +1 -0
- package/dist/api/services/billing.d.ts +9 -0
- package/dist/api/services/billing.d.ts.map +1 -0
- package/dist/api/services/billing.js +49 -0
- package/dist/api/services/billing.js.map +1 -0
- package/dist/api/services/stripe.d.ts +17 -0
- package/dist/api/services/stripe.d.ts.map +1 -0
- package/dist/api/services/stripe.js +69 -0
- package/dist/api/services/stripe.js.map +1 -0
- package/dist/authorizer.zip +0 -0
- package/dist/cli/auth.d.ts +20 -0
- package/dist/cli/auth.d.ts.map +1 -0
- package/dist/cli/auth.js +264 -0
- package/dist/cli/auth.js.map +1 -0
- package/dist/cli/config.d.ts +17 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +94 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +371 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/proxy.d.ts +2 -0
- package/dist/cli/proxy.d.ts.map +1 -0
- package/dist/cli/proxy.js +171 -0
- package/dist/cli/proxy.js.map +1 -0
- package/dist/data/catalog.d.ts +54 -0
- package/dist/data/catalog.d.ts.map +1 -0
- package/dist/data/catalog.js +108 -0
- package/dist/data/catalog.js.map +1 -0
- package/dist/db/dal.d.ts +75 -0
- package/dist/db/dal.d.ts.map +1 -0
- package/dist/db/dal.js +124 -0
- package/dist/db/dal.js.map +1 -0
- package/dist/index.js +156 -0
- package/dist/index.ts +134 -0
- package/dist/logger.d.ts +8 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +19 -0
- package/dist/logger.js.map +1 -0
- package/dist/test/setup.d.ts +2 -0
- package/dist/test/setup.d.ts.map +1 -0
- package/dist/test/setup.js +27 -0
- package/dist/test/setup.js.map +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1,371 @@
|
|
|
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
|
+
const commander_1 = require("commander");
|
|
8
|
+
const axios_1 = __importDefault(require("axios"));
|
|
9
|
+
const proxy_1 = require("./proxy");
|
|
10
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
11
|
+
const config_1 = require("./config");
|
|
12
|
+
const auth_1 = require("./auth");
|
|
13
|
+
const program = new commander_1.Command();
|
|
14
|
+
// Commands
|
|
15
|
+
program.name("zeroauth").description("ZeroAuth CLI").version("1.0.0");
|
|
16
|
+
program
|
|
17
|
+
.command("login")
|
|
18
|
+
.description("Login to ZeroAuth and store credentials")
|
|
19
|
+
.action(async () => {
|
|
20
|
+
try {
|
|
21
|
+
const code = await (0, auth_1.performLogin)();
|
|
22
|
+
if (code) {
|
|
23
|
+
const tokens = await (0, auth_1.exchangeCodeForToken)(code);
|
|
24
|
+
(0, auth_1.saveTokens)(tokens);
|
|
25
|
+
console.log("✅ Login successful! Tokens stored.");
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
console.error("❌ Login failed. No authorization code received.");
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
console.error(`❌ Failed to login: ${error}`);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
program
|
|
36
|
+
.command("logout")
|
|
37
|
+
.description("Log out of ZeroAuth and revoke credentials")
|
|
38
|
+
.action(async () => {
|
|
39
|
+
const tokens = (0, auth_1.loadTokens)();
|
|
40
|
+
if (!tokens) {
|
|
41
|
+
console.log("Not logged in.");
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
const endpoints = await (0, auth_1.getOidcEndpoints)();
|
|
46
|
+
const envConfig = (0, config_1.getActiveEnvConfig)();
|
|
47
|
+
await axios_1.default.post(endpoints.logout_endpoint, new URLSearchParams({
|
|
48
|
+
client_id: envConfig.authClientId,
|
|
49
|
+
refresh_token: tokens.refresh_token,
|
|
50
|
+
}), {
|
|
51
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
console.warn(`Warning: could not revoke token with server: ${error}`);
|
|
56
|
+
}
|
|
57
|
+
// Remove credentials file
|
|
58
|
+
const fs = require("fs");
|
|
59
|
+
const path = require("path");
|
|
60
|
+
const os = require("os");
|
|
61
|
+
const CREDENTIALS_FILE = path.join(os.homedir(), ".zeroauth", "credentials.json");
|
|
62
|
+
if (fs.existsSync(CREDENTIALS_FILE)) {
|
|
63
|
+
fs.unlinkSync(CREDENTIALS_FILE);
|
|
64
|
+
}
|
|
65
|
+
console.log("✅ Logged out successfully.");
|
|
66
|
+
});
|
|
67
|
+
program
|
|
68
|
+
.command("status")
|
|
69
|
+
.description("Check the status of your login session")
|
|
70
|
+
.action(async () => {
|
|
71
|
+
const accessToken = await (0, auth_1.getValidAccessToken)();
|
|
72
|
+
const tokens = (0, auth_1.loadTokens)();
|
|
73
|
+
if (!accessToken) {
|
|
74
|
+
console.log("Status: Not logged in.");
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
console.log("Status: ✅ Logged in");
|
|
78
|
+
const refreshToken = tokens ? tokens.refresh_token : null;
|
|
79
|
+
if ((0, auth_1.isTokenExpired)(accessToken)) {
|
|
80
|
+
// If getValidAccessToken returned a token, it means it was either valid or refreshed successfully.
|
|
81
|
+
// If it was refreshed, saveTokens was called inside refreshAccessToken, so the token on disk is new.
|
|
82
|
+
// We check expiration again just to report status accurately.
|
|
83
|
+
if ((0, auth_1.getTokenTimeRemaining)(accessToken) < 10) {
|
|
84
|
+
console.log(" - Access Token: Expired or near expiration (Refresh occurred if needed)");
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
console.log(" - Access Token: Valid (Refreshed if necessary)");
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
const remaining = (0, auth_1.getTokenTimeRemaining)(accessToken);
|
|
92
|
+
const minutes = Math.floor(remaining / 60);
|
|
93
|
+
const seconds = Math.floor(remaining % 60);
|
|
94
|
+
console.log(` - Access Token: Valid (expires in ${minutes}m ${seconds}s)`);
|
|
95
|
+
}
|
|
96
|
+
if (refreshToken) {
|
|
97
|
+
console.log(" - Refresh Token: Present");
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
console.log(" - Refresh Token: ❌ Not found. Session will expire soon.");
|
|
101
|
+
}
|
|
102
|
+
const config = (0, config_1.loadConfig)();
|
|
103
|
+
console.log(` - Default Model: ${config.defaultModel}`);
|
|
104
|
+
});
|
|
105
|
+
program
|
|
106
|
+
.command("models")
|
|
107
|
+
.description("List available models")
|
|
108
|
+
.action(async () => {
|
|
109
|
+
let accessToken = await (0, auth_1.getValidAccessToken)();
|
|
110
|
+
if (!accessToken) {
|
|
111
|
+
console.log("Not logged in or session expired. Please run 'zeroauth login' first.");
|
|
112
|
+
process.exit(1);
|
|
113
|
+
}
|
|
114
|
+
try {
|
|
115
|
+
const envConfig = (0, config_1.getActiveEnvConfig)();
|
|
116
|
+
const response = await axios_1.default.get(`${envConfig.apiBaseUrl}/models`, {
|
|
117
|
+
headers: {
|
|
118
|
+
"x-authorization": `Bearer ${accessToken}`,
|
|
119
|
+
},
|
|
120
|
+
});
|
|
121
|
+
const models = response.data.data || [];
|
|
122
|
+
const config = (0, config_1.loadConfig)();
|
|
123
|
+
console.log("Available models:");
|
|
124
|
+
models.forEach((model) => {
|
|
125
|
+
const marker = model.id === config.defaultModel ? " (default)" : "";
|
|
126
|
+
console.log(` - ${model.id}${marker}`);
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
console.error(`Error fetching models: ${error}`);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
program
|
|
134
|
+
.command("set-model <model>")
|
|
135
|
+
.description("Set the default model for future asks")
|
|
136
|
+
.action(async (model) => {
|
|
137
|
+
let accessToken = await (0, auth_1.getValidAccessToken)();
|
|
138
|
+
if (!accessToken) {
|
|
139
|
+
console.log("Not logged in or session expired. Please run 'zeroauth login' first.");
|
|
140
|
+
process.exit(1);
|
|
141
|
+
}
|
|
142
|
+
try {
|
|
143
|
+
// Verify the model exists
|
|
144
|
+
const envConfig = (0, config_1.getActiveEnvConfig)();
|
|
145
|
+
const response = await axios_1.default.get(`${envConfig.apiBaseUrl}/models`, {
|
|
146
|
+
headers: {
|
|
147
|
+
"x-authorization": `Bearer ${accessToken}`,
|
|
148
|
+
},
|
|
149
|
+
});
|
|
150
|
+
const models = response.data.data || [];
|
|
151
|
+
const modelExists = models.some((m) => m.id === model);
|
|
152
|
+
if (!modelExists) {
|
|
153
|
+
console.error(`Model '${model}' not found. Use 'zeroauth models' to see available models.`);
|
|
154
|
+
process.exit(1);
|
|
155
|
+
}
|
|
156
|
+
const config = (0, config_1.loadConfig)();
|
|
157
|
+
config.defaultModel = model;
|
|
158
|
+
(0, config_1.saveConfig)(config);
|
|
159
|
+
console.log(`Default model set to: ${model}`);
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
console.error(`Error setting default model: ${error}`);
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
program
|
|
166
|
+
.command("completion <prompt> [model]")
|
|
167
|
+
.alias("ask")
|
|
168
|
+
.description("Send a prompt to the ZeroAuth backend")
|
|
169
|
+
.option("-m, --model <model>", "Model to use (overrides positional argument)")
|
|
170
|
+
.action(async (prompt, model, options) => {
|
|
171
|
+
let accessToken = await (0, auth_1.getValidAccessToken)();
|
|
172
|
+
if (!accessToken) {
|
|
173
|
+
console.log("Not logged in or session expired. Please run 'zeroauth login' first.");
|
|
174
|
+
process.exit(1);
|
|
175
|
+
}
|
|
176
|
+
const config = (0, config_1.loadConfig)();
|
|
177
|
+
const modelToUse = options.model || model || config.defaultModel || "intent:budget";
|
|
178
|
+
try {
|
|
179
|
+
const envConfig = (0, config_1.getActiveEnvConfig)();
|
|
180
|
+
const response = await axios_1.default.post(`${envConfig.apiBaseUrl}/chat/completions`, {
|
|
181
|
+
model: modelToUse,
|
|
182
|
+
messages: [{ role: "user", content: prompt }],
|
|
183
|
+
}, {
|
|
184
|
+
headers: {
|
|
185
|
+
"x-authorization": `Bearer ${accessToken}`,
|
|
186
|
+
"Content-Type": "application/json",
|
|
187
|
+
},
|
|
188
|
+
});
|
|
189
|
+
console.log(response.data.choices?.[0]?.message?.content ||
|
|
190
|
+
response.data.response ||
|
|
191
|
+
JSON.stringify(response.data, null, 2));
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
let errorMessage = error.message;
|
|
195
|
+
if (error.response?.data?.error) {
|
|
196
|
+
const errorData = error.response.data.error;
|
|
197
|
+
if (typeof errorData === "object" && errorData.message) {
|
|
198
|
+
// Try to parse the message if it's a string representation of a dict
|
|
199
|
+
if (typeof errorData.message === "string" &&
|
|
200
|
+
errorData.message.startsWith("{'error':")) {
|
|
201
|
+
try {
|
|
202
|
+
// Extract the error message from the Python dict string
|
|
203
|
+
const match = errorData.message.match(/'error':\s*'([^']+)'/);
|
|
204
|
+
if (match) {
|
|
205
|
+
errorMessage = match[1];
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
errorMessage = errorData.message;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
errorMessage = errorData.message;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
errorMessage = errorData.message;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
else if (typeof errorData === "string") {
|
|
220
|
+
errorMessage = errorData;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
else if (error.response?.data) {
|
|
224
|
+
errorMessage = JSON.stringify(error.response.data);
|
|
225
|
+
}
|
|
226
|
+
console.error(`Error connecting to backend: ${errorMessage}`);
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
program
|
|
230
|
+
.command("proxy")
|
|
231
|
+
.description("Starts the local OpenAI-compatible local proxy server for IDE extensions.")
|
|
232
|
+
.action(async () => {
|
|
233
|
+
console.log("Starting local proxy server...");
|
|
234
|
+
await (0, proxy_1.startLocalProxy)();
|
|
235
|
+
});
|
|
236
|
+
program
|
|
237
|
+
.command("cmd")
|
|
238
|
+
.description("Interactive natural language to shell command translator")
|
|
239
|
+
.action(async () => {
|
|
240
|
+
const accessToken = await (0, auth_1.getValidAccessToken)();
|
|
241
|
+
if (!accessToken) {
|
|
242
|
+
console.log("Not logged in or session expired. Please run 'zeroauth login' first.");
|
|
243
|
+
process.exit(1);
|
|
244
|
+
}
|
|
245
|
+
// Gather environment information
|
|
246
|
+
const osType = process.platform;
|
|
247
|
+
const shell = process.env.SHELL || process.env.ComSpec || "unknown";
|
|
248
|
+
const nodeVersion = process.version;
|
|
249
|
+
const envInfo = `Operating System: ${osType}, Shell: ${shell}, Node.js: ${nodeVersion}`;
|
|
250
|
+
const messages = [
|
|
251
|
+
{
|
|
252
|
+
role: "system",
|
|
253
|
+
content: `You are an expert shell command generator. Environment info: ${envInfo}. Based on the user's request, either provide the single, final shell command they need, or ask a single, specific clarifying question. If providing a command, prefix it with 'COMMAND:'. If asking a question, prefix it with 'QUESTION:'.`,
|
|
254
|
+
},
|
|
255
|
+
];
|
|
256
|
+
while (true) {
|
|
257
|
+
const { userInput } = await inquirer_1.default.prompt([
|
|
258
|
+
{
|
|
259
|
+
type: "input",
|
|
260
|
+
name: "userInput",
|
|
261
|
+
message: "Describe the command you need:",
|
|
262
|
+
},
|
|
263
|
+
]);
|
|
264
|
+
if (!userInput.trim()) {
|
|
265
|
+
console.log("Please provide a description.");
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
messages.push({ role: "user", content: userInput });
|
|
269
|
+
try {
|
|
270
|
+
const envConfig = (0, config_1.getActiveEnvConfig)();
|
|
271
|
+
const response = await axios_1.default.post(`${envConfig.apiBaseUrl}/chat/completions`, {
|
|
272
|
+
model: "tongyi-deepresearch-30b-a3b",
|
|
273
|
+
messages: messages,
|
|
274
|
+
}, {
|
|
275
|
+
headers: {
|
|
276
|
+
"x-authorization": `Bearer ${accessToken}`,
|
|
277
|
+
"Content-Type": "application/json",
|
|
278
|
+
},
|
|
279
|
+
});
|
|
280
|
+
const aiResponse = response.data.choices?.[0]?.message?.content ||
|
|
281
|
+
response.data.response ||
|
|
282
|
+
JSON.stringify(response.data, null, 2);
|
|
283
|
+
// console.log(`AI Response: ${aiResponse}`);
|
|
284
|
+
if (aiResponse.startsWith("COMMAND:")) {
|
|
285
|
+
const command = aiResponse.substring("COMMAND:".length).trim();
|
|
286
|
+
console.log("\nSuggested command:\n");
|
|
287
|
+
console.log(command);
|
|
288
|
+
break;
|
|
289
|
+
}
|
|
290
|
+
else if (aiResponse.startsWith("QUESTION:")) {
|
|
291
|
+
const question = aiResponse.substring("QUESTION:".length).trim();
|
|
292
|
+
console.log(`\n${question}`);
|
|
293
|
+
messages.push({ role: "assistant", content: aiResponse });
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
// Try to extract command from response even if it doesn't start with COMMAND:
|
|
297
|
+
const commandMatch = aiResponse.match(/```bash\s*\n(.*?)\n```/s) ||
|
|
298
|
+
aiResponse.match(/`([^`]+)`/);
|
|
299
|
+
if (commandMatch) {
|
|
300
|
+
const command = commandMatch[1].trim();
|
|
301
|
+
console.log("\nSuggested command:\n");
|
|
302
|
+
console.log(command);
|
|
303
|
+
break;
|
|
304
|
+
}
|
|
305
|
+
else if (aiResponse.includes("Ask me directly") ||
|
|
306
|
+
aiResponse.includes("Please clarify")) {
|
|
307
|
+
// Handle clarification requests
|
|
308
|
+
const questionMatch = aiResponse.match(/\*\*Ask me directly\*\*:\s*(.+)/);
|
|
309
|
+
if (questionMatch) {
|
|
310
|
+
const question = questionMatch[1].trim();
|
|
311
|
+
console.log(`\n${question}`);
|
|
312
|
+
messages.push({ role: "assistant", content: aiResponse });
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
console.log("The AI needs clarification. Please provide more details.");
|
|
316
|
+
break;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
console.log("Unexpected response format. Please try again.");
|
|
321
|
+
console.log("Full response:", aiResponse);
|
|
322
|
+
break;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
catch (error) {
|
|
327
|
+
if (error.response?.data?.error) {
|
|
328
|
+
console.error(`Error: ${error.response.data.error}`);
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
console.error(`Error communicating with backend: ${error.message}`);
|
|
332
|
+
}
|
|
333
|
+
break;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
});
|
|
337
|
+
const envCommand = program
|
|
338
|
+
.command("env")
|
|
339
|
+
.description("Environment management commands");
|
|
340
|
+
envCommand
|
|
341
|
+
.command("list")
|
|
342
|
+
.description("List all environments")
|
|
343
|
+
.action(() => {
|
|
344
|
+
const config = (0, config_1.loadConfig)();
|
|
345
|
+
console.log("Available environments:");
|
|
346
|
+
Object.keys(config.envs).forEach((envName) => {
|
|
347
|
+
const marker = envName === config.activeEnv ? " (active)" : "";
|
|
348
|
+
console.log(` - ${envName}${marker}`);
|
|
349
|
+
});
|
|
350
|
+
});
|
|
351
|
+
envCommand
|
|
352
|
+
.command("set <envName>")
|
|
353
|
+
.description("Set the active environment")
|
|
354
|
+
.action((envName) => {
|
|
355
|
+
const config = (0, config_1.loadConfig)();
|
|
356
|
+
if (!config.envs[envName]) {
|
|
357
|
+
console.error(`Environment '${envName}' not found. Use 'zeroauth env list' to see available environments.`);
|
|
358
|
+
process.exit(1);
|
|
359
|
+
}
|
|
360
|
+
config.activeEnv = envName;
|
|
361
|
+
(0, config_1.saveConfig)(config);
|
|
362
|
+
console.log(`Active environment set to: ${envName}`);
|
|
363
|
+
// Also list environments to show the change
|
|
364
|
+
console.log("Available environments:");
|
|
365
|
+
Object.keys(config.envs).forEach((env) => {
|
|
366
|
+
const marker = env === config.activeEnv ? " (active)" : "";
|
|
367
|
+
console.log(` - ${env}${marker}`);
|
|
368
|
+
});
|
|
369
|
+
});
|
|
370
|
+
program.parse();
|
|
371
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/cli/proxy.ts"],"names":[],"mappings":"AA+LA,wBAAsB,eAAe,kBAMpC"}
|
|
@@ -0,0 +1,171 @@
|
|
|
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.startLocalProxy = startLocalProxy;
|
|
7
|
+
const express_1 = __importDefault(require("express"));
|
|
8
|
+
const axios_1 = __importDefault(require("axios"));
|
|
9
|
+
const auth_1 = require("./auth");
|
|
10
|
+
const config_1 = require("./config");
|
|
11
|
+
const app = (0, express_1.default)();
|
|
12
|
+
const PORT = 9090;
|
|
13
|
+
app.use(express_1.default.json({ limit: "50mb" }));
|
|
14
|
+
app.use(express_1.default.urlencoded({ limit: "50mb", extended: true }));
|
|
15
|
+
// Routes
|
|
16
|
+
app.post("/v1/chat/completions", async (req, res) => {
|
|
17
|
+
// console.log("=== PROXY REQUEST RECEIVED ===");
|
|
18
|
+
// console.log(`Headers: ${JSON.stringify(req.headers, null, 2)}`);
|
|
19
|
+
// console.log(`Body: ${JSON.stringify(req.body, null, 2)}`);
|
|
20
|
+
// Check for dummy API key
|
|
21
|
+
// const authHeader = req.headers.authorization;
|
|
22
|
+
// console.log(`Auth header present: ${!!authHeader}`);
|
|
23
|
+
// if (!authHeader || !authHeader.startsWith("Bearer ")) {
|
|
24
|
+
// console.log("ERROR: Invalid API key header");
|
|
25
|
+
// return res.status(401).json({ error: "Invalid API key" });
|
|
26
|
+
// }
|
|
27
|
+
// Get real access token
|
|
28
|
+
// console.log("Getting valid access token...");
|
|
29
|
+
const accessToken = await (0, auth_1.getValidAccessToken)();
|
|
30
|
+
if (!accessToken) {
|
|
31
|
+
console.log("ERROR: No valid access token - user may need to run 'zeroauth login'");
|
|
32
|
+
return res
|
|
33
|
+
.status(401)
|
|
34
|
+
.json({ error: "Not authenticated - please run 'zeroauth login' first" });
|
|
35
|
+
}
|
|
36
|
+
// console.log("Access token obtained successfully");
|
|
37
|
+
// Get request body
|
|
38
|
+
const body = req.body;
|
|
39
|
+
const isStream = body.stream || false;
|
|
40
|
+
// console.log(
|
|
41
|
+
// `Request details: stream=${isStream}, model=${body.model}, message_count=${body.messages?.length || 0}`,
|
|
42
|
+
// );
|
|
43
|
+
// console.log(`Body keys: ${Object.keys(body)}`);
|
|
44
|
+
// Extract prompt from messages
|
|
45
|
+
const messages = body.messages || [];
|
|
46
|
+
if (!messages.length) {
|
|
47
|
+
return res.status(400).json({ error: "No messages provided" });
|
|
48
|
+
}
|
|
49
|
+
// For simplicity, take the last user message
|
|
50
|
+
let prompt = "";
|
|
51
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
52
|
+
if (messages[i].role === "user") {
|
|
53
|
+
prompt = messages[i].content;
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (!prompt) {
|
|
58
|
+
return res.status(400).json({ error: "No user message found" });
|
|
59
|
+
}
|
|
60
|
+
// Enable streaming support
|
|
61
|
+
const backendBody = {
|
|
62
|
+
model: body.model,
|
|
63
|
+
messages: body.messages,
|
|
64
|
+
stream: isStream,
|
|
65
|
+
};
|
|
66
|
+
// Forward request to backend
|
|
67
|
+
const envConfig = (0, config_1.getActiveEnvConfig)();
|
|
68
|
+
const backendUrl = `${envConfig.apiBaseUrl}/chat/completions`;
|
|
69
|
+
const headers = {
|
|
70
|
+
"x-authorization": `Bearer ${accessToken}`,
|
|
71
|
+
"Content-Type": "application/json",
|
|
72
|
+
};
|
|
73
|
+
// console.log(`Forwarding to backend URL: ${backendUrl}`);
|
|
74
|
+
// console.log(`Backend request body: ${JSON.stringify(backendBody, null, 2)}`);
|
|
75
|
+
try {
|
|
76
|
+
if (isStream) {
|
|
77
|
+
// Handle streaming response
|
|
78
|
+
const response = await axios_1.default.post(backendUrl, backendBody, {
|
|
79
|
+
headers,
|
|
80
|
+
responseType: "stream",
|
|
81
|
+
timeout: 300000,
|
|
82
|
+
});
|
|
83
|
+
// Set headers for SSE passthrough
|
|
84
|
+
res.setHeader("Content-Type", "text/event-stream"); // Correct Content-Type for SSE
|
|
85
|
+
res.setHeader("Cache-Control", "no-cache");
|
|
86
|
+
res.setHeader("Connection", "keep-alive");
|
|
87
|
+
// Directly pipe the stream from the backend to the client
|
|
88
|
+
response.data.pipe(res);
|
|
89
|
+
response.data.on("error", (error) => {
|
|
90
|
+
console.error("Stream error from backend:", error);
|
|
91
|
+
if (!res.writableEnded) {
|
|
92
|
+
res.end(); // Ensure response ends on error
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
// Ensure the response ends when the backend stream ends
|
|
96
|
+
// Pipe automatically handles the 'end' event.
|
|
97
|
+
// response.data.on('end', () => { ... }); // Usually not needed with pipe
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
const response = await axios_1.default.post(backendUrl, backendBody, { headers });
|
|
101
|
+
// Directly forward the backend's response
|
|
102
|
+
res.json(response.data);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
console.error("=== PROXY ERROR ===");
|
|
107
|
+
console.error(`Error forwarding request: ${error}`);
|
|
108
|
+
console.error(`Error details:`, error.response?.data || error.message);
|
|
109
|
+
console.error(`Error status:`, error.response?.status);
|
|
110
|
+
// Propagate the actual backend error details
|
|
111
|
+
const status = error.response?.status || 500;
|
|
112
|
+
const errorData = error.response?.data;
|
|
113
|
+
if (errorData && typeof errorData === "object") {
|
|
114
|
+
// FIX: Avoid circular JSON error by extracting relevant fields
|
|
115
|
+
res.status(status).json({
|
|
116
|
+
error: errorData.error || errorData.message || "Backend error",
|
|
117
|
+
details: errorData.details,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
// Fallback to generic error with details
|
|
122
|
+
res.status(status).json({
|
|
123
|
+
error: errorData || `Backend error: ${error.message}`,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
app.get("/v1/models", async (req, res) => {
|
|
129
|
+
try {
|
|
130
|
+
const accessToken = await (0, auth_1.getValidAccessToken)();
|
|
131
|
+
if (!accessToken) {
|
|
132
|
+
return res.status(401).json({
|
|
133
|
+
error: "Not authenticated - please run 'zeroauth login' first",
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
const envConfig = (0, config_1.getActiveEnvConfig)();
|
|
137
|
+
const response = await axios_1.default.get(`${envConfig.apiBaseUrl}/models`, {
|
|
138
|
+
headers: {
|
|
139
|
+
"x-authorization": `Bearer ${accessToken}`,
|
|
140
|
+
},
|
|
141
|
+
});
|
|
142
|
+
res.json(response.data);
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
console.error("Error proxying models request:", error);
|
|
146
|
+
// console.error(`Error details:`, error.response?.data || error.message);
|
|
147
|
+
// console.error(`Error status:`, error.response?.status);
|
|
148
|
+
// Propagate the actual backend error details
|
|
149
|
+
const status = error.response?.status || 500;
|
|
150
|
+
const errorData = error.response?.data;
|
|
151
|
+
if (errorData && typeof errorData === "object") {
|
|
152
|
+
// FIX: Avoid circular JSON error by extracting relevant fields
|
|
153
|
+
res.status(status).json({
|
|
154
|
+
error: errorData.error || errorData.message || "Backend error",
|
|
155
|
+
details: errorData.details,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
// Fallback to generic error with details
|
|
160
|
+
res.status(status).json({
|
|
161
|
+
error: errorData || `Backend error: ${error.message}`,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
async function startLocalProxy() {
|
|
167
|
+
app.listen(PORT, () => {
|
|
168
|
+
console.log(`ZeroAuth OpenAI-compatible local proxy server running on port ${PORT}`);
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/cli/proxy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ZeroAuth Curated Catalog Data Loader
|
|
3
|
+
*
|
|
4
|
+
* Loads the curated-catalog.json file generated by the Python generator script.
|
|
5
|
+
* Provides static data for intent-based routing without database dependencies.
|
|
6
|
+
*/
|
|
7
|
+
export interface CuratedModel {
|
|
8
|
+
model_name: string;
|
|
9
|
+
intent_alias: string;
|
|
10
|
+
display_name: string;
|
|
11
|
+
description: string;
|
|
12
|
+
context_length: number;
|
|
13
|
+
prompt_cost_usd_per_mtok: number;
|
|
14
|
+
completion_cost_usd_per_mtok: number;
|
|
15
|
+
latency_ms: number;
|
|
16
|
+
provider: string;
|
|
17
|
+
capabilities: string[];
|
|
18
|
+
enabled: boolean;
|
|
19
|
+
}
|
|
20
|
+
export interface ComplianceProfile {
|
|
21
|
+
tier: string;
|
|
22
|
+
required_tags: Record<string, any>;
|
|
23
|
+
optimization_goal: string;
|
|
24
|
+
}
|
|
25
|
+
declare class CatalogLoader {
|
|
26
|
+
private catalog;
|
|
27
|
+
private catalogPath;
|
|
28
|
+
constructor();
|
|
29
|
+
/**
|
|
30
|
+
* Load the curated catalog from JSON file.
|
|
31
|
+
* Should be called at API startup.
|
|
32
|
+
*/
|
|
33
|
+
loadCatalog(): CuratedModel[];
|
|
34
|
+
/**
|
|
35
|
+
* Get the loaded catalog. Throws if not loaded.
|
|
36
|
+
*/
|
|
37
|
+
getCatalog(): CuratedModel[];
|
|
38
|
+
/**
|
|
39
|
+
* Find a model by intent alias (e.g., "intent:budget" -> "zeroauth-budget")
|
|
40
|
+
* This now filters for enabled models only.
|
|
41
|
+
*/
|
|
42
|
+
findModelByIntent(intentAlias: string): CuratedModel | null;
|
|
43
|
+
/**
|
|
44
|
+
* Get all available intent aliases for error messages
|
|
45
|
+
*/
|
|
46
|
+
getAvailableIntents(): string[];
|
|
47
|
+
/**
|
|
48
|
+
* Get the default Free Developer Profile (no compliance checks)
|
|
49
|
+
*/
|
|
50
|
+
getDefaultProfile(): ComplianceProfile;
|
|
51
|
+
}
|
|
52
|
+
export declare const catalogLoader: CatalogLoader;
|
|
53
|
+
export {};
|
|
54
|
+
//# sourceMappingURL=catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/data/catalog.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,wBAAwB,EAAE,MAAM,CAAC;IACjC,4BAA4B,EAAE,MAAM,CAAC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACnC,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,cAAM,aAAa;IACjB,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,WAAW,CAAS;;IAO5B;;;OAGG;IACH,WAAW,IAAI,YAAY,EAAE;IAmB7B;;OAEG;IACH,UAAU,IAAI,YAAY,EAAE;IAO5B;;;OAGG;IACH,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAM3D;;OAEG;IACH,mBAAmB,IAAI,MAAM,EAAE;IAK/B;;OAEG;IACH,iBAAiB,IAAI,iBAAiB;CAOvC;AAGD,eAAO,MAAM,aAAa,eAAsB,CAAC"}
|