openfox 2.0.144 → 2.0.145

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 (27) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/CHANGELOG.md +6 -0
  3. package/dist/{auto-continue-M3RPFGFI.js → auto-continue-ZAHNBHPA.js} +2 -2
  4. package/dist/{chat-handler-QOOQOHHR.js → chat-handler-5XMO5XBU.js} +4 -4
  5. package/dist/{chunk-5XKWYLBX.js → chunk-2BARKBWV.js} +4 -4
  6. package/dist/{chunk-QURYQA4D.js → chunk-6FKSGQYO.js} +3 -3
  7. package/dist/{chunk-5ONERSDK.js → chunk-DBTDMK23.js} +29 -29
  8. package/dist/{chunk-OSUEWIVU.js → chunk-HNJ32GRI.js} +2 -2
  9. package/dist/{chunk-MBDYJ35W.js → chunk-LG3LQLTZ.js} +3 -3
  10. package/dist/{chunk-C4LI5U6L.js → chunk-QKPTMHA2.js} +48 -23
  11. package/dist/chunk-QV4BKKIO.js +7 -0
  12. package/dist/{chunk-Z3C3D4IR.js → chunk-X2BJFVER.js} +7 -7
  13. package/dist/cli/dev.js +1 -1
  14. package/dist/cli/index.js +1 -1
  15. package/dist/{dynamic-context-CR4RUXOX.js → dynamic-context-7AJC6AII.js} +2 -2
  16. package/dist/{export-import-3WOHC7PI.js → export-import-AH5HBHO6.js} +2 -2
  17. package/dist/{launch-4COI5RGL.js → launch-2QA2EHCT.js} +5 -5
  18. package/dist/{orchestrator-AMTWA6JO.js → orchestrator-L5VINV36.js} +4 -4
  19. package/dist/package.json +1 -1
  20. package/dist/{processor-UZ7OBCAK.js → processor-UQ5ITWL6.js} +3 -3
  21. package/dist/{serve-NLQ6IB2V.js → serve-CIBBSOLM.js} +8 -8
  22. package/dist/server/index.js +7 -7
  23. package/dist/{server-YXKUQ3DD.js → server-YW3DO4K5.js} +6 -6
  24. package/dist/{tools-7L63ZMNU.js → tools-RG4HDV75.js} +2 -2
  25. package/dist/{update-IBN2GJUI.js → update-5ENWM2XR.js} +2 -2
  26. package/package.json +1 -1
  27. package/dist/chunk-ZSGELOTW.js +0 -7
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.0.145 - 2026-09-11
4
+
5
+ ### Bug Fixes
6
+
7
+ - **run_command no longer hangs when a detached child outlives the shell** — `setsid`, `ssh -f`, and `&`-spawned children that keep the output pipes open no longer stall the tool call forever; the tool settles after a bounded 2s grace with the shell's real exit code (noting output may be incomplete), and timeouts or interrupts on an already-exited shell settle immediately.
8
+
3
9
  ## 2.0.144 - 2026-09-11
4
10
 
5
11
  ### Features
package/dist/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.0.145 - 2026-09-11
4
+
5
+ ### Bug Fixes
6
+
7
+ - **run_command no longer hangs when a detached child outlives the shell** — `setsid`, `ssh -f`, and `&`-spawned children that keep the output pipes open no longer stall the tool call forever; the tool settles after a bounded 2s grace with the shell's real exit code (noting output may be incomplete), and timeouts or interrupts on an already-exited shell settle immediately.
8
+
3
9
  ## 2.0.144 - 2026-09-11
4
10
 
5
11
  ### Features
@@ -1,4 +1,4 @@
1
- import "./chunk-C4LI5U6L.js";
1
+ import "./chunk-QKPTMHA2.js";
2
2
  import "./chunk-OAN4BXEW.js";
3
3
  import "./chunk-DJH6LMBT.js";
4
4
  import "./chunk-PHR64A6U.js";
@@ -108,4 +108,4 @@ export {
108
108
  planBootContinuation,
109
109
  runBootAutoContinuations
110
110
  };
111
- //# sourceMappingURL=auto-continue-M3RPFGFI.js.map
111
+ //# sourceMappingURL=auto-continue-ZAHNBHPA.js.map
@@ -5,9 +5,9 @@ import {
5
5
  } from "./chunk-3IVJ65IG.js";
6
6
  import {
7
7
  runChatTurn
8
- } from "./chunk-5XKWYLBX.js";
9
- import "./chunk-OSUEWIVU.js";
10
- import "./chunk-C4LI5U6L.js";
8
+ } from "./chunk-2BARKBWV.js";
9
+ import "./chunk-HNJ32GRI.js";
10
+ import "./chunk-QKPTMHA2.js";
11
11
  import "./chunk-OAN4BXEW.js";
12
12
  import "./chunk-DJH6LMBT.js";
13
13
  import "./chunk-PHR64A6U.js";
@@ -181,4 +181,4 @@ export {
181
181
  startChatSession,
182
182
  stopSessionExecution
183
183
  };
184
- //# sourceMappingURL=chat-handler-QOOQOHHR.js.map
184
+ //# sourceMappingURL=chat-handler-5XMO5XBU.js.map
@@ -3,14 +3,14 @@ import {
3
3
  checkToolChangesAndInject,
4
4
  computeDynamicContextHash,
5
5
  getToolFingerprint
6
- } from "./chunk-OSUEWIVU.js";
6
+ } from "./chunk-HNJ32GRI.js";
7
7
  import {
8
8
  createAssemblyResult,
9
9
  getConversationMessages,
10
10
  getToolRegistryForAgent,
11
11
  processEventsForConversation,
12
12
  runTopLevelAgentLoop
13
- } from "./chunk-C4LI5U6L.js";
13
+ } from "./chunk-QKPTMHA2.js";
14
14
  import {
15
15
  getAllInstructions,
16
16
  getEnabledSkillMetadata
@@ -357,7 +357,7 @@ async function runAgentTurn(options, turnMetrics, agentId, append, callbacks) {
357
357
  getConversationMessages: buildGetConversationMessages(options.sessionId, resolveAgentClient, append),
358
358
  injectAgentReminder: () => injectAgentReminder(options.sessionId, agentDef),
359
359
  rebuildCachedContext: async () => {
360
- const { applyDynamicContext } = await import("./dynamic-context-CR4RUXOX.js");
360
+ const { applyDynamicContext } = await import("./dynamic-context-7AJC6AII.js");
361
361
  await applyDynamicContext(options.sessionManager, options.sessionId, agentLlmClient.getModel());
362
362
  },
363
363
  ...options.initialCompacting ? { initialCompacting: true } : {},
@@ -387,4 +387,4 @@ export {
387
387
  runChatTurn,
388
388
  runAgentTurn
389
389
  };
390
- //# sourceMappingURL=chunk-5XKWYLBX.js.map
390
+ //# sourceMappingURL=chunk-2BARKBWV.js.map
@@ -252,7 +252,7 @@ async function runCli(options) {
252
252
  break;
253
253
  }
254
254
  case "update": {
255
- const { runUpdate } = await import("./update-IBN2GJUI.js");
255
+ const { runUpdate } = await import("./update-5ENWM2XR.js");
256
256
  const code = await runUpdate();
257
257
  if (code !== 0) {
258
258
  process.exit(code);
@@ -265,7 +265,7 @@ async function runCli(options) {
265
265
  if (!configExists) {
266
266
  await runNetworkSetup(mode);
267
267
  }
268
- const { runServe } = await import("./serve-NLQ6IB2V.js");
268
+ const { runServe } = await import("./serve-CIBBSOLM.js");
269
269
  const serveOptions = { mode };
270
270
  if (values.port) serveOptions.port = parseInt(values.port);
271
271
  if (values["no-browser"] === true) serveOptions.openBrowser = false;
@@ -277,4 +277,4 @@ async function runCli(options) {
277
277
  export {
278
278
  runCli
279
279
  };
280
- //# sourceMappingURL=chunk-QURYQA4D.js.map
280
+ //# sourceMappingURL=chunk-6FKSGQYO.js.map
@@ -9,10 +9,10 @@ import {
9
9
  terminalManager,
10
10
  tokenFromPassword,
11
11
  verifyPassword
12
- } from "./chunk-Z3C3D4IR.js";
12
+ } from "./chunk-X2BJFVER.js";
13
13
  import {
14
14
  TEMPLATE_VARIABLES
15
- } from "./chunk-MBDYJ35W.js";
15
+ } from "./chunk-LG3LQLTZ.js";
16
16
  import {
17
17
  projectSessionStatus
18
18
  } from "./chunk-T3S5MTMD.js";
@@ -42,7 +42,7 @@ import {
42
42
  setMcpManagerForTools,
43
43
  setMcpTools,
44
44
  setNotifyMcpServersChanged
45
- } from "./chunk-C4LI5U6L.js";
45
+ } from "./chunk-QKPTMHA2.js";
46
46
  import {
47
47
  deleteOwnedSkill,
48
48
  deleteProjectSkill,
@@ -224,7 +224,7 @@ import {
224
224
  } from "./chunk-YNMP647F.js";
225
225
  import {
226
226
  VERSION
227
- } from "./chunk-ZSGELOTW.js";
227
+ } from "./chunk-QV4BKKIO.js";
228
228
  import {
229
229
  deleteProject,
230
230
  getProject,
@@ -3147,8 +3147,8 @@ var SessionManager = class {
3147
3147
  * @throws Error for invalid payloads or unknown project
3148
3148
  */
3149
3149
  async importSession(projectId, rawPayload) {
3150
- const { parseSessionExport, IMPORTED_SESSION_REMINDER, SESSION_EXPORT_VERSION } = await import("./export-import-3WOHC7PI.js");
3151
- const { injectContextDriftReminders, getToolSetFingerprint } = await import("./dynamic-context-CR4RUXOX.js");
3150
+ const { parseSessionExport, IMPORTED_SESSION_REMINDER, SESSION_EXPORT_VERSION } = await import("./export-import-AH5HBHO6.js");
3151
+ const { injectContextDriftReminders, getToolSetFingerprint } = await import("./dynamic-context-7AJC6AII.js");
3152
3152
  const { loadAllAgentsDefault: loadAllAgentsDefault2, resolveDefaultAgentId } = await import("./registry-24U5BZAJ.js");
3153
3153
  const payload = parseSessionExport(rawPayload);
3154
3154
  if (payload.version !== SESSION_EXPORT_VERSION) {
@@ -7248,7 +7248,7 @@ function detectWsl() {
7248
7248
  // src/server/index.ts
7249
7249
  var __dirname3 = dirname7(fileURLToPath6(import.meta.url));
7250
7250
  async function announceContextDrift(sessionManager, sessionIds) {
7251
- const { injectContextDriftRemindersForSessions } = await import("./dynamic-context-CR4RUXOX.js");
7251
+ const { injectContextDriftRemindersForSessions } = await import("./dynamic-context-7AJC6AII.js");
7252
7252
  await injectContextDriftRemindersForSessions(sessionManager, sessionIds);
7253
7253
  }
7254
7254
  async function createServerHandle(config3) {
@@ -7364,7 +7364,7 @@ async function createServerHandle(config3) {
7364
7364
  toolRegistry = createToolRegistry();
7365
7365
  logger.info("MCP tools registered", { count: mcpTools.length });
7366
7366
  }
7367
- const { signalMcpReady } = await import("./server-YXKUQ3DD.js");
7367
+ const { signalMcpReady } = await import("./server-YW3DO4K5.js");
7368
7368
  signalMcpReady();
7369
7369
  }
7370
7370
  const app = express();
@@ -7581,7 +7581,7 @@ async function createServerHandle(config3) {
7581
7581
  app.use("/api", sessionFavoriteRouter);
7582
7582
  const { createTasksService } = await import("./service-KMOSB6SU.js");
7583
7583
  const { registerTaskRoutes } = await import("./tasks-X5DM553T.js");
7584
- const { setTasksService } = await import("./tools-7L63ZMNU.js");
7584
+ const { setTasksService } = await import("./tools-RG4HDV75.js");
7585
7585
  const tasksService = createTasksService({
7586
7586
  sessionManager,
7587
7587
  config: config3,
@@ -7903,7 +7903,7 @@ All file and git operations should use this branch.
7903
7903
  app.get("/api/sessions/:id", async (req, res) => {
7904
7904
  const { getEventStore: getEventStore2, combineEventsWithSnapshot: combineEventsWithSnapshot2 } = await import("./events-ODZ4SSBW.js");
7905
7905
  const { buildMessagesFromStoredEvents: buildMessagesFromStoredEvents2, foldPendingConfirmations } = await import("./folding-V2R2MZ6Y.js");
7906
- const { getPendingQuestionsForSession: getPendingQuestionsForSession2 } = await import("./tools-7L63ZMNU.js");
7906
+ const { getPendingQuestionsForSession: getPendingQuestionsForSession2 } = await import("./tools-RG4HDV75.js");
7907
7907
  const { getMaxVisibleItems } = await import("./settings-FQUDSGZF.js");
7908
7908
  const session = sessionManager.getSession(req.params.id);
7909
7909
  if (!session) {
@@ -7932,7 +7932,7 @@ All file and git operations should use this branch.
7932
7932
  });
7933
7933
  app.get("/api/sessions/:id/status", async (req, res) => {
7934
7934
  const { projectSessionStatus: projectSessionStatus2 } = await import("./session-status-UFO5IFI7.js");
7935
- const { getPendingQuestionsForSession: getPendingQuestionsForSession2 } = await import("./tools-7L63ZMNU.js");
7935
+ const { getPendingQuestionsForSession: getPendingQuestionsForSession2 } = await import("./tools-RG4HDV75.js");
7936
7936
  const { getEventStore: getEventStore2, combineEventsWithSnapshot: combineEventsWithSnapshot2 } = await import("./events-ODZ4SSBW.js");
7937
7937
  const { foldPendingConfirmations } = await import("./folding-V2R2MZ6Y.js");
7938
7938
  const sessionId = req.params["id"];
@@ -7964,8 +7964,8 @@ All file and git operations should use this branch.
7964
7964
  if (!session) {
7965
7965
  return res.status(404).json({ error: "Session not found" });
7966
7966
  }
7967
- const { stopSessionExecution } = await import("./chat-handler-QOOQOHHR.js");
7968
- const { cancelQuestionsForSession, cancelPathConfirmationsForSession } = await import("./tools-7L63ZMNU.js");
7967
+ const { stopSessionExecution } = await import("./chat-handler-5XMO5XBU.js");
7968
+ const { cancelQuestionsForSession, cancelPathConfirmationsForSession } = await import("./tools-RG4HDV75.js");
7969
7969
  sessionManager.clearMessageQueue(sessionId);
7970
7970
  stopSessionExecution(sessionId, sessionManager);
7971
7971
  abortSession(sessionId);
@@ -8197,7 +8197,7 @@ All file and git operations should use this branch.
8197
8197
  }
8198
8198
  sessionManager.setDangerLevel(sessionId, dangerLevel);
8199
8199
  if (dangerLevel === "dangerous") {
8200
- const { autoApprovePendingConfirmationsForSession } = await import("./tools-7L63ZMNU.js");
8200
+ const { autoApprovePendingConfirmationsForSession } = await import("./tools-RG4HDV75.js");
8201
8201
  const approvedCallIds = autoApprovePendingConfirmationsForSession(sessionId);
8202
8202
  for (const callId of approvedCallIds) {
8203
8203
  wssExports.broadcastForSession(sessionId, {
@@ -8232,7 +8232,7 @@ All file and git operations should use this branch.
8232
8232
  setSessionDisabledServers(sessionId, disabledServers);
8233
8233
  const messages = session.messages ?? [];
8234
8234
  if (messages.length === 0) {
8235
- const { applyDynamicContext } = await import("./dynamic-context-CR4RUXOX.js");
8235
+ const { applyDynamicContext } = await import("./dynamic-context-7AJC6AII.js");
8236
8236
  const modelName = session.providerModel ?? providerManager.getCurrentModel();
8237
8237
  await applyDynamicContext(sessionManager, sessionId, modelName);
8238
8238
  } else {
@@ -8266,7 +8266,7 @@ All file and git operations should use this branch.
8266
8266
  if (alwaysAllow !== void 0 && typeof alwaysAllow !== "boolean") {
8267
8267
  return res.status(400).json({ error: "alwaysAllow must be a boolean if provided" });
8268
8268
  }
8269
- const { providePathConfirmation: providePathConfirmation2, getConfirmationSessionId } = await import("./tools-7L63ZMNU.js");
8269
+ const { providePathConfirmation: providePathConfirmation2, getConfirmationSessionId } = await import("./tools-RG4HDV75.js");
8270
8270
  const pendingSessionId = getConfirmationSessionId(callId);
8271
8271
  if (!pendingSessionId) {
8272
8272
  return res.status(404).json({ error: "No pending path confirmation with that ID" });
@@ -8281,7 +8281,7 @@ All file and git operations should use this branch.
8281
8281
  const { getEventStore: getEventStore2, combineEventsWithSnapshot: combineEvents } = await import("./events-ODZ4SSBW.js");
8282
8282
  const { buildMessagesFromStoredEvents: buildMessagesFromStoredEvents2, foldPendingConfirmations } = await import("./folding-V2R2MZ6Y.js");
8283
8283
  const { createSessionStateMessage } = await import("./protocol-MRMOB3P4.js");
8284
- const { getPendingQuestionsForSession: getPendingQuestionsForSession2 } = await import("./tools-7L63ZMNU.js");
8284
+ const { getPendingQuestionsForSession: getPendingQuestionsForSession2 } = await import("./tools-RG4HDV75.js");
8285
8285
  const { getMaxVisibleItems } = await import("./settings-FQUDSGZF.js");
8286
8286
  const eventStore = getEventStore2();
8287
8287
  const { snapshot, events: eventsSinceSnapshot } = eventStore.getEventsSinceSnapshot(sessionId);
@@ -8319,7 +8319,7 @@ All file and git operations should use this branch.
8319
8319
  if (!skip && typeof answer !== "string") {
8320
8320
  return res.status(400).json({ error: "answer is required when not skipping" });
8321
8321
  }
8322
- const { provideAnswer: provideAnswer2 } = await import("./tools-7L63ZMNU.js");
8322
+ const { provideAnswer: provideAnswer2 } = await import("./tools-RG4HDV75.js");
8323
8323
  const found = provideAnswer2(callId, answer ?? "", skip ?? false);
8324
8324
  if (!found) {
8325
8325
  return res.status(404).json({ error: "No pending question with that ID" });
@@ -8385,7 +8385,7 @@ All file and git operations should use this branch.
8385
8385
  backend: activeProvider?.backend ?? llmClient.getBackend(),
8386
8386
  model: llmClient.getModel()
8387
8387
  };
8388
- const { runAgentTurn, TurnMetrics } = await import("./orchestrator-AMTWA6JO.js");
8388
+ const { runAgentTurn, TurnMetrics } = await import("./orchestrator-L5VINV36.js");
8389
8389
  runAgentTurn(
8390
8390
  {
8391
8391
  sessionManager,
@@ -8423,8 +8423,8 @@ All file and git operations should use this branch.
8423
8423
  if (!session) {
8424
8424
  return res.status(404).json({ error: "Session not found" });
8425
8425
  }
8426
- const { stopSessionExecution } = await import("./chat-handler-QOOQOHHR.js");
8427
- const { cancelQuestionsForSession, cancelPathConfirmationsForSession } = await import("./tools-7L63ZMNU.js");
8426
+ const { stopSessionExecution } = await import("./chat-handler-5XMO5XBU.js");
8427
+ const { cancelQuestionsForSession, cancelPathConfirmationsForSession } = await import("./tools-RG4HDV75.js");
8428
8428
  const queuedMessages = sessionManager.getQueueState(sessionId);
8429
8429
  sessionManager.clearMessageQueue(sessionId);
8430
8430
  stopSessionExecution(sessionId, sessionManager);
@@ -8547,7 +8547,7 @@ All file and git operations should use this branch.
8547
8547
  return res.status(404).json({ error: "Session not found" });
8548
8548
  }
8549
8549
  try {
8550
- const { buildSessionExport } = await import("./export-import-3WOHC7PI.js");
8550
+ const { buildSessionExport } = await import("./export-import-AH5HBHO6.js");
8551
8551
  const payload = buildSessionExport(sessionManager, sessionId);
8552
8552
  const filename = `${(payload.session.title ?? "session").replace(/[^a-zA-Z0-9-_]/g, "_")}.openfox-session.json`;
8553
8553
  res.setHeader("Content-Disposition", `attachment; filename="${filename}"`);
@@ -9370,7 +9370,7 @@ All file and git operations should use this branch.
9370
9370
  });
9371
9371
  async function rebuildMcpTools() {
9372
9372
  const { createMcpTools: createMcpTools2 } = await import("./tool-adapter-ZY4FC4C4.js");
9373
- const { setMcpTools: setMcpTools2 } = await import("./tools-7L63ZMNU.js");
9373
+ const { setMcpTools: setMcpTools2 } = await import("./tools-RG4HDV75.js");
9374
9374
  const mcpTools = createMcpTools2(mcpManager);
9375
9375
  setMcpTools2(mcpTools);
9376
9376
  toolRegistry = createToolRegistry();
@@ -9946,7 +9946,7 @@ All file and git operations should use this branch.
9946
9946
  );
9947
9947
  const wss = wssExports.wss;
9948
9948
  deferTasksBroadcast = (_projectId, payload) => wssExports.broadcastAll({ type: "tasks.update", payload });
9949
- const { launchWorkflowRun, abortRunnerRun } = await import("./launch-4COI5RGL.js");
9949
+ const { launchWorkflowRun, abortRunnerRun } = await import("./launch-2QA2EHCT.js");
9950
9950
  deferTasksLaunchWorkflow = (sessionId, launch) => {
9951
9951
  const effective = sessionManager.resolveEffectiveProviderModel(sessionId);
9952
9952
  let llmClient = getLLMClient();
@@ -9991,7 +9991,7 @@ All file and git operations should use this branch.
9991
9991
  const state = sessionManager.getContextState(sessionId);
9992
9992
  wssExports.broadcastForSession(sessionId, createContextStateMessage(state));
9993
9993
  });
9994
- const { QueueProcessor } = await import("./processor-UZ7OBCAK.js");
9994
+ const { QueueProcessor } = await import("./processor-UQ5ITWL6.js");
9995
9995
  const queueProcessor = new QueueProcessor({
9996
9996
  sessionManager,
9997
9997
  providerManager,
@@ -10004,7 +10004,7 @@ All file and git operations should use this branch.
10004
10004
  const { getSetting: getSetting2, SETTINGS_KEYS } = await import("./settings-FQUDSGZF.js");
10005
10005
  if (getSetting2(SETTINGS_KEYS.AUTO_CONTINUE_ON_BOOT) === "true") {
10006
10006
  const { getStaleRunningSessionIds } = await import("./store-AOZ46PBS.js");
10007
- const { runBootAutoContinuations } = await import("./auto-continue-M3RPFGFI.js");
10007
+ const { runBootAutoContinuations } = await import("./auto-continue-ZAHNBHPA.js");
10008
10008
  const staleIds = getStaleRunningSessionIds();
10009
10009
  if (staleIds.length > 0) {
10010
10010
  const continued = runBootAutoContinuations(staleIds, {
@@ -10048,8 +10048,8 @@ All file and git operations should use this branch.
10048
10048
  launchWorkflow: (sessionId, launch) => deferTasksLaunchWorkflow(sessionId, launch),
10049
10049
  stopSession: (sessionId) => {
10050
10050
  void (async () => {
10051
- const { stopSessionExecution } = await import("./chat-handler-QOOQOHHR.js");
10052
- const { cancelQuestionsForSession, cancelPathConfirmationsForSession } = await import("./tools-7L63ZMNU.js");
10051
+ const { stopSessionExecution } = await import("./chat-handler-5XMO5XBU.js");
10052
+ const { cancelQuestionsForSession, cancelPathConfirmationsForSession } = await import("./tools-RG4HDV75.js");
10053
10053
  sessionManager.clearMessageQueue(sessionId);
10054
10054
  stopSessionExecution(sessionId, sessionManager);
10055
10055
  abortSession(sessionId);
@@ -10176,4 +10176,4 @@ export {
10176
10176
  createServerHandle,
10177
10177
  createServer
10178
10178
  };
10179
- //# sourceMappingURL=chunk-5ONERSDK.js.map
10179
+ //# sourceMappingURL=chunk-DBTDMK23.js.map
@@ -329,7 +329,7 @@ function resolveAgentDef(sessionManager, sessionId) {
329
329
  });
330
330
  }
331
331
  async function getEffectiveToolDefinitions(agentDef, sessionId, modelName) {
332
- const { getToolRegistryForAgent } = await import("./tools-7L63ZMNU.js");
332
+ const { getToolRegistryForAgent } = await import("./tools-RG4HDV75.js");
333
333
  const { isDescribeImageEligible } = await import("./describe-image-IGLGVEOJ.js");
334
334
  const all = getToolRegistryForAgent(agentDef, sessionId).definitions;
335
335
  const eligible = await isDescribeImageEligible(modelName);
@@ -398,4 +398,4 @@ export {
398
398
  computeSessionHash,
399
399
  applyDynamicContext
400
400
  };
401
- //# sourceMappingURL=chunk-OSUEWIVU.js.map
401
+ //# sourceMappingURL=chunk-HNJ32GRI.js.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  runAgentTurn
3
- } from "./chunk-5XKWYLBX.js";
3
+ } from "./chunk-2BARKBWV.js";
4
4
  import {
5
5
  executeSubAgent,
6
6
  getToolRegistryForAgent
7
- } from "./chunk-C4LI5U6L.js";
7
+ } from "./chunk-QKPTMHA2.js";
8
8
  import {
9
9
  gitSpawnEnv
10
10
  } from "./chunk-J7GAZGZT.js";
@@ -1026,4 +1026,4 @@ export {
1026
1026
  abortRunnerRun,
1027
1027
  launchWorkflowRun
1028
1028
  };
1029
- //# sourceMappingURL=chunk-MBDYJ35W.js.map
1029
+ //# sourceMappingURL=chunk-LG3LQLTZ.js.map
@@ -792,14 +792,42 @@ function executeCommand(command, cwd, timeout, signal, onProgress) {
792
792
  let stderr = "";
793
793
  let timedOut = false;
794
794
  let aborted = false;
795
+ let exitCode = null;
795
796
  let exited = false;
797
+ let settled = false;
798
+ let graceTimer;
799
+ const ZOMBIE_PIPE_GRACE_MS = 2e3;
800
+ const settle = (code, appendix) => {
801
+ if (settled) return;
802
+ settled = true;
803
+ clearTimeout(timer);
804
+ if (graceTimer !== void 0) clearTimeout(graceTimer);
805
+ signal?.removeEventListener("abort", onAbort);
806
+ const out = (stdout + stdoutDecoder.end()).trim();
807
+ resolve3({
808
+ stdout: appendix ? out ? `${out}
809
+
810
+ ${appendix}` : appendix : out,
811
+ stderr: (stderr + stderrDecoder.end()).trim(),
812
+ exitCode: code
813
+ });
814
+ };
796
815
  const timer = setTimeout(() => {
797
816
  timedOut = true;
817
+ if (exited) {
818
+ settle(124, `[Exit code: 124]
819
+ [Process timed out after ${timeout}ms]`);
820
+ return;
821
+ }
798
822
  void terminateProcessTree(proc, { exited: () => exited });
799
823
  }, timeout);
800
824
  const onAbort = () => {
801
825
  if (!timedOut && !aborted) {
802
826
  aborted = true;
827
+ if (exited) {
828
+ settle(130, "[interrupted by user]");
829
+ return;
830
+ }
803
831
  void terminateProcessTree(proc, { exited: () => exited, immediate: true });
804
832
  }
805
833
  };
@@ -814,32 +842,28 @@ function executeCommand(command, cwd, timeout, signal, onProgress) {
814
842
  stderr += text;
815
843
  onProgress?.(`[stderr] ${text}`);
816
844
  });
817
- const settle = (exitCode, appendix) => {
818
- const out = (stdout + stdoutDecoder.end()).trim();
819
- resolve3({
820
- stdout: appendix ? out ? `${out}
821
-
822
- ${appendix}` : appendix : out,
823
- stderr: (stderr + stderrDecoder.end()).trim(),
824
- exitCode
825
- });
826
- };
827
- proc.on("exit", () => {
845
+ proc.on("exit", (code) => {
846
+ exitCode = code;
847
+ exited = true;
828
848
  if (aborted) {
829
- clearTimeout(timer);
830
- signal?.removeEventListener("abort", onAbort);
831
849
  settle(130, "[interrupted by user]");
832
- } else if (timedOut) {
833
- clearTimeout(timer);
834
- signal?.removeEventListener("abort", onAbort);
850
+ return;
851
+ }
852
+ if (timedOut) {
835
853
  settle(124, `[Exit code: 124]
836
854
  [Process timed out after ${timeout}ms]`);
855
+ return;
837
856
  }
857
+ graceTimer = setTimeout(() => {
858
+ settle(
859
+ exitCode ?? 1,
860
+ "[Shell exited, but a background process still held the output pipes open, so output may be incomplete]"
861
+ );
862
+ }, ZOMBIE_PIPE_GRACE_MS);
838
863
  });
839
864
  proc.on("close", (code) => {
840
865
  exited = true;
841
- clearTimeout(timer);
842
- signal?.removeEventListener("abort", onAbort);
866
+ if (graceTimer !== void 0) clearTimeout(graceTimer);
843
867
  if (timedOut) {
844
868
  settle(124, `[Exit code: 124]
845
869
  [Process timed out after ${timeout}ms]`);
@@ -849,10 +873,11 @@ ${appendix}` : appendix : out,
849
873
  settle(130, "[interrupted by user]");
850
874
  return;
851
875
  }
852
- settle(code ?? 1);
876
+ settle(code ?? exitCode ?? 1);
853
877
  });
854
878
  proc.on("error", (error) => {
855
879
  clearTimeout(timer);
880
+ if (graceTimer !== void 0) clearTimeout(graceTimer);
856
881
  signal?.removeEventListener("abort", onAbort);
857
882
  reject(error);
858
883
  });
@@ -2450,7 +2475,7 @@ var callSubAgentTool = {
2450
2475
  };
2451
2476
  }
2452
2477
  try {
2453
- const { getToolRegistryForAgent: getToolRegistryForAgent2 } = await import("./tools-7L63ZMNU.js");
2478
+ const { getToolRegistryForAgent: getToolRegistryForAgent2 } = await import("./tools-RG4HDV75.js");
2454
2479
  const toolRegistry = getToolRegistryForAgent2(agentDef);
2455
2480
  const turnMetrics = new TurnMetrics();
2456
2481
  const result = await executeSubAgent({
@@ -3554,11 +3579,11 @@ var mcpConfigTool = createTool(
3554
3579
  async function notifyContextChanged(sessionId) {
3555
3580
  context.sessionManager.setDynamicContextChanged(sessionId, true);
3556
3581
  mcpNotifyChanged?.(sessionId);
3557
- const { injectContextDriftReminders } = await import("./dynamic-context-CR4RUXOX.js");
3582
+ const { injectContextDriftReminders } = await import("./dynamic-context-7AJC6AII.js");
3558
3583
  await injectContextDriftReminders(context.sessionManager, sessionId);
3559
3584
  }
3560
3585
  async function rebuildTools() {
3561
- const { setMcpTools: setMcpTools2 } = await import("./tools-7L63ZMNU.js");
3586
+ const { setMcpTools: setMcpTools2 } = await import("./tools-RG4HDV75.js");
3562
3587
  const mcpTools = createMcpTools(mcpManagerForTools);
3563
3588
  setMcpTools2(mcpTools);
3564
3589
  }
@@ -4700,4 +4725,4 @@ export {
4700
4725
  getToolRegistryForAgent,
4701
4726
  createToolRegistry
4702
4727
  };
4703
- //# sourceMappingURL=chunk-C4LI5U6L.js.map
4728
+ //# sourceMappingURL=chunk-QKPTMHA2.js.map
@@ -0,0 +1,7 @@
1
+ // src/constants.ts
2
+ var VERSION = "2.0.145";
3
+
4
+ export {
5
+ VERSION
6
+ };
7
+ //# sourceMappingURL=chunk-QV4BKKIO.js.map
@@ -5,18 +5,18 @@ import {
5
5
  } from "./chunk-3IVJ65IG.js";
6
6
  import {
7
7
  launchWorkflowRun
8
- } from "./chunk-MBDYJ35W.js";
8
+ } from "./chunk-LG3LQLTZ.js";
9
9
  import {
10
10
  runChatTurn
11
- } from "./chunk-5XKWYLBX.js";
11
+ } from "./chunk-2BARKBWV.js";
12
12
  import {
13
13
  applyDynamicContext,
14
14
  computeSessionHash,
15
15
  computeUnifiedDiff
16
- } from "./chunk-OSUEWIVU.js";
16
+ } from "./chunk-HNJ32GRI.js";
17
17
  import {
18
18
  devServerManager
19
- } from "./chunk-C4LI5U6L.js";
19
+ } from "./chunk-QKPTMHA2.js";
20
20
  import {
21
21
  gitSpawnEnv
22
22
  } from "./chunk-J7GAZGZT.js";
@@ -1352,7 +1352,7 @@ async function handleClientMessage(ws, client, message, _getLLMClient, _getActiv
1352
1352
  }
1353
1353
  const session = sessionManager.requireSession(sessionId);
1354
1354
  try {
1355
- const { buildCachedPrompt, computePreviewToolDiff } = await import("./dynamic-context-CR4RUXOX.js");
1355
+ const { buildCachedPrompt, computePreviewToolDiff } = await import("./dynamic-context-7AJC6AII.js");
1356
1356
  const allAgents = await import("./registry-24U5BZAJ.js");
1357
1357
  const agentDef = allAgents.findAgentById(session.mode, await allAgents.loadAllAgentsDefault()) ?? allAgents.findAgentById("planner", await allAgents.loadAllAgentsDefault());
1358
1358
  const modelName = session.providerModel ?? _providerManager?.getCurrentModel();
@@ -1364,7 +1364,7 @@ async function handleClientMessage(ws, client, message, _getLLMClient, _getActiv
1364
1364
  const oldCached = sessionManager.getCachedPrompt(sessionId);
1365
1365
  const oldPrompt = oldCached?.systemPrompt;
1366
1366
  const diff = oldPrompt ? computeUnifiedDiff(oldPrompt, newPrompt) : [];
1367
- const { getToolRegistryForAgent } = await import("./tools-7L63ZMNU.js");
1367
+ const { getToolRegistryForAgent } = await import("./tools-RG4HDV75.js");
1368
1368
  const unfilteredTools = getToolRegistryForAgent(agentDef).definitions;
1369
1369
  const toolDiff = computePreviewToolDiff(oldCached?.tools, unfilteredTools, newTools);
1370
1370
  send({
@@ -1737,4 +1737,4 @@ export {
1737
1737
  signalMcpReady,
1738
1738
  createWebSocketServer
1739
1739
  };
1740
- //# sourceMappingURL=chunk-Z3C3D4IR.js.map
1740
+ //# sourceMappingURL=chunk-X2BJFVER.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-QURYQA4D.js";
4
+ } from "../chunk-6FKSGQYO.js";
5
5
  import "../chunk-AGXJ5O63.js";
6
6
  import "../chunk-2OMGR7LN.js";
7
7
  import {
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-QURYQA4D.js";
4
+ } from "../chunk-6FKSGQYO.js";
5
5
  import "../chunk-AGXJ5O63.js";
6
6
  import "../chunk-2OMGR7LN.js";
7
7
  import {
@@ -16,7 +16,7 @@ import {
16
16
  injectContextDriftRemindersForSessions,
17
17
  renderSystemPromptDiff,
18
18
  renderToolChangeReminder
19
- } from "./chunk-OSUEWIVU.js";
19
+ } from "./chunk-HNJ32GRI.js";
20
20
  import "./chunk-DJH6LMBT.js";
21
21
  import "./chunk-ZONLEX2F.js";
22
22
  import "./chunk-2DVAF6HY.js";
@@ -52,4 +52,4 @@ export {
52
52
  renderSystemPromptDiff,
53
53
  renderToolChangeReminder
54
54
  };
55
- //# sourceMappingURL=dynamic-context-CR4RUXOX.js.map
55
+ //# sourceMappingURL=dynamic-context-7AJC6AII.js.map
@@ -11,7 +11,7 @@ import "./chunk-OSXPQSLW.js";
11
11
  import "./chunk-LCLH6ZUL.js";
12
12
  import {
13
13
  VERSION
14
- } from "./chunk-ZSGELOTW.js";
14
+ } from "./chunk-QV4BKKIO.js";
15
15
  import {
16
16
  getProject
17
17
  } from "./chunk-JYYBSODN.js";
@@ -136,4 +136,4 @@ export {
136
136
  buildSessionExport,
137
137
  parseSessionExport
138
138
  };
139
- //# sourceMappingURL=export-import-3WOHC7PI.js.map
139
+ //# sourceMappingURL=export-import-AH5HBHO6.js.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  abortRunnerRun,
3
3
  launchWorkflowRun
4
- } from "./chunk-MBDYJ35W.js";
5
- import "./chunk-5XKWYLBX.js";
6
- import "./chunk-OSUEWIVU.js";
7
- import "./chunk-C4LI5U6L.js";
4
+ } from "./chunk-LG3LQLTZ.js";
5
+ import "./chunk-2BARKBWV.js";
6
+ import "./chunk-HNJ32GRI.js";
7
+ import "./chunk-QKPTMHA2.js";
8
8
  import "./chunk-OAN4BXEW.js";
9
9
  import "./chunk-DJH6LMBT.js";
10
10
  import "./chunk-PHR64A6U.js";
@@ -56,4 +56,4 @@ export {
56
56
  abortRunnerRun,
57
57
  launchWorkflowRun
58
58
  };
59
- //# sourceMappingURL=launch-4COI5RGL.js.map
59
+ //# sourceMappingURL=launch-2QA2EHCT.js.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  runAgentTurn,
3
3
  runChatTurn
4
- } from "./chunk-5XKWYLBX.js";
5
- import "./chunk-OSUEWIVU.js";
6
- import "./chunk-C4LI5U6L.js";
4
+ } from "./chunk-2BARKBWV.js";
5
+ import "./chunk-HNJ32GRI.js";
6
+ import "./chunk-QKPTMHA2.js";
7
7
  import "./chunk-OAN4BXEW.js";
8
8
  import "./chunk-DJH6LMBT.js";
9
9
  import "./chunk-PHR64A6U.js";
@@ -67,4 +67,4 @@ export {
67
67
  runAgentTurn,
68
68
  runChatTurn
69
69
  };
70
- //# sourceMappingURL=orchestrator-AMTWA6JO.js.map
70
+ //# sourceMappingURL=orchestrator-L5VINV36.js.map
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openfox",
3
- "version": "2.0.144",
3
+ "version": "2.0.145",
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-3IVJ65IG.js";
6
- import "./chunk-C4LI5U6L.js";
6
+ import "./chunk-QKPTMHA2.js";
7
7
  import "./chunk-OAN4BXEW.js";
8
8
  import "./chunk-DJH6LMBT.js";
9
9
  import "./chunk-PHR64A6U.js";
@@ -229,7 +229,7 @@ var QueueProcessor = class {
229
229
  model: sessionClient.getModel(),
230
230
  ...sessionEffort ? { reasoningEffort: sessionEffort } : {}
231
231
  };
232
- const { runChatTurn } = await import("./orchestrator-AMTWA6JO.js");
232
+ const { runChatTurn } = await import("./orchestrator-L5VINV36.js");
233
233
  const runChatTurnParams = buildRunChatTurnParams({
234
234
  sessionManager,
235
235
  sessionId,
@@ -278,4 +278,4 @@ var QueueProcessor = class {
278
278
  export {
279
279
  QueueProcessor
280
280
  };
281
- //# sourceMappingURL=processor-UZ7OBCAK.js.map
281
+ //# sourceMappingURL=processor-UQ5ITWL6.js.map
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  createServer
3
- } from "./chunk-5ONERSDK.js";
4
- import "./chunk-Z3C3D4IR.js";
3
+ } from "./chunk-DBTDMK23.js";
4
+ import "./chunk-X2BJFVER.js";
5
5
  import "./chunk-3IVJ65IG.js";
6
- import "./chunk-MBDYJ35W.js";
6
+ import "./chunk-LG3LQLTZ.js";
7
7
  import "./chunk-T3S5MTMD.js";
8
8
  import "./chunk-WLJJRX22.js";
9
9
  import "./chunk-DQTN4B33.js";
10
10
  import "./chunk-IJ53Y77N.js";
11
- import "./chunk-5XKWYLBX.js";
12
- import "./chunk-OSUEWIVU.js";
13
- import "./chunk-C4LI5U6L.js";
11
+ import "./chunk-2BARKBWV.js";
12
+ import "./chunk-HNJ32GRI.js";
13
+ import "./chunk-QKPTMHA2.js";
14
14
  import "./chunk-OAN4BXEW.js";
15
15
  import "./chunk-DJH6LMBT.js";
16
16
  import "./chunk-PHR64A6U.js";
@@ -47,7 +47,7 @@ import "./chunk-J2GP3J3X.js";
47
47
  import "./chunk-YNMP647F.js";
48
48
  import {
49
49
  VERSION
50
- } from "./chunk-ZSGELOTW.js";
50
+ } from "./chunk-QV4BKKIO.js";
51
51
  import "./chunk-JYYBSODN.js";
52
52
  import "./chunk-L2RESXUF.js";
53
53
  import "./chunk-TS5WKTFB.js";
@@ -250,4 +250,4 @@ async function runServe(options) {
250
250
  export {
251
251
  runServe
252
252
  };
253
- //# sourceMappingURL=serve-NLQ6IB2V.js.map
253
+ //# sourceMappingURL=serve-CIBBSOLM.js.map
@@ -1,17 +1,17 @@
1
1
  import {
2
2
  createServer,
3
3
  createServerHandle
4
- } from "../chunk-5ONERSDK.js";
5
- import "../chunk-Z3C3D4IR.js";
4
+ } from "../chunk-DBTDMK23.js";
5
+ import "../chunk-X2BJFVER.js";
6
6
  import "../chunk-3IVJ65IG.js";
7
- import "../chunk-MBDYJ35W.js";
7
+ import "../chunk-LG3LQLTZ.js";
8
8
  import "../chunk-T3S5MTMD.js";
9
9
  import "../chunk-WLJJRX22.js";
10
10
  import "../chunk-DQTN4B33.js";
11
11
  import "../chunk-IJ53Y77N.js";
12
- import "../chunk-5XKWYLBX.js";
13
- import "../chunk-OSUEWIVU.js";
14
- import "../chunk-C4LI5U6L.js";
12
+ import "../chunk-2BARKBWV.js";
13
+ import "../chunk-HNJ32GRI.js";
14
+ import "../chunk-QKPTMHA2.js";
15
15
  import "../chunk-OAN4BXEW.js";
16
16
  import "../chunk-DJH6LMBT.js";
17
17
  import "../chunk-PHR64A6U.js";
@@ -42,7 +42,7 @@ import "../chunk-AWBV2VXO.js";
42
42
  import "../chunk-OA2FURC3.js";
43
43
  import "../chunk-J2GP3J3X.js";
44
44
  import "../chunk-YNMP647F.js";
45
- import "../chunk-ZSGELOTW.js";
45
+ import "../chunk-QV4BKKIO.js";
46
46
  import "../chunk-JYYBSODN.js";
47
47
  import "../chunk-L2RESXUF.js";
48
48
  import "../chunk-TS5WKTFB.js";
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  createWebSocketServer,
3
3
  signalMcpReady
4
- } from "./chunk-Z3C3D4IR.js";
4
+ } from "./chunk-X2BJFVER.js";
5
5
  import "./chunk-3IVJ65IG.js";
6
- import "./chunk-MBDYJ35W.js";
7
- import "./chunk-5XKWYLBX.js";
8
- import "./chunk-OSUEWIVU.js";
9
- import "./chunk-C4LI5U6L.js";
6
+ import "./chunk-LG3LQLTZ.js";
7
+ import "./chunk-2BARKBWV.js";
8
+ import "./chunk-HNJ32GRI.js";
9
+ import "./chunk-QKPTMHA2.js";
10
10
  import "./chunk-OAN4BXEW.js";
11
11
  import "./chunk-DJH6LMBT.js";
12
12
  import "./chunk-PHR64A6U.js";
@@ -59,4 +59,4 @@ export {
59
59
  createWebSocketServer,
60
60
  signalMcpReady
61
61
  };
62
- //# sourceMappingURL=server-YXKUQ3DD.js.map
62
+ //# sourceMappingURL=server-YW3DO4K5.js.map
@@ -10,7 +10,7 @@ import {
10
10
  setTasksService,
11
11
  stepDoneTool,
12
12
  validateToolAction
13
- } from "./chunk-C4LI5U6L.js";
13
+ } from "./chunk-QKPTMHA2.js";
14
14
  import "./chunk-OAN4BXEW.js";
15
15
  import "./chunk-DJH6LMBT.js";
16
16
  import "./chunk-PHR64A6U.js";
@@ -92,4 +92,4 @@ export {
92
92
  stepDoneTool,
93
93
  validateToolAction
94
94
  };
95
- //# sourceMappingURL=tools-7L63ZMNU.js.map
95
+ //# sourceMappingURL=tools-RG4HDV75.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-2OMGR7LN.js";
4
4
  import {
5
5
  VERSION
6
- } from "./chunk-ZSGELOTW.js";
6
+ } from "./chunk-QV4BKKIO.js";
7
7
  import "./chunk-24YKXKCG.js";
8
8
  import "./chunk-CQGTEGKL.js";
9
9
  import "./chunk-YLJ4XMA6.js";
@@ -73,4 +73,4 @@ async function runUpdate(options = {}) {
73
73
  export {
74
74
  runUpdate
75
75
  };
76
- //# sourceMappingURL=update-IBN2GJUI.js.map
76
+ //# sourceMappingURL=update-5ENWM2XR.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openfox",
3
- "version": "2.0.144",
3
+ "version": "2.0.145",
4
4
  "description": "Local-LLM-first agentic coding assistant",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,7 +0,0 @@
1
- // src/constants.ts
2
- var VERSION = "2.0.144";
3
-
4
- export {
5
- VERSION
6
- };
7
- //# sourceMappingURL=chunk-ZSGELOTW.js.map