openfox 2.0.102 → 2.0.103

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.0.103 - 2026-07-30
4
+
5
+ ### Bug Fixes
6
+
7
+ - **LSP server crashes no longer freeze write_file/edit_file** — rapid process deaths during startup (e.g., rust-analyzer missing on macOS) are now caught early, letting the tool complete normally.
8
+ - **Hung LSP servers time out after 5 seconds** — the initialize handshake now has a timeout, preventing a non-responsive server from blocking the agent loop.
9
+
3
10
  ## 2.0.102 - 2026-07-29
4
11
 
5
12
  ### Features
package/dist/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.0.103 - 2026-07-30
4
+
5
+ ### Bug Fixes
6
+
7
+ - **LSP server crashes no longer freeze write_file/edit_file** — rapid process deaths during startup (e.g., rust-analyzer missing on macOS) are now caught early, letting the tool complete normally.
8
+ - **Hung LSP servers time out after 5 seconds** — the initialize handshake now has a timeout, preventing a non-responsive server from blocking the agent loop.
9
+
3
10
  ## 2.0.102 - 2026-07-29
4
11
 
5
12
  ### Features
@@ -200,7 +200,7 @@ async function runCli(options) {
200
200
  break;
201
201
  }
202
202
  case "update": {
203
- const { runUpdate } = await import("./update-N4GD5IUX.js");
203
+ const { runUpdate } = await import("./update-KMPQUPQT.js");
204
204
  const code = await runUpdate();
205
205
  if (code !== 0) {
206
206
  process.exit(code);
@@ -213,7 +213,7 @@ async function runCli(options) {
213
213
  if (!configExists) {
214
214
  await runNetworkSetup(mode);
215
215
  }
216
- const { runServe } = await import("./serve-RKHLNGEV.js");
216
+ const { runServe } = await import("./serve-FE4UAXGE.js");
217
217
  const serveOptions = { mode };
218
218
  if (values.port) serveOptions.port = parseInt(values.port);
219
219
  if (values["no-browser"] === true) serveOptions.openBrowser = false;
@@ -225,4 +225,4 @@ async function runCli(options) {
225
225
  export {
226
226
  runCli
227
227
  };
228
- //# sourceMappingURL=chunk-QGWS2EBU.js.map
228
+ //# sourceMappingURL=chunk-JL657X72.js.map
@@ -121,7 +121,7 @@ import {
121
121
  } from "./chunk-WWFH5GAR.js";
122
122
  import {
123
123
  VERSION
124
- } from "./chunk-SV3I2YNO.js";
124
+ } from "./chunk-SQYMFWY7.js";
125
125
  import {
126
126
  clearWorkflowExecution,
127
127
  createSession,
@@ -1732,7 +1732,30 @@ var DiagnosticSeverity = {
1732
1732
  function hoverInfo(contents, range) {
1733
1733
  return range ? { contents, range } : { contents };
1734
1734
  }
1735
+ function withTimeout(promise, ms, label) {
1736
+ const outer = new Promise((resolve9, reject) => {
1737
+ const timer = setTimeout(() => {
1738
+ reject(new Error(`${label} timed out after ${ms}ms`));
1739
+ }, ms);
1740
+ promise.then(
1741
+ (val) => {
1742
+ clearTimeout(timer);
1743
+ resolve9(val);
1744
+ },
1745
+ (err) => {
1746
+ clearTimeout(timer);
1747
+ reject(err);
1748
+ }
1749
+ );
1750
+ promise.catch(() => {
1751
+ });
1752
+ });
1753
+ outer.catch(() => {
1754
+ });
1755
+ return outer;
1756
+ }
1735
1757
  var DIAGNOSTIC_WAIT_MS = 2e3;
1758
+ var DEFAULT_INIT_TIMEOUT_MS = 5e3;
1736
1759
  var SYMBOL_KIND_NAMES = {
1737
1760
  1: "File",
1738
1761
  2: "Module",
@@ -1795,10 +1818,12 @@ var LspServer = class {
1795
1818
  // resolving the waiter so all waves are captured.
1796
1819
  pendingDiagnosticDebounce = /* @__PURE__ */ new Map();
1797
1820
  commandPath;
1798
- constructor(config3, workdir, commandPath) {
1821
+ initTimeoutMs;
1822
+ constructor(config3, workdir, commandPath, initTimeoutMs) {
1799
1823
  this.config = config3;
1800
1824
  this.workdir = workdir;
1801
1825
  this.commandPath = commandPath ?? config3.serverCommand;
1826
+ this.initTimeoutMs = initTimeoutMs ?? DEFAULT_INIT_TIMEOUT_MS;
1802
1827
  }
1803
1828
  // ============================================================================
1804
1829
  // Lifecycle
@@ -1822,10 +1847,23 @@ var LspServer = class {
1822
1847
  windowsHide: true,
1823
1848
  shell: needsShell
1824
1849
  });
1850
+ this.process.on("exit", (code) => {
1851
+ if (this.state === "running" || this.state === "starting") {
1852
+ logger.warn("LSP server exited unexpectedly", {
1853
+ language: this.config.id,
1854
+ code,
1855
+ state: this.state
1856
+ });
1857
+ this.handleProcessExit();
1858
+ }
1859
+ });
1825
1860
  await new Promise((resolve9, reject) => {
1826
1861
  this.process.once("spawn", resolve9);
1827
1862
  this.process.once("error", reject);
1828
1863
  });
1864
+ if (this.state !== "starting") {
1865
+ throw new Error(`LSP server process exited during startup (state: ${this.state})`);
1866
+ }
1829
1867
  if (!this.process.stdin || !this.process.stdout) {
1830
1868
  throw new Error("Failed to get stdio streams from language server process");
1831
1869
  }
@@ -1845,12 +1883,6 @@ var LspServer = class {
1845
1883
  logger.error("LSP server process error", { language: this.config.id, error: err.message });
1846
1884
  this.handleProcessExit();
1847
1885
  });
1848
- this.process.on("exit", (code) => {
1849
- if (this.state === "running") {
1850
- logger.warn("LSP server exited unexpectedly", { language: this.config.id, code });
1851
- this.handleProcessExit();
1852
- }
1853
- });
1854
1886
  this.process.stderr?.on("data", (data) => {
1855
1887
  const msg = data.toString().trim();
1856
1888
  if (msg) {
@@ -1878,7 +1910,11 @@ var LspServer = class {
1878
1910
  },
1879
1911
  initializationOptions: this.config.initOptions
1880
1912
  };
1881
- const result = await this.connection.sendRequest(LSP.initialize, initParams);
1913
+ const result = await withTimeout(
1914
+ this.connection.sendRequest(LSP.initialize, initParams),
1915
+ this.initTimeoutMs,
1916
+ "LSP initialize"
1917
+ );
1882
1918
  logger.debug("LSP server initialized", {
1883
1919
  language: this.config.id,
1884
1920
  capabilities: result
@@ -8045,4 +8081,4 @@ export {
8045
8081
  createServerHandle,
8046
8082
  createServer
8047
8083
  };
8048
- //# sourceMappingURL=chunk-6ZV3NYEE.js.map
8084
+ //# sourceMappingURL=chunk-REQIAJTV.js.map
@@ -0,0 +1,7 @@
1
+ // src/constants.ts
2
+ var VERSION = "2.0.103";
3
+
4
+ export {
5
+ VERSION
6
+ };
7
+ //# sourceMappingURL=chunk-SQYMFWY7.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-QGWS2EBU.js";
4
+ } from "../chunk-JL657X72.js";
5
5
  import "../chunk-XY3LESVZ.js";
6
6
  import {
7
7
  logger
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-QGWS2EBU.js";
4
+ } from "../chunk-JL657X72.js";
5
5
  import "../chunk-XY3LESVZ.js";
6
6
  import {
7
7
  logger
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openfox",
3
- "version": "2.0.102",
3
+ "version": "2.0.103",
4
4
  "description": "Local-LLM-first agentic coding assistant",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createServer
3
- } from "./chunk-6ZV3NYEE.js";
3
+ } from "./chunk-REQIAJTV.js";
4
4
  import "./chunk-K6VVTE6C.js";
5
5
  import "./chunk-62QCBNPE.js";
6
6
  import "./chunk-W5RC44R6.js";
@@ -28,7 +28,7 @@ import "./chunk-W5FTCTGY.js";
28
28
  import "./chunk-WWFH5GAR.js";
29
29
  import {
30
30
  VERSION
31
- } from "./chunk-SV3I2YNO.js";
31
+ } from "./chunk-SQYMFWY7.js";
32
32
  import "./chunk-2EYTYXWN.js";
33
33
  import "./chunk-RZC6DAT2.js";
34
34
  import {
@@ -220,4 +220,4 @@ async function runServe(options) {
220
220
  export {
221
221
  runServe
222
222
  };
223
- //# sourceMappingURL=serve-RKHLNGEV.js.map
223
+ //# sourceMappingURL=serve-FE4UAXGE.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createServer,
3
3
  createServerHandle
4
- } from "../chunk-6ZV3NYEE.js";
4
+ } from "../chunk-REQIAJTV.js";
5
5
  import "../chunk-K6VVTE6C.js";
6
6
  import "../chunk-62QCBNPE.js";
7
7
  import "../chunk-W5RC44R6.js";
@@ -27,7 +27,7 @@ import "../chunk-EU3WWTFH.js";
27
27
  import "../chunk-KKEBXFB3.js";
28
28
  import "../chunk-W5FTCTGY.js";
29
29
  import "../chunk-WWFH5GAR.js";
30
- import "../chunk-SV3I2YNO.js";
30
+ import "../chunk-SQYMFWY7.js";
31
31
  import "../chunk-2EYTYXWN.js";
32
32
  import "../chunk-RZC6DAT2.js";
33
33
  import "../chunk-FQS7A5M4.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  VERSION
3
- } from "./chunk-SV3I2YNO.js";
3
+ } from "./chunk-SQYMFWY7.js";
4
4
  import "./chunk-5WRI5ZAA.js";
5
5
 
6
6
  // src/cli/update.ts
@@ -46,4 +46,4 @@ async function runUpdate(options = {}) {
46
46
  export {
47
47
  runUpdate
48
48
  };
49
- //# sourceMappingURL=update-N4GD5IUX.js.map
49
+ //# sourceMappingURL=update-KMPQUPQT.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openfox",
3
- "version": "2.0.102",
3
+ "version": "2.0.103",
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.102";
3
-
4
- export {
5
- VERSION
6
- };
7
- //# sourceMappingURL=chunk-SV3I2YNO.js.map