openfox 2.0.74 → 2.0.76

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 (61) hide show
  1. package/README.md +5 -2
  2. package/dist/{chat-handler-ETKFIHUO.js → chat-handler-3BZ4PDL2.js} +17 -16
  3. package/dist/chunk-46RORSKU.js +495 -0
  4. package/dist/{chunk-S7O77CVO.js → chunk-4QHDQP2N.js} +2 -2
  5. package/dist/{chunk-YD6NDTKF.js → chunk-5GOOSZX7.js} +1 -1
  6. package/dist/{chunk-XWBNYU2L.js → chunk-7772ENZN.js} +4 -3
  7. package/dist/{chunk-I4RWK2L2.js → chunk-7QXRQ5ZL.js} +3 -3
  8. package/dist/{chunk-2VBETAU2.js → chunk-D6CI2B7B.js} +111 -539
  9. package/dist/{chunk-E5LLEO3C.js → chunk-DH3SSBZN.js} +2 -2
  10. package/dist/{chunk-CHPRGEY5.js → chunk-HAQV6AJP.js} +3 -3
  11. package/dist/{chunk-R6L2QXQ5.js → chunk-HHUIXHHX.js} +16 -6
  12. package/dist/{chunk-ZRQDCQ7R.js → chunk-HLHGNHMV.js} +10 -8
  13. package/dist/{chunk-QFR6JF32.js → chunk-J7VCI5EX.js} +205 -82
  14. package/dist/chunk-KQEVAO2Q.js +7 -0
  15. package/dist/{chunk-UN26GIQG.js → chunk-KVRSAC4Z.js} +1 -1
  16. package/dist/{chunk-UV3EMWL4.js → chunk-LXFLRM7M.js} +2 -2
  17. package/dist/{chunk-6XKM25OT.js → chunk-NGJ5XJ7D.js} +4 -4
  18. package/dist/{chunk-NOU2QIL5.js → chunk-O3NUNU4H.js} +5 -2
  19. package/dist/{chunk-PYB2UEC3.js → chunk-OBQPXUXI.js} +4 -4
  20. package/dist/{chunk-OHGQILRF.js → chunk-OCVRIPQP.js} +2 -2
  21. package/dist/{chunk-TMRFTWXP.js → chunk-OMWVB2XC.js} +38 -23
  22. package/dist/{chunk-6XOA2WPU.js → chunk-W4ZEG3LX.js} +5 -2
  23. package/dist/{chunk-2DCJERYX.js → chunk-XTK6E2QR.js} +4 -4
  24. package/dist/{chunk-QNKXZH3Z.js → chunk-YMFCFMMB.js} +2 -2
  25. package/dist/cli/dev.js +1 -1
  26. package/dist/cli/index.js +1 -1
  27. package/dist/{client-SC6X65GY.js → client-TDPQVBQ7.js} +2 -2
  28. package/dist/{compactor-4UKYWC5F.js → compactor-BB3YYVRP.js} +7 -7
  29. package/dist/{events-AEQ6GQXI.js → events-FLWRLM6V.js} +3 -3
  30. package/dist/{inspect-proxy-PHVZBZUO.js → inspect-proxy-JHZV34QR.js} +4 -4
  31. package/dist/install-CPOPMCSE.js +120 -0
  32. package/dist/{manager-24C2AXVF.js → manager-OPMCSYN2.js} +5 -5
  33. package/dist/{orchestrator-O2YAAZ3U.js → orchestrator-5IMCWX5P.js} +16 -15
  34. package/dist/package.json +1 -1
  35. package/dist/path-security-ZROWNL22.js +50 -0
  36. package/dist/{platform-XQ7BS3KQ.js → platform-QGXO3CNR.js} +4 -4
  37. package/dist/plugins-registry.json +6 -0
  38. package/dist/{processor-FKAS3K4L.js → processor-3R4GS6VB.js} +17 -16
  39. package/dist/{project-creator-FQRBN3RG.js → project-creator-C22J43BC.js} +3 -3
  40. package/dist/{projects-LHRNCUGW.js → projects-WSVINK2C.js} +3 -3
  41. package/dist/{protocol-4QFU7WAI.js → protocol-EWEVW65B.js} +3 -3
  42. package/dist/{protocol-DGQWVFcP.d.ts → protocol-Sr6Jr4ZS.d.ts} +5 -2
  43. package/dist/{provider-OJUCZ5RN.js → provider-G2YC2IC4.js} +3 -3
  44. package/dist/{provider-manager-MAKXSL6L.js → provider-manager-SQIELYLK.js} +3 -3
  45. package/dist/{serve-T5U6SLB7.js → serve-MXKMKZYY.js} +22 -21
  46. package/dist/server/index.d.ts +1 -1
  47. package/dist/server/index.js +21 -20
  48. package/dist/{server-T2YP3VT2.js → server-SPYFMFQE.js} +18 -17
  49. package/dist/{settings-PFXRYXZU.js → settings-7XDMSPIC.js} +3 -3
  50. package/dist/shared/index.d.ts +1 -1
  51. package/dist/shared/index.js +1 -1
  52. package/dist/{tools-APW7MY4E.js → tools-JRCUWPJO.js} +20 -18
  53. package/dist/{update-FWO365SV.js → update-OXDQ75M7.js} +12 -3
  54. package/dist/{update-server-MYYQUNZX.js → update-server-4MTM7M5P.js} +2 -2
  55. package/dist/web/assets/{index-DZRcUhoE.css → index-BNVBxKnB.css} +1 -1
  56. package/dist/web/assets/{index-Xh2VHbZe.js → index-ghDkIdlf.js} +74 -74
  57. package/dist/web/index.html +2 -2
  58. package/dist/web/sw.js +1 -1
  59. package/package.json +1 -1
  60. package/plugins-registry.json +6 -0
  61. package/dist/chunk-3OZBPWHP.js +0 -7
@@ -21,7 +21,7 @@ import {
21
21
  tokenFromPassword,
22
22
  verifyPassword,
23
23
  workflowExists
24
- } from "./chunk-TMRFTWXP.js";
24
+ } from "./chunk-OMWVB2XC.js";
25
25
  import {
26
26
  agentExists,
27
27
  createToolRegistry,
@@ -66,7 +66,10 @@ import {
66
66
  setSkillEnabled,
67
67
  skillExists,
68
68
  updateOwnedSkill
69
- } from "./chunk-2VBETAU2.js";
69
+ } from "./chunk-D6CI2B7B.js";
70
+ import {
71
+ createMcpTools
72
+ } from "./chunk-NWO6GRYE.js";
70
73
  import {
71
74
  deleteWorkspace,
72
75
  ensureWorkspace,
@@ -86,16 +89,22 @@ import {
86
89
  ALWAYS_ALLOWED,
87
90
  ALWAYS_ALLOWED_FOR_SUBAGENTS,
88
91
  TOP_LEVEL_ONLY_TOOLS
89
- } from "./chunk-XWBNYU2L.js";
92
+ } from "./chunk-7772ENZN.js";
90
93
  import {
91
94
  getProject
92
- } from "./chunk-UV3EMWL4.js";
95
+ } from "./chunk-LXFLRM7M.js";
93
96
  import {
94
- createMcpTools
95
- } from "./chunk-NWO6GRYE.js";
97
+ getPathSeparator,
98
+ isAbsolutePath
99
+ } from "./chunk-4QHDQP2N.js";
100
+ import {
101
+ deleteSetting,
102
+ getSetting,
103
+ setSetting
104
+ } from "./chunk-YMFCFMMB.js";
96
105
  import {
97
106
  VERSION
98
- } from "./chunk-3OZBPWHP.js";
107
+ } from "./chunk-KQEVAO2Q.js";
99
108
  import {
100
109
  createSession,
101
110
  deleteSession,
@@ -123,28 +132,19 @@ import {
123
132
  updateSessionProvider,
124
133
  updateSessionRunning,
125
134
  updateSessionWorkdir
126
- } from "./chunk-6XKM25OT.js";
127
- import {
128
- createContextStateMessage
129
- } from "./chunk-NOU2QIL5.js";
130
- import {
131
- getPathSeparator,
132
- isAbsolutePath
133
- } from "./chunk-S7O77CVO.js";
134
- import {
135
- deleteSetting,
136
- getSetting,
137
- setSetting
138
- } from "./chunk-QNKXZH3Z.js";
135
+ } from "./chunk-NGJ5XJ7D.js";
139
136
  import {
140
137
  initDatabase
141
- } from "./chunk-I4RWK2L2.js";
138
+ } from "./chunk-7QXRQ5ZL.js";
139
+ import {
140
+ createContextStateMessage
141
+ } from "./chunk-O3NUNU4H.js";
142
142
  import {
143
143
  createProviderManager,
144
144
  detectModel,
145
145
  getLlmStatus,
146
146
  parseDefaultModelSelection
147
- } from "./chunk-OHGQILRF.js";
147
+ } from "./chunk-OCVRIPQP.js";
148
148
  import {
149
149
  getModelProfile
150
150
  } from "./chunk-V4IE7HJY.js";
@@ -163,7 +163,7 @@ import {
163
163
  } from "./chunk-K44MW7JJ.js";
164
164
  import {
165
165
  createServerMessage
166
- } from "./chunk-YD6NDTKF.js";
166
+ } from "./chunk-5GOOSZX7.js";
167
167
  import {
168
168
  getGlobalConfigDir
169
169
  } from "./chunk-CQGTEGKL.js";
@@ -4221,6 +4221,16 @@ function createDirectoryRoutes() {
4221
4221
  // src/server/routes/file-search.ts
4222
4222
  import { Router as Router8 } from "express";
4223
4223
  import fg from "fast-glob";
4224
+ var IGNORED_PATTERNS = [
4225
+ "**/node_modules/**",
4226
+ "**/.git/**",
4227
+ "**/dist/**",
4228
+ "**/.next/**",
4229
+ "**/.cache/**",
4230
+ "**/__pycache__/**",
4231
+ "**/*.lock",
4232
+ "**/.openfox/**"
4233
+ ];
4224
4234
  function createFileSearchRoutes() {
4225
4235
  const router = Router8();
4226
4236
  router.get("/", async (req, res) => {
@@ -4236,21 +4246,15 @@ function createFileSearchRoutes() {
4236
4246
  return router;
4237
4247
  }
4238
4248
  async function searchFiles(query, workdir) {
4249
+ if (query.endsWith("/")) {
4250
+ return listDirectoryContents(query, workdir);
4251
+ }
4239
4252
  const entries = await fg(["**/*"], {
4240
4253
  cwd: workdir,
4241
4254
  dot: true,
4242
- deep: 5,
4255
+ deep: 32,
4243
4256
  onlyFiles: false,
4244
- ignore: [
4245
- "**/node_modules/**",
4246
- "**/.git/**",
4247
- "**/dist/**",
4248
- "**/.next/**",
4249
- "**/.cache/**",
4250
- "**/__pycache__/**",
4251
- "**/*.lock",
4252
- "**/.openfox/**"
4253
- ],
4257
+ ignore: IGNORED_PATTERNS,
4254
4258
  objectMode: true
4255
4259
  });
4256
4260
  const scored = [];
@@ -4274,6 +4278,28 @@ async function searchFiles(query, workdir) {
4274
4278
  scored.sort((a, b) => b.score - a.score);
4275
4279
  return scored.slice(0, 20);
4276
4280
  }
4281
+ async function listDirectoryContents(query, workdir) {
4282
+ const dirPath = query.slice(0, -1).replace(/\/+/g, "/");
4283
+ const pattern = dirPath ? `${dirPath}/*` : "*";
4284
+ const entries = await fg([pattern], {
4285
+ cwd: workdir,
4286
+ dot: true,
4287
+ onlyFiles: false,
4288
+ ignore: IGNORED_PATTERNS,
4289
+ objectMode: true
4290
+ });
4291
+ const results = entries.map((entry) => {
4292
+ const isDir = entry.dirent.isDirectory();
4293
+ return {
4294
+ path: entry.path,
4295
+ name: entry.path.split("/").pop() || entry.path,
4296
+ type: isDir ? "directory" : "file",
4297
+ score: isDir ? 110 : 100
4298
+ };
4299
+ });
4300
+ results.sort((a, b) => b.score - a.score);
4301
+ return results.slice(0, 20);
4302
+ }
4277
4303
  function fuzzyScore(filePath, query) {
4278
4304
  if (!query) {
4279
4305
  return 1;
@@ -4932,6 +4958,53 @@ function createPluginRoutes(options) {
4932
4958
  return router;
4933
4959
  }
4934
4960
 
4961
+ // src/server/utils/wsl.ts
4962
+ import { readFileSync as readFileSync3 } from "fs";
4963
+ var cached = null;
4964
+ function readEtcOsRelease() {
4965
+ try {
4966
+ const content = readFileSync3("/etc/os-release", "utf-8");
4967
+ const result = {};
4968
+ for (const line of content.split("\n")) {
4969
+ const m = line.match(/^([A-Za-z_][A-Za-z_0-9]*)=(.*)$/);
4970
+ if (m) {
4971
+ let val = m[2] ?? "";
4972
+ if (val.startsWith('"') && val.endsWith('"') || val.startsWith("'") && val.endsWith("'")) {
4973
+ val = val.slice(1, -1);
4974
+ }
4975
+ result[m[1]] = val;
4976
+ }
4977
+ }
4978
+ return result;
4979
+ } catch {
4980
+ return null;
4981
+ }
4982
+ }
4983
+ function detectWsl() {
4984
+ if (cached) return cached;
4985
+ if (process.platform === "win32") {
4986
+ cached = { isWSL: false, wslDistro: "" };
4987
+ return cached;
4988
+ }
4989
+ const distro = process.env["WSL_DISTRO_NAME"];
4990
+ if (distro) {
4991
+ cached = { isWSL: true, wslDistro: distro };
4992
+ return cached;
4993
+ }
4994
+ try {
4995
+ const osrelease = readFileSync3("/proc/sys/kernel/osrelease", "utf-8");
4996
+ if (osrelease.toLowerCase().includes("wsl") || osrelease.toLowerCase().includes("microsoft")) {
4997
+ const osInfo = readEtcOsRelease();
4998
+ const name = osInfo?.["NAME"] ?? "Ubuntu";
4999
+ cached = { isWSL: true, wslDistro: name };
5000
+ return cached;
5001
+ }
5002
+ } catch {
5003
+ }
5004
+ cached = { isWSL: false, wslDistro: "" };
5005
+ return cached;
5006
+ }
5007
+
4935
5008
  // src/server/index.ts
4936
5009
  var __dirname3 = dirname8(fileURLToPath7(import.meta.url));
4937
5010
  async function createServerHandle(config3) {
@@ -4960,6 +5033,7 @@ async function createServerHandle(config3) {
4960
5033
  if (useMock) {
4961
5034
  logger.info("Using MOCK LLM client - deterministic responses for testing");
4962
5035
  }
5036
+ const platformInfo = detectWsl();
4963
5037
  async function initLLM() {
4964
5038
  const llmClient = getLLMClient();
4965
5039
  const backend = config3.llm.backend;
@@ -5030,7 +5104,7 @@ async function createServerHandle(config3) {
5030
5104
  setMcpTools(mcpTools);
5031
5105
  logger.info("MCP tools registered", { count: mcpTools.length });
5032
5106
  }
5033
- const { signalMcpReady } = await import("./server-T2YP3VT2.js");
5107
+ const { signalMcpReady } = await import("./server-SPYFMFQE.js");
5034
5108
  signalMcpReady();
5035
5109
  });
5036
5110
  const app = express();
@@ -5092,7 +5166,7 @@ async function createServerHandle(config3) {
5092
5166
  res.json({ tools });
5093
5167
  });
5094
5168
  app.get("/api/projects", async (_req, res) => {
5095
- const { listProjects } = await import("./projects-LHRNCUGW.js");
5169
+ const { listProjects } = await import("./projects-WSVINK2C.js");
5096
5170
  const projects = listProjects();
5097
5171
  res.json({ projects });
5098
5172
  });
@@ -5101,7 +5175,7 @@ async function createServerHandle(config3) {
5101
5175
  if (!name || !workdir) {
5102
5176
  return res.status(400).json({ error: "name and workdir are required" });
5103
5177
  }
5104
- const { createDirectoryWithGit } = await import("./project-creator-FQRBN3RG.js");
5178
+ const { createDirectoryWithGit } = await import("./project-creator-C22J43BC.js");
5105
5179
  try {
5106
5180
  const project = await createDirectoryWithGit(name, workdir);
5107
5181
  res.status(201).json({ project });
@@ -5146,7 +5220,7 @@ async function createServerHandle(config3) {
5146
5220
  }
5147
5221
  });
5148
5222
  app.get("/api/projects/:id", async (req, res) => {
5149
- const { getProject: getProject2 } = await import("./projects-LHRNCUGW.js");
5223
+ const { getProject: getProject2 } = await import("./projects-WSVINK2C.js");
5150
5224
  const project = getProject2(req.params.id);
5151
5225
  if (!project) {
5152
5226
  return res.status(404).json({ error: "Project not found" });
@@ -5154,7 +5228,7 @@ async function createServerHandle(config3) {
5154
5228
  res.json({ project });
5155
5229
  });
5156
5230
  app.put("/api/projects/:id", async (req, res) => {
5157
- const { updateProject } = await import("./projects-LHRNCUGW.js");
5231
+ const { updateProject } = await import("./projects-WSVINK2C.js");
5158
5232
  const { name, customInstructions, dangerLevel } = req.body;
5159
5233
  const updates = {};
5160
5234
  if (name !== void 0) updates.name = name;
@@ -5167,7 +5241,7 @@ async function createServerHandle(config3) {
5167
5241
  res.json({ project: updated });
5168
5242
  });
5169
5243
  app.delete("/api/projects/:id", async (req, res) => {
5170
- const { getProject: getProject2, deleteProject } = await import("./projects-LHRNCUGW.js");
5244
+ const { getProject: getProject2, deleteProject } = await import("./projects-WSVINK2C.js");
5171
5245
  const project = getProject2(req.params.id);
5172
5246
  if (!project) {
5173
5247
  return res.status(404).json({ error: "Project not found" });
@@ -5176,7 +5250,7 @@ async function createServerHandle(config3) {
5176
5250
  res.json({ success: true });
5177
5251
  });
5178
5252
  app.put("/api/projects/:id/star", async (req, res) => {
5179
- const { toggleStar } = await import("./projects-LHRNCUGW.js");
5253
+ const { toggleStar } = await import("./projects-WSVINK2C.js");
5180
5254
  const { isStarred } = req.body;
5181
5255
  if (typeof isStarred !== "boolean") {
5182
5256
  return res.status(400).json({ error: "isStarred is required and must be a boolean" });
@@ -5188,7 +5262,7 @@ async function createServerHandle(config3) {
5188
5262
  res.json({ project });
5189
5263
  });
5190
5264
  app.get("/api/projects/:id/branches", async (req, res) => {
5191
- const { getProject: getProject2 } = await import("./projects-LHRNCUGW.js");
5265
+ const { getProject: getProject2 } = await import("./projects-WSVINK2C.js");
5192
5266
  const project = getProject2(req.params.id);
5193
5267
  if (!project) return res.status(404).json({ error: "Project not found" });
5194
5268
  const { listBranches } = await import("./workspace-6QTTUMMW.js");
@@ -5196,7 +5270,7 @@ async function createServerHandle(config3) {
5196
5270
  res.json({ branches });
5197
5271
  });
5198
5272
  app.post("/api/projects/:id/checkout", async (req, res) => {
5199
- const { getProject: getProject2 } = await import("./projects-LHRNCUGW.js");
5273
+ const { getProject: getProject2 } = await import("./projects-WSVINK2C.js");
5200
5274
  const project = getProject2(req.params.id);
5201
5275
  if (!project) return res.status(404).json({ error: "Project not found" });
5202
5276
  const { branch } = req.body;
@@ -5210,7 +5284,7 @@ async function createServerHandle(config3) {
5210
5284
  }
5211
5285
  });
5212
5286
  app.post("/api/projects/:id/checkout-new", async (req, res) => {
5213
- const { getProject: getProject2 } = await import("./projects-LHRNCUGW.js");
5287
+ const { getProject: getProject2 } = await import("./projects-WSVINK2C.js");
5214
5288
  const project = getProject2(req.params.id);
5215
5289
  if (!project) return res.status(404).json({ error: "Project not found" });
5216
5290
  const { name } = req.body;
@@ -5262,7 +5336,7 @@ async function createServerHandle(config3) {
5262
5336
  }
5263
5337
  });
5264
5338
  app.get("/api/projects/:id/workspaces", async (req, res) => {
5265
- const { getProject: getProject2 } = await import("./projects-LHRNCUGW.js");
5339
+ const { getProject: getProject2 } = await import("./projects-WSVINK2C.js");
5266
5340
  const project = getProject2(req.params.id);
5267
5341
  if (!project) return res.status(404).json({ error: "Project not found" });
5268
5342
  const { listWorkspaces } = await import("./workspace-6QTTUMMW.js");
@@ -5271,7 +5345,8 @@ async function createServerHandle(config3) {
5271
5345
  res.json({ workspaces: workspacesList });
5272
5346
  });
5273
5347
  app.get("/api/sessions", async (req, res) => {
5274
- const { getRecentUserPromptsForSession } = await import("./events-AEQ6GQXI.js");
5348
+ const { getRecentUserPromptsForSession } = await import("./events-FLWRLM6V.js");
5349
+ const { getPendingConfirmationsBySession } = await import("./path-security-ZROWNL22.js");
5275
5350
  const projectId = req.query["projectId"];
5276
5351
  const limit = Math.min(parseInt(req.query["limit"]) || 20, 100);
5277
5352
  const offset = parseInt(req.query["offset"]) || 0;
@@ -5288,7 +5363,15 @@ async function createServerHandle(config3) {
5288
5363
  ...session,
5289
5364
  recentUserPrompts: getRecentUserPromptsForSession(session.id, 10)
5290
5365
  }));
5291
- res.json({ sessions: sessionsWithPrompts, hasMore });
5366
+ const allPending = getPendingConfirmationsBySession();
5367
+ const pendingConfirmationsBySession = {};
5368
+ for (const s of sessions) {
5369
+ const confs = allPending[s.id];
5370
+ if (confs) {
5371
+ pendingConfirmationsBySession[s.id] = confs;
5372
+ }
5373
+ }
5374
+ res.json({ sessions: sessionsWithPrompts, hasMore, pendingConfirmationsBySession });
5292
5375
  });
5293
5376
  app.post("/api/sessions", async (req, res) => {
5294
5377
  const { projectId, title } = req.body;
@@ -5301,6 +5384,29 @@ async function createServerHandle(config3) {
5301
5384
  }
5302
5385
  const { providerId, model } = parseDefaultModelSelection(config3.defaultModelSelection);
5303
5386
  const session = sessionManager.createSession(projectId, title, providerId ?? null, model ?? null);
5387
+ wssExports.broadcastAll({
5388
+ type: "session.created",
5389
+ sessionId: session.id,
5390
+ payload: {
5391
+ session: {
5392
+ id: session.id,
5393
+ projectId: session.projectId,
5394
+ title: session.metadata.title,
5395
+ workdir: session.workdir,
5396
+ workspace: session.workspace,
5397
+ mode: session.mode,
5398
+ phase: session.phase,
5399
+ isRunning: session.isRunning,
5400
+ providerId: session.providerId,
5401
+ providerModel: session.providerModel,
5402
+ createdAt: session.createdAt,
5403
+ updatedAt: session.updatedAt,
5404
+ criteriaCount: session.criteria.length,
5405
+ criteriaCompleted: session.criteria.filter((c) => c.status.type === "passed").length,
5406
+ messageCount: session.messageCount ?? session.messages.length
5407
+ }
5408
+ }
5409
+ });
5304
5410
  res.status(201).json({ session });
5305
5411
  });
5306
5412
  app.post("/api/sessions/:id/switch-workspace", async (req, res) => {
@@ -5328,9 +5434,9 @@ async function createServerHandle(config3) {
5328
5434
  }
5329
5435
  });
5330
5436
  app.get("/api/sessions/:id", async (req, res) => {
5331
- const { getEventStore: getEventStore2 } = await import("./events-AEQ6GQXI.js");
5332
- const { buildMessagesFromStoredEvents } = await import("./folding-ONH3D4OK.js");
5333
- const { getPendingQuestionsForSession } = await import("./tools-APW7MY4E.js");
5437
+ const { getEventStore: getEventStore2 } = await import("./events-FLWRLM6V.js");
5438
+ const { buildMessagesFromStoredEvents, foldPendingConfirmations } = await import("./folding-ONH3D4OK.js");
5439
+ const { getPendingQuestionsForSession } = await import("./tools-JRCUWPJO.js");
5334
5440
  const session = sessionManager.getSession(req.params.id);
5335
5441
  if (!session) {
5336
5442
  return res.status(404).json({ error: "Session not found" });
@@ -5341,7 +5447,8 @@ async function createServerHandle(config3) {
5341
5447
  const contextState = sessionManager.getContextState(req.params.id);
5342
5448
  const queueState = sessionManager.getQueueState(req.params.id);
5343
5449
  const pendingQuestions = getPendingQuestionsForSession(req.params.id);
5344
- res.json({ session, messages, contextState, queueState, pendingQuestions });
5450
+ const pendingConfirmations = foldPendingConfirmations(events);
5451
+ res.json({ session, messages, contextState, queueState, pendingQuestions, pendingConfirmations });
5345
5452
  });
5346
5453
  app.delete("/api/sessions/:id", async (req, res) => {
5347
5454
  const sessionId = req.params["id"];
@@ -5349,14 +5456,19 @@ async function createServerHandle(config3) {
5349
5456
  if (!session) {
5350
5457
  return res.status(404).json({ error: "Session not found" });
5351
5458
  }
5352
- const { stopSessionExecution } = await import("./chat-handler-ETKFIHUO.js");
5353
- const { cancelQuestionsForSession, cancelPathConfirmationsForSession } = await import("./tools-APW7MY4E.js");
5459
+ const { stopSessionExecution } = await import("./chat-handler-3BZ4PDL2.js");
5460
+ const { cancelQuestionsForSession, cancelPathConfirmationsForSession } = await import("./tools-JRCUWPJO.js");
5354
5461
  sessionManager.clearMessageQueue(sessionId);
5355
5462
  stopSessionExecution(sessionId, sessionManager);
5356
5463
  abortSession(sessionId);
5357
5464
  cancelQuestionsForSession(sessionId, "Session deleted");
5358
5465
  cancelPathConfirmationsForSession(sessionId, "Session deleted");
5359
5466
  sessionManager.deleteSession(sessionId);
5467
+ wssExports.broadcastAll({
5468
+ type: "session.deleted",
5469
+ sessionId,
5470
+ payload: { sessionId }
5471
+ });
5360
5472
  res.json({ success: true });
5361
5473
  });
5362
5474
  app.delete("/api/projects/:projectId/sessions", (req, res) => {
@@ -5366,10 +5478,15 @@ async function createServerHandle(config3) {
5366
5478
  return res.status(404).json({ error: "Project not found" });
5367
5479
  }
5368
5480
  sessionManager.deleteAllSessions(projectId, project.workdir);
5481
+ wssExports.broadcastAll({
5482
+ type: "session.deletedAll",
5483
+ sessionId: projectId,
5484
+ payload: {}
5485
+ });
5369
5486
  res.json({ success: true });
5370
5487
  });
5371
5488
  app.post("/api/sessions/:id/provider", async (req, res) => {
5372
- const { getEventStore: getEventStore2 } = await import("./events-AEQ6GQXI.js");
5489
+ const { getEventStore: getEventStore2 } = await import("./events-FLWRLM6V.js");
5373
5490
  const { buildMessagesFromStoredEvents } = await import("./folding-ONH3D4OK.js");
5374
5491
  const sessionId = req.params.id;
5375
5492
  const session = sessionManager.getSession(sessionId);
@@ -5481,7 +5598,7 @@ async function createServerHandle(config3) {
5481
5598
  res.json({ success: true });
5482
5599
  });
5483
5600
  app.put("/api/sessions/:id/mode", async (req, res) => {
5484
- const { getEventStore: getEventStore2 } = await import("./events-AEQ6GQXI.js");
5601
+ const { getEventStore: getEventStore2 } = await import("./events-FLWRLM6V.js");
5485
5602
  const { buildMessagesFromStoredEvents } = await import("./folding-ONH3D4OK.js");
5486
5603
  const sessionId = req.params.id;
5487
5604
  const session = sessionManager.getSession(sessionId);
@@ -5538,15 +5655,15 @@ async function createServerHandle(config3) {
5538
5655
  if (!callId || approved === void 0) {
5539
5656
  return res.status(400).json({ error: "callId and approved are required" });
5540
5657
  }
5541
- const { providePathConfirmation } = await import("./tools-APW7MY4E.js");
5658
+ const { providePathConfirmation } = await import("./tools-JRCUWPJO.js");
5542
5659
  const result = providePathConfirmation(callId, approved, alwaysAllow);
5543
5660
  if (!result.found) {
5544
5661
  return res.status(404).json({ error: "No pending path confirmation with that ID" });
5545
5662
  }
5546
- const { getEventStore: getEventStore2 } = await import("./events-AEQ6GQXI.js");
5663
+ const { getEventStore: getEventStore2 } = await import("./events-FLWRLM6V.js");
5547
5664
  const { buildMessagesFromStoredEvents, foldPendingConfirmations } = await import("./folding-ONH3D4OK.js");
5548
- const { createSessionStateMessage } = await import("./protocol-4QFU7WAI.js");
5549
- const { getPendingQuestionsForSession } = await import("./tools-APW7MY4E.js");
5665
+ const { createSessionStateMessage } = await import("./protocol-EWEVW65B.js");
5666
+ const { getPendingQuestionsForSession } = await import("./tools-JRCUWPJO.js");
5550
5667
  const eventStore = getEventStore2();
5551
5668
  const events = eventStore.getEvents(sessionId);
5552
5669
  const messages = buildMessagesFromStoredEvents(events);
@@ -5557,6 +5674,11 @@ async function createServerHandle(config3) {
5557
5674
  const stateMsg = createSessionStateMessage(session, messages, pendingConfirmations, pendingQuestions);
5558
5675
  wssExports.broadcastForSession(sessionId, { ...stateMsg, sessionId });
5559
5676
  }
5677
+ wssExports.broadcastAll({
5678
+ type: "session.confirmation_resolved",
5679
+ sessionId,
5680
+ payload: { sessionId, callId }
5681
+ });
5560
5682
  res.json({ success: true });
5561
5683
  });
5562
5684
  app.post("/api/sessions/:id/answer", async (req, res) => {
@@ -5567,7 +5689,7 @@ async function createServerHandle(config3) {
5567
5689
  if (!skip && typeof answer !== "string") {
5568
5690
  return res.status(400).json({ error: "answer is required when not skipping" });
5569
5691
  }
5570
- const { provideAnswer } = await import("./tools-APW7MY4E.js");
5692
+ const { provideAnswer } = await import("./tools-JRCUWPJO.js");
5571
5693
  const found = provideAnswer(callId, answer ?? "", skip ?? false);
5572
5694
  if (!found) {
5573
5695
  return res.status(404).json({ error: "No pending question with that ID" });
@@ -5595,7 +5717,7 @@ async function createServerHandle(config3) {
5595
5717
  if (!session) {
5596
5718
  return res.status(404).json({ error: "Session not found" });
5597
5719
  }
5598
- const { getSetting: getSetting2, SETTINGS_KEYS } = await import("./settings-PFXRYXZU.js");
5720
+ const { getSetting: getSetting2, SETTINGS_KEYS } = await import("./settings-7XDMSPIC.js");
5599
5721
  if (getSetting2(SETTINGS_KEYS.CACHE_WARMING) !== "true") {
5600
5722
  return res.json({ success: false, reason: "disabled" });
5601
5723
  }
@@ -5627,7 +5749,7 @@ async function createServerHandle(config3) {
5627
5749
  backend: activeProvider?.backend ?? llmClient.getBackend(),
5628
5750
  model: llmClient.getModel()
5629
5751
  };
5630
- const { runAgentTurn, TurnMetrics } = await import("./orchestrator-O2YAAZ3U.js");
5752
+ const { runAgentTurn, TurnMetrics } = await import("./orchestrator-5IMCWX5P.js");
5631
5753
  runAgentTurn(
5632
5754
  {
5633
5755
  sessionManager,
@@ -5665,15 +5787,15 @@ async function createServerHandle(config3) {
5665
5787
  if (!session) {
5666
5788
  return res.status(404).json({ error: "Session not found" });
5667
5789
  }
5668
- const { stopSessionExecution } = await import("./chat-handler-ETKFIHUO.js");
5669
- const { cancelQuestionsForSession, cancelPathConfirmationsForSession } = await import("./tools-APW7MY4E.js");
5790
+ const { stopSessionExecution } = await import("./chat-handler-3BZ4PDL2.js");
5791
+ const { cancelQuestionsForSession, cancelPathConfirmationsForSession } = await import("./tools-JRCUWPJO.js");
5670
5792
  const queuedMessages = sessionManager.getQueueState(sessionId);
5671
5793
  sessionManager.clearMessageQueue(sessionId);
5672
5794
  stopSessionExecution(sessionId, sessionManager);
5673
5795
  abortSession(sessionId);
5674
5796
  cancelQuestionsForSession(sessionId, "Session stopped by user");
5675
5797
  cancelPathConfirmationsForSession(sessionId, "Session stopped by user");
5676
- const eventStore = (await import("./events-AEQ6GQXI.js")).getEventStore();
5798
+ const eventStore = (await import("./events-FLWRLM6V.js")).getEventStore();
5677
5799
  eventStore.append(sessionId, { type: "running.changed", data: { isRunning: false } });
5678
5800
  res.json({ success: true, queuedMessages });
5679
5801
  });
@@ -5687,7 +5809,7 @@ async function createServerHandle(config3) {
5687
5809
  if (typeof messageIndex !== "number" || messageIndex < 0) {
5688
5810
  return res.status(400).json({ error: "messageIndex must be a non-negative number" });
5689
5811
  }
5690
- const { truncateSessionMessages } = await import("./events-AEQ6GQXI.js");
5812
+ const { truncateSessionMessages } = await import("./events-FLWRLM6V.js");
5691
5813
  truncateSessionMessages(sessionId, messageIndex);
5692
5814
  res.json({ success: true });
5693
5815
  });
@@ -5704,7 +5826,7 @@ async function createServerHandle(config3) {
5704
5826
  if (content !== void 0 && (typeof content !== "string" || !content.trim())) {
5705
5827
  return res.status(400).json({ error: "content must be a non-empty string if provided" });
5706
5828
  }
5707
- const { getEventStore: getEventStore2 } = await import("./events-AEQ6GQXI.js");
5829
+ const { getEventStore: getEventStore2 } = await import("./events-FLWRLM6V.js");
5708
5830
  const { buildMessagesFromStoredEvents } = await import("./folding-ONH3D4OK.js");
5709
5831
  const eventStore = getEventStore2();
5710
5832
  const events = eventStore.getEvents(sessionId);
@@ -5717,7 +5839,7 @@ async function createServerHandle(config3) {
5717
5839
  if (msg.role !== "user" || msg.isSystemGenerated) {
5718
5840
  return res.status(400).json({ error: "Can only replay user messages" });
5719
5841
  }
5720
- const { truncateSessionMessages } = await import("./events-AEQ6GQXI.js");
5842
+ const { truncateSessionMessages } = await import("./events-FLWRLM6V.js");
5721
5843
  truncateSessionMessages(sessionId, msgIndex - 1);
5722
5844
  sessionManager.queueMessage(sessionId, "asap", content ?? msg.content, msg.attachments, msg.messageKind);
5723
5845
  res.json({ success: true });
@@ -5749,7 +5871,7 @@ async function createServerHandle(config3) {
5749
5871
  res.json({ accepted: true });
5750
5872
  });
5751
5873
  app.get("/api/settings", async (req, res) => {
5752
- const { getSetting: getSetting2, SETTINGS_DEFAULTS } = await import("./settings-PFXRYXZU.js");
5874
+ const { getSetting: getSetting2, SETTINGS_DEFAULTS } = await import("./settings-7XDMSPIC.js");
5753
5875
  const keysParam = req.query["keys"];
5754
5876
  if (!keysParam) {
5755
5877
  return res.status(400).json({ error: "keys query parameter is required" });
@@ -5762,19 +5884,19 @@ async function createServerHandle(config3) {
5762
5884
  res.json(result);
5763
5885
  });
5764
5886
  app.get("/api/settings/:key", async (req, res) => {
5765
- const { getSetting: getSetting2, SETTINGS_DEFAULTS } = await import("./settings-PFXRYXZU.js");
5887
+ const { getSetting: getSetting2, SETTINGS_DEFAULTS } = await import("./settings-7XDMSPIC.js");
5766
5888
  const key = req.params.key;
5767
5889
  const value = getSetting2(key) ?? SETTINGS_DEFAULTS[key] ?? null;
5768
5890
  res.json({ key, value });
5769
5891
  });
5770
5892
  app.get("/api/settings/:key", async (req, res) => {
5771
- const { getSetting: getSetting2, SETTINGS_DEFAULTS } = await import("./settings-PFXRYXZU.js");
5893
+ const { getSetting: getSetting2, SETTINGS_DEFAULTS } = await import("./settings-7XDMSPIC.js");
5772
5894
  const key = req.params.key;
5773
5895
  const value = getSetting2(key) ?? SETTINGS_DEFAULTS[key] ?? null;
5774
5896
  res.json({ key, value });
5775
5897
  });
5776
5898
  app.put("/api/settings/:key", async (req, res) => {
5777
- const { setSetting: setSetting2 } = await import("./settings-PFXRYXZU.js");
5899
+ const { setSetting: setSetting2 } = await import("./settings-7XDMSPIC.js");
5778
5900
  const key = req.params.key;
5779
5901
  const { value } = req.body;
5780
5902
  if (value === void 0) {
@@ -5801,7 +5923,7 @@ async function createServerHandle(config3) {
5801
5923
  }
5802
5924
  });
5803
5925
  app.get("/api/tools/shells", async (_req, res) => {
5804
- const { listAvailableShells } = await import("./platform-XQ7BS3KQ.js");
5926
+ const { listAvailableShells } = await import("./platform-QGXO3CNR.js");
5805
5927
  res.json({ shells: listAvailableShells() });
5806
5928
  });
5807
5929
  app.get("/api/config", async (_req, res) => {
@@ -5836,7 +5958,8 @@ async function createServerHandle(config3) {
5836
5958
  providers: providerManager.getProviders(),
5837
5959
  activeProviderId: providerManager.getActiveProviderId(),
5838
5960
  defaultModelSelection: config3.defaultModelSelection,
5839
- visionFallback
5961
+ visionFallback,
5962
+ platform: platformInfo
5840
5963
  });
5841
5964
  });
5842
5965
  app.post("/api/model/refresh", async (_req, res) => {
@@ -5963,7 +6086,7 @@ async function createServerHandle(config3) {
5963
6086
  const backend = req.query["backend"];
5964
6087
  if (!url) return res.status(400).json({ error: "url is required" });
5965
6088
  try {
5966
- const { fetchModelsWithContext } = await import("./provider-manager-MAKXSL6L.js");
6089
+ const { fetchModelsWithContext } = await import("./provider-manager-SQIELYLK.js");
5967
6090
  const { getModelProfile: getModelProfile2 } = await import("./profiles-5J7F4BML.js");
5968
6091
  const models = await fetchModelsWithContext(
5969
6092
  url,
@@ -6292,7 +6415,7 @@ async function createServerHandle(config3) {
6292
6415
  });
6293
6416
  async function rebuildMcpTools() {
6294
6417
  const { createMcpTools: createMcpTools2 } = await import("./tool-adapter-MOGEI6TP.js");
6295
- const { setMcpTools: setMcpTools2 } = await import("./tools-APW7MY4E.js");
6418
+ const { setMcpTools: setMcpTools2 } = await import("./tools-JRCUWPJO.js");
6296
6419
  const mcpTools = createMcpTools2(mcpManager);
6297
6420
  setMcpTools2(mcpTools);
6298
6421
  }
@@ -6405,7 +6528,7 @@ async function createServerHandle(config3) {
6405
6528
  }
6406
6529
  try {
6407
6530
  const { loadGlobalConfig, saveGlobalConfig } = await import("./config-EUMVEFHU.js");
6408
- const { applyMcpServerUpdate } = await import("./update-server-MYYQUNZX.js");
6531
+ const { applyMcpServerUpdate } = await import("./update-server-4MTM7M5P.js");
6409
6532
  const globalConfig = await loadGlobalConfig(config3.mode ?? "production", config3.globalConfigPath);
6410
6533
  const mcpServers2 = { ...globalConfig.mcpServers ?? {} };
6411
6534
  const patch = {
@@ -6527,13 +6650,13 @@ async function createServerHandle(config3) {
6527
6650
  })
6528
6651
  );
6529
6652
  app.get("/api/sessions/:id/background-processes", async (req, res) => {
6530
- const { getSessionProcesses } = await import("./manager-24C2AXVF.js");
6653
+ const { getSessionProcesses } = await import("./manager-OPMCSYN2.js");
6531
6654
  const sessionId = req.params.id;
6532
6655
  const processes = getSessionProcesses(sessionId);
6533
6656
  res.json({ processes });
6534
6657
  });
6535
6658
  app.post("/api/sessions/:id/background-process/:processId/stop", async (req, res) => {
6536
- const { stopProcess } = await import("./manager-24C2AXVF.js");
6659
+ const { stopProcess } = await import("./manager-OPMCSYN2.js");
6537
6660
  const sessionId = req.params.id;
6538
6661
  const processId = req.params.processId;
6539
6662
  const session = sessionManager.getSession(sessionId);
@@ -6676,7 +6799,7 @@ async function createServerHandle(config3) {
6676
6799
  const state = sessionManager.getContextState(sessionId);
6677
6800
  wssExports.broadcastForSession(sessionId, createContextStateMessage(state));
6678
6801
  });
6679
- const { QueueProcessor } = await import("./processor-FKAS3K4L.js");
6802
+ const { QueueProcessor } = await import("./processor-3R4GS6VB.js");
6680
6803
  const queueProcessor = new QueueProcessor({
6681
6804
  sessionManager,
6682
6805
  providerManager,
@@ -6718,7 +6841,7 @@ async function createServerHandle(config3) {
6718
6841
  void (async () => {
6719
6842
  await devServerManager.stopAll();
6720
6843
  await mcpManager.disconnectAll();
6721
- const { stopAllInspectProxies } = await import("./inspect-proxy-PHVZBZUO.js");
6844
+ const { stopAllInspectProxies } = await import("./inspect-proxy-JHZV34QR.js");
6722
6845
  stopAllInspectProxies();
6723
6846
  const { cleanupAllProcesses } = await import("./store-SARB6V2N.js");
6724
6847
  cleanupAllProcesses();
@@ -6756,4 +6879,4 @@ export {
6756
6879
  createServerHandle,
6757
6880
  createServer
6758
6881
  };
6759
- //# sourceMappingURL=chunk-QFR6JF32.js.map
6882
+ //# sourceMappingURL=chunk-J7VCI5EX.js.map
@@ -0,0 +1,7 @@
1
+ // src/constants.ts
2
+ var VERSION = "2.0.76";
3
+
4
+ export {
5
+ VERSION
6
+ };
7
+ //# sourceMappingURL=chunk-KQEVAO2Q.js.map
@@ -51,4 +51,4 @@ export {
51
51
  buildUpdatedServerConfig,
52
52
  applyMcpServerUpdate
53
53
  };
54
- //# sourceMappingURL=chunk-UN26GIQG.js.map
54
+ //# sourceMappingURL=chunk-KVRSAC4Z.js.map