specweave 0.30.11 → 0.30.12
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/src/cli/commands/init.d.ts.map +1 -1
- package/dist/src/cli/commands/init.js +12 -2
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/helpers/init/living-docs-preflight.d.ts +5 -1
- package/dist/src/cli/helpers/init/living-docs-preflight.d.ts.map +1 -1
- package/dist/src/cli/helpers/init/living-docs-preflight.js +80 -28
- package/dist/src/cli/helpers/init/living-docs-preflight.js.map +1 -1
- package/dist/src/cli/workers/brownfield-worker.d.ts +13 -0
- package/dist/src/cli/workers/brownfield-worker.d.ts.map +1 -1
- package/dist/src/cli/workers/brownfield-worker.js +154 -0
- package/dist/src/cli/workers/brownfield-worker.js.map +1 -1
- package/dist/src/cli/workers/living-docs-worker.js +272 -11
- package/dist/src/cli/workers/living-docs-worker.js.map +1 -1
- package/dist/src/core/background/brownfield-launcher.d.ts +2 -1
- package/dist/src/core/background/brownfield-launcher.d.ts.map +1 -1
- package/dist/src/core/background/brownfield-launcher.js.map +1 -1
- package/dist/src/core/background/types.d.ts +10 -2
- package/dist/src/core/background/types.d.ts.map +1 -1
- package/dist/src/core/discrepancy/brownfield-types.d.ts +3 -1
- package/dist/src/core/discrepancy/brownfield-types.d.ts.map +1 -1
- package/dist/src/core/living-docs/feature-archiver.d.ts +39 -0
- package/dist/src/core/living-docs/feature-archiver.d.ts.map +1 -1
- package/dist/src/core/living-docs/feature-archiver.js +197 -0
- package/dist/src/core/living-docs/feature-archiver.js.map +1 -1
- package/dist/src/core/llm/availability-messages.d.ts +33 -0
- package/dist/src/core/llm/availability-messages.d.ts.map +1 -0
- package/dist/src/core/llm/availability-messages.js +170 -0
- package/dist/src/core/llm/availability-messages.js.map +1 -0
- package/dist/src/core/llm/index.d.ts +34 -0
- package/dist/src/core/llm/index.d.ts.map +1 -0
- package/dist/src/core/llm/index.js +35 -0
- package/dist/src/core/llm/index.js.map +1 -0
- package/dist/src/core/llm/provider-factory.d.ts +48 -0
- package/dist/src/core/llm/provider-factory.d.ts.map +1 -0
- package/dist/src/core/llm/provider-factory.js +274 -0
- package/dist/src/core/llm/provider-factory.js.map +1 -0
- package/dist/src/core/llm/providers/anthropic-provider.d.ts +66 -0
- package/dist/src/core/llm/providers/anthropic-provider.d.ts.map +1 -0
- package/dist/src/core/llm/providers/anthropic-provider.js +195 -0
- package/dist/src/core/llm/providers/anthropic-provider.js.map +1 -0
- package/dist/src/core/llm/providers/azure-openai-provider.d.ts +47 -0
- package/dist/src/core/llm/providers/azure-openai-provider.d.ts.map +1 -0
- package/dist/src/core/llm/providers/azure-openai-provider.js +116 -0
- package/dist/src/core/llm/providers/azure-openai-provider.js.map +1 -0
- package/dist/src/core/llm/providers/bedrock-provider.d.ts +44 -0
- package/dist/src/core/llm/providers/bedrock-provider.d.ts.map +1 -0
- package/dist/src/core/llm/providers/bedrock-provider.js +149 -0
- package/dist/src/core/llm/providers/bedrock-provider.js.map +1 -0
- package/dist/src/core/llm/providers/claude-code-provider.d.ts +115 -0
- package/dist/src/core/llm/providers/claude-code-provider.d.ts.map +1 -0
- package/dist/src/core/llm/providers/claude-code-provider.js +379 -0
- package/dist/src/core/llm/providers/claude-code-provider.js.map +1 -0
- package/dist/src/core/llm/providers/ollama-provider.d.ts +40 -0
- package/dist/src/core/llm/providers/ollama-provider.d.ts.map +1 -0
- package/dist/src/core/llm/providers/ollama-provider.js +116 -0
- package/dist/src/core/llm/providers/ollama-provider.js.map +1 -0
- package/dist/src/core/llm/providers/openai-provider.d.ts +44 -0
- package/dist/src/core/llm/providers/openai-provider.d.ts.map +1 -0
- package/dist/src/core/llm/providers/openai-provider.js +119 -0
- package/dist/src/core/llm/providers/openai-provider.js.map +1 -0
- package/dist/src/core/llm/providers/vertex-ai-provider.d.ts +46 -0
- package/dist/src/core/llm/providers/vertex-ai-provider.d.ts.map +1 -0
- package/dist/src/core/llm/providers/vertex-ai-provider.js +123 -0
- package/dist/src/core/llm/providers/vertex-ai-provider.js.map +1 -0
- package/dist/src/core/llm/types.d.ts +181 -0
- package/dist/src/core/llm/types.d.ts.map +1 -0
- package/dist/src/core/llm/types.js +56 -0
- package/dist/src/core/llm/types.js.map +1 -0
- package/dist/src/importers/item-converter.d.ts.map +1 -1
- package/dist/src/importers/item-converter.js +69 -12
- package/dist/src/importers/item-converter.js.map +1 -1
- package/dist/src/living-docs/enterprise-analyzer.d.ts +160 -0
- package/dist/src/living-docs/enterprise-analyzer.d.ts.map +1 -0
- package/dist/src/living-docs/enterprise-analyzer.js +836 -0
- package/dist/src/living-docs/enterprise-analyzer.js.map +1 -0
- package/dist/src/living-docs/fs-id-allocator.d.ts +5 -0
- package/dist/src/living-docs/fs-id-allocator.d.ts.map +1 -1
- package/dist/src/living-docs/fs-id-allocator.js +12 -5
- package/dist/src/living-docs/fs-id-allocator.js.map +1 -1
- package/package.json +1 -1
- package/plugins/specweave/commands/specweave-archive.md +69 -2
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code Native Provider
|
|
3
|
+
*
|
|
4
|
+
* Uses the Claude Code CLI (`claude --print`) as an LLM provider.
|
|
5
|
+
* This leverages the user's existing MAX subscription - NO API KEY NEEDED!
|
|
6
|
+
*
|
|
7
|
+
* How it works:
|
|
8
|
+
* 1. User is authenticated to Claude Code (MAX subscription)
|
|
9
|
+
* 2. Auth is cached in ~/.claude/ (Unix) or %USERPROFILE%\.claude\ (Windows)
|
|
10
|
+
* 3. We spawn `claude --print` subprocesses
|
|
11
|
+
* 4. These use the cached auth automatically
|
|
12
|
+
* 5. Result: Full Claude capabilities at no extra cost!
|
|
13
|
+
*
|
|
14
|
+
* Cross-platform support:
|
|
15
|
+
* - macOS: Uses `which claude` for detection
|
|
16
|
+
* - Linux: Uses `which claude` or `command -v claude`
|
|
17
|
+
* - Windows: Uses `where claude` for detection
|
|
18
|
+
*
|
|
19
|
+
* Best for:
|
|
20
|
+
* - Claude MAX subscribers
|
|
21
|
+
* - Background processing without API costs
|
|
22
|
+
* - Full Claude capabilities (Opus, Sonnet, Haiku)
|
|
23
|
+
*/
|
|
24
|
+
import { execSync, spawn } from 'child_process';
|
|
25
|
+
import * as os from 'os';
|
|
26
|
+
import * as path from 'path';
|
|
27
|
+
import * as fs from 'fs';
|
|
28
|
+
import { consoleLogger } from '../../../utils/logger.js';
|
|
29
|
+
/**
|
|
30
|
+
* Detect platform for cross-platform support
|
|
31
|
+
*/
|
|
32
|
+
const IS_WINDOWS = process.platform === 'win32';
|
|
33
|
+
const IS_MACOS = process.platform === 'darwin';
|
|
34
|
+
const IS_LINUX = process.platform === 'linux';
|
|
35
|
+
/**
|
|
36
|
+
* Claude Code Native Provider
|
|
37
|
+
*
|
|
38
|
+
* Uses `claude --print` CLI for LLM calls - leverages MAX subscription!
|
|
39
|
+
*/
|
|
40
|
+
export class ClaudeCodeProvider {
|
|
41
|
+
constructor(config = {}) {
|
|
42
|
+
this.name = 'claude-code';
|
|
43
|
+
this.model = config.model || 'opus'; // Use Opus 4.5 by default for best quality
|
|
44
|
+
this.defaultModel = this.model;
|
|
45
|
+
this.maxTokens = config.maxTokens || 4096;
|
|
46
|
+
this.timeout = config.timeout || 120000;
|
|
47
|
+
this.logger = config.logger || consoleLogger;
|
|
48
|
+
this.cwd = config.cwd;
|
|
49
|
+
// Default to true for background processing - essential for non-interactive use
|
|
50
|
+
this.skipPermissions = config.skipPermissions ?? true;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Execute claude --print command
|
|
54
|
+
*
|
|
55
|
+
* Cross-platform: Works on Windows, macOS, and Linux
|
|
56
|
+
* Background-safe: Uses --dangerously-skip-permissions for non-interactive use
|
|
57
|
+
*/
|
|
58
|
+
async executeClaudeCommand(prompt, options = {}) {
|
|
59
|
+
const model = options.model || this.model;
|
|
60
|
+
const timeout = options.timeout || this.timeout;
|
|
61
|
+
// Build command arguments
|
|
62
|
+
const args = [];
|
|
63
|
+
// CRITICAL: Add --dangerously-skip-permissions FIRST for non-interactive background use
|
|
64
|
+
// Without this flag, claude may hang waiting for permission prompts
|
|
65
|
+
if (this.skipPermissions) {
|
|
66
|
+
args.push('--dangerously-skip-permissions');
|
|
67
|
+
}
|
|
68
|
+
args.push('--print', prompt, '--output-format', 'json', '--model', model);
|
|
69
|
+
// Add system prompt if provided
|
|
70
|
+
if (options.systemPrompt) {
|
|
71
|
+
args.push('--system-prompt', options.systemPrompt);
|
|
72
|
+
}
|
|
73
|
+
// Determine the command name (cross-platform)
|
|
74
|
+
const command = IS_WINDOWS ? 'claude.cmd' : 'claude';
|
|
75
|
+
return new Promise((resolve, reject) => {
|
|
76
|
+
let stdout = '';
|
|
77
|
+
let stderr = '';
|
|
78
|
+
const proc = spawn(command, args, {
|
|
79
|
+
cwd: this.cwd || process.cwd(),
|
|
80
|
+
env: process.env,
|
|
81
|
+
// Use 'ignore' for stdin to prevent Claude from waiting for input
|
|
82
|
+
// This is essential for non-interactive background use
|
|
83
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
84
|
+
// Windows-specific: use shell to resolve .cmd files
|
|
85
|
+
shell: IS_WINDOWS,
|
|
86
|
+
});
|
|
87
|
+
// Set timeout
|
|
88
|
+
const timeoutId = setTimeout(() => {
|
|
89
|
+
proc.kill('SIGTERM');
|
|
90
|
+
reject(new Error(`Claude Code command timed out after ${timeout}ms`));
|
|
91
|
+
}, timeout);
|
|
92
|
+
proc.stdout.on('data', (data) => {
|
|
93
|
+
stdout += data.toString();
|
|
94
|
+
});
|
|
95
|
+
proc.stderr.on('data', (data) => {
|
|
96
|
+
stderr += data.toString();
|
|
97
|
+
});
|
|
98
|
+
proc.on('close', (code) => {
|
|
99
|
+
clearTimeout(timeoutId);
|
|
100
|
+
if (code !== 0) {
|
|
101
|
+
reject(new Error(`Claude Code exited with code ${code}: ${stderr}`));
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
try {
|
|
105
|
+
const output = JSON.parse(stdout);
|
|
106
|
+
resolve(output);
|
|
107
|
+
}
|
|
108
|
+
catch (parseError) {
|
|
109
|
+
// Sometimes output has extra text, try to extract JSON
|
|
110
|
+
const jsonMatch = stdout.match(/\{[\s\S]*\}/);
|
|
111
|
+
if (jsonMatch) {
|
|
112
|
+
try {
|
|
113
|
+
const output = JSON.parse(jsonMatch[0]);
|
|
114
|
+
resolve(output);
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
reject(new Error(`Failed to parse Claude Code output: ${stdout}`));
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
reject(new Error(`Failed to parse Claude Code output: ${stdout}`));
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
proc.on('error', (err) => {
|
|
126
|
+
clearTimeout(timeoutId);
|
|
127
|
+
reject(err);
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Analyze text using Claude Code CLI
|
|
133
|
+
*/
|
|
134
|
+
async analyze(prompt, options = {}) {
|
|
135
|
+
const startTime = Date.now();
|
|
136
|
+
const model = options.model || this.model;
|
|
137
|
+
let lastError = null;
|
|
138
|
+
const retries = options.retries ?? 2;
|
|
139
|
+
let wasRetry = false;
|
|
140
|
+
for (let attempt = 0; attempt <= retries; attempt++) {
|
|
141
|
+
try {
|
|
142
|
+
const output = await this.executeClaudeCommand(prompt, options);
|
|
143
|
+
if (output.is_error) {
|
|
144
|
+
throw new Error(`Claude Code returned error: ${output.result}`);
|
|
145
|
+
}
|
|
146
|
+
// Extract actual content from result (may be wrapped in markdown)
|
|
147
|
+
let content = output.result;
|
|
148
|
+
// Calculate tokens (Claude Code provides this)
|
|
149
|
+
const inputTokens = output.usage?.input_tokens || 0;
|
|
150
|
+
const outputTokens = output.usage?.output_tokens || 0;
|
|
151
|
+
return {
|
|
152
|
+
content,
|
|
153
|
+
usage: {
|
|
154
|
+
inputTokens,
|
|
155
|
+
outputTokens,
|
|
156
|
+
totalTokens: inputTokens + outputTokens,
|
|
157
|
+
},
|
|
158
|
+
// Note: MAX subscription means this is already paid!
|
|
159
|
+
estimatedCost: 0, // Free with MAX
|
|
160
|
+
model,
|
|
161
|
+
durationMs: Date.now() - startTime,
|
|
162
|
+
wasRetry,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
lastError = error;
|
|
167
|
+
wasRetry = true;
|
|
168
|
+
if (attempt < retries) {
|
|
169
|
+
const delay = Math.min(1000 * Math.pow(2, attempt), 10000);
|
|
170
|
+
this.logger.warn(`Claude Code request failed, retrying in ${delay}ms...`);
|
|
171
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
throw lastError || new Error('Claude Code request failed after retries');
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Analyze with structured JSON output
|
|
179
|
+
*/
|
|
180
|
+
async analyzeStructured(prompt, options) {
|
|
181
|
+
// Add JSON instruction to prompt
|
|
182
|
+
const jsonPrompt = `${prompt}
|
|
183
|
+
|
|
184
|
+
IMPORTANT: Respond with valid JSON matching this schema:
|
|
185
|
+
${JSON.stringify(options.schema, null, 2)}
|
|
186
|
+
|
|
187
|
+
Return ONLY the JSON object, no markdown formatting, no explanation, no code blocks.`;
|
|
188
|
+
const result = await this.analyze(jsonPrompt, {
|
|
189
|
+
...options,
|
|
190
|
+
});
|
|
191
|
+
try {
|
|
192
|
+
// Extract JSON from response (handle markdown code blocks)
|
|
193
|
+
let jsonContent = result.content.trim();
|
|
194
|
+
// Remove markdown code block if present
|
|
195
|
+
if (jsonContent.startsWith('```json')) {
|
|
196
|
+
jsonContent = jsonContent.slice(7);
|
|
197
|
+
}
|
|
198
|
+
else if (jsonContent.startsWith('```')) {
|
|
199
|
+
jsonContent = jsonContent.slice(3);
|
|
200
|
+
}
|
|
201
|
+
if (jsonContent.endsWith('```')) {
|
|
202
|
+
jsonContent = jsonContent.slice(0, -3);
|
|
203
|
+
}
|
|
204
|
+
jsonContent = jsonContent.trim();
|
|
205
|
+
const data = JSON.parse(jsonContent);
|
|
206
|
+
return {
|
|
207
|
+
data,
|
|
208
|
+
usage: result.usage,
|
|
209
|
+
estimatedCost: 0, // Free with MAX
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
catch (parseError) {
|
|
213
|
+
if (options.strict) {
|
|
214
|
+
throw new Error(`Failed to parse structured response: ${parseError.message}\nRaw: ${result.content}`);
|
|
215
|
+
}
|
|
216
|
+
return {
|
|
217
|
+
data: { error: 'parse_failed', raw: result.content },
|
|
218
|
+
usage: result.usage,
|
|
219
|
+
estimatedCost: 0,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Estimate cost - always 0 for MAX subscription!
|
|
225
|
+
*/
|
|
226
|
+
estimateCost() {
|
|
227
|
+
return 0; // MAX subscription = already paid!
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Check if Claude Code CLI is available and authenticated
|
|
231
|
+
*/
|
|
232
|
+
async isAvailable() {
|
|
233
|
+
try {
|
|
234
|
+
const status = await this.getStatus();
|
|
235
|
+
return status.available;
|
|
236
|
+
}
|
|
237
|
+
catch {
|
|
238
|
+
return false;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Get provider status
|
|
243
|
+
*/
|
|
244
|
+
async getStatus() {
|
|
245
|
+
const startTime = Date.now();
|
|
246
|
+
try {
|
|
247
|
+
// Quick test with minimal prompt
|
|
248
|
+
// Note: First call can take 15-20s due to cache creation, so use longer timeout
|
|
249
|
+
const output = await this.executeClaudeCommand('Reply with just: ok', { timeout: 45000 });
|
|
250
|
+
return {
|
|
251
|
+
available: !output.is_error,
|
|
252
|
+
latencyMs: Date.now() - startTime,
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
catch (error) {
|
|
256
|
+
return {
|
|
257
|
+
available: false,
|
|
258
|
+
error: error.message || 'Claude Code CLI not available',
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Get the Claude auth directory path (cross-platform)
|
|
265
|
+
*/
|
|
266
|
+
function getClaudeAuthDir() {
|
|
267
|
+
if (IS_WINDOWS) {
|
|
268
|
+
return path.join(process.env.USERPROFILE || os.homedir(), '.claude');
|
|
269
|
+
}
|
|
270
|
+
return path.join(os.homedir(), '.claude');
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Check if Claude Code CLI is installed (cross-platform)
|
|
274
|
+
*/
|
|
275
|
+
function isClaudeCliInstalled() {
|
|
276
|
+
try {
|
|
277
|
+
if (IS_WINDOWS) {
|
|
278
|
+
// Windows: use 'where' command
|
|
279
|
+
execSync('where claude', { stdio: 'pipe' });
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
// Unix (macOS/Linux): use 'which' or 'command -v'
|
|
283
|
+
try {
|
|
284
|
+
execSync('which claude', { stdio: 'pipe' });
|
|
285
|
+
}
|
|
286
|
+
catch {
|
|
287
|
+
// Fallback to command -v (more POSIX compliant)
|
|
288
|
+
execSync('command -v claude', { stdio: 'pipe', shell: '/bin/sh' });
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
return true;
|
|
292
|
+
}
|
|
293
|
+
catch {
|
|
294
|
+
return false;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Check if Claude auth credentials exist
|
|
299
|
+
*/
|
|
300
|
+
function hasClaudeAuth() {
|
|
301
|
+
const authDir = getClaudeAuthDir();
|
|
302
|
+
// Check for auth file or credentials
|
|
303
|
+
return fs.existsSync(authDir) && (fs.existsSync(path.join(authDir, 'credentials.json')) ||
|
|
304
|
+
fs.existsSync(path.join(authDir, 'auth.json')) ||
|
|
305
|
+
fs.existsSync(path.join(authDir, '.credentials')));
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Check if Claude Code CLI is installed and authenticated
|
|
309
|
+
*
|
|
310
|
+
* Cross-platform support:
|
|
311
|
+
* - Windows: Uses `where claude` and checks %USERPROFILE%\.claude\
|
|
312
|
+
* - macOS/Linux: Uses `which claude` and checks ~/.claude/
|
|
313
|
+
*/
|
|
314
|
+
export async function isClaudeCodeAvailable() {
|
|
315
|
+
try {
|
|
316
|
+
// Step 1: Check if CLI is installed
|
|
317
|
+
if (!isClaudeCliInstalled()) {
|
|
318
|
+
return false;
|
|
319
|
+
}
|
|
320
|
+
// Step 2: Quick check for auth directory (fast, no subprocess)
|
|
321
|
+
// Note: Auth might be stored differently, so this is just a hint
|
|
322
|
+
const hasAuth = hasClaudeAuth();
|
|
323
|
+
if (!hasAuth) {
|
|
324
|
+
// Auth directory doesn't exist, but CLI might still work
|
|
325
|
+
// (e.g., auth stored elsewhere or in environment)
|
|
326
|
+
}
|
|
327
|
+
// Step 3: Actually test if it works (slow but definitive)
|
|
328
|
+
// Note: First call can take 15-20s due to cache creation, so use 45s timeout
|
|
329
|
+
const provider = new ClaudeCodeProvider({
|
|
330
|
+
timeout: 45000, // 45s for first-time cache creation
|
|
331
|
+
skipPermissions: true, // Essential for non-interactive check
|
|
332
|
+
});
|
|
333
|
+
return await provider.isAvailable();
|
|
334
|
+
}
|
|
335
|
+
catch {
|
|
336
|
+
return false;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Get detailed Claude Code availability info
|
|
341
|
+
*/
|
|
342
|
+
export async function getClaudeCodeStatus() {
|
|
343
|
+
const platform = IS_WINDOWS ? 'windows' : IS_MACOS ? 'macos' : IS_LINUX ? 'linux' : 'unknown';
|
|
344
|
+
const cliInstalled = isClaudeCliInstalled();
|
|
345
|
+
if (!cliInstalled) {
|
|
346
|
+
return {
|
|
347
|
+
available: false,
|
|
348
|
+
cliInstalled: false,
|
|
349
|
+
authExists: false,
|
|
350
|
+
error: `Claude CLI not found. Install from: https://claude.ai/download`,
|
|
351
|
+
platform,
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
const authExists = hasClaudeAuth();
|
|
355
|
+
try {
|
|
356
|
+
const provider = new ClaudeCodeProvider({
|
|
357
|
+
timeout: 45000, // 45s for first-time cache creation
|
|
358
|
+
skipPermissions: true,
|
|
359
|
+
});
|
|
360
|
+
const status = await provider.getStatus();
|
|
361
|
+
return {
|
|
362
|
+
available: status.available,
|
|
363
|
+
cliInstalled: true,
|
|
364
|
+
authExists,
|
|
365
|
+
error: status.error,
|
|
366
|
+
platform,
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
catch (error) {
|
|
370
|
+
return {
|
|
371
|
+
available: false,
|
|
372
|
+
cliInstalled: true,
|
|
373
|
+
authExists,
|
|
374
|
+
error: error.message || 'Failed to check Claude Code status',
|
|
375
|
+
platform,
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
//# sourceMappingURL=claude-code-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code-provider.js","sourceRoot":"","sources":["../../../../../src/core/llm/providers/claude-code-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ollama Provider (Local LLM)
|
|
3
|
+
*
|
|
4
|
+
* Implements LLMProvider interface for local Ollama models.
|
|
5
|
+
* Uses HTTP API directly (no SDK needed).
|
|
6
|
+
*
|
|
7
|
+
* Best for: Local development, privacy-sensitive analysis, cost-free operation
|
|
8
|
+
*/
|
|
9
|
+
import type { LLMProvider, AnalyzeOptions, AnalyzeResult, StructuredOptions } from '../types.js';
|
|
10
|
+
import { Logger } from '../../../utils/logger.js';
|
|
11
|
+
export interface OllamaProviderConfig {
|
|
12
|
+
baseUrl?: string;
|
|
13
|
+
model?: string;
|
|
14
|
+
maxTokens?: number;
|
|
15
|
+
temperature?: number;
|
|
16
|
+
logger?: Logger;
|
|
17
|
+
}
|
|
18
|
+
export declare class OllamaProvider implements LLMProvider {
|
|
19
|
+
readonly name: "ollama";
|
|
20
|
+
readonly defaultModel: string;
|
|
21
|
+
private baseUrl;
|
|
22
|
+
private maxTokens;
|
|
23
|
+
private temperature;
|
|
24
|
+
private logger;
|
|
25
|
+
constructor(config: OllamaProviderConfig);
|
|
26
|
+
analyze(prompt: string, options?: AnalyzeOptions): Promise<AnalyzeResult>;
|
|
27
|
+
analyzeStructured<T>(prompt: string, options: StructuredOptions<T>): Promise<{
|
|
28
|
+
data: T;
|
|
29
|
+
usage: AnalyzeResult['usage'];
|
|
30
|
+
estimatedCost: number;
|
|
31
|
+
}>;
|
|
32
|
+
estimateCost(): number;
|
|
33
|
+
isAvailable(): Promise<boolean>;
|
|
34
|
+
getStatus(): Promise<{
|
|
35
|
+
available: boolean;
|
|
36
|
+
latencyMs?: number;
|
|
37
|
+
error?: string;
|
|
38
|
+
}>;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=ollama-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama-provider.d.ts","sourceRoot":"","sources":["../../../../../src/core/llm/providers/ollama-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,aAAa,EACb,iBAAiB,EAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,MAAM,EAAiB,MAAM,0BAA0B,CAAC;AAEjE,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,cAAe,YAAW,WAAW;IAChD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAE9B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,oBAAoB;IAQlC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC;IA+C7E,iBAAiB,CAAC,CAAC,EACvB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAC5B,OAAO,CAAC;QAAE,IAAI,EAAE,CAAC,CAAC;QAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;IA2B7E,YAAY,IAAI,MAAM;IAIhB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAS/B,SAAS,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CA0BvF"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ollama Provider (Local LLM)
|
|
3
|
+
*
|
|
4
|
+
* Implements LLMProvider interface for local Ollama models.
|
|
5
|
+
* Uses HTTP API directly (no SDK needed).
|
|
6
|
+
*
|
|
7
|
+
* Best for: Local development, privacy-sensitive analysis, cost-free operation
|
|
8
|
+
*/
|
|
9
|
+
import { consoleLogger } from '../../../utils/logger.js';
|
|
10
|
+
export class OllamaProvider {
|
|
11
|
+
constructor(config) {
|
|
12
|
+
this.name = 'ollama';
|
|
13
|
+
this.baseUrl = config.baseUrl || 'http://localhost:11434';
|
|
14
|
+
this.defaultModel = config.model || 'llama3.1:8b';
|
|
15
|
+
this.maxTokens = config.maxTokens || 4096;
|
|
16
|
+
this.temperature = config.temperature ?? 0.3;
|
|
17
|
+
this.logger = config.logger || consoleLogger;
|
|
18
|
+
}
|
|
19
|
+
async analyze(prompt, options = {}) {
|
|
20
|
+
const startTime = Date.now();
|
|
21
|
+
const model = options.model || this.defaultModel;
|
|
22
|
+
const systemPrompt = options.systemPrompt || '';
|
|
23
|
+
const fullPrompt = systemPrompt ? `${systemPrompt}\n\n${prompt}` : prompt;
|
|
24
|
+
const response = await fetch(`${this.baseUrl}/api/generate`, {
|
|
25
|
+
method: 'POST',
|
|
26
|
+
headers: { 'Content-Type': 'application/json' },
|
|
27
|
+
body: JSON.stringify({
|
|
28
|
+
model,
|
|
29
|
+
prompt: fullPrompt,
|
|
30
|
+
stream: false,
|
|
31
|
+
options: {
|
|
32
|
+
num_predict: options.maxTokens || this.maxTokens,
|
|
33
|
+
temperature: options.temperature ?? this.temperature,
|
|
34
|
+
},
|
|
35
|
+
}),
|
|
36
|
+
signal: AbortSignal.timeout(options.timeout || 120000),
|
|
37
|
+
});
|
|
38
|
+
if (!response.ok) {
|
|
39
|
+
const error = await response.text();
|
|
40
|
+
throw new Error(`Ollama request failed: ${error}`);
|
|
41
|
+
}
|
|
42
|
+
const data = await response.json();
|
|
43
|
+
// Ollama doesn't provide exact token counts, estimate from response
|
|
44
|
+
const inputTokens = Math.ceil(fullPrompt.length / 4);
|
|
45
|
+
const outputTokens = Math.ceil((data.response?.length || 0) / 4);
|
|
46
|
+
return {
|
|
47
|
+
content: data.response || '',
|
|
48
|
+
usage: {
|
|
49
|
+
inputTokens,
|
|
50
|
+
outputTokens,
|
|
51
|
+
totalTokens: inputTokens + outputTokens,
|
|
52
|
+
},
|
|
53
|
+
estimatedCost: 0, // Local = free
|
|
54
|
+
model,
|
|
55
|
+
durationMs: Date.now() - startTime,
|
|
56
|
+
wasRetry: false,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
async analyzeStructured(prompt, options) {
|
|
60
|
+
const jsonPrompt = `${prompt}
|
|
61
|
+
|
|
62
|
+
Respond with valid JSON matching this schema:
|
|
63
|
+
${JSON.stringify(options.schema, null, 2)}
|
|
64
|
+
|
|
65
|
+
Return ONLY the JSON object.`;
|
|
66
|
+
const result = await this.analyze(jsonPrompt, {
|
|
67
|
+
...options,
|
|
68
|
+
temperature: 0.1,
|
|
69
|
+
});
|
|
70
|
+
let jsonContent = result.content.trim();
|
|
71
|
+
if (jsonContent.startsWith('```')) {
|
|
72
|
+
jsonContent = jsonContent.replace(/^```json?\n?/, '').replace(/\n?```$/, '');
|
|
73
|
+
}
|
|
74
|
+
const data = JSON.parse(jsonContent);
|
|
75
|
+
return {
|
|
76
|
+
data,
|
|
77
|
+
usage: result.usage,
|
|
78
|
+
estimatedCost: 0,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
estimateCost() {
|
|
82
|
+
return 0; // Local = free
|
|
83
|
+
}
|
|
84
|
+
async isAvailable() {
|
|
85
|
+
try {
|
|
86
|
+
const status = await this.getStatus();
|
|
87
|
+
return status.available;
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
async getStatus() {
|
|
94
|
+
const startTime = Date.now();
|
|
95
|
+
try {
|
|
96
|
+
const response = await fetch(`${this.baseUrl}/api/tags`, {
|
|
97
|
+
method: 'GET',
|
|
98
|
+
signal: AbortSignal.timeout(5000),
|
|
99
|
+
});
|
|
100
|
+
if (response.ok) {
|
|
101
|
+
const data = await response.json();
|
|
102
|
+
const hasModel = data.models?.some((m) => m.name === this.defaultModel || m.name.startsWith(this.defaultModel.split(':')[0]));
|
|
103
|
+
return {
|
|
104
|
+
available: hasModel,
|
|
105
|
+
latencyMs: Date.now() - startTime,
|
|
106
|
+
error: hasModel ? undefined : `Model ${this.defaultModel} not found`,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
return { available: false, error: 'Ollama server not responding' };
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
return { available: false, error: error.message };
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=ollama-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama-provider.js","sourceRoot":"","sources":["../../../../../src/core/llm/providers/ollama-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Provider
|
|
3
|
+
*
|
|
4
|
+
* Implements LLMProvider interface for OpenAI's GPT models.
|
|
5
|
+
* Uses openai SDK for API calls.
|
|
6
|
+
*
|
|
7
|
+
* TODO: Implement following the same pattern as anthropic-provider.ts
|
|
8
|
+
*/
|
|
9
|
+
import type { LLMProvider, AnalyzeOptions, AnalyzeResult, StructuredOptions } from '../types.js';
|
|
10
|
+
import { Logger } from '../../../utils/logger.js';
|
|
11
|
+
export interface OpenAIProviderConfig {
|
|
12
|
+
apiKey: string;
|
|
13
|
+
model?: string;
|
|
14
|
+
maxTokens?: number;
|
|
15
|
+
temperature?: number;
|
|
16
|
+
baseUrl?: string;
|
|
17
|
+
logger?: Logger;
|
|
18
|
+
}
|
|
19
|
+
export declare class OpenAIProvider implements LLMProvider {
|
|
20
|
+
readonly name: "openai";
|
|
21
|
+
readonly defaultModel: string;
|
|
22
|
+
private apiKey;
|
|
23
|
+
private maxTokens;
|
|
24
|
+
private temperature;
|
|
25
|
+
private baseUrl;
|
|
26
|
+
private logger;
|
|
27
|
+
private client;
|
|
28
|
+
constructor(config: OpenAIProviderConfig);
|
|
29
|
+
private getClient;
|
|
30
|
+
analyze(prompt: string, options?: AnalyzeOptions): Promise<AnalyzeResult>;
|
|
31
|
+
analyzeStructured<T>(prompt: string, options: StructuredOptions<T>): Promise<{
|
|
32
|
+
data: T;
|
|
33
|
+
usage: AnalyzeResult['usage'];
|
|
34
|
+
estimatedCost: number;
|
|
35
|
+
}>;
|
|
36
|
+
estimateCost(inputTokens: number, outputTokens: number, model?: string): number;
|
|
37
|
+
isAvailable(): Promise<boolean>;
|
|
38
|
+
getStatus(): Promise<{
|
|
39
|
+
available: boolean;
|
|
40
|
+
latencyMs?: number;
|
|
41
|
+
error?: string;
|
|
42
|
+
}>;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=openai-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-provider.d.ts","sourceRoot":"","sources":["../../../../../src/core/llm/providers/openai-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,aAAa,EACb,iBAAiB,EAClB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,MAAM,EAAiB,MAAM,0BAA0B,CAAC;AAEjE,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,cAAe,YAAW,WAAW;IAChD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAE9B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAM;gBAER,MAAM,EAAE,oBAAoB;YAS1B,SAAS;IAWjB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC;IAqC7E,iBAAiB,CAAC,CAAC,EACvB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAC5B,OAAO,CAAC;QAAE,IAAI,EAAE,CAAC,CAAC;QAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;IAqC7E,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IAQzE,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAS/B,SAAS,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAUvF"}
|