openfox 2.0.13 → 2.0.15
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/dist/{chat-handler-6NUNVXIU.js → chat-handler-RYOG3WJP.js} +9 -7
- package/dist/{chunk-VFRWE5X4.js → chunk-2GX5EIIU.js} +481 -2104
- package/dist/{chunk-FQIT7VIA.js → chunk-3IKRNKPI.js} +6 -6
- package/dist/{chunk-A52FXWJX.js → chunk-3SGGOBCL.js} +10 -387
- package/dist/chunk-EKTGRBDC.js +2072 -0
- package/dist/{chunk-3QB2RMX2.js → chunk-F4PMNP7S.js} +2 -2
- package/dist/{chunk-TIKQWNYK.js → chunk-J7KOV4ST.js} +2 -2
- package/dist/{chunk-2VDLXCLO.js → chunk-KPKSN362.js} +288 -26
- package/dist/chunk-NWO6GRYE.js +39 -0
- package/dist/chunk-PQ56PX7L.js +397 -0
- package/dist/{chunk-HPCGVAS4.js → chunk-SNQT7LNU.js} +18 -1
- package/dist/{chunk-5BDVM6YI.js → chunk-YD6NDTKF.js} +1 -1
- package/dist/{chunk-EZJUU54W.js → chunk-Z64KW2HD.js} +23 -17
- package/dist/cli/dev.js +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/{config-BU66P4KX.js → config-Z66BQTNX.js} +2 -2
- package/dist/{orchestrator-WXEZHUVQ.js → orchestrator-KRCVDTZ6.js} +8 -6
- package/dist/package.json +3 -3
- package/dist/{processor-GA5NG3T7.js → processor-JHR3Z42W.js} +9 -7
- package/dist/{protocol-CaLuIetw.d.ts → protocol-BC1QSQ-Y.d.ts} +16 -1
- package/dist/{protocol-YYWMFR35.js → protocol-BKNLAEPJ.js} +3 -3
- package/dist/{provider-QPECLUZ7.js → provider-YBTRC77Y.js} +7 -5
- package/dist/{provider-manager-YA2WALTF.js → provider-manager-DETXLDKW.js} +3 -2
- package/dist/{serve-TJHQ326L.js → serve-AV74ODQ6.js} +13 -9
- package/dist/server/index.d.ts +21 -2
- package/dist/server/index.js +11 -7
- package/dist/server-P7E2IPVL.js +31 -0
- package/dist/shared/index.d.ts +2 -2
- package/dist/shared/index.js +1 -1
- package/dist/tool-adapter-B7QP6NLA.js +7 -0
- package/dist/{tools-THXBQJ7A.js → tools-WEE4XDTL.js} +9 -5
- package/dist/web/assets/{index-CQw-9GC9.js → index-BMz5-yAf.js} +76 -75
- package/dist/web/assets/{index-Db3yUKBI.css → index-Ho_tVUbw.css} +1 -1
- package/dist/web/index.html +2 -2
- package/dist/web/sw.js +1 -1
- package/package.json +3 -3
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createServerMessage,
|
|
3
3
|
isClientMessage
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-YD6NDTKF.js";
|
|
5
5
|
|
|
6
6
|
// src/server/ws/protocol.ts
|
|
7
7
|
function enrichMessagesWithToolResults(messages) {
|
|
@@ -339,4 +339,4 @@ export {
|
|
|
339
339
|
createQueueStateMessage,
|
|
340
340
|
storedEventToServerMessage
|
|
341
341
|
};
|
|
342
|
-
//# sourceMappingURL=chunk-
|
|
342
|
+
//# sourceMappingURL=chunk-F4PMNP7S.js.map
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
import {
|
|
10
10
|
createContextStateMessage,
|
|
11
11
|
createSessionStateMessage
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-F4PMNP7S.js";
|
|
13
13
|
import {
|
|
14
14
|
getPendingQuestionsForSession
|
|
15
15
|
} from "./chunk-EU3WWTFH.js";
|
|
@@ -154,4 +154,4 @@ export {
|
|
|
154
154
|
needsNameGenerationCheck,
|
|
155
155
|
applyGeneratedSessionName
|
|
156
156
|
};
|
|
157
|
-
//# sourceMappingURL=chunk-
|
|
157
|
+
//# sourceMappingURL=chunk-J7KOV4ST.js.map
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getProject
|
|
3
|
+
} from "./chunk-XAMAYRDA.js";
|
|
1
4
|
import {
|
|
2
5
|
COMPACTION_PROMPT,
|
|
3
6
|
TurnMetrics,
|
|
@@ -29,8 +32,8 @@ import {
|
|
|
29
32
|
getSessionProcessCount
|
|
30
33
|
} from "./chunk-VRGRAQDG.js";
|
|
31
34
|
import {
|
|
32
|
-
|
|
33
|
-
} from "./chunk-
|
|
35
|
+
createMcpTools
|
|
36
|
+
} from "./chunk-NWO6GRYE.js";
|
|
34
37
|
import {
|
|
35
38
|
getCurrentContextWindowId,
|
|
36
39
|
getCurrentWindowMessageOptions,
|
|
@@ -52,7 +55,7 @@ import {
|
|
|
52
55
|
createChatMessageUpdatedMessage,
|
|
53
56
|
createChatPathConfirmationMessage,
|
|
54
57
|
createQueueStateMessage
|
|
55
|
-
} from "./chunk-
|
|
58
|
+
} from "./chunk-F4PMNP7S.js";
|
|
56
59
|
import {
|
|
57
60
|
AskUserInterrupt,
|
|
58
61
|
askUserTool
|
|
@@ -62,6 +65,10 @@ import {
|
|
|
62
65
|
deleteSetting,
|
|
63
66
|
getSetting
|
|
64
67
|
} from "./chunk-RFNEDBVO.js";
|
|
68
|
+
import {
|
|
69
|
+
loadGlobalConfig,
|
|
70
|
+
saveGlobalConfig
|
|
71
|
+
} from "./chunk-SNQT7LNU.js";
|
|
65
72
|
import {
|
|
66
73
|
getGlobalConfigDir
|
|
67
74
|
} from "./chunk-CQGTEGKL.js";
|
|
@@ -806,6 +813,14 @@ function formatDiagnosticsForLLM(diagnostics) {
|
|
|
806
813
|
}
|
|
807
814
|
return output;
|
|
808
815
|
}
|
|
816
|
+
function appendLspInstallHint(output, lspManager, path) {
|
|
817
|
+
if (!lspManager) return output;
|
|
818
|
+
const hint = lspManager.getInstallHint(path);
|
|
819
|
+
if (!hint) return output;
|
|
820
|
+
return output + `
|
|
821
|
+
|
|
822
|
+
\u26A0\uFE0F Language server not installed. To enable diagnostics: \`${hint}\``;
|
|
823
|
+
}
|
|
809
824
|
|
|
810
825
|
// src/server/tools/write.ts
|
|
811
826
|
var writeFileTool = createTool(
|
|
@@ -849,6 +864,7 @@ var writeFileTool = createTool(
|
|
|
849
864
|
if (context.lspManager) {
|
|
850
865
|
diagnostics = await context.lspManager.notifyFileChange(fullPath, args.content);
|
|
851
866
|
output += formatDiagnosticsForLLM(diagnostics);
|
|
867
|
+
output = appendLspInstallHint(output, context.lspManager, fullPath);
|
|
852
868
|
}
|
|
853
869
|
const newHash = await computeFileHash(fullPath);
|
|
854
870
|
if (newHash) {
|
|
@@ -1102,6 +1118,7 @@ Make sure whitespace and indentation match exactly.`
|
|
|
1102
1118
|
if (context.lspManager) {
|
|
1103
1119
|
diagnostics = await context.lspManager.notifyFileChange(fullPath, newContent);
|
|
1104
1120
|
output += formatDiagnosticsForLLM(diagnostics);
|
|
1121
|
+
output = appendLspInstallHint(output, context.lspManager, fullPath);
|
|
1105
1122
|
}
|
|
1106
1123
|
const newHash = await computeFileHash(fullPath);
|
|
1107
1124
|
if (newHash) {
|
|
@@ -2266,7 +2283,7 @@ ${CONTINUE_PROMPT}` : CONTINUE_PROMPT;
|
|
|
2266
2283
|
systemPrompt: assembledRequest.systemPrompt,
|
|
2267
2284
|
llmClient,
|
|
2268
2285
|
messages: assembledRequest.messages,
|
|
2269
|
-
tools:
|
|
2286
|
+
tools: assembledRequest.tools,
|
|
2270
2287
|
toolChoice: "auto",
|
|
2271
2288
|
signal,
|
|
2272
2289
|
...config.retryPatterns ? { retryPatterns: config.retryPatterns } : {},
|
|
@@ -2575,7 +2592,8 @@ function createAssemblyResult(input) {
|
|
|
2575
2592
|
const messagesForLLM = input.messages.filter((m) => m.source !== "runtime");
|
|
2576
2593
|
return {
|
|
2577
2594
|
systemPrompt: input.systemPrompt,
|
|
2578
|
-
messages: messagesForLLM.map((message) => messageToMinimal(message))
|
|
2595
|
+
messages: messagesForLLM.map((message) => messageToMinimal(message)),
|
|
2596
|
+
tools: input.requestTools
|
|
2579
2597
|
};
|
|
2580
2598
|
}
|
|
2581
2599
|
function buildAssemblyInput(systemPrompt, baseInput) {
|
|
@@ -2676,10 +2694,10 @@ async function describeImageFromDataUrl(dataUrl, visionModel, options) {
|
|
|
2676
2694
|
import { createHash as createHash2 } from "crypto";
|
|
2677
2695
|
async function loadVisionModelFromGlobalConfig() {
|
|
2678
2696
|
try {
|
|
2679
|
-
const { loadGlobalConfig, getVisionFallback } = await import("./config-
|
|
2697
|
+
const { loadGlobalConfig: loadGlobalConfig2, getVisionFallback } = await import("./config-Z66BQTNX.js");
|
|
2680
2698
|
const runtimeConfig = getRuntimeConfig();
|
|
2681
2699
|
const mode = runtimeConfig.mode ?? "production";
|
|
2682
|
-
const globalConfig = await
|
|
2700
|
+
const globalConfig = await loadGlobalConfig2(mode);
|
|
2683
2701
|
const fallback = getVisionFallback(globalConfig);
|
|
2684
2702
|
if (fallback?.enabled && fallback.model) {
|
|
2685
2703
|
return { baseUrl: fallback.url, model: fallback.model, timeout: fallback.timeout * 1e3 };
|
|
@@ -3131,7 +3149,7 @@ var callSubAgentTool = {
|
|
|
3131
3149
|
};
|
|
3132
3150
|
}
|
|
3133
3151
|
try {
|
|
3134
|
-
const { getToolRegistryForAgent: getToolRegistryForAgent2 } = await import("./tools-
|
|
3152
|
+
const { getToolRegistryForAgent: getToolRegistryForAgent2 } = await import("./tools-WEE4XDTL.js");
|
|
3135
3153
|
const toolRegistry = getToolRegistryForAgent2(agentDef);
|
|
3136
3154
|
const turnMetrics = new TurnMetrics();
|
|
3137
3155
|
const result = await executeSubAgent({
|
|
@@ -3918,6 +3936,238 @@ These processes run independently of agent turns and persist across session comp
|
|
|
3918
3936
|
}
|
|
3919
3937
|
);
|
|
3920
3938
|
|
|
3939
|
+
// src/server/chat/dynamic-context.ts
|
|
3940
|
+
import { createHash as createHash3 } from "crypto";
|
|
3941
|
+
function computeDynamicContextHash(instructionContent, skills, toolFingerprint) {
|
|
3942
|
+
const dynamicInputs = JSON.stringify({
|
|
3943
|
+
instructions: instructionContent,
|
|
3944
|
+
skills: skills.map((s) => s.id).sort(),
|
|
3945
|
+
...toolFingerprint ? { tools: toolFingerprint } : {}
|
|
3946
|
+
});
|
|
3947
|
+
return createHash3("sha256").update(dynamicInputs).digest("hex");
|
|
3948
|
+
}
|
|
3949
|
+
function getToolFingerprint(tools) {
|
|
3950
|
+
return tools.map((t) => `${t.function.name}:${JSON.stringify(t.function.parameters)}`).sort().join("|");
|
|
3951
|
+
}
|
|
3952
|
+
async function computeContextHash(sessionManager, sessionId) {
|
|
3953
|
+
const session = sessionManager.requireSession(sessionId);
|
|
3954
|
+
const { content: instructionContent } = await getAllInstructions(session.workdir, session.projectId);
|
|
3955
|
+
const runtimeConfig = getRuntimeConfig();
|
|
3956
|
+
const configDir = getGlobalConfigDir(runtimeConfig.mode ?? "production");
|
|
3957
|
+
const skills = await getEnabledSkillMetadata(configDir, runtimeConfig.workdir);
|
|
3958
|
+
const { createToolRegistry: createToolRegistry2 } = await import("./tools-WEE4XDTL.js");
|
|
3959
|
+
const allTools = createToolRegistry2().definitions;
|
|
3960
|
+
const toolFingerprint = getToolFingerprint(allTools);
|
|
3961
|
+
const hash = computeDynamicContextHash(instructionContent, skills, toolFingerprint);
|
|
3962
|
+
return { hash, instructionContent, skills, allTools };
|
|
3963
|
+
}
|
|
3964
|
+
async function applyDynamicContext(sessionManager, sessionId) {
|
|
3965
|
+
const { hash, instructionContent, skills, allTools } = await computeContextHash(sessionManager, sessionId);
|
|
3966
|
+
const allAgents = await loadAllAgentsDefault();
|
|
3967
|
+
const subAgentDefs = getSubAgents(allAgents);
|
|
3968
|
+
const systemPrompt = buildTopLevelSystemPrompt(
|
|
3969
|
+
sessionManager.requireSession(sessionId).workdir,
|
|
3970
|
+
instructionContent || void 0,
|
|
3971
|
+
skills,
|
|
3972
|
+
subAgentDefs
|
|
3973
|
+
);
|
|
3974
|
+
sessionManager.setCachedPrompt(sessionId, systemPrompt, allTools, hash);
|
|
3975
|
+
sessionManager.setDynamicContextChanged(sessionId, false);
|
|
3976
|
+
sessionManager.clearDebugDump(sessionId);
|
|
3977
|
+
logger.debug("applyDynamicContext done", { sessionId, hash, toolCount: allTools.length });
|
|
3978
|
+
}
|
|
3979
|
+
|
|
3980
|
+
// src/server/tools/mcp-config.ts
|
|
3981
|
+
var mcpManagerForTools = null;
|
|
3982
|
+
var mcpConfigMode = "production";
|
|
3983
|
+
var mcpNotifyChanged = null;
|
|
3984
|
+
function setMcpManagerForTools(manager) {
|
|
3985
|
+
mcpManagerForTools = manager;
|
|
3986
|
+
}
|
|
3987
|
+
function setMcpConfigMode(mode) {
|
|
3988
|
+
mcpConfigMode = mode;
|
|
3989
|
+
}
|
|
3990
|
+
function setNotifyMcpServersChanged(fn) {
|
|
3991
|
+
mcpNotifyChanged = fn;
|
|
3992
|
+
}
|
|
3993
|
+
var mcpConfigTool = createTool(
|
|
3994
|
+
"mcp_config",
|
|
3995
|
+
{
|
|
3996
|
+
type: "function",
|
|
3997
|
+
function: {
|
|
3998
|
+
name: "mcp_config",
|
|
3999
|
+
description: "Configure MCP servers (Model Context Protocol). Actions: list (show all servers and tools), add (add a server), remove (delete a server), toggle-tool (enable/disable a tool). Use this when the user asks to add, remove, or configure MCP servers or tools.",
|
|
4000
|
+
parameters: {
|
|
4001
|
+
type: "object",
|
|
4002
|
+
properties: {
|
|
4003
|
+
action: {
|
|
4004
|
+
type: "string",
|
|
4005
|
+
enum: ["list", "add", "remove", "toggle-tool"],
|
|
4006
|
+
description: "Action: list (show servers), add (add new server), remove (delete a server), toggle-tool (enable/disable a tool)"
|
|
4007
|
+
},
|
|
4008
|
+
name: {
|
|
4009
|
+
type: "string",
|
|
4010
|
+
description: "Server name (required for: add, remove, toggle-tool)"
|
|
4011
|
+
},
|
|
4012
|
+
transport: {
|
|
4013
|
+
type: "string",
|
|
4014
|
+
enum: ["stdio", "http"],
|
|
4015
|
+
description: "Transport type (for add). Default: stdio"
|
|
4016
|
+
},
|
|
4017
|
+
command: {
|
|
4018
|
+
type: "string",
|
|
4019
|
+
description: 'Command for stdio transport (e.g. "npx")'
|
|
4020
|
+
},
|
|
4021
|
+
args: {
|
|
4022
|
+
type: "array",
|
|
4023
|
+
items: { type: "string" },
|
|
4024
|
+
description: "Command arguments for stdio transport"
|
|
4025
|
+
},
|
|
4026
|
+
env: {
|
|
4027
|
+
type: "object",
|
|
4028
|
+
additionalProperties: { type: "string" },
|
|
4029
|
+
description: "Environment variables for stdio transport"
|
|
4030
|
+
},
|
|
4031
|
+
url: {
|
|
4032
|
+
type: "string",
|
|
4033
|
+
description: 'Server URL for HTTP transport (e.g. "https://mcp.example.com/mcp")'
|
|
4034
|
+
},
|
|
4035
|
+
headers: {
|
|
4036
|
+
type: "object",
|
|
4037
|
+
additionalProperties: { type: "string" },
|
|
4038
|
+
description: 'HTTP headers for HTTP transport (e.g. {"Authorization": "Bearer xxx"})'
|
|
4039
|
+
},
|
|
4040
|
+
toolName: {
|
|
4041
|
+
type: "string",
|
|
4042
|
+
description: "Tool name to toggle (required for: toggle-tool)"
|
|
4043
|
+
},
|
|
4044
|
+
enabled: {
|
|
4045
|
+
type: "boolean",
|
|
4046
|
+
description: "Whether the tool should be enabled (required for: toggle-tool)"
|
|
4047
|
+
}
|
|
4048
|
+
},
|
|
4049
|
+
required: ["action"]
|
|
4050
|
+
}
|
|
4051
|
+
}
|
|
4052
|
+
},
|
|
4053
|
+
async (args, context, helpers) => {
|
|
4054
|
+
const actionError = validateActionWithPermission(
|
|
4055
|
+
args.action,
|
|
4056
|
+
["list", "add", "remove", "toggle-tool"],
|
|
4057
|
+
"mcp_config",
|
|
4058
|
+
context.permittedActions
|
|
4059
|
+
);
|
|
4060
|
+
if (actionError) return actionError;
|
|
4061
|
+
if (!mcpManagerForTools) {
|
|
4062
|
+
return helpers.error("MCP manager not available");
|
|
4063
|
+
}
|
|
4064
|
+
async function persistAndRebuild(updater) {
|
|
4065
|
+
const globalConfig = await loadGlobalConfig(mcpConfigMode);
|
|
4066
|
+
const mcpServers = { ...globalConfig.mcpServers ?? {} };
|
|
4067
|
+
const updated = updater(mcpServers);
|
|
4068
|
+
await saveGlobalConfig(mcpConfigMode, { ...globalConfig, mcpServers: updated });
|
|
4069
|
+
}
|
|
4070
|
+
async function rebuildTools() {
|
|
4071
|
+
const { setMcpTools: setMcpTools2 } = await import("./tools-WEE4XDTL.js");
|
|
4072
|
+
const mcpTools = createMcpTools(mcpManagerForTools);
|
|
4073
|
+
setMcpTools2(mcpTools);
|
|
4074
|
+
}
|
|
4075
|
+
if (args.action === "list") {
|
|
4076
|
+
const servers = mcpManagerForTools.getAllServers();
|
|
4077
|
+
if (servers.length === 0) {
|
|
4078
|
+
return helpers.success("No MCP servers configured.");
|
|
4079
|
+
}
|
|
4080
|
+
const lines = [];
|
|
4081
|
+
for (const server of servers) {
|
|
4082
|
+
const connStr = server.status === "connected" ? "\u25CF" : server.status === "error" ? "\u2717" : "\u25CB";
|
|
4083
|
+
const cmdStr = server.config.command ? `${server.config.command} ${(server.config.args ?? []).join(" ")}` : server.config.url ?? "";
|
|
4084
|
+
lines.push(
|
|
4085
|
+
`${connStr} ${server.name} (${server.config.transport}) \u2014 ${server.status}${server.error ? `: ${server.error}` : ""}`
|
|
4086
|
+
);
|
|
4087
|
+
lines.push(` ${cmdStr}`);
|
|
4088
|
+
lines.push(` ${server.tools.length} tools, ~${server.estimatedTokens} tokens`);
|
|
4089
|
+
const enabledTools = server.tools.filter((t) => t.enabled);
|
|
4090
|
+
const disabledTools = server.tools.filter((t) => !t.enabled);
|
|
4091
|
+
if (enabledTools.length > 0) {
|
|
4092
|
+
lines.push(` Enabled: ${enabledTools.map((t) => t.name).join(", ")}`);
|
|
4093
|
+
}
|
|
4094
|
+
if (disabledTools.length > 0) {
|
|
4095
|
+
lines.push(` Disabled: ${disabledTools.map((t) => t.name).join(", ")}`);
|
|
4096
|
+
}
|
|
4097
|
+
}
|
|
4098
|
+
return helpers.success(lines.join("\n"));
|
|
4099
|
+
}
|
|
4100
|
+
if (args.action === "add") {
|
|
4101
|
+
if (!args.name) return helpers.error("Missing required field: name");
|
|
4102
|
+
if (args.transport === "http") {
|
|
4103
|
+
if (!args.url) return helpers.error("url is required for http transport");
|
|
4104
|
+
} else if (!args.command) {
|
|
4105
|
+
return helpers.error("command is required for stdio transport");
|
|
4106
|
+
}
|
|
4107
|
+
const serverCfg = {
|
|
4108
|
+
transport: args.transport ?? "stdio",
|
|
4109
|
+
...args.command ? { command: args.command } : {},
|
|
4110
|
+
...args.args && args.args.length > 0 ? { args: args.args } : {},
|
|
4111
|
+
...args.env && Object.keys(args.env).length > 0 ? { env: args.env } : {},
|
|
4112
|
+
...args.url ? { url: args.url } : {},
|
|
4113
|
+
...args.headers && Object.keys(args.headers).length > 0 ? { headers: args.headers } : {}
|
|
4114
|
+
};
|
|
4115
|
+
await persistAndRebuild((mcpServers) => {
|
|
4116
|
+
mcpServers[args.name] = serverCfg;
|
|
4117
|
+
return mcpServers;
|
|
4118
|
+
});
|
|
4119
|
+
await mcpManagerForTools.addServer(args.name, serverCfg);
|
|
4120
|
+
await rebuildTools();
|
|
4121
|
+
await applyDynamicContext(context.sessionManager, context.sessionId);
|
|
4122
|
+
mcpNotifyChanged?.(context.sessionId);
|
|
4123
|
+
const server = mcpManagerForTools.getServer(args.name);
|
|
4124
|
+
const toolCount = server?.tools.length ?? 0;
|
|
4125
|
+
return helpers.success(`Added MCP server "${args.name}" (${toolCount} tools discovered).`);
|
|
4126
|
+
}
|
|
4127
|
+
if (args.action === "remove") {
|
|
4128
|
+
if (!args.name) return helpers.error("Missing required field: name");
|
|
4129
|
+
await persistAndRebuild((mcpServers) => {
|
|
4130
|
+
delete mcpServers[args.name];
|
|
4131
|
+
return mcpServers;
|
|
4132
|
+
});
|
|
4133
|
+
mcpManagerForTools.removeServer(args.name);
|
|
4134
|
+
await rebuildTools();
|
|
4135
|
+
await applyDynamicContext(context.sessionManager, context.sessionId);
|
|
4136
|
+
mcpNotifyChanged?.(context.sessionId);
|
|
4137
|
+
return helpers.success(`Removed MCP server "${args.name}".`);
|
|
4138
|
+
}
|
|
4139
|
+
if (args.action === "toggle-tool") {
|
|
4140
|
+
if (!args.name) return helpers.error("Missing required field: name");
|
|
4141
|
+
if (!args.toolName) return helpers.error("Missing required field: toolName");
|
|
4142
|
+
if (args.enabled === void 0) return helpers.error("Missing required field: enabled");
|
|
4143
|
+
const server = mcpManagerForTools.getServer(args.name);
|
|
4144
|
+
const currentDisabled = (server?.tools ?? []).filter((t) => !t.enabled).map((t) => t.name);
|
|
4145
|
+
const afterDisabled = args.enabled ? currentDisabled.filter((n) => n !== args.toolName) : [...currentDisabled, args.toolName];
|
|
4146
|
+
await persistAndRebuild((mcpServers) => {
|
|
4147
|
+
const cfg = mcpServers[args.name];
|
|
4148
|
+
if (cfg) {
|
|
4149
|
+
const updated = { ...cfg };
|
|
4150
|
+
if (afterDisabled.length > 0) {
|
|
4151
|
+
updated.disabledTools = afterDisabled;
|
|
4152
|
+
} else {
|
|
4153
|
+
delete updated.disabledTools;
|
|
4154
|
+
}
|
|
4155
|
+
mcpServers[args.name] = updated;
|
|
4156
|
+
}
|
|
4157
|
+
return mcpServers;
|
|
4158
|
+
});
|
|
4159
|
+
await mcpManagerForTools.setToolEnabled(args.name, args.toolName, args.enabled);
|
|
4160
|
+
await rebuildTools();
|
|
4161
|
+
await applyDynamicContext(context.sessionManager, context.sessionId);
|
|
4162
|
+
mcpNotifyChanged?.(context.sessionId);
|
|
4163
|
+
return helpers.success(
|
|
4164
|
+
`Tool "${args.toolName}" ${args.enabled ? "enabled" : "disabled"} on server "${args.name}".`
|
|
4165
|
+
);
|
|
4166
|
+
}
|
|
4167
|
+
return helpers.error("Unexpected error");
|
|
4168
|
+
}
|
|
4169
|
+
);
|
|
4170
|
+
|
|
3921
4171
|
// src/server/tools/index.ts
|
|
3922
4172
|
function parseToolPermissions(allowedTools) {
|
|
3923
4173
|
const result = {};
|
|
@@ -4056,24 +4306,29 @@ function createRegistryFromTools(tools, allowedTools, toolPermissions) {
|
|
|
4056
4306
|
}
|
|
4057
4307
|
};
|
|
4058
4308
|
}
|
|
4309
|
+
var mcpToolsOverride = [];
|
|
4310
|
+
function setMcpTools(tools) {
|
|
4311
|
+
mcpToolsOverride = tools;
|
|
4312
|
+
}
|
|
4059
4313
|
function getAllToolsMap() {
|
|
4060
|
-
|
|
4061
|
-
|
|
4062
|
-
|
|
4063
|
-
|
|
4064
|
-
|
|
4065
|
-
|
|
4066
|
-
|
|
4067
|
-
|
|
4068
|
-
|
|
4069
|
-
|
|
4070
|
-
|
|
4071
|
-
|
|
4072
|
-
|
|
4073
|
-
|
|
4074
|
-
|
|
4075
|
-
|
|
4076
|
-
]);
|
|
4314
|
+
const builtInTools = [
|
|
4315
|
+
readFileTool,
|
|
4316
|
+
writeFileTool,
|
|
4317
|
+
editFileTool,
|
|
4318
|
+
runCommandTool,
|
|
4319
|
+
askUserTool,
|
|
4320
|
+
sessionMetadataTool,
|
|
4321
|
+
callSubAgentTool,
|
|
4322
|
+
loadSkillTool,
|
|
4323
|
+
returnValueTool,
|
|
4324
|
+
webFetchTool,
|
|
4325
|
+
devServerTool,
|
|
4326
|
+
stepDoneTool,
|
|
4327
|
+
backgroundProcessTool,
|
|
4328
|
+
mcpConfigTool
|
|
4329
|
+
].map((t) => [t.name, t]);
|
|
4330
|
+
const mcpEntries = mcpToolsOverride.map((t) => [t.name, t]);
|
|
4331
|
+
return new Map([...builtInTools, ...mcpEntries]);
|
|
4077
4332
|
}
|
|
4078
4333
|
function createPermissionErrorMessage(toolName, allowedTools) {
|
|
4079
4334
|
if (allowedTools.length === 0) {
|
|
@@ -4178,12 +4433,19 @@ export {
|
|
|
4178
4433
|
executeSubAgent,
|
|
4179
4434
|
devServerManager,
|
|
4180
4435
|
stepDoneTool,
|
|
4436
|
+
computeDynamicContextHash,
|
|
4437
|
+
getToolFingerprint,
|
|
4438
|
+
applyDynamicContext,
|
|
4439
|
+
setMcpManagerForTools,
|
|
4440
|
+
setMcpConfigMode,
|
|
4441
|
+
setNotifyMcpServersChanged,
|
|
4181
4442
|
parseToolPermissions,
|
|
4182
4443
|
getToolPermissions,
|
|
4183
4444
|
validateToolAction,
|
|
4184
4445
|
createRegistryFromTools,
|
|
4446
|
+
setMcpTools,
|
|
4185
4447
|
getToolRegistryForSubAgent,
|
|
4186
4448
|
getToolRegistryForAgent,
|
|
4187
4449
|
createToolRegistry
|
|
4188
4450
|
};
|
|
4189
|
-
//# sourceMappingURL=chunk-
|
|
4451
|
+
//# sourceMappingURL=chunk-KPKSN362.js.map
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// src/server/mcp/tool-adapter.ts
|
|
2
|
+
function createMcpTools(mcpManager) {
|
|
3
|
+
const tools = [];
|
|
4
|
+
for (const server of mcpManager.getAllServers()) {
|
|
5
|
+
for (const mcpTool of server.tools) {
|
|
6
|
+
if (!mcpTool.enabled) continue;
|
|
7
|
+
const prefixedName = `${server.name}_${mcpTool.name}`;
|
|
8
|
+
const definition = {
|
|
9
|
+
type: "function",
|
|
10
|
+
function: {
|
|
11
|
+
name: prefixedName,
|
|
12
|
+
description: mcpTool.description ?? "",
|
|
13
|
+
parameters: mcpTool.inputSchema
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
tools.push({
|
|
17
|
+
name: prefixedName,
|
|
18
|
+
definition,
|
|
19
|
+
execute: async (args, _context) => {
|
|
20
|
+
const start = Date.now();
|
|
21
|
+
const result = await mcpManager.callTool(server.name, mcpTool.name, args);
|
|
22
|
+
return {
|
|
23
|
+
success: result.success,
|
|
24
|
+
...result.output ? { output: result.output } : {},
|
|
25
|
+
...result.error ? { error: result.error } : {},
|
|
26
|
+
durationMs: Date.now() - start,
|
|
27
|
+
truncated: false
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return tools;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export {
|
|
37
|
+
createMcpTools
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=chunk-NWO6GRYE.js.map
|