openfox 2.0.99 → 2.0.101

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,37 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.0.101 - 2026-07-28
4
+
5
+ ### Features
6
+
7
+ - **Editable step names in workflow editor** — each workflow step now has a customizable Name field instead of being locked to the agent or sub-agent name.
8
+
9
+ ### Enhancements
10
+
11
+ - **First workflow step renamed to "Implement"** — the build step now clearly communicates its purpose instead of the generic "Builder" label.
12
+
13
+ ### Bug Fixes
14
+
15
+ - **Add-criteria command no longer forces planner mode** — launching the command keeps your current agent instead of switching to planner.
16
+ - **Workflow button shows regardless of current agent** — the Build & Verify button appears whenever pending criteria exist, not only in planner mode.
17
+ - **Workflow button only shows for pending criteria** — completed, passed, or failed criteria no longer keep the button visible.
18
+
19
+ ## 2.0.100 - 2026-07-28
20
+
21
+ ### Features
22
+
23
+ - **LSP servers notified on file save** — OpenFox now sends `textDocument/didSave` to language servers after write operations, enabling save-triggered linting and compilation.
24
+
25
+ ### Enhancements
26
+
27
+ - **Rust users see setup hint for rust-analyzer** — if `rust-analyzer` is not installed, OpenFox now suggests `rustup component add rust-analyzer`.
28
+
29
+ ### Bug Fixes
30
+
31
+ - **LSP diagnostics no longer miss late-arriving waves** — rust-analyzer sends clear → own analysis → rustc flycheck in rapid succession. A 400ms debounce now captures all waves instead of only the first.
32
+ - **Pyright LSP diagnostics work correctly** — removed `rootPath` and `workspaceFolders` from initialization parameters, which caused pyright to refuse diagnostics or switch to pull mode.
33
+ - **Stale LSP diagnostics cleared on file reopen** — reopening a file now fetches fresh diagnostics instead of returning cached stale ones.
34
+
3
35
  ## 2.0.99 - 2026-07-27
4
36
 
5
37
  ### Bug Fixes
package/dist/CHANGELOG.md CHANGED
@@ -1,5 +1,37 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.0.101 - 2026-07-28
4
+
5
+ ### Features
6
+
7
+ - **Editable step names in workflow editor** — each workflow step now has a customizable Name field instead of being locked to the agent or sub-agent name.
8
+
9
+ ### Enhancements
10
+
11
+ - **First workflow step renamed to "Implement"** — the build step now clearly communicates its purpose instead of the generic "Builder" label.
12
+
13
+ ### Bug Fixes
14
+
15
+ - **Add-criteria command no longer forces planner mode** — launching the command keeps your current agent instead of switching to planner.
16
+ - **Workflow button shows regardless of current agent** — the Build & Verify button appears whenever pending criteria exist, not only in planner mode.
17
+ - **Workflow button only shows for pending criteria** — completed, passed, or failed criteria no longer keep the button visible.
18
+
19
+ ## 2.0.100 - 2026-07-28
20
+
21
+ ### Features
22
+
23
+ - **LSP servers notified on file save** — OpenFox now sends `textDocument/didSave` to language servers after write operations, enabling save-triggered linting and compilation.
24
+
25
+ ### Enhancements
26
+
27
+ - **Rust users see setup hint for rust-analyzer** — if `rust-analyzer` is not installed, OpenFox now suggests `rustup component add rust-analyzer`.
28
+
29
+ ### Bug Fixes
30
+
31
+ - **LSP diagnostics no longer miss late-arriving waves** — rust-analyzer sends clear → own analysis → rustc flycheck in rapid succession. A 400ms debounce now captures all waves instead of only the first.
32
+ - **Pyright LSP diagnostics work correctly** — removed `rootPath` and `workspaceFolders` from initialization parameters, which caused pyright to refuse diagnostics or switch to pull mode.
33
+ - **Stale LSP diagnostics cleared on file reopen** — reopening a file now fetches fresh diagnostics instead of returning cached stale ones.
34
+
3
35
  ## 2.0.99 - 2026-07-27
4
36
 
5
37
  ### Bug Fixes
@@ -114,7 +114,7 @@ import {
114
114
  } from "./chunk-NLN5LPQ4.js";
115
115
  import {
116
116
  VERSION
117
- } from "./chunk-GNVEAFVU.js";
117
+ } from "./chunk-UCNMVJXD.js";
118
118
  import {
119
119
  clearWorkflowExecution,
120
120
  createSession,
@@ -1708,6 +1708,7 @@ var LSP = {
1708
1708
  didOpen: "textDocument/didOpen",
1709
1709
  didChange: "textDocument/didChange",
1710
1710
  didClose: "textDocument/didClose",
1711
+ didSave: "textDocument/didSave",
1711
1712
  publishDiagnostics: "textDocument/publishDiagnostics",
1712
1713
  definition: "textDocument/definition",
1713
1714
  references: "textDocument/references",
@@ -1780,6 +1781,12 @@ var LspServer = class {
1780
1781
  diagnosticsCallbacks = /* @__PURE__ */ new Set();
1781
1782
  // Pending diagnostic waiters
1782
1783
  pendingDiagnostics = /* @__PURE__ */ new Map();
1784
+ // Debounce timers for diagnostic resolution.
1785
+ // Servers may send multiple publishDiagnostics in quick succession
1786
+ // (e.g., rust-analyzer sends an empty clear, then its own analysis,
1787
+ // then rustc flycheck results). We wait for a quiet period before
1788
+ // resolving the waiter so all waves are captured.
1789
+ pendingDiagnosticDebounce = /* @__PURE__ */ new Map();
1783
1790
  commandPath;
1784
1791
  constructor(config3, workdir, commandPath) {
1785
1792
  this.config = config3;
@@ -1847,7 +1854,6 @@ var LspServer = class {
1847
1854
  const initParams = {
1848
1855
  processId: process.pid,
1849
1856
  rootUri: `file://${this.workdir}`,
1850
- rootPath: this.workdir,
1851
1857
  capabilities: {
1852
1858
  textDocument: {
1853
1859
  publishDiagnostics: {
@@ -1863,7 +1869,6 @@ var LspServer = class {
1863
1869
  workspaceFolders: true
1864
1870
  }
1865
1871
  },
1866
- workspaceFolders: [{ uri: `file://${this.workdir}`, name: "workspace" }],
1867
1872
  initializationOptions: this.config.initOptions
1868
1873
  };
1869
1874
  const result = await this.connection.sendRequest(LSP.initialize, initParams);
@@ -1907,6 +1912,10 @@ var LspServer = class {
1907
1912
  this.process.kill("SIGTERM");
1908
1913
  this.process = null;
1909
1914
  }
1915
+ for (const [, timer] of this.pendingDiagnosticDebounce) {
1916
+ clearTimeout(timer);
1917
+ }
1918
+ this.pendingDiagnosticDebounce.clear();
1910
1919
  this.connection?.dispose();
1911
1920
  this.connection = null;
1912
1921
  this.state = "stopped";
@@ -1924,6 +1933,10 @@ var LspServer = class {
1924
1933
  waiter.resolve([]);
1925
1934
  }
1926
1935
  this.pendingDiagnostics.clear();
1936
+ for (const [, timer] of this.pendingDiagnosticDebounce) {
1937
+ clearTimeout(timer);
1938
+ }
1939
+ this.pendingDiagnosticDebounce.clear();
1927
1940
  }
1928
1941
  // ============================================================================
1929
1942
  // Document Synchronization
@@ -1940,6 +1953,7 @@ var LspServer = class {
1940
1953
  const uri = `file://${path}`;
1941
1954
  const languageId = this.getLanguageIdForFile(path);
1942
1955
  this.openDocuments.set(path, { version: 1, content });
1956
+ this.diagnostics.delete(path);
1943
1957
  await this.connection.sendNotification(LSP.didOpen, {
1944
1958
  textDocument: {
1945
1959
  uri,
@@ -1997,6 +2011,19 @@ var LspServer = class {
1997
2011
  textDocument: { uri }
1998
2012
  });
1999
2013
  }
2014
+ async didSave(path, content) {
2015
+ if (this.state !== "running" || !this.connection) {
2016
+ return;
2017
+ }
2018
+ const uri = `file://${path}`;
2019
+ const params = {
2020
+ textDocument: { uri }
2021
+ };
2022
+ if (content !== void 0) {
2023
+ params["text"] = content;
2024
+ }
2025
+ await this.connection.sendNotification(LSP.didSave, params);
2026
+ }
2000
2027
  // ============================================================================
2001
2028
  // Diagnostics
2002
2029
  // ============================================================================
@@ -2017,12 +2044,20 @@ var LspServer = class {
2017
2044
  for (const callback of this.diagnosticsCallbacks) {
2018
2045
  callback(path, diagnostics);
2019
2046
  }
2047
+ const existingDebounce = this.pendingDiagnosticDebounce.get(path);
2048
+ if (existingDebounce) {
2049
+ clearTimeout(existingDebounce);
2050
+ this.pendingDiagnosticDebounce.delete(path);
2051
+ }
2020
2052
  const waiter = this.pendingDiagnostics.get(path);
2021
- if (waiter) {
2053
+ if (!waiter) return;
2054
+ const debounce = setTimeout(() => {
2055
+ this.pendingDiagnosticDebounce.delete(path);
2022
2056
  clearTimeout(waiter.timeout);
2023
2057
  this.pendingDiagnostics.delete(path);
2024
- waiter.resolve(diagnostics);
2025
- }
2058
+ waiter.resolve(this.diagnostics.get(path) ?? []);
2059
+ }, 400);
2060
+ this.pendingDiagnosticDebounce.set(path, debounce);
2026
2061
  }
2027
2062
  /**
2028
2063
  * Get diagnostics for a file, waiting for LSP to respond if needed
@@ -7912,4 +7947,4 @@ export {
7912
7947
  createServerHandle,
7913
7948
  createServer
7914
7949
  };
7915
- //# sourceMappingURL=chunk-SXG6JIH5.js.map
7950
+ //# sourceMappingURL=chunk-7GBFQ2PE.js.map
@@ -200,7 +200,7 @@ async function runCli(options) {
200
200
  break;
201
201
  }
202
202
  case "update": {
203
- const { runUpdate } = await import("./update-YMMOOFJA.js");
203
+ const { runUpdate } = await import("./update-GHS75L7T.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-2XOSUJ6N.js");
216
+ const { runServe } = await import("./serve-KM2RVX2U.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-T67AK4BF.js.map
228
+ //# sourceMappingURL=chunk-MBYXZ5V5.js.map
@@ -0,0 +1,7 @@
1
+ // src/constants.ts
2
+ var VERSION = "2.0.101";
3
+
4
+ export {
5
+ VERSION
6
+ };
7
+ //# sourceMappingURL=chunk-UCNMVJXD.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-T67AK4BF.js";
4
+ } from "../chunk-MBYXZ5V5.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-T67AK4BF.js";
4
+ } from "../chunk-MBYXZ5V5.js";
5
5
  import "../chunk-XY3LESVZ.js";
6
6
  import {
7
7
  logger
@@ -1,7 +1,6 @@
1
1
  ---
2
2
  id: add-criteria
3
3
  name: Add criteria
4
- agentMode: planner
5
4
  ---
6
5
 
7
6
  Add the acceptance criteria you proposed using the `session_metadata` tool with the `criteria` key
@@ -29,7 +29,8 @@
29
29
  "extensions": [".rs"],
30
30
  "serverCommand": "rust-analyzer",
31
31
  "serverArgs": [],
32
- "rootPatterns": ["Cargo.toml"]
32
+ "rootPatterns": ["Cargo.toml"],
33
+ "installHint": "rustup component add rust-analyzer"
33
34
  },
34
35
  {
35
36
  "id": "go",
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openfox",
3
- "version": "2.0.99",
3
+ "version": "2.0.101",
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-SXG6JIH5.js";
3
+ } from "./chunk-7GBFQ2PE.js";
4
4
  import "./chunk-C6QW2IDH.js";
5
5
  import "./chunk-62QCBNPE.js";
6
6
  import "./chunk-E2CSSHSI.js";
@@ -27,7 +27,7 @@ import "./chunk-KNYPBXPW.js";
27
27
  import "./chunk-NLN5LPQ4.js";
28
28
  import {
29
29
  VERSION
30
- } from "./chunk-GNVEAFVU.js";
30
+ } from "./chunk-UCNMVJXD.js";
31
31
  import "./chunk-O2PLNJIU.js";
32
32
  import "./chunk-ZIMGU5ZH.js";
33
33
  import {
@@ -219,4 +219,4 @@ async function runServe(options) {
219
219
  export {
220
220
  runServe
221
221
  };
222
- //# sourceMappingURL=serve-2XOSUJ6N.js.map
222
+ //# sourceMappingURL=serve-KM2RVX2U.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createServer,
3
3
  createServerHandle
4
- } from "../chunk-SXG6JIH5.js";
4
+ } from "../chunk-7GBFQ2PE.js";
5
5
  import "../chunk-C6QW2IDH.js";
6
6
  import "../chunk-62QCBNPE.js";
7
7
  import "../chunk-E2CSSHSI.js";
@@ -26,7 +26,7 @@ import "../chunk-AY37NB76.js";
26
26
  import "../chunk-MRWR3SIT.js";
27
27
  import "../chunk-KNYPBXPW.js";
28
28
  import "../chunk-NLN5LPQ4.js";
29
- import "../chunk-GNVEAFVU.js";
29
+ import "../chunk-UCNMVJXD.js";
30
30
  import "../chunk-O2PLNJIU.js";
31
31
  import "../chunk-ZIMGU5ZH.js";
32
32
  import "../chunk-3LRYZ7R3.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  VERSION
3
- } from "./chunk-GNVEAFVU.js";
3
+ } from "./chunk-UCNMVJXD.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-YMMOOFJA.js.map
49
+ //# sourceMappingURL=update-GHS75L7T.js.map