aura-code 0.3.0 → 0.3.2
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 +2 -2
- package/dist/agent/loop.js +6 -0
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/system-prompt.js +9 -0
- package/dist/agent/system-prompt.js.map +1 -1
- package/dist/cli/index.js +161 -28
- package/dist/cli/index.js.map +1 -1
- package/dist/config/defaults.js +1 -1
- package/dist/providers/factory.d.ts +17 -0
- package/dist/providers/factory.js +130 -1
- package/dist/providers/factory.js.map +1 -1
- package/dist/providers/google.js +21 -8
- package/dist/providers/google.js.map +1 -1
- package/dist/providers/openai-compatible.js +4 -0
- package/dist/providers/openai-compatible.js.map +1 -1
- package/dist/ruby/model-selector.d.ts +20 -0
- package/dist/ruby/model-selector.js +114 -0
- package/dist/ruby/model-selector.js.map +1 -0
- package/dist/ruby/stats.d.ts +6 -0
- package/dist/ruby/stats.js +103 -0
- package/dist/ruby/stats.js.map +1 -0
- package/dist/setup/provider-registry.d.ts +32 -0
- package/dist/setup/provider-registry.js +159 -0
- package/dist/setup/provider-registry.js.map +1 -0
- package/dist/setup/provider-test.d.ts +15 -0
- package/dist/setup/provider-test.js +195 -0
- package/dist/setup/provider-test.js.map +1 -0
- package/dist/setup/provider-wizard.d.ts +29 -0
- package/dist/setup/provider-wizard.js +376 -0
- package/dist/setup/provider-wizard.js.map +1 -0
- package/dist/setup/xiaomi.d.ts +23 -0
- package/dist/setup/xiaomi.js +67 -0
- package/dist/setup/xiaomi.js.map +1 -0
- package/dist/tools/index.js +3 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/shadow-shield.d.ts +11 -0
- package/dist/tools/shadow-shield.js +538 -0
- package/dist/tools/shadow-shield.js.map +1 -0
- package/dist/tools/telegram-bot.js +32 -8
- package/dist/tools/telegram-bot.js.map +1 -1
- package/dist/util/errors.js +9 -1
- package/dist/util/errors.js.map +1 -1
- package/dist/util/load-env.d.ts +10 -0
- package/dist/util/load-env.js +93 -0
- package/dist/util/load-env.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PROVIDER_REGISTRY = void 0;
|
|
4
|
+
exports.findProviderByName = findProviderByName;
|
|
5
|
+
exports.detectExistingKey = detectExistingKey;
|
|
6
|
+
exports.getSignupUrl = getSignupUrl;
|
|
7
|
+
exports.maskApiKey = maskApiKey;
|
|
8
|
+
/**
|
|
9
|
+
* Provider registry — all supported LLM providers with their endpoints,
|
|
10
|
+
* models, env var keys, and signup URLs.
|
|
11
|
+
*
|
|
12
|
+
* Used by the provider wizard to let users interactively configure their
|
|
13
|
+
* provider without manual env vars or --base-url flags.
|
|
14
|
+
*/
|
|
15
|
+
const env_js_1 = require("../util/env.js");
|
|
16
|
+
const global_config_js_1 = require("./global-config.js");
|
|
17
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
18
|
+
// Registry
|
|
19
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
20
|
+
exports.PROVIDER_REGISTRY = [
|
|
21
|
+
{
|
|
22
|
+
name: 'DeepSeek',
|
|
23
|
+
baseUrl: 'https://api.deepseek.com/v1',
|
|
24
|
+
envKey: 'DEEPSEEK_API_KEY',
|
|
25
|
+
signupUrl: 'https://platform.deepseek.com/api_keys',
|
|
26
|
+
models: [
|
|
27
|
+
{ id: 'deepseek-v4-flash', label: 'DeepSeek V4 Flash', speed: 'Fast', contextWindow: 1000000 },
|
|
28
|
+
{ id: 'deepseek-v4-pro', label: 'DeepSeek V4 Pro', speed: 'Powerful', contextWindow: 1000000 },
|
|
29
|
+
],
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
name: 'Anthropic (Claude)',
|
|
33
|
+
baseUrl: 'https://api.anthropic.com',
|
|
34
|
+
envKey: 'ANTHROPIC_API_KEY',
|
|
35
|
+
signupUrl: 'https://console.anthropic.com/settings/keys',
|
|
36
|
+
models: [
|
|
37
|
+
{ id: 'claude-sonnet-4-5-20251001', label: 'Claude Sonnet 4.5', speed: 'Fast', contextWindow: 200000 },
|
|
38
|
+
{ id: 'claude-opus-4-5-20251001', label: 'Claude Opus 4.5', speed: 'Powerful', contextWindow: 200000 },
|
|
39
|
+
],
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: 'OpenAI (GPT)',
|
|
43
|
+
baseUrl: 'https://api.openai.com/v1',
|
|
44
|
+
envKey: 'OPENAI_API_KEY',
|
|
45
|
+
signupUrl: 'https://platform.openai.com/api-keys',
|
|
46
|
+
models: [
|
|
47
|
+
{ id: 'gpt-4o', label: 'GPT-4o', speed: 'Fast', contextWindow: 128000 },
|
|
48
|
+
{ id: 'gpt-4o-mini', label: 'GPT-4o Mini', speed: 'Fast', contextWindow: 128000 },
|
|
49
|
+
{ id: 'o1', label: 'o1', speed: 'Reasoning', contextWindow: 200000 },
|
|
50
|
+
],
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
name: 'Google (Gemini)',
|
|
54
|
+
baseUrl: 'https://generativelanguage.googleapis.com/v1beta',
|
|
55
|
+
envKey: 'GOOGLE_API_KEY',
|
|
56
|
+
signupUrl: 'https://aistudio.google.com/apikey',
|
|
57
|
+
models: [
|
|
58
|
+
{ id: 'gemini-2.5-flash', label: 'Gemini 2.5 Flash', speed: 'Fast', contextWindow: 1000000 },
|
|
59
|
+
{ id: 'gemini-2.5-pro', label: 'Gemini 2.5 Pro', speed: 'Powerful', contextWindow: 1000000 },
|
|
60
|
+
],
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: 'Xiaomi MiMo',
|
|
64
|
+
envKey: 'XIAOMI_API_KEY',
|
|
65
|
+
baseUrl: 'https://token-plan-sgp.xiaomimimo.com/v1',
|
|
66
|
+
signupUrl: 'https://platform.xiaomimimo.com/#/console/api-keys',
|
|
67
|
+
models: [
|
|
68
|
+
{ id: 'mimo-v2.5-pro', label: 'MiMo V2.5 Pro', speed: 'Powerful · Token Plan', contextWindow: 1_048_576 },
|
|
69
|
+
{ id: 'mimo-v2.5', label: 'MiMo V2.5', speed: 'Fast · Token Plan', contextWindow: 1_048_576 },
|
|
70
|
+
],
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
name: 'OpenRouter',
|
|
74
|
+
baseUrl: 'https://openrouter.ai/api/v1',
|
|
75
|
+
envKey: 'OPENROUTER_API_KEY',
|
|
76
|
+
signupUrl: 'https://openrouter.ai/keys',
|
|
77
|
+
models: [
|
|
78
|
+
{ id: 'auto', label: 'Auto (best available)', speed: 'Auto', contextWindow: 128000 },
|
|
79
|
+
],
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
name: 'xAI (Grok)',
|
|
83
|
+
baseUrl: 'https://api.x.ai/v1',
|
|
84
|
+
envKey: 'XAI_API_KEY',
|
|
85
|
+
signupUrl: 'https://console.x.ai',
|
|
86
|
+
models: [
|
|
87
|
+
{ id: 'grok-2', label: 'Grok 2', speed: 'Powerful', contextWindow: 131072 },
|
|
88
|
+
],
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
name: 'NVIDIA NIM',
|
|
92
|
+
baseUrl: 'https://integrate.api.nvidia.com/v1',
|
|
93
|
+
envKey: 'NVIDIA_API_KEY',
|
|
94
|
+
signupUrl: 'https://build.nvidia.com',
|
|
95
|
+
models: [
|
|
96
|
+
{ id: 'nvidia/llama-3.1-nemotron-70b-instruct', label: 'Nemotron 70B', speed: 'Powerful', contextWindow: 131072 },
|
|
97
|
+
],
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
name: 'Ollama (local, free)',
|
|
101
|
+
baseUrl: 'http://localhost:11434/v1',
|
|
102
|
+
envKey: null, // No API key needed
|
|
103
|
+
signupUrl: 'https://ollama.com',
|
|
104
|
+
models: [], // Auto-detect from running Ollama instance
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
name: 'Custom endpoint',
|
|
108
|
+
baseUrl: '', // User provides
|
|
109
|
+
envKey: null,
|
|
110
|
+
signupUrl: '',
|
|
111
|
+
models: [], // User provides model ID
|
|
112
|
+
},
|
|
113
|
+
];
|
|
114
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
115
|
+
// Helpers
|
|
116
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
117
|
+
/**
|
|
118
|
+
* Find a provider entry by display name (case-insensitive).
|
|
119
|
+
*/
|
|
120
|
+
function findProviderByName(name) {
|
|
121
|
+
return exports.PROVIDER_REGISTRY.find(p => p.name.toLowerCase() === name.toLowerCase());
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Detect an existing API key for a provider.
|
|
125
|
+
* Checks process.env first, then the global config file.
|
|
126
|
+
*/
|
|
127
|
+
function detectExistingKey(provider) {
|
|
128
|
+
if (!provider.envKey)
|
|
129
|
+
return null;
|
|
130
|
+
// 1. Check process.env (canonical + lowercase)
|
|
131
|
+
const envVal = (0, env_js_1.getApiKey)(provider.envKey);
|
|
132
|
+
if (envVal)
|
|
133
|
+
return envVal;
|
|
134
|
+
// 2. Check saved config
|
|
135
|
+
const cfg = (0, global_config_js_1.loadGlobalConfig)();
|
|
136
|
+
if (cfg && cfg.apiKeyEnv === provider.envKey) {
|
|
137
|
+
// The global config stores the env var name, not the key itself.
|
|
138
|
+
// But the provider wizard saves the key to config.json as well.
|
|
139
|
+
// Check if there's a saved key via any saved config mechanism.
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Get the signup URL for a provider (for display when the user needs a key).
|
|
146
|
+
*/
|
|
147
|
+
function getSignupUrl(provider) {
|
|
148
|
+
return provider.signupUrl;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Mask an API key for safe display — show first 4 + last 4 characters.
|
|
152
|
+
* Keys shorter than 10 chars just show '****'.
|
|
153
|
+
*/
|
|
154
|
+
function maskApiKey(key) {
|
|
155
|
+
if (key.length < 10)
|
|
156
|
+
return '****';
|
|
157
|
+
return `${key.slice(0, 4)}...${key.slice(-4)}`;
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=provider-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-registry.js","sourceRoot":"","sources":["../../src/setup/provider-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface ProviderTestConfig {
|
|
2
|
+
provider: string;
|
|
3
|
+
model: string;
|
|
4
|
+
baseUrl: string;
|
|
5
|
+
apiKey?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface TestResult {
|
|
8
|
+
ok: boolean;
|
|
9
|
+
error?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Test a provider connection by sending a minimal chat completion request.
|
|
13
|
+
* Times out after 10 seconds.
|
|
14
|
+
*/
|
|
15
|
+
export declare function testProviderConnection(config: ProviderTestConfig): Promise<TestResult>;
|
|
@@ -0,0 +1,195 @@
|
|
|
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.testProviderConnection = testProviderConnection;
|
|
37
|
+
/**
|
|
38
|
+
* Provider connection tester.
|
|
39
|
+
*
|
|
40
|
+
* Sends a minimal API request to verify the key works for a given provider.
|
|
41
|
+
* Handles different auth formats:
|
|
42
|
+
* - Anthropic: x-api-key header
|
|
43
|
+
* - Google: ?key= query param
|
|
44
|
+
* - All others: standard Bearer token
|
|
45
|
+
*/
|
|
46
|
+
const https = __importStar(require("https"));
|
|
47
|
+
const http = __importStar(require("http"));
|
|
48
|
+
const url_1 = require("url");
|
|
49
|
+
/**
|
|
50
|
+
* Test a provider connection by sending a minimal chat completion request.
|
|
51
|
+
* Times out after 10 seconds.
|
|
52
|
+
*/
|
|
53
|
+
async function testProviderConnection(config) {
|
|
54
|
+
const isOllama = config.provider === 'Ollama (local, free)';
|
|
55
|
+
const isAnthropic = config.provider === 'Anthropic (Claude)';
|
|
56
|
+
const isGoogle = config.provider === 'Google (Gemini)';
|
|
57
|
+
// ── Ollama: just check if the server is reachable ──────────────────────────
|
|
58
|
+
if (isOllama) {
|
|
59
|
+
return testOllamaConnection(config.baseUrl);
|
|
60
|
+
}
|
|
61
|
+
// ── Google: uses a different API format ────────────────────────────────────
|
|
62
|
+
if (isGoogle) {
|
|
63
|
+
return testGoogleConnection(config);
|
|
64
|
+
}
|
|
65
|
+
// ── Anthropic: uses x-api-key header and different body format ─────────────
|
|
66
|
+
if (isAnthropic) {
|
|
67
|
+
return testAnthropicConnection(config);
|
|
68
|
+
}
|
|
69
|
+
// ── All others: OpenAI-compatible chat/completions ─────────────────────────
|
|
70
|
+
return testOpenAICompatibleConnection(config);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Check if Ollama is running by fetching /api/tags.
|
|
74
|
+
*/
|
|
75
|
+
async function testOllamaConnection(baseUrl) {
|
|
76
|
+
// Ollama's base is e.g. http://localhost:11434/v1 — we need the root
|
|
77
|
+
const root = baseUrl.replace(/\/v1\/?$/, '');
|
|
78
|
+
return new Promise(resolve => {
|
|
79
|
+
const req = http.get(`${root}/api/tags`, { timeout: 10_000 }, res => {
|
|
80
|
+
if (res.statusCode === 200) {
|
|
81
|
+
resolve({ ok: true });
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
resolve({ ok: false, error: `Ollama responded with HTTP ${res.statusCode}` });
|
|
85
|
+
}
|
|
86
|
+
res.resume();
|
|
87
|
+
});
|
|
88
|
+
req.on('error', (e) => {
|
|
89
|
+
resolve({
|
|
90
|
+
ok: false,
|
|
91
|
+
error: `Ollama doesn't seem to be running. Start it first: ollama serve (${e.message})`,
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
req.on('timeout', () => {
|
|
95
|
+
req.destroy();
|
|
96
|
+
resolve({ ok: false, error: 'Connection timed out after 10 seconds' });
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Test Google Generative AI connection using generateContent endpoint.
|
|
102
|
+
*/
|
|
103
|
+
async function testGoogleConnection(config) {
|
|
104
|
+
const url = new url_1.URL(`${config.baseUrl}/models/${config.model}:generateContent?key=${config.apiKey}`);
|
|
105
|
+
const body = JSON.stringify({
|
|
106
|
+
contents: [{ parts: [{ text: "Say 'ok' and nothing else" }] }],
|
|
107
|
+
generationConfig: { maxOutputTokens: 10 },
|
|
108
|
+
});
|
|
109
|
+
return makeRequest(url, {
|
|
110
|
+
method: 'POST',
|
|
111
|
+
headers: { 'Content-Type': 'application/json' },
|
|
112
|
+
body,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Test Anthropic connection using their Messages API.
|
|
117
|
+
*/
|
|
118
|
+
async function testAnthropicConnection(config) {
|
|
119
|
+
const url = new url_1.URL(`${config.baseUrl}/v1/messages`);
|
|
120
|
+
const body = JSON.stringify({
|
|
121
|
+
model: config.model,
|
|
122
|
+
max_tokens: 10,
|
|
123
|
+
messages: [{ role: 'user', content: "Say 'ok' and nothing else" }],
|
|
124
|
+
});
|
|
125
|
+
return makeRequest(url, {
|
|
126
|
+
method: 'POST',
|
|
127
|
+
headers: {
|
|
128
|
+
'Content-Type': 'application/json',
|
|
129
|
+
'x-api-key': config.apiKey ?? '',
|
|
130
|
+
'anthropic-version': '2023-06-01',
|
|
131
|
+
},
|
|
132
|
+
body,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Test OpenAI-compatible connection using chat/completions.
|
|
137
|
+
*/
|
|
138
|
+
async function testOpenAICompatibleConnection(config) {
|
|
139
|
+
const url = new url_1.URL(`${config.baseUrl}/chat/completions`);
|
|
140
|
+
const body = JSON.stringify({
|
|
141
|
+
model: config.model,
|
|
142
|
+
max_tokens: 10,
|
|
143
|
+
messages: [{ role: 'user', content: "Say 'ok' and nothing else" }],
|
|
144
|
+
});
|
|
145
|
+
return makeRequest(url, {
|
|
146
|
+
method: 'POST',
|
|
147
|
+
headers: {
|
|
148
|
+
'Content-Type': 'application/json',
|
|
149
|
+
'Authorization': `Bearer ${config.apiKey ?? ''}`,
|
|
150
|
+
},
|
|
151
|
+
body,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Low-level HTTPS/HTTP request with 10 second timeout.
|
|
156
|
+
*/
|
|
157
|
+
function makeRequest(url, opts) {
|
|
158
|
+
const transport = url.protocol === 'https:' ? https : http;
|
|
159
|
+
return new Promise(resolve => {
|
|
160
|
+
const req = transport.request(url, {
|
|
161
|
+
method: opts.method,
|
|
162
|
+
headers: opts.headers,
|
|
163
|
+
timeout: 10_000,
|
|
164
|
+
}, res => {
|
|
165
|
+
let data = '';
|
|
166
|
+
res.on('data', chunk => { data += chunk; });
|
|
167
|
+
res.on('end', () => {
|
|
168
|
+
if (res.statusCode && res.statusCode >= 200 && res.statusCode < 300) {
|
|
169
|
+
resolve({ ok: true });
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
let errorMsg = `HTTP ${res.statusCode}`;
|
|
173
|
+
try {
|
|
174
|
+
const parsed = JSON.parse(data);
|
|
175
|
+
const msg = parsed.error?.message ?? parsed.error?.type ?? parsed.message ?? parsed.detail ?? parsed.title ?? '';
|
|
176
|
+
if (msg)
|
|
177
|
+
errorMsg += `: ${msg}`;
|
|
178
|
+
}
|
|
179
|
+
catch { /* ignore parse errors */ }
|
|
180
|
+
resolve({ ok: false, error: errorMsg });
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
req.on('error', (e) => {
|
|
185
|
+
resolve({ ok: false, error: `Connection failed: ${e.message}` });
|
|
186
|
+
});
|
|
187
|
+
req.on('timeout', () => {
|
|
188
|
+
req.destroy();
|
|
189
|
+
resolve({ ok: false, error: 'Connection timed out after 10 seconds' });
|
|
190
|
+
});
|
|
191
|
+
req.write(opts.body);
|
|
192
|
+
req.end();
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=provider-test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-test.js","sourceRoot":"","sources":["../../src/setup/provider-test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider Wizard — interactive 4-step flow to configure LLM provider,
|
|
3
|
+
* model, API key, and test the connection.
|
|
4
|
+
*
|
|
5
|
+
* Steps:
|
|
6
|
+
* 1. Select provider
|
|
7
|
+
* 2. Select model (or auto-detect for Ollama)
|
|
8
|
+
* 3. API key (detect existing, keep/replace, or enter new)
|
|
9
|
+
* 4. Test connection and save to config
|
|
10
|
+
*
|
|
11
|
+
* Saves config to ~/.config/aura-code/config.json (via global-config).
|
|
12
|
+
*/
|
|
13
|
+
import * as readline from 'readline';
|
|
14
|
+
export interface ProviderConfig {
|
|
15
|
+
provider: string;
|
|
16
|
+
model: string;
|
|
17
|
+
baseUrl: string;
|
|
18
|
+
apiKey?: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Run the full 4-step provider wizard.
|
|
22
|
+
*
|
|
23
|
+
* Returns the chosen config on success, or null if the user cancelled.
|
|
24
|
+
*/
|
|
25
|
+
export declare function runProviderWizard(existingRl?: readline.Interface): Promise<ProviderConfig | null>;
|
|
26
|
+
/**
|
|
27
|
+
* Load saved provider config from the config directory.
|
|
28
|
+
*/
|
|
29
|
+
export declare function loadProviderConfig(): ProviderConfig | null;
|