free-antigravity-cli 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 (80) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +142 -0
  3. package/dist/chat.d.ts +2 -0
  4. package/dist/chat.d.ts.map +1 -0
  5. package/dist/chat.js +212 -0
  6. package/dist/chat.js.map +1 -0
  7. package/dist/cli.d.ts +3 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +216 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/config.d.ts +29 -0
  12. package/dist/config.d.ts.map +1 -0
  13. package/dist/config.js +125 -0
  14. package/dist/config.js.map +1 -0
  15. package/dist/crypto.d.ts +5 -0
  16. package/dist/crypto.d.ts.map +1 -0
  17. package/dist/crypto.js +93 -0
  18. package/dist/crypto.js.map +1 -0
  19. package/dist/logger.d.ts +9 -0
  20. package/dist/logger.d.ts.map +1 -0
  21. package/dist/logger.js +10 -0
  22. package/dist/logger.js.map +1 -0
  23. package/dist/proxy/modelUtils.d.ts +31 -0
  24. package/dist/proxy/modelUtils.d.ts.map +1 -0
  25. package/dist/proxy/modelUtils.js +55 -0
  26. package/dist/proxy/modelUtils.js.map +1 -0
  27. package/dist/proxy/registry.d.ts +40 -0
  28. package/dist/proxy/registry.d.ts.map +1 -0
  29. package/dist/proxy/registry.js +176 -0
  30. package/dist/proxy/registry.js.map +1 -0
  31. package/dist/proxy/shared.d.ts +39 -0
  32. package/dist/proxy/shared.d.ts.map +1 -0
  33. package/dist/proxy/shared.js +74 -0
  34. package/dist/proxy/shared.js.map +1 -0
  35. package/dist/proxy/translators/anthropic.d.ts +119 -0
  36. package/dist/proxy/translators/anthropic.d.ts.map +1 -0
  37. package/dist/proxy/translators/anthropic.js +273 -0
  38. package/dist/proxy/translators/anthropic.js.map +1 -0
  39. package/dist/proxy/translators/google.d.ts +86 -0
  40. package/dist/proxy/translators/google.d.ts.map +1 -0
  41. package/dist/proxy/translators/google.js +111 -0
  42. package/dist/proxy/translators/google.js.map +1 -0
  43. package/dist/proxy/translators/ollama.d.ts +27 -0
  44. package/dist/proxy/translators/ollama.d.ts.map +1 -0
  45. package/dist/proxy/translators/ollama.js +82 -0
  46. package/dist/proxy/translators/ollama.js.map +1 -0
  47. package/dist/proxy/translators/openai.d.ts +132 -0
  48. package/dist/proxy/translators/openai.d.ts.map +1 -0
  49. package/dist/proxy/translators/openai.js +396 -0
  50. package/dist/proxy/translators/openai.js.map +1 -0
  51. package/dist/proxy/translators/utils.d.ts +60 -0
  52. package/dist/proxy/translators/utils.d.ts.map +1 -0
  53. package/dist/proxy/translators/utils.js +504 -0
  54. package/dist/proxy/translators/utils.js.map +1 -0
  55. package/dist/proxy.d.ts +22 -0
  56. package/dist/proxy.d.ts.map +1 -0
  57. package/dist/proxy.js +576 -0
  58. package/dist/proxy.js.map +1 -0
  59. package/dist/schemaValidator.d.ts +50 -0
  60. package/dist/schemaValidator.d.ts.map +1 -0
  61. package/dist/schemaValidator.js +208 -0
  62. package/dist/schemaValidator.js.map +1 -0
  63. package/install.cmd +33 -0
  64. package/package.json +46 -0
  65. package/src/chat.ts +184 -0
  66. package/src/cli.ts +184 -0
  67. package/src/config.ts +99 -0
  68. package/src/crypto.ts +49 -0
  69. package/src/logger.ts +8 -0
  70. package/src/proxy/modelUtils.ts +86 -0
  71. package/src/proxy/registry.ts +196 -0
  72. package/src/proxy/shared.ts +102 -0
  73. package/src/proxy/translators/anthropic.ts +420 -0
  74. package/src/proxy/translators/google.ts +162 -0
  75. package/src/proxy/translators/ollama.ts +88 -0
  76. package/src/proxy/translators/openai.ts +556 -0
  77. package/src/proxy/translators/utils.ts +552 -0
  78. package/src/proxy.ts +573 -0
  79. package/src/schemaValidator.ts +215 -0
  80. package/tsconfig.json +19 -0
package/dist/cli.js ADDED
@@ -0,0 +1,216 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ /**
38
+ * Free Antigravity CLI - Open Source Community Edition
39
+ * Supports custom AI models alongside Gemini.
40
+ */
41
+ const commander_1 = require("commander");
42
+ const path = __importStar(require("path"));
43
+ const fs = __importStar(require("fs"));
44
+ const config_1 = require("./config");
45
+ const proxy_1 = require("./proxy");
46
+ const chat_1 = require("./chat");
47
+ const program = new commander_1.Command();
48
+ program
49
+ .name('antigravity')
50
+ .description('Free Antigravity CLI - Open Source Community Edition\nSupports OpenAI, Anthropic, Ollama, OpenRouter, Google AI Studio, and custom providers.')
51
+ .version('1.0.0');
52
+ // --- Chat command ---
53
+ program
54
+ .command('chat')
55
+ .description('Start interactive chat (default command)')
56
+ .argument('[prompt]', 'One-shot prompt (non-interactive)')
57
+ .option('-m, --model <name>', 'Model to use')
58
+ .action(async (prompt, options) => {
59
+ if (prompt) {
60
+ // One-shot mode
61
+ console.log(`Sending to ${options?.model || 'default model'}...`);
62
+ await (0, chat_1.startChat)(options?.model);
63
+ // In a full implementation, would send the prompt and exit
64
+ console.log('One-shot mode: Use interactive chat for now.');
65
+ }
66
+ else {
67
+ await (0, chat_1.startChat)(options?.model);
68
+ }
69
+ });
70
+ // --- Models command ---
71
+ const modelsCmd = program.command('models').description('Manage custom AI models');
72
+ modelsCmd
73
+ .command('list')
74
+ .description('List all configured models')
75
+ .action(() => {
76
+ const models = (0, config_1.listModels)();
77
+ if (models.length === 0) {
78
+ console.log('No models configured. Use "antigravity models add" to add one.');
79
+ return;
80
+ }
81
+ console.log('\nConfigured Models:');
82
+ console.log('─'.repeat(60));
83
+ for (const m of models) {
84
+ const keyStatus = m.apiKey && m.apiKey !== 'none' ? '🔑' : '🔓';
85
+ console.log(` ${keyStatus} ${m.displayName || m.name}`);
86
+ console.log(` Provider: ${m.provider} | Model: ${m.externalModelName}`);
87
+ console.log(` URL: ${m.apiUrl}`);
88
+ console.log();
89
+ }
90
+ console.log(`${models.length} model(s) configured.`);
91
+ });
92
+ modelsCmd
93
+ .command('add')
94
+ .description('Add a new custom model (interactive wizard)')
95
+ .action(async () => {
96
+ const inquirer = require('inquirer');
97
+ console.log('\n Add Custom AI Model\n' + '─'.repeat(40));
98
+ const answers = await inquirer.prompt([
99
+ { type: 'list', name: 'provider', message: 'Provider:', choices: ['openai', 'anthropic', 'google', 'ollama', 'openrouter', 'custom'] },
100
+ { type: 'input', name: 'modelId', message: 'Model ID (e.g. gpt-4o):', validate: (v) => v.length > 0 },
101
+ { type: 'input', name: 'displayName', message: 'Display name (optional):' },
102
+ { type: 'password', name: 'apiKey', message: 'API Key:', mask: '*' },
103
+ { type: 'input', name: 'apiUrl', message: 'API URL:', default: (ans) => {
104
+ const defaults = { openai: 'https://api.openai.com/v1/chat/completions', anthropic: 'https://api.anthropic.com/v1/messages', ollama: 'http://localhost:11434/v1/chat/completions', openrouter: 'https://openrouter.ai/api/v1/chat/completions', custom: 'https://api.together.xyz/v1' };
105
+ return ans.provider === 'google' ? `https://generativelanguage.googleapis.com/v1beta/models/${ans.modelId}:generateContent` : (defaults[ans.provider] || '');
106
+ } },
107
+ ]);
108
+ const entry = {
109
+ name: 'models/' + answers.modelId,
110
+ displayName: answers.displayName || answers.modelId,
111
+ description: `${answers.displayName || answers.modelId} custom model via Free Antigravity CLI`,
112
+ provider: answers.provider,
113
+ apiKey: answers.apiKey || 'none',
114
+ apiUrl: answers.apiUrl,
115
+ externalModelName: answers.modelId,
116
+ };
117
+ const result = (0, config_1.addModel)(entry);
118
+ if (result.success) {
119
+ console.log(`\n Model "${entry.displayName}" added successfully!`);
120
+ console.log(' Restart the proxy or chat to use it.\n');
121
+ }
122
+ else {
123
+ console.error(`\n Failed: ${result.error}\n`);
124
+ }
125
+ });
126
+ modelsCmd
127
+ .command('remove')
128
+ .description('Remove a model')
129
+ .argument('<name>', 'Model name or display name')
130
+ .action((name) => {
131
+ const result = (0, config_1.removeModel)(name);
132
+ if (result.success)
133
+ console.log(`Model "${name}" removed.`);
134
+ else
135
+ console.error(`Failed: ${result.error}`);
136
+ });
137
+ modelsCmd
138
+ .command('import')
139
+ .description('Import models from Antigravity desktop custom_models.json')
140
+ .action(() => {
141
+ const desktopPath = path.join(require('os').homedir(), '.gemini', 'antigravity', 'custom_models.json');
142
+ if (!fs.existsSync(desktopPath)) {
143
+ console.log('Desktop custom_models.json not found at:', desktopPath);
144
+ return;
145
+ }
146
+ try {
147
+ const content = fs.readFileSync(desktopPath, 'utf-8');
148
+ const parsed = JSON.parse(content);
149
+ const models = parsed.models || [];
150
+ if (models.length === 0) {
151
+ console.log('No models in desktop config.');
152
+ return;
153
+ }
154
+ (0, config_1.ensureConfigDir)();
155
+ // Decrypt desktop keys using the crypto module
156
+ const { decryptString } = require('./crypto');
157
+ const imported = [];
158
+ for (const m of models) {
159
+ let apiKey = m.apiKey || 'none';
160
+ if (m.encrypted && apiKey !== 'none') {
161
+ try {
162
+ apiKey = decryptString(apiKey);
163
+ }
164
+ catch { /* keep as-is */ }
165
+ }
166
+ imported.push({
167
+ name: m.name, displayName: m.displayName, description: m.description,
168
+ provider: m.provider, apiKey, apiUrl: m.apiUrl,
169
+ externalModelName: m.externalModelName, allowUnauthorized: m.allowUnauthorized,
170
+ });
171
+ }
172
+ // Save all
173
+ const { saveModels } = require('./config');
174
+ saveModels(imported);
175
+ console.log(`Imported ${imported.length} model(s) from desktop Antigravity.`);
176
+ for (const m of imported)
177
+ console.log(` - ${m.displayName} (${m.provider})`);
178
+ }
179
+ catch (e) {
180
+ console.error('Import failed:', e);
181
+ }
182
+ });
183
+ // --- Proxy command ---
184
+ program
185
+ .command('proxy')
186
+ .description('Start the proxy server (for IDE integration)')
187
+ .action(async () => {
188
+ try {
189
+ const port = await (0, proxy_1.startProxy)();
190
+ console.log(`Proxy running on http://127.0.0.1:${port}`);
191
+ console.log('Press Ctrl+C to stop.');
192
+ // Keep alive
193
+ process.on('SIGINT', async () => { await (0, proxy_1.stopProxy)(); process.exit(0); });
194
+ }
195
+ catch (e) {
196
+ console.error('Failed to start proxy:', e);
197
+ }
198
+ });
199
+ // --- Configure command ---
200
+ program
201
+ .command('configure')
202
+ .description('Show configuration info')
203
+ .action(() => {
204
+ const configPath = require('./config').getModelsPath();
205
+ console.log('Free Antigravity CLI Configuration');
206
+ console.log('─'.repeat(40));
207
+ console.log(`Models file: ${configPath}`);
208
+ console.log(`Models: ${(0, config_1.listModels)().length} configured`);
209
+ console.log(`Proxy port: ${(0, proxy_1.getProxyPort)() || 'not running'}`);
210
+ });
211
+ // Default: chat if no command
212
+ program.action(() => {
213
+ (0, chat_1.startChat)();
214
+ });
215
+ program.parse(process.argv);
216
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ export interface CustomModelEntry {
2
+ name: string;
3
+ displayName?: string;
4
+ description?: string;
5
+ provider: string;
6
+ apiKey: string;
7
+ apiUrl: string;
8
+ externalModelName: string;
9
+ allowUnauthorized?: boolean;
10
+ encrypted?: boolean;
11
+ timeout?: number;
12
+ maxRetries?: number;
13
+ }
14
+ export declare function getConfigDir(): string;
15
+ export declare function getModelsPath(): string;
16
+ export declare function ensureConfigDir(): void;
17
+ export declare function loadModels(): CustomModelEntry[];
18
+ export declare function saveModels(models: CustomModelEntry[]): void;
19
+ export declare function addModel(model: CustomModelEntry): {
20
+ success: boolean;
21
+ error?: string;
22
+ };
23
+ export declare function removeModel(modelName: string): {
24
+ success: boolean;
25
+ error?: string;
26
+ };
27
+ export declare function getModel(modelName: string): CustomModelEntry | undefined;
28
+ export declare function listModels(): CustomModelEntry[];
29
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,eAAe,IAAI,IAAI,CAGtC;AAED,wBAAgB,UAAU,IAAI,gBAAgB,EAAE,CAoB/C;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAS3D;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,gBAAgB,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAetF;AAED,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAInF;AAED,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAExE;AAED,wBAAgB,UAAU,IAAI,gBAAgB,EAAE,CAE/C"}
package/dist/config.js ADDED
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.getConfigDir = getConfigDir;
37
+ exports.getModelsPath = getModelsPath;
38
+ exports.ensureConfigDir = ensureConfigDir;
39
+ exports.loadModels = loadModels;
40
+ exports.saveModels = saveModels;
41
+ exports.addModel = addModel;
42
+ exports.removeModel = removeModel;
43
+ exports.getModel = getModel;
44
+ exports.listModels = listModels;
45
+ /**
46
+ * Configuration and model storage management.
47
+ * Stores custom models in ~/.free-antigravity/models.json
48
+ */
49
+ const fs = __importStar(require("fs"));
50
+ const path = __importStar(require("path"));
51
+ const os = __importStar(require("os"));
52
+ const crypto_1 = require("./crypto");
53
+ function getConfigDir() {
54
+ return path.join(os.homedir(), '.free-antigravity');
55
+ }
56
+ function getModelsPath() {
57
+ return path.join(getConfigDir(), 'models.json');
58
+ }
59
+ function ensureConfigDir() {
60
+ const dir = getConfigDir();
61
+ if (!fs.existsSync(dir))
62
+ fs.mkdirSync(dir, { recursive: true });
63
+ }
64
+ function loadModels() {
65
+ const filePath = getModelsPath();
66
+ if (!fs.existsSync(filePath))
67
+ return [];
68
+ try {
69
+ const content = fs.readFileSync(filePath, 'utf-8');
70
+ const parsed = JSON.parse(content);
71
+ const models = parsed.models || [];
72
+ return models.map((m) => {
73
+ if (m.encrypted && m.apiKey && m.apiKey !== 'none') {
74
+ try {
75
+ return { ...m, apiKey: (0, crypto_1.decryptString)(m.apiKey), encrypted: false };
76
+ }
77
+ catch {
78
+ return m;
79
+ }
80
+ }
81
+ return m;
82
+ });
83
+ }
84
+ catch (e) {
85
+ console.error('Failed to load models:', e);
86
+ return [];
87
+ }
88
+ }
89
+ function saveModels(models) {
90
+ ensureConfigDir();
91
+ const encrypted = models.map((m) => {
92
+ if (m.apiKey && m.apiKey !== 'none' && !m.encrypted) {
93
+ return { ...m, apiKey: (0, crypto_1.encryptString)(m.apiKey), encrypted: true };
94
+ }
95
+ return m;
96
+ });
97
+ fs.writeFileSync(getModelsPath(), JSON.stringify({ models: encrypted }, null, 2), 'utf-8');
98
+ }
99
+ function addModel(model) {
100
+ const models = loadModels();
101
+ const existingIdx = models.findIndex((m) => m.name === model.name);
102
+ if (existingIdx !== -1) {
103
+ if (model.apiKey && (model.apiKey.includes('...') || model.apiKey.startsWith('***'))) {
104
+ model.apiKey = models[existingIdx].apiKey;
105
+ }
106
+ models[existingIdx] = model;
107
+ }
108
+ else {
109
+ models.push(model);
110
+ }
111
+ saveModels(models);
112
+ return { success: true };
113
+ }
114
+ function removeModel(modelName) {
115
+ const models = loadModels().filter((m) => m.name !== modelName);
116
+ saveModels(models);
117
+ return { success: true };
118
+ }
119
+ function getModel(modelName) {
120
+ return loadModels().find((m) => m.name === modelName || m.displayName === modelName);
121
+ }
122
+ function listModels() {
123
+ return loadModels();
124
+ }
125
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBA,oCAEC;AAED,sCAEC;AAED,0CAGC;AAED,gCAoBC;AAED,gCASC;AAED,4BAeC;AAED,kCAIC;AAED,4BAEC;AAED,gCAEC;AAlGD;;;GAGG;AACH,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AACzB,qCAAwD;AAgBxD,SAAgB,YAAY;IAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,mBAAmB,CAAC,CAAC;AACtD,CAAC;AAED,SAAgB,aAAa;IAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa,CAAC,CAAC;AAClD,CAAC;AAED,SAAgB,eAAe;IAC7B,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;IAC3B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAClE,CAAC;AAED,SAAgB,UAAU;IACxB,MAAM,QAAQ,GAAG,aAAa,EAAE,CAAC;IACjC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAC;IAExC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAoC,CAAC;QACtE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;QAEnC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACtB,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBACnD,IAAI,CAAC;oBAAC,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,IAAA,sBAAa,EAAC,CAAC,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;gBAAC,CAAC;gBAC3E,MAAM,CAAC;oBAAC,OAAO,CAAC,CAAC;gBAAC,CAAC;YACrB,CAAC;YACD,OAAO,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,CAAC,CAAC,CAAC;QAC3C,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAgB,UAAU,CAAC,MAA0B;IACnD,eAAe,EAAE,CAAC;IAClB,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACjC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;YACpD,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,IAAA,sBAAa,EAAC,CAAC,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QACpE,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAC7F,CAAC;AAED,SAAgB,QAAQ,CAAC,KAAuB;IAC9C,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC;IAEnE,IAAI,WAAW,KAAK,CAAC,CAAC,EAAE,CAAC;QACvB,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YACrF,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC;QAC5C,CAAC;QACD,MAAM,CAAC,WAAW,CAAC,GAAG,KAAK,CAAC;IAC9B,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IAED,UAAU,CAAC,MAAM,CAAC,CAAC;IACnB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED,SAAgB,WAAW,CAAC,SAAiB;IAC3C,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IAChE,UAAU,CAAC,MAAM,CAAC,CAAC;IACnB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED,SAAgB,QAAQ,CAAC,SAAiB;IACxC,OAAO,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC;AACvF,CAAC;AAED,SAAgB,UAAU;IACxB,OAAO,UAAU,EAAE,CAAC;AACtB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function encryptString(plainText: string): string;
2
+ export declare function decryptString(encryptedText: string): string;
3
+ export declare function isEncryptionAvailable(): boolean;
4
+ export declare function backupFile(filePath: string): void;
5
+ //# sourceMappingURL=crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"AAWA,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAUvD;AAED,wBAAgB,aAAa,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAmB3D;AAED,wBAAgB,qBAAqB,IAAI,OAAO,CAAiB;AACjE,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAGjD"}
package/dist/crypto.js ADDED
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.encryptString = encryptString;
37
+ exports.decryptString = decryptString;
38
+ exports.isEncryptionAvailable = isEncryptionAvailable;
39
+ exports.backupFile = backupFile;
40
+ /**
41
+ * API key encryption for CLI.
42
+ * Uses base64 encoding as a basic obfuscation layer.
43
+ * For production use, consider integrating with OS keychain via keytar.
44
+ */
45
+ const crypto = __importStar(require("crypto"));
46
+ const ALGORITHM = 'aes-256-cbc';
47
+ // Derive a machine-specific key - in production, use keytar or OS keychain
48
+ const MACHINE_KEY = crypto.createHash('sha256').update(process.env.USERNAME || process.env.USER || 'antigravity-cli').digest();
49
+ function encryptString(plainText) {
50
+ if (!plainText || plainText === 'none')
51
+ return plainText;
52
+ try {
53
+ const iv = crypto.randomBytes(16);
54
+ const cipher = crypto.createCipheriv(ALGORITHM, MACHINE_KEY, iv);
55
+ const encrypted = Buffer.concat([cipher.update(plainText, 'utf-8'), cipher.final()]);
56
+ return 'enc:' + Buffer.concat([iv, encrypted]).toString('base64');
57
+ }
58
+ catch {
59
+ return 'fallback:' + Buffer.from(plainText, 'utf-8').toString('base64');
60
+ }
61
+ }
62
+ function decryptString(encryptedText) {
63
+ if (!encryptedText || encryptedText === 'none')
64
+ return encryptedText;
65
+ if (encryptedText.startsWith('enc:')) {
66
+ try {
67
+ const data = Buffer.from(encryptedText.substring(4), 'base64');
68
+ const iv = data.subarray(0, 16);
69
+ const encrypted = data.subarray(16);
70
+ const decipher = crypto.createDecipheriv(ALGORITHM, MACHINE_KEY, iv);
71
+ return Buffer.concat([decipher.update(encrypted), decipher.final()]).toString('utf-8');
72
+ }
73
+ catch {
74
+ return 'DECRYPTION_FAILED';
75
+ }
76
+ }
77
+ if (encryptedText.startsWith('fallback:')) {
78
+ try {
79
+ return Buffer.from(encryptedText.substring(9), 'base64').toString('utf-8');
80
+ }
81
+ catch {
82
+ return 'DECRYPTION_FAILED';
83
+ }
84
+ }
85
+ return encryptedText; // plaintext
86
+ }
87
+ function isEncryptionAvailable() { return true; }
88
+ function backupFile(filePath) {
89
+ const fs = require('fs');
90
+ if (fs.existsSync(filePath))
91
+ fs.copyFileSync(filePath, filePath + '.bak');
92
+ }
93
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ type LogFn = (message: string, ...args: unknown[]) => void;
2
+ export declare const log: {
3
+ info: LogFn;
4
+ warn: LogFn;
5
+ error: LogFn;
6
+ debug: LogFn;
7
+ };
8
+ export {};
9
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,KAAK,KAAK,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;AAE3D,eAAO,MAAM,GAAG;UACO,KAAK;UACJ,KAAK;WACH,KAAK;WACL,KAAK;CAC9B,CAAC"}
package/dist/logger.js ADDED
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.log = void 0;
4
+ exports.log = {
5
+ info: console.log,
6
+ warn: console.warn,
7
+ error: console.error,
8
+ debug: console.debug,
9
+ };
10
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":";;;AAEa,QAAA,GAAG,GAAG;IACjB,IAAI,EAAE,OAAO,CAAC,GAAY;IAC1B,IAAI,EAAE,OAAO,CAAC,IAAa;IAC3B,KAAK,EAAE,OAAO,CAAC,KAAc;IAC7B,KAAK,EAAE,OAAO,CAAC,KAAc;CAC9B,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Centralized model capability detection.
3
+ * Replaces ~9 duplicate regex blocks across proxy.js.
4
+ */
5
+ export interface CustomModelConfig {
6
+ name: string;
7
+ provider: string;
8
+ externalModelName?: string;
9
+ displayName?: string;
10
+ }
11
+ export interface ModelCapabilities {
12
+ isThinking: boolean;
13
+ isDeepSeek: boolean;
14
+ isClaude: boolean;
15
+ maxTokens: number;
16
+ maxOutputTokens: number;
17
+ supportsImages: boolean;
18
+ }
19
+ export interface ModelNameCapabilities {
20
+ isClaudeThinkingModel: boolean;
21
+ isThinkingModel: boolean;
22
+ }
23
+ /**
24
+ * Detects model capabilities from a custom model config object.
25
+ */
26
+ export declare function detectModelCapabilities(m: CustomModelConfig, includeDisplayName?: boolean): ModelCapabilities;
27
+ /**
28
+ * Simplified detection for Gemini↔Anthropic translation (checks modelName string only).
29
+ */
30
+ export declare function detectModelCapabilitiesByName(modelName: string): ModelNameCapabilities;
31
+ //# sourceMappingURL=modelUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modelUtils.d.ts","sourceRoot":"","sources":["../../src/proxy/modelUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,qBAAqB,EAAE,OAAO,CAAC;IAC/B,eAAe,EAAE,OAAO,CAAC;CAC1B;AAYD;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,iBAAiB,EAAE,kBAAkB,UAAO,GAAG,iBAAiB,CAiC1G;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,MAAM,GAAG,qBAAqB,CAMtF"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ /**
3
+ * Centralized model capability detection.
4
+ * Replaces ~9 duplicate regex blocks across proxy.js.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.detectModelCapabilities = detectModelCapabilities;
8
+ exports.detectModelCapabilitiesByName = detectModelCapabilitiesByName;
9
+ // ─── Detection ────────────────────────────────────────────────────────────
10
+ const THINKING_PATTERN = /thinking|reasoning|reasoner|o1|o3|r1|opus-4|sonnet-4|claude-4|3-7|4-7|3\.7|4\.7/i;
11
+ const DEEPSEEK_PATTERN = /deepseek/i;
12
+ const CLAUDE_PATTERN = /claude|opus|sonnet/i;
13
+ const CLAUDE_THINKING_PATTERN = /opus-4|sonnet-4|claude-4|claude-3-5|claude-3-7/i;
14
+ const THINKING_MODEL_PATTERN = /opus-4|sonnet-4|claude-4/i;
15
+ const IMAGE_SUPPORT_PATTERN = /gpt-4o|gpt-4-turbo|claude|gemini|vision|llava|qwenvl|pixtral|yi-vision|cogvlm|kimi|moonshot/i;
16
+ const NO_IMAGE_PATTERN = /deepseek(?!.*vision)|llama(?!.*vision)|mixtral(?!.*vision)|mistral(?!.*pixtral)|codestral|qwen(?!.*vl)/i;
17
+ /**
18
+ * Detects model capabilities from a custom model config object.
19
+ */
20
+ function detectModelCapabilities(m, includeDisplayName = true) {
21
+ const nameLower = (m.name || '').toLowerCase();
22
+ const extLower = (m.externalModelName || '').toLowerCase();
23
+ const displayLower = includeDisplayName ? (m.displayName || '').toLowerCase() : '';
24
+ const isThinking = m.provider === 'anthropic' ||
25
+ m.provider === 'openai' ||
26
+ m.provider === 'openrouter' ||
27
+ THINKING_PATTERN.test(nameLower) ||
28
+ THINKING_PATTERN.test(extLower) ||
29
+ (includeDisplayName && THINKING_PATTERN.test(displayLower));
30
+ const isDeepSeek = DEEPSEEK_PATTERN.test(nameLower) ||
31
+ DEEPSEEK_PATTERN.test(extLower) ||
32
+ (includeDisplayName && DEEPSEEK_PATTERN.test(displayLower));
33
+ const isClaude = m.provider === 'anthropic' || CLAUDE_PATTERN.test(nameLower) || CLAUDE_PATTERN.test(extLower);
34
+ const maxTokens = isClaude ? 200000 : 1048576;
35
+ const maxOutputTokens = isDeepSeek ? 32768 : isThinking ? 32768 : 16384;
36
+ // Image support: Claude, GPT-4o, Gemini always support images. DeepSeek, Ollama text models don't.
37
+ const allNames = nameLower + ' ' + extLower + ' ' + displayLower;
38
+ const supportsImages = m.provider === 'anthropic' ||
39
+ m.provider === 'google' ||
40
+ (m.provider === 'openai' && IMAGE_SUPPORT_PATTERN.test(allNames)) ||
41
+ (m.provider === 'openrouter' && IMAGE_SUPPORT_PATTERN.test(allNames)) ||
42
+ (IMAGE_SUPPORT_PATTERN.test(allNames) && !NO_IMAGE_PATTERN.test(allNames));
43
+ return { isThinking, isDeepSeek, isClaude, maxTokens, maxOutputTokens, supportsImages };
44
+ }
45
+ /**
46
+ * Simplified detection for Gemini↔Anthropic translation (checks modelName string only).
47
+ */
48
+ function detectModelCapabilitiesByName(modelName) {
49
+ const lower = (modelName || '').toLowerCase();
50
+ return {
51
+ isClaudeThinkingModel: CLAUDE_THINKING_PATTERN.test(lower),
52
+ isThinkingModel: THINKING_MODEL_PATTERN.test(lower),
53
+ };
54
+ }
55
+ //# sourceMappingURL=modelUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modelUtils.js","sourceRoot":"","sources":["../../src/proxy/modelUtils.ts"],"names":[],"mappings":"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"}