@osanoai/multicli 1.5.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 +209 -0
- package/dist/clientFilter.d.ts +5 -0
- package/dist/clientFilter.d.ts.map +1 -0
- package/dist/clientFilter.js +27 -0
- package/dist/clientFilter.js.map +1 -0
- package/dist/constants.d.ts +88 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +90 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +205 -0
- package/dist/index.js.map +1 -0
- package/dist/modelCatalog.d.ts +14 -0
- package/dist/modelCatalog.d.ts.map +1 -0
- package/dist/modelCatalog.js +99 -0
- package/dist/modelCatalog.js.map +1 -0
- package/dist/tools/ask-claude.tool.d.ts +3 -0
- package/dist/tools/ask-claude.tool.d.ts.map +1 -0
- package/dist/tools/ask-claude.tool.js +28 -0
- package/dist/tools/ask-claude.tool.js.map +1 -0
- package/dist/tools/ask-codex.tool.d.ts +3 -0
- package/dist/tools/ask-codex.tool.d.ts.map +1 -0
- package/dist/tools/ask-codex.tool.js +27 -0
- package/dist/tools/ask-codex.tool.js.map +1 -0
- package/dist/tools/ask-gemini.tool.d.ts +3 -0
- package/dist/tools/ask-gemini.tool.d.ts.map +1 -0
- package/dist/tools/ask-gemini.tool.js +36 -0
- package/dist/tools/ask-gemini.tool.js.map +1 -0
- package/dist/tools/brainstorm-claude.tool.d.ts +3 -0
- package/dist/tools/brainstorm-claude.tool.d.ts.map +1 -0
- package/dist/tools/brainstorm-claude.tool.js +42 -0
- package/dist/tools/brainstorm-claude.tool.js.map +1 -0
- package/dist/tools/brainstorm-codex.tool.d.ts +3 -0
- package/dist/tools/brainstorm-codex.tool.d.ts.map +1 -0
- package/dist/tools/brainstorm-codex.tool.js +42 -0
- package/dist/tools/brainstorm-codex.tool.js.map +1 -0
- package/dist/tools/brainstorm.tool.d.ts +3 -0
- package/dist/tools/brainstorm.tool.d.ts.map +1 -0
- package/dist/tools/brainstorm.tool.js +42 -0
- package/dist/tools/brainstorm.tool.js.map +1 -0
- package/dist/tools/fetch-chunk.tool.d.ts +3 -0
- package/dist/tools/fetch-chunk.tool.d.ts.map +1 -0
- package/dist/tools/fetch-chunk.tool.js +58 -0
- package/dist/tools/fetch-chunk.tool.js.map +1 -0
- package/dist/tools/important-read-now.tool.d.ts +3 -0
- package/dist/tools/important-read-now.tool.d.ts.map +1 -0
- package/dist/tools/important-read-now.tool.js +31 -0
- package/dist/tools/important-read-now.tool.js.map +1 -0
- package/dist/tools/index.d.ts +8 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +34 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/registry.d.ts +25 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +78 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/simple-tools.d.ts +8 -0
- package/dist/tools/simple-tools.d.ts.map +1 -0
- package/dist/tools/simple-tools.js +78 -0
- package/dist/tools/simple-tools.js.map +1 -0
- package/dist/tools/test-tool.example.d.ts +13 -0
- package/dist/tools/test-tool.example.d.ts.map +1 -0
- package/dist/tools/test-tool.example.js +32 -0
- package/dist/tools/test-tool.example.js.map +1 -0
- package/dist/tools/timeout-test.tool.d.ts +3 -0
- package/dist/tools/timeout-test.tool.d.ts.map +1 -0
- package/dist/tools/timeout-test.tool.js +32 -0
- package/dist/tools/timeout-test.tool.js.map +1 -0
- package/dist/utils/brainstormPromptBuilder.d.ts +11 -0
- package/dist/utils/brainstormPromptBuilder.d.ts.map +1 -0
- package/dist/utils/brainstormPromptBuilder.js +93 -0
- package/dist/utils/brainstormPromptBuilder.js.map +1 -0
- package/dist/utils/changeModeChunker.d.ts +11 -0
- package/dist/utils/changeModeChunker.d.ts.map +1 -0
- package/dist/utils/changeModeChunker.js +89 -0
- package/dist/utils/changeModeChunker.js.map +1 -0
- package/dist/utils/changeModeParser.d.ts +15 -0
- package/dist/utils/changeModeParser.d.ts.map +1 -0
- package/dist/utils/changeModeParser.js +67 -0
- package/dist/utils/changeModeParser.js.map +1 -0
- package/dist/utils/changeModeTranslator.d.ts +8 -0
- package/dist/utils/changeModeTranslator.d.ts.map +1 -0
- package/dist/utils/changeModeTranslator.js +70 -0
- package/dist/utils/changeModeTranslator.js.map +1 -0
- package/dist/utils/chunkCache.d.ts +22 -0
- package/dist/utils/chunkCache.d.ts.map +1 -0
- package/dist/utils/chunkCache.js +147 -0
- package/dist/utils/chunkCache.js.map +1 -0
- package/dist/utils/claudeExecutor.d.ts +2 -0
- package/dist/utils/claudeExecutor.d.ts.map +1 -0
- package/dist/utils/claudeExecutor.js +21 -0
- package/dist/utils/claudeExecutor.js.map +1 -0
- package/dist/utils/cliDetector.d.ts +17 -0
- package/dist/utils/cliDetector.d.ts.map +1 -0
- package/dist/utils/cliDetector.js +45 -0
- package/dist/utils/cliDetector.js.map +1 -0
- package/dist/utils/codexExecutor.d.ts +2 -0
- package/dist/utils/codexExecutor.d.ts.map +1 -0
- package/dist/utils/codexExecutor.js +19 -0
- package/dist/utils/codexExecutor.js.map +1 -0
- package/dist/utils/commandExecutor.d.ts +2 -0
- package/dist/utils/commandExecutor.d.ts.map +1 -0
- package/dist/utils/commandExecutor.js +53 -0
- package/dist/utils/commandExecutor.js.map +1 -0
- package/dist/utils/geminiExecutor.d.ts +3 -0
- package/dist/utils/geminiExecutor.d.ts.map +1 -0
- package/dist/utils/geminiExecutor.js +126 -0
- package/dist/utils/geminiExecutor.js.map +1 -0
- package/dist/utils/logger.d.ts +14 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +56 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/timeoutManager.d.ts +2 -0
- package/dist/utils/timeoutManager.d.ts.map +1 -0
- package/dist/utils/timeoutManager.js +2 -0
- package/dist/utils/timeoutManager.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ChangeModeEdit } from './changeModeParser.js';
|
|
2
|
+
export declare function formatChangeModeResponse(edits: ChangeModeEdit[], chunkInfo?: {
|
|
3
|
+
current: number;
|
|
4
|
+
total: number;
|
|
5
|
+
cacheKey?: string;
|
|
6
|
+
}): string;
|
|
7
|
+
export declare function summarizeChangeModeEdits(edits: ChangeModeEdit[], isPartialView?: boolean): string;
|
|
8
|
+
//# sourceMappingURL=changeModeTranslator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"changeModeTranslator.d.ts","sourceRoot":"","sources":["../../src/utils/changeModeTranslator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,cAAc,EAAE,EACvB,SAAS,CAAC,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAChE,MAAM,CAoDR;AAGD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE,aAAa,CAAC,EAAE,OAAO,GAAG,MAAM,CAiBjG"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
export function formatChangeModeResponse(edits, chunkInfo) {
|
|
2
|
+
const header = chunkInfo && chunkInfo.total > 1
|
|
3
|
+
? `[CHANGEMODE OUTPUT - Chunk ${chunkInfo.current} of ${chunkInfo.total}]
|
|
4
|
+
|
|
5
|
+
Gemini has analyzed your codebase and generated edits across ${chunkInfo.total} chunks.
|
|
6
|
+
This chunk contains ${edits.length} complete edit${edits.length === 1 ? '' : 's'} that can be applied independently.
|
|
7
|
+
|
|
8
|
+
Each chunk contains self-contained edits grouped by file. You can safely apply these edits
|
|
9
|
+
before fetching the next chunk.
|
|
10
|
+
|
|
11
|
+
`
|
|
12
|
+
: `[CHANGEMODE OUTPUT - Gemini has analyzed the files and provided these edits]
|
|
13
|
+
|
|
14
|
+
I have prepared ${edits.length} modification${edits.length === 1 ? '' : 's'} for your codebase.
|
|
15
|
+
|
|
16
|
+
IMPORTANT: Apply these edits directly WITHOUT reading the files first. The edits below contain exact text matches from the current file contents.
|
|
17
|
+
|
|
18
|
+
`;
|
|
19
|
+
const instructions = edits.map((edit, index) => {
|
|
20
|
+
return `### Edit ${index + 1}: ${edit.filename}
|
|
21
|
+
|
|
22
|
+
Replace this exact text:
|
|
23
|
+
\`\`\`
|
|
24
|
+
${edit.oldCode}
|
|
25
|
+
\`\`\`
|
|
26
|
+
|
|
27
|
+
With this text:
|
|
28
|
+
\`\`\`
|
|
29
|
+
${edit.newCode}
|
|
30
|
+
\`\`\`
|
|
31
|
+
`;
|
|
32
|
+
}).join('\n');
|
|
33
|
+
let footer = `
|
|
34
|
+
---
|
|
35
|
+
Apply these edits in order. Each edit uses exact string matching, so the old_str must match exactly what appears between the code blocks.`;
|
|
36
|
+
if (chunkInfo && chunkInfo.current < chunkInfo.total && chunkInfo.cacheKey) {
|
|
37
|
+
footer += `
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
**Next Step**: After applying the edits above, retrieve the next chunk (${chunkInfo.current + 1} of ${chunkInfo.total}) using:
|
|
41
|
+
|
|
42
|
+
\`\`\`
|
|
43
|
+
fetch-chunk cacheKey="${chunkInfo.cacheKey}" chunkIndex=${chunkInfo.current + 1}
|
|
44
|
+
\`\`\`
|
|
45
|
+
|
|
46
|
+
There ${chunkInfo.total - chunkInfo.current === 1 ? 'is' : 'are'} ${chunkInfo.total - chunkInfo.current} more chunk${chunkInfo.total - chunkInfo.current === 1 ? '' : 's'} containing additional edits.
|
|
47
|
+
|
|
48
|
+
**CONTINUE**: You are working on a multi-chunk changeMode response. After applying these edits, fetch the next chunk to continue with the remaining modifications.`;
|
|
49
|
+
}
|
|
50
|
+
return header + instructions + footer;
|
|
51
|
+
}
|
|
52
|
+
export function summarizeChangeModeEdits(edits, isPartialView) {
|
|
53
|
+
const fileGroups = new Map();
|
|
54
|
+
// Count edits per file
|
|
55
|
+
for (const edit of edits) {
|
|
56
|
+
fileGroups.set(edit.filename, (fileGroups.get(edit.filename) || 0) + 1);
|
|
57
|
+
}
|
|
58
|
+
const summary = Array.from(fileGroups.entries())
|
|
59
|
+
.map(([file, count]) => `- ${file}: ${count} edit${count === 1 ? '' : 's'}`)
|
|
60
|
+
.join('\n');
|
|
61
|
+
const title = isPartialView
|
|
62
|
+
? `ChangeMode Summary (Complete analysis across all chunks):`
|
|
63
|
+
: `ChangeMode Summary:`;
|
|
64
|
+
return `${title}
|
|
65
|
+
Total edits: ${edits.length}${isPartialView ? ' (across all chunks)' : ''}
|
|
66
|
+
Files affected: ${fileGroups.size}
|
|
67
|
+
|
|
68
|
+
${summary}`;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=changeModeTranslator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"changeModeTranslator.js","sourceRoot":"","sources":["../../src/utils/changeModeTranslator.ts"],"names":[],"mappings":"AACA,MAAM,UAAU,wBAAwB,CACtC,KAAuB,EACvB,SAAiE;IAEjE,MAAM,MAAM,GAAG,SAAS,IAAI,SAAS,CAAC,KAAK,GAAG,CAAC;QAC7C,CAAC,CAAC,8BAA8B,SAAS,CAAC,OAAO,OAAO,SAAS,CAAC,KAAK;;+DAEZ,SAAS,CAAC,KAAK;sBACxD,KAAK,CAAC,MAAM,iBAAiB,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG;;;;;CAK/E;QACG,CAAC,CAAC;;kBAEY,KAAK,CAAC,MAAM,gBAAgB,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG;;;;CAI1E,CAAC;IAEA,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC7C,OAAO,YAAY,KAAK,GAAG,CAAC,KAAK,IAAI,CAAC,QAAQ;;;;EAIhD,IAAI,CAAC,OAAO;;;;;EAKZ,IAAI,CAAC,OAAO;;CAEb,CAAC;IACA,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,IAAI,MAAM,GAAG;;0IAE2H,CAAC;IACzI,IAAI,SAAS,IAAI,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC,KAAK,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;QAC3E,MAAM,IAAI;;;0EAG4D,SAAS,CAAC,OAAO,GAAG,CAAC,OAAO,SAAS,CAAC,KAAK;;;wBAG7F,SAAS,CAAC,QAAQ,gBAAgB,SAAS,CAAC,OAAO,GAAG,CAAC;;;QAGvE,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,OAAO,cAAc,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG;;mKAEN,CAAC;IAClK,CAAC;IACD,OAAO,MAAM,GAAG,YAAY,GAAG,MAAM,CAAC;AACxC,CAAC;AAGD,MAAM,UAAU,wBAAwB,CAAC,KAAuB,EAAE,aAAuB;IACvF,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC7C,uBAAuB;IACvB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1E,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;SAC7C,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,KAAK,KAAK,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;SAC3E,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,MAAM,KAAK,GAAG,aAAa;QACzB,CAAC,CAAC,2DAA2D;QAC7D,CAAC,CAAC,qBAAqB,CAAC;IAC1B,OAAO,GAAG,KAAK;eACF,KAAK,CAAC,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE;kBACvD,UAAU,CAAC,IAAI;;EAE/B,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { EditChunk } from './changeModeChunker.js';
|
|
2
|
+
/**
|
|
3
|
+
* Caches chunks from a changeMode response
|
|
4
|
+
* @param prompt The original prompt (used for hash generation)
|
|
5
|
+
* @param chunks The parsed and chunked edits
|
|
6
|
+
* @returns A short cache key for retrieval
|
|
7
|
+
*/
|
|
8
|
+
export declare function cacheChunks(prompt: string, chunks: EditChunk[]): string;
|
|
9
|
+
/**
|
|
10
|
+
* Retrieves cached chunks if they exist and haven't expired
|
|
11
|
+
* @param cacheKey The cache key returned from cacheChunks
|
|
12
|
+
* @returns The cached chunks or null if expired/not found
|
|
13
|
+
*/
|
|
14
|
+
export declare function getChunks(cacheKey: string): EditChunk[] | null;
|
|
15
|
+
export declare function getCacheStats(): {
|
|
16
|
+
size: number;
|
|
17
|
+
ttl: number;
|
|
18
|
+
maxSize: number;
|
|
19
|
+
cacheDir: string;
|
|
20
|
+
};
|
|
21
|
+
export declare function clearCache(): void;
|
|
22
|
+
//# sourceMappingURL=chunkCache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunkCache.d.ts","sourceRoot":"","sources":["../../src/utils/chunkCache.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAqBnD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAuBvE;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,IAAI,CAuB9D;AAsDD,wBAAgB,aAAa,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAehG;AAED,wBAAgB,UAAU,IAAI,IAAI,CAajC"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { createHash } from 'crypto';
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import * as os from 'os';
|
|
5
|
+
const CACHE_DIR = path.join(os.tmpdir(), 'multicli-chunks');
|
|
6
|
+
const CACHE_TTL = 10 * 60 * 1000;
|
|
7
|
+
const MAX_CACHE_FILES = 50;
|
|
8
|
+
function ensureCacheDir() {
|
|
9
|
+
if (!fs.existsSync(CACHE_DIR)) {
|
|
10
|
+
fs.mkdirSync(CACHE_DIR, { recursive: true });
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Caches chunks from a changeMode response
|
|
15
|
+
* @param prompt The original prompt (used for hash generation)
|
|
16
|
+
* @param chunks The parsed and chunked edits
|
|
17
|
+
* @returns A short cache key for retrieval
|
|
18
|
+
*/
|
|
19
|
+
export function cacheChunks(prompt, chunks) {
|
|
20
|
+
ensureCacheDir();
|
|
21
|
+
cleanExpiredFiles(); // Cleanup on each write
|
|
22
|
+
// Generate deterministic cache key from prompt
|
|
23
|
+
const promptHash = createHash('sha256').update(prompt).digest('hex');
|
|
24
|
+
const cacheKey = promptHash.slice(0, 8);
|
|
25
|
+
const filePath = path.join(CACHE_DIR, `${cacheKey}.json`);
|
|
26
|
+
// Store with metadata
|
|
27
|
+
const cacheData = {
|
|
28
|
+
chunks,
|
|
29
|
+
timestamp: Date.now(),
|
|
30
|
+
promptHash
|
|
31
|
+
};
|
|
32
|
+
try {
|
|
33
|
+
fs.writeFileSync(filePath, JSON.stringify(cacheData));
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// cache write failure is non-critical
|
|
37
|
+
}
|
|
38
|
+
enforceFileLimits();
|
|
39
|
+
return cacheKey;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Retrieves cached chunks if they exist and haven't expired
|
|
43
|
+
* @param cacheKey The cache key returned from cacheChunks
|
|
44
|
+
* @returns The cached chunks or null if expired/not found
|
|
45
|
+
*/
|
|
46
|
+
export function getChunks(cacheKey) {
|
|
47
|
+
const filePath = path.join(CACHE_DIR, `${cacheKey}.json`);
|
|
48
|
+
try {
|
|
49
|
+
if (!fs.existsSync(filePath)) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
const fileContent = fs.readFileSync(filePath, 'utf-8');
|
|
53
|
+
const data = JSON.parse(fileContent);
|
|
54
|
+
if (Date.now() - data.timestamp > CACHE_TTL) {
|
|
55
|
+
fs.unlinkSync(filePath);
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
return data.chunks;
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
try {
|
|
62
|
+
fs.unlinkSync(filePath); // Clean up bad file
|
|
63
|
+
}
|
|
64
|
+
catch { }
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function cleanExpiredFiles() {
|
|
69
|
+
try {
|
|
70
|
+
ensureCacheDir();
|
|
71
|
+
const files = fs.readdirSync(CACHE_DIR);
|
|
72
|
+
const now = Date.now();
|
|
73
|
+
for (const file of files) {
|
|
74
|
+
if (!file.endsWith('.json'))
|
|
75
|
+
continue;
|
|
76
|
+
const filePath = path.join(CACHE_DIR, file);
|
|
77
|
+
try {
|
|
78
|
+
const stats = fs.statSync(filePath);
|
|
79
|
+
if (now - stats.mtimeMs > CACHE_TTL) {
|
|
80
|
+
fs.unlinkSync(filePath);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
// Individual file error - continue with others
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// Non-critical cleanup failure
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// maximum file count limit (FIFO) --> LRU?
|
|
93
|
+
function enforceFileLimits() {
|
|
94
|
+
try {
|
|
95
|
+
const files = fs.readdirSync(CACHE_DIR)
|
|
96
|
+
.filter(f => f.endsWith('.json'))
|
|
97
|
+
.map(f => ({
|
|
98
|
+
name: f,
|
|
99
|
+
path: path.join(CACHE_DIR, f),
|
|
100
|
+
mtime: fs.statSync(path.join(CACHE_DIR, f)).mtimeMs
|
|
101
|
+
}))
|
|
102
|
+
.sort((a, b) => a.mtime - b.mtime); // Oldest first
|
|
103
|
+
// Remove oldest files if over limit
|
|
104
|
+
if (files.length > MAX_CACHE_FILES) {
|
|
105
|
+
const toRemove = files.slice(0, files.length - MAX_CACHE_FILES);
|
|
106
|
+
for (const file of toRemove) {
|
|
107
|
+
try {
|
|
108
|
+
fs.unlinkSync(file.path);
|
|
109
|
+
}
|
|
110
|
+
catch { }
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// Non-critical enforcement failure
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
export function getCacheStats() {
|
|
119
|
+
ensureCacheDir();
|
|
120
|
+
let size = 0;
|
|
121
|
+
try {
|
|
122
|
+
const files = fs.readdirSync(CACHE_DIR);
|
|
123
|
+
size = files.filter(f => f.endsWith('.json')).length;
|
|
124
|
+
}
|
|
125
|
+
catch { }
|
|
126
|
+
return {
|
|
127
|
+
size,
|
|
128
|
+
ttl: CACHE_TTL,
|
|
129
|
+
maxSize: MAX_CACHE_FILES,
|
|
130
|
+
cacheDir: CACHE_DIR
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
export function clearCache() {
|
|
134
|
+
try {
|
|
135
|
+
ensureCacheDir();
|
|
136
|
+
const files = fs.readdirSync(CACHE_DIR);
|
|
137
|
+
for (const file of files) {
|
|
138
|
+
if (file.endsWith('.json')) {
|
|
139
|
+
fs.unlinkSync(path.join(CACHE_DIR, file));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
// cache clear failure is non-critical
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=chunkCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunkCache.js","sourceRoot":"","sources":["../../src/utils/chunkCache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claudeExecutor.d.ts","sourceRoot":"","sources":["../../src/utils/claudeExecutor.ts"],"names":[],"mappings":"AAGA,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,cAAc,CAAC,EAAE,MAAM,EACvB,YAAY,CAAC,EAAE,MAAM,EACrB,YAAY,CAAC,EAAE,MAAM,EACrB,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,GACvC,OAAO,CAAC,MAAM,CAAC,CAqBjB"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { executeCommand } from './commandExecutor.js';
|
|
2
|
+
import { CLI } from '../constants.js';
|
|
3
|
+
export async function executeClaudeCLI(prompt, model, permissionMode, maxBudgetUsd, systemPrompt, onProgress) {
|
|
4
|
+
const args = [
|
|
5
|
+
CLI.CLAUDE_FLAGS.PRINT,
|
|
6
|
+
CLI.CLAUDE_FLAGS.OUTPUT_FORMAT, "text",
|
|
7
|
+
CLI.CLAUDE_FLAGS.MODEL, model,
|
|
8
|
+
prompt,
|
|
9
|
+
];
|
|
10
|
+
if (permissionMode) {
|
|
11
|
+
args.push(CLI.CLAUDE_FLAGS.PERMISSION_MODE, permissionMode);
|
|
12
|
+
}
|
|
13
|
+
if (maxBudgetUsd !== undefined) {
|
|
14
|
+
args.push(CLI.CLAUDE_FLAGS.MAX_BUDGET, String(maxBudgetUsd));
|
|
15
|
+
}
|
|
16
|
+
if (systemPrompt) {
|
|
17
|
+
args.push(CLI.CLAUDE_FLAGS.SYSTEM_PROMPT, systemPrompt);
|
|
18
|
+
}
|
|
19
|
+
return executeCommand(CLI.COMMANDS.CLAUDE, args, onProgress);
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=claudeExecutor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claudeExecutor.js","sourceRoot":"","sources":["../../src/utils/claudeExecutor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAEtC,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAc,EACd,KAAa,EACb,cAAuB,EACvB,YAAqB,EACrB,YAAqB,EACrB,UAAwC;IAExC,MAAM,IAAI,GAAa;QACrB,GAAG,CAAC,YAAY,CAAC,KAAK;QACtB,GAAG,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM;QACtC,GAAG,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK;QAC7B,MAAM;KACP,CAAC;IAEF,IAAI,cAAc,EAAE,CAAC;QACnB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,YAAY,EAAE,CAAC;QACjB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check if a command exists on the system PATH.
|
|
3
|
+
* Uses `which` on Unix/macOS, `where` on Windows.
|
|
4
|
+
* Always resolves to a boolean — never rejects.
|
|
5
|
+
*/
|
|
6
|
+
export declare function commandExists(command: string): Promise<boolean>;
|
|
7
|
+
export interface CliAvailability {
|
|
8
|
+
gemini: boolean;
|
|
9
|
+
codex: boolean;
|
|
10
|
+
claude: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Detect which of the three supported CLIs are available on the system.
|
|
14
|
+
* Runs all three checks in parallel for speed.
|
|
15
|
+
*/
|
|
16
|
+
export declare function detectAvailableClis(): Promise<CliAvailability>;
|
|
17
|
+
//# sourceMappingURL=cliDetector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cliDetector.d.ts","sourceRoot":"","sources":["../../src/utils/cliDetector.ts"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAoBrE;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,eAAe,CAAC,CAcpE"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { spawn } from "child_process";
|
|
2
|
+
import { CLI } from "../constants.js";
|
|
3
|
+
const isWindows = process.platform === "win32";
|
|
4
|
+
/**
|
|
5
|
+
* Check if a command exists on the system PATH.
|
|
6
|
+
* Uses `which` on Unix/macOS, `where` on Windows.
|
|
7
|
+
* Always resolves to a boolean — never rejects.
|
|
8
|
+
*/
|
|
9
|
+
export async function commandExists(command) {
|
|
10
|
+
return new Promise((resolve) => {
|
|
11
|
+
try {
|
|
12
|
+
const checker = isWindows ? "where" : "which";
|
|
13
|
+
const child = spawn(checker, [command], {
|
|
14
|
+
stdio: ["ignore", "ignore", "ignore"],
|
|
15
|
+
shell: isWindows,
|
|
16
|
+
});
|
|
17
|
+
child.on("error", () => {
|
|
18
|
+
resolve(false);
|
|
19
|
+
});
|
|
20
|
+
child.on("close", (code) => {
|
|
21
|
+
resolve(code === 0);
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
resolve(false);
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Detect which of the three supported CLIs are available on the system.
|
|
31
|
+
* Runs all three checks in parallel for speed.
|
|
32
|
+
*/
|
|
33
|
+
export async function detectAvailableClis() {
|
|
34
|
+
if (process.env.QA_NO_CLIS === 'true') {
|
|
35
|
+
return { gemini: false, codex: false, claude: false };
|
|
36
|
+
}
|
|
37
|
+
const [gemini, codex, claude] = await Promise.all([
|
|
38
|
+
commandExists(CLI.COMMANDS.GEMINI),
|
|
39
|
+
commandExists(CLI.COMMANDS.CODEX),
|
|
40
|
+
commandExists(CLI.COMMANDS.CLAUDE),
|
|
41
|
+
]);
|
|
42
|
+
const availability = { gemini, codex, claude };
|
|
43
|
+
return availability;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=cliDetector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cliDetector.js","sourceRoot":"","sources":["../../src/utils/cliDetector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAEtC,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;AAE/C;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAe;IACjD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;YAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE;gBACtC,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC;gBACrC,KAAK,EAAE,SAAS;aACjB,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACrB,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBACzB,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;YACtB,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAQD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,MAAM,EAAE,CAAC;QACtC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IACxD,CAAC;IAED,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAChD,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;QAClC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;QACjC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;KACnC,CAAC,CAAC;IAEH,MAAM,YAAY,GAAoB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAEhE,OAAO,YAAY,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codexExecutor.d.ts","sourceRoot":"","sources":["../../src/utils/codexExecutor.ts"],"names":[],"mappings":"AAGA,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,EAChB,cAAc,CAAC,EAAE,MAAM,EACvB,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,GACvC,OAAO,CAAC,MAAM,CAAC,CAkBjB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { executeCommand } from './commandExecutor.js';
|
|
2
|
+
import { CLI } from '../constants.js';
|
|
3
|
+
export async function executeCodexCLI(prompt, model, sandbox, approvalPolicy, onProgress) {
|
|
4
|
+
const args = [
|
|
5
|
+
CLI.SUBCOMMANDS.EXEC, prompt,
|
|
6
|
+
CLI.CODEX_FLAGS.FULL_AUTO,
|
|
7
|
+
CLI.CODEX_FLAGS.SKIP_GIT_CHECK,
|
|
8
|
+
CLI.CODEX_FLAGS.COLOR, "never",
|
|
9
|
+
CLI.CODEX_FLAGS.MODEL, model,
|
|
10
|
+
];
|
|
11
|
+
if (sandbox) {
|
|
12
|
+
args.push(CLI.CODEX_FLAGS.SANDBOX, sandbox);
|
|
13
|
+
}
|
|
14
|
+
if (approvalPolicy) {
|
|
15
|
+
args.push(CLI.CODEX_FLAGS.APPROVAL, approvalPolicy);
|
|
16
|
+
}
|
|
17
|
+
return executeCommand(CLI.COMMANDS.CODEX, args, onProgress);
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=codexExecutor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codexExecutor.js","sourceRoot":"","sources":["../../src/utils/codexExecutor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAEtC,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAc,EACd,KAAa,EACb,OAAgB,EAChB,cAAuB,EACvB,UAAwC;IAExC,MAAM,IAAI,GAAa;QACrB,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM;QAC5B,GAAG,CAAC,WAAW,CAAC,SAAS;QACzB,GAAG,CAAC,WAAW,CAAC,cAAc;QAC9B,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO;QAC9B,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK;KAC7B,CAAC;IAEF,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,cAAc,EAAE,CAAC;QACnB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commandExecutor.d.ts","sourceRoot":"","sources":["../../src/utils/commandExecutor.ts"],"names":[],"mappings":"AAKA,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,GACvC,OAAO,CAAC,MAAM,CAAC,CAsDjB"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { spawn } from "child_process";
|
|
2
|
+
// Detect Windows platform for shell compatibility
|
|
3
|
+
const isWindows = process.platform === "win32";
|
|
4
|
+
export async function executeCommand(command, args, onProgress) {
|
|
5
|
+
return new Promise((resolve, reject) => {
|
|
6
|
+
// Use shell: true on Windows to properly execute .cmd files and resolve PATH
|
|
7
|
+
const childProcess = spawn(command, args, {
|
|
8
|
+
env: process.env,
|
|
9
|
+
shell: isWindows,
|
|
10
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
11
|
+
});
|
|
12
|
+
let stdout = "";
|
|
13
|
+
let stderr = "";
|
|
14
|
+
let isResolved = false;
|
|
15
|
+
let lastReportedLength = 0;
|
|
16
|
+
childProcess.stdout.on("data", (data) => {
|
|
17
|
+
stdout += data.toString();
|
|
18
|
+
// Report new content if callback provided
|
|
19
|
+
if (onProgress && stdout.length > lastReportedLength) {
|
|
20
|
+
const newContent = stdout.substring(lastReportedLength);
|
|
21
|
+
lastReportedLength = stdout.length;
|
|
22
|
+
onProgress(newContent);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
// CLI level errors
|
|
26
|
+
childProcess.stderr.on("data", (data) => {
|
|
27
|
+
stderr += data.toString();
|
|
28
|
+
// find RESOURCE_EXHAUSTED when gemini quota is exceeded
|
|
29
|
+
if (stderr.includes("RESOURCE_EXHAUSTED")) {
|
|
30
|
+
// Quota error details are captured in stderr and propagated via reject
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
childProcess.on("error", (error) => {
|
|
34
|
+
if (!isResolved) {
|
|
35
|
+
isResolved = true;
|
|
36
|
+
reject(new Error(`Failed to spawn command: ${error.message}`));
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
childProcess.on("close", (code) => {
|
|
40
|
+
if (!isResolved) {
|
|
41
|
+
isResolved = true;
|
|
42
|
+
if (code === 0) {
|
|
43
|
+
resolve(stdout.trim());
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
const errorMessage = stderr.trim() || "Unknown error";
|
|
47
|
+
reject(new Error(`Command failed with exit code ${code}: ${errorMessage}`));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=commandExecutor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commandExecutor.js","sourceRoot":"","sources":["../../src/utils/commandExecutor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,kDAAkD;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;AAE/C,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAe,EACf,IAAc,EACd,UAAwC;IAExC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,6EAA6E;QAC7E,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;YACxC,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CAAC,CAAC;QAEH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,IAAI,kBAAkB,GAAG,CAAC,CAAC;QAE3B,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACtC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAE1B,0CAA0C;YAC1C,IAAI,UAAU,IAAI,MAAM,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;gBACrD,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;gBACxD,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC;gBACnC,UAAU,CAAC,UAAU,CAAC,CAAC;YACzB,CAAC;QACH,CAAC,CAAC,CAAC;QAGH,mBAAmB;QACnB,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACtC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1B,wDAAwD;YACxD,IAAI,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;gBAC1C,uEAAuE;YACzE,CAAC;QACH,CAAC,CAAC,CAAC;QACH,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACjC,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,UAAU,GAAG,IAAI,CAAC;gBAClB,MAAM,CAAC,IAAI,KAAK,CAAC,4BAA4B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACjE,CAAC;QACH,CAAC,CAAC,CAAC;QACH,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YAChC,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,UAAU,GAAG,IAAI,CAAC;gBAClB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;oBACf,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBACzB,CAAC;qBAAM,CAAC;oBACN,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,eAAe,CAAC;oBACtD,MAAM,CACJ,IAAI,KAAK,CAAC,iCAAiC,IAAI,KAAK,YAAY,EAAE,CAAC,CACpE,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export declare function executeGeminiCLI(prompt: string, model: string, sandbox?: boolean, changeMode?: boolean, onProgress?: (newOutput: string) => void): Promise<string>;
|
|
2
|
+
export declare function processChangeModeOutput(rawResult: string, chunkIndex?: number, chunkCacheKey?: string, prompt?: string): Promise<string>;
|
|
3
|
+
//# sourceMappingURL=geminiExecutor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geminiExecutor.d.ts","sourceRoot":"","sources":["../../src/utils/geminiExecutor.ts"],"names":[],"mappings":"AAQA,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,OAAO,EACjB,UAAU,CAAC,EAAE,OAAO,EACpB,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,GACvC,OAAO,CAAC,MAAM,CAAC,CAiFjB;AAED,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,MAAM,EACnB,aAAa,CAAC,EAAE,MAAM,EACtB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CA0DjB"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { executeCommand } from './commandExecutor.js';
|
|
2
|
+
import { CLI } from '../constants.js';
|
|
3
|
+
import { parseChangeModeOutput, validateChangeModeEdits } from './changeModeParser.js';
|
|
4
|
+
import { formatChangeModeResponse, summarizeChangeModeEdits } from './changeModeTranslator.js';
|
|
5
|
+
import { chunkChangeModeEdits } from './changeModeChunker.js';
|
|
6
|
+
import { cacheChunks, getChunks } from './chunkCache.js';
|
|
7
|
+
export async function executeGeminiCLI(prompt, model, sandbox, changeMode, onProgress) {
|
|
8
|
+
let prompt_processed = prompt;
|
|
9
|
+
if (changeMode) {
|
|
10
|
+
prompt_processed = prompt.replace(/file:(\S+)/g, '@$1');
|
|
11
|
+
const changeModeInstructions = `
|
|
12
|
+
[CHANGEMODE INSTRUCTIONS]
|
|
13
|
+
You are generating code modifications that will be processed by an automated system. The output format is critical because it enables programmatic application of changes without human intervention.
|
|
14
|
+
|
|
15
|
+
INSTRUCTIONS:
|
|
16
|
+
1. Analyze each provided file thoroughly
|
|
17
|
+
2. Identify locations requiring changes based on the user request
|
|
18
|
+
3. For each change, output in the exact format specified
|
|
19
|
+
4. The OLD section must be EXACTLY what appears in the file (copy-paste exact match)
|
|
20
|
+
5. Provide complete, directly replacing code blocks
|
|
21
|
+
6. Verify line numbers are accurate
|
|
22
|
+
|
|
23
|
+
CRITICAL REQUIREMENTS:
|
|
24
|
+
1. Output edits in the EXACT format specified below - no deviations
|
|
25
|
+
2. The OLD string MUST be findable with Ctrl+F - it must be a unique, exact match
|
|
26
|
+
3. Include enough surrounding lines to make the OLD string unique
|
|
27
|
+
4. If a string appears multiple times (like </div>), include enough context lines above and below to make it unique
|
|
28
|
+
5. Copy the OLD content EXACTLY as it appears - including all whitespace, indentation, line breaks
|
|
29
|
+
6. Never use partial lines - always include complete lines from start to finish
|
|
30
|
+
|
|
31
|
+
OUTPUT FORMAT (follow exactly):
|
|
32
|
+
**FILE: [filename]:[line_number]**
|
|
33
|
+
\\\`\\\`\\\`
|
|
34
|
+
OLD:
|
|
35
|
+
[exact code to be replaced - must match file content precisely]
|
|
36
|
+
NEW:
|
|
37
|
+
[new code to insert - complete and functional]
|
|
38
|
+
\\\`\\\`\\\`
|
|
39
|
+
|
|
40
|
+
EXAMPLE 1 - Simple unique match:
|
|
41
|
+
**FILE: src/utils/helper.js:100**
|
|
42
|
+
\\\`\\\`\\\`
|
|
43
|
+
OLD:
|
|
44
|
+
function getMessage() {
|
|
45
|
+
return "Hello World";
|
|
46
|
+
}
|
|
47
|
+
NEW:
|
|
48
|
+
function getMessage() {
|
|
49
|
+
return "Hello Universe!";
|
|
50
|
+
}
|
|
51
|
+
\\\`\\\`\\\`
|
|
52
|
+
|
|
53
|
+
EXAMPLE 2 - Common tag needing context:
|
|
54
|
+
**FILE: index.html:245**
|
|
55
|
+
\\\`\\\`\\\`
|
|
56
|
+
OLD:
|
|
57
|
+
</div>
|
|
58
|
+
</div>
|
|
59
|
+
</section>
|
|
60
|
+
NEW:
|
|
61
|
+
</div>
|
|
62
|
+
</footer>
|
|
63
|
+
</section>
|
|
64
|
+
\\\`\\\`\\\`
|
|
65
|
+
|
|
66
|
+
IMPORTANT: The OLD section must be an EXACT copy from the file that can be found with Ctrl+F!
|
|
67
|
+
|
|
68
|
+
USER REQUEST:
|
|
69
|
+
${prompt_processed}
|
|
70
|
+
`;
|
|
71
|
+
prompt_processed = changeModeInstructions;
|
|
72
|
+
}
|
|
73
|
+
// Ensure @ symbols work cross-platform by wrapping in quotes if needed
|
|
74
|
+
const finalPrompt = prompt_processed.includes('@') && !prompt_processed.startsWith('"')
|
|
75
|
+
? `"${prompt_processed}"`
|
|
76
|
+
: prompt_processed;
|
|
77
|
+
const args = [CLI.FLAGS.MODEL, model];
|
|
78
|
+
if (sandbox) {
|
|
79
|
+
args.push(CLI.FLAGS.SANDBOX);
|
|
80
|
+
}
|
|
81
|
+
args.push(finalPrompt);
|
|
82
|
+
return executeCommand(CLI.COMMANDS.GEMINI, args, onProgress);
|
|
83
|
+
}
|
|
84
|
+
export async function processChangeModeOutput(rawResult, chunkIndex, chunkCacheKey, prompt) {
|
|
85
|
+
// Check for cached chunks first
|
|
86
|
+
if (chunkIndex && chunkCacheKey) {
|
|
87
|
+
const cachedChunks = getChunks(chunkCacheKey);
|
|
88
|
+
if (cachedChunks && chunkIndex > 0 && chunkIndex <= cachedChunks.length) {
|
|
89
|
+
const chunk = cachedChunks[chunkIndex - 1];
|
|
90
|
+
let result = formatChangeModeResponse(chunk.edits, { current: chunkIndex, total: cachedChunks.length, cacheKey: chunkCacheKey });
|
|
91
|
+
// Add summary for first chunk only
|
|
92
|
+
if (chunkIndex === 1 && chunk.edits.length > 5) {
|
|
93
|
+
const allEdits = cachedChunks.flatMap(c => c.edits);
|
|
94
|
+
result = summarizeChangeModeEdits(allEdits) + '\n\n' + result;
|
|
95
|
+
}
|
|
96
|
+
return result;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// Parse OLD/NEW format
|
|
100
|
+
const edits = parseChangeModeOutput(rawResult);
|
|
101
|
+
if (edits.length === 0) {
|
|
102
|
+
return `No edits found in Gemini's response. Please ensure Gemini uses the OLD/NEW format. \n\n+ ${rawResult}`;
|
|
103
|
+
}
|
|
104
|
+
// Validate edits
|
|
105
|
+
const validation = validateChangeModeEdits(edits);
|
|
106
|
+
if (!validation.valid) {
|
|
107
|
+
return `Edit validation failed:\n${validation.errors.join('\n')}`;
|
|
108
|
+
}
|
|
109
|
+
const chunks = chunkChangeModeEdits(edits);
|
|
110
|
+
// Cache if multiple chunks and we have the original prompt
|
|
111
|
+
let cacheKey;
|
|
112
|
+
if (chunks.length > 1 && prompt) {
|
|
113
|
+
cacheKey = cacheChunks(prompt, chunks);
|
|
114
|
+
}
|
|
115
|
+
// Return requested chunk or first chunk
|
|
116
|
+
const returnChunkIndex = (chunkIndex && chunkIndex > 0 && chunkIndex <= chunks.length) ? chunkIndex : 1;
|
|
117
|
+
const returnChunk = chunks[returnChunkIndex - 1];
|
|
118
|
+
// Format the response
|
|
119
|
+
let result = formatChangeModeResponse(returnChunk.edits, chunks.length > 1 ? { current: returnChunkIndex, total: chunks.length, cacheKey } : undefined);
|
|
120
|
+
// Add summary if helpful (only for first chunk)
|
|
121
|
+
if (returnChunkIndex === 1 && edits.length > 5) {
|
|
122
|
+
result = summarizeChangeModeEdits(edits, chunks.length > 1) + '\n\n' + result;
|
|
123
|
+
}
|
|
124
|
+
return result;
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=geminiExecutor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geminiExecutor.js","sourceRoot":"","sources":["../../src/utils/geminiExecutor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare class Logger {
|
|
2
|
+
private static formatMessage;
|
|
3
|
+
private static writeToFile;
|
|
4
|
+
static log(message: string, ...args: any[]): void;
|
|
5
|
+
static warn(message: string, ...args: any[]): void;
|
|
6
|
+
static error(message: string, ...args: any[]): void;
|
|
7
|
+
static debug(message: string, ...args: any[]): void;
|
|
8
|
+
static toolInvocation(toolName: string, args: any): void;
|
|
9
|
+
static toolParsedArgs(prompt: string, model?: string, sandbox?: boolean, changeMode?: boolean): void;
|
|
10
|
+
static commandExecution(command: string, args: string[], startTime: number): void;
|
|
11
|
+
private static _commandStartTimes;
|
|
12
|
+
static commandComplete(startTime: number, exitCode: number | null, outputLength?: number): void;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAKA,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAC,aAAa;IAI5B,OAAO,CAAC,MAAM,CAAC,WAAW;IAY1B,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAKjD,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAKlD,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAKnD,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAKnD,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI;IAIxD,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,OAAO,GAAG,IAAI;IAIpG,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAKjF,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAA6E;IAE9G,MAAM,CAAC,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;CAQhG"}
|