spec-gen-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.
- package/LICENSE +21 -0
- package/README.md +1078 -0
- package/dist/api/analyze.d.ts +17 -0
- package/dist/api/analyze.d.ts.map +1 -0
- package/dist/api/analyze.js +109 -0
- package/dist/api/analyze.js.map +1 -0
- package/dist/api/drift.d.ts +21 -0
- package/dist/api/drift.d.ts.map +1 -0
- package/dist/api/drift.js +145 -0
- package/dist/api/drift.js.map +1 -0
- package/dist/api/generate.d.ts +18 -0
- package/dist/api/generate.d.ts.map +1 -0
- package/dist/api/generate.js +251 -0
- package/dist/api/generate.js.map +1 -0
- package/dist/api/index.d.ts +39 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +32 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/init.d.ts +18 -0
- package/dist/api/init.d.ts.map +1 -0
- package/dist/api/init.js +82 -0
- package/dist/api/init.js.map +1 -0
- package/dist/api/run.d.ts +19 -0
- package/dist/api/run.d.ts.map +1 -0
- package/dist/api/run.js +291 -0
- package/dist/api/run.js.map +1 -0
- package/dist/api/specs.d.ts +49 -0
- package/dist/api/specs.d.ts.map +1 -0
- package/dist/api/specs.js +136 -0
- package/dist/api/specs.js.map +1 -0
- package/dist/api/types.d.ts +176 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +9 -0
- package/dist/api/types.js.map +1 -0
- package/dist/api/verify.d.ts +20 -0
- package/dist/api/verify.d.ts.map +1 -0
- package/dist/api/verify.js +117 -0
- package/dist/api/verify.js.map +1 -0
- package/dist/cli/commands/analyze.d.ts +27 -0
- package/dist/cli/commands/analyze.d.ts.map +1 -0
- package/dist/cli/commands/analyze.js +485 -0
- package/dist/cli/commands/analyze.js.map +1 -0
- package/dist/cli/commands/drift.d.ts +9 -0
- package/dist/cli/commands/drift.d.ts.map +1 -0
- package/dist/cli/commands/drift.js +540 -0
- package/dist/cli/commands/drift.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +9 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/generate.js +633 -0
- package/dist/cli/commands/generate.js.map +1 -0
- package/dist/cli/commands/init.d.ts +9 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +171 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +638 -0
- package/dist/cli/commands/mcp.d.ts.map +1 -0
- package/dist/cli/commands/mcp.js +574 -0
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/commands/run.d.ts +24 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +546 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/verify.d.ts +9 -0
- package/dist/cli/commands/verify.d.ts.map +1 -0
- package/dist/cli/commands/verify.js +417 -0
- package/dist/cli/commands/verify.js.map +1 -0
- package/dist/cli/commands/view.d.ts +9 -0
- package/dist/cli/commands/view.d.ts.map +1 -0
- package/dist/cli/commands/view.js +511 -0
- package/dist/cli/commands/view.js.map +1 -0
- package/dist/cli/index.d.ts +9 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +83 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/analyzer/architecture-writer.d.ts +67 -0
- package/dist/core/analyzer/architecture-writer.d.ts.map +1 -0
- package/dist/core/analyzer/architecture-writer.js +209 -0
- package/dist/core/analyzer/architecture-writer.js.map +1 -0
- package/dist/core/analyzer/artifact-generator.d.ts +222 -0
- package/dist/core/analyzer/artifact-generator.d.ts.map +1 -0
- package/dist/core/analyzer/artifact-generator.js +726 -0
- package/dist/core/analyzer/artifact-generator.js.map +1 -0
- package/dist/core/analyzer/call-graph.d.ts +83 -0
- package/dist/core/analyzer/call-graph.d.ts.map +1 -0
- package/dist/core/analyzer/call-graph.js +827 -0
- package/dist/core/analyzer/call-graph.js.map +1 -0
- package/dist/core/analyzer/code-shaper.d.ts +33 -0
- package/dist/core/analyzer/code-shaper.d.ts.map +1 -0
- package/dist/core/analyzer/code-shaper.js +149 -0
- package/dist/core/analyzer/code-shaper.js.map +1 -0
- package/dist/core/analyzer/dependency-graph.d.ts +179 -0
- package/dist/core/analyzer/dependency-graph.d.ts.map +1 -0
- package/dist/core/analyzer/dependency-graph.js +574 -0
- package/dist/core/analyzer/dependency-graph.js.map +1 -0
- package/dist/core/analyzer/duplicate-detector.d.ts +52 -0
- package/dist/core/analyzer/duplicate-detector.d.ts.map +1 -0
- package/dist/core/analyzer/duplicate-detector.js +279 -0
- package/dist/core/analyzer/duplicate-detector.js.map +1 -0
- package/dist/core/analyzer/embedding-service.d.ts +50 -0
- package/dist/core/analyzer/embedding-service.d.ts.map +1 -0
- package/dist/core/analyzer/embedding-service.js +104 -0
- package/dist/core/analyzer/embedding-service.js.map +1 -0
- package/dist/core/analyzer/file-walker.d.ts +78 -0
- package/dist/core/analyzer/file-walker.d.ts.map +1 -0
- package/dist/core/analyzer/file-walker.js +531 -0
- package/dist/core/analyzer/file-walker.js.map +1 -0
- package/dist/core/analyzer/import-parser.d.ts +91 -0
- package/dist/core/analyzer/import-parser.d.ts.map +1 -0
- package/dist/core/analyzer/import-parser.js +720 -0
- package/dist/core/analyzer/import-parser.js.map +1 -0
- package/dist/core/analyzer/index.d.ts +10 -0
- package/dist/core/analyzer/index.d.ts.map +1 -0
- package/dist/core/analyzer/index.js +10 -0
- package/dist/core/analyzer/index.js.map +1 -0
- package/dist/core/analyzer/refactor-analyzer.d.ts +80 -0
- package/dist/core/analyzer/refactor-analyzer.d.ts.map +1 -0
- package/dist/core/analyzer/refactor-analyzer.js +339 -0
- package/dist/core/analyzer/refactor-analyzer.js.map +1 -0
- package/dist/core/analyzer/repository-mapper.d.ts +150 -0
- package/dist/core/analyzer/repository-mapper.d.ts.map +1 -0
- package/dist/core/analyzer/repository-mapper.js +731 -0
- package/dist/core/analyzer/repository-mapper.js.map +1 -0
- package/dist/core/analyzer/signature-extractor.d.ts +31 -0
- package/dist/core/analyzer/signature-extractor.d.ts.map +1 -0
- package/dist/core/analyzer/signature-extractor.js +387 -0
- package/dist/core/analyzer/signature-extractor.js.map +1 -0
- package/dist/core/analyzer/significance-scorer.d.ts +79 -0
- package/dist/core/analyzer/significance-scorer.d.ts.map +1 -0
- package/dist/core/analyzer/significance-scorer.js +407 -0
- package/dist/core/analyzer/significance-scorer.js.map +1 -0
- package/dist/core/analyzer/subgraph-extractor.d.ts +43 -0
- package/dist/core/analyzer/subgraph-extractor.d.ts.map +1 -0
- package/dist/core/analyzer/subgraph-extractor.js +129 -0
- package/dist/core/analyzer/subgraph-extractor.js.map +1 -0
- package/dist/core/analyzer/vector-index.d.ts +63 -0
- package/dist/core/analyzer/vector-index.d.ts.map +1 -0
- package/dist/core/analyzer/vector-index.js +169 -0
- package/dist/core/analyzer/vector-index.js.map +1 -0
- package/dist/core/drift/drift-detector.d.ts +102 -0
- package/dist/core/drift/drift-detector.d.ts.map +1 -0
- package/dist/core/drift/drift-detector.js +597 -0
- package/dist/core/drift/drift-detector.js.map +1 -0
- package/dist/core/drift/git-diff.d.ts +55 -0
- package/dist/core/drift/git-diff.d.ts.map +1 -0
- package/dist/core/drift/git-diff.js +356 -0
- package/dist/core/drift/git-diff.js.map +1 -0
- package/dist/core/drift/index.d.ts +12 -0
- package/dist/core/drift/index.d.ts.map +1 -0
- package/dist/core/drift/index.js +9 -0
- package/dist/core/drift/index.js.map +1 -0
- package/dist/core/drift/spec-mapper.d.ts +73 -0
- package/dist/core/drift/spec-mapper.d.ts.map +1 -0
- package/dist/core/drift/spec-mapper.js +353 -0
- package/dist/core/drift/spec-mapper.js.map +1 -0
- package/dist/core/generator/adr-generator.d.ts +32 -0
- package/dist/core/generator/adr-generator.d.ts.map +1 -0
- package/dist/core/generator/adr-generator.js +192 -0
- package/dist/core/generator/adr-generator.js.map +1 -0
- package/dist/core/generator/index.d.ts +9 -0
- package/dist/core/generator/index.d.ts.map +1 -0
- package/dist/core/generator/index.js +12 -0
- package/dist/core/generator/index.js.map +1 -0
- package/dist/core/generator/mapping-generator.d.ts +54 -0
- package/dist/core/generator/mapping-generator.d.ts.map +1 -0
- package/dist/core/generator/mapping-generator.js +239 -0
- package/dist/core/generator/mapping-generator.js.map +1 -0
- package/dist/core/generator/openspec-compat.d.ts +160 -0
- package/dist/core/generator/openspec-compat.d.ts.map +1 -0
- package/dist/core/generator/openspec-compat.js +523 -0
- package/dist/core/generator/openspec-compat.js.map +1 -0
- package/dist/core/generator/openspec-format-generator.d.ts +111 -0
- package/dist/core/generator/openspec-format-generator.d.ts.map +1 -0
- package/dist/core/generator/openspec-format-generator.js +817 -0
- package/dist/core/generator/openspec-format-generator.js.map +1 -0
- package/dist/core/generator/openspec-writer.d.ts +131 -0
- package/dist/core/generator/openspec-writer.d.ts.map +1 -0
- package/dist/core/generator/openspec-writer.js +379 -0
- package/dist/core/generator/openspec-writer.js.map +1 -0
- package/dist/core/generator/prompts.d.ts +35 -0
- package/dist/core/generator/prompts.d.ts.map +1 -0
- package/dist/core/generator/prompts.js +212 -0
- package/dist/core/generator/prompts.js.map +1 -0
- package/dist/core/generator/spec-pipeline.d.ts +94 -0
- package/dist/core/generator/spec-pipeline.d.ts.map +1 -0
- package/dist/core/generator/spec-pipeline.js +474 -0
- package/dist/core/generator/spec-pipeline.js.map +1 -0
- package/dist/core/generator/stages/stage1-survey.d.ts +19 -0
- package/dist/core/generator/stages/stage1-survey.d.ts.map +1 -0
- package/dist/core/generator/stages/stage1-survey.js +105 -0
- package/dist/core/generator/stages/stage1-survey.js.map +1 -0
- package/dist/core/generator/stages/stage2-entities.d.ts +11 -0
- package/dist/core/generator/stages/stage2-entities.d.ts.map +1 -0
- package/dist/core/generator/stages/stage2-entities.js +67 -0
- package/dist/core/generator/stages/stage2-entities.js.map +1 -0
- package/dist/core/generator/stages/stage3-services.d.ts +11 -0
- package/dist/core/generator/stages/stage3-services.d.ts.map +1 -0
- package/dist/core/generator/stages/stage3-services.js +75 -0
- package/dist/core/generator/stages/stage3-services.js.map +1 -0
- package/dist/core/generator/stages/stage4-api.d.ts +11 -0
- package/dist/core/generator/stages/stage4-api.d.ts.map +1 -0
- package/dist/core/generator/stages/stage4-api.js +65 -0
- package/dist/core/generator/stages/stage4-api.js.map +1 -0
- package/dist/core/generator/stages/stage5-architecture.d.ts +10 -0
- package/dist/core/generator/stages/stage5-architecture.d.ts.map +1 -0
- package/dist/core/generator/stages/stage5-architecture.js +62 -0
- package/dist/core/generator/stages/stage5-architecture.js.map +1 -0
- package/dist/core/generator/stages/stage6-adr.d.ts +8 -0
- package/dist/core/generator/stages/stage6-adr.d.ts.map +1 -0
- package/dist/core/generator/stages/stage6-adr.js +41 -0
- package/dist/core/generator/stages/stage6-adr.js.map +1 -0
- package/dist/core/services/chat-agent.d.ts +45 -0
- package/dist/core/services/chat-agent.d.ts.map +1 -0
- package/dist/core/services/chat-agent.js +310 -0
- package/dist/core/services/chat-agent.js.map +1 -0
- package/dist/core/services/chat-tools.d.ts +32 -0
- package/dist/core/services/chat-tools.d.ts.map +1 -0
- package/dist/core/services/chat-tools.js +270 -0
- package/dist/core/services/chat-tools.js.map +1 -0
- package/dist/core/services/config-manager.d.ts +61 -0
- package/dist/core/services/config-manager.d.ts.map +1 -0
- package/dist/core/services/config-manager.js +143 -0
- package/dist/core/services/config-manager.js.map +1 -0
- package/dist/core/services/gitignore-manager.d.ts +29 -0
- package/dist/core/services/gitignore-manager.d.ts.map +1 -0
- package/dist/core/services/gitignore-manager.js +106 -0
- package/dist/core/services/gitignore-manager.js.map +1 -0
- package/dist/core/services/index.d.ts +8 -0
- package/dist/core/services/index.d.ts.map +1 -0
- package/dist/core/services/index.js +8 -0
- package/dist/core/services/index.js.map +1 -0
- package/dist/core/services/llm-service.d.ts +336 -0
- package/dist/core/services/llm-service.d.ts.map +1 -0
- package/dist/core/services/llm-service.js +1155 -0
- package/dist/core/services/llm-service.js.map +1 -0
- package/dist/core/services/mcp-handlers/analysis.d.ts +42 -0
- package/dist/core/services/mcp-handlers/analysis.d.ts.map +1 -0
- package/dist/core/services/mcp-handlers/analysis.js +300 -0
- package/dist/core/services/mcp-handlers/analysis.js.map +1 -0
- package/dist/core/services/mcp-handlers/graph.d.ts +65 -0
- package/dist/core/services/mcp-handlers/graph.d.ts.map +1 -0
- package/dist/core/services/mcp-handlers/graph.js +509 -0
- package/dist/core/services/mcp-handlers/graph.js.map +1 -0
- package/dist/core/services/mcp-handlers/semantic.d.ts +38 -0
- package/dist/core/services/mcp-handlers/semantic.d.ts.map +1 -0
- package/dist/core/services/mcp-handlers/semantic.js +172 -0
- package/dist/core/services/mcp-handlers/semantic.js.map +1 -0
- package/dist/core/services/mcp-handlers/utils.d.ts +21 -0
- package/dist/core/services/mcp-handlers/utils.d.ts.map +1 -0
- package/dist/core/services/mcp-handlers/utils.js +62 -0
- package/dist/core/services/mcp-handlers/utils.js.map +1 -0
- package/dist/core/services/project-detector.d.ts +32 -0
- package/dist/core/services/project-detector.d.ts.map +1 -0
- package/dist/core/services/project-detector.js +111 -0
- package/dist/core/services/project-detector.js.map +1 -0
- package/dist/core/verifier/index.d.ts +5 -0
- package/dist/core/verifier/index.d.ts.map +1 -0
- package/dist/core/verifier/index.js +5 -0
- package/dist/core/verifier/index.js.map +1 -0
- package/dist/core/verifier/verification-engine.d.ts +226 -0
- package/dist/core/verifier/verification-engine.d.ts.map +1 -0
- package/dist/core/verifier/verification-engine.js +681 -0
- package/dist/core/verifier/verification-engine.js.map +1 -0
- package/dist/types/index.d.ts +252 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/pipeline.d.ts +148 -0
- package/dist/types/pipeline.d.ts.map +1 -0
- package/dist/types/pipeline.js +5 -0
- package/dist/types/pipeline.js.map +1 -0
- package/dist/utils/errors.d.ts +51 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +128 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +149 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +331 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/progress.d.ts +142 -0
- package/dist/utils/progress.d.ts.map +1 -0
- package/dist/utils/progress.js +280 -0
- package/dist/utils/progress.js.map +1 -0
- package/dist/utils/prompts.d.ts +53 -0
- package/dist/utils/prompts.d.ts.map +1 -0
- package/dist/utils/prompts.js +199 -0
- package/dist/utils/prompts.js.map +1 -0
- package/dist/utils/shutdown.d.ts +89 -0
- package/dist/utils/shutdown.d.ts.map +1 -0
- package/dist/utils/shutdown.js +237 -0
- package/dist/utils/shutdown.js.map +1 -0
- package/package.json +114 -0
- package/src/viewer/InteractiveGraphViewer.jsx +1486 -0
- package/src/viewer/app/index.html +17 -0
- package/src/viewer/app/main.jsx +13 -0
- package/src/viewer/components/ArchitectureView.jsx +177 -0
- package/src/viewer/components/ChatPanel.jsx +448 -0
- package/src/viewer/components/ClusterGraph.jsx +441 -0
- package/src/viewer/components/FilterBar.jsx +179 -0
- package/src/viewer/components/FlatGraph.jsx +275 -0
- package/src/viewer/components/MicroComponents.jsx +83 -0
- package/src/viewer/hooks/usePanZoom.js +79 -0
- package/src/viewer/utils/constants.js +47 -0
- package/src/viewer/utils/graph-helpers.js +291 -0
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Service
|
|
3
|
+
*
|
|
4
|
+
* Provides a clean interface for LLM interactions with proper error handling,
|
|
5
|
+
* retry logic, token management, and cost tracking.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Claude Code CLI provider
|
|
9
|
+
*
|
|
10
|
+
* Routes LLM calls through the local `claude` CLI binary in non-interactive
|
|
11
|
+
* mode (`claude -p ...`). Authentication is handled by the Claude Code session
|
|
12
|
+
* (Max/Pro subscription) — no ANTHROPIC_API_KEY is required.
|
|
13
|
+
*/
|
|
14
|
+
export declare class ClaudeCodeProvider implements LLMProvider {
|
|
15
|
+
name: string;
|
|
16
|
+
maxContextTokens: number;
|
|
17
|
+
maxOutputTokens: number;
|
|
18
|
+
private model;
|
|
19
|
+
constructor(model?: string);
|
|
20
|
+
generateCompletion(request: CompletionRequest): Promise<CompletionResponse>;
|
|
21
|
+
countTokens(text: string): number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Mistral Vibe CLI provider
|
|
25
|
+
*
|
|
26
|
+
* Routes LLM calls through the local `mistral-vibe` CLI binary (standalone, no npm).
|
|
27
|
+
* No API key required — uses local LLM execution.
|
|
28
|
+
* If the binary is not on PATH, set MISTRAL_VIBE_CLI to its full path.
|
|
29
|
+
* The CLI is invoked as `vibe` (not `mistral-vibe`).
|
|
30
|
+
*/
|
|
31
|
+
export declare class MistralVibeProvider implements LLMProvider {
|
|
32
|
+
name: string;
|
|
33
|
+
maxContextTokens: number;
|
|
34
|
+
maxOutputTokens: number;
|
|
35
|
+
private model;
|
|
36
|
+
constructor(model?: string);
|
|
37
|
+
generateCompletion(request: CompletionRequest): Promise<CompletionResponse>;
|
|
38
|
+
countTokens(text: string): number;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Completion request parameters
|
|
42
|
+
*/
|
|
43
|
+
export interface CompletionRequest {
|
|
44
|
+
systemPrompt: string;
|
|
45
|
+
userPrompt: string;
|
|
46
|
+
temperature?: number;
|
|
47
|
+
maxTokens?: number;
|
|
48
|
+
stopSequences?: string[];
|
|
49
|
+
responseFormat?: 'text' | 'json';
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Completion response
|
|
53
|
+
*/
|
|
54
|
+
export interface CompletionResponse {
|
|
55
|
+
content: string;
|
|
56
|
+
usage: {
|
|
57
|
+
inputTokens: number;
|
|
58
|
+
outputTokens: number;
|
|
59
|
+
totalTokens: number;
|
|
60
|
+
};
|
|
61
|
+
model: string;
|
|
62
|
+
finishReason: 'stop' | 'length' | 'error';
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* LLM provider interface
|
|
66
|
+
*/
|
|
67
|
+
export interface LLMProvider {
|
|
68
|
+
name: string;
|
|
69
|
+
generateCompletion(request: CompletionRequest): Promise<CompletionResponse>;
|
|
70
|
+
countTokens(text: string): number;
|
|
71
|
+
maxContextTokens: number;
|
|
72
|
+
maxOutputTokens: number;
|
|
73
|
+
}
|
|
74
|
+
export type ProviderName = 'anthropic' | 'openai' | 'openai-compat' | 'gemini' | 'gemini-cli' | 'claude-code' | 'mistral-vibe';
|
|
75
|
+
/**
|
|
76
|
+
* Token usage tracking
|
|
77
|
+
*/
|
|
78
|
+
export interface TokenUsage {
|
|
79
|
+
inputTokens: number;
|
|
80
|
+
outputTokens: number;
|
|
81
|
+
totalTokens: number;
|
|
82
|
+
requests: number;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Cost tracking
|
|
86
|
+
*/
|
|
87
|
+
export interface CostTracking {
|
|
88
|
+
estimatedCost: number;
|
|
89
|
+
currency: string;
|
|
90
|
+
byProvider: Record<string, number>;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* LLM service options
|
|
94
|
+
*/
|
|
95
|
+
export interface LLMServiceOptions {
|
|
96
|
+
/** Primary provider to use */
|
|
97
|
+
provider?: ProviderName;
|
|
98
|
+
/** Model override */
|
|
99
|
+
model?: string;
|
|
100
|
+
/** Custom API base URL (e.g., for local/enterprise OpenAI-compatible servers) */
|
|
101
|
+
apiBase?: string;
|
|
102
|
+
/** Disable SSL verification (for internal/self-signed certificates) */
|
|
103
|
+
sslVerify?: boolean;
|
|
104
|
+
/** Base URL for openai-compat provider (overrides OPENAI_COMPAT_BASE_URL env var) */
|
|
105
|
+
openaiCompatBaseUrl?: string;
|
|
106
|
+
/** Maximum retry attempts */
|
|
107
|
+
maxRetries?: number;
|
|
108
|
+
/** Initial retry delay in ms */
|
|
109
|
+
initialDelay?: number;
|
|
110
|
+
/** Maximum retry delay in ms */
|
|
111
|
+
maxDelay?: number;
|
|
112
|
+
/** Request timeout in ms */
|
|
113
|
+
timeout?: number;
|
|
114
|
+
/** Cost warning threshold in USD */
|
|
115
|
+
costWarningThreshold?: number;
|
|
116
|
+
/** Log directory for prompts/responses */
|
|
117
|
+
logDir?: string;
|
|
118
|
+
/** Enable prompt logging */
|
|
119
|
+
enableLogging?: boolean;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Parse the number of milliseconds to wait before retrying a 429 response.
|
|
123
|
+
*
|
|
124
|
+
* Checks (in order):
|
|
125
|
+
* 1. Standard `Retry-After` HTTP header (seconds as integer, or HTTP-date)
|
|
126
|
+
* 2. `Limit resets at: YYYY-MM-DD HH:MM:SS UTC` in the response body
|
|
127
|
+
*
|
|
128
|
+
* Returns `undefined` when nothing useful is found so the caller can fall back
|
|
129
|
+
* to its own exponential-backoff delay.
|
|
130
|
+
*/
|
|
131
|
+
export declare function parseRetryAfterMs(body: string, retryAfterHeader?: string | null): number | undefined;
|
|
132
|
+
/**
|
|
133
|
+
* Exported for use in pre-flight cost estimation.
|
|
134
|
+
* Look up pricing for a model ID using prefix/family matching.
|
|
135
|
+
* Exact match first, then longest prefix match, then provider default.
|
|
136
|
+
*
|
|
137
|
+
* This is robust to minor version suffixes like "claude-sonnet-4-6-20251120"
|
|
138
|
+
* matching the "claude-sonnet-4" family entry.
|
|
139
|
+
*/
|
|
140
|
+
export declare function lookupPricing(providerName: string, modelId: string): {
|
|
141
|
+
input: number;
|
|
142
|
+
output: number;
|
|
143
|
+
};
|
|
144
|
+
/**
|
|
145
|
+
* Estimate token count from text (rough approximation)
|
|
146
|
+
* ~4 characters per token for English text
|
|
147
|
+
*/
|
|
148
|
+
export declare function estimateTokens(text: string): number;
|
|
149
|
+
/**
|
|
150
|
+
* Anthropic Claude provider
|
|
151
|
+
*/
|
|
152
|
+
export declare class AnthropicProvider implements LLMProvider {
|
|
153
|
+
name: string;
|
|
154
|
+
maxContextTokens: number;
|
|
155
|
+
maxOutputTokens: number;
|
|
156
|
+
private apiKey;
|
|
157
|
+
private model;
|
|
158
|
+
private baseUrl;
|
|
159
|
+
constructor(apiKey: string, model?: string, baseUrl?: string, sslVerify?: boolean);
|
|
160
|
+
countTokens(text: string): number;
|
|
161
|
+
generateCompletion(request: CompletionRequest): Promise<CompletionResponse>;
|
|
162
|
+
private parseError;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* OpenAI provider
|
|
166
|
+
*/
|
|
167
|
+
export declare class OpenAIProvider implements LLMProvider {
|
|
168
|
+
name: string;
|
|
169
|
+
maxContextTokens: number;
|
|
170
|
+
maxOutputTokens: number;
|
|
171
|
+
private apiKey;
|
|
172
|
+
private model;
|
|
173
|
+
private baseUrl;
|
|
174
|
+
constructor(apiKey: string, model?: string, baseUrl?: string, sslVerify?: boolean);
|
|
175
|
+
countTokens(text: string): number;
|
|
176
|
+
generateCompletion(request: CompletionRequest): Promise<CompletionResponse>;
|
|
177
|
+
private parseError;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Generic OpenAI-compatible provider.
|
|
181
|
+
* Works with any API that implements the OpenAI chat completions format:
|
|
182
|
+
* Mistral AI, Groq, Together AI, Ollama, LM Studio, etc.
|
|
183
|
+
*
|
|
184
|
+
* Required env vars:
|
|
185
|
+
* OPENAI_COMPAT_API_KEY — API key (use "ollama" for local setups without auth)
|
|
186
|
+
* OPENAI_COMPAT_BASE_URL — Base URL, e.g. https://api.mistral.ai/v1
|
|
187
|
+
*/
|
|
188
|
+
export declare class OpenAICompatibleProvider implements LLMProvider {
|
|
189
|
+
name: string;
|
|
190
|
+
maxContextTokens: number;
|
|
191
|
+
maxOutputTokens: number;
|
|
192
|
+
private apiKey;
|
|
193
|
+
private model;
|
|
194
|
+
private baseUrl;
|
|
195
|
+
constructor(apiKey: string, baseUrl: string, model?: string);
|
|
196
|
+
countTokens(text: string): number;
|
|
197
|
+
generateCompletion(request: CompletionRequest): Promise<CompletionResponse>;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Gemini CLI provider
|
|
201
|
+
*
|
|
202
|
+
* Routes LLM calls through the local `gemini` CLI binary in non-interactive
|
|
203
|
+
* mode (`gemini -p ...`). Authentication is handled by the Google account
|
|
204
|
+
* session — no GEMINI_API_KEY is required.
|
|
205
|
+
* If the binary is not on PATH, set GEMINI_CLI to its full path.
|
|
206
|
+
*/
|
|
207
|
+
export declare class GeminiCLIProvider implements LLMProvider {
|
|
208
|
+
name: string;
|
|
209
|
+
maxContextTokens: number;
|
|
210
|
+
maxOutputTokens: number;
|
|
211
|
+
private model;
|
|
212
|
+
constructor(model?: string);
|
|
213
|
+
generateCompletion(request: CompletionRequest): Promise<CompletionResponse>;
|
|
214
|
+
countTokens(text: string): number;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Google Gemini provider
|
|
218
|
+
*/
|
|
219
|
+
export declare class GeminiProvider implements LLMProvider {
|
|
220
|
+
name: string;
|
|
221
|
+
maxContextTokens: number;
|
|
222
|
+
maxOutputTokens: number;
|
|
223
|
+
private apiKey;
|
|
224
|
+
private model;
|
|
225
|
+
private baseUrl;
|
|
226
|
+
constructor(apiKey: string, model?: string);
|
|
227
|
+
countTokens(text: string): number;
|
|
228
|
+
generateCompletion(request: CompletionRequest): Promise<CompletionResponse>;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Mock provider for testing
|
|
232
|
+
*/
|
|
233
|
+
export declare class MockLLMProvider implements LLMProvider {
|
|
234
|
+
name: string;
|
|
235
|
+
maxContextTokens: number;
|
|
236
|
+
maxOutputTokens: number;
|
|
237
|
+
private responses;
|
|
238
|
+
private defaultResponse;
|
|
239
|
+
callHistory: CompletionRequest[];
|
|
240
|
+
shouldFail: boolean;
|
|
241
|
+
failCount: number;
|
|
242
|
+
private currentFailCount;
|
|
243
|
+
setResponse(promptContains: string, response: string): void;
|
|
244
|
+
setDefaultResponse(response: string): void;
|
|
245
|
+
countTokens(text: string): number;
|
|
246
|
+
generateCompletion(request: CompletionRequest): Promise<CompletionResponse>;
|
|
247
|
+
reset(): void;
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* LLM Service - main interface for LLM interactions
|
|
251
|
+
*/
|
|
252
|
+
export declare class LLMService {
|
|
253
|
+
private provider;
|
|
254
|
+
private retryConfig;
|
|
255
|
+
private options;
|
|
256
|
+
private tokenUsage;
|
|
257
|
+
private costTracking;
|
|
258
|
+
private requestLog;
|
|
259
|
+
constructor(provider: LLMProvider, options?: LLMServiceOptions);
|
|
260
|
+
/**
|
|
261
|
+
* Get the provider name
|
|
262
|
+
*/
|
|
263
|
+
getProviderName(): string;
|
|
264
|
+
/**
|
|
265
|
+
* Get maximum context tokens for the provider
|
|
266
|
+
*/
|
|
267
|
+
getMaxContextTokens(): number;
|
|
268
|
+
/**
|
|
269
|
+
* Count tokens in text
|
|
270
|
+
*/
|
|
271
|
+
countTokens(text: string): number;
|
|
272
|
+
/**
|
|
273
|
+
* Get current token usage
|
|
274
|
+
*/
|
|
275
|
+
getTokenUsage(): TokenUsage;
|
|
276
|
+
/**
|
|
277
|
+
* Get current cost tracking
|
|
278
|
+
*/
|
|
279
|
+
getCostTracking(): CostTracking;
|
|
280
|
+
/**
|
|
281
|
+
* Reset usage tracking
|
|
282
|
+
*/
|
|
283
|
+
resetTracking(): void;
|
|
284
|
+
/**
|
|
285
|
+
* Generate a completion with retry logic
|
|
286
|
+
*/
|
|
287
|
+
complete(request: CompletionRequest): Promise<CompletionResponse>;
|
|
288
|
+
/**
|
|
289
|
+
* Generate a completion expecting JSON response
|
|
290
|
+
*/
|
|
291
|
+
completeJSON<T>(request: CompletionRequest, schema?: object): Promise<T>;
|
|
292
|
+
/**
|
|
293
|
+
* Execute request with timeout
|
|
294
|
+
*/
|
|
295
|
+
private executeWithTimeout;
|
|
296
|
+
/**
|
|
297
|
+
* Update tracking after a successful request
|
|
298
|
+
*/
|
|
299
|
+
private updateTracking;
|
|
300
|
+
/**
|
|
301
|
+
* Calculate cost for a response
|
|
302
|
+
*/
|
|
303
|
+
private calculateCost;
|
|
304
|
+
/**
|
|
305
|
+
* Log request/response
|
|
306
|
+
*/
|
|
307
|
+
private logRequest;
|
|
308
|
+
/**
|
|
309
|
+
* Redact potential secrets from request
|
|
310
|
+
*/
|
|
311
|
+
private redactSecrets;
|
|
312
|
+
/**
|
|
313
|
+
* Simple schema validation
|
|
314
|
+
*/
|
|
315
|
+
private validateSchema;
|
|
316
|
+
/**
|
|
317
|
+
* Save logs to disk
|
|
318
|
+
*/
|
|
319
|
+
saveLogs(): Promise<void>;
|
|
320
|
+
/**
|
|
321
|
+
* Sleep helper
|
|
322
|
+
*/
|
|
323
|
+
private sleep;
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Create an LLM service with the specified provider
|
|
327
|
+
*/
|
|
328
|
+
export declare function createLLMService(options?: LLMServiceOptions): LLMService;
|
|
329
|
+
/**
|
|
330
|
+
* Create an LLM service with a mock provider (for testing)
|
|
331
|
+
*/
|
|
332
|
+
export declare function createMockLLMService(options?: LLMServiceOptions): {
|
|
333
|
+
service: LLMService;
|
|
334
|
+
provider: MockLLMProvider;
|
|
335
|
+
};
|
|
336
|
+
//# sourceMappingURL=llm-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-service.d.ts","sourceRoot":"","sources":["../../../src/core/services/llm-service.ts"],"names":[],"mappings":"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"}
|