@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.
- package/README.md +166 -0
- package/dashboard/dist/assets/Tableau10-B-NsZVaP.js +1 -0
- package/dashboard/dist/assets/arc-CZ1oDkm-.js +1 -0
- package/dashboard/dist/assets/array-BKyUJesY.js +1 -0
- package/dashboard/dist/assets/blockDiagram-c4efeb88-BLITAZDl.js +118 -0
- package/dashboard/dist/assets/c4Diagram-c83219d4-DErNj891.js +10 -0
- package/dashboard/dist/assets/channel-sWBGOq9p.js +1 -0
- package/dashboard/dist/assets/classDiagram-beda092f-Bj8IB6RW.js +2 -0
- package/dashboard/dist/assets/classDiagram-v2-2358418a-BZtd2g5W.js +2 -0
- package/dashboard/dist/assets/clone-DtEyH3ya.js +1 -0
- package/dashboard/dist/assets/createText-1719965b-DkNrTk-5.js +7 -0
- package/dashboard/dist/assets/edges-96097737-CYxl0j3g.js +4 -0
- package/dashboard/dist/assets/erDiagram-0228fc6a-ClEp9Atg.js +51 -0
- package/dashboard/dist/assets/flowDb-c6c81e3f-ClDJCJwu.js +10 -0
- package/dashboard/dist/assets/flowDiagram-50d868cf-DYxwClWS.js +4 -0
- package/dashboard/dist/assets/flowDiagram-v2-4f6560a1-D7vEnO1T.js +1 -0
- package/dashboard/dist/assets/flowchart-elk-definition-6af322e1-C-wX1mNx.js +139 -0
- package/dashboard/dist/assets/ganttDiagram-a2739b55-DTeLavAj.js +257 -0
- package/dashboard/dist/assets/gitGraphDiagram-82fe8481-ClxNoYya.js +70 -0
- package/dashboard/dist/assets/graph-CT-F3Got.js +1 -0
- package/dashboard/dist/assets/index-5325376f-C-jTCYZA.js +1 -0
- package/dashboard/dist/assets/index-CvYvquQR.js +283 -0
- package/dashboard/dist/assets/index-n43poL1x.css +1 -0
- package/dashboard/dist/assets/infoDiagram-8eee0895-Zljudo5L.js +7 -0
- package/dashboard/dist/assets/init-Gi6I4Gst.js +1 -0
- package/dashboard/dist/assets/journeyDiagram-c64418c1-DXzTbuum.js +139 -0
- package/dashboard/dist/assets/katex-Cu_Erd72.js +261 -0
- package/dashboard/dist/assets/layout-CVO3EizT.js +1 -0
- package/dashboard/dist/assets/line-CIgln-0z.js +1 -0
- package/dashboard/dist/assets/linear-bmIUMQqg.js +1 -0
- package/dashboard/dist/assets/mindmap-definition-8da855dc-BDLTNZYk.js +425 -0
- package/dashboard/dist/assets/ordinal-Cboi1Yqb.js +1 -0
- package/dashboard/dist/assets/path-CbwjOpE9.js +1 -0
- package/dashboard/dist/assets/pieDiagram-a8764435-DtcOKNPc.js +35 -0
- package/dashboard/dist/assets/quadrantDiagram-1e28029f-zoSI_Ltf.js +7 -0
- package/dashboard/dist/assets/requirementDiagram-08caed73-TsQZ9lTB.js +52 -0
- package/dashboard/dist/assets/sankeyDiagram-a04cb91d-DE5ciDwD.js +8 -0
- package/dashboard/dist/assets/sequenceDiagram-c5b8d532-DhabPb2n.js +122 -0
- package/dashboard/dist/assets/stateDiagram-1ecb1508-Bg2q_YNx.js +1 -0
- package/dashboard/dist/assets/stateDiagram-v2-c2b004d7-Bs5iRjYB.js +1 -0
- package/dashboard/dist/assets/styles-b4e223ce-DchmAmav.js +160 -0
- package/dashboard/dist/assets/styles-ca3715f6-Bu5zjaDx.js +207 -0
- package/dashboard/dist/assets/styles-d45a18b0-jCaD8baR.js +116 -0
- package/dashboard/dist/assets/svgDrawCommon-b86b1483-BrYVGY4c.js +1 -0
- package/dashboard/dist/assets/timeline-definition-faaaa080--sq0bTHe.js +61 -0
- package/dashboard/dist/assets/xychartDiagram-f5964ef8-ByvzN0uj.js +7 -0
- package/dashboard/dist/index.html +22 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +641 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/dashboard.d.ts +2 -0
- package/dist/commands/dashboard.d.ts.map +1 -0
- package/dist/commands/dashboard.js +184 -0
- package/dist/commands/dashboard.js.map +1 -0
- package/dist/commands/init.d.ts +5 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +501 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +602 -0
- package/dist/index.js.map +1 -0
- package/dist/librarian/autofix.d.ts +34 -0
- package/dist/librarian/autofix.d.ts.map +1 -0
- package/dist/librarian/autofix.js +369 -0
- package/dist/librarian/autofix.js.map +1 -0
- package/dist/librarian/heartbeat.d.ts +38 -0
- package/dist/librarian/heartbeat.d.ts.map +1 -0
- package/dist/librarian/heartbeat.js +98 -0
- package/dist/librarian/heartbeat.js.map +1 -0
- package/dist/librarian/initializer.d.ts +41 -0
- package/dist/librarian/initializer.d.ts.map +1 -0
- package/dist/librarian/initializer.js +202 -0
- package/dist/librarian/initializer.js.map +1 -0
- package/dist/librarian/memory-manager.d.ts +37 -0
- package/dist/librarian/memory-manager.d.ts.map +1 -0
- package/dist/librarian/memory-manager.js +205 -0
- package/dist/librarian/memory-manager.js.map +1 -0
- package/dist/librarian/oracle.d.ts +51 -0
- package/dist/librarian/oracle.d.ts.map +1 -0
- package/dist/librarian/oracle.js +235 -0
- package/dist/librarian/oracle.js.map +1 -0
- package/dist/librarian/summarizer.d.ts +19 -0
- package/dist/librarian/summarizer.d.ts.map +1 -0
- package/dist/librarian/summarizer.js +175 -0
- package/dist/librarian/summarizer.js.map +1 -0
- package/dist/librarian/watcher.d.ts +51 -0
- package/dist/librarian/watcher.d.ts.map +1 -0
- package/dist/librarian/watcher.js +189 -0
- package/dist/librarian/watcher.js.map +1 -0
- package/dist/mcp-server.d.ts +10 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +879 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/services/token-tracker.d.ts +58 -0
- package/dist/services/token-tracker.d.ts.map +1 -0
- package/dist/services/token-tracker.js +178 -0
- package/dist/services/token-tracker.js.map +1 -0
- package/dist/utils/chunker.d.ts +5 -0
- package/dist/utils/chunker.d.ts.map +1 -0
- package/dist/utils/chunker.js +121 -0
- package/dist/utils/chunker.js.map +1 -0
- package/dist/utils/config-manager.d.ts +65 -0
- package/dist/utils/config-manager.d.ts.map +1 -0
- package/dist/utils/config-manager.js +243 -0
- package/dist/utils/config-manager.js.map +1 -0
- package/dist/utils/config.d.ts +46 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +171 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/diff-cleaner.d.ts +13 -0
- package/dist/utils/diff-cleaner.d.ts.map +1 -0
- package/dist/utils/diff-cleaner.js +80 -0
- package/dist/utils/diff-cleaner.js.map +1 -0
- package/dist/utils/git.d.ts +71 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +285 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/llm.d.ts +30 -0
- package/dist/utils/llm.d.ts.map +1 -0
- package/dist/utils/llm.js +308 -0
- package/dist/utils/llm.js.map +1 -0
- package/dist/utils/pricing.d.ts +47 -0
- package/dist/utils/pricing.d.ts.map +1 -0
- package/dist/utils/pricing.js +171 -0
- package/dist/utils/pricing.js.map +1 -0
- 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":"AAAA,OAAO,EAAE,SAAS,EAAwB,MAAM,YAAY,CAAC;AAC7D,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAQ7B,MAAM,OAAO,QAAQ;IACX,GAAG,CAAY;IACf,QAAQ,CAAS;IAEzB,YAAY,WAAmB,OAAO,CAAC,GAAG,EAAE;QAC1C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,KAAa;QAClC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,0CAA0C;IACjE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,UAAkB;QACpC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;YAC5D,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,iCAAiC,UAAU,KAAK,KAAK,EAAE,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,mBAAmB;QACvB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;YACrD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,gDAAgD;YAChD,IAAI,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;gBACvF,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,qCAAqC,KAAK,CAAC,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,kBAAkB,CAAC,UAAkB,EAAE,QAAgB;QAC3D,IAAI,CAAC;YACH,+BAA+B;YAC/B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,UAAU,KAAK,QAAQ,EAAE,CAAC,CAAC,CAAC;YACjE,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,wCAAwC,UAAU,OAAO,QAAQ,KAAK,KAAK,CAAC,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC;QAClH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe;QACnB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,gCAAgC,KAAK,CAAC,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,KAAa,EAAE,KAAc;QAC/C,IAAI,CAAC;YACH,MAAM,OAAO,GAAQ;gBACnB,QAAQ,EAAE,KAAK;gBACf,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE;aACnD,CAAC;YAEF,6CAA6C;YAC7C,IAAI,KAAK,EAAE,CAAC;gBACV,uFAAuF;gBACvF,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;oBACnC,KAAK;oBACL,WAAW,KAAK,EAAE;oBAClB,KAAK,KAAK,EAAE;oBACZ,oBAAoB;iBACrB,CAAC,CAAC;gBAEH,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAChD,OAAO,EAAE,CAAC;gBACZ,CAAC;gBAED,uBAAuB;gBACvB,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC3C,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;oBACtB,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBACtD,OAAO;wBACL,IAAI,EAAE,IAAI,IAAI,EAAE;wBAChB,IAAI,EAAE,IAAI,IAAI,EAAE;wBAChB,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;qBACtC,CAAC;gBACJ,CAAC,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,6CAA6C;gBAC7C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACxC,OAAO,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBAC5B,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,IAAI,EAAE,MAAM,CAAC,IAAI;iBAClB,CAAC,CAAC,CAAC;YACN,CAAC;QACH,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,gEAAgE;YAChE,IACE,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,+BAA+B,CAAC;gBACxD,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,sBAAsB,CAAC;gBAC/C,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,oBAAoB,CAAC;gBAC7C,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,cAAc,CAAC,EACvC,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,oFAAoF,CAAC,CAAC;gBACnG,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,wBAAwB;YACxB,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,CAAC,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa;QACjB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;QAChD,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;QACzB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB;QACpB,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YAC9C,OAAO,aAAa,CAAC,OAAO,IAAI,MAAM,CAAC;QACzC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,2CAA2C;YAC3C,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;gBAC1D,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACzD,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;gBAC5D,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;oBACtB,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBACzB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,uCAAuC;YACzC,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB;QACpB,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,KAAK,UAAU,OAAO,CAAC,GAAW,EAAE,SAAiB,EAAE,EAAE,QAAgB,CAAC;YACxE,IAAI,KAAK,GAAG,CAAC;gBAAE,OAAO,CAAC,kCAAkC;YAEzD,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;gBAE/D,oCAAoC;gBACpC,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;oBACtC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;oBACxB,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;wBACrB,IAAI,KAAK,cAAc;wBACvB,IAAI,KAAK,MAAM;wBACf,IAAI,KAAK,OAAO;wBAChB,IAAI,KAAK,OAAO;wBAChB,IAAI,KAAK,KAAK,CAAC;gBACxB,CAAC,CAAC,CAAC;gBAEH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACzC,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;oBAC1B,MAAM,MAAM,GAAG,CAAC,KAAK,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;oBACzC,MAAM,aAAa,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;oBAC/C,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;oBAE5C,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;oBAEhD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;wBACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;wBAC5C,MAAM,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;oBAC1D,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,2BAA2B;YAC7B,CAAC;QACH,CAAC;QAED,MAAM,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,QAAgB;QAClC,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YAC7D,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;YAC1D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAE3D,sDAAsD;YACtD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAEhF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;oBAAE,SAAS;gBAE5C,iDAAiD;gBACjD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,uBAAuB;gBAChE,IAAI,YAAY,KAAK,OAAO,IAAI,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC/D,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;YAED,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,4CAA4C;YAC5C,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB,CAAC,QAAgB;QACxC,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YAC7D,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;YAC1D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAElC,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAChF,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;gBACnC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;oBAAE,OAAO,IAAI,CAAC;gBACrD,OAAO,OAAO,KAAK,YAAY,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YACrE,CAAC,CAAC,CAAC;YAEH,MAAM,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QAClE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,6DAA6D;QAC/D,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,SAAS,CAAC,QAAgB;QAC9B,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAEhF,yDAAyD;QACzD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACrD,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QAC3C,CAAC;QAED,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,OAAe;QAChC,OAAO,gCAAgC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,MAAM,WAAW,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;QAE3E,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACrC,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;gBACtD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACrD,OAAO,OAAO,CAAC;YACjB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,+BAA+B;YACjC,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
|
|
@@ -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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"}
|