openfox 2.0.43 → 2.0.45

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.
Files changed (28) hide show
  1. package/README.md +22 -0
  2. package/dist/{chat-handler-233L35BD.js → chat-handler-N455RNSL.js} +6 -6
  3. package/dist/{chunk-WXAOEWJS.js → chunk-4EFNO4BV.js} +2 -2
  4. package/dist/{chunk-FZ5LNBZS.js → chunk-4GBKQZ2U.js} +34 -34
  5. package/dist/{chunk-NF6WHQAT.js → chunk-BSDMJT53.js} +5 -5
  6. package/dist/{chunk-TT6LDJU5.js → chunk-CTGMHRHD.js} +10 -10
  7. package/dist/{chunk-V234MYXB.js → chunk-IPTJ3MYR.js} +5 -5
  8. package/dist/{chunk-ULZORR3T.js → chunk-JREYASTD.js} +3 -3
  9. package/dist/{chunk-EZ3BPIUV.js → chunk-K3NOKF5A.js} +13 -1
  10. package/dist/{chunk-FQ6UFNTT.js → chunk-OBKCUYR5.js} +6 -6
  11. package/dist/{chunk-NVQFIZJI.js → chunk-QOZ2DIWF.js} +2 -2
  12. package/dist/cli/dev.js +1 -1
  13. package/dist/cli/index.js +1 -1
  14. package/dist/{compactor-TJEAAZL3.js → compactor-LQ46XQJV.js} +3 -3
  15. package/dist/{config-S5CF4QU4.js → config-G5MVFHLP.js} +2 -2
  16. package/dist/{events-THW3MYXE.js → events-7RIPFG62.js} +2 -2
  17. package/dist/{orchestrator-XIGRXAEC.js → orchestrator-5S2D5XWE.js} +5 -5
  18. package/dist/package.json +1 -1
  19. package/dist/{processor-T6FX54JU.js → processor-X53RROTI.js} +6 -6
  20. package/dist/{provider-JDI3LVYF.js → provider-DLH5GJH2.js} +3 -3
  21. package/dist/{serve-LAAYCXXI.js → serve-XY327IVV.js} +13 -9
  22. package/dist/server/index.js +7 -7
  23. package/dist/{server-GVQNOHX3.js → server-RRS5ZQ7I.js} +7 -7
  24. package/dist/{tools-PS5CSPGS.js → tools-ZPKIMLNI.js} +4 -4
  25. package/dist/web/assets/{index-chkieEXf.js → index-D8oQRDLg.js} +3 -3
  26. package/dist/web/index.html +1 -1
  27. package/dist/web/sw.js +1 -1
  28. package/package.json +1 -1
package/README.md CHANGED
@@ -107,6 +107,28 @@ _General Instructions — Global custom instructions_
107
107
  _Vision Fallback — Image processing configuration_
108
108
  ![Vision Fallback](docs/screenshots/vision-fallback.png)
109
109
 
110
+ ## Environment Variables
111
+
112
+ | Variable | Default | Description |
113
+ | --------------------------- | -------------------------- | --------------------------------------------------------------- |
114
+ | `OPENFOX_LLM_URL` | `http://localhost:8000/v1` | LLM API base URL |
115
+ | `OPENFOX_VLLM_URL` | — | Deprecated alias for `OPENFOX_LLM_URL` |
116
+ | `OPENFOX_BACKEND` | `unknown` | Backend type: `vllm`, `sglang`, `ollama`, `llamacpp`, `unknown` |
117
+ | `OPENFOX_MODEL_NAME` | `''` | Override default model name |
118
+ | `OPENFOX_MAX_CONTEXT` | `200000` | Max context window in tokens |
119
+ | `OPENFOX_LLM_TIMEOUT` | `300000` | LLM request timeout in ms |
120
+ | `OPENFOX_LLM_IDLE_TIMEOUT` | `300000` | LLM stream idle timeout in ms |
121
+ | `OPENFOX_PORT` | `10369` | Server listen port |
122
+ | `OPENFOX_HOST` | `127.0.0.1` | Server bind host |
123
+ | `OPENFOX_WORKDIR` | `cwd` | Working directory |
124
+ | `OPENFOX_DB_PATH` | `./openfox.db` | SQLite database path |
125
+ | `OPENFOX_LOG_LEVEL` | `info` | Log level: `debug`, `info`, `warn`, `error` |
126
+ | `OPENFOX_REASONING_EFFORT` | — | Reasoning effort (e.g. `none`, `low`, `medium`, `high`) |
127
+ | `OPENFOX_DEV` | `false` | Enable dev mode |
128
+ | `OPENFOX_MODE` | `production` | Force mode: `production`, `development`, `test` |
129
+ | `OPENFOX_SERVICE` | `false` | Run as systemd service (suppresses browser open) |
130
+ | `OPENFOX_GIT_POLL_INTERVAL` | `10000` | Git status poll interval in ms |
131
+
110
132
  ## License
111
133
 
112
134
  MIT
@@ -2,11 +2,11 @@ import {
2
2
  buildRunChatTurnParams,
3
3
  finalizeTurnCompletion,
4
4
  generateSessionNameForSession
5
- } from "./chunk-NVQFIZJI.js";
5
+ } from "./chunk-QOZ2DIWF.js";
6
6
  import {
7
7
  runChatTurn
8
- } from "./chunk-ULZORR3T.js";
9
- import "./chunk-TT6LDJU5.js";
8
+ } from "./chunk-JREYASTD.js";
9
+ import "./chunk-CTGMHRHD.js";
10
10
  import "./chunk-LBGHZLLH.js";
11
11
  import "./chunk-PBGOZMVY.js";
12
12
  import "./chunk-VRGRAQDG.js";
@@ -22,7 +22,7 @@ import "./chunk-YQ3SOPBI.js";
22
22
  import "./chunk-55RWNJBT.js";
23
23
  import {
24
24
  getEventStore
25
- } from "./chunk-NF6WHQAT.js";
25
+ } from "./chunk-BSDMJT53.js";
26
26
  import "./chunk-EHYFYQXY.js";
27
27
  import "./chunk-ZPIZLTWU.js";
28
28
  import "./chunk-J2GP3J3X.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-EZ3BPIUV.js";
33
+ import "./chunk-K3NOKF5A.js";
34
34
  import "./chunk-CQGTEGKL.js";
35
35
  import "./chunk-V4IE7HJY.js";
36
36
  import "./chunk-5WRI5ZAA.js";
@@ -154,4 +154,4 @@ export {
154
154
  startChatSession,
155
155
  stopSessionExecution
156
156
  };
157
- //# sourceMappingURL=chat-handler-233L35BD.js.map
157
+ //# sourceMappingURL=chat-handler-N455RNSL.js.map
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-55RWNJBT.js";
5
5
  import {
6
6
  getCurrentWindowMessageOptions
7
- } from "./chunk-NF6WHQAT.js";
7
+ } from "./chunk-BSDMJT53.js";
8
8
 
9
9
  // src/server/context/compactor.ts
10
10
  function appendCompactionPrompt(sessionId, append) {
@@ -31,4 +31,4 @@ export {
31
31
  shouldCompact,
32
32
  getCompactionTarget
33
33
  };
34
- //# sourceMappingURL=chunk-WXAOEWJS.js.map
34
+ //# sourceMappingURL=chunk-4EFNO4BV.js.map
@@ -21,7 +21,7 @@ import {
21
21
  tokenFromPassword,
22
22
  verifyPassword,
23
23
  workflowExists
24
- } from "./chunk-V234MYXB.js";
24
+ } from "./chunk-IPTJ3MYR.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-TT6LDJU5.js";
64
+ } from "./chunk-CTGMHRHD.js";
65
65
  import {
66
66
  getPathSeparator,
67
67
  isAbsolutePath
@@ -109,7 +109,7 @@ import {
109
109
  updateSessionMetadata,
110
110
  updateSessionProvider,
111
111
  updateSessionRunning
112
- } from "./chunk-NF6WHQAT.js";
112
+ } from "./chunk-BSDMJT53.js";
113
113
  import {
114
114
  initDatabase
115
115
  } from "./chunk-ZPIZLTWU.js";
@@ -3837,7 +3837,7 @@ import { Router as Router7 } from "express";
3837
3837
  import { spawn as spawn2 } from "child_process";
3838
3838
 
3839
3839
  // src/constants.ts
3840
- var VERSION = "2.0.43";
3840
+ var VERSION = "2.0.45";
3841
3841
 
3842
3842
  // src/server/routes/auto-update.ts
3843
3843
  var updateInProgress = false;
@@ -4004,7 +4004,7 @@ async function createServerHandle(config4) {
4004
4004
  const mcpManager = new McpManager({
4005
4005
  onToolsDiscovered: async (name, tools) => {
4006
4006
  try {
4007
- const { loadGlobalConfig, saveGlobalConfig } = await import("./config-S5CF4QU4.js");
4007
+ const { loadGlobalConfig, saveGlobalConfig } = await import("./config-G5MVFHLP.js");
4008
4008
  const mode = config4.mode ?? "production";
4009
4009
  const globalConfig = await loadGlobalConfig(mode);
4010
4010
  const mcpServers2 = {
@@ -4034,7 +4034,7 @@ async function createServerHandle(config4) {
4034
4034
  setMcpTools(mcpTools);
4035
4035
  logger.info("MCP tools registered", { count: mcpTools.length });
4036
4036
  }
4037
- const { signalMcpReady } = await import("./server-GVQNOHX3.js");
4037
+ const { signalMcpReady } = await import("./server-RRS5ZQ7I.js");
4038
4038
  signalMcpReady();
4039
4039
  });
4040
4040
  const app = express();
@@ -4192,7 +4192,7 @@ async function createServerHandle(config4) {
4192
4192
  res.json({ project });
4193
4193
  });
4194
4194
  app.get("/api/sessions", async (req, res) => {
4195
- const { getRecentUserPromptsForSession } = await import("./events-THW3MYXE.js");
4195
+ const { getRecentUserPromptsForSession } = await import("./events-7RIPFG62.js");
4196
4196
  const projectId = req.query["projectId"];
4197
4197
  const limit = Math.min(parseInt(req.query["limit"]) || 20, 100);
4198
4198
  const offset = parseInt(req.query["offset"]) || 0;
@@ -4225,9 +4225,9 @@ async function createServerHandle(config4) {
4225
4225
  res.status(201).json({ session });
4226
4226
  });
4227
4227
  app.get("/api/sessions/:id", async (req, res) => {
4228
- const { getEventStore: getEventStore2 } = await import("./events-THW3MYXE.js");
4228
+ const { getEventStore: getEventStore2 } = await import("./events-7RIPFG62.js");
4229
4229
  const { buildMessagesFromStoredEvents } = await import("./folding-H5C6HS7O.js");
4230
- const { getPendingQuestionsForSession } = await import("./tools-PS5CSPGS.js");
4230
+ const { getPendingQuestionsForSession } = await import("./tools-ZPKIMLNI.js");
4231
4231
  const session = sessionManager.getSession(req.params.id);
4232
4232
  if (!session) {
4233
4233
  return res.status(404).json({ error: "Session not found" });
@@ -4258,7 +4258,7 @@ async function createServerHandle(config4) {
4258
4258
  res.json({ success: true });
4259
4259
  });
4260
4260
  app.post("/api/sessions/:id/provider", async (req, res) => {
4261
- const { getEventStore: getEventStore2 } = await import("./events-THW3MYXE.js");
4261
+ const { getEventStore: getEventStore2 } = await import("./events-7RIPFG62.js");
4262
4262
  const { buildMessagesFromStoredEvents } = await import("./folding-H5C6HS7O.js");
4263
4263
  const sessionId = req.params.id;
4264
4264
  const session = sessionManager.getSession(sessionId);
@@ -4272,7 +4272,7 @@ async function createServerHandle(config4) {
4272
4272
  const provider = providerManager.getProviders().find((p) => p.id === providerId);
4273
4273
  const resolvedModel = model ?? provider?.models?.[0]?.id ?? "auto";
4274
4274
  sessionManager.setSessionProvider(sessionId, providerId, resolvedModel);
4275
- const { loadGlobalConfig, saveGlobalConfig, setDefaultModelSelection } = await import("./config-S5CF4QU4.js");
4275
+ const { loadGlobalConfig, saveGlobalConfig, setDefaultModelSelection } = await import("./config-G5MVFHLP.js");
4276
4276
  const globalConfig = await loadGlobalConfig(config4.mode ?? "production");
4277
4277
  const updatedConfig = setDefaultModelSelection(globalConfig, providerId, resolvedModel);
4278
4278
  await saveGlobalConfig(config4.mode ?? "production", updatedConfig);
@@ -4321,7 +4321,7 @@ async function createServerHandle(config4) {
4321
4321
  res.json({ success: true });
4322
4322
  });
4323
4323
  app.put("/api/sessions/:id/mode", async (req, res) => {
4324
- const { getEventStore: getEventStore2 } = await import("./events-THW3MYXE.js");
4324
+ const { getEventStore: getEventStore2 } = await import("./events-7RIPFG62.js");
4325
4325
  const { buildMessagesFromStoredEvents } = await import("./folding-H5C6HS7O.js");
4326
4326
  const sessionId = req.params.id;
4327
4327
  const session = sessionManager.getSession(sessionId);
@@ -4378,15 +4378,15 @@ async function createServerHandle(config4) {
4378
4378
  if (!callId || approved === void 0) {
4379
4379
  return res.status(400).json({ error: "callId and approved are required" });
4380
4380
  }
4381
- const { providePathConfirmation } = await import("./tools-PS5CSPGS.js");
4381
+ const { providePathConfirmation } = await import("./tools-ZPKIMLNI.js");
4382
4382
  const result = providePathConfirmation(callId, approved, alwaysAllow);
4383
4383
  if (!result.found) {
4384
4384
  return res.status(404).json({ error: "No pending path confirmation with that ID" });
4385
4385
  }
4386
- const { getEventStore: getEventStore2 } = await import("./events-THW3MYXE.js");
4386
+ const { getEventStore: getEventStore2 } = await import("./events-7RIPFG62.js");
4387
4387
  const { buildMessagesFromStoredEvents, foldPendingConfirmations } = await import("./folding-H5C6HS7O.js");
4388
4388
  const { createSessionStateMessage } = await import("./protocol-CTNE3ANP.js");
4389
- const { getPendingQuestionsForSession } = await import("./tools-PS5CSPGS.js");
4389
+ const { getPendingQuestionsForSession } = await import("./tools-ZPKIMLNI.js");
4390
4390
  const eventStore = getEventStore2();
4391
4391
  const events = eventStore.getEvents(sessionId);
4392
4392
  const messages = buildMessagesFromStoredEvents(events);
@@ -4407,7 +4407,7 @@ async function createServerHandle(config4) {
4407
4407
  if (!skip && typeof answer !== "string") {
4408
4408
  return res.status(400).json({ error: "answer is required when not skipping" });
4409
4409
  }
4410
- const { provideAnswer } = await import("./tools-PS5CSPGS.js");
4410
+ const { provideAnswer } = await import("./tools-ZPKIMLNI.js");
4411
4411
  const found = provideAnswer(callId, answer ?? "", skip ?? false);
4412
4412
  if (!found) {
4413
4413
  return res.status(404).json({ error: "No pending question with that ID" });
@@ -4443,15 +4443,15 @@ async function createServerHandle(config4) {
4443
4443
  if (!session) {
4444
4444
  return res.status(404).json({ error: "Session not found" });
4445
4445
  }
4446
- const { stopSessionExecution } = await import("./chat-handler-233L35BD.js");
4447
- const { cancelQuestionsForSession, cancelPathConfirmationsForSession } = await import("./tools-PS5CSPGS.js");
4446
+ const { stopSessionExecution } = await import("./chat-handler-N455RNSL.js");
4447
+ const { cancelQuestionsForSession, cancelPathConfirmationsForSession } = await import("./tools-ZPKIMLNI.js");
4448
4448
  const queuedMessages = sessionManager.getQueueState(sessionId);
4449
4449
  sessionManager.clearMessageQueue(sessionId);
4450
4450
  stopSessionExecution(sessionId, sessionManager);
4451
4451
  abortSession(sessionId);
4452
4452
  cancelQuestionsForSession(sessionId, "Session stopped by user");
4453
4453
  cancelPathConfirmationsForSession(sessionId, "Session stopped by user");
4454
- const eventStore = (await import("./events-THW3MYXE.js")).getEventStore();
4454
+ const eventStore = (await import("./events-7RIPFG62.js")).getEventStore();
4455
4455
  eventStore.append(sessionId, { type: "running.changed", data: { isRunning: false } });
4456
4456
  res.json({ success: true, queuedMessages });
4457
4457
  });
@@ -4465,7 +4465,7 @@ async function createServerHandle(config4) {
4465
4465
  if (typeof messageIndex !== "number" || messageIndex < 0) {
4466
4466
  return res.status(400).json({ error: "messageIndex must be a non-negative number" });
4467
4467
  }
4468
- const { truncateSessionMessages } = await import("./events-THW3MYXE.js");
4468
+ const { truncateSessionMessages } = await import("./events-7RIPFG62.js");
4469
4469
  truncateSessionMessages(sessionId, messageIndex);
4470
4470
  res.json({ success: true });
4471
4471
  });
@@ -4483,7 +4483,7 @@ async function createServerHandle(config4) {
4483
4483
  if (!msg) {
4484
4484
  return res.status(400).json({ error: "Message not found at this index" });
4485
4485
  }
4486
- const { truncateSessionMessages } = await import("./events-THW3MYXE.js");
4486
+ const { truncateSessionMessages } = await import("./events-7RIPFG62.js");
4487
4487
  truncateSessionMessages(sessionId, messageIndex - 1);
4488
4488
  sessionManager.queueMessage(sessionId, "asap", msg.content, msg.attachments, msg.messageKind);
4489
4489
  res.json({ success: true });
@@ -4555,7 +4555,7 @@ async function createServerHandle(config4) {
4555
4555
  let visionFallback;
4556
4556
  let globalWorkdir;
4557
4557
  try {
4558
- const { loadGlobalConfig, getVisionFallback } = await import("./config-S5CF4QU4.js");
4558
+ const { loadGlobalConfig, getVisionFallback } = await import("./config-G5MVFHLP.js");
4559
4559
  const globalConfig = await loadGlobalConfig(config4.mode ?? "production");
4560
4560
  const fallback = getVisionFallback(globalConfig);
4561
4561
  if (fallback) {
@@ -4768,7 +4768,7 @@ async function createServerHandle(config4) {
4768
4768
  return res.status(400).json({ error: "name, url, and backend are required" });
4769
4769
  }
4770
4770
  try {
4771
- const { loadGlobalConfig, saveGlobalConfig, addProvider, setDefaultModelSelection } = await import("./config-S5CF4QU4.js");
4771
+ const { loadGlobalConfig, saveGlobalConfig, addProvider, setDefaultModelSelection } = await import("./config-G5MVFHLP.js");
4772
4772
  const globalConfig = await loadGlobalConfig(config4.mode ?? "production");
4773
4773
  const providerBackend = backend;
4774
4774
  const providerModels = modelConfigs?.length ? buildModelConfigs(modelConfigs) : model ? [{ id: model, contextWindow: 2e5, source: "user" }] : [];
@@ -4806,7 +4806,7 @@ async function createServerHandle(config4) {
4806
4806
  app.post("/api/init/config", async (req, res) => {
4807
4807
  const { workdir, visionFallback } = req.body;
4808
4808
  try {
4809
- const { loadGlobalConfig, saveGlobalConfig } = await import("./config-S5CF4QU4.js");
4809
+ const { loadGlobalConfig, saveGlobalConfig } = await import("./config-G5MVFHLP.js");
4810
4810
  const globalConfig = await loadGlobalConfig(config4.mode ?? "production");
4811
4811
  const updatedConfig = {
4812
4812
  ...globalConfig,
@@ -4834,7 +4834,7 @@ async function createServerHandle(config4) {
4834
4834
  });
4835
4835
  app.delete("/api/providers/:id", async (req, res) => {
4836
4836
  const { id } = req.params;
4837
- const { loadGlobalConfig, saveGlobalConfig, removeProvider } = await import("./config-S5CF4QU4.js");
4837
+ const { loadGlobalConfig, saveGlobalConfig, removeProvider } = await import("./config-G5MVFHLP.js");
4838
4838
  const globalConfig = await loadGlobalConfig(config4.mode ?? "production");
4839
4839
  const updatedConfig = removeProvider(globalConfig, id);
4840
4840
  await saveGlobalConfig(config4.mode ?? "production", updatedConfig);
@@ -4846,7 +4846,7 @@ async function createServerHandle(config4) {
4846
4846
  const { id } = req.params;
4847
4847
  const { isLocal } = req.body;
4848
4848
  try {
4849
- const { loadGlobalConfig, saveGlobalConfig, updateProvider } = await import("./config-S5CF4QU4.js");
4849
+ const { loadGlobalConfig, saveGlobalConfig, updateProvider } = await import("./config-G5MVFHLP.js");
4850
4850
  const globalConfig = await loadGlobalConfig(config4.mode ?? "production");
4851
4851
  const provider = globalConfig.providers.find((p) => p.id === id);
4852
4852
  if (!provider) {
@@ -4875,7 +4875,7 @@ async function createServerHandle(config4) {
4875
4875
  models: modelConfigs
4876
4876
  } = req.body;
4877
4877
  try {
4878
- const { loadGlobalConfig, saveGlobalConfig, updateProvider } = await import("./config-S5CF4QU4.js");
4878
+ const { loadGlobalConfig, saveGlobalConfig, updateProvider } = await import("./config-G5MVFHLP.js");
4879
4879
  const globalConfig = await loadGlobalConfig(config4.mode ?? "production");
4880
4880
  const provider = globalConfig.providers.find((p) => p.id === id);
4881
4881
  if (!provider) {
@@ -4913,7 +4913,7 @@ async function createServerHandle(config4) {
4913
4913
  return res.status(400).json({ error: result.error });
4914
4914
  }
4915
4915
  const llmClient = getLLMClient();
4916
- const { loadGlobalConfig, saveGlobalConfig, setDefaultModelSelection } = await import("./config-S5CF4QU4.js");
4916
+ const { loadGlobalConfig, saveGlobalConfig, setDefaultModelSelection } = await import("./config-G5MVFHLP.js");
4917
4917
  const globalConfig = await loadGlobalConfig(config4.mode ?? "production");
4918
4918
  const updatedConfig = setDefaultModelSelection(globalConfig, id, llmClient.getModel());
4919
4919
  await saveGlobalConfig(config4.mode ?? "production", updatedConfig);
@@ -4940,7 +4940,7 @@ async function createServerHandle(config4) {
4940
4940
  });
4941
4941
  async function rebuildMcpTools() {
4942
4942
  const { createMcpTools: createMcpTools2 } = await import("./tool-adapter-MOGEI6TP.js");
4943
- const { setMcpTools: setMcpTools2 } = await import("./tools-PS5CSPGS.js");
4943
+ const { setMcpTools: setMcpTools2 } = await import("./tools-ZPKIMLNI.js");
4944
4944
  const mcpTools = createMcpTools2(mcpManager);
4945
4945
  setMcpTools2(mcpTools);
4946
4946
  }
@@ -5002,7 +5002,7 @@ async function createServerHandle(config4) {
5002
5002
  };
5003
5003
  await mcpManager.addServer(name, serverCfg);
5004
5004
  const server = mcpManager.getServer(name);
5005
- const { loadGlobalConfig, saveGlobalConfig } = await import("./config-S5CF4QU4.js");
5005
+ const { loadGlobalConfig, saveGlobalConfig } = await import("./config-G5MVFHLP.js");
5006
5006
  const globalConfig = await loadGlobalConfig(config4.mode ?? "production");
5007
5007
  const updatedMcpServers = { ...globalConfig.mcpServers ?? {}, [name]: serverCfg };
5008
5008
  await saveGlobalConfig(config4.mode ?? "production", {
@@ -5028,7 +5028,7 @@ async function createServerHandle(config4) {
5028
5028
  return res.status(404).json({ error: `MCP server '${name}' not found` });
5029
5029
  }
5030
5030
  mcpManager.removeServer(name);
5031
- const { loadGlobalConfig, saveGlobalConfig } = await import("./config-S5CF4QU4.js");
5031
+ const { loadGlobalConfig, saveGlobalConfig } = await import("./config-G5MVFHLP.js");
5032
5032
  const globalConfig = await loadGlobalConfig(config4.mode ?? "production");
5033
5033
  const updatedMcpServers = { ...globalConfig.mcpServers ?? {} };
5034
5034
  delete updatedMcpServers[name];
@@ -5053,7 +5053,7 @@ async function createServerHandle(config4) {
5053
5053
  await mcpManager.setToolEnabled(name, toolName, enabled);
5054
5054
  const server = mcpManager.getServer(name);
5055
5055
  if (server) {
5056
- const { loadGlobalConfig, saveGlobalConfig } = await import("./config-S5CF4QU4.js");
5056
+ const { loadGlobalConfig, saveGlobalConfig } = await import("./config-G5MVFHLP.js");
5057
5057
  const globalConfig = await loadGlobalConfig(config4.mode ?? "production");
5058
5058
  const mcpServers2 = { ...globalConfig.mcpServers ?? {} };
5059
5059
  const serverCfg = mcpServers2[name];
@@ -5248,7 +5248,7 @@ async function createServerHandle(config4) {
5248
5248
  const state = sessionManager.getContextState(sessionId);
5249
5249
  wssExports.broadcastForSession(sessionId, createContextStateMessage(state));
5250
5250
  });
5251
- const { QueueProcessor } = await import("./processor-T6FX54JU.js");
5251
+ const { QueueProcessor } = await import("./processor-X53RROTI.js");
5252
5252
  const queueProcessor = new QueueProcessor({
5253
5253
  sessionManager,
5254
5254
  providerManager,
@@ -5323,4 +5323,4 @@ export {
5323
5323
  createServerHandle,
5324
5324
  createServer
5325
5325
  };
5326
- //# sourceMappingURL=chunk-FZ5LNBZS.js.map
5326
+ //# sourceMappingURL=chunk-4GBKQZ2U.js.map
@@ -931,6 +931,8 @@ var envSchema = z.object({
931
931
  OPENFOX_REASONING_EFFORT: z.string().optional(),
932
932
  // Deprecated: use OPENFOX_REASONING_EFFORT=none instead
933
933
  OPENFOX_DISABLE_THINKING: z.coerce.boolean().default(false),
934
+ OPENFOX_LLM_TIMEOUT: z.coerce.number().default(3e5),
935
+ OPENFOX_LLM_IDLE_TIMEOUT: z.coerce.number().default(3e5),
934
936
  OPENFOX_DEV: z.coerce.boolean().default(false)
935
937
  });
936
938
  function loadConfig() {
@@ -941,10 +943,8 @@ function loadConfig() {
941
943
  llm: {
942
944
  baseUrl: llmUrl,
943
945
  model: env.OPENFOX_MODEL_NAME,
944
- timeout: 3e5,
945
- // 5 minutes (deprecated, kept for backward compatibility)
946
- idleTimeout: 3e5,
947
- // 5 minutes of inactivity
946
+ timeout: env.OPENFOX_LLM_TIMEOUT,
947
+ idleTimeout: env.OPENFOX_LLM_IDLE_TIMEOUT,
948
948
  backend: env.OPENFOX_BACKEND,
949
949
  ...env.OPENFOX_REASONING_EFFORT ? { reasoningEffort: env.OPENFOX_REASONING_EFFORT } : env.OPENFOX_DISABLE_THINKING ? { reasoningEffort: "none" } : {}
950
950
  },
@@ -1432,4 +1432,4 @@ export {
1432
1432
  truncateSessionMessages,
1433
1433
  getRecentUserPromptsForSession
1434
1434
  };
1435
- //# sourceMappingURL=chunk-NF6WHQAT.js.map
1435
+ //# sourceMappingURL=chunk-BSDMJT53.js.map
@@ -55,7 +55,7 @@ import {
55
55
  getCurrentWindowMessageOptions,
56
56
  getEventStore,
57
57
  getRuntimeConfig
58
- } from "./chunk-NF6WHQAT.js";
58
+ } from "./chunk-BSDMJT53.js";
59
59
  import {
60
60
  buildContextMessagesFromEventHistory,
61
61
  foldContextState,
@@ -71,7 +71,7 @@ import {
71
71
  import {
72
72
  loadGlobalConfig,
73
73
  saveGlobalConfig
74
- } from "./chunk-EZ3BPIUV.js";
74
+ } from "./chunk-K3NOKF5A.js";
75
75
  import {
76
76
  getGlobalConfigDir
77
77
  } from "./chunk-CQGTEGKL.js";
@@ -948,7 +948,7 @@ var readFileTool = createTool(
948
948
  const startLine = Math.max(1, offset);
949
949
  const endLine = Math.min(startLine + limit - 1, totalLines);
950
950
  const selectedLines = lines.slice(startLine - 1, endLine);
951
- const formatted = selectedLines.map((line, i) => `${startLine + i}: ${line}`).join("\n");
951
+ const formatted = selectedLines.map((line, i) => `${startLine + i}|${line}`).join("\n");
952
952
  const truncated = endLine < totalLines;
953
953
  let output = formatted;
954
954
  if (truncated) {
@@ -2581,7 +2581,7 @@ ${CONTINUE_PROMPT}` : CONTINUE_PROMPT;
2581
2581
  sessionManager.setCurrentContextSize(sessionId, result.usage.promptTokens);
2582
2582
  if (!compacting) {
2583
2583
  const contextState2 = sessionManager.getContextState(sessionId);
2584
- const { shouldCompact, appendCompactionPrompt } = await import("./compactor-TJEAAZL3.js");
2584
+ const { shouldCompact, appendCompactionPrompt } = await import("./compactor-LQ46XQJV.js");
2585
2585
  if (shouldCompact(contextState2.currentTokens, contextState2.maxTokens, runtimeConfig.context.compactionThreshold)) {
2586
2586
  appendCompactionPrompt(sessionId, append);
2587
2587
  compacting = true;
@@ -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-S5CF4QU4.js");
2941
+ const { loadGlobalConfig: loadGlobalConfig2, getVisionFallback } = await import("./config-G5MVFHLP.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-PS5CSPGS.js");
3455
+ const { getToolRegistryForAgent: getToolRegistryForAgent2 } = await import("./tools-ZPKIMLNI.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-PS5CSPGS.js");
4271
+ const { getToolRegistryForAgent: getToolRegistryForAgent2 } = await import("./tools-ZPKIMLNI.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-PS5CSPGS.js");
4284
+ const { getToolRegistryForAgent: getToolRegistryForAgent2 } = await import("./tools-ZPKIMLNI.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-PS5CSPGS.js");
4391
+ const { setMcpTools: setMcpTools2 } = await import("./tools-ZPKIMLNI.js");
4392
4392
  const mcpTools = createMcpTools(mcpManagerForTools);
4393
4393
  setMcpTools2(mcpTools);
4394
4394
  }
@@ -5058,4 +5058,4 @@ export {
5058
5058
  getToolRegistryForAgent,
5059
5059
  createToolRegistry
5060
5060
  };
5061
- //# sourceMappingURL=chunk-TT6LDJU5.js.map
5061
+ //# sourceMappingURL=chunk-CTGMHRHD.js.map
@@ -2,7 +2,7 @@ import {
2
2
  injectWorkflowKickoffIfNeeded,
3
3
  runAgentTurn,
4
4
  runChatTurn
5
- } from "./chunk-ULZORR3T.js";
5
+ } from "./chunk-JREYASTD.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-TT6LDJU5.js";
19
+ } from "./chunk-CTGMHRHD.js";
20
20
  import {
21
21
  getPlatformShell,
22
22
  onProcessEvent
@@ -40,7 +40,7 @@ import {
40
40
  } from "./chunk-EU3WWTFH.js";
41
41
  import {
42
42
  appendCompactionPrompt
43
- } from "./chunk-WXAOEWJS.js";
43
+ } from "./chunk-4EFNO4BV.js";
44
44
  import {
45
45
  TurnMetrics,
46
46
  createMessageStartEvent
@@ -49,7 +49,7 @@ import {
49
49
  getCurrentContextWindowId,
50
50
  getEventStore,
51
51
  getRuntimeConfig
52
- } from "./chunk-NF6WHQAT.js";
52
+ } from "./chunk-BSDMJT53.js";
53
53
  import {
54
54
  createLLMClient
55
55
  } from "./chunk-ZBLT7MNL.js";
@@ -2065,4 +2065,4 @@ export {
2065
2065
  signalMcpReady,
2066
2066
  createWebSocketServer
2067
2067
  };
2068
- //# sourceMappingURL=chunk-V234MYXB.js.map
2068
+ //# sourceMappingURL=chunk-IPTJ3MYR.js.map
@@ -12,7 +12,7 @@ import {
12
12
  loadAllAgentsDefault,
13
13
  processEventsForConversation,
14
14
  runTopLevelAgentLoop
15
- } from "./chunk-TT6LDJU5.js";
15
+ } from "./chunk-CTGMHRHD.js";
16
16
  import {
17
17
  TurnMetrics,
18
18
  WORKFLOW_KICKOFF_PROMPT,
@@ -26,7 +26,7 @@ import {
26
26
  getCurrentWindowMessageOptions,
27
27
  getEventStore,
28
28
  getRuntimeConfig
29
- } from "./chunk-NF6WHQAT.js";
29
+ } from "./chunk-BSDMJT53.js";
30
30
  import {
31
31
  buildSnapshotFromSessionState
32
32
  } from "./chunk-EHYFYQXY.js";
@@ -310,4 +310,4 @@ export {
310
310
  runAgentTurn,
311
311
  injectWorkflowKickoffIfNeeded
312
312
  };
313
- //# sourceMappingURL=chunk-ULZORR3T.js.map
313
+ //# sourceMappingURL=chunk-JREYASTD.js.map
@@ -78,6 +78,10 @@ var mcpServerSchema = z.object({
78
78
  disabledTools: z.array(z.string()).optional(),
79
79
  cachedTools: z.array(cachedToolSchema).optional()
80
80
  });
81
+ var llmConfigSchema = z.object({
82
+ timeout: z.number().optional(),
83
+ idleTimeout: z.number().optional()
84
+ });
81
85
  var defaultVisionFallback = {
82
86
  enabled: false,
83
87
  url: "http://localhost:11434",
@@ -95,6 +99,7 @@ var configSchema = z.object({
95
99
  logging: loggingSchema.default({ level: "error" }),
96
100
  database: databaseSchema.default({ path: "" }),
97
101
  workspace: workspaceSchema.default(() => ({ workdir: process.cwd() })),
102
+ llm: llmConfigSchema.optional(),
98
103
  visionFallback: visionFallbackSchema.optional()
99
104
  }).transform((data) => ({
100
105
  providers: data.providers ?? [],
@@ -106,6 +111,7 @@ var configSchema = z.object({
106
111
  logging: data.logging ?? { level: "error" },
107
112
  database: data.database ?? { path: "" },
108
113
  workspace: data.workspace ?? { workdir: process.cwd() },
114
+ llm: data.llm,
109
115
  visionFallback: data.visionFallback ?? defaultVisionFallback
110
116
  }));
111
117
  var oldLlmSchema = z.object({
@@ -239,6 +245,7 @@ async function saveGlobalConfig(mode, config) {
239
245
  logging: config.logging ?? { level: "error" },
240
246
  database: config.database ?? { path: "" },
241
247
  workspace: config.workspace ?? { workdir: process.cwd() },
248
+ llm: config.llm,
242
249
  visionFallback: config.visionFallback ?? defaultVisionFallback
243
250
  };
244
251
  await mkdir(dirname(configPath), { recursive: true });
@@ -270,6 +277,7 @@ function setDefaultModelSelection(config, providerId, model) {
270
277
  logging: config.logging ?? { level: "error" },
271
278
  database: config.database ?? { path: "" },
272
279
  workspace: config.workspace ?? { workdir: process.cwd() },
280
+ llm: config.llm,
273
281
  visionFallback: config.visionFallback ?? defaultVisionFallback
274
282
  };
275
283
  }
@@ -293,6 +301,7 @@ function addProvider(config, provider) {
293
301
  logging: config.logging ?? { level: "error" },
294
302
  database: config.database ?? { path: "" },
295
303
  workspace: config.workspace ?? { workdir: process.cwd() },
304
+ llm: config.llm,
296
305
  visionFallback: config.visionFallback ?? defaultVisionFallback
297
306
  };
298
307
  }
@@ -326,6 +335,7 @@ function removeProvider(config, providerId) {
326
335
  logging: config.logging ?? { level: "error" },
327
336
  database: config.database ?? { path: "" },
328
337
  workspace: config.workspace ?? { workdir: process.cwd() },
338
+ llm: config.llm,
329
339
  visionFallback: config.visionFallback ?? defaultVisionFallback
330
340
  };
331
341
  }
@@ -342,6 +352,7 @@ function activateProvider(config, providerId) {
342
352
  logging: config.logging ?? { level: "error" },
343
353
  database: config.database ?? { path: "" },
344
354
  workspace: config.workspace ?? { workdir: process.cwd() },
355
+ llm: config.llm,
345
356
  visionFallback: config.visionFallback ?? defaultVisionFallback
346
357
  };
347
358
  }
@@ -355,6 +366,7 @@ function activateProvider(config, providerId) {
355
366
  logging: config.logging ?? { level: "error" },
356
367
  database: config.database ?? { path: "" },
357
368
  workspace: config.workspace ?? { workdir: process.cwd() },
369
+ llm: config.llm,
358
370
  visionFallback: config.visionFallback ?? defaultVisionFallback
359
371
  };
360
372
  }
@@ -402,4 +414,4 @@ export {
402
414
  activateProvider,
403
415
  mergeConfigs
404
416
  };
405
- //# sourceMappingURL=chunk-EZ3BPIUV.js.map
417
+ //# sourceMappingURL=chunk-K3NOKF5A.js.map
@@ -39,7 +39,7 @@ Options:
39
39
  }
40
40
  async function runNetworkSetup(mode) {
41
41
  const { loadAuthConfig, saveAuthConfig, encryptPassword } = await import("./auth-YY5PJYSC.js");
42
- const { saveGlobalConfig } = await import("./config-S5CF4QU4.js");
42
+ const { saveGlobalConfig } = await import("./config-G5MVFHLP.js");
43
43
  const { getAuthKeyPath } = await import("./paths-F27V3S4I.js");
44
44
  const existingAuth = await loadAuthConfig(mode);
45
45
  if (existingAuth) {
@@ -106,7 +106,7 @@ async function runNetworkSetup(mode) {
106
106
  console.log("\u2713 Configuration saved!\n");
107
107
  }
108
108
  async function runConfig(mode) {
109
- const { loadGlobalConfig, getActiveProvider, getDefaultModel } = await import("./config-S5CF4QU4.js");
109
+ const { loadGlobalConfig, getActiveProvider, getDefaultModel } = await import("./config-G5MVFHLP.js");
110
110
  const { getGlobalConfigPath } = await import("./paths-F27V3S4I.js");
111
111
  const config = await loadGlobalConfig(mode);
112
112
  const configPath = getGlobalConfigPath(mode);
@@ -164,7 +164,7 @@ async function runCli(options) {
164
164
  break;
165
165
  }
166
166
  case "provider": {
167
- const { runProviderCommand } = await import("./provider-JDI3LVYF.js");
167
+ const { runProviderCommand } = await import("./provider-DLH5GJH2.js");
168
168
  const [, subcommand] = positionals;
169
169
  await runProviderCommand(mode, subcommand);
170
170
  break;
@@ -203,12 +203,12 @@ async function runCli(options) {
203
203
  break;
204
204
  }
205
205
  default: {
206
- const { configFileExists } = await import("./config-S5CF4QU4.js");
206
+ const { configFileExists } = await import("./config-G5MVFHLP.js");
207
207
  const configExists = await configFileExists(mode);
208
208
  if (!configExists) {
209
209
  await runNetworkSetup(mode);
210
210
  }
211
- const { runServe } = await import("./serve-LAAYCXXI.js");
211
+ const { runServe } = await import("./serve-XY327IVV.js");
212
212
  const serveOptions = { mode };
213
213
  if (values.port) serveOptions.port = parseInt(values.port);
214
214
  if (values["no-browser"] === true) serveOptions.openBrowser = false;
@@ -220,4 +220,4 @@ async function runCli(options) {
220
220
  export {
221
221
  runCli
222
222
  };
223
- //# sourceMappingURL=chunk-FQ6UFNTT.js.map
223
+ //# sourceMappingURL=chunk-OBKCUYR5.js.map