@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,129 @@
|
|
|
1
|
+
import { randomBytes } from 'node:crypto';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { SERVICE_LABEL, WINDOWS_TASK_NAME, getServiceKind, getServicePaths } from './paths.js';
|
|
6
|
+
const MANAGED_ENV_KEYS = [
|
|
7
|
+
'PATH',
|
|
8
|
+
'HOME',
|
|
9
|
+
'USER',
|
|
10
|
+
'SHELL',
|
|
11
|
+
'OPENAI_API_KEY',
|
|
12
|
+
'ANTHROPIC_API_KEY',
|
|
13
|
+
'GEMINI_API_KEY',
|
|
14
|
+
'GOOGLE_API_KEY',
|
|
15
|
+
'GOOGLE_CLOUD_PROJECT',
|
|
16
|
+
'GOOGLE_APPLICATION_CREDENTIALS',
|
|
17
|
+
'VERTEXAI_LOCATION',
|
|
18
|
+
'AWS_PROFILE',
|
|
19
|
+
'AWS_REGION',
|
|
20
|
+
'AWS_DEFAULT_REGION',
|
|
21
|
+
];
|
|
22
|
+
function isTransientRuntimePath(targetPath) {
|
|
23
|
+
return targetPath.includes(`${path.sep}_npx${path.sep}`)
|
|
24
|
+
|| targetPath.includes(`${path.sep}npm${path.sep}_npx${path.sep}`);
|
|
25
|
+
}
|
|
26
|
+
export function resolveEntrypointPath() {
|
|
27
|
+
const moduleDir = path.dirname(fileURLToPath(import.meta.url));
|
|
28
|
+
const candidates = [
|
|
29
|
+
path.resolve(moduleDir, '..', 'index.js'),
|
|
30
|
+
path.resolve(moduleDir, '..', '..', 'dist', 'index.js'),
|
|
31
|
+
];
|
|
32
|
+
const existingCandidate = candidates.find((candidate) => existsSync(candidate));
|
|
33
|
+
if (!existingCandidate) {
|
|
34
|
+
throw new Error(`Unable to locate a runnable AgentMux entrypoint. Tried: ${candidates.join(', ')}`);
|
|
35
|
+
}
|
|
36
|
+
return existingCandidate;
|
|
37
|
+
}
|
|
38
|
+
export function resolveBootstrapPath() {
|
|
39
|
+
const moduleDir = path.dirname(fileURLToPath(import.meta.url));
|
|
40
|
+
const candidates = [
|
|
41
|
+
path.resolve(moduleDir, '..', '..', 'dist', 'service', 'bootstrap.js'),
|
|
42
|
+
path.resolve(moduleDir, 'bootstrap.js'),
|
|
43
|
+
path.resolve(moduleDir, 'bootstrap.ts'),
|
|
44
|
+
];
|
|
45
|
+
const existingCandidate = candidates.find((candidate) => existsSync(candidate));
|
|
46
|
+
if (!existingCandidate) {
|
|
47
|
+
throw new Error(`Unable to locate the AgentMux service bootstrap. Tried: ${candidates.join(', ')}`);
|
|
48
|
+
}
|
|
49
|
+
return existingCandidate;
|
|
50
|
+
}
|
|
51
|
+
export function resolveServiceRuntime() {
|
|
52
|
+
const nodePath = process.execPath;
|
|
53
|
+
const bootstrapPath = resolveBootstrapPath();
|
|
54
|
+
const entrypointPath = resolveEntrypointPath();
|
|
55
|
+
if (isTransientRuntimePath(nodePath) || isTransientRuntimePath(bootstrapPath) || isTransientRuntimePath(entrypointPath)) {
|
|
56
|
+
throw new Error('Service install cannot use a transient npx runtime. Install AgentMux globally or run it from a stable local checkout first.');
|
|
57
|
+
}
|
|
58
|
+
if (!existsSync(nodePath)) {
|
|
59
|
+
throw new Error(`Node runtime does not exist: ${nodePath}`);
|
|
60
|
+
}
|
|
61
|
+
if (!existsSync(bootstrapPath)) {
|
|
62
|
+
throw new Error(`Bootstrap entrypoint does not exist: ${bootstrapPath}`);
|
|
63
|
+
}
|
|
64
|
+
if (!existsSync(entrypointPath)) {
|
|
65
|
+
throw new Error(`Entrypoint does not exist: ${entrypointPath}`);
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
nodePath,
|
|
69
|
+
bootstrapPath,
|
|
70
|
+
entrypointPath,
|
|
71
|
+
packageVersion: process.env.npm_package_version || 'unknown',
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
export function generateServiceToken() {
|
|
75
|
+
return randomBytes(32).toString('hex');
|
|
76
|
+
}
|
|
77
|
+
export function buildServiceEnvFileContents(manifest, currentEnv = process.env) {
|
|
78
|
+
const managedEntries = {
|
|
79
|
+
AGENTMUX_TRANSPORT: 'http',
|
|
80
|
+
AGENTMUX_HTTP_HOST: manifest.transport.host,
|
|
81
|
+
AGENTMUX_HTTP_PORT: String(manifest.transport.port),
|
|
82
|
+
AGENTMUX_HTTP_PATH: manifest.transport.path,
|
|
83
|
+
AGENTMUX_HTTP_AUTH_TOKEN: manifest.transport.token,
|
|
84
|
+
AGENTMUX_LOG_PATH: manifest.paths.logFile,
|
|
85
|
+
AGENTMUX_SERVICE_ROOT_DIR: manifest.paths.root,
|
|
86
|
+
AGENTMUX_SERVICE_LOG_PATH: manifest.paths.logFile,
|
|
87
|
+
AGENTMUX_SERVICE_ENV_PATH: manifest.paths.envFile,
|
|
88
|
+
AGENTMUX_SERVICE_MANIFEST_PATH: manifest.paths.manifest,
|
|
89
|
+
};
|
|
90
|
+
const envEntries = {};
|
|
91
|
+
const currentPath = currentEnv.PATH ?? '';
|
|
92
|
+
if (currentPath) {
|
|
93
|
+
envEntries.PATH = currentPath;
|
|
94
|
+
}
|
|
95
|
+
for (const key of MANAGED_ENV_KEYS) {
|
|
96
|
+
if (key === 'PATH') {
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
const value = currentEnv[key];
|
|
100
|
+
if (value) {
|
|
101
|
+
envEntries[key] = value;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return `${JSON.stringify({ ...envEntries, ...managedEntries }, null, 2)}\n`;
|
|
105
|
+
}
|
|
106
|
+
export function createServiceManifest(config, token, platform = process.platform) {
|
|
107
|
+
const serviceKind = getServiceKind(platform);
|
|
108
|
+
const paths = getServicePaths(config, platform, process.env);
|
|
109
|
+
const runtime = resolveServiceRuntime();
|
|
110
|
+
const url = `http://${config.httpHost}:${config.httpPort}${config.httpPath}`;
|
|
111
|
+
return {
|
|
112
|
+
schemaVersion: 1,
|
|
113
|
+
label: platform === 'win32' ? WINDOWS_TASK_NAME : SERVICE_LABEL,
|
|
114
|
+
platform,
|
|
115
|
+
serviceKind,
|
|
116
|
+
installedAt: new Date().toISOString(),
|
|
117
|
+
runtime,
|
|
118
|
+
transport: {
|
|
119
|
+
host: config.httpHost,
|
|
120
|
+
port: config.httpPort,
|
|
121
|
+
path: config.httpPath,
|
|
122
|
+
token,
|
|
123
|
+
url,
|
|
124
|
+
healthUrl: `http://${config.httpHost}:${config.httpPort}/health`,
|
|
125
|
+
},
|
|
126
|
+
paths,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/service/runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export type ServiceKind = 'launchd' | 'systemd-user' | 'windows-task';
|
|
2
|
+
export interface ServicePaths {
|
|
3
|
+
root: string;
|
|
4
|
+
manifest: string;
|
|
5
|
+
envFile: string;
|
|
6
|
+
launcher: string;
|
|
7
|
+
serviceDefinition: string;
|
|
8
|
+
logFile: string;
|
|
9
|
+
stderrLogFile: string;
|
|
10
|
+
}
|
|
11
|
+
export interface ServiceManifest {
|
|
12
|
+
schemaVersion: 1;
|
|
13
|
+
label: string;
|
|
14
|
+
platform: NodeJS.Platform;
|
|
15
|
+
serviceKind: ServiceKind;
|
|
16
|
+
installedAt: string;
|
|
17
|
+
runtime: {
|
|
18
|
+
nodePath: string;
|
|
19
|
+
bootstrapPath: string;
|
|
20
|
+
entrypointPath: string;
|
|
21
|
+
packageVersion: string;
|
|
22
|
+
};
|
|
23
|
+
transport: {
|
|
24
|
+
host: string;
|
|
25
|
+
port: number;
|
|
26
|
+
path: string;
|
|
27
|
+
token: string;
|
|
28
|
+
url: string;
|
|
29
|
+
healthUrl: string;
|
|
30
|
+
};
|
|
31
|
+
paths: ServicePaths;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/service/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,cAAc,GAAG,cAAc,CAAC;AAEtE,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,CAAC,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC1B,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE;QACP,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,SAAS,EAAE;QACT,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,KAAK,EAAE,YAAY,CAAC;CACrB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/service/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Some MCP hosts (notably Cursor) enforce a short HTTP timeout on tools/call while the subprocess
|
|
3
|
+
* may run for many minutes. For those clients we auto-upgrade eligible tools to task-backed
|
|
4
|
+
* execution when the client did not explicitly send task augmentation.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Returns true when tools/call should use the server's task path even if the client omitted `params.task`.
|
|
8
|
+
*/
|
|
9
|
+
export declare function prefersAutomaticToolTasks(clientName: string | undefined): boolean;
|
|
10
|
+
export declare function shouldAdvertiseTaskRequiredForListTools(clientName: string | undefined, tool: {
|
|
11
|
+
execution?: {
|
|
12
|
+
taskSupport?: string;
|
|
13
|
+
};
|
|
14
|
+
timeoutClass?: string;
|
|
15
|
+
}): boolean;
|
|
16
|
+
//# sourceMappingURL=taskClientPolicy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taskClientPolicy.d.ts","sourceRoot":"","sources":["../src/taskClientPolicy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAcjF;AAED,wBAAgB,uCAAuC,CACrD,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,IAAI,EAAE;IAAE,SAAS,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GACpE,OAAO,CAKT"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Some MCP hosts (notably Cursor) enforce a short HTTP timeout on tools/call while the subprocess
|
|
3
|
+
* may run for many minutes. For those clients we auto-upgrade eligible tools to task-backed
|
|
4
|
+
* execution when the client did not explicitly send task augmentation.
|
|
5
|
+
*/
|
|
6
|
+
function normalizeClientName(name) {
|
|
7
|
+
if (!name)
|
|
8
|
+
return undefined;
|
|
9
|
+
const t = name.trim();
|
|
10
|
+
return t ? t.toLowerCase() : undefined;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Returns true when tools/call should use the server's task path even if the client omitted `params.task`.
|
|
14
|
+
*/
|
|
15
|
+
export function prefersAutomaticToolTasks(clientName) {
|
|
16
|
+
const n = normalizeClientName(clientName);
|
|
17
|
+
if (!n)
|
|
18
|
+
return false;
|
|
19
|
+
if (n === 'cursor')
|
|
20
|
+
return true;
|
|
21
|
+
const raw = process.env.AGENTMUX_AUTO_TASK_CLIENTS;
|
|
22
|
+
if (!raw)
|
|
23
|
+
return false;
|
|
24
|
+
for (const part of raw.split(',')) {
|
|
25
|
+
const p = part.trim().toLowerCase();
|
|
26
|
+
if (!p)
|
|
27
|
+
continue;
|
|
28
|
+
if (p === 'all')
|
|
29
|
+
return true;
|
|
30
|
+
if (p === n)
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
export function shouldAdvertiseTaskRequiredForListTools(clientName, tool) {
|
|
36
|
+
if (!prefersAutomaticToolTasks(clientName))
|
|
37
|
+
return false;
|
|
38
|
+
if (tool.execution?.taskSupport !== 'optional')
|
|
39
|
+
return false;
|
|
40
|
+
if (tool.timeoutClass !== 'ask')
|
|
41
|
+
return false;
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=taskClientPolicy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taskClientPolicy.js","sourceRoot":"","sources":["../src/taskClientPolicy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,SAAS,mBAAmB,CAAC,IAAwB;IACnD,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IACtB,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,UAA8B;IACtE,MAAM,CAAC,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAC1C,IAAI,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACrB,IAAI,CAAC,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAEhC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC;IACnD,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IACvB,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACpC,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,IAAI,CAAC,KAAK,KAAK;YAAE,OAAO,IAAI,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;IAC3B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,uCAAuC,CACrD,UAA8B,EAC9B,IAAqE;IAErE,IAAI,CAAC,yBAAyB,CAAC,UAAU,CAAC;QAAE,OAAO,KAAK,CAAC;IACzD,IAAI,IAAI,CAAC,SAAS,EAAE,WAAW,KAAK,UAAU;QAAE,OAAO,KAAK,CAAC;IAC7D,IAAI,IAAI,CAAC,YAAY,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IAC9C,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { InMemoryTaskStore } from '@modelcontextprotocol/sdk/experimental/tasks/stores/in-memory.js';
|
|
2
|
+
type CancelHandler = (reason?: string) => void;
|
|
3
|
+
export declare class ManagedTaskStore extends InMemoryTaskStore {
|
|
4
|
+
private readonly cancelHandlers;
|
|
5
|
+
registerCancelHandler(taskId: string, handler: CancelHandler): void;
|
|
6
|
+
clearCancelHandler(taskId: string): void;
|
|
7
|
+
updateTaskStatus(taskId: string, status: 'working' | 'completed' | 'failed' | 'cancelled' | 'input_required', statusMessage?: string, sessionId?: string): Promise<void>;
|
|
8
|
+
storeTaskResult(taskId: string, status: 'completed' | 'failed', result: Parameters<InMemoryTaskStore['storeTaskResult']>[2], sessionId?: string): Promise<void>;
|
|
9
|
+
cleanup(): void;
|
|
10
|
+
}
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=taskStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taskStore.d.ts","sourceRoot":"","sources":["../src/taskStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kEAAkE,CAAC;AAErG,KAAK,aAAa,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;AAE/C,qBAAa,gBAAiB,SAAQ,iBAAiB;IACrD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAoC;IAEnE,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa;IAI5D,kBAAkB,CAAC,MAAM,EAAE,MAAM;IAIlB,gBAAgB,CAC7B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,GAAG,gBAAgB,EAC3E,aAAa,CAAC,EAAE,MAAM,EACtB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;IAcD,eAAe,CAC5B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,WAAW,GAAG,QAAQ,EAC9B,MAAM,EAAE,UAAU,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,EAC3D,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;IAKP,OAAO,IAAI,IAAI;CAIzB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { InMemoryTaskStore } from '@modelcontextprotocol/sdk/experimental/tasks/stores/in-memory.js';
|
|
2
|
+
export class ManagedTaskStore extends InMemoryTaskStore {
|
|
3
|
+
cancelHandlers = new Map();
|
|
4
|
+
registerCancelHandler(taskId, handler) {
|
|
5
|
+
this.cancelHandlers.set(taskId, handler);
|
|
6
|
+
}
|
|
7
|
+
clearCancelHandler(taskId) {
|
|
8
|
+
this.cancelHandlers.delete(taskId);
|
|
9
|
+
}
|
|
10
|
+
async updateTaskStatus(taskId, status, statusMessage, sessionId) {
|
|
11
|
+
await super.updateTaskStatus(taskId, status, statusMessage, sessionId);
|
|
12
|
+
if (status === 'cancelled') {
|
|
13
|
+
this.cancelHandlers.get(taskId)?.(statusMessage);
|
|
14
|
+
this.cancelHandlers.delete(taskId);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
if (status === 'completed' || status === 'failed') {
|
|
18
|
+
this.cancelHandlers.delete(taskId);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
async storeTaskResult(taskId, status, result, sessionId) {
|
|
22
|
+
await super.storeTaskResult(taskId, status, result, sessionId);
|
|
23
|
+
this.cancelHandlers.delete(taskId);
|
|
24
|
+
}
|
|
25
|
+
cleanup() {
|
|
26
|
+
this.cancelHandlers.clear();
|
|
27
|
+
super.cleanup();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=taskStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taskStore.js","sourceRoot":"","sources":["../src/taskStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kEAAkE,CAAC;AAIrG,MAAM,OAAO,gBAAiB,SAAQ,iBAAiB;IACpC,cAAc,GAAG,IAAI,GAAG,EAAyB,CAAC;IAEnE,qBAAqB,CAAC,MAAc,EAAE,OAAsB;QAC1D,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,kBAAkB,CAAC,MAAc;QAC/B,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IAEQ,KAAK,CAAC,gBAAgB,CAC7B,MAAc,EACd,MAA2E,EAC3E,aAAsB,EACtB,SAAkB;QAElB,MAAM,KAAK,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;QAEvE,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;YAC3B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;YACjD,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACnC,OAAO;QACT,CAAC;QAED,IAAI,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YAClD,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAEQ,KAAK,CAAC,eAAe,CAC5B,MAAc,EACd,MAA8B,EAC9B,MAA2D,EAC3D,SAAkB;QAElB,MAAM,KAAK,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QAC/D,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IAEQ,OAAO;QACd,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAC5B,KAAK,CAAC,OAAO,EAAE,CAAC;IAClB,CAAC;CACF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Human-curated tier display labels and usage guidance.
|
|
3
|
+
* These change rarely — only when we want to rename a tier or update guidance text.
|
|
4
|
+
* The model IDs within each tier are managed by the generated catalog.
|
|
5
|
+
*/
|
|
6
|
+
export interface TierDisplayConfig {
|
|
7
|
+
label: string;
|
|
8
|
+
useWhen: string;
|
|
9
|
+
}
|
|
10
|
+
export type TierName = 'fast' | 'balanced' | 'powerful';
|
|
11
|
+
export type CLIName = 'claude' | 'gemini' | 'codex' | 'opencode';
|
|
12
|
+
/** CLIs that use the static generated model catalog (not dynamic discovery). */
|
|
13
|
+
export type StaticCLIName = 'claude' | 'gemini' | 'codex';
|
|
14
|
+
export declare const TIER_CONFIG: Record<CLIName, Record<TierName, TierDisplayConfig>>;
|
|
15
|
+
export declare const CLI_NOTES: Record<CLIName, string>;
|
|
16
|
+
//# sourceMappingURL=tierConfig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tierConfig.d.ts","sourceRoot":"","sources":["../src/tierConfig.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;AACxD,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,CAAC;AACjE,gFAAgF;AAChF,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE1D,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAiE5E,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAM7C,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Human-curated tier display labels and usage guidance.
|
|
3
|
+
* These change rarely — only when we want to rename a tier or update guidance text.
|
|
4
|
+
* The model IDs within each tier are managed by the generated catalog.
|
|
5
|
+
*/
|
|
6
|
+
export const TIER_CONFIG = {
|
|
7
|
+
claude: {
|
|
8
|
+
fast: {
|
|
9
|
+
label: 'Haiku',
|
|
10
|
+
useWhen: 'Only for: trivial lookups, simple math, quick one-line answers.',
|
|
11
|
+
},
|
|
12
|
+
balanced: {
|
|
13
|
+
label: 'Sonnet (DEFAULT)',
|
|
14
|
+
useWhen: 'Most tasks: coding, analysis, multi-step work, debugging, code review. USE THIS BY DEFAULT.',
|
|
15
|
+
},
|
|
16
|
+
powerful: {
|
|
17
|
+
label: 'Opus',
|
|
18
|
+
useWhen: 'Complex reasoning, nuanced analysis, architectural decisions, large refactors, or when you need the highest quality.',
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
gemini: {
|
|
22
|
+
fast: {
|
|
23
|
+
label: 'Flash',
|
|
24
|
+
useWhen: 'Only for: trivial lookups, simple math, quick one-line answers.',
|
|
25
|
+
},
|
|
26
|
+
balanced: {
|
|
27
|
+
label: 'Flash Preview (DEFAULT)',
|
|
28
|
+
useWhen: 'Most tasks: coding, analysis, multi-step work, debugging, code review. USE THIS BY DEFAULT.',
|
|
29
|
+
},
|
|
30
|
+
powerful: {
|
|
31
|
+
label: 'Pro',
|
|
32
|
+
useWhen: 'Complex analysis, deep reasoning, large codebase understanding, nuanced opinions, architectural decisions.',
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
codex: {
|
|
36
|
+
fast: {
|
|
37
|
+
label: 'Codex Mini',
|
|
38
|
+
useWhen: 'Only for: trivial lookups, simple math, quick one-line answers.',
|
|
39
|
+
},
|
|
40
|
+
balanced: {
|
|
41
|
+
label: 'Codex (DEFAULT)',
|
|
42
|
+
useWhen: 'Most tasks: coding, analysis, multi-file changes, debugging, code review. USE THIS BY DEFAULT.',
|
|
43
|
+
},
|
|
44
|
+
powerful: {
|
|
45
|
+
label: 'Codex Max / GPT',
|
|
46
|
+
useWhen: 'Complex architecture, large refactors, deep reasoning, nuanced analysis, multi-step planning.',
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
opencode: {
|
|
50
|
+
fast: {
|
|
51
|
+
label: 'Fast',
|
|
52
|
+
useWhen: 'Only for: trivial lookups, simple math, quick one-line answers.',
|
|
53
|
+
},
|
|
54
|
+
balanced: {
|
|
55
|
+
label: 'Balanced (DEFAULT)',
|
|
56
|
+
useWhen: 'Most tasks: coding, analysis, multi-step work, debugging, code review. USE THIS BY DEFAULT.',
|
|
57
|
+
},
|
|
58
|
+
powerful: {
|
|
59
|
+
label: 'Powerful',
|
|
60
|
+
useWhen: 'Complex reasoning, nuanced analysis, architectural decisions, large refactors, or when you need the highest quality.',
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
export const CLI_NOTES = {
|
|
65
|
+
claude: 'Run Claude-Help for the latest CLI options.',
|
|
66
|
+
gemini: 'Run Gemini-Help for the latest CLI options. Model IDs may change as Google releases new versions.',
|
|
67
|
+
codex: 'Run Codex-Help for the latest CLI options. Model IDs may change as OpenAI releases new versions.',
|
|
68
|
+
opencode: 'OpenCode models are dynamically discovered from your configured providers. Models are classified into tiers automatically. Run OpenCode-Help for CLI options.',
|
|
69
|
+
};
|
|
70
|
+
//# sourceMappingURL=tierConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tierConfig.js","sourceRoot":"","sources":["../src/tierConfig.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAYH,MAAM,CAAC,MAAM,WAAW,GAAyD;IAC/E,MAAM,EAAE;QACN,IAAI,EAAE;YACJ,KAAK,EAAE,OAAO;YACd,OAAO,EAAE,iEAAiE;SAC3E;QACD,QAAQ,EAAE;YACR,KAAK,EAAE,kBAAkB;YACzB,OAAO,EACL,6FAA6F;SAChG;QACD,QAAQ,EAAE;YACR,KAAK,EAAE,MAAM;YACb,OAAO,EACL,sHAAsH;SACzH;KACF;IACD,MAAM,EAAE;QACN,IAAI,EAAE;YACJ,KAAK,EAAE,OAAO;YACd,OAAO,EAAE,iEAAiE;SAC3E;QACD,QAAQ,EAAE;YACR,KAAK,EAAE,yBAAyB;YAChC,OAAO,EACL,6FAA6F;SAChG;QACD,QAAQ,EAAE;YACR,KAAK,EAAE,KAAK;YACZ,OAAO,EACL,4GAA4G;SAC/G;KACF;IACD,KAAK,EAAE;QACL,IAAI,EAAE;YACJ,KAAK,EAAE,YAAY;YACnB,OAAO,EAAE,iEAAiE;SAC3E;QACD,QAAQ,EAAE;YACR,KAAK,EAAE,iBAAiB;YACxB,OAAO,EACL,gGAAgG;SACnG;QACD,QAAQ,EAAE;YACR,KAAK,EAAE,iBAAiB;YACxB,OAAO,EACL,+FAA+F;SAClG;KACF;IACD,QAAQ,EAAE;QACR,IAAI,EAAE;YACJ,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,iEAAiE;SAC3E;QACD,QAAQ,EAAE;YACR,KAAK,EAAE,oBAAoB;YAC3B,OAAO,EACL,6FAA6F;SAChG;QACD,QAAQ,EAAE;YACR,KAAK,EAAE,UAAU;YACjB,OAAO,EACL,sHAAsH;SACzH;KACF;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAA4B;IAChD,MAAM,EAAE,6CAA6C;IACrD,MAAM,EACJ,mGAAmG;IACrG,KAAK,EAAE,kGAAkG;IACzG,QAAQ,EAAE,+JAA+J;CAC1K,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask-claude.tool.d.ts","sourceRoot":"","sources":["../../src/tools/ask-claude.tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAY5C,eAAO,MAAM,aAAa,EAAE,WA4B3B,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { executeClaudeCLI } from '../utils/claudeExecutor.js';
|
|
3
|
+
import { ERROR_MESSAGES, STATUS_MESSAGES } from '../constants.js';
|
|
4
|
+
const askClaudeArgsSchema = z.object({
|
|
5
|
+
prompt: z.string().min(1).describe("The question or task for Claude Code. REQUIRED — MUST be a non-empty string. Claude Code has FULL access to the filesystem and can read files itself. Do NOT pre-read or inline file contents — just describe the task and let Claude explore the codebase."),
|
|
6
|
+
model: z.string().min(1).describe("REQUIRED — you MUST first call List-Claude-Models, review the available model families and their strengths, then select the best model for your task's scope and complexity. It's the law. Empty strings will be rejected."),
|
|
7
|
+
permissionMode: z.enum(['default', 'acceptEdits', 'bypassPermissions', 'dontAsk', 'plan']).optional().describe("Optional. Do NOT set unless explicitly needed. Permission mode: 'default' (requires approval), 'acceptEdits' (auto-accepts file edits), 'bypassPermissions' (skips all checks — use with care), 'dontAsk', or 'plan'."),
|
|
8
|
+
maxBudgetUsd: z.number().positive().optional().describe("Optional. Do NOT set unless explicitly needed. Maximum dollar amount to spend on API calls for this request."),
|
|
9
|
+
systemPrompt: z.string().optional().describe("Optional. Do NOT set unless explicitly needed. Override or append a system prompt for this request."),
|
|
10
|
+
});
|
|
11
|
+
export const askClaudeTool = {
|
|
12
|
+
name: "Ask-Claude",
|
|
13
|
+
description: "Ask Claude Code a question or give it a task. Claude Code has full filesystem access and will read files itself — do NOT pre-gather context or inline file contents into the prompt. Just describe what you need. You MUST call List-Claude-Models first to select an appropriate model. Do NOT set optional parameters unless you have a specific reason. This tool is long-running (1-15 min); delegate this call to a sub-agent or background task.",
|
|
14
|
+
zodSchema: askClaudeArgsSchema,
|
|
15
|
+
prompt: {
|
|
16
|
+
description: "Execute 'claude --print <prompt>' to get Claude Code's response.",
|
|
17
|
+
},
|
|
18
|
+
category: 'claude',
|
|
19
|
+
execution: { taskSupport: 'optional' },
|
|
20
|
+
timeoutClass: 'ask',
|
|
21
|
+
execute: async (args, context) => {
|
|
22
|
+
const { prompt, model, permissionMode, maxBudgetUsd, systemPrompt } = args;
|
|
23
|
+
if (!prompt?.trim()) {
|
|
24
|
+
throw new Error(ERROR_MESSAGES.NO_PROMPT_PROVIDED);
|
|
25
|
+
}
|
|
26
|
+
const result = await executeClaudeCLI(prompt, model, permissionMode, maxBudgetUsd, systemPrompt, context);
|
|
27
|
+
return `${STATUS_MESSAGES.CLAUDE_RESPONSE}\n${result}`;
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=ask-claude.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask-claude.tool.js","sourceRoot":"","sources":["../../src/tools/ask-claude.tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElE,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,6PAA6P,CAAC;IACjS,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,4NAA4N,CAAC;IAC/P,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,aAAa,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uNAAuN,CAAC;IACvU,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8GAA8G,CAAC;IACvK,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qGAAqG,CAAC;CACpJ,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,aAAa,GAAgB;IACxC,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,wbAAwb;IACrc,SAAS,EAAE,mBAAmB;IAC9B,MAAM,EAAE;QACN,WAAW,EAAE,kEAAkE;KAChF;IACD,QAAQ,EAAE,QAAQ;IAClB,SAAS,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE;IACtC,YAAY,EAAE,KAAK;IACnB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;QAC/B,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;QAE3E,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,gBAAgB,CACnC,MAAgB,EAChB,KAAe,EACf,cAAoC,EACpC,YAAkC,EAClC,YAAkC,EAClC,OAAO,CACR,CAAC;QAEF,OAAO,GAAG,eAAe,CAAC,eAAe,KAAK,MAAM,EAAE,CAAC;IACzD,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask-codex.tool.d.ts","sourceRoot":"","sources":["../../src/tools/ask-codex.tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAW5C,eAAO,MAAM,YAAY,EAAE,WA2B1B,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { executeCodexCLI } from '../utils/codexExecutor.js';
|
|
3
|
+
import { ERROR_MESSAGES, STATUS_MESSAGES } from '../constants.js';
|
|
4
|
+
const askCodexArgsSchema = z.object({
|
|
5
|
+
prompt: z.string().min(1).describe("The question or task for Codex. REQUIRED — MUST be a non-empty string. Codex has FULL access to the filesystem and can read files itself. Do NOT pre-read or inline file contents — just describe the task and let Codex explore the codebase."),
|
|
6
|
+
model: z.string().min(1).describe("REQUIRED — you MUST first call List-Codex-Models, review the available model families and their strengths, then select the best model for your task's scope and complexity. It's the law. Empty strings will be rejected."),
|
|
7
|
+
sandbox: z.enum(['read-only', 'workspace-write', 'danger-full-access']).optional().describe("Optional. Do NOT set unless explicitly needed. Sandbox mode: 'read-only' (safe), 'workspace-write' (default), or 'danger-full-access' (unrestricted)."),
|
|
8
|
+
approvalPolicy: z.enum(['never', 'on-request', 'on-failure', 'untrusted']).optional().describe("Optional. Do NOT set unless explicitly needed. Approval policy: 'never', 'on-request' (default), 'on-failure', or 'untrusted'."),
|
|
9
|
+
});
|
|
10
|
+
export const askCodexTool = {
|
|
11
|
+
name: "Ask-Codex",
|
|
12
|
+
description: "Ask OpenAI Codex a question or give it a task. Codex has full filesystem access and will read files itself — do NOT pre-gather context or inline file contents into the prompt. Just describe what you need. You MUST call List-Codex-Models first to select an appropriate model. Do NOT set optional parameters unless you have a specific reason. This tool is long-running (1-15 min); delegate this call to a sub-agent or background task.",
|
|
13
|
+
zodSchema: askCodexArgsSchema,
|
|
14
|
+
prompt: {
|
|
15
|
+
description: "Execute 'codex exec <prompt> --full-auto' to get Codex's response.",
|
|
16
|
+
},
|
|
17
|
+
category: 'codex',
|
|
18
|
+
execution: { taskSupport: 'optional' },
|
|
19
|
+
timeoutClass: 'ask',
|
|
20
|
+
execute: async (args, context) => {
|
|
21
|
+
const { prompt, model, sandbox, approvalPolicy } = args;
|
|
22
|
+
if (!prompt?.trim()) {
|
|
23
|
+
throw new Error(ERROR_MESSAGES.NO_PROMPT_PROVIDED);
|
|
24
|
+
}
|
|
25
|
+
const result = await executeCodexCLI(prompt, model, sandbox, approvalPolicy, context);
|
|
26
|
+
return `${STATUS_MESSAGES.CODEX_RESPONSE}\n${result}`;
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=ask-codex.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask-codex.tool.js","sourceRoot":"","sources":["../../src/tools/ask-codex.tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElE,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,gPAAgP,CAAC;IACpR,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,2NAA2N,CAAC;IAC9P,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,iBAAiB,EAAE,oBAAoB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uJAAuJ,CAAC;IACpP,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gIAAgI,CAAC;CACjO,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAgB;IACvC,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,kbAAkb;IAC/b,SAAS,EAAE,kBAAkB;IAC7B,MAAM,EAAE;QACN,WAAW,EAAE,oEAAoE;KAClF;IACD,QAAQ,EAAE,OAAO;IACjB,SAAS,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE;IACtC,YAAY,EAAE,KAAK;IACnB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;QAC/B,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;QAExD,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,eAAe,CAClC,MAAgB,EAChB,KAAe,EACf,OAA6B,EAC7B,cAAoC,EACpC,OAAO,CACR,CAAC;QAEF,OAAO,GAAG,eAAe,CAAC,cAAc,KAAK,MAAM,EAAE,CAAC;IACxD,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask-cursor.tool.d.ts","sourceRoot":"","sources":["../../src/tools/ask-cursor.tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAY5C,eAAO,MAAM,aAAa,EAAE,WA4B3B,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { executeCursorCLI } from '../utils/cursorExecutor.js';
|
|
3
|
+
import { ERROR_MESSAGES } from '../constants.js';
|
|
4
|
+
const askCursorArgsSchema = z.object({
|
|
5
|
+
prompt: z.string().min(1).describe("The question or task for Cursor Agent. REQUIRED — MUST be a non-empty string. Cursor has filesystem access in headless mode. Do NOT pre-read or inline file contents — just describe the task. For multi-minute work, run this tool via the host client's MCP task / background execution mode so it is not bound by interactive tool-call timeouts."),
|
|
6
|
+
model: z.string().min(1).describe("REQUIRED — you MUST first call List-Cursor-Models, review the available model IDs, then select the best model for your task. Empty strings will be rejected."),
|
|
7
|
+
force: z.boolean().default(false).describe("Optional. Pass --force so Cursor Agent can make direct file changes without confirmation. The smart subagent router enables this when isolation is on (default) so delegates can edit inside the Work Trunk worktree without prompts. For direct Ask-Cursor calls, enable only when the user explicitly wants edits or command execution."),
|
|
8
|
+
trust: z.boolean().default(false).describe("Optional. Pass --trust for headless runs in a workspace that has not been trusted interactively. The smart subagent router enables this when isolation is on (default) because fresh worktrees are untrusted in Cursor until trusted. For direct Ask-Cursor calls, enable only when the user wants Cursor to operate in that workspace."),
|
|
9
|
+
workspace: z.string().optional().describe("Optional. Workspace directory passed to Cursor Agent with --workspace. Defaults to the MCP server process working directory."),
|
|
10
|
+
});
|
|
11
|
+
export const askCursorTool = {
|
|
12
|
+
name: "Ask-Cursor",
|
|
13
|
+
description: "Ask Cursor Agent a question or give it a task. Cursor supports headless mode, model selection, and direct file changes with force enabled. You MUST call List-Cursor-Models first to select an appropriate model. When invoked via the smart subagent router with isolation enabled (the default), trust and force are set so headless runs work in the ephemeral worktree. This tool is long-running (often several minutes): invoke it through your MCP client's task or background mode when available so it is not limited by short interactive timeouts. If a timeout still occurs, the error includes a JSON block with run_id and stdout/stderr tails — call Get-Run with that run_id (or latest: true) to read the persisted run ledger entry.",
|
|
14
|
+
zodSchema: askCursorArgsSchema,
|
|
15
|
+
prompt: {
|
|
16
|
+
description: "Execute 'cursor-agent --print --model <model> <prompt>' to get Cursor Agent's response.",
|
|
17
|
+
},
|
|
18
|
+
category: 'cursor',
|
|
19
|
+
execution: { taskSupport: 'optional' },
|
|
20
|
+
timeoutClass: 'ask',
|
|
21
|
+
execute: async (args, context) => {
|
|
22
|
+
const { prompt, model, force, trust, workspace } = args;
|
|
23
|
+
if (!prompt?.trim()) {
|
|
24
|
+
throw new Error(ERROR_MESSAGES.NO_PROMPT_PROVIDED);
|
|
25
|
+
}
|
|
26
|
+
const result = await executeCursorCLI(prompt, model, !!force, !!trust, workspace, context);
|
|
27
|
+
return `Cursor response:\n${result}`;
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=ask-cursor.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask-cursor.tool.js","sourceRoot":"","sources":["../../src/tools/ask-cursor.tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,sVAAsV,CAAC;IAC1X,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,8JAA8J,CAAC;IACjM,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,2UAA2U,CAAC;IACvX,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,yUAAyU,CAAC;IACrX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8HAA8H,CAAC;CAC1K,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,aAAa,GAAgB;IACxC,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,wtBAAwtB;IACruB,SAAS,EAAE,mBAAmB;IAC9B,MAAM,EAAE;QACN,WAAW,EAAE,yFAAyF;KACvG;IACD,QAAQ,EAAE,QAAQ;IAClB,SAAS,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE;IACtC,YAAY,EAAE,KAAK;IACnB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;QAC/B,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;QAExD,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,gBAAgB,CACnC,MAAgB,EAChB,KAAe,EACf,CAAC,CAAC,KAAK,EACP,CAAC,CAAC,KAAK,EACP,SAA+B,EAC/B,OAAO,CACR,CAAC;QAEF,OAAO,qBAAqB,MAAM,EAAE,CAAC;IACvC,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask-gemini.tool.d.ts","sourceRoot":"","sources":["../../src/tools/ask-gemini.tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAkB5C,eAAO,MAAM,aAAa,EAAE,WA0C3B,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { executeGeminiCLI, processChangeModeOutput } from '../utils/geminiExecutor.js';
|
|
3
|
+
import { ERROR_MESSAGES, STATUS_MESSAGES } from '../constants.js';
|
|
4
|
+
const askGeminiArgsSchema = z.object({
|
|
5
|
+
prompt: z.string().min(1).describe("The question or task for Gemini. REQUIRED — MUST be a non-empty string. Gemini has filesystem access — use @ syntax to reference files (e.g., '@src/index.ts review this'). Do NOT pre-read or inline file contents — just describe the task and reference files with @."),
|
|
6
|
+
model: z.string().min(1).describe("REQUIRED — you MUST first call List-Gemini-Models, review the available model families and their strengths, then select the best model for your task's scope and complexity. It's the law. Empty strings will be rejected."),
|
|
7
|
+
sandbox: z.boolean().default(false).describe("Optional. Do NOT set unless explicitly needed. Run in sandbox mode (-s flag) for safely testing code changes in an isolated environment. Defaults to false."),
|
|
8
|
+
approvalMode: z.enum(['default', 'auto_edit', 'yolo', 'plan']).default('default').describe("Optional. Gemini CLI approval mode. Use 'yolo' only when the user explicitly wants Gemini to run tools or write files without confirmation. Defaults to 'default'."),
|
|
9
|
+
skipTrust: z.boolean().default(false).describe("Optional. Pass --skip-trust for headless runs in fresh or temporary directories. Use only when the user explicitly wants Gemini to operate in that workspace. Defaults to false."),
|
|
10
|
+
changeMode: z.boolean().default(false).describe("Optional. Do NOT set unless explicitly needed. Return structured edit suggestions instead of plain text. Defaults to false."),
|
|
11
|
+
chunkIndex: z.union([z.number(), z.string()]).optional().describe("Internal — do NOT set unless you received a chunked changeMode response. Which chunk to return (1-based)."),
|
|
12
|
+
chunkCacheKey: z.string().optional().describe("Internal — do NOT set unless you received a chunked changeMode response. Cache key from a prior response for fetching subsequent chunks."),
|
|
13
|
+
});
|
|
14
|
+
export const askGeminiTool = {
|
|
15
|
+
name: "Ask-Gemini",
|
|
16
|
+
description: "Ask Google Gemini a question or give it a task. Gemini has filesystem access via @ syntax — do NOT pre-gather context or inline file contents into the prompt. Just describe what you need and use @file references. You MUST call List-Gemini-Models first to select an appropriate model. Do NOT set optional parameters unless you have a specific reason. This tool is long-running (1-15 min); delegate this call to a sub-agent or background task.",
|
|
17
|
+
zodSchema: askGeminiArgsSchema,
|
|
18
|
+
prompt: {
|
|
19
|
+
description: "Execute 'gemini <prompt>' to get Gemini AI's response. Supports enhanced change mode for structured edit suggestions.",
|
|
20
|
+
},
|
|
21
|
+
category: 'gemini',
|
|
22
|
+
execution: { taskSupport: 'optional' },
|
|
23
|
+
timeoutClass: 'ask',
|
|
24
|
+
execute: async (args, context) => {
|
|
25
|
+
const { prompt, model, sandbox, approvalMode, skipTrust, changeMode, chunkIndex, chunkCacheKey } = args;
|
|
26
|
+
if (!prompt?.trim()) {
|
|
27
|
+
throw new Error(ERROR_MESSAGES.NO_PROMPT_PROVIDED);
|
|
28
|
+
}
|
|
29
|
+
if (changeMode && chunkIndex && chunkCacheKey) {
|
|
30
|
+
return processChangeModeOutput('', // empty for cache...
|
|
31
|
+
chunkIndex, chunkCacheKey, prompt);
|
|
32
|
+
}
|
|
33
|
+
const result = await executeGeminiCLI(prompt, model, !!sandbox, !!changeMode, approvalMode, !!skipTrust, context);
|
|
34
|
+
if (changeMode) {
|
|
35
|
+
return processChangeModeOutput(result, args.chunkIndex, undefined, prompt);
|
|
36
|
+
}
|
|
37
|
+
return `${STATUS_MESSAGES.GEMINI_RESPONSE}\n${result}`; // changeMode false
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=ask-gemini.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask-gemini.tool.js","sourceRoot":"","sources":["../../src/tools/ask-gemini.tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACvF,OAAO,EACL,cAAc,EACd,eAAe,EAChB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,0QAA0Q,CAAC;IAC9S,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,4NAA4N,CAAC;IAC/P,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,6JAA6J,CAAC;IAC3M,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,oKAAoK,CAAC;IAChQ,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,kLAAkL,CAAC;IAClO,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,6HAA6H,CAAC;IAC9K,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2GAA2G,CAAC;IAC9K,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0IAA0I,CAAC;CAC1L,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,aAAa,GAAgB;IACxC,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,2bAA2b;IACxc,SAAS,EAAE,mBAAmB;IAC9B,MAAM,EAAE;QACN,WAAW,EAAE,uHAAuH;KACrI;IACD,QAAQ,EAAE,QAAQ;IAClB,SAAS,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE;IACtC,YAAY,EAAE,KAAK;IACnB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;QAC/B,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;QAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;YAAC,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC;QAAC,CAAC;QAErL,IAAI,UAAU,IAAI,UAAU,IAAI,aAAa,EAAE,CAAC;YAC9C,OAAO,uBAAuB,CAC5B,EAAE,EAAE,qBAAqB;YACzB,UAAoB,EACpB,aAAuB,EACvB,MAAgB,CACjB,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,gBAAgB,CACnC,MAAgB,EAChB,KAAe,EACf,CAAC,CAAC,OAAO,EACT,CAAC,CAAC,UAAU,EACZ,YAAkC,EAClC,CAAC,CAAC,SAAS,EACX,OAAO,CACR,CAAC;QAEF,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,uBAAuB,CAC5B,MAAM,EACN,IAAI,CAAC,UAAgC,EACrC,SAAS,EACT,MAAgB,CACjB,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,eAAe,CAAC,eAAe,KAAK,MAAM,EAAE,CAAC,CAAC,mBAAmB;IAC7E,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask-opencode.tool.d.ts","sourceRoot":"","sources":["../../src/tools/ask-opencode.tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAW5C,eAAO,MAAM,eAAe,EAAE,WA0B7B,CAAC"}
|