@getvibeguard/cli 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/README.md +166 -0
  2. package/dashboard/dist/assets/Tableau10-B-NsZVaP.js +1 -0
  3. package/dashboard/dist/assets/arc-CZ1oDkm-.js +1 -0
  4. package/dashboard/dist/assets/array-BKyUJesY.js +1 -0
  5. package/dashboard/dist/assets/blockDiagram-c4efeb88-BLITAZDl.js +118 -0
  6. package/dashboard/dist/assets/c4Diagram-c83219d4-DErNj891.js +10 -0
  7. package/dashboard/dist/assets/channel-sWBGOq9p.js +1 -0
  8. package/dashboard/dist/assets/classDiagram-beda092f-Bj8IB6RW.js +2 -0
  9. package/dashboard/dist/assets/classDiagram-v2-2358418a-BZtd2g5W.js +2 -0
  10. package/dashboard/dist/assets/clone-DtEyH3ya.js +1 -0
  11. package/dashboard/dist/assets/createText-1719965b-DkNrTk-5.js +7 -0
  12. package/dashboard/dist/assets/edges-96097737-CYxl0j3g.js +4 -0
  13. package/dashboard/dist/assets/erDiagram-0228fc6a-ClEp9Atg.js +51 -0
  14. package/dashboard/dist/assets/flowDb-c6c81e3f-ClDJCJwu.js +10 -0
  15. package/dashboard/dist/assets/flowDiagram-50d868cf-DYxwClWS.js +4 -0
  16. package/dashboard/dist/assets/flowDiagram-v2-4f6560a1-D7vEnO1T.js +1 -0
  17. package/dashboard/dist/assets/flowchart-elk-definition-6af322e1-C-wX1mNx.js +139 -0
  18. package/dashboard/dist/assets/ganttDiagram-a2739b55-DTeLavAj.js +257 -0
  19. package/dashboard/dist/assets/gitGraphDiagram-82fe8481-ClxNoYya.js +70 -0
  20. package/dashboard/dist/assets/graph-CT-F3Got.js +1 -0
  21. package/dashboard/dist/assets/index-5325376f-C-jTCYZA.js +1 -0
  22. package/dashboard/dist/assets/index-CvYvquQR.js +283 -0
  23. package/dashboard/dist/assets/index-n43poL1x.css +1 -0
  24. package/dashboard/dist/assets/infoDiagram-8eee0895-Zljudo5L.js +7 -0
  25. package/dashboard/dist/assets/init-Gi6I4Gst.js +1 -0
  26. package/dashboard/dist/assets/journeyDiagram-c64418c1-DXzTbuum.js +139 -0
  27. package/dashboard/dist/assets/katex-Cu_Erd72.js +261 -0
  28. package/dashboard/dist/assets/layout-CVO3EizT.js +1 -0
  29. package/dashboard/dist/assets/line-CIgln-0z.js +1 -0
  30. package/dashboard/dist/assets/linear-bmIUMQqg.js +1 -0
  31. package/dashboard/dist/assets/mindmap-definition-8da855dc-BDLTNZYk.js +425 -0
  32. package/dashboard/dist/assets/ordinal-Cboi1Yqb.js +1 -0
  33. package/dashboard/dist/assets/path-CbwjOpE9.js +1 -0
  34. package/dashboard/dist/assets/pieDiagram-a8764435-DtcOKNPc.js +35 -0
  35. package/dashboard/dist/assets/quadrantDiagram-1e28029f-zoSI_Ltf.js +7 -0
  36. package/dashboard/dist/assets/requirementDiagram-08caed73-TsQZ9lTB.js +52 -0
  37. package/dashboard/dist/assets/sankeyDiagram-a04cb91d-DE5ciDwD.js +8 -0
  38. package/dashboard/dist/assets/sequenceDiagram-c5b8d532-DhabPb2n.js +122 -0
  39. package/dashboard/dist/assets/stateDiagram-1ecb1508-Bg2q_YNx.js +1 -0
  40. package/dashboard/dist/assets/stateDiagram-v2-c2b004d7-Bs5iRjYB.js +1 -0
  41. package/dashboard/dist/assets/styles-b4e223ce-DchmAmav.js +160 -0
  42. package/dashboard/dist/assets/styles-ca3715f6-Bu5zjaDx.js +207 -0
  43. package/dashboard/dist/assets/styles-d45a18b0-jCaD8baR.js +116 -0
  44. package/dashboard/dist/assets/svgDrawCommon-b86b1483-BrYVGY4c.js +1 -0
  45. package/dashboard/dist/assets/timeline-definition-faaaa080--sq0bTHe.js +61 -0
  46. package/dashboard/dist/assets/xychartDiagram-f5964ef8-ByvzN0uj.js +7 -0
  47. package/dashboard/dist/index.html +22 -0
  48. package/dist/cli.d.ts +4 -0
  49. package/dist/cli.d.ts.map +1 -0
  50. package/dist/cli.js +641 -0
  51. package/dist/cli.js.map +1 -0
  52. package/dist/commands/dashboard.d.ts +2 -0
  53. package/dist/commands/dashboard.d.ts.map +1 -0
  54. package/dist/commands/dashboard.js +184 -0
  55. package/dist/commands/dashboard.js.map +1 -0
  56. package/dist/commands/init.d.ts +5 -0
  57. package/dist/commands/init.d.ts.map +1 -0
  58. package/dist/commands/init.js +501 -0
  59. package/dist/commands/init.js.map +1 -0
  60. package/dist/index.d.ts +3 -0
  61. package/dist/index.d.ts.map +1 -0
  62. package/dist/index.js +602 -0
  63. package/dist/index.js.map +1 -0
  64. package/dist/librarian/autofix.d.ts +34 -0
  65. package/dist/librarian/autofix.d.ts.map +1 -0
  66. package/dist/librarian/autofix.js +369 -0
  67. package/dist/librarian/autofix.js.map +1 -0
  68. package/dist/librarian/heartbeat.d.ts +38 -0
  69. package/dist/librarian/heartbeat.d.ts.map +1 -0
  70. package/dist/librarian/heartbeat.js +98 -0
  71. package/dist/librarian/heartbeat.js.map +1 -0
  72. package/dist/librarian/initializer.d.ts +41 -0
  73. package/dist/librarian/initializer.d.ts.map +1 -0
  74. package/dist/librarian/initializer.js +202 -0
  75. package/dist/librarian/initializer.js.map +1 -0
  76. package/dist/librarian/memory-manager.d.ts +37 -0
  77. package/dist/librarian/memory-manager.d.ts.map +1 -0
  78. package/dist/librarian/memory-manager.js +205 -0
  79. package/dist/librarian/memory-manager.js.map +1 -0
  80. package/dist/librarian/oracle.d.ts +51 -0
  81. package/dist/librarian/oracle.d.ts.map +1 -0
  82. package/dist/librarian/oracle.js +235 -0
  83. package/dist/librarian/oracle.js.map +1 -0
  84. package/dist/librarian/summarizer.d.ts +19 -0
  85. package/dist/librarian/summarizer.d.ts.map +1 -0
  86. package/dist/librarian/summarizer.js +175 -0
  87. package/dist/librarian/summarizer.js.map +1 -0
  88. package/dist/librarian/watcher.d.ts +51 -0
  89. package/dist/librarian/watcher.d.ts.map +1 -0
  90. package/dist/librarian/watcher.js +189 -0
  91. package/dist/librarian/watcher.js.map +1 -0
  92. package/dist/mcp-server.d.ts +10 -0
  93. package/dist/mcp-server.d.ts.map +1 -0
  94. package/dist/mcp-server.js +879 -0
  95. package/dist/mcp-server.js.map +1 -0
  96. package/dist/services/token-tracker.d.ts +58 -0
  97. package/dist/services/token-tracker.d.ts.map +1 -0
  98. package/dist/services/token-tracker.js +178 -0
  99. package/dist/services/token-tracker.js.map +1 -0
  100. package/dist/utils/chunker.d.ts +5 -0
  101. package/dist/utils/chunker.d.ts.map +1 -0
  102. package/dist/utils/chunker.js +121 -0
  103. package/dist/utils/chunker.js.map +1 -0
  104. package/dist/utils/config-manager.d.ts +65 -0
  105. package/dist/utils/config-manager.d.ts.map +1 -0
  106. package/dist/utils/config-manager.js +243 -0
  107. package/dist/utils/config-manager.js.map +1 -0
  108. package/dist/utils/config.d.ts +46 -0
  109. package/dist/utils/config.d.ts.map +1 -0
  110. package/dist/utils/config.js +171 -0
  111. package/dist/utils/config.js.map +1 -0
  112. package/dist/utils/diff-cleaner.d.ts +13 -0
  113. package/dist/utils/diff-cleaner.d.ts.map +1 -0
  114. package/dist/utils/diff-cleaner.js +80 -0
  115. package/dist/utils/diff-cleaner.js.map +1 -0
  116. package/dist/utils/git.d.ts +71 -0
  117. package/dist/utils/git.d.ts.map +1 -0
  118. package/dist/utils/git.js +285 -0
  119. package/dist/utils/git.js.map +1 -0
  120. package/dist/utils/llm.d.ts +30 -0
  121. package/dist/utils/llm.d.ts.map +1 -0
  122. package/dist/utils/llm.js +308 -0
  123. package/dist/utils/llm.js.map +1 -0
  124. package/dist/utils/pricing.d.ts +47 -0
  125. package/dist/utils/pricing.d.ts.map +1 -0
  126. package/dist/utils/pricing.js +171 -0
  127. package/dist/utils/pricing.js.map +1 -0
  128. package/package.json +45 -0
@@ -0,0 +1,285 @@
1
+ import { simpleGit } from 'simple-git';
2
+ import * as fs from 'fs/promises';
3
+ import * as path from 'path';
4
+ export class GitUtils {
5
+ git;
6
+ repoPath;
7
+ constructor(repoPath = process.cwd()) {
8
+ this.repoPath = repoPath;
9
+ this.git = simpleGit(repoPath);
10
+ }
11
+ /**
12
+ * Get the latest N commits
13
+ */
14
+ async getLatestCommits(count) {
15
+ const log = await this.git.log({ maxCount: count });
16
+ return [...log.all]; // Convert readonly array to mutable array
17
+ }
18
+ /**
19
+ * Get the diff for a specific commit
20
+ */
21
+ async getCommitDiff(commitHash) {
22
+ try {
23
+ const diff = await this.git.show([commitHash, '--format=']);
24
+ return diff;
25
+ }
26
+ catch (error) {
27
+ throw new Error(`Failed to get diff for commit ${commitHash}: ${error}`);
28
+ }
29
+ }
30
+ /**
31
+ * Get the diff between the last two commits (HEAD~1 and HEAD)
32
+ * This ensures we see the actual content of the most recent commit
33
+ */
34
+ async getLatestCommitDiff() {
35
+ try {
36
+ const diff = await this.git.diff(['HEAD~1', 'HEAD']);
37
+ return diff;
38
+ }
39
+ catch (error) {
40
+ // If there's only one commit, return empty diff
41
+ if (error.message?.includes('HEAD~1') || error.message?.includes('ambiguous argument')) {
42
+ return '';
43
+ }
44
+ throw new Error(`Failed to get latest commit diff: ${error.message || error}`);
45
+ }
46
+ }
47
+ /**
48
+ * Get diff for a range of commits (from commit hash to HEAD)
49
+ * This handles cases where multiple commits happened and need to be processed together
50
+ */
51
+ async getCommitRangeDiff(fromCommit, toCommit) {
52
+ try {
53
+ // Use .. syntax for range diff
54
+ const diff = await this.git.diff([`${fromCommit}..${toCommit}`]);
55
+ return diff;
56
+ }
57
+ catch (error) {
58
+ throw new Error(`Failed to get commit range diff from ${fromCommit} to ${toCommit}: ${error.message || error}`);
59
+ }
60
+ }
61
+ /**
62
+ * Get unstaged changes (working directory diff)
63
+ */
64
+ async getUnstagedDiff() {
65
+ try {
66
+ const diff = await this.git.diff();
67
+ return diff;
68
+ }
69
+ catch (error) {
70
+ throw new Error(`Failed to get unstaged diff: ${error.message || error}`);
71
+ }
72
+ }
73
+ /**
74
+ * Get oneline log (last N commits or since date)
75
+ */
76
+ async getOnelineLog(limit, since) {
77
+ try {
78
+ const options = {
79
+ maxCount: limit,
80
+ format: { hash: '%H', date: '%ai', message: '%s' }
81
+ };
82
+ // Use --since with proper double-dash format
83
+ if (since) {
84
+ // simple-git should handle this, but we'll use raw command to ensure proper formatting
85
+ const logResult = await this.git.raw([
86
+ 'log',
87
+ `--since=${since}`,
88
+ `-n${limit}`,
89
+ '--format=%H|%ai|%s'
90
+ ]);
91
+ if (!logResult || logResult.trim().length === 0) {
92
+ return [];
93
+ }
94
+ // Parse the raw output
95
+ const lines = logResult.trim().split('\n');
96
+ return lines.map(line => {
97
+ const [hash, date, ...messageParts] = line.split('|');
98
+ return {
99
+ hash: hash || '',
100
+ date: date || '',
101
+ message: messageParts.join('|') || '',
102
+ };
103
+ });
104
+ }
105
+ else {
106
+ // No since date, use simple-git's log method
107
+ const log = await this.git.log(options);
108
+ return log.all.map(commit => ({
109
+ hash: commit.hash,
110
+ message: commit.message,
111
+ date: commit.date,
112
+ }));
113
+ }
114
+ }
115
+ catch (error) {
116
+ // Handle brand new repositories or repositories with no commits
117
+ if (error.message?.includes('does not have any commits yet') ||
118
+ error.message?.includes('not a git repository') ||
119
+ error.message?.includes('ambiguous argument') ||
120
+ error.message?.includes('bad revision')) {
121
+ console.warn('No Git history found or repository is brand new. Skipping commit history analysis.');
122
+ return [];
123
+ }
124
+ // Re-throw other errors
125
+ throw new Error(`Failed to get oneline log: ${error.message || error}`);
126
+ }
127
+ }
128
+ /**
129
+ * Get current HEAD commit hash
130
+ */
131
+ async getHeadCommit() {
132
+ const log = await this.git.log({ maxCount: 1 });
133
+ if (log.latest) {
134
+ return log.latest.hash;
135
+ }
136
+ throw new Error('No commits found in repository');
137
+ }
138
+ /**
139
+ * Get current branch name
140
+ */
141
+ async getCurrentBranch() {
142
+ try {
143
+ const branchSummary = await this.git.branch();
144
+ return branchSummary.current || 'main';
145
+ }
146
+ catch (error) {
147
+ // Fallback: try to read .git/HEAD directly
148
+ try {
149
+ const headPath = path.join(this.repoPath, '.git', 'HEAD');
150
+ const headContent = await fs.readFile(headPath, 'utf-8');
151
+ const match = headContent.match(/ref:\s+refs\/heads\/(.+)/);
152
+ if (match && match[1]) {
153
+ return match[1].trim();
154
+ }
155
+ }
156
+ catch {
157
+ // If all else fails, default to 'main'
158
+ }
159
+ return 'main';
160
+ }
161
+ }
162
+ /**
163
+ * Get file structure as a tree-like string
164
+ */
165
+ async getFileStructure() {
166
+ const files = [];
167
+ async function walkDir(dir, prefix = '', depth = 0) {
168
+ if (depth > 5)
169
+ return; // Limit depth to avoid huge trees
170
+ try {
171
+ const entries = await fs.readdir(dir, { withFileTypes: true });
172
+ // Filter out common ignore patterns
173
+ const filtered = entries.filter(entry => {
174
+ const name = entry.name;
175
+ return !name.startsWith('.') &&
176
+ name !== 'node_modules' &&
177
+ name !== 'dist' &&
178
+ name !== 'build' &&
179
+ name !== '.next' &&
180
+ name !== 'out';
181
+ });
182
+ for (let i = 0; i < filtered.length; i++) {
183
+ const entry = filtered[i];
184
+ const isLast = i === filtered.length - 1;
185
+ const currentPrefix = isLast ? '└── ' : '├── ';
186
+ const nextPrefix = isLast ? ' ' : '│ ';
187
+ files.push(prefix + currentPrefix + entry.name);
188
+ if (entry.isDirectory()) {
189
+ const fullPath = path.join(dir, entry.name);
190
+ await walkDir(fullPath, prefix + nextPrefix, depth + 1);
191
+ }
192
+ }
193
+ }
194
+ catch (error) {
195
+ // Ignore permission errors
196
+ }
197
+ }
198
+ await walkDir(this.repoPath);
199
+ return files.join('\n');
200
+ }
201
+ /**
202
+ * Check if a file is in .gitignore
203
+ */
204
+ async isInGitignore(filePath) {
205
+ try {
206
+ const gitignorePath = path.join(this.repoPath, '.gitignore');
207
+ const content = await fs.readFile(gitignorePath, 'utf-8');
208
+ const lines = content.split('\n').map(line => line.trim());
209
+ // Simple check - see if file path matches any pattern
210
+ const relativePath = path.relative(this.repoPath, filePath).replace(/\\/g, '/');
211
+ for (const line of lines) {
212
+ if (!line || line.startsWith('#'))
213
+ continue;
214
+ // Simple pattern matching (basic implementation)
215
+ const pattern = line.replace(/^\//, ''); // Remove leading slash
216
+ if (relativePath === pattern || relativePath.includes(pattern)) {
217
+ return true;
218
+ }
219
+ }
220
+ return false;
221
+ }
222
+ catch (error) {
223
+ // .gitignore doesn't exist or can't be read
224
+ return false;
225
+ }
226
+ }
227
+ /**
228
+ * Remove a file pattern from .gitignore
229
+ */
230
+ async removeFromGitignore(filePath) {
231
+ try {
232
+ const gitignorePath = path.join(this.repoPath, '.gitignore');
233
+ const content = await fs.readFile(gitignorePath, 'utf-8');
234
+ const lines = content.split('\n');
235
+ const relativePath = path.relative(this.repoPath, filePath).replace(/\\/g, '/');
236
+ const filtered = lines.filter(line => {
237
+ const trimmed = line.trim();
238
+ if (!trimmed || trimmed.startsWith('#'))
239
+ return true;
240
+ return trimmed !== relativePath && !trimmed.includes(relativePath);
241
+ });
242
+ await fs.writeFile(gitignorePath, filtered.join('\n'), 'utf-8');
243
+ }
244
+ catch (error) {
245
+ // .gitignore doesn't exist - that's fine, file isn't ignored
246
+ }
247
+ }
248
+ /**
249
+ * Stage a file
250
+ * Automatically removes the file from .gitignore if it's currently ignored
251
+ */
252
+ async stageFile(filePath) {
253
+ const relativePath = path.relative(this.repoPath, filePath).replace(/\\/g, '/');
254
+ // Check if file is in .gitignore and remove it if needed
255
+ const isIgnored = await this.isInGitignore(filePath);
256
+ if (isIgnored) {
257
+ await this.removeFromGitignore(filePath);
258
+ }
259
+ await this.git.add(relativePath);
260
+ }
261
+ /**
262
+ * Check if content has Git conflict markers
263
+ */
264
+ hasConflictMarkers(content) {
265
+ return /^<<<<<<< |^=======$|^>>>>>>> /m.test(content);
266
+ }
267
+ /**
268
+ * Read README.md if it exists
269
+ */
270
+ async readReadme() {
271
+ const readmePaths = ['README.md', 'readme.md', 'README.txt', 'readme.txt'];
272
+ for (const readmePath of readmePaths) {
273
+ try {
274
+ const fullPath = path.join(this.repoPath, readmePath);
275
+ const content = await fs.readFile(fullPath, 'utf-8');
276
+ return content;
277
+ }
278
+ catch (error) {
279
+ // File doesn't exist, try next
280
+ }
281
+ }
282
+ return null;
283
+ }
284
+ }
285
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { LLMProvider } from './config-manager.js';
2
+ import { Feature } from '../services/token-tracker.js';
3
+ export interface LLMOptions {
4
+ maxTokens?: number;
5
+ thinkingLevel?: 'flash' | 'pro';
6
+ temperature?: number;
7
+ feature?: Feature;
8
+ }
9
+ export interface TokenUsage {
10
+ model: string;
11
+ provider: LLMProvider;
12
+ inputTokens: number;
13
+ outputTokens: number;
14
+ timestamp: string;
15
+ cost?: number;
16
+ }
17
+ /**
18
+ * Estimate token count (rough approximation: ~4 characters per token)
19
+ */
20
+ export declare function estimateTokens(text: string): number;
21
+ /**
22
+ * Generate summary with retry logic (Provider-Agnostic)
23
+ */
24
+ export declare function generateSummary(prompt: string, systemPrompt: string, options?: LLMOptions): Promise<string>;
25
+ /**
26
+ * Get token usage history (legacy support)
27
+ * @deprecated Use TokenTracker.getUsageLogs() instead
28
+ */
29
+ export declare function getTokenUsageHistory(): Promise<TokenUsage[]>;
30
+ //# sourceMappingURL=llm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../src/utils/llm.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,WAAW,EAAgB,MAAM,qBAAqB,CAAC;AAE/E,OAAO,EAAgB,OAAO,EAAE,MAAM,8BAA8B,CAAC;AAErE,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAGD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,WAAW,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAYD;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAInD;AA2QD;;GAEG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,UAAe,GACvB,OAAO,CAAC,MAAM,CAAC,CAiEjB;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAalE"}
@@ -0,0 +1,308 @@
1
+ import { GoogleGenerativeAI } from '@google/generative-ai';
2
+ import { ConfigManager } from './config-manager.js';
3
+ import { getMaxTokens } from './config.js';
4
+ import { TokenTracker } from '../services/token-tracker.js';
5
+ // Singleton TokenTracker instance
6
+ let tokenTracker = null;
7
+ function getTokenTracker() {
8
+ if (!tokenTracker) {
9
+ tokenTracker = new TokenTracker();
10
+ }
11
+ return tokenTracker;
12
+ }
13
+ /**
14
+ * Estimate token count (rough approximation: ~4 characters per token)
15
+ */
16
+ export function estimateTokens(text) {
17
+ // Rough approximation: 1 token ≈ 4 characters
18
+ // This is a simplified estimate; actual tokenization varies
19
+ return Math.ceil(text.length / 4);
20
+ }
21
+ /**
22
+ * Gemini Adapter
23
+ */
24
+ class GeminiAdapter {
25
+ client = null;
26
+ modelCache = new Map();
27
+ async initialize(apiKey, modelName) {
28
+ if (this.modelCache.has(modelName)) {
29
+ return this.modelCache.get(modelName);
30
+ }
31
+ if (!this.client) {
32
+ this.client = new GoogleGenerativeAI(apiKey);
33
+ }
34
+ const model = this.client.getGenerativeModel({
35
+ model: modelName,
36
+ safetySettings: [
37
+ {
38
+ category: 'HARM_CATEGORY_HARASSMENT',
39
+ threshold: 'BLOCK_NONE',
40
+ },
41
+ {
42
+ category: 'HARM_CATEGORY_HATE_SPEECH',
43
+ threshold: 'BLOCK_NONE',
44
+ },
45
+ {
46
+ category: 'HARM_CATEGORY_SEXUALLY_EXPLICIT',
47
+ threshold: 'BLOCK_NONE',
48
+ },
49
+ {
50
+ category: 'HARM_CATEGORY_DANGEROUS_CONTENT',
51
+ threshold: 'BLOCK_ONLY_HIGH',
52
+ },
53
+ ],
54
+ });
55
+ this.modelCache.set(modelName, model);
56
+ return model;
57
+ }
58
+ async generate(prompt, systemPrompt, options) {
59
+ const apiKey = await ConfigManager.getApiKey('google');
60
+ if (!apiKey) {
61
+ throw new Error('GEMINI_API_KEY not found. Please run `vibeguard init` to configure.');
62
+ }
63
+ const localConfig = await ConfigManager.loadLocalConfig();
64
+ const provider = localConfig?.provider || 'google';
65
+ const profile = localConfig?.profile || 'Balanced';
66
+ const thinkingLevel = options.thinkingLevel || 'flash';
67
+ const modelName = ConfigManager.getModelForProfile(provider, profile, thinkingLevel);
68
+ const model = await this.initialize(apiKey, modelName);
69
+ const maxTokens = options.maxTokens || await getMaxTokens();
70
+ const temperature = options.temperature ?? 0.3;
71
+ const fullPrompt = `${systemPrompt}\n\n${prompt}`;
72
+ const generationConfig = {
73
+ maxOutputTokens: maxTokens,
74
+ temperature,
75
+ };
76
+ const result = await model.generateContent({
77
+ contents: [{ role: 'user', parts: [{ text: fullPrompt }] }],
78
+ generationConfig,
79
+ });
80
+ const response = result.response;
81
+ const candidates = response.candidates || [];
82
+ if (candidates.length > 0) {
83
+ const finishReason = candidates[0].finishReason;
84
+ if (finishReason === 'SAFETY') {
85
+ throw new Error('Response blocked by safety filters. Consider adjusting safety settings.');
86
+ }
87
+ if (finishReason && finishReason !== 'STOP') {
88
+ throw new Error(`Response finished with reason: ${finishReason}`);
89
+ }
90
+ }
91
+ const text = response.text();
92
+ if (!text) {
93
+ const finishReason = candidates[0]?.finishReason || 'UNKNOWN';
94
+ throw new Error(`Empty response from Gemini API (finishReason: ${finishReason})`);
95
+ }
96
+ // Extract usage information if available
97
+ // usageMetadata is a property, not a method
98
+ const usageInfo = result.response.usageMetadata;
99
+ const usage = usageInfo ? {
100
+ inputTokens: usageInfo.promptTokenCount || estimateTokens(fullPrompt),
101
+ outputTokens: usageInfo.candidatesTokenCount || estimateTokens(text),
102
+ } : {
103
+ inputTokens: estimateTokens(fullPrompt),
104
+ outputTokens: estimateTokens(text),
105
+ };
106
+ return { text, usage };
107
+ }
108
+ }
109
+ /**
110
+ * OpenAI Adapter
111
+ */
112
+ class OpenAIAdapter {
113
+ async generate(prompt, systemPrompt, options) {
114
+ const apiKey = await ConfigManager.getApiKey('openai');
115
+ if (!apiKey) {
116
+ throw new Error('OPENAI_API_KEY not found. Please run `vibeguard init` to configure.');
117
+ }
118
+ const localConfig = await ConfigManager.loadLocalConfig();
119
+ const provider = localConfig?.provider || 'openai';
120
+ const profile = localConfig?.profile || 'Balanced';
121
+ const thinkingLevel = options.thinkingLevel || 'flash';
122
+ const modelName = ConfigManager.getModelForProfile(provider, profile, thinkingLevel);
123
+ const maxTokens = options.maxTokens || await getMaxTokens();
124
+ const temperature = options.temperature ?? 0.3;
125
+ // Use fetch for OpenAI API
126
+ const response = await fetch('https://api.openai.com/v1/chat/completions', {
127
+ method: 'POST',
128
+ headers: {
129
+ 'Content-Type': 'application/json',
130
+ 'Authorization': `Bearer ${apiKey}`,
131
+ },
132
+ body: JSON.stringify({
133
+ model: modelName,
134
+ messages: [
135
+ { role: 'system', content: systemPrompt },
136
+ { role: 'user', content: prompt },
137
+ ],
138
+ max_tokens: maxTokens,
139
+ temperature,
140
+ }),
141
+ });
142
+ if (!response.ok) {
143
+ const error = await response.json().catch(() => ({ error: { message: 'Unknown error' } }));
144
+ throw new Error(`OpenAI API error: ${error.error?.message || 'Unknown error'}`);
145
+ }
146
+ const data = await response.json();
147
+ const text = data.choices[0]?.message?.content;
148
+ if (!text) {
149
+ throw new Error('Empty response from OpenAI API');
150
+ }
151
+ const usage = data.usage ? {
152
+ inputTokens: data.usage.prompt_tokens || estimateTokens(`${systemPrompt}\n\n${prompt}`),
153
+ outputTokens: data.usage.completion_tokens || estimateTokens(text),
154
+ } : {
155
+ inputTokens: estimateTokens(`${systemPrompt}\n\n${prompt}`),
156
+ outputTokens: estimateTokens(text),
157
+ };
158
+ return { text, usage };
159
+ }
160
+ }
161
+ /**
162
+ * Anthropic Adapter
163
+ */
164
+ class AnthropicAdapter {
165
+ async generate(prompt, systemPrompt, options) {
166
+ const apiKey = await ConfigManager.getApiKey('anthropic');
167
+ if (!apiKey) {
168
+ throw new Error('ANTHROPIC_API_KEY not found. Please run `vibeguard init` to configure.');
169
+ }
170
+ const localConfig = await ConfigManager.loadLocalConfig();
171
+ const provider = localConfig?.provider || 'anthropic';
172
+ const profile = localConfig?.profile || 'Balanced';
173
+ const thinkingLevel = options.thinkingLevel || 'flash';
174
+ const modelName = ConfigManager.getModelForProfile(provider, profile, thinkingLevel);
175
+ const maxTokens = options.maxTokens || await getMaxTokens();
176
+ const temperature = options.temperature ?? 0.3;
177
+ // Use fetch for Anthropic API
178
+ const response = await fetch('https://api.anthropic.com/v1/messages', {
179
+ method: 'POST',
180
+ headers: {
181
+ 'Content-Type': 'application/json',
182
+ 'x-api-key': apiKey,
183
+ 'anthropic-version': '2023-06-01',
184
+ },
185
+ body: JSON.stringify({
186
+ model: modelName,
187
+ max_tokens: maxTokens,
188
+ temperature,
189
+ system: systemPrompt,
190
+ messages: [
191
+ { role: 'user', content: prompt },
192
+ ],
193
+ }),
194
+ });
195
+ if (!response.ok) {
196
+ const error = await response.json().catch(() => ({ error: { message: 'Unknown error' } }));
197
+ throw new Error(`Anthropic API error: ${error.error?.message || 'Unknown error'}`);
198
+ }
199
+ const data = await response.json();
200
+ const text = data.content[0]?.text;
201
+ if (!text) {
202
+ throw new Error('Empty response from Anthropic API');
203
+ }
204
+ const usage = data.usage ? {
205
+ inputTokens: data.usage.input_tokens || estimateTokens(`${systemPrompt}\n\n${prompt}`),
206
+ outputTokens: data.usage.output_tokens || estimateTokens(text),
207
+ } : {
208
+ inputTokens: estimateTokens(`${systemPrompt}\n\n${prompt}`),
209
+ outputTokens: estimateTokens(text),
210
+ };
211
+ return { text, usage };
212
+ }
213
+ }
214
+ /**
215
+ * Get the appropriate adapter based on provider
216
+ */
217
+ async function getAdapter() {
218
+ const localConfig = await ConfigManager.loadLocalConfig();
219
+ const provider = localConfig?.provider || 'google';
220
+ switch (provider) {
221
+ case 'google':
222
+ return new GeminiAdapter();
223
+ case 'openai':
224
+ return new OpenAIAdapter();
225
+ case 'anthropic':
226
+ return new AnthropicAdapter();
227
+ default:
228
+ return new GeminiAdapter();
229
+ }
230
+ }
231
+ /**
232
+ * Generate summary with retry logic (Provider-Agnostic)
233
+ */
234
+ export async function generateSummary(prompt, systemPrompt, options = {}) {
235
+ const thinkingLevel = options.thinkingLevel || 'flash';
236
+ const localConfig = await ConfigManager.loadLocalConfig();
237
+ const provider = localConfig?.provider || 'google';
238
+ const profile = localConfig?.profile || 'Balanced';
239
+ const modelName = ConfigManager.getModelForProfile(provider, profile, thinkingLevel);
240
+ const modelDisplayName = ConfigManager.getModelDisplayName(provider, modelName);
241
+ // Log model usage
242
+ if (thinkingLevel === 'pro') {
243
+ console.error(`[VibeGuard] Using ${modelDisplayName} for Architectural Pruning...`);
244
+ }
245
+ else {
246
+ console.error(`[VibeGuard] Using ${modelDisplayName} for Summarization...`);
247
+ }
248
+ const adapter = await getAdapter();
249
+ let lastError = null;
250
+ const maxRetries = 3;
251
+ const delays = [1000, 2000, 4000]; // Exponential backoff
252
+ for (let attempt = 0; attempt < maxRetries; attempt++) {
253
+ try {
254
+ const result = await adapter.generate(prompt, systemPrompt, options);
255
+ // Track token usage with TokenTracker (async, non-blocking)
256
+ if (result.usage && options.feature) {
257
+ const tracker = getTokenTracker();
258
+ // Fire and forget - don't wait for it to complete
259
+ tracker.logUsage({
260
+ feature: options.feature,
261
+ model: modelName,
262
+ provider,
263
+ inputTokens: result.usage.inputTokens,
264
+ outputTokens: result.usage.outputTokens,
265
+ }).catch(err => {
266
+ // Silently handle errors - tracking shouldn't block execution
267
+ console.warn('[VibeGuard] Token tracking failed:', err);
268
+ });
269
+ }
270
+ return result.text;
271
+ }
272
+ catch (error) {
273
+ lastError = error;
274
+ // Don't retry on certain errors (e.g., invalid API key, safety blocks)
275
+ if (error.message?.includes('API_KEY') ||
276
+ error.message?.includes('401') ||
277
+ error.message?.includes('403') ||
278
+ error.message?.includes('safety') ||
279
+ error.message?.includes('SAFETY') ||
280
+ error.message?.includes('blocked by safety')) {
281
+ throw error;
282
+ }
283
+ // Wait before retrying (except on last attempt)
284
+ if (attempt < maxRetries - 1) {
285
+ await new Promise(resolve => setTimeout(resolve, delays[attempt]));
286
+ }
287
+ }
288
+ }
289
+ throw new Error(`Failed to generate summary after ${maxRetries} attempts: ${lastError?.message || 'Unknown error'}`);
290
+ }
291
+ /**
292
+ * Get token usage history (legacy support)
293
+ * @deprecated Use TokenTracker.getUsageLogs() instead
294
+ */
295
+ export async function getTokenUsageHistory() {
296
+ const tracker = getTokenTracker();
297
+ const logs = await tracker.getUsageLogs();
298
+ // Convert to legacy format
299
+ return logs.map(log => ({
300
+ model: log.model,
301
+ provider: log.provider,
302
+ inputTokens: log.inputTokens,
303
+ outputTokens: log.outputTokens,
304
+ timestamp: log.timestamp,
305
+ cost: log.cost,
306
+ }));
307
+ }
308
+ //# sourceMappingURL=llm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.js","sourceRoot":"","sources":["../../src/utils/llm.ts"],"names":[],"mappings":"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"}