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.
Files changed (64) hide show
  1. package/dist/api/authorizer.d.ts +12 -0
  2. package/dist/api/authorizer.d.ts.map +1 -0
  3. package/dist/api/authorizer.js +157 -0
  4. package/dist/api/authorizer.js.map +1 -0
  5. package/dist/api/config/intent-config.d.ts +45 -0
  6. package/dist/api/config/intent-config.d.ts.map +1 -0
  7. package/dist/api/config/intent-config.js +95 -0
  8. package/dist/api/config/intent-config.js.map +1 -0
  9. package/dist/api/index.d.ts +4 -0
  10. package/dist/api/index.d.ts.map +1 -0
  11. package/dist/api/index.js +722 -0
  12. package/dist/api/index.js.map +1 -0
  13. package/dist/api/routing/intent-router.d.ts +56 -0
  14. package/dist/api/routing/intent-router.d.ts.map +1 -0
  15. package/dist/api/routing/intent-router.js +140 -0
  16. package/dist/api/routing/intent-router.js.map +1 -0
  17. package/dist/api/routing/intent-validator.d.ts +83 -0
  18. package/dist/api/routing/intent-validator.d.ts.map +1 -0
  19. package/dist/api/routing/intent-validator.js +187 -0
  20. package/dist/api/routing/intent-validator.js.map +1 -0
  21. package/dist/api/services/billing.d.ts +9 -0
  22. package/dist/api/services/billing.d.ts.map +1 -0
  23. package/dist/api/services/billing.js +49 -0
  24. package/dist/api/services/billing.js.map +1 -0
  25. package/dist/api/services/stripe.d.ts +17 -0
  26. package/dist/api/services/stripe.d.ts.map +1 -0
  27. package/dist/api/services/stripe.js +69 -0
  28. package/dist/api/services/stripe.js.map +1 -0
  29. package/dist/authorizer.zip +0 -0
  30. package/dist/cli/auth.d.ts +20 -0
  31. package/dist/cli/auth.d.ts.map +1 -0
  32. package/dist/cli/auth.js +264 -0
  33. package/dist/cli/auth.js.map +1 -0
  34. package/dist/cli/config.d.ts +17 -0
  35. package/dist/cli/config.d.ts.map +1 -0
  36. package/dist/cli/config.js +94 -0
  37. package/dist/cli/config.js.map +1 -0
  38. package/dist/cli/index.d.ts +3 -0
  39. package/dist/cli/index.d.ts.map +1 -0
  40. package/dist/cli/index.js +371 -0
  41. package/dist/cli/index.js.map +1 -0
  42. package/dist/cli/proxy.d.ts +2 -0
  43. package/dist/cli/proxy.d.ts.map +1 -0
  44. package/dist/cli/proxy.js +171 -0
  45. package/dist/cli/proxy.js.map +1 -0
  46. package/dist/data/catalog.d.ts +54 -0
  47. package/dist/data/catalog.d.ts.map +1 -0
  48. package/dist/data/catalog.js +108 -0
  49. package/dist/data/catalog.js.map +1 -0
  50. package/dist/db/dal.d.ts +75 -0
  51. package/dist/db/dal.d.ts.map +1 -0
  52. package/dist/db/dal.js +124 -0
  53. package/dist/db/dal.js.map +1 -0
  54. package/dist/index.js +156 -0
  55. package/dist/index.ts +134 -0
  56. package/dist/logger.d.ts +8 -0
  57. package/dist/logger.d.ts.map +1 -0
  58. package/dist/logger.js +19 -0
  59. package/dist/logger.js.map +1 -0
  60. package/dist/test/setup.d.ts +2 -0
  61. package/dist/test/setup.d.ts.map +1 -0
  62. package/dist/test/setup.js +27 -0
  63. package/dist/test/setup.js.map +1 -0
  64. 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,2 @@
1
+ export declare function startLocalProxy(): Promise<void>;
2
+ //# sourceMappingURL=proxy.d.ts.map
@@ -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"}