@rithamnatani/agentmux 1.5.39
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 +440 -0
- package/dist/clientFilter.d.ts +5 -0
- package/dist/clientFilter.d.ts.map +1 -0
- package/dist/clientFilter.js +31 -0
- package/dist/clientFilter.js.map +1 -0
- package/dist/config.d.ts +28 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +112 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.d.ts +115 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +118 -0
- package/dist/constants.js.map +1 -0
- package/dist/execution.d.ts +23 -0
- package/dist/execution.d.ts.map +1 -0
- package/dist/execution.js +2 -0
- package/dist/execution.js.map +1 -0
- package/dist/httpServer.d.ts +12 -0
- package/dist/httpServer.d.ts.map +1 -0
- package/dist/httpServer.js +323 -0
- package/dist/httpServer.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +98 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +19 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +172 -0
- package/dist/logger.js.map +1 -0
- package/dist/modelCatalog.d.ts +15 -0
- package/dist/modelCatalog.d.ts.map +1 -0
- package/dist/modelCatalog.generated.json +80 -0
- package/dist/modelCatalog.js +81 -0
- package/dist/modelCatalog.js.map +1 -0
- package/dist/router/config.d.ts +13 -0
- package/dist/router/config.d.ts.map +1 -0
- package/dist/router/config.js +198 -0
- package/dist/router/config.js.map +1 -0
- package/dist/router/defaultConfig.d.ts +13 -0
- package/dist/router/defaultConfig.d.ts.map +1 -0
- package/dist/router/defaultConfig.js +82 -0
- package/dist/router/defaultConfig.js.map +1 -0
- package/dist/router/executor.d.ts +35 -0
- package/dist/router/executor.d.ts.map +1 -0
- package/dist/router/executor.js +189 -0
- package/dist/router/executor.js.map +1 -0
- package/dist/router/modelMetadata.d.ts +5 -0
- package/dist/router/modelMetadata.d.ts.map +1 -0
- package/dist/router/modelMetadata.js +81 -0
- package/dist/router/modelMetadata.js.map +1 -0
- package/dist/router/quota.d.ts +4 -0
- package/dist/router/quota.d.ts.map +1 -0
- package/dist/router/quota.js +5 -0
- package/dist/router/quota.js.map +1 -0
- package/dist/router/router.d.ts +3 -0
- package/dist/router/router.d.ts.map +1 -0
- package/dist/router/router.js +141 -0
- package/dist/router/router.js.map +1 -0
- package/dist/router/types.d.ts +86 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +2 -0
- package/dist/router/types.js.map +1 -0
- package/dist/routerConfig.d.ts +14 -0
- package/dist/routerConfig.d.ts.map +1 -0
- package/dist/routerConfig.js +194 -0
- package/dist/routerConfig.js.map +1 -0
- package/dist/serverApp.d.ts +43 -0
- package/dist/serverApp.d.ts.map +1 -0
- package/dist/serverApp.js +618 -0
- package/dist/serverApp.js.map +1 -0
- package/dist/service/bootstrap.d.ts +3 -0
- package/dist/service/bootstrap.d.ts.map +1 -0
- package/dist/service/bootstrap.js +32 -0
- package/dist/service/bootstrap.js.map +1 -0
- package/dist/service/manager.d.ts +6 -0
- package/dist/service/manager.d.ts.map +1 -0
- package/dist/service/manager.js +318 -0
- package/dist/service/manager.js.map +1 -0
- package/dist/service/paths.d.ts +10 -0
- package/dist/service/paths.d.ts.map +1 -0
- package/dist/service/paths.js +57 -0
- package/dist/service/paths.js.map +1 -0
- package/dist/service/renderers.d.ts +7 -0
- package/dist/service/renderers.d.ts.map +1 -0
- package/dist/service/renderers.js +110 -0
- package/dist/service/renderers.js.map +1 -0
- package/dist/service/runtime.d.ts +14 -0
- package/dist/service/runtime.d.ts.map +1 -0
- package/dist/service/runtime.js +129 -0
- package/dist/service/runtime.js.map +1 -0
- package/dist/service/types.d.ts +33 -0
- package/dist/service/types.d.ts.map +1 -0
- package/dist/service/types.js +2 -0
- package/dist/service/types.js.map +1 -0
- package/dist/taskClientPolicy.d.ts +16 -0
- package/dist/taskClientPolicy.d.ts.map +1 -0
- package/dist/taskClientPolicy.js +44 -0
- package/dist/taskClientPolicy.js.map +1 -0
- package/dist/taskStore.d.ts +12 -0
- package/dist/taskStore.d.ts.map +1 -0
- package/dist/taskStore.js +30 -0
- package/dist/taskStore.js.map +1 -0
- package/dist/tierConfig.d.ts +16 -0
- package/dist/tierConfig.d.ts.map +1 -0
- package/dist/tierConfig.js +70 -0
- package/dist/tierConfig.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 +30 -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 +29 -0
- package/dist/tools/ask-codex.tool.js.map +1 -0
- package/dist/tools/ask-cursor.tool.d.ts +3 -0
- package/dist/tools/ask-cursor.tool.d.ts.map +1 -0
- package/dist/tools/ask-cursor.tool.js +30 -0
- package/dist/tools/ask-cursor.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 +40 -0
- package/dist/tools/ask-gemini.tool.js.map +1 -0
- package/dist/tools/ask-opencode.tool.d.ts +3 -0
- package/dist/tools/ask-opencode.tool.d.ts.map +1 -0
- package/dist/tools/ask-opencode.tool.js +29 -0
- package/dist/tools/ask-opencode.tool.js.map +1 -0
- package/dist/tools/ask-router.tool.d.ts +20 -0
- package/dist/tools/ask-router.tool.d.ts.map +1 -0
- package/dist/tools/ask-router.tool.js +550 -0
- package/dist/tools/ask-router.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/get-run.tool.d.ts +3 -0
- package/dist/tools/get-run.tool.d.ts.map +1 -0
- package/dist/tools/get-run.tool.js +53 -0
- package/dist/tools/get-run.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 +12 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +59 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/opencode-copilot-usage.tool.d.ts +3 -0
- package/dist/tools/opencode-copilot-usage.tool.d.ts.map +1 -0
- package/dist/tools/opencode-copilot-usage.tool.js +85 -0
- package/dist/tools/opencode-copilot-usage.tool.js.map +1 -0
- package/dist/tools/recommend-route.tool.d.ts +3 -0
- package/dist/tools/recommend-route.tool.d.ts.map +1 -0
- package/dist/tools/recommend-route.tool.js +88 -0
- package/dist/tools/recommend-route.tool.js.map +1 -0
- package/dist/tools/registry.d.ts +31 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +105 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/simple-tools.d.ts +12 -0
- package/dist/tools/simple-tools.d.ts.map +1 -0
- package/dist/tools/simple-tools.js +121 -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/tiered-request.tool.d.ts +3 -0
- package/dist/tools/tiered-request.tool.d.ts.map +1 -0
- package/dist/tools/tiered-request.tool.js +147 -0
- package/dist/tools/tiered-request.tool.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 +3 -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 +20 -0
- package/dist/utils/cliDetector.d.ts.map +1 -0
- package/dist/utils/cliDetector.js +95 -0
- package/dist/utils/cliDetector.js.map +1 -0
- package/dist/utils/codexExecutor.d.ts +3 -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 +29 -0
- package/dist/utils/commandExecutor.d.ts.map +1 -0
- package/dist/utils/commandExecutor.js +487 -0
- package/dist/utils/commandExecutor.js.map +1 -0
- package/dist/utils/cursorCli.d.ts +3 -0
- package/dist/utils/cursorCli.d.ts.map +1 -0
- package/dist/utils/cursorCli.js +20 -0
- package/dist/utils/cursorCli.js.map +1 -0
- package/dist/utils/cursorExecutor.d.ts +3 -0
- package/dist/utils/cursorExecutor.d.ts.map +1 -0
- package/dist/utils/cursorExecutor.js +22 -0
- package/dist/utils/cursorExecutor.js.map +1 -0
- package/dist/utils/geminiExecutor.d.ts +4 -0
- package/dist/utils/geminiExecutor.d.ts.map +1 -0
- package/dist/utils/geminiExecutor.js +131 -0
- package/dist/utils/geminiExecutor.js.map +1 -0
- package/dist/utils/githubCli.d.ts +22 -0
- package/dist/utils/githubCli.d.ts.map +1 -0
- package/dist/utils/githubCli.js +131 -0
- package/dist/utils/githubCli.js.map +1 -0
- package/dist/utils/opencodeCatalog.d.ts +33 -0
- package/dist/utils/opencodeCatalog.d.ts.map +1 -0
- package/dist/utils/opencodeCatalog.js +171 -0
- package/dist/utils/opencodeCatalog.js.map +1 -0
- package/dist/utils/opencodeExecutor.d.ts +3 -0
- package/dist/utils/opencodeExecutor.d.ts.map +1 -0
- package/dist/utils/opencodeExecutor.js +16 -0
- package/dist/utils/opencodeExecutor.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/dist/utils/worktrunkIsolation.d.ts +26 -0
- package/dist/utils/worktrunkIsolation.d.ts.map +1 -0
- package/dist/utils/worktrunkIsolation.js +80 -0
- package/dist/utils/worktrunkIsolation.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,131 @@
|
|
|
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, approvalMode, skipTrust, context) {
|
|
8
|
+
let prompt_processed = prompt;
|
|
9
|
+
if (prompt.includes('./') || prompt.includes('@./') || prompt.includes('@/') || / (directory|folder|root)\b/i.test(prompt)) {
|
|
10
|
+
prompt_processed += "\n\nNote: When referencing project roots or directories, recommend excluding common large or build directories (e.g., node_modules, .git, .venv, __pycache__, .pytest_cache, dist, build) unless explicitly needed.";
|
|
11
|
+
}
|
|
12
|
+
if (changeMode) {
|
|
13
|
+
prompt_processed = prompt_processed.replace(/file:(\S+)/g, '@$1');
|
|
14
|
+
const changeModeInstructions = `
|
|
15
|
+
[CHANGEMODE INSTRUCTIONS]
|
|
16
|
+
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.
|
|
17
|
+
|
|
18
|
+
INSTRUCTIONS:
|
|
19
|
+
1. Analyze each provided file thoroughly
|
|
20
|
+
2. Identify locations requiring changes based on the user request
|
|
21
|
+
3. For each change, output in the exact format specified
|
|
22
|
+
4. The OLD section must be EXACTLY what appears in the file (copy-paste exact match)
|
|
23
|
+
5. Provide complete, directly replacing code blocks
|
|
24
|
+
6. Verify line numbers are accurate
|
|
25
|
+
|
|
26
|
+
CRITICAL REQUIREMENTS:
|
|
27
|
+
1. Output edits in the EXACT format specified below - no deviations
|
|
28
|
+
2. The OLD string MUST be findable with Ctrl+F - it must be a unique, exact match
|
|
29
|
+
3. Include enough surrounding lines to make the OLD string unique
|
|
30
|
+
4. If a string appears multiple times (like </div>), include enough context lines above and below to make it unique
|
|
31
|
+
5. Copy the OLD content EXACTLY as it appears - including all whitespace, indentation, line breaks
|
|
32
|
+
6. Never use partial lines - always include complete lines from start to finish
|
|
33
|
+
|
|
34
|
+
OUTPUT FORMAT (follow exactly):
|
|
35
|
+
**FILE: [filename]:[line_number]**
|
|
36
|
+
\\\`\\\`\\\`
|
|
37
|
+
OLD:
|
|
38
|
+
[exact code to be replaced - must match file content precisely]
|
|
39
|
+
NEW:
|
|
40
|
+
[new code to insert - complete and functional]
|
|
41
|
+
\\\`\\\`\\\`
|
|
42
|
+
|
|
43
|
+
EXAMPLE 1 - Simple unique match:
|
|
44
|
+
**FILE: src/utils/helper.js:100**
|
|
45
|
+
\\\`\\\`\\\`
|
|
46
|
+
OLD:
|
|
47
|
+
function getMessage() {
|
|
48
|
+
return "Hello World";
|
|
49
|
+
}
|
|
50
|
+
NEW:
|
|
51
|
+
function getMessage() {
|
|
52
|
+
return "Hello Universe!";
|
|
53
|
+
}
|
|
54
|
+
\\\`\\\`\\\`
|
|
55
|
+
|
|
56
|
+
EXAMPLE 2 - Common tag needing context:
|
|
57
|
+
**FILE: index.html:245**
|
|
58
|
+
\\\`\\\`\\\`
|
|
59
|
+
OLD:
|
|
60
|
+
</div>
|
|
61
|
+
</div>
|
|
62
|
+
</section>
|
|
63
|
+
NEW:
|
|
64
|
+
</div>
|
|
65
|
+
</footer>
|
|
66
|
+
</section>
|
|
67
|
+
\\\`\\\`\\\`
|
|
68
|
+
|
|
69
|
+
IMPORTANT: The OLD section must be an EXACT copy from the file that can be found with Ctrl+F!
|
|
70
|
+
|
|
71
|
+
USER REQUEST:
|
|
72
|
+
${prompt_processed}
|
|
73
|
+
`;
|
|
74
|
+
prompt_processed = changeModeInstructions;
|
|
75
|
+
}
|
|
76
|
+
const args = [CLI.FLAGS.MODEL, model];
|
|
77
|
+
if (sandbox) {
|
|
78
|
+
args.push(CLI.FLAGS.SANDBOX);
|
|
79
|
+
}
|
|
80
|
+
if (approvalMode && approvalMode !== 'default') {
|
|
81
|
+
args.push(CLI.FLAGS.APPROVAL_MODE, approvalMode);
|
|
82
|
+
}
|
|
83
|
+
if (skipTrust) {
|
|
84
|
+
args.push(CLI.FLAGS.SKIP_TRUST);
|
|
85
|
+
}
|
|
86
|
+
args.push(CLI.FLAGS.PROMPT, prompt_processed);
|
|
87
|
+
return executeCommand(CLI.COMMANDS.GEMINI, args, context);
|
|
88
|
+
}
|
|
89
|
+
export async function processChangeModeOutput(rawResult, chunkIndex, chunkCacheKey, prompt) {
|
|
90
|
+
// Check for cached chunks first
|
|
91
|
+
if (chunkIndex && chunkCacheKey) {
|
|
92
|
+
const cachedChunks = getChunks(chunkCacheKey);
|
|
93
|
+
if (cachedChunks && chunkIndex > 0 && chunkIndex <= cachedChunks.length) {
|
|
94
|
+
const chunk = cachedChunks[chunkIndex - 1];
|
|
95
|
+
let result = formatChangeModeResponse(chunk.edits, { current: chunkIndex, total: cachedChunks.length, cacheKey: chunkCacheKey });
|
|
96
|
+
// Add summary for first chunk only
|
|
97
|
+
if (chunkIndex === 1 && chunk.edits.length > 5) {
|
|
98
|
+
const allEdits = cachedChunks.flatMap(c => c.edits);
|
|
99
|
+
result = summarizeChangeModeEdits(allEdits) + '\n\n' + result;
|
|
100
|
+
}
|
|
101
|
+
return result;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Parse OLD/NEW format
|
|
105
|
+
const edits = parseChangeModeOutput(rawResult);
|
|
106
|
+
if (edits.length === 0) {
|
|
107
|
+
return `No edits found in Gemini's response. Please ensure Gemini uses the OLD/NEW format. \n\n+ ${rawResult}`;
|
|
108
|
+
}
|
|
109
|
+
// Validate edits
|
|
110
|
+
const validation = validateChangeModeEdits(edits);
|
|
111
|
+
if (!validation.valid) {
|
|
112
|
+
return `Edit validation failed:\n${validation.errors.join('\n')}`;
|
|
113
|
+
}
|
|
114
|
+
const chunks = chunkChangeModeEdits(edits);
|
|
115
|
+
// Cache if multiple chunks and we have the original prompt
|
|
116
|
+
let cacheKey;
|
|
117
|
+
if (chunks.length > 1 && prompt) {
|
|
118
|
+
cacheKey = cacheChunks(prompt, chunks);
|
|
119
|
+
}
|
|
120
|
+
// Return requested chunk or first chunk
|
|
121
|
+
const returnChunkIndex = (chunkIndex && chunkIndex > 0 && chunkIndex <= chunks.length) ? chunkIndex : 1;
|
|
122
|
+
const returnChunk = chunks[returnChunkIndex - 1];
|
|
123
|
+
// Format the response
|
|
124
|
+
let result = formatChangeModeResponse(returnChunk.edits, chunks.length > 1 ? { current: returnChunkIndex, total: chunks.length, cacheKey } : undefined);
|
|
125
|
+
// Add summary if helpful (only for first chunk)
|
|
126
|
+
if (returnChunkIndex === 1 && edits.length > 5) {
|
|
127
|
+
result = summarizeChangeModeEdits(edits, chunks.length > 1) + '\n\n' + result;
|
|
128
|
+
}
|
|
129
|
+
return result;
|
|
130
|
+
}
|
|
131
|
+
//# 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,22 @@
|
|
|
1
|
+
import { ToolExecutionContext } from '../execution.js';
|
|
2
|
+
export type GhFailureKind = 'missing-cli' | 'unauthenticated' | 'forbidden' | 'not-found' | 'failed';
|
|
3
|
+
export declare class GhCliError extends Error {
|
|
4
|
+
readonly kind: GhFailureKind;
|
|
5
|
+
readonly details: {
|
|
6
|
+
command: string;
|
|
7
|
+
args: string[];
|
|
8
|
+
exitCode?: number | null;
|
|
9
|
+
stdout?: string;
|
|
10
|
+
stderr?: string;
|
|
11
|
+
};
|
|
12
|
+
constructor(kind: GhFailureKind, message: string, details: {
|
|
13
|
+
command: string;
|
|
14
|
+
args: string[];
|
|
15
|
+
exitCode?: number | null;
|
|
16
|
+
stdout?: string;
|
|
17
|
+
stderr?: string;
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
export declare function executeGhCommand(args: string[], context?: ToolExecutionContext): Promise<string>;
|
|
21
|
+
export declare function executeGhApi(args: string[], context?: ToolExecutionContext): Promise<string>;
|
|
22
|
+
//# sourceMappingURL=githubCli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"githubCli.d.ts","sourceRoot":"","sources":["../../src/utils/githubCli.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEvD,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG,iBAAiB,GAAG,WAAW,GAAG,WAAW,GAAG,QAAQ,CAAC;AAErG,qBAAa,UAAW,SAAQ,KAAK;aAEjB,IAAI,EAAE,aAAa;aAEnB,OAAO,EAAE;QACvB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,EAAE,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB;gBARe,IAAI,EAAE,aAAa,EACnC,OAAO,EAAE,MAAM,EACC,OAAO,EAAE;QACvB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,EAAE,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB;CAKJ;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,MAAM,CAAC,CA8HjB;AAED,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,MAAM,CAAC,CAEjB"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { spawn } from 'child_process';
|
|
2
|
+
export class GhCliError extends Error {
|
|
3
|
+
kind;
|
|
4
|
+
details;
|
|
5
|
+
constructor(kind, message, details) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.kind = kind;
|
|
8
|
+
this.details = details;
|
|
9
|
+
this.name = 'GhCliError';
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export async function executeGhCommand(args, context) {
|
|
13
|
+
const command = 'gh';
|
|
14
|
+
const { onProgress, signal, timeoutMs, killGraceMs = 5000, cwd, env, logger } = context ?? {};
|
|
15
|
+
return new Promise((resolve, reject) => {
|
|
16
|
+
const child = spawn(command, args, {
|
|
17
|
+
cwd,
|
|
18
|
+
env,
|
|
19
|
+
shell: false,
|
|
20
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
21
|
+
});
|
|
22
|
+
let stdout = '';
|
|
23
|
+
let stderr = '';
|
|
24
|
+
let settled = false;
|
|
25
|
+
let timeoutHandle;
|
|
26
|
+
let killGraceHandle;
|
|
27
|
+
const cleanup = () => {
|
|
28
|
+
if (timeoutHandle)
|
|
29
|
+
clearTimeout(timeoutHandle);
|
|
30
|
+
if (killGraceHandle)
|
|
31
|
+
clearTimeout(killGraceHandle);
|
|
32
|
+
signal?.removeEventListener('abort', onAbort);
|
|
33
|
+
};
|
|
34
|
+
const settleResolve = (value) => {
|
|
35
|
+
if (settled)
|
|
36
|
+
return;
|
|
37
|
+
settled = true;
|
|
38
|
+
cleanup();
|
|
39
|
+
resolve(value.trim());
|
|
40
|
+
};
|
|
41
|
+
const settleReject = (error) => {
|
|
42
|
+
if (settled)
|
|
43
|
+
return;
|
|
44
|
+
settled = true;
|
|
45
|
+
cleanup();
|
|
46
|
+
reject(error);
|
|
47
|
+
};
|
|
48
|
+
const killChild = (force) => {
|
|
49
|
+
try {
|
|
50
|
+
process.kill(-child.pid, force ? 'SIGKILL' : 'SIGTERM');
|
|
51
|
+
}
|
|
52
|
+
catch { }
|
|
53
|
+
};
|
|
54
|
+
const onAbort = () => {
|
|
55
|
+
killChild(false);
|
|
56
|
+
settleReject(new Error('GitHub CLI command cancelled'));
|
|
57
|
+
};
|
|
58
|
+
if (signal?.aborted) {
|
|
59
|
+
onAbort();
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
63
|
+
if (timeoutMs) {
|
|
64
|
+
timeoutHandle = setTimeout(() => {
|
|
65
|
+
killChild(false);
|
|
66
|
+
killGraceHandle = setTimeout(() => killChild(true), killGraceMs);
|
|
67
|
+
settleReject(new Error(`GitHub CLI command timed out after ${timeoutMs}ms`));
|
|
68
|
+
}, timeoutMs);
|
|
69
|
+
}
|
|
70
|
+
logger?.info('gh_command_spawn_requested', { command, args });
|
|
71
|
+
child.stdout.on('data', (chunk) => {
|
|
72
|
+
const text = chunk.toString();
|
|
73
|
+
stdout += text;
|
|
74
|
+
onProgress?.(text);
|
|
75
|
+
});
|
|
76
|
+
child.stderr.on('data', (chunk) => {
|
|
77
|
+
stderr += chunk.toString();
|
|
78
|
+
});
|
|
79
|
+
child.on('error', (error) => {
|
|
80
|
+
if (error.code === 'ENOENT') {
|
|
81
|
+
settleReject(new GhCliError('missing-cli', 'GitHub CLI `gh` is not installed. Install it and try again.', {
|
|
82
|
+
command,
|
|
83
|
+
args,
|
|
84
|
+
}));
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
settleReject(new GhCliError('failed', `Failed to start GitHub CLI: ${error.message}`, {
|
|
88
|
+
command,
|
|
89
|
+
args,
|
|
90
|
+
stderr,
|
|
91
|
+
stdout,
|
|
92
|
+
}));
|
|
93
|
+
});
|
|
94
|
+
child.on('close', (code) => {
|
|
95
|
+
if (code === 0) {
|
|
96
|
+
settleResolve(stdout);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const combined = `${stderr}\n${stdout}`.toLowerCase();
|
|
100
|
+
let kind = 'failed';
|
|
101
|
+
let message = `GitHub CLI command failed with exit code ${code ?? 'unknown'}`;
|
|
102
|
+
if (combined.includes('not authenticated') || combined.includes('authentication failed') || combined.includes('could not find a credential')) {
|
|
103
|
+
kind = 'unauthenticated';
|
|
104
|
+
message = 'GitHub CLI is not authenticated. Run `gh auth login` (or `gh auth status`) and try again.';
|
|
105
|
+
}
|
|
106
|
+
else if (combined.includes('missing required scope') || combined.includes('resource not accessible by personal access token') || combined.includes('insufficient scopes') || combined.includes('forbidden')) {
|
|
107
|
+
kind = 'forbidden';
|
|
108
|
+
message = 'GitHub CLI is authenticated, but the token is missing the scope needed for Copilot premium request usage. Re-authenticate with the required GitHub Copilot permissions and retry. If needed, run `gh auth refresh -h github.com -s user`.';
|
|
109
|
+
}
|
|
110
|
+
else if (code === 404 || combined.includes('404 not found') || combined.includes('not found')) {
|
|
111
|
+
kind = 'not-found';
|
|
112
|
+
message = 'GitHub returned 404 for this Copilot usage request. Verify the username and requested date range, then retry.';
|
|
113
|
+
}
|
|
114
|
+
else if (code === 403 || combined.includes('403 forbidden') || combined.includes('forbidden')) {
|
|
115
|
+
kind = 'forbidden';
|
|
116
|
+
message = 'GitHub returned 403 for this Copilot usage request. Check `gh auth status`, ensure the authenticated account can read Copilot premium request usage, and if needed run `gh auth refresh -h github.com -s user`.';
|
|
117
|
+
}
|
|
118
|
+
settleReject(new GhCliError(kind, message, {
|
|
119
|
+
command,
|
|
120
|
+
args,
|
|
121
|
+
exitCode: code,
|
|
122
|
+
stdout,
|
|
123
|
+
stderr,
|
|
124
|
+
}));
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
export async function executeGhApi(args, context) {
|
|
129
|
+
return executeGhCommand(['api', ...args], context);
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=githubCli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"githubCli.js","sourceRoot":"","sources":["../../src/utils/githubCli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { TierName } from '../tierConfig.js';
|
|
2
|
+
export interface OpencodeClassification {
|
|
3
|
+
fast: string[];
|
|
4
|
+
balanced: string[];
|
|
5
|
+
powerful: string[];
|
|
6
|
+
}
|
|
7
|
+
export interface OpencodeCacheFile {
|
|
8
|
+
hash: string;
|
|
9
|
+
classifications: OpencodeClassification;
|
|
10
|
+
}
|
|
11
|
+
export declare function getCacheDir(): string;
|
|
12
|
+
export declare function getCachePath(): string;
|
|
13
|
+
export declare function listOpencodeModels(): Promise<string[]>;
|
|
14
|
+
export declare function hashModelList(models: string[]): string;
|
|
15
|
+
export declare function readCache(): Promise<OpencodeCacheFile | null>;
|
|
16
|
+
export declare function writeCache(cache: OpencodeCacheFile): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Classify a single model into a tier using name-based heuristics.
|
|
19
|
+
* Returns 'fast', 'powerful', or 'balanced' (default).
|
|
20
|
+
*/
|
|
21
|
+
export declare function classifyModelByName(model: string): TierName;
|
|
22
|
+
/**
|
|
23
|
+
* Classify all models using heuristics. Instant and requires no API calls.
|
|
24
|
+
*/
|
|
25
|
+
export declare function classifyModelsViaHeuristics(models: string[]): OpencodeClassification;
|
|
26
|
+
/**
|
|
27
|
+
* Get the classified OpenCode model catalog.
|
|
28
|
+
* Runs `opencode models` to discover available models, then classifies via heuristics.
|
|
29
|
+
* Caches results so repeated calls with the same model set are instant.
|
|
30
|
+
*/
|
|
31
|
+
export declare function getOpencodeClassifiedCatalog(): Promise<string>;
|
|
32
|
+
export declare function formatOpencodeCatalog(classifications: OpencodeClassification): string;
|
|
33
|
+
//# sourceMappingURL=opencodeCatalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencodeCatalog.d.ts","sourceRoot":"","sources":["../../src/utils/opencodeCatalog.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAIjD,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,sBAAsB,CAAC;CACzC;AAID,wBAAgB,WAAW,IAAI,MAAM,CAcpC;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAOD,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAW5D;AAID,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAGtD;AAID,wBAAsB,SAAS,IAAI,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAWnE;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAIxE;AAmCD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,CAQ3D;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,sBAAsB,CAapF;AAID;;;;GAIG;AACH,wBAAsB,4BAA4B,IAAI,OAAO,CAAC,MAAM,CAAC,CAsBpE;AAUD,wBAAgB,qBAAqB,CAAC,eAAe,EAAE,sBAAsB,GAAG,MAAM,CAmBrF"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { homedir, platform } from 'node:os';
|
|
5
|
+
import { executeCommand } from './commandExecutor.js';
|
|
6
|
+
import { CLI } from '../constants.js';
|
|
7
|
+
import { TIER_CONFIG, CLI_NOTES } from '../tierConfig.js';
|
|
8
|
+
// ── Cache location ───────────────────────────────────────────────────────────
|
|
9
|
+
export function getCacheDir() {
|
|
10
|
+
if (process.env.AGENTMUX_CACHE_DIR) {
|
|
11
|
+
return process.env.AGENTMUX_CACHE_DIR;
|
|
12
|
+
}
|
|
13
|
+
const os = platform();
|
|
14
|
+
if (os === 'darwin') {
|
|
15
|
+
return join(homedir(), 'Library', 'Caches', 'agentmux');
|
|
16
|
+
}
|
|
17
|
+
if (os === 'win32') {
|
|
18
|
+
return join(process.env.LOCALAPPDATA || join(homedir(), 'AppData', 'Local'), 'agentmux');
|
|
19
|
+
}
|
|
20
|
+
// Linux / other: XDG_CACHE_HOME or ~/.cache
|
|
21
|
+
return join(process.env.XDG_CACHE_HOME || join(homedir(), '.cache'), 'agentmux');
|
|
22
|
+
}
|
|
23
|
+
export function getCachePath() {
|
|
24
|
+
return join(getCacheDir(), 'agentmux-opencode.json');
|
|
25
|
+
}
|
|
26
|
+
// ── Model discovery ──────────────────────────────────────────────────────────
|
|
27
|
+
/** Patterns that indicate a model is not suitable for text generation */
|
|
28
|
+
const EMBEDDING_PATTERNS = /embedding|embed[-_]|rerank/i;
|
|
29
|
+
export async function listOpencodeModels() {
|
|
30
|
+
const raw = await executeCommand(CLI.COMMANDS.OPENCODE, [CLI.OPENCODE_SUBCOMMANDS.MODELS]);
|
|
31
|
+
return raw
|
|
32
|
+
.split('\n')
|
|
33
|
+
.map(line => line.trim())
|
|
34
|
+
.filter(line => line.length > 0 && line.includes('/'))
|
|
35
|
+
.filter(line => !EMBEDDING_PATTERNS.test(line));
|
|
36
|
+
}
|
|
37
|
+
// ── Hashing ──────────────────────────────────────────────────────────────────
|
|
38
|
+
export function hashModelList(models) {
|
|
39
|
+
const sorted = [...models].sort();
|
|
40
|
+
return createHash('sha256').update(sorted.join('\n')).digest('hex');
|
|
41
|
+
}
|
|
42
|
+
// ── Cache read/write ─────────────────────────────────────────────────────────
|
|
43
|
+
export async function readCache() {
|
|
44
|
+
try {
|
|
45
|
+
const raw = await readFile(getCachePath(), 'utf-8');
|
|
46
|
+
const parsed = JSON.parse(raw);
|
|
47
|
+
if (parsed.hash && parsed.classifications) {
|
|
48
|
+
return parsed;
|
|
49
|
+
}
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export async function writeCache(cache) {
|
|
57
|
+
const dir = getCacheDir();
|
|
58
|
+
await mkdir(dir, { recursive: true });
|
|
59
|
+
await writeFile(getCachePath(), JSON.stringify(cache, null, 2), 'utf-8');
|
|
60
|
+
}
|
|
61
|
+
// ── Heuristic-based classification ──────────────────────────────────────────
|
|
62
|
+
/**
|
|
63
|
+
* Name patterns → tier mapping. Checked in order; first match wins.
|
|
64
|
+
* Patterns are tested against the full model identifier (provider/name).
|
|
65
|
+
*/
|
|
66
|
+
const FAST_PATTERNS = [
|
|
67
|
+
/\bflash-lite\b/i,
|
|
68
|
+
/\bnano\b/i,
|
|
69
|
+
/\bmini\b/i,
|
|
70
|
+
/\bsmall\b/i,
|
|
71
|
+
/\b8b\b/i,
|
|
72
|
+
/\b3b\b/i,
|
|
73
|
+
/\bhaiku\b/i,
|
|
74
|
+
/\blite\b/i,
|
|
75
|
+
/\bMiMo\b/,
|
|
76
|
+
];
|
|
77
|
+
const POWERFUL_PATTERNS = [
|
|
78
|
+
/\bopus\b/i,
|
|
79
|
+
/\b405b\b/i,
|
|
80
|
+
/\bgpt-5\.4\b/i,
|
|
81
|
+
/\bo3\b/i,
|
|
82
|
+
/\bo1\b/i,
|
|
83
|
+
/\bDeepSeek-R1\b/,
|
|
84
|
+
/\bpro\b/i,
|
|
85
|
+
/\b235b\b/i,
|
|
86
|
+
/\b120b\b/i,
|
|
87
|
+
/\b480b\b/i,
|
|
88
|
+
/\b397b\b/i,
|
|
89
|
+
/\bCoder-Next\b/,
|
|
90
|
+
];
|
|
91
|
+
/**
|
|
92
|
+
* Classify a single model into a tier using name-based heuristics.
|
|
93
|
+
* Returns 'fast', 'powerful', or 'balanced' (default).
|
|
94
|
+
*/
|
|
95
|
+
export function classifyModelByName(model) {
|
|
96
|
+
for (const pattern of FAST_PATTERNS) {
|
|
97
|
+
if (pattern.test(model))
|
|
98
|
+
return 'fast';
|
|
99
|
+
}
|
|
100
|
+
for (const pattern of POWERFUL_PATTERNS) {
|
|
101
|
+
if (pattern.test(model))
|
|
102
|
+
return 'powerful';
|
|
103
|
+
}
|
|
104
|
+
return 'balanced';
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Classify all models using heuristics. Instant and requires no API calls.
|
|
108
|
+
*/
|
|
109
|
+
export function classifyModelsViaHeuristics(models) {
|
|
110
|
+
const fast = [];
|
|
111
|
+
const balanced = [];
|
|
112
|
+
const powerful = [];
|
|
113
|
+
for (const model of models) {
|
|
114
|
+
const tier = classifyModelByName(model);
|
|
115
|
+
if (tier === 'fast')
|
|
116
|
+
fast.push(model);
|
|
117
|
+
else if (tier === 'powerful')
|
|
118
|
+
powerful.push(model);
|
|
119
|
+
else
|
|
120
|
+
balanced.push(model);
|
|
121
|
+
}
|
|
122
|
+
return { fast, balanced, powerful };
|
|
123
|
+
}
|
|
124
|
+
// ── Orchestrator ─────────────────────────────────────────────────────────────
|
|
125
|
+
/**
|
|
126
|
+
* Get the classified OpenCode model catalog.
|
|
127
|
+
* Runs `opencode models` to discover available models, then classifies via heuristics.
|
|
128
|
+
* Caches results so repeated calls with the same model set are instant.
|
|
129
|
+
*/
|
|
130
|
+
export async function getOpencodeClassifiedCatalog() {
|
|
131
|
+
const models = await listOpencodeModels();
|
|
132
|
+
if (models.length === 0) {
|
|
133
|
+
return 'No models available. Ensure providers are configured via `opencode auth login`.';
|
|
134
|
+
}
|
|
135
|
+
const hash = hashModelList(models);
|
|
136
|
+
const cache = await readCache();
|
|
137
|
+
let classifications;
|
|
138
|
+
if (cache && cache.hash === hash) {
|
|
139
|
+
classifications = cache.classifications;
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
classifications = classifyModelsViaHeuristics(models);
|
|
143
|
+
// Write cache (fire-and-forget, don't block response)
|
|
144
|
+
writeCache({ hash, classifications }).catch(() => { });
|
|
145
|
+
}
|
|
146
|
+
return formatOpencodeCatalog(classifications);
|
|
147
|
+
}
|
|
148
|
+
// ── Formatting ───────────────────────────────────────────────────────────────
|
|
149
|
+
const SELECTION_RULE = `MODEL SELECTION RULE: Default to the "balanced" tier for most tasks. ` +
|
|
150
|
+
`Use "powerful" for complex reasoning, architecture, nuanced analysis, or when quality matters most. ` +
|
|
151
|
+
`Reserve "fast" only for trivial lookups, simple math, or quick one-line answers. ` +
|
|
152
|
+
`Models are in provider/model format — use the full string (e.g., "google-vertex/gemini-2.5-flash") when calling Ask-OpenCode.\n`;
|
|
153
|
+
export function formatOpencodeCatalog(classifications) {
|
|
154
|
+
const lines = [
|
|
155
|
+
`OPENCODE — Available Models\n`,
|
|
156
|
+
SELECTION_RULE,
|
|
157
|
+
];
|
|
158
|
+
for (const tierName of ['fast', 'balanced', 'powerful']) {
|
|
159
|
+
const models = classifications[tierName];
|
|
160
|
+
if (!models || models.length === 0)
|
|
161
|
+
continue;
|
|
162
|
+
const config = TIER_CONFIG.opencode[tierName];
|
|
163
|
+
lines.push(`[${tierName.toUpperCase()}] ${config.label}`);
|
|
164
|
+
lines.push(` Use when: ${config.useWhen}`);
|
|
165
|
+
lines.push(` Model IDs: ${models.join(', ')}`);
|
|
166
|
+
lines.push('');
|
|
167
|
+
}
|
|
168
|
+
lines.push(`> ${CLI_NOTES.opencode}`);
|
|
169
|
+
return lines.join('\n');
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=opencodeCatalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencodeCatalog.js","sourceRoot":"","sources":["../../src/utils/opencodeCatalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAgB1D,gFAAgF;AAEhF,MAAM,UAAU,WAAW;IACzB,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC;QACnC,OAAO,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IACxC,CAAC;IAED,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAC;IACtB,IAAI,EAAE,KAAK,QAAQ,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,EAAE,KAAK,OAAO,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC;IAC3F,CAAC;IACD,4CAA4C;IAC5C,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,EAAE,UAAU,CAAC,CAAC;AACnF,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,wBAAwB,CAAC,CAAC;AACvD,CAAC;AAED,gFAAgF;AAEhF,yEAAyE;AACzE,MAAM,kBAAkB,GAAG,6BAA6B,CAAC;AAEzD,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,GAAG,GAAG,MAAM,cAAc,CAC9B,GAAG,CAAC,QAAQ,CAAC,QAAQ,EACrB,CAAC,GAAG,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAClC,CAAC;IAEF,OAAO,GAAG;SACP,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SACxB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;SACrD,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,gFAAgF;AAEhF,MAAM,UAAU,aAAa,CAAC,MAAgB;IAC5C,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAClC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACtE,CAAC;AAED,gFAAgF;AAEhF,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAsB,CAAC;QACpD,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;YAC1C,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAwB;IACvD,MAAM,GAAG,GAAG,WAAW,EAAE,CAAC;IAC1B,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,MAAM,SAAS,CAAC,YAAY,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAC3E,CAAC;AAED,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,aAAa,GAAG;IACpB,iBAAiB;IACjB,WAAW;IACX,WAAW;IACX,YAAY;IACZ,SAAS;IACT,SAAS;IACT,YAAY;IACZ,WAAW;IACX,UAAU;CACX,CAAC;AAEF,MAAM,iBAAiB,GAAG;IACxB,WAAW;IACX,WAAW;IACX,eAAe;IACf,SAAS;IACT,SAAS;IACT,iBAAiB;IACjB,UAAU;IACV,WAAW;IACX,WAAW;IACX,WAAW;IACX,WAAW;IACX,gBAAgB;CACjB,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,KAAK,MAAM,OAAO,IAAI,aAAa,EAAE,CAAC;QACpC,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC;IACzC,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,iBAAiB,EAAE,CAAC;QACxC,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,UAAU,CAAC;IAC7C,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,2BAA2B,CAAC,MAAgB;IAC1D,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,IAAI,KAAK,MAAM;YAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aACjC,IAAI,IAAI,KAAK,UAAU;YAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;;YAC9C,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AACtC,CAAC;AAED,gFAAgF;AAEhF;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B;IAChD,MAAM,MAAM,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAE1C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,iFAAiF,CAAC;IAC3F,CAAC;IAED,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;IAEhC,IAAI,eAAuC,CAAC;IAE5C,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACjC,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC;IAC1C,CAAC;SAAM,CAAC;QACN,eAAe,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAC;QAEtD,sDAAsD;QACtD,UAAU,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,qBAAqB,CAAC,eAAe,CAAC,CAAC;AAChD,CAAC;AAED,gFAAgF;AAEhF,MAAM,cAAc,GAClB,uEAAuE;IACvE,sGAAsG;IACtG,mFAAmF;IACnF,iIAAiI,CAAC;AAEpI,MAAM,UAAU,qBAAqB,CAAC,eAAuC;IAC3E,MAAM,KAAK,GAAa;QACtB,+BAA+B;QAC/B,cAAc;KACf,CAAC;IAEF,KAAK,MAAM,QAAQ,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,CAAe,EAAE,CAAC;QACtE,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAE7C,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC9C,KAAK,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAC1D,KAAK,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;IACtC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { ToolExecutionContext } from '../execution.js';
|
|
2
|
+
export declare function executeOpencodeCLI(prompt: string, model: string, variantOrContext?: string | ToolExecutionContext, maybeContext?: ToolExecutionContext): Promise<string>;
|
|
3
|
+
//# sourceMappingURL=opencodeExecutor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencodeExecutor.d.ts","sourceRoot":"","sources":["../../src/utils/opencodeExecutor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEvD,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,gBAAgB,CAAC,EAAE,MAAM,GAAG,oBAAoB,EAChD,YAAY,CAAC,EAAE,oBAAoB,GAClC,OAAO,CAAC,MAAM,CAAC,CAcjB"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { executeCommand } from './commandExecutor.js';
|
|
2
|
+
import { CLI } from '../constants.js';
|
|
3
|
+
export async function executeOpencodeCLI(prompt, model, variantOrContext, maybeContext) {
|
|
4
|
+
const variant = typeof variantOrContext === 'string' ? variantOrContext : undefined;
|
|
5
|
+
const context = typeof variantOrContext === 'string' ? maybeContext : variantOrContext;
|
|
6
|
+
const args = [
|
|
7
|
+
CLI.OPENCODE_SUBCOMMANDS.RUN,
|
|
8
|
+
prompt,
|
|
9
|
+
CLI.OPENCODE_FLAGS.MODEL, model,
|
|
10
|
+
];
|
|
11
|
+
if (variant) {
|
|
12
|
+
args.push('--variant', variant);
|
|
13
|
+
}
|
|
14
|
+
return executeCommand(CLI.COMMANDS.OPENCODE, args, context);
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=opencodeExecutor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencodeExecutor.js","sourceRoot":"","sources":["../../src/utils/opencodeExecutor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAGtC,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAc,EACd,KAAa,EACb,gBAAgD,EAChD,YAAmC;IAEnC,MAAM,OAAO,GAAG,OAAO,gBAAgB,KAAK,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC;IACpF,MAAM,OAAO,GAAG,OAAO,gBAAgB,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,gBAAgB,CAAC;IACvF,MAAM,IAAI,GAAa;QACrB,GAAG,CAAC,oBAAoB,CAAC,GAAG;QAC5B,MAAM;QACN,GAAG,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK;KAChC,CAAC;IAEF,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAClC,CAAC;IAED,OAAO,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeoutManager.d.ts","sourceRoot":"","sources":["../../src/utils/timeoutManager.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeoutManager.js","sourceRoot":"","sources":["../../src/utils/timeoutManager.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ToolExecutionContext } from '../execution.js';
|
|
2
|
+
export interface RouterIsolationMeta {
|
|
3
|
+
worktreePath: string;
|
|
4
|
+
branch: string;
|
|
5
|
+
gitTopLevel: string;
|
|
6
|
+
}
|
|
7
|
+
export interface EnsureWtWorktreeParams {
|
|
8
|
+
startCwd: string;
|
|
9
|
+
/** Explicit branch name, or omit to create a unique ephemeral branch */
|
|
10
|
+
worktreeBranch?: string;
|
|
11
|
+
/** Base ref/branch when creating a new branch (passed to `wt switch --base`) */
|
|
12
|
+
baseBranch?: string;
|
|
13
|
+
context?: ToolExecutionContext;
|
|
14
|
+
}
|
|
15
|
+
export declare function formatRouterIsolationPreamble(meta: {
|
|
16
|
+
worktreePath: string;
|
|
17
|
+
branch: string;
|
|
18
|
+
}): string;
|
|
19
|
+
export declare function resolveGitTopLevel(startCwd: string, context?: ToolExecutionContext): Promise<string>;
|
|
20
|
+
export declare function resolveGitBranchAt(startCwd: string, context?: ToolExecutionContext): Promise<string>;
|
|
21
|
+
export declare function resolveWorktreePathForBranch(gitTopLevel: string, branch: string, context?: ToolExecutionContext): Promise<string>;
|
|
22
|
+
/**
|
|
23
|
+
* Create or switch to an isolated git worktree via the Work Trunk `wt` CLI, then return its filesystem path.
|
|
24
|
+
*/
|
|
25
|
+
export declare function ensureWtWorktreeForRouter(params: EnsureWtWorktreeParams): Promise<RouterIsolationMeta>;
|
|
26
|
+
//# sourceMappingURL=worktrunkIsolation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktrunkIsolation.d.ts","sourceRoot":"","sources":["../../src/utils/worktrunkIsolation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAG5D,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gFAAgF;IAChF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,oBAAoB,CAAC;CAChC;AAQD,wBAAgB,6BAA6B,CAAC,IAAI,EAAE;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAOpG;AAED,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAG1G;AAED,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAG1G;AAyBD,wBAAsB,4BAA4B,CAChD,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,MAAM,CAAC,CAUjB;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA8B5G"}
|