specweave 0.30.10 → 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.
Files changed (95) hide show
  1. package/dist/plugins/specweave-ado/lib/ado-client-v2.d.ts.map +1 -1
  2. package/dist/plugins/specweave-ado/lib/ado-client-v2.js +46 -12
  3. package/dist/plugins/specweave-ado/lib/ado-client-v2.js.map +1 -1
  4. package/dist/src/cli/commands/init.d.ts.map +1 -1
  5. package/dist/src/cli/commands/init.js +12 -2
  6. package/dist/src/cli/commands/init.js.map +1 -1
  7. package/dist/src/cli/helpers/init/living-docs-preflight.d.ts +5 -1
  8. package/dist/src/cli/helpers/init/living-docs-preflight.d.ts.map +1 -1
  9. package/dist/src/cli/helpers/init/living-docs-preflight.js +80 -28
  10. package/dist/src/cli/helpers/init/living-docs-preflight.js.map +1 -1
  11. package/dist/src/cli/helpers/init/repository-setup.d.ts.map +1 -1
  12. package/dist/src/cli/helpers/init/repository-setup.js +64 -2
  13. package/dist/src/cli/helpers/init/repository-setup.js.map +1 -1
  14. package/dist/src/cli/helpers/project-count-fetcher.js +33 -2
  15. package/dist/src/cli/helpers/project-count-fetcher.js.map +1 -1
  16. package/dist/src/cli/workers/brownfield-worker.d.ts +13 -0
  17. package/dist/src/cli/workers/brownfield-worker.d.ts.map +1 -1
  18. package/dist/src/cli/workers/brownfield-worker.js +154 -0
  19. package/dist/src/cli/workers/brownfield-worker.js.map +1 -1
  20. package/dist/src/cli/workers/living-docs-worker.js +272 -11
  21. package/dist/src/cli/workers/living-docs-worker.js.map +1 -1
  22. package/dist/src/core/background/brownfield-launcher.d.ts +2 -1
  23. package/dist/src/core/background/brownfield-launcher.d.ts.map +1 -1
  24. package/dist/src/core/background/brownfield-launcher.js.map +1 -1
  25. package/dist/src/core/background/types.d.ts +10 -2
  26. package/dist/src/core/background/types.d.ts.map +1 -1
  27. package/dist/src/core/discrepancy/brownfield-types.d.ts +3 -1
  28. package/dist/src/core/discrepancy/brownfield-types.d.ts.map +1 -1
  29. package/dist/src/core/living-docs/feature-archiver.d.ts +39 -0
  30. package/dist/src/core/living-docs/feature-archiver.d.ts.map +1 -1
  31. package/dist/src/core/living-docs/feature-archiver.js +197 -0
  32. package/dist/src/core/living-docs/feature-archiver.js.map +1 -1
  33. package/dist/src/core/llm/availability-messages.d.ts +33 -0
  34. package/dist/src/core/llm/availability-messages.d.ts.map +1 -0
  35. package/dist/src/core/llm/availability-messages.js +170 -0
  36. package/dist/src/core/llm/availability-messages.js.map +1 -0
  37. package/dist/src/core/llm/index.d.ts +34 -0
  38. package/dist/src/core/llm/index.d.ts.map +1 -0
  39. package/dist/src/core/llm/index.js +35 -0
  40. package/dist/src/core/llm/index.js.map +1 -0
  41. package/dist/src/core/llm/provider-factory.d.ts +48 -0
  42. package/dist/src/core/llm/provider-factory.d.ts.map +1 -0
  43. package/dist/src/core/llm/provider-factory.js +274 -0
  44. package/dist/src/core/llm/provider-factory.js.map +1 -0
  45. package/dist/src/core/llm/providers/anthropic-provider.d.ts +66 -0
  46. package/dist/src/core/llm/providers/anthropic-provider.d.ts.map +1 -0
  47. package/dist/src/core/llm/providers/anthropic-provider.js +195 -0
  48. package/dist/src/core/llm/providers/anthropic-provider.js.map +1 -0
  49. package/dist/src/core/llm/providers/azure-openai-provider.d.ts +47 -0
  50. package/dist/src/core/llm/providers/azure-openai-provider.d.ts.map +1 -0
  51. package/dist/src/core/llm/providers/azure-openai-provider.js +116 -0
  52. package/dist/src/core/llm/providers/azure-openai-provider.js.map +1 -0
  53. package/dist/src/core/llm/providers/bedrock-provider.d.ts +44 -0
  54. package/dist/src/core/llm/providers/bedrock-provider.d.ts.map +1 -0
  55. package/dist/src/core/llm/providers/bedrock-provider.js +149 -0
  56. package/dist/src/core/llm/providers/bedrock-provider.js.map +1 -0
  57. package/dist/src/core/llm/providers/claude-code-provider.d.ts +115 -0
  58. package/dist/src/core/llm/providers/claude-code-provider.d.ts.map +1 -0
  59. package/dist/src/core/llm/providers/claude-code-provider.js +379 -0
  60. package/dist/src/core/llm/providers/claude-code-provider.js.map +1 -0
  61. package/dist/src/core/llm/providers/ollama-provider.d.ts +40 -0
  62. package/dist/src/core/llm/providers/ollama-provider.d.ts.map +1 -0
  63. package/dist/src/core/llm/providers/ollama-provider.js +116 -0
  64. package/dist/src/core/llm/providers/ollama-provider.js.map +1 -0
  65. package/dist/src/core/llm/providers/openai-provider.d.ts +44 -0
  66. package/dist/src/core/llm/providers/openai-provider.d.ts.map +1 -0
  67. package/dist/src/core/llm/providers/openai-provider.js +119 -0
  68. package/dist/src/core/llm/providers/openai-provider.js.map +1 -0
  69. package/dist/src/core/llm/providers/vertex-ai-provider.d.ts +46 -0
  70. package/dist/src/core/llm/providers/vertex-ai-provider.d.ts.map +1 -0
  71. package/dist/src/core/llm/providers/vertex-ai-provider.js +123 -0
  72. package/dist/src/core/llm/providers/vertex-ai-provider.js.map +1 -0
  73. package/dist/src/core/llm/types.d.ts +181 -0
  74. package/dist/src/core/llm/types.d.ts.map +1 -0
  75. package/dist/src/core/llm/types.js +56 -0
  76. package/dist/src/core/llm/types.js.map +1 -0
  77. package/dist/src/importers/item-converter.d.ts.map +1 -1
  78. package/dist/src/importers/item-converter.js +69 -12
  79. package/dist/src/importers/item-converter.js.map +1 -1
  80. package/dist/src/integrations/ado/ado-client.d.ts +22 -0
  81. package/dist/src/integrations/ado/ado-client.d.ts.map +1 -1
  82. package/dist/src/integrations/ado/ado-client.js +89 -37
  83. package/dist/src/integrations/ado/ado-client.js.map +1 -1
  84. package/dist/src/living-docs/enterprise-analyzer.d.ts +160 -0
  85. package/dist/src/living-docs/enterprise-analyzer.d.ts.map +1 -0
  86. package/dist/src/living-docs/enterprise-analyzer.js +836 -0
  87. package/dist/src/living-docs/enterprise-analyzer.js.map +1 -0
  88. package/dist/src/living-docs/fs-id-allocator.d.ts +5 -0
  89. package/dist/src/living-docs/fs-id-allocator.d.ts.map +1 -1
  90. package/dist/src/living-docs/fs-id-allocator.js +12 -5
  91. package/dist/src/living-docs/fs-id-allocator.js.map +1 -1
  92. package/package.json +1 -1
  93. package/plugins/specweave/commands/specweave-archive.md +69 -2
  94. package/plugins/specweave-ado/lib/ado-client-v2.js +43 -8
  95. package/plugins/specweave-ado/lib/ado-client-v2.ts +52 -12
@@ -0,0 +1,35 @@
1
+ /**
2
+ * LLM Provider Abstraction Layer
3
+ *
4
+ * Provides a unified interface for multiple LLM providers:
5
+ * - Anthropic Claude (claude-sonnet, claude-opus, claude-haiku)
6
+ * - OpenAI GPT (gpt-4o, gpt-4o-mini, o1)
7
+ * - Azure OpenAI (enterprise deployments)
8
+ * - AWS Bedrock (Claude, Titan)
9
+ * - Google Vertex AI (Gemini)
10
+ * - Ollama (local models)
11
+ *
12
+ * Usage:
13
+ * ```typescript
14
+ * import { loadLLMConfig, createProvider } from './core/llm/index.js';
15
+ *
16
+ * const config = loadLLMConfig(projectPath);
17
+ * if (config) {
18
+ * const provider = await createProvider(config);
19
+ * const result = await provider.analyze('Explain this code...');
20
+ * console.log(result.content);
21
+ * }
22
+ * ```
23
+ */
24
+ export { MODEL_PRICING, RECOMMENDED_MODELS, } from './types.js';
25
+ // Factory
26
+ export { loadLLMConfig, hasLLMConfig, createProvider, getAvailableProviders, validateLLMConfig, } from './provider-factory.js';
27
+ // Providers (for direct instantiation if needed)
28
+ export { ClaudeCodeProvider, isClaudeCodeAvailable } from './providers/claude-code-provider.js';
29
+ export { AnthropicProvider } from './providers/anthropic-provider.js';
30
+ export { OpenAIProvider } from './providers/openai-provider.js';
31
+ export { AzureOpenAIProvider } from './providers/azure-openai-provider.js';
32
+ export { OllamaProvider } from './providers/ollama-provider.js';
33
+ export { BedrockProvider } from './providers/bedrock-provider.js';
34
+ export { VertexAIProvider } from './providers/vertex-ai-provider.js';
35
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/llm/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAeH,OAAO,EACL,aAAa,EACb,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAEpB,UAAU;AACV,OAAO,EACL,aAAa,EACb,YAAY,EACZ,cAAc,EACd,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAE/B,iDAAiD;AACjD,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAChG,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * LLM Provider Factory
3
+ *
4
+ * Creates appropriate LLM provider instance from configuration.
5
+ * Supports lazy loading of provider SDKs to avoid unnecessary dependencies.
6
+ */
7
+ import type { LLMConfig, LLMProvider, LLMProviderType } from './types.js';
8
+ import { isClaudeCodeAvailable, getClaudeCodeStatus } from './providers/claude-code-provider.js';
9
+ import { Logger } from '../../utils/logger.js';
10
+ export { isClaudeCodeAvailable, getClaudeCodeStatus };
11
+ /**
12
+ * Provider factory options
13
+ */
14
+ export interface ProviderFactoryOptions {
15
+ logger?: Logger;
16
+ }
17
+ /**
18
+ * Load LLM configuration from project
19
+ *
20
+ * @param projectPath - Path to project root
21
+ * @returns LLM config or null if not configured
22
+ */
23
+ export declare function loadLLMConfig(projectPath: string): LLMConfig | null;
24
+ /**
25
+ * Check if LLM is configured for a project
26
+ */
27
+ export declare function hasLLMConfig(projectPath: string): boolean;
28
+ /**
29
+ * Create LLM provider from configuration
30
+ *
31
+ * @param config - LLM configuration
32
+ * @param options - Factory options
33
+ * @returns LLM provider instance
34
+ * @throws Error if provider type not supported or SDK not installed
35
+ */
36
+ export declare function createProvider(config: LLMConfig, options?: ProviderFactoryOptions): Promise<LLMProvider>;
37
+ /**
38
+ * Get list of available providers (based on installed SDKs and env vars)
39
+ */
40
+ export declare function getAvailableProviders(): Promise<LLMProviderType[]>;
41
+ /**
42
+ * Validate LLM configuration
43
+ */
44
+ export declare function validateLLMConfig(config: LLMConfig): {
45
+ valid: boolean;
46
+ errors: string[];
47
+ };
48
+ //# sourceMappingURL=provider-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-factory.d.ts","sourceRoot":"","sources":["../../../../src/core/llm/provider-factory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AACjG,OAAO,EAAE,MAAM,EAAiB,MAAM,uBAAuB,CAAC;AAG9D,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,CAAC;AAEtD;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAanE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAGzD;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,SAAS,EACjB,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,WAAW,CAAC,CA4BtB;AA6KD;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CA6DxE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CA2BzF"}
@@ -0,0 +1,274 @@
1
+ /**
2
+ * LLM Provider Factory
3
+ *
4
+ * Creates appropriate LLM provider instance from configuration.
5
+ * Supports lazy loading of provider SDKs to avoid unnecessary dependencies.
6
+ */
7
+ import * as fs from '../../utils/fs-native.js';
8
+ import * as path from 'path';
9
+ import { isClaudeCodeAvailable, getClaudeCodeStatus } from './providers/claude-code-provider.js';
10
+ import { consoleLogger } from '../../utils/logger.js';
11
+ // Re-export for convenience
12
+ export { isClaudeCodeAvailable, getClaudeCodeStatus };
13
+ /**
14
+ * Load LLM configuration from project
15
+ *
16
+ * @param projectPath - Path to project root
17
+ * @returns LLM config or null if not configured
18
+ */
19
+ export function loadLLMConfig(projectPath) {
20
+ const configPath = path.join(projectPath, '.specweave', 'config.json');
21
+ if (!fs.existsSync(configPath)) {
22
+ return null;
23
+ }
24
+ try {
25
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
26
+ return config.llm || null;
27
+ }
28
+ catch {
29
+ return null;
30
+ }
31
+ }
32
+ /**
33
+ * Check if LLM is configured for a project
34
+ */
35
+ export function hasLLMConfig(projectPath) {
36
+ const config = loadLLMConfig(projectPath);
37
+ return config !== null;
38
+ }
39
+ /**
40
+ * Create LLM provider from configuration
41
+ *
42
+ * @param config - LLM configuration
43
+ * @param options - Factory options
44
+ * @returns LLM provider instance
45
+ * @throws Error if provider type not supported or SDK not installed
46
+ */
47
+ export async function createProvider(config, options = {}) {
48
+ const logger = options.logger ?? consoleLogger;
49
+ switch (config.provider) {
50
+ case 'claude-code':
51
+ return createClaudeCodeProvider(config, logger);
52
+ case 'anthropic':
53
+ return createAnthropicProvider(config, logger);
54
+ case 'openai':
55
+ return createOpenAIProvider(config, logger);
56
+ case 'azure-openai':
57
+ return createAzureOpenAIProvider(config, logger);
58
+ case 'ollama':
59
+ return createOllamaProvider(config, logger);
60
+ case 'bedrock':
61
+ return createBedrockProvider(config, logger);
62
+ case 'vertex-ai':
63
+ return createVertexAIProvider(config, logger);
64
+ default:
65
+ throw new Error(`Unsupported LLM provider: ${config.provider}`);
66
+ }
67
+ }
68
+ /**
69
+ * Create Claude Code native provider (uses MAX subscription!)
70
+ *
71
+ * This is the RECOMMENDED provider for Claude MAX subscribers.
72
+ * Uses `claude --print` CLI command with cached authentication.
73
+ * NO API KEY NEEDED - uses your existing MAX subscription!
74
+ */
75
+ async function createClaudeCodeProvider(config, logger) {
76
+ const { ClaudeCodeProvider } = await import('./providers/claude-code-provider.js');
77
+ // Check if Claude Code CLI is available
78
+ const available = await isClaudeCodeAvailable();
79
+ if (!available) {
80
+ throw new Error('Claude Code CLI not available or not authenticated. ' +
81
+ 'Run `claude` interactively first to authenticate with your MAX subscription.');
82
+ }
83
+ return new ClaudeCodeProvider({
84
+ model: config.model || 'opus', // Opus 4.5 by default for best analysis quality
85
+ maxTokens: config.maxTokensPerRequest,
86
+ logger,
87
+ });
88
+ }
89
+ /**
90
+ * Create Anthropic provider (lazy load SDK)
91
+ */
92
+ async function createAnthropicProvider(config, logger) {
93
+ // Dynamic import to avoid requiring SDK if not used
94
+ const { AnthropicProvider } = await import('./providers/anthropic-provider.js');
95
+ const apiKey = config.apiKeyEnv ? process.env[config.apiKeyEnv] : process.env.ANTHROPIC_API_KEY;
96
+ if (!apiKey) {
97
+ throw new Error(`Anthropic API key not found. Set ${config.apiKeyEnv || 'ANTHROPIC_API_KEY'} environment variable.`);
98
+ }
99
+ return new AnthropicProvider({
100
+ apiKey,
101
+ model: config.model || 'claude-sonnet-4-20250514',
102
+ maxTokens: config.maxTokensPerRequest,
103
+ temperature: config.temperature,
104
+ logger,
105
+ });
106
+ }
107
+ /**
108
+ * Create OpenAI provider (lazy load SDK)
109
+ */
110
+ async function createOpenAIProvider(config, logger) {
111
+ const { OpenAIProvider } = await import('./providers/openai-provider.js');
112
+ const apiKey = config.apiKeyEnv ? process.env[config.apiKeyEnv] : process.env.OPENAI_API_KEY;
113
+ if (!apiKey) {
114
+ throw new Error(`OpenAI API key not found. Set ${config.apiKeyEnv || 'OPENAI_API_KEY'} environment variable.`);
115
+ }
116
+ return new OpenAIProvider({
117
+ apiKey,
118
+ model: config.model || 'gpt-4o',
119
+ maxTokens: config.maxTokensPerRequest,
120
+ temperature: config.temperature,
121
+ logger,
122
+ });
123
+ }
124
+ /**
125
+ * Create Azure OpenAI provider
126
+ */
127
+ async function createAzureOpenAIProvider(config, logger) {
128
+ const { AzureOpenAIProvider } = await import('./providers/azure-openai-provider.js');
129
+ const apiKey = config.apiKeyEnv
130
+ ? process.env[config.apiKeyEnv]
131
+ : process.env.AZURE_OPENAI_API_KEY;
132
+ if (!apiKey) {
133
+ throw new Error(`Azure OpenAI API key not found. Set ${config.apiKeyEnv || 'AZURE_OPENAI_API_KEY'} environment variable.`);
134
+ }
135
+ if (!config.baseUrl) {
136
+ throw new Error('Azure OpenAI requires baseUrl (endpoint) in config');
137
+ }
138
+ return new AzureOpenAIProvider({
139
+ apiKey,
140
+ endpoint: config.baseUrl,
141
+ deployment: config.azureDeployment || config.model,
142
+ apiVersion: config.azureApiVersion || '2024-02-15-preview',
143
+ maxTokens: config.maxTokensPerRequest,
144
+ temperature: config.temperature,
145
+ logger,
146
+ });
147
+ }
148
+ /**
149
+ * Create Ollama provider (local)
150
+ */
151
+ async function createOllamaProvider(config, logger) {
152
+ const { OllamaProvider } = await import('./providers/ollama-provider.js');
153
+ return new OllamaProvider({
154
+ baseUrl: config.baseUrl || 'http://localhost:11434',
155
+ model: config.model || 'llama3.1:8b',
156
+ maxTokens: config.maxTokensPerRequest,
157
+ temperature: config.temperature,
158
+ logger,
159
+ });
160
+ }
161
+ /**
162
+ * Create AWS Bedrock provider
163
+ */
164
+ async function createBedrockProvider(config, logger) {
165
+ const { BedrockProvider } = await import('./providers/bedrock-provider.js');
166
+ return new BedrockProvider({
167
+ region: config.awsRegion || process.env.AWS_REGION || 'us-east-1',
168
+ model: config.model || 'anthropic.claude-3-5-sonnet-20241022-v2:0',
169
+ maxTokens: config.maxTokensPerRequest,
170
+ temperature: config.temperature,
171
+ logger,
172
+ });
173
+ }
174
+ /**
175
+ * Create Google Vertex AI provider
176
+ */
177
+ async function createVertexAIProvider(config, logger) {
178
+ const { VertexAIProvider } = await import('./providers/vertex-ai-provider.js');
179
+ return new VertexAIProvider({
180
+ projectId: process.env.GOOGLE_CLOUD_PROJECT,
181
+ location: process.env.GOOGLE_CLOUD_LOCATION || 'us-central1',
182
+ model: config.model || 'gemini-1.5-pro',
183
+ maxTokens: config.maxTokensPerRequest,
184
+ temperature: config.temperature,
185
+ logger,
186
+ });
187
+ }
188
+ /**
189
+ * Get list of available providers (based on installed SDKs and env vars)
190
+ */
191
+ export async function getAvailableProviders() {
192
+ const available = [];
193
+ // Check Claude Code (RECOMMENDED - uses MAX subscription!)
194
+ try {
195
+ if (await isClaudeCodeAvailable()) {
196
+ available.push('claude-code');
197
+ }
198
+ }
199
+ catch {
200
+ // Claude Code not available
201
+ }
202
+ // Check Anthropic API
203
+ if (process.env.ANTHROPIC_API_KEY) {
204
+ try {
205
+ await import('@anthropic-ai/sdk');
206
+ available.push('anthropic');
207
+ }
208
+ catch {
209
+ // SDK not installed
210
+ }
211
+ }
212
+ // Check OpenAI
213
+ if (process.env.OPENAI_API_KEY) {
214
+ try {
215
+ await import('openai');
216
+ available.push('openai');
217
+ }
218
+ catch {
219
+ // SDK not installed
220
+ }
221
+ }
222
+ // Check Azure OpenAI
223
+ if (process.env.AZURE_OPENAI_API_KEY && process.env.AZURE_OPENAI_ENDPOINT) {
224
+ available.push('azure-openai');
225
+ }
226
+ // Ollama is always "available" if URL is reachable
227
+ try {
228
+ const response = await fetch('http://localhost:11434/api/tags', {
229
+ method: 'GET',
230
+ signal: AbortSignal.timeout(2000),
231
+ });
232
+ if (response.ok) {
233
+ available.push('ollama');
234
+ }
235
+ }
236
+ catch {
237
+ // Ollama not running
238
+ }
239
+ // Check Bedrock (requires AWS credentials)
240
+ if (process.env.AWS_ACCESS_KEY_ID || process.env.AWS_PROFILE) {
241
+ available.push('bedrock');
242
+ }
243
+ // Check Vertex AI
244
+ if (process.env.GOOGLE_APPLICATION_CREDENTIALS || process.env.GOOGLE_CLOUD_PROJECT) {
245
+ available.push('vertex-ai');
246
+ }
247
+ return available;
248
+ }
249
+ /**
250
+ * Validate LLM configuration
251
+ */
252
+ export function validateLLMConfig(config) {
253
+ const errors = [];
254
+ if (!config.provider) {
255
+ errors.push('provider is required');
256
+ }
257
+ if (!config.model) {
258
+ errors.push('model is required');
259
+ }
260
+ if (config.provider === 'azure-openai' && !config.baseUrl) {
261
+ errors.push('baseUrl (endpoint) is required for Azure OpenAI');
262
+ }
263
+ if (config.maxTokensPerRequest && config.maxTokensPerRequest > 100000) {
264
+ errors.push('maxTokensPerRequest exceeds maximum (100000)');
265
+ }
266
+ if (config.temperature !== undefined && (config.temperature < 0 || config.temperature > 2)) {
267
+ errors.push('temperature must be between 0 and 2');
268
+ }
269
+ return {
270
+ valid: errors.length === 0,
271
+ errors,
272
+ };
273
+ }
274
+ //# sourceMappingURL=provider-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-factory.js","sourceRoot":"","sources":["../../../../src/core/llm/provider-factory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Anthropic Claude Provider
3
+ *
4
+ * Implements LLMProvider interface for Anthropic's Claude models.
5
+ * Uses @anthropic-ai/sdk for API calls.
6
+ */
7
+ import type { LLMProvider, AnalyzeOptions, AnalyzeResult, StructuredOptions } from '../types.js';
8
+ import { Logger } from '../../../utils/logger.js';
9
+ /**
10
+ * Anthropic provider configuration
11
+ */
12
+ export interface AnthropicProviderConfig {
13
+ apiKey: string;
14
+ model?: string;
15
+ maxTokens?: number;
16
+ temperature?: number;
17
+ baseUrl?: string;
18
+ logger?: Logger;
19
+ }
20
+ /**
21
+ * Anthropic Claude provider implementation
22
+ */
23
+ export declare class AnthropicProvider implements LLMProvider {
24
+ readonly name: "anthropic";
25
+ readonly defaultModel: string;
26
+ private apiKey;
27
+ private maxTokens;
28
+ private temperature;
29
+ private baseUrl;
30
+ private logger;
31
+ private client;
32
+ constructor(config: AnthropicProviderConfig);
33
+ /**
34
+ * Get or create SDK client (lazy initialization)
35
+ */
36
+ private getClient;
37
+ /**
38
+ * Analyze text with Claude
39
+ */
40
+ analyze(prompt: string, options?: AnalyzeOptions): Promise<AnalyzeResult>;
41
+ /**
42
+ * Analyze with structured JSON output
43
+ */
44
+ analyzeStructured<T>(prompt: string, options: StructuredOptions<T>): Promise<{
45
+ data: T;
46
+ usage: AnalyzeResult['usage'];
47
+ estimatedCost: number;
48
+ }>;
49
+ /**
50
+ * Estimate cost for a request
51
+ */
52
+ estimateCost(inputTokens: number, outputTokens: number, model?: string): number;
53
+ /**
54
+ * Check if provider is available
55
+ */
56
+ isAvailable(): Promise<boolean>;
57
+ /**
58
+ * Get provider status
59
+ */
60
+ getStatus(): Promise<{
61
+ available: boolean;
62
+ latencyMs?: number;
63
+ error?: string;
64
+ }>;
65
+ }
66
+ //# sourceMappingURL=anthropic-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-provider.d.ts","sourceRoot":"","sources":["../../../../../src/core/llm/providers/anthropic-provider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,aAAa,EACb,iBAAiB,EAElB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,MAAM,EAAiB,MAAM,0BAA0B,CAAC;AAEjE;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,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;;GAEG;AACH,qBAAa,iBAAkB,YAAW,WAAW;IACnD,QAAQ,CAAC,IAAI,EAAG,WAAW,CAAU;IACrC,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,uBAAuB;IAS3C;;OAEG;YACW,SAAS;IAYvB;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC;IAwEnF;;OAEG;IACG,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;IAkD7E;;OAEG;IACH,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IAU/E;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IASrC;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAuBvF"}
@@ -0,0 +1,195 @@
1
+ /**
2
+ * Anthropic Claude Provider
3
+ *
4
+ * Implements LLMProvider interface for Anthropic's Claude models.
5
+ * Uses @anthropic-ai/sdk for API calls.
6
+ */
7
+ import { MODEL_PRICING } from '../types.js';
8
+ import { consoleLogger } from '../../../utils/logger.js';
9
+ /**
10
+ * Anthropic Claude provider implementation
11
+ */
12
+ export class AnthropicProvider {
13
+ constructor(config) {
14
+ this.name = 'anthropic';
15
+ this.apiKey = config.apiKey;
16
+ this.defaultModel = config.model || 'claude-sonnet-4-20250514';
17
+ this.maxTokens = config.maxTokens || 4096;
18
+ this.temperature = config.temperature ?? 0.3;
19
+ this.baseUrl = config.baseUrl || 'https://api.anthropic.com';
20
+ this.logger = config.logger || consoleLogger;
21
+ }
22
+ /**
23
+ * Get or create SDK client (lazy initialization)
24
+ */
25
+ async getClient() {
26
+ if (!this.client) {
27
+ // Dynamic import to avoid requiring SDK if not used
28
+ const Anthropic = (await import('@anthropic-ai/sdk')).default;
29
+ this.client = new Anthropic({
30
+ apiKey: this.apiKey,
31
+ baseURL: this.baseUrl,
32
+ });
33
+ }
34
+ return this.client;
35
+ }
36
+ /**
37
+ * Analyze text with Claude
38
+ */
39
+ async analyze(prompt, options = {}) {
40
+ const startTime = Date.now();
41
+ const model = options.model || this.defaultModel;
42
+ const maxTokens = options.maxTokens || this.maxTokens;
43
+ const temperature = options.temperature ?? this.temperature;
44
+ const retries = options.retries ?? 2;
45
+ const timeout = options.timeout ?? 60000;
46
+ let lastError = null;
47
+ let wasRetry = false;
48
+ for (let attempt = 0; attempt <= retries; attempt++) {
49
+ try {
50
+ const client = await this.getClient();
51
+ const messages = [
52
+ { role: 'user', content: prompt },
53
+ ];
54
+ const response = await client.messages.create({
55
+ model,
56
+ max_tokens: maxTokens,
57
+ temperature,
58
+ system: options.systemPrompt,
59
+ messages,
60
+ });
61
+ const content = response.content
62
+ .filter((block) => block.type === 'text')
63
+ .map((block) => block.text)
64
+ .join('\n');
65
+ const usage = {
66
+ inputTokens: response.usage?.input_tokens || 0,
67
+ outputTokens: response.usage?.output_tokens || 0,
68
+ totalTokens: (response.usage?.input_tokens || 0) + (response.usage?.output_tokens || 0),
69
+ };
70
+ return {
71
+ content,
72
+ usage,
73
+ estimatedCost: this.estimateCost(usage.inputTokens, usage.outputTokens, model),
74
+ model,
75
+ durationMs: Date.now() - startTime,
76
+ wasRetry,
77
+ };
78
+ }
79
+ catch (error) {
80
+ lastError = error;
81
+ wasRetry = true;
82
+ // Don't retry on auth errors
83
+ if (error.status === 401 || error.status === 403) {
84
+ throw error;
85
+ }
86
+ // Don't retry on validation errors
87
+ if (error.status === 400) {
88
+ throw error;
89
+ }
90
+ // Retry on rate limits and server errors
91
+ if (attempt < retries) {
92
+ const delay = Math.min(1000 * Math.pow(2, attempt), 10000);
93
+ this.logger.warn(`Anthropic request failed, retrying in ${delay}ms...`);
94
+ await new Promise(resolve => setTimeout(resolve, delay));
95
+ }
96
+ }
97
+ }
98
+ throw lastError || new Error('Anthropic request failed after retries');
99
+ }
100
+ /**
101
+ * Analyze with structured JSON output
102
+ */
103
+ async analyzeStructured(prompt, options) {
104
+ // Add JSON instruction to prompt
105
+ const jsonPrompt = `${prompt}
106
+
107
+ IMPORTANT: Respond with valid JSON matching this schema:
108
+ ${JSON.stringify(options.schema, null, 2)}
109
+
110
+ Return ONLY the JSON object, no markdown formatting or explanation.`;
111
+ const result = await this.analyze(jsonPrompt, {
112
+ ...options,
113
+ temperature: options.temperature ?? 0.1, // Lower temp for structured output
114
+ });
115
+ try {
116
+ // Extract JSON from response (handle markdown code blocks)
117
+ let jsonContent = result.content.trim();
118
+ // Remove markdown code block if present
119
+ if (jsonContent.startsWith('```json')) {
120
+ jsonContent = jsonContent.slice(7);
121
+ }
122
+ else if (jsonContent.startsWith('```')) {
123
+ jsonContent = jsonContent.slice(3);
124
+ }
125
+ if (jsonContent.endsWith('```')) {
126
+ jsonContent = jsonContent.slice(0, -3);
127
+ }
128
+ jsonContent = jsonContent.trim();
129
+ const data = JSON.parse(jsonContent);
130
+ return {
131
+ data,
132
+ usage: result.usage,
133
+ estimatedCost: result.estimatedCost,
134
+ };
135
+ }
136
+ catch (parseError) {
137
+ if (options.strict) {
138
+ throw new Error(`Failed to parse structured response: ${parseError.message}`);
139
+ }
140
+ // Return raw content wrapped in error structure
141
+ return {
142
+ data: { error: 'parse_failed', raw: result.content },
143
+ usage: result.usage,
144
+ estimatedCost: result.estimatedCost,
145
+ };
146
+ }
147
+ }
148
+ /**
149
+ * Estimate cost for a request
150
+ */
151
+ estimateCost(inputTokens, outputTokens, model) {
152
+ const modelId = model || this.defaultModel;
153
+ const pricing = MODEL_PRICING[modelId] || { inputPer1M: 3, outputPer1M: 15 };
154
+ const inputCost = (inputTokens / 1000000) * pricing.inputPer1M;
155
+ const outputCost = (outputTokens / 1000000) * pricing.outputPer1M;
156
+ return inputCost + outputCost;
157
+ }
158
+ /**
159
+ * Check if provider is available
160
+ */
161
+ async isAvailable() {
162
+ try {
163
+ const status = await this.getStatus();
164
+ return status.available;
165
+ }
166
+ catch {
167
+ return false;
168
+ }
169
+ }
170
+ /**
171
+ * Get provider status
172
+ */
173
+ async getStatus() {
174
+ const startTime = Date.now();
175
+ try {
176
+ const client = await this.getClient();
177
+ // Simple ping - count tokens for minimal text
178
+ await client.messages.count_tokens({
179
+ model: this.defaultModel,
180
+ messages: [{ role: 'user', content: 'ping' }],
181
+ });
182
+ return {
183
+ available: true,
184
+ latencyMs: Date.now() - startTime,
185
+ };
186
+ }
187
+ catch (error) {
188
+ return {
189
+ available: false,
190
+ error: error.message || 'Unknown error',
191
+ };
192
+ }
193
+ }
194
+ }
195
+ //# sourceMappingURL=anthropic-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-provider.js","sourceRoot":"","sources":["../../../../../src/core/llm/providers/anthropic-provider.ts"],"names":[],"mappings":"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"}