openfox 2.0.58 → 2.0.59

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 (32) hide show
  1. package/dist/agent-defaults/explorer.agent.md +4 -0
  2. package/dist/{branch.api-5DMEAIBI.js → branch.api-LAN42BA5.js} +3 -2
  3. package/dist/{chat-handler-W5D5LKKU.js → chat-handler-AS44EMQE.js} +6 -6
  4. package/dist/{chunk-YMEZFRY2.js → chunk-43UFGATL.js} +5 -5
  5. package/dist/{chunk-CFLGVCYT.js → chunk-5MDIKIMG.js} +20 -9
  6. package/dist/{chunk-BIWVYBIE.js → chunk-BGTEIA2S.js} +4 -3
  7. package/dist/{chunk-XR2XC7WM.js → chunk-EKI5SZC7.js} +2 -2
  8. package/dist/{chunk-LAWUUAN7.js → chunk-FRU2X3IZ.js} +69 -29
  9. package/dist/{chunk-UDZNMYWN.js → chunk-LQFCQ6PY.js} +95 -72
  10. package/dist/{chunk-55VITQP3.js → chunk-P7C6KF2H.js} +9 -9
  11. package/dist/{chunk-ADOXTORQ.js → chunk-PK2RMVMB.js} +2 -2
  12. package/dist/cli/dev.js +2 -2
  13. package/dist/cli/index.js +2 -2
  14. package/dist/{config-C2YDEF3N.js → config-GMQUPNBY.js} +2 -2
  15. package/dist/{manager-CZOVNTSN.js → manager-344C5JLZ.js} +3 -3
  16. package/dist/{orchestrator-Q47D6JXG.js → orchestrator-MH7J2YVP.js} +6 -6
  17. package/dist/package.json +1 -1
  18. package/dist/{permissions-QLHZUEGW.js → permissions-CGEK3DGZ.js} +21 -17
  19. package/dist/{processor-2YJ33KUH.js → processor-34MVJZTD.js} +6 -6
  20. package/dist/{project-creator-7RBHP6K6.js → project-creator-IDW7RACH.js} +4 -4
  21. package/dist/{protocol-PSKVUhdN.d.ts → protocol-J7khRG62.d.ts} +2 -0
  22. package/dist/{provider-SNXYPSPH.js → provider-LBYBC5AG.js} +3 -3
  23. package/dist/{pwa-M6QZ52ZO.js → pwa-T6JRAYJB.js} +11 -10
  24. package/dist/{serve-LOPGRMFP.js → serve-NHF6B5RQ.js} +8 -8
  25. package/dist/server/index.d.ts +1 -1
  26. package/dist/server/index.js +7 -7
  27. package/dist/{server-XUDZRBD3.js → server-KDGQZNYQ.js} +7 -7
  28. package/dist/{service-YYJ5Y7CN.js → service-6DL3MJZD.js} +7 -5
  29. package/dist/shared/index.d.ts +2 -2
  30. package/dist/{store-NS2RMRA7.js → store-FXTCHBI4.js} +2 -2
  31. package/dist/{tools-YJLXW3QS.js → tools-FQ54IAYG.js} +5 -5
  32. package/package.json +1 -1
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openfox",
3
- "version": "2.0.58",
3
+ "version": "2.0.59",
4
4
  "description": "Local-LLM-first agentic coding assistant",
5
5
  "type": "module",
6
6
  "bin": {
@@ -11,6 +11,13 @@ function sanitizeShellArg(arg) {
11
11
  }
12
12
  return arg;
13
13
  }
14
+ function addUserToGroup(groupName) {
15
+ const currentUser = execSync("id -un", { encoding: "utf-8", windowsHide: true }).trim();
16
+ execSync(`sudo usermod -aG ${sanitizeShellArg(groupName)} ${sanitizeShellArg(currentUser)}`, {
17
+ stdio: "pipe",
18
+ windowsHide: true
19
+ });
20
+ }
14
21
  async function getDirInfo(targetPath) {
15
22
  const resolvedPath = resolve(targetPath);
16
23
  try {
@@ -20,19 +27,19 @@ async function getDirInfo(targetPath) {
20
27
  }
21
28
  let sudoAvailable;
22
29
  try {
23
- execSync("sudo -n true", { stdio: "pipe" });
30
+ execSync("sudo -n true", { stdio: "pipe", windowsHide: true });
24
31
  sudoAvailable = true;
25
32
  } catch {
26
33
  sudoAvailable = false;
27
34
  }
28
35
  const dirStat = await stat(resolvedPath);
29
36
  const groupGid = dirStat.gid;
30
- const currentUser = sanitizeShellArg(execSync("id -un", { encoding: "utf-8" }).trim());
31
- const groupsOutput = execSync(`id -Gn ${currentUser}`, { encoding: "utf-8" }).trim();
37
+ const currentUser = sanitizeShellArg(execSync("id -un", { encoding: "utf-8", windowsHide: true }).trim());
38
+ const groupsOutput = execSync(`id -Gn ${currentUser}`, { encoding: "utf-8", windowsHide: true }).trim();
32
39
  const userGroups = groupsOutput.split(/\s+/);
33
40
  let groupName = null;
34
41
  try {
35
- const rawGroupName = execSync(`getent group ${groupGid}`, { encoding: "utf-8" }).split(":")[0]?.trim();
42
+ const rawGroupName = execSync(`getent group ${groupGid}`, { encoding: "utf-8", windowsHide: true }).split(":")[0]?.trim();
36
43
  groupName = rawGroupName ? sanitizeShellArg(rawGroupName) : null;
37
44
  } catch {
38
45
  }
@@ -69,32 +76,29 @@ async function fixPermissions(targetPath, action) {
69
76
  error: 'You are not in the group that owns this directory. Use "Join group & extend group permissions" instead.'
70
77
  };
71
78
  }
72
- execSync(`sudo chmod g+w "${info.resolvedPath}"`, { stdio: "pipe" });
79
+ execSync(`sudo chmod g+w "${info.resolvedPath}"`, { stdio: "pipe", windowsHide: true });
73
80
  return { success: true, sudoAvailable: info.sudoAvailable, method: "group" };
74
81
  }
75
82
  if (action === "join_group") {
76
83
  if (!info.groupName) {
77
84
  return { success: false, sudoAvailable: info.sudoAvailable, error: "Could not determine group name" };
78
85
  }
79
- const currentUser = execSync("id -un", { encoding: "utf-8" }).trim();
80
- execSync(`sudo usermod -aG ${sanitizeShellArg(info.groupName)} ${sanitizeShellArg(currentUser)}`, {
81
- stdio: "pipe"
82
- });
86
+ addUserToGroup(info.groupName);
83
87
  return { success: true, sudoAvailable: info.sudoAvailable, method: "join_group" };
84
88
  }
85
89
  if (action === "join_group_and_group") {
86
90
  if (!info.groupName) {
87
91
  return { success: false, sudoAvailable: info.sudoAvailable, error: "Could not determine group name" };
88
92
  }
89
- execSync(`sudo chmod g+w "${info.resolvedPath}"`, { stdio: "pipe" });
90
- const currentUser = execSync("id -un", { encoding: "utf-8" }).trim();
91
- execSync(`sudo usermod -aG ${sanitizeShellArg(info.groupName)} ${sanitizeShellArg(currentUser)}`, {
92
- stdio: "pipe"
93
- });
93
+ execSync(`sudo chmod g+w "${info.resolvedPath}"`, { stdio: "pipe", windowsHide: true });
94
+ addUserToGroup(info.groupName);
94
95
  return { success: true, sudoAvailable: info.sudoAvailable, method: "join_group_and_group" };
95
96
  }
96
- const ownerUser = execSync("id -un", { encoding: "utf-8" }).trim();
97
- execSync(`sudo chown -R ${sanitizeShellArg(ownerUser)} "${info.resolvedPath}"`, { stdio: "pipe" });
97
+ const ownerUser = execSync("id -un", { encoding: "utf-8", windowsHide: true }).trim();
98
+ execSync(`sudo chown -R ${sanitizeShellArg(ownerUser)} "${info.resolvedPath}"`, {
99
+ stdio: "pipe",
100
+ windowsHide: true
101
+ });
98
102
  return { success: true, sudoAvailable: info.sudoAvailable, method: "ownership" };
99
103
  } catch (err) {
100
104
  const message = err instanceof Error ? err.message : "Unknown error";
@@ -108,4 +112,4 @@ export {
108
112
  checkPermissions,
109
113
  fixPermissions
110
114
  };
111
- //# sourceMappingURL=permissions-QLHZUEGW.js.map
115
+ //# sourceMappingURL=permissions-CGEK3DGZ.js.map
@@ -3,10 +3,10 @@ import {
3
3
  finalizeTurnCompletion,
4
4
  generateSessionNameForSession
5
5
  } from "./chunk-NVPVDDQZ.js";
6
- import "./chunk-LAWUUAN7.js";
6
+ import "./chunk-FRU2X3IZ.js";
7
7
  import "./chunk-LBGHZLLH.js";
8
- import "./chunk-BIWVYBIE.js";
9
- import "./chunk-ADOXTORQ.js";
8
+ import "./chunk-BGTEIA2S.js";
9
+ import "./chunk-PK2RMVMB.js";
10
10
  import "./chunk-NWO6GRYE.js";
11
11
  import {
12
12
  createChatMessageMessage,
@@ -28,7 +28,7 @@ import {
28
28
  logger
29
29
  } from "./chunk-K44MW7JJ.js";
30
30
  import "./chunk-YD6NDTKF.js";
31
- import "./chunk-YMEZFRY2.js";
31
+ import "./chunk-43UFGATL.js";
32
32
  import "./chunk-CQGTEGKL.js";
33
33
  import "./chunk-V4IE7HJY.js";
34
34
  import "./chunk-5WRI5ZAA.js";
@@ -174,7 +174,7 @@ var QueueProcessor = class {
174
174
  backend: provider?.backend ?? llmClient.getBackend(),
175
175
  model: llmClient.getModel()
176
176
  };
177
- const { runChatTurn } = await import("./orchestrator-Q47D6JXG.js");
177
+ const { runChatTurn } = await import("./orchestrator-MH7J2YVP.js");
178
178
  const runChatTurnParams = buildRunChatTurnParams({
179
179
  sessionManager,
180
180
  sessionId,
@@ -222,4 +222,4 @@ var QueueProcessor = class {
222
222
  export {
223
223
  QueueProcessor
224
224
  };
225
- //# sourceMappingURL=processor-2YJ33KUH.js.map
225
+ //# sourceMappingURL=processor-34MVJZTD.js.map
@@ -74,7 +74,7 @@ async function createDirectoryWithGit(projectName, workdir) {
74
74
  }
75
75
  if (!await directoryExists(join(fullPath, ".git"))) {
76
76
  try {
77
- execSync("git init", { cwd: fullPath, stdio: "pipe" });
77
+ execSync("git init", { cwd: fullPath, stdio: "pipe", windowsHide: true });
78
78
  } catch (gitErr) {
79
79
  const errMsg = gitErr instanceof Error ? gitErr.message : "Unknown";
80
80
  const exitCode = gitErr.status ?? gitErr.exitCode;
@@ -82,8 +82,8 @@ async function createDirectoryWithGit(projectName, workdir) {
82
82
  let sudoSuccess = false;
83
83
  if (isPermission) {
84
84
  try {
85
- const currentUser = execSync("id -un", { encoding: "utf-8" }).trim();
86
- execSync(`sudo -u ${currentUser} git init`, { cwd: fullPath, stdio: "pipe" });
85
+ const currentUser = execSync("id -un", { encoding: "utf-8", windowsHide: true }).trim();
86
+ execSync(`sudo -u ${currentUser} git init`, { cwd: fullPath, stdio: "pipe", windowsHide: true });
87
87
  sudoSuccess = true;
88
88
  } catch {
89
89
  }
@@ -109,4 +109,4 @@ export {
109
109
  createDirectoryWithGit,
110
110
  validateProjectName
111
111
  };
112
- //# sourceMappingURL=project-creator-7RBHP6K6.js.map
112
+ //# sourceMappingURL=project-creator-IDW7RACH.js.map
@@ -492,6 +492,8 @@ interface Config {
492
492
  activeWorkflowId?: string | undefined;
493
493
  /** Disable automatic session title generation */
494
494
  disableAutoSessionTitle?: boolean;
495
+ /** Override path for the global config file (used for test isolation) */
496
+ globalConfigPath?: string;
495
497
  /** MCP server configurations */
496
498
  mcpServers?: Record<string, {
497
499
  transport: 'stdio' | 'http';
@@ -28,7 +28,7 @@ import {
28
28
  loadGlobalConfig,
29
29
  removeProvider,
30
30
  saveGlobalConfig
31
- } from "./chunk-YMEZFRY2.js";
31
+ } from "./chunk-43UFGATL.js";
32
32
  import "./chunk-CQGTEGKL.js";
33
33
  import "./chunk-V4IE7HJY.js";
34
34
  import "./chunk-5WRI5ZAA.js";
@@ -270,7 +270,7 @@ async function runProviderAdd(mode) {
270
270
  isActive: makeActive
271
271
  });
272
272
  if (makeActive) {
273
- const { setDefaultModelSelection } = await import("./config-C2YDEF3N.js");
273
+ const { setDefaultModelSelection } = await import("./config-GMQUPNBY.js");
274
274
  newConfig = setDefaultModelSelection(
275
275
  newConfig,
276
276
  newConfig.providers[newConfig.providers.length - 1].id,
@@ -398,4 +398,4 @@ export {
398
398
  runProviderRemove,
399
399
  runProviderUse
400
400
  };
401
- //# sourceMappingURL=provider-SNXYPSPH.js.map
401
+ //# sourceMappingURL=provider-LBYBC5AG.js.map
@@ -17,14 +17,14 @@ import { platform } from "os";
17
17
  var PWA_CONFIG_FILE = "pwa.json";
18
18
  function execSyncSilent(cmd) {
19
19
  try {
20
- return execSync(cmd, { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] });
20
+ return execSync(cmd, { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"], windowsHide: true });
21
21
  } catch {
22
22
  return "";
23
23
  }
24
24
  }
25
25
  function execSyncOk(cmd) {
26
26
  try {
27
- execSync(cmd, { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] });
27
+ execSync(cmd, { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"], windowsHide: true });
28
28
  return true;
29
29
  } catch {
30
30
  return false;
@@ -86,7 +86,7 @@ function getFirefoxPwaInstallHint() {
86
86
  }
87
87
  function probeInstalledApp(manifestUrl) {
88
88
  try {
89
- const out = execSync("firefoxpwa profile list", { encoding: "utf-8" });
89
+ const out = execSync("firefoxpwa profile list", { encoding: "utf-8", windowsHide: true });
90
90
  const lines = out.split("\n");
91
91
  let currentProfile = "";
92
92
  for (const line of lines) {
@@ -110,7 +110,8 @@ function isServerReachable(port) {
110
110
  try {
111
111
  const result = execSync(`curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1:${port}/manifest.webmanifest`, {
112
112
  encoding: "utf-8",
113
- timeout: 5e3
113
+ timeout: 5e3,
114
+ windowsHide: true
114
115
  });
115
116
  return result.trim() === "200";
116
117
  } catch {
@@ -179,7 +180,7 @@ See: https://pwasforfirefox.filips.si/installation/`);
179
180
  if (install) {
180
181
  R.info("Running: firefoxpwa runtime install");
181
182
  try {
182
- spawn("firefoxpwa", ["runtime", "install"], { stdio: "inherit" });
183
+ spawn("firefoxpwa", ["runtime", "install"], { stdio: "inherit", windowsHide: true });
183
184
  } catch {
184
185
  R.error("Failed to install runtime.");
185
186
  process.exit(1);
@@ -219,7 +220,7 @@ Use "openfox pwa launch" to start it, or "openfox pwa uninstall" to remove it.`)
219
220
  let appId = "";
220
221
  let profileId = "00000000000000000000000000";
221
222
  try {
222
- execSync(`firefoxpwa site install ${manifestUrl}`, { encoding: "utf-8" });
223
+ execSync(`firefoxpwa site install ${manifestUrl}`, { encoding: "utf-8", windowsHide: true });
223
224
  const detected = probeInstalledApp(manifestUrl);
224
225
  if (detected) {
225
226
  appId = detected.appId;
@@ -261,7 +262,7 @@ async function pwaUninstall(mode) {
261
262
  }
262
263
  R.info("Removing OpenFox PWA...");
263
264
  try {
264
- execSync(`firefoxpwa site uninstall ${appId} --quiet`, { encoding: "utf-8" });
265
+ execSync(`firefoxpwa site uninstall ${appId} --quiet`, { encoding: "utf-8", windowsHide: true });
265
266
  } catch {
266
267
  R.error(`Failed to uninstall PWA (ID: ${appId}).`);
267
268
  process.exit(1);
@@ -289,7 +290,7 @@ async function pwaLaunch(mode) {
289
290
  return;
290
291
  }
291
292
  R.info("Launching OpenFox PWA...");
292
- spawn("firefoxpwa", ["site", "launch", appId], { stdio: "inherit" });
293
+ spawn("firefoxpwa", ["site", "launch", appId], { stdio: "inherit", windowsHide: true });
293
294
  }
294
295
  async function pwaUpdate(mode) {
295
296
  if (!isFirefoxPwaAvailable()) {
@@ -309,7 +310,7 @@ async function pwaUpdate(mode) {
309
310
  return;
310
311
  }
311
312
  try {
312
- execSync(`firefoxpwa site update ${appId}`, { encoding: "utf-8" });
313
+ execSync(`firefoxpwa site update ${appId}`, { encoding: "utf-8", windowsHide: true });
313
314
  } catch {
314
315
  R.error("Failed to update PWA metadata.");
315
316
  process.exit(1);
@@ -360,4 +361,4 @@ export {
360
361
  runPwaCommand,
361
362
  savePwaConfig
362
363
  };
363
- //# sourceMappingURL=pwa-M6QZ52ZO.js.map
364
+ //# sourceMappingURL=pwa-T6JRAYJB.js.map
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  VERSION,
3
3
  createServer
4
- } from "./chunk-UDZNMYWN.js";
5
- import "./chunk-CFLGVCYT.js";
6
- import "./chunk-XR2XC7WM.js";
7
- import "./chunk-LAWUUAN7.js";
4
+ } from "./chunk-LQFCQ6PY.js";
5
+ import "./chunk-5MDIKIMG.js";
6
+ import "./chunk-EKI5SZC7.js";
7
+ import "./chunk-FRU2X3IZ.js";
8
8
  import "./chunk-LBGHZLLH.js";
9
- import "./chunk-BIWVYBIE.js";
10
- import "./chunk-ADOXTORQ.js";
9
+ import "./chunk-BGTEIA2S.js";
10
+ import "./chunk-PK2RMVMB.js";
11
11
  import "./chunk-NWO6GRYE.js";
12
12
  import "./chunk-F4PMNP7S.js";
13
13
  import "./chunk-EU3WWTFH.js";
@@ -37,7 +37,7 @@ import {
37
37
  getActiveProvider,
38
38
  getDefaultModel,
39
39
  loadGlobalConfig
40
- } from "./chunk-YMEZFRY2.js";
40
+ } from "./chunk-43UFGATL.js";
41
41
  import {
42
42
  ensureDataDirExists,
43
43
  getDatabasePath,
@@ -205,4 +205,4 @@ async function runServe(options) {
205
205
  export {
206
206
  runServe
207
207
  };
208
- //# sourceMappingURL=serve-LOPGRMFP.js.map
208
+ //# sourceMappingURL=serve-NHF6B5RQ.js.map
@@ -1,4 +1,4 @@
1
- import { aO as ToolCall, c as Attachment, R as Diagnostic, an as Provider, ab as ModelConfig, aA as Session, aJ as SessionSummary, aj as Project, aE as SessionMode, aG as SessionPhase, M as Message, J as Criterion, L as CriterionStatus, a8 as MetadataEntry, aw as QueuedMessage, F as ContextState, O as DangerLevel$1, ay as ServerMessage, aL as StatsIdentity, aR as ToolResult, D as Config } from '../protocol-PSKVUhdN.js';
1
+ import { aO as ToolCall, c as Attachment, R as Diagnostic, an as Provider, ab as ModelConfig, aA as Session, aJ as SessionSummary, aj as Project, aE as SessionMode, aG as SessionPhase, M as Message, J as Criterion, L as CriterionStatus, a8 as MetadataEntry, aw as QueuedMessage, F as ContextState, O as DangerLevel$1, ay as ServerMessage, aL as StatsIdentity, aR as ToolResult, D as Config } from '../protocol-J7khRG62.js';
2
2
  import { Server } from 'node:http';
3
3
 
4
4
  interface LLMMessage {
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  createServer,
3
3
  createServerHandle
4
- } from "../chunk-UDZNMYWN.js";
5
- import "../chunk-CFLGVCYT.js";
6
- import "../chunk-XR2XC7WM.js";
7
- import "../chunk-LAWUUAN7.js";
4
+ } from "../chunk-LQFCQ6PY.js";
5
+ import "../chunk-5MDIKIMG.js";
6
+ import "../chunk-EKI5SZC7.js";
7
+ import "../chunk-FRU2X3IZ.js";
8
8
  import "../chunk-LBGHZLLH.js";
9
- import "../chunk-BIWVYBIE.js";
10
- import "../chunk-ADOXTORQ.js";
9
+ import "../chunk-BGTEIA2S.js";
10
+ import "../chunk-PK2RMVMB.js";
11
11
  import "../chunk-NWO6GRYE.js";
12
12
  import "../chunk-F4PMNP7S.js";
13
13
  import "../chunk-EU3WWTFH.js";
@@ -29,7 +29,7 @@ import "../chunk-ZO5EXQMG.js";
29
29
  import "../chunk-K44MW7JJ.js";
30
30
  import "../chunk-VUQCQXXJ.js";
31
31
  import "../chunk-YD6NDTKF.js";
32
- import "../chunk-YMEZFRY2.js";
32
+ import "../chunk-43UFGATL.js";
33
33
  import "../chunk-CQGTEGKL.js";
34
34
  import "../chunk-V4IE7HJY.js";
35
35
  import "../chunk-5WRI5ZAA.js";
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  createWebSocketServer,
3
3
  signalMcpReady
4
- } from "./chunk-CFLGVCYT.js";
5
- import "./chunk-XR2XC7WM.js";
6
- import "./chunk-LAWUUAN7.js";
4
+ } from "./chunk-5MDIKIMG.js";
5
+ import "./chunk-EKI5SZC7.js";
6
+ import "./chunk-FRU2X3IZ.js";
7
7
  import "./chunk-LBGHZLLH.js";
8
- import "./chunk-BIWVYBIE.js";
9
- import "./chunk-ADOXTORQ.js";
8
+ import "./chunk-BGTEIA2S.js";
9
+ import "./chunk-PK2RMVMB.js";
10
10
  import "./chunk-NWO6GRYE.js";
11
11
  import "./chunk-F4PMNP7S.js";
12
12
  import "./chunk-EU3WWTFH.js";
@@ -27,7 +27,7 @@ import "./chunk-ZO5EXQMG.js";
27
27
  import "./chunk-K44MW7JJ.js";
28
28
  import "./chunk-VUQCQXXJ.js";
29
29
  import "./chunk-YD6NDTKF.js";
30
- import "./chunk-YMEZFRY2.js";
30
+ import "./chunk-43UFGATL.js";
31
31
  import "./chunk-CQGTEGKL.js";
32
32
  import "./chunk-V4IE7HJY.js";
33
33
  import "./chunk-5WRI5ZAA.js";
@@ -35,4 +35,4 @@ export {
35
35
  createWebSocketServer,
36
36
  signalMcpReady
37
37
  };
38
- //# sourceMappingURL=server-XUDZRBD3.js.map
38
+ //# sourceMappingURL=server-KDGQZNYQ.js.map
@@ -24,7 +24,8 @@ async function pathExists(path) {
24
24
  }
25
25
  function systemctl(args, silent = false) {
26
26
  const result = spawnSync("systemctl", ["--user", ...args], {
27
- encoding: "utf-8"
27
+ encoding: "utf-8",
28
+ windowsHide: true
28
29
  });
29
30
  if (!silent) {
30
31
  console.log(result.stdout || result.stderr || "");
@@ -33,7 +34,7 @@ function systemctl(args, silent = false) {
33
34
  }
34
35
  function exec(command, args = []) {
35
36
  return new Promise((resolve, reject) => {
36
- const child = spawn(command, args, { stdio: "inherit" });
37
+ const child = spawn(command, args, { stdio: "inherit", windowsHide: true });
37
38
  child.on("exit", (code) => {
38
39
  if (code === 0) resolve();
39
40
  else reject(new Error(`Command failed: ${command} ${args.join(" ")}`));
@@ -253,10 +254,11 @@ async function serviceLogs(args) {
253
254
  }
254
255
  const follow = args.includes("-f") || args.includes("--follow");
255
256
  if (follow) {
256
- spawn("journalctl", ["--user", "-u", SERVICE_NAME, "-f", "--no-pager"], { stdio: "inherit" });
257
+ spawn("journalctl", ["--user", "-u", SERVICE_NAME, "-f", "--no-pager"], { stdio: "inherit", windowsHide: true });
257
258
  } else {
258
259
  const result = spawnSync("journalctl", ["--user", "-u", SERVICE_NAME, "-n", "50", "--no-pager"], {
259
- encoding: "utf-8"
260
+ encoding: "utf-8",
261
+ windowsHide: true
260
262
  });
261
263
  console.log(result.stdout || result.stderr || "No logs");
262
264
  }
@@ -289,4 +291,4 @@ async function serviceUninstall() {
289
291
  export {
290
292
  runServiceCommand
291
293
  };
292
- //# sourceMappingURL=service-YYJ5Y7CN.js.map
294
+ //# sourceMappingURL=service-6DL3MJZD.js.map
@@ -1,5 +1,5 @@
1
- import { M as Message, S as SessionStats } from '../protocol-PSKVUhdN.js';
2
- export { A as AgentEvent, a as AskAnswerPayload, b as AskUserEvent, c as Attachment, B as BackgroundProcess, d as BackgroundProcessExitedPayload, e as BackgroundProcessOutputPayload, f as BackgroundProcessRemovedPayload, g as BackgroundProcessStartedPayload, h as BackgroundProcessStatus, C as CallStatsDataPoint, i as ChatAskUserPayload, j as ChatDeltaPayload, k as ChatDonePayload, l as ChatErrorPayload, m as ChatFormatRetryPayload, n as ChatMessagePayload, o as ChatMessageUpdatedPayload, p as ChatPathConfirmationPayload, q as ChatProgressPayload, r as ChatThinkingPayload, s as ChatTodoPayload, t as ChatToolCallPayload, u as ChatToolOutputPayload, v as ChatToolPreparingPayload, w as ChatToolResultPayload, x as ChatVisionFallbackPayload, y as ClientMessage, z as ClientMessageType, D as Config, E as ContextCompactionEvent, F as ContextState, G as ContextStatePayload, H as ContextWindow, I as CriteriaUpdatedPayload, J as Criterion, K as CriterionAttempt, L as CriterionStatus, N as CriterionValidation, O as DangerLevel, P as DevServerOutputPayload, Q as DevServerStatePayload, R as Diagnostic, T as EditContextEdit, U as EditContextLine, V as EditContextRegion, W as ElementData, X as ErrorPayload, Y as ExecutionState, Z as FileReadEntry, _ as GitDiffFile, $ as GitStatusPayload, a0 as InjectedFile, a1 as LLMCallStats, a2 as LlmBackend, a3 as LogLine, a4 as LspDiagnosticsPayload, a5 as MessageRole, a6 as MessageSegment, a7 as MessageStats, a8 as MetadataEntry, a9 as MetadataUpdatedPayload, aa as ModeChangedPayload, ab as ModelConfig, ac as ModelSessionStats, ad as PathConfirmPayload, ae as PathConfirmationReason, af as PendingPathConfirmationPayload, ag as PendingQuestionPayload, ah as PhaseChangedPayload, ai as PreparingToolCall, aj as Project, ak as ProjectDeletedPayload, al as ProjectListPayload, am as ProjectStatePayload, an as Provider, ao as ProviderBackend, ap as ProviderChangedPayload, aq as QueueAddedEvent, ar as QueueCancelledEvent, as as QueueDrainedEvent, at as QueueEvent, au as QueueEventType, av as QueueStatePayload, aw as QueuedMessage, ax as RecentUserPrompt, ay as ServerMessage, az as ServerMessageType, aA as Session, aB as SessionListPayload, aC as SessionLoadPayload, aD as SessionMetadata, aE as SessionMode, aF as SessionNameGeneratedPayload, aG as SessionPhase, aH as SessionRunningPayload, aI as SessionStatePayload, aJ as SessionSummary, aK as StatsDataPoint, aL as StatsIdentity, aM as TaskCompletedPayload, aN as Todo, aO as ToolCall, aP as ToolMode, aQ as ToolName, aR as ToolResult, aS as ValidationResult, aT as createClientMessage, aU as createServerMessage, aV as isClientMessage, aW as isServerMessage } from '../protocol-PSKVUhdN.js';
1
+ import { M as Message, S as SessionStats } from '../protocol-J7khRG62.js';
2
+ export { A as AgentEvent, a as AskAnswerPayload, b as AskUserEvent, c as Attachment, B as BackgroundProcess, d as BackgroundProcessExitedPayload, e as BackgroundProcessOutputPayload, f as BackgroundProcessRemovedPayload, g as BackgroundProcessStartedPayload, h as BackgroundProcessStatus, C as CallStatsDataPoint, i as ChatAskUserPayload, j as ChatDeltaPayload, k as ChatDonePayload, l as ChatErrorPayload, m as ChatFormatRetryPayload, n as ChatMessagePayload, o as ChatMessageUpdatedPayload, p as ChatPathConfirmationPayload, q as ChatProgressPayload, r as ChatThinkingPayload, s as ChatTodoPayload, t as ChatToolCallPayload, u as ChatToolOutputPayload, v as ChatToolPreparingPayload, w as ChatToolResultPayload, x as ChatVisionFallbackPayload, y as ClientMessage, z as ClientMessageType, D as Config, E as ContextCompactionEvent, F as ContextState, G as ContextStatePayload, H as ContextWindow, I as CriteriaUpdatedPayload, J as Criterion, K as CriterionAttempt, L as CriterionStatus, N as CriterionValidation, O as DangerLevel, P as DevServerOutputPayload, Q as DevServerStatePayload, R as Diagnostic, T as EditContextEdit, U as EditContextLine, V as EditContextRegion, W as ElementData, X as ErrorPayload, Y as ExecutionState, Z as FileReadEntry, _ as GitDiffFile, $ as GitStatusPayload, a0 as InjectedFile, a1 as LLMCallStats, a2 as LlmBackend, a3 as LogLine, a4 as LspDiagnosticsPayload, a5 as MessageRole, a6 as MessageSegment, a7 as MessageStats, a8 as MetadataEntry, a9 as MetadataUpdatedPayload, aa as ModeChangedPayload, ab as ModelConfig, ac as ModelSessionStats, ad as PathConfirmPayload, ae as PathConfirmationReason, af as PendingPathConfirmationPayload, ag as PendingQuestionPayload, ah as PhaseChangedPayload, ai as PreparingToolCall, aj as Project, ak as ProjectDeletedPayload, al as ProjectListPayload, am as ProjectStatePayload, an as Provider, ao as ProviderBackend, ap as ProviderChangedPayload, aq as QueueAddedEvent, ar as QueueCancelledEvent, as as QueueDrainedEvent, at as QueueEvent, au as QueueEventType, av as QueueStatePayload, aw as QueuedMessage, ax as RecentUserPrompt, ay as ServerMessage, az as ServerMessageType, aA as Session, aB as SessionListPayload, aC as SessionLoadPayload, aD as SessionMetadata, aE as SessionMode, aF as SessionNameGeneratedPayload, aG as SessionPhase, aH as SessionRunningPayload, aI as SessionStatePayload, aJ as SessionSummary, aK as StatsDataPoint, aL as StatsIdentity, aM as TaskCompletedPayload, aN as Todo, aO as ToolCall, aP as ToolMode, aQ as ToolName, aR as ToolResult, aS as ValidationResult, aT as createClientMessage, aU as createServerMessage, aV as isClientMessage, aW as isServerMessage } from '../protocol-J7khRG62.js';
3
3
 
4
4
  /**
5
5
  * Session stats computation - aggregates response-level MessageStats from
@@ -13,7 +13,7 @@ import {
13
13
  removeProcess,
14
14
  startProcess,
15
15
  updateStatus
16
- } from "./chunk-ADOXTORQ.js";
16
+ } from "./chunk-PK2RMVMB.js";
17
17
  import "./chunk-5WRI5ZAA.js";
18
18
  export {
19
19
  appendLog,
@@ -31,4 +31,4 @@ export {
31
31
  startProcess,
32
32
  updateStatus
33
33
  };
34
- //# sourceMappingURL=store-NS2RMRA7.js.map
34
+ //# sourceMappingURL=store-FXTCHBI4.js.map
@@ -12,10 +12,10 @@ import {
12
12
  setMcpTools,
13
13
  stepDoneTool,
14
14
  validateToolAction
15
- } from "./chunk-LAWUUAN7.js";
15
+ } from "./chunk-FRU2X3IZ.js";
16
16
  import "./chunk-LBGHZLLH.js";
17
- import "./chunk-BIWVYBIE.js";
18
- import "./chunk-ADOXTORQ.js";
17
+ import "./chunk-BGTEIA2S.js";
18
+ import "./chunk-PK2RMVMB.js";
19
19
  import "./chunk-NWO6GRYE.js";
20
20
  import "./chunk-F4PMNP7S.js";
21
21
  import {
@@ -35,7 +35,7 @@ import "./chunk-YHEQTVFV.js";
35
35
  import "./chunk-Z6W4YHJB.js";
36
36
  import "./chunk-K44MW7JJ.js";
37
37
  import "./chunk-YD6NDTKF.js";
38
- import "./chunk-YMEZFRY2.js";
38
+ import "./chunk-43UFGATL.js";
39
39
  import "./chunk-CQGTEGKL.js";
40
40
  import "./chunk-V4IE7HJY.js";
41
41
  import "./chunk-5WRI5ZAA.js";
@@ -58,4 +58,4 @@ export {
58
58
  stepDoneTool,
59
59
  validateToolAction
60
60
  };
61
- //# sourceMappingURL=tools-YJLXW3QS.js.map
61
+ //# sourceMappingURL=tools-FQ54IAYG.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openfox",
3
- "version": "2.0.58",
3
+ "version": "2.0.59",
4
4
  "description": "Local-LLM-first agentic coding assistant",
5
5
  "type": "module",
6
6
  "bin": {