openfox 2.0.37 → 2.0.38

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.
@@ -5,8 +5,8 @@ import {
5
5
  } from "./chunk-JGNAYJJZ.js";
6
6
  import {
7
7
  runChatTurn
8
- } from "./chunk-QG2WM7EX.js";
9
- import "./chunk-BJPPDLJX.js";
8
+ } from "./chunk-FFQCZ2MI.js";
9
+ import "./chunk-HJ7KRYWX.js";
10
10
  import "./chunk-DL6ZILAF.js";
11
11
  import "./chunk-PBGOZMVY.js";
12
12
  import "./chunk-VRGRAQDG.js";
@@ -30,7 +30,7 @@ import "./chunk-Z4FMBCJO.js";
30
30
  import "./chunk-Z6W4YHJB.js";
31
31
  import "./chunk-K44MW7JJ.js";
32
32
  import "./chunk-YD6NDTKF.js";
33
- import "./chunk-PWY6EBZ6.js";
33
+ import "./chunk-EZ3BPIUV.js";
34
34
  import "./chunk-CQGTEGKL.js";
35
35
  import "./chunk-V4IE7HJY.js";
36
36
 
@@ -145,4 +145,4 @@ export {
145
145
  startChatSession,
146
146
  stopSessionExecution
147
147
  };
148
- //# sourceMappingURL=chat-handler-HPXOVKUX.js.map
148
+ //# sourceMappingURL=chat-handler-TPKAEATB.js.map
@@ -33,7 +33,7 @@ Options:
33
33
  }
34
34
  async function runNetworkSetup(mode) {
35
35
  const { loadAuthConfig, saveAuthConfig, encryptPassword } = await import("./auth-56SIRACI.js");
36
- const { saveGlobalConfig } = await import("./config-QI3KOU42.js");
36
+ const { saveGlobalConfig } = await import("./config-XOXIIBUY.js");
37
37
  const { getAuthKeyPath } = await import("./paths-X46PPOI2.js");
38
38
  const existingAuth = await loadAuthConfig(mode);
39
39
  if (existingAuth) {
@@ -100,7 +100,7 @@ async function runNetworkSetup(mode) {
100
100
  console.log("\u2713 Configuration saved!\n");
101
101
  }
102
102
  async function runConfig(mode) {
103
- const { loadGlobalConfig, getActiveProvider, getDefaultModel } = await import("./config-QI3KOU42.js");
103
+ const { loadGlobalConfig, getActiveProvider, getDefaultModel } = await import("./config-XOXIIBUY.js");
104
104
  const { getGlobalConfigPath } = await import("./paths-X46PPOI2.js");
105
105
  const config = await loadGlobalConfig(mode);
106
106
  const configPath = getGlobalConfigPath(mode);
@@ -158,7 +158,7 @@ async function runCli(options) {
158
158
  break;
159
159
  }
160
160
  case "provider": {
161
- const { runProviderCommand } = await import("./provider-ZLMMOORK.js");
161
+ const { runProviderCommand } = await import("./provider-JLLIB72V.js");
162
162
  const [, subcommand] = positionals;
163
163
  await runProviderCommand(mode, subcommand);
164
164
  break;
@@ -197,12 +197,12 @@ async function runCli(options) {
197
197
  break;
198
198
  }
199
199
  default: {
200
- const { configFileExists } = await import("./config-QI3KOU42.js");
200
+ const { configFileExists } = await import("./config-XOXIIBUY.js");
201
201
  const configExists = await configFileExists(mode);
202
202
  if (!configExists) {
203
203
  await runNetworkSetup(mode);
204
204
  }
205
- const { runServe } = await import("./serve-NGAWODZ2.js");
205
+ const { runServe } = await import("./serve-VIWHYE6X.js");
206
206
  const serveOptions = { mode };
207
207
  if (values.port) serveOptions.port = parseInt(values.port);
208
208
  if (values["no-browser"] === true) serveOptions.openBrowser = false;
@@ -214,4 +214,4 @@ async function runCli(options) {
214
214
  export {
215
215
  runCli
216
216
  };
217
- //# sourceMappingURL=chunk-PKE4MQWI.js.map
217
+ //# sourceMappingURL=chunk-7W2WATAO.js.map
@@ -21,7 +21,7 @@ import {
21
21
  tokenFromPassword,
22
22
  verifyPassword,
23
23
  workflowExists
24
- } from "./chunk-DAC7YKYW.js";
24
+ } from "./chunk-GZZW4XSI.js";
25
25
  import {
26
26
  agentExists,
27
27
  createToolRegistry,
@@ -61,7 +61,7 @@ import {
61
61
  setMcpTools,
62
62
  setNotifyMcpServersChanged,
63
63
  skillExists
64
- } from "./chunk-BJPPDLJX.js";
64
+ } from "./chunk-HJ7KRYWX.js";
65
65
  import {
66
66
  getPathSeparator,
67
67
  isAbsolutePath
@@ -1420,8 +1420,10 @@ function estimateToolTokens(toolName, description, inputSchema) {
1420
1420
  var McpManager = class {
1421
1421
  servers = /* @__PURE__ */ new Map();
1422
1422
  onServersChanged;
1423
+ onToolsDiscovered;
1423
1424
  constructor(options) {
1424
1425
  this.onServersChanged = options?.onServersChanged;
1426
+ this.onToolsDiscovered = options?.onToolsDiscovered;
1425
1427
  }
1426
1428
  async addServer(name, config4) {
1427
1429
  if (this.servers.has(name)) {
@@ -1481,12 +1483,34 @@ var McpManager = class {
1481
1483
  entry.client = client;
1482
1484
  entry.transport = transport;
1483
1485
  entry.state = { name, config: entry.config, status: "connected", tools, estimatedTokens: totalTokens };
1486
+ const cachedTools = tools.map((t) => ({
1487
+ name: t.name,
1488
+ ...t.description ? { description: t.description } : {},
1489
+ inputSchema: t.inputSchema,
1490
+ estimatedTokens: t.estimatedTokens
1491
+ }));
1492
+ entry.config.cachedTools = cachedTools;
1493
+ this.onToolsDiscovered?.(name, cachedTools);
1484
1494
  logger.info("Connected to MCP server", { name, toolCount: tools.length });
1485
1495
  this.onServersChanged?.();
1486
1496
  } catch (error) {
1487
1497
  const msg = error instanceof Error ? error.message : String(error);
1488
1498
  logger.error("Failed to connect MCP server", { name, error: msg });
1489
- entry.state = { name, config: entry.config, status: "error", tools: [], estimatedTokens: 0, error: msg };
1499
+ const cachedTools = entry.config.cachedTools;
1500
+ if (cachedTools && cachedTools.length > 0) {
1501
+ const disabledSet = new Set(entry.config.disabledTools ?? []);
1502
+ const tools = cachedTools.map((t) => ({
1503
+ name: t.name,
1504
+ description: t.description ?? "",
1505
+ inputSchema: t.inputSchema,
1506
+ enabled: !disabledSet.has(t.name),
1507
+ estimatedTokens: t.estimatedTokens
1508
+ }));
1509
+ const totalTokens = tools.filter((t) => t.enabled).reduce((sum, t) => sum + t.estimatedTokens, 0);
1510
+ entry.state = { name, config: entry.config, status: "error", tools, estimatedTokens: totalTokens, error: msg };
1511
+ } else {
1512
+ entry.state = { name, config: entry.config, status: "error", tools: [], estimatedTokens: 0, error: msg };
1513
+ }
1490
1514
  this.onServersChanged?.();
1491
1515
  }
1492
1516
  }
@@ -3520,7 +3544,7 @@ import { Router as Router7 } from "express";
3520
3544
  import { spawn as spawn2 } from "child_process";
3521
3545
 
3522
3546
  // src/constants.ts
3523
- var VERSION = "2.0.37";
3547
+ var VERSION = "2.0.38";
3524
3548
 
3525
3549
  // src/server/routes/auto-update.ts
3526
3550
  var updateInProgress = false;
@@ -3684,7 +3708,24 @@ async function createServerHandle(config4) {
3684
3708
  (err) => logger.error("LLM initialization failed", { error: err instanceof Error ? err.message : String(err) })
3685
3709
  );
3686
3710
  const toolRegistry = createToolRegistry();
3687
- const mcpManager = new McpManager();
3711
+ const mcpManager = new McpManager({
3712
+ onToolsDiscovered: async (name, tools) => {
3713
+ try {
3714
+ const { loadGlobalConfig, saveGlobalConfig } = await import("./config-XOXIIBUY.js");
3715
+ const mode = config4.mode ?? "production";
3716
+ const globalConfig = await loadGlobalConfig(mode);
3717
+ const mcpServers2 = {
3718
+ ...globalConfig.mcpServers ?? {}
3719
+ };
3720
+ if (mcpServers2[name]) {
3721
+ mcpServers2[name] = { ...mcpServers2[name], cachedTools: tools };
3722
+ await saveGlobalConfig(mode, { ...globalConfig, mcpServers: mcpServers2 });
3723
+ }
3724
+ } catch (err) {
3725
+ logger.warn("Failed to persist MCP tool cache", { name, error: String(err) });
3726
+ }
3727
+ }
3728
+ });
3688
3729
  setMcpManagerForTools(mcpManager);
3689
3730
  setMcpConfigMode(config4.mode ?? "production");
3690
3731
  const mcpServers = config4.mcpServers ?? {};
@@ -3700,7 +3741,7 @@ async function createServerHandle(config4) {
3700
3741
  setMcpTools(mcpTools);
3701
3742
  logger.info("MCP tools registered", { count: mcpTools.length });
3702
3743
  }
3703
- const { signalMcpReady } = await import("./server-K2BDDDL4.js");
3744
+ const { signalMcpReady } = await import("./server-MEJPUI4S.js");
3704
3745
  signalMcpReady();
3705
3746
  });
3706
3747
  const app = express();
@@ -3893,7 +3934,7 @@ async function createServerHandle(config4) {
3893
3934
  app.get("/api/sessions/:id", async (req, res) => {
3894
3935
  const { getEventStore: getEventStore2 } = await import("./events-KZZPCW2Q.js");
3895
3936
  const { buildMessagesFromStoredEvents } = await import("./folding-ENYH4LMG.js");
3896
- const { getPendingQuestionsForSession } = await import("./tools-JPKBLAQ5.js");
3937
+ const { getPendingQuestionsForSession } = await import("./tools-ATO5MSWX.js");
3897
3938
  const session = sessionManager.getSession(req.params.id);
3898
3939
  if (!session) {
3899
3940
  return res.status(404).json({ error: "Session not found" });
@@ -3938,7 +3979,7 @@ async function createServerHandle(config4) {
3938
3979
  const provider = providerManager.getProviders().find((p) => p.id === providerId);
3939
3980
  const resolvedModel = model ?? provider?.models?.[0]?.id ?? "auto";
3940
3981
  sessionManager.setSessionProvider(sessionId, providerId, resolvedModel);
3941
- const { loadGlobalConfig, saveGlobalConfig, setDefaultModelSelection } = await import("./config-QI3KOU42.js");
3982
+ const { loadGlobalConfig, saveGlobalConfig, setDefaultModelSelection } = await import("./config-XOXIIBUY.js");
3942
3983
  const globalConfig = await loadGlobalConfig(config4.mode ?? "production");
3943
3984
  const updatedConfig = setDefaultModelSelection(globalConfig, providerId, resolvedModel);
3944
3985
  await saveGlobalConfig(config4.mode ?? "production", updatedConfig);
@@ -4044,7 +4085,7 @@ async function createServerHandle(config4) {
4044
4085
  if (!callId || approved === void 0) {
4045
4086
  return res.status(400).json({ error: "callId and approved are required" });
4046
4087
  }
4047
- const { providePathConfirmation } = await import("./tools-JPKBLAQ5.js");
4088
+ const { providePathConfirmation } = await import("./tools-ATO5MSWX.js");
4048
4089
  const result = providePathConfirmation(callId, approved, alwaysAllow);
4049
4090
  if (!result.found) {
4050
4091
  return res.status(404).json({ error: "No pending path confirmation with that ID" });
@@ -4052,7 +4093,7 @@ async function createServerHandle(config4) {
4052
4093
  const { getEventStore: getEventStore2 } = await import("./events-KZZPCW2Q.js");
4053
4094
  const { buildMessagesFromStoredEvents, foldPendingConfirmations } = await import("./folding-ENYH4LMG.js");
4054
4095
  const { createSessionStateMessage } = await import("./protocol-BKNLAEPJ.js");
4055
- const { getPendingQuestionsForSession } = await import("./tools-JPKBLAQ5.js");
4096
+ const { getPendingQuestionsForSession } = await import("./tools-ATO5MSWX.js");
4056
4097
  const eventStore = getEventStore2();
4057
4098
  const events = eventStore.getEvents(sessionId);
4058
4099
  const messages = buildMessagesFromStoredEvents(events);
@@ -4073,7 +4114,7 @@ async function createServerHandle(config4) {
4073
4114
  if (!skip && typeof answer !== "string") {
4074
4115
  return res.status(400).json({ error: "answer is required when not skipping" });
4075
4116
  }
4076
- const { provideAnswer } = await import("./tools-JPKBLAQ5.js");
4117
+ const { provideAnswer } = await import("./tools-ATO5MSWX.js");
4077
4118
  const found = provideAnswer(callId, answer ?? "", skip ?? false);
4078
4119
  if (!found) {
4079
4120
  return res.status(404).json({ error: "No pending question with that ID" });
@@ -4109,8 +4150,8 @@ async function createServerHandle(config4) {
4109
4150
  if (!session) {
4110
4151
  return res.status(404).json({ error: "Session not found" });
4111
4152
  }
4112
- const { stopSessionExecution } = await import("./chat-handler-HPXOVKUX.js");
4113
- const { cancelQuestionsForSession, cancelPathConfirmationsForSession } = await import("./tools-JPKBLAQ5.js");
4153
+ const { stopSessionExecution } = await import("./chat-handler-TPKAEATB.js");
4154
+ const { cancelQuestionsForSession, cancelPathConfirmationsForSession } = await import("./tools-ATO5MSWX.js");
4114
4155
  const queuedMessages = sessionManager.getQueueState(sessionId);
4115
4156
  sessionManager.clearMessageQueue(sessionId);
4116
4157
  stopSessionExecution(sessionId, sessionManager);
@@ -4221,7 +4262,7 @@ async function createServerHandle(config4) {
4221
4262
  let visionFallback;
4222
4263
  let globalWorkdir;
4223
4264
  try {
4224
- const { loadGlobalConfig, getVisionFallback } = await import("./config-QI3KOU42.js");
4265
+ const { loadGlobalConfig, getVisionFallback } = await import("./config-XOXIIBUY.js");
4225
4266
  const globalConfig = await loadGlobalConfig(config4.mode ?? "production");
4226
4267
  const fallback = getVisionFallback(globalConfig);
4227
4268
  if (fallback) {
@@ -4434,7 +4475,7 @@ async function createServerHandle(config4) {
4434
4475
  return res.status(400).json({ error: "name, url, and backend are required" });
4435
4476
  }
4436
4477
  try {
4437
- const { loadGlobalConfig, saveGlobalConfig, addProvider, setDefaultModelSelection } = await import("./config-QI3KOU42.js");
4478
+ const { loadGlobalConfig, saveGlobalConfig, addProvider, setDefaultModelSelection } = await import("./config-XOXIIBUY.js");
4438
4479
  const globalConfig = await loadGlobalConfig(config4.mode ?? "production");
4439
4480
  const providerBackend = backend;
4440
4481
  const providerModels = modelConfigs?.length ? buildModelConfigs(modelConfigs) : model ? [{ id: model, contextWindow: 2e5, source: "user" }] : [];
@@ -4472,7 +4513,7 @@ async function createServerHandle(config4) {
4472
4513
  app.post("/api/init/config", async (req, res) => {
4473
4514
  const { workdir, visionFallback } = req.body;
4474
4515
  try {
4475
- const { loadGlobalConfig, saveGlobalConfig } = await import("./config-QI3KOU42.js");
4516
+ const { loadGlobalConfig, saveGlobalConfig } = await import("./config-XOXIIBUY.js");
4476
4517
  const globalConfig = await loadGlobalConfig(config4.mode ?? "production");
4477
4518
  const updatedConfig = {
4478
4519
  ...globalConfig,
@@ -4500,7 +4541,7 @@ async function createServerHandle(config4) {
4500
4541
  });
4501
4542
  app.delete("/api/providers/:id", async (req, res) => {
4502
4543
  const { id } = req.params;
4503
- const { loadGlobalConfig, saveGlobalConfig, removeProvider } = await import("./config-QI3KOU42.js");
4544
+ const { loadGlobalConfig, saveGlobalConfig, removeProvider } = await import("./config-XOXIIBUY.js");
4504
4545
  const globalConfig = await loadGlobalConfig(config4.mode ?? "production");
4505
4546
  const updatedConfig = removeProvider(globalConfig, id);
4506
4547
  await saveGlobalConfig(config4.mode ?? "production", updatedConfig);
@@ -4512,7 +4553,7 @@ async function createServerHandle(config4) {
4512
4553
  const { id } = req.params;
4513
4554
  const { isLocal } = req.body;
4514
4555
  try {
4515
- const { loadGlobalConfig, saveGlobalConfig, updateProvider } = await import("./config-QI3KOU42.js");
4556
+ const { loadGlobalConfig, saveGlobalConfig, updateProvider } = await import("./config-XOXIIBUY.js");
4516
4557
  const globalConfig = await loadGlobalConfig(config4.mode ?? "production");
4517
4558
  const provider = globalConfig.providers.find((p) => p.id === id);
4518
4559
  if (!provider) {
@@ -4541,7 +4582,7 @@ async function createServerHandle(config4) {
4541
4582
  models: modelConfigs
4542
4583
  } = req.body;
4543
4584
  try {
4544
- const { loadGlobalConfig, saveGlobalConfig, updateProvider } = await import("./config-QI3KOU42.js");
4585
+ const { loadGlobalConfig, saveGlobalConfig, updateProvider } = await import("./config-XOXIIBUY.js");
4545
4586
  const globalConfig = await loadGlobalConfig(config4.mode ?? "production");
4546
4587
  const provider = globalConfig.providers.find((p) => p.id === id);
4547
4588
  if (!provider) {
@@ -4579,7 +4620,7 @@ async function createServerHandle(config4) {
4579
4620
  return res.status(400).json({ error: result.error });
4580
4621
  }
4581
4622
  const llmClient = getLLMClient();
4582
- const { loadGlobalConfig, saveGlobalConfig, setDefaultModelSelection } = await import("./config-QI3KOU42.js");
4623
+ const { loadGlobalConfig, saveGlobalConfig, setDefaultModelSelection } = await import("./config-XOXIIBUY.js");
4583
4624
  const globalConfig = await loadGlobalConfig(config4.mode ?? "production");
4584
4625
  const updatedConfig = setDefaultModelSelection(globalConfig, id, llmClient.getModel());
4585
4626
  await saveGlobalConfig(config4.mode ?? "production", updatedConfig);
@@ -4606,7 +4647,7 @@ async function createServerHandle(config4) {
4606
4647
  });
4607
4648
  async function rebuildMcpTools() {
4608
4649
  const { createMcpTools: createMcpTools2 } = await import("./tool-adapter-B7QP6NLA.js");
4609
- const { setMcpTools: setMcpTools2 } = await import("./tools-JPKBLAQ5.js");
4650
+ const { setMcpTools: setMcpTools2 } = await import("./tools-ATO5MSWX.js");
4610
4651
  const mcpTools = createMcpTools2(mcpManager);
4611
4652
  setMcpTools2(mcpTools);
4612
4653
  }
@@ -4668,7 +4709,7 @@ async function createServerHandle(config4) {
4668
4709
  };
4669
4710
  await mcpManager.addServer(name, serverCfg);
4670
4711
  const server = mcpManager.getServer(name);
4671
- const { loadGlobalConfig, saveGlobalConfig } = await import("./config-QI3KOU42.js");
4712
+ const { loadGlobalConfig, saveGlobalConfig } = await import("./config-XOXIIBUY.js");
4672
4713
  const globalConfig = await loadGlobalConfig(config4.mode ?? "production");
4673
4714
  const updatedMcpServers = { ...globalConfig.mcpServers ?? {}, [name]: serverCfg };
4674
4715
  await saveGlobalConfig(config4.mode ?? "production", {
@@ -4694,7 +4735,7 @@ async function createServerHandle(config4) {
4694
4735
  return res.status(404).json({ error: `MCP server '${name}' not found` });
4695
4736
  }
4696
4737
  mcpManager.removeServer(name);
4697
- const { loadGlobalConfig, saveGlobalConfig } = await import("./config-QI3KOU42.js");
4738
+ const { loadGlobalConfig, saveGlobalConfig } = await import("./config-XOXIIBUY.js");
4698
4739
  const globalConfig = await loadGlobalConfig(config4.mode ?? "production");
4699
4740
  const updatedMcpServers = { ...globalConfig.mcpServers ?? {} };
4700
4741
  delete updatedMcpServers[name];
@@ -4719,7 +4760,7 @@ async function createServerHandle(config4) {
4719
4760
  await mcpManager.setToolEnabled(name, toolName, enabled);
4720
4761
  const server = mcpManager.getServer(name);
4721
4762
  if (server) {
4722
- const { loadGlobalConfig, saveGlobalConfig } = await import("./config-QI3KOU42.js");
4763
+ const { loadGlobalConfig, saveGlobalConfig } = await import("./config-XOXIIBUY.js");
4723
4764
  const globalConfig = await loadGlobalConfig(config4.mode ?? "production");
4724
4765
  const mcpServers2 = { ...globalConfig.mcpServers ?? {} };
4725
4766
  const serverCfg = mcpServers2[name];
@@ -4919,7 +4960,7 @@ async function createServerHandle(config4) {
4919
4960
  const state = sessionManager.getContextState(sessionId);
4920
4961
  wssExports.broadcastForSession(sessionId, createContextStateMessage(state));
4921
4962
  });
4922
- const { QueueProcessor } = await import("./processor-D6HYPRZD.js");
4963
+ const { QueueProcessor } = await import("./processor-NG4NH2SS.js");
4923
4964
  const queueProcessor = new QueueProcessor({
4924
4965
  sessionManager,
4925
4966
  providerManager,
@@ -4994,4 +5035,4 @@ export {
4994
5035
  createServerHandle,
4995
5036
  createServer
4996
5037
  };
4997
- //# sourceMappingURL=chunk-2G2H4HUO.js.map
5038
+ //# sourceMappingURL=chunk-ATBNY4CL.js.map
@@ -62,6 +62,12 @@ var visionFallbackSchema = z.object({
62
62
  timeout: z.number().default(120),
63
63
  backend: z.enum(["ollama", "openai"]).default("ollama")
64
64
  });
65
+ var cachedToolSchema = z.object({
66
+ name: z.string(),
67
+ description: z.string().optional(),
68
+ inputSchema: z.record(z.string(), z.unknown()),
69
+ estimatedTokens: z.number()
70
+ });
65
71
  var mcpServerSchema = z.object({
66
72
  transport: z.enum(["stdio", "http"]).default("stdio"),
67
73
  command: z.string().optional(),
@@ -69,7 +75,8 @@ var mcpServerSchema = z.object({
69
75
  env: z.record(z.string(), z.string()).optional(),
70
76
  url: z.string().optional(),
71
77
  headers: z.record(z.string(), z.string()).optional(),
72
- disabledTools: z.array(z.string()).optional()
78
+ disabledTools: z.array(z.string()).optional(),
79
+ cachedTools: z.array(cachedToolSchema).optional()
73
80
  });
74
81
  var defaultVisionFallback = {
75
82
  enabled: false,
@@ -395,4 +402,4 @@ export {
395
402
  activateProvider,
396
403
  mergeConfigs
397
404
  };
398
- //# sourceMappingURL=chunk-PWY6EBZ6.js.map
405
+ //# sourceMappingURL=chunk-EZ3BPIUV.js.map
@@ -12,7 +12,7 @@ import {
12
12
  loadAllAgentsDefault,
13
13
  processEventsForConversation,
14
14
  runTopLevelAgentLoop
15
- } from "./chunk-BJPPDLJX.js";
15
+ } from "./chunk-HJ7KRYWX.js";
16
16
  import {
17
17
  TurnMetrics,
18
18
  WORKFLOW_KICKOFF_PROMPT,
@@ -310,4 +310,4 @@ export {
310
310
  runAgentTurn,
311
311
  injectWorkflowKickoffIfNeeded
312
312
  };
313
- //# sourceMappingURL=chunk-QG2WM7EX.js.map
313
+ //# sourceMappingURL=chunk-FFQCZ2MI.js.map
@@ -2,7 +2,7 @@ import {
2
2
  injectWorkflowKickoffIfNeeded,
3
3
  runAgentTurn,
4
4
  runChatTurn
5
- } from "./chunk-QG2WM7EX.js";
5
+ } from "./chunk-FFQCZ2MI.js";
6
6
  import {
7
7
  applyDynamicContext,
8
8
  checkAborted,
@@ -16,7 +16,7 @@ import {
16
16
  loadAllAgentsDefault,
17
17
  saveItemToDir,
18
18
  spawnShellProcess
19
- } from "./chunk-BJPPDLJX.js";
19
+ } from "./chunk-HJ7KRYWX.js";
20
20
  import {
21
21
  getPlatformShell,
22
22
  onProcessEvent
@@ -2056,4 +2056,4 @@ export {
2056
2056
  signalMcpReady,
2057
2057
  createWebSocketServer
2058
2058
  };
2059
- //# sourceMappingURL=chunk-DAC7YKYW.js.map
2059
+ //# sourceMappingURL=chunk-GZZW4XSI.js.map
@@ -71,7 +71,7 @@ import {
71
71
  import {
72
72
  loadGlobalConfig,
73
73
  saveGlobalConfig
74
- } from "./chunk-PWY6EBZ6.js";
74
+ } from "./chunk-EZ3BPIUV.js";
75
75
  import {
76
76
  getGlobalConfigDir
77
77
  } from "./chunk-CQGTEGKL.js";
@@ -2938,7 +2938,7 @@ async function describeImageFromDataUrl(dataUrl, visionModel, options) {
2938
2938
  import { createHash as createHash2 } from "crypto";
2939
2939
  async function loadVisionModelFromGlobalConfig() {
2940
2940
  try {
2941
- const { loadGlobalConfig: loadGlobalConfig2, getVisionFallback } = await import("./config-QI3KOU42.js");
2941
+ const { loadGlobalConfig: loadGlobalConfig2, getVisionFallback } = await import("./config-XOXIIBUY.js");
2942
2942
  const runtimeConfig = getRuntimeConfig();
2943
2943
  const mode = runtimeConfig.mode ?? "production";
2944
2944
  const globalConfig = await loadGlobalConfig2(mode);
@@ -3452,7 +3452,7 @@ var callSubAgentTool = {
3452
3452
  };
3453
3453
  }
3454
3454
  try {
3455
- const { getToolRegistryForAgent: getToolRegistryForAgent2 } = await import("./tools-JPKBLAQ5.js");
3455
+ const { getToolRegistryForAgent: getToolRegistryForAgent2 } = await import("./tools-ATO5MSWX.js");
3456
3456
  const toolRegistry = getToolRegistryForAgent2(agentDef);
3457
3457
  const turnMetrics = new TurnMetrics();
3458
3458
  const result = await executeSubAgent({
@@ -4268,7 +4268,7 @@ function resolveAgentDef2(sessionManager, sessionId) {
4268
4268
  }
4269
4269
  async function buildCachedPrompt(sessionManager, sessionId, agentDef) {
4270
4270
  const { instructionContent, skills } = await loadSessionContext(sessionManager, sessionId);
4271
- const { getToolRegistryForAgent: getToolRegistryForAgent2 } = await import("./tools-JPKBLAQ5.js");
4271
+ const { getToolRegistryForAgent: getToolRegistryForAgent2 } = await import("./tools-ATO5MSWX.js");
4272
4272
  const tools = getToolRegistryForAgent2(agentDef).definitions;
4273
4273
  const toolFingerprint = getToolFingerprint(tools);
4274
4274
  const allAgents = await loadAllAgentsDefault();
@@ -4281,7 +4281,7 @@ async function buildCachedPrompt(sessionManager, sessionId, agentDef) {
4281
4281
  async function computeSessionHash(sessionManager, sessionId) {
4282
4282
  const { instructionContent, skills } = await loadSessionContext(sessionManager, sessionId);
4283
4283
  const agentDef = await resolveAgentDef2(sessionManager, sessionId);
4284
- const { getToolRegistryForAgent: getToolRegistryForAgent2 } = await import("./tools-JPKBLAQ5.js");
4284
+ const { getToolRegistryForAgent: getToolRegistryForAgent2 } = await import("./tools-ATO5MSWX.js");
4285
4285
  const tools = getToolRegistryForAgent2(agentDef).definitions;
4286
4286
  const toolFingerprint = getToolFingerprint(tools);
4287
4287
  return computeDynamicContextHash(instructionContent, skills, toolFingerprint);
@@ -4388,7 +4388,7 @@ var mcpConfigTool = createTool(
4388
4388
  await saveGlobalConfig(mcpConfigMode, { ...globalConfig, mcpServers: updated });
4389
4389
  }
4390
4390
  async function rebuildTools() {
4391
- const { setMcpTools: setMcpTools2 } = await import("./tools-JPKBLAQ5.js");
4391
+ const { setMcpTools: setMcpTools2 } = await import("./tools-ATO5MSWX.js");
4392
4392
  const mcpTools = createMcpTools(mcpManagerForTools);
4393
4393
  setMcpTools2(mcpTools);
4394
4394
  }
@@ -4401,9 +4401,10 @@ var mcpConfigTool = createTool(
4401
4401
  for (const server of servers) {
4402
4402
  const connStr = server.status === "connected" ? "\u25CF" : server.status === "error" ? "\u2717" : "\u25CB";
4403
4403
  const cmdStr = server.config.command ? `${server.config.command} ${(server.config.args ?? []).join(" ")}` : server.config.url ?? "";
4404
- lines.push(
4405
- `${connStr} ${server.name} (${server.config.transport}) \u2014 ${server.status}${server.error ? `: ${server.error}` : ""}`
4406
- );
4404
+ const hasCachedTools = server.tools.length > 0;
4405
+ const sourceLabel = server.status === "connected" ? " (live)" : hasCachedTools ? " (from cache)" : "";
4406
+ const statusLine = server.error ? `${server.status}${sourceLabel}: ${server.error}` : `${server.status}${sourceLabel}`;
4407
+ lines.push(`${connStr} ${server.name} (${server.config.transport}) \u2014 ${statusLine}`);
4407
4408
  lines.push(` ${cmdStr}`);
4408
4409
  lines.push(` ${server.tools.length} tools, ~${server.estimatedTokens} tokens`);
4409
4410
  const enabledTools = server.tools.filter((t) => t.enabled);
@@ -4792,4 +4793,4 @@ export {
4792
4793
  getToolRegistryForAgent,
4793
4794
  createToolRegistry
4794
4795
  };
4795
- //# sourceMappingURL=chunk-BJPPDLJX.js.map
4796
+ //# sourceMappingURL=chunk-HJ7KRYWX.js.map
package/dist/cli/dev.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runCli
4
- } from "../chunk-PKE4MQWI.js";
4
+ } from "../chunk-7W2WATAO.js";
5
5
  import {
6
6
  logger
7
7
  } from "../chunk-K44MW7JJ.js";
package/dist/cli/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runCli
4
- } from "../chunk-PKE4MQWI.js";
4
+ } from "../chunk-7W2WATAO.js";
5
5
  import {
6
6
  logger
7
7
  } from "../chunk-K44MW7JJ.js";
@@ -13,7 +13,7 @@ import {
13
13
  saveGlobalConfig,
14
14
  setDefaultModelSelection,
15
15
  updateProvider
16
- } from "./chunk-PWY6EBZ6.js";
16
+ } from "./chunk-EZ3BPIUV.js";
17
17
  import "./chunk-CQGTEGKL.js";
18
18
  export {
19
19
  activateProvider,
@@ -31,4 +31,4 @@ export {
31
31
  setDefaultModelSelection,
32
32
  updateProvider
33
33
  };
34
- //# sourceMappingURL=config-QI3KOU42.js.map
34
+ //# sourceMappingURL=config-XOXIIBUY.js.map
@@ -2,8 +2,8 @@ import {
2
2
  injectWorkflowKickoffIfNeeded,
3
3
  runAgentTurn,
4
4
  runChatTurn
5
- } from "./chunk-QG2WM7EX.js";
6
- import "./chunk-BJPPDLJX.js";
5
+ } from "./chunk-FFQCZ2MI.js";
6
+ import "./chunk-HJ7KRYWX.js";
7
7
  import "./chunk-DL6ZILAF.js";
8
8
  import "./chunk-PBGOZMVY.js";
9
9
  import "./chunk-VRGRAQDG.js";
@@ -28,7 +28,7 @@ import "./chunk-Z4FMBCJO.js";
28
28
  import "./chunk-Z6W4YHJB.js";
29
29
  import "./chunk-K44MW7JJ.js";
30
30
  import "./chunk-YD6NDTKF.js";
31
- import "./chunk-PWY6EBZ6.js";
31
+ import "./chunk-EZ3BPIUV.js";
32
32
  import "./chunk-CQGTEGKL.js";
33
33
  import "./chunk-V4IE7HJY.js";
34
34
  export {
@@ -42,4 +42,4 @@ export {
42
42
  runAgentTurn,
43
43
  runChatTurn
44
44
  };
45
- //# sourceMappingURL=orchestrator-PTKTND5E.js.map
45
+ //# sourceMappingURL=orchestrator-ZFBVVQBO.js.map
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openfox",
3
- "version": "2.0.37",
3
+ "version": "2.0.38",
4
4
  "description": "Local-LLM-first agentic coding assistant",
5
5
  "type": "module",
6
6
  "bin": {
@@ -3,7 +3,7 @@ import {
3
3
  finalizeTurnCompletion,
4
4
  generateSessionNameForSession
5
5
  } from "./chunk-JGNAYJJZ.js";
6
- import "./chunk-BJPPDLJX.js";
6
+ import "./chunk-HJ7KRYWX.js";
7
7
  import "./chunk-DL6ZILAF.js";
8
8
  import "./chunk-PBGOZMVY.js";
9
9
  import "./chunk-VRGRAQDG.js";
@@ -28,7 +28,7 @@ import {
28
28
  logger
29
29
  } from "./chunk-K44MW7JJ.js";
30
30
  import "./chunk-YD6NDTKF.js";
31
- import "./chunk-PWY6EBZ6.js";
31
+ import "./chunk-EZ3BPIUV.js";
32
32
  import "./chunk-CQGTEGKL.js";
33
33
  import "./chunk-V4IE7HJY.js";
34
34
 
@@ -171,7 +171,7 @@ var QueueProcessor = class {
171
171
  backend: provider?.backend ?? llmClient.getBackend(),
172
172
  model: llmClient.getModel()
173
173
  };
174
- const { runChatTurn } = await import("./orchestrator-PTKTND5E.js");
174
+ const { runChatTurn } = await import("./orchestrator-ZFBVVQBO.js");
175
175
  const runChatTurnParams = buildRunChatTurnParams({
176
176
  sessionManager,
177
177
  sessionId,
@@ -216,4 +216,4 @@ var QueueProcessor = class {
216
216
  export {
217
217
  QueueProcessor
218
218
  };
219
- //# sourceMappingURL=processor-D6HYPRZD.js.map
219
+ //# sourceMappingURL=processor-NG4NH2SS.js.map
@@ -18,7 +18,7 @@ import {
18
18
  loadGlobalConfig,
19
19
  removeProvider,
20
20
  saveGlobalConfig
21
- } from "./chunk-PWY6EBZ6.js";
21
+ } from "./chunk-EZ3BPIUV.js";
22
22
  import "./chunk-CQGTEGKL.js";
23
23
  import "./chunk-V4IE7HJY.js";
24
24
 
@@ -260,7 +260,7 @@ async function runProviderAdd(mode) {
260
260
  isActive: makeActive
261
261
  });
262
262
  if (makeActive) {
263
- const { setDefaultModelSelection } = await import("./config-QI3KOU42.js");
263
+ const { setDefaultModelSelection } = await import("./config-XOXIIBUY.js");
264
264
  newConfig = setDefaultModelSelection(
265
265
  newConfig,
266
266
  newConfig.providers[newConfig.providers.length - 1].id,
@@ -388,4 +388,4 @@ export {
388
388
  runProviderRemove,
389
389
  runProviderUse
390
390
  };
391
- //# sourceMappingURL=provider-ZLMMOORK.js.map
391
+ //# sourceMappingURL=provider-JLLIB72V.js.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  VERSION,
3
3
  createServer
4
- } from "./chunk-2G2H4HUO.js";
5
- import "./chunk-DAC7YKYW.js";
6
- import "./chunk-QG2WM7EX.js";
7
- import "./chunk-BJPPDLJX.js";
4
+ } from "./chunk-ATBNY4CL.js";
5
+ import "./chunk-GZZW4XSI.js";
6
+ import "./chunk-FFQCZ2MI.js";
7
+ import "./chunk-HJ7KRYWX.js";
8
8
  import "./chunk-DL6ZILAF.js";
9
9
  import "./chunk-PBGOZMVY.js";
10
10
  import "./chunk-VRGRAQDG.js";
@@ -37,7 +37,7 @@ import {
37
37
  getActiveProvider,
38
38
  getDefaultModel,
39
39
  loadGlobalConfig
40
- } from "./chunk-PWY6EBZ6.js";
40
+ } from "./chunk-EZ3BPIUV.js";
41
41
  import {
42
42
  ensureDataDirExists,
43
43
  getDatabasePath,
@@ -199,4 +199,4 @@ async function runServe(options) {
199
199
  export {
200
200
  runServe
201
201
  };
202
- //# sourceMappingURL=serve-NGAWODZ2.js.map
202
+ //# sourceMappingURL=serve-VIWHYE6X.js.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  createServer,
3
3
  createServerHandle
4
- } from "../chunk-2G2H4HUO.js";
5
- import "../chunk-DAC7YKYW.js";
6
- import "../chunk-QG2WM7EX.js";
7
- import "../chunk-BJPPDLJX.js";
4
+ } from "../chunk-ATBNY4CL.js";
5
+ import "../chunk-GZZW4XSI.js";
6
+ import "../chunk-FFQCZ2MI.js";
7
+ import "../chunk-HJ7KRYWX.js";
8
8
  import "../chunk-DL6ZILAF.js";
9
9
  import "../chunk-PBGOZMVY.js";
10
10
  import "../chunk-VRGRAQDG.js";
@@ -29,7 +29,7 @@ import "../chunk-IEDE6VK4.js";
29
29
  import "../chunk-K44MW7JJ.js";
30
30
  import "../chunk-VUQCQXXJ.js";
31
31
  import "../chunk-YD6NDTKF.js";
32
- import "../chunk-PWY6EBZ6.js";
32
+ import "../chunk-EZ3BPIUV.js";
33
33
  import "../chunk-CQGTEGKL.js";
34
34
  import "../chunk-V4IE7HJY.js";
35
35
  export {
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  createWebSocketServer,
3
3
  signalMcpReady
4
- } from "./chunk-DAC7YKYW.js";
5
- import "./chunk-QG2WM7EX.js";
6
- import "./chunk-BJPPDLJX.js";
4
+ } from "./chunk-GZZW4XSI.js";
5
+ import "./chunk-FFQCZ2MI.js";
6
+ import "./chunk-HJ7KRYWX.js";
7
7
  import "./chunk-DL6ZILAF.js";
8
8
  import "./chunk-PBGOZMVY.js";
9
9
  import "./chunk-VRGRAQDG.js";
@@ -27,11 +27,11 @@ import "./chunk-IEDE6VK4.js";
27
27
  import "./chunk-K44MW7JJ.js";
28
28
  import "./chunk-VUQCQXXJ.js";
29
29
  import "./chunk-YD6NDTKF.js";
30
- import "./chunk-PWY6EBZ6.js";
30
+ import "./chunk-EZ3BPIUV.js";
31
31
  import "./chunk-CQGTEGKL.js";
32
32
  import "./chunk-V4IE7HJY.js";
33
33
  export {
34
34
  createWebSocketServer,
35
35
  signalMcpReady
36
36
  };
37
- //# sourceMappingURL=server-K2BDDDL4.js.map
37
+ //# sourceMappingURL=server-MEJPUI4S.js.map
@@ -12,7 +12,7 @@ import {
12
12
  setMcpTools,
13
13
  stepDoneTool,
14
14
  validateToolAction
15
- } from "./chunk-BJPPDLJX.js";
15
+ } from "./chunk-HJ7KRYWX.js";
16
16
  import "./chunk-DL6ZILAF.js";
17
17
  import "./chunk-PBGOZMVY.js";
18
18
  import "./chunk-VRGRAQDG.js";
@@ -35,7 +35,7 @@ import "./chunk-Z4FMBCJO.js";
35
35
  import "./chunk-Z6W4YHJB.js";
36
36
  import "./chunk-K44MW7JJ.js";
37
37
  import "./chunk-YD6NDTKF.js";
38
- import "./chunk-PWY6EBZ6.js";
38
+ import "./chunk-EZ3BPIUV.js";
39
39
  import "./chunk-CQGTEGKL.js";
40
40
  import "./chunk-V4IE7HJY.js";
41
41
  export {
@@ -57,4 +57,4 @@ export {
57
57
  stepDoneTool,
58
58
  validateToolAction
59
59
  };
60
- //# sourceMappingURL=tools-JPKBLAQ5.js.map
60
+ //# sourceMappingURL=tools-ATO5MSWX.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openfox",
3
- "version": "2.0.37",
3
+ "version": "2.0.38",
4
4
  "description": "Local-LLM-first agentic coding assistant",
5
5
  "type": "module",
6
6
  "bin": {