openfox 2.0.132 → 2.0.133

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,24 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.0.133 - 2026-08-30
4
+
5
+ ### Features
6
+
7
+ - **Edit providers straight from model selectors** — a pencil button on each provider group header opens the editor without digging through settings
8
+ - **Sub-agents can load skills** — explorer, verifier, and code reviewer now use the load_skill tool
9
+
10
+ ### Enhancements
11
+
12
+ - **Smoother workflow completion nudge** — when a step's transition condition is already satisfied, the agent gets a short "call step_done" reminder instead of the verbose prompt
13
+ - **Faster settings and config loading** — shared caching dedupes and single-flights resource requests
14
+
15
+ ### Bug Fixes
16
+
17
+ - **Stale blocked-workflow message cleared** — starting a plain chat turn no longer leaves a "retry to continue" step message behind
18
+ - **Workflow template-variable suggestions load again** — the editor no longer hits a 404
19
+ - **Duplicate and Customize creates a real copy** — no longer overwrites the original command
20
+ - **No more 401s on the login page** — settings requests no longer fire before sign-in
21
+
3
22
  ## 2.0.132 - 2026-08-28
4
23
 
5
24
  ### Enhancements
package/dist/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.0.133 - 2026-08-30
4
+
5
+ ### Features
6
+
7
+ - **Edit providers straight from model selectors** — a pencil button on each provider group header opens the editor without digging through settings
8
+ - **Sub-agents can load skills** — explorer, verifier, and code reviewer now use the load_skill tool
9
+
10
+ ### Enhancements
11
+
12
+ - **Smoother workflow completion nudge** — when a step's transition condition is already satisfied, the agent gets a short "call step_done" reminder instead of the verbose prompt
13
+ - **Faster settings and config loading** — shared caching dedupes and single-flights resource requests
14
+
15
+ ### Bug Fixes
16
+
17
+ - **Stale blocked-workflow message cleared** — starting a plain chat turn no longer leaves a "retry to continue" step message behind
18
+ - **Workflow template-variable suggestions load again** — the editor no longer hits a 404
19
+ - **Duplicate and Customize creates a real copy** — no longer overwrites the original command
20
+ - **No more 401s on the login page** — settings requests no longer fire before sign-in
21
+
3
22
  ## 2.0.132 - 2026-08-28
4
23
 
5
24
  ### Enhancements
@@ -9,6 +9,7 @@ allowedTools:
9
9
  - run_command
10
10
  - web_fetch
11
11
  - session_metadata
12
+ - load_skill
12
13
  ---
13
14
 
14
15
  You are a code reviewer. Review the **git diff** of the modified files rather than reading the full files.
@@ -8,6 +8,7 @@ allowedTools:
8
8
  - read_file
9
9
  - run_command
10
10
  - web_fetch
11
+ - load_skill
11
12
  ---
12
13
 
13
14
  You are a codebase exploration expert.
@@ -9,6 +9,7 @@ allowedTools:
9
9
  - run_command
10
10
  - session_metadata
11
11
  - web_fetch
12
+ - load_skill
12
13
  ---
13
14
 
14
15
  You are a code reviewer performing independent verification.
@@ -5,7 +5,7 @@ import {
5
5
  } from "./chunk-RRUSYVQD.js";
6
6
  import {
7
7
  launchWorkflowRun
8
- } from "./chunk-GVOOOV7M.js";
8
+ } from "./chunk-P5MSY7ZI.js";
9
9
  import {
10
10
  runChatTurn
11
11
  } from "./chunk-GFW2HWJ6.js";
@@ -1642,4 +1642,4 @@ export {
1642
1642
  signalMcpReady,
1643
1643
  createWebSocketServer
1644
1644
  };
1645
- //# sourceMappingURL=chunk-RUFXKUOL.js.map
1645
+ //# sourceMappingURL=chunk-A7CB4USC.js.map
@@ -0,0 +1,7 @@
1
+ // src/constants.ts
2
+ var VERSION = "2.0.133";
3
+
4
+ export {
5
+ VERSION
6
+ };
7
+ //# sourceMappingURL=chunk-JKGHTBEV.js.map
@@ -210,7 +210,7 @@ async function runCli(options) {
210
210
  break;
211
211
  }
212
212
  case "update": {
213
- const { runUpdate } = await import("./update-VPCDKFLD.js");
213
+ const { runUpdate } = await import("./update-VC3Y3EOP.js");
214
214
  const code = await runUpdate();
215
215
  if (code !== 0) {
216
216
  process.exit(code);
@@ -223,7 +223,7 @@ async function runCli(options) {
223
223
  if (!configExists) {
224
224
  await runNetworkSetup(mode);
225
225
  }
226
- const { runServe } = await import("./serve-BFGHUM4Y.js");
226
+ const { runServe } = await import("./serve-XRVT3D7Z.js");
227
227
  const serveOptions = { mode };
228
228
  if (values.port) serveOptions.port = parseInt(values.port);
229
229
  if (values["no-browser"] === true) serveOptions.openBrowser = false;
@@ -235,4 +235,4 @@ async function runCli(options) {
235
235
  export {
236
236
  runCli
237
237
  };
238
- //# sourceMappingURL=chunk-EOHEDEIH.js.map
238
+ //# sourceMappingURL=chunk-OMMPTN6X.js.map
@@ -24,10 +24,10 @@ import {
24
24
  terminalManager,
25
25
  tokenFromPassword,
26
26
  verifyPassword
27
- } from "./chunk-RUFXKUOL.js";
27
+ } from "./chunk-A7CB4USC.js";
28
28
  import {
29
29
  TEMPLATE_VARIABLES
30
- } from "./chunk-GVOOOV7M.js";
30
+ } from "./chunk-P5MSY7ZI.js";
31
31
  import {
32
32
  createToolRegistry,
33
33
  devServerManager,
@@ -215,7 +215,7 @@ import {
215
215
  } from "./chunk-YNMP647F.js";
216
216
  import {
217
217
  VERSION
218
- } from "./chunk-55RHB5JB.js";
218
+ } from "./chunk-JKGHTBEV.js";
219
219
  import {
220
220
  deleteProject,
221
221
  getProject,
@@ -1135,6 +1135,12 @@ function getPromptAwareToolResponse(prompt) {
1135
1135
  function getConversationAwareToolResponse(request) {
1136
1136
  const prompt = getLastUserPrompt(request);
1137
1137
  const conversationText = getConversationText(request);
1138
+ if (/If you have finished the task, call step_done\(\)/i.test(prompt)) {
1139
+ return {
1140
+ tools: [{ name: "step_done", arguments: {} }],
1141
+ response: "Finished the step."
1142
+ };
1143
+ }
1138
1144
  if (/Implement the task and make sure you fulfil the \d+ criteria\./i.test(prompt) || /Continue working on the acceptance criteria\./i.test(prompt)) {
1139
1145
  const tools = [];
1140
1146
  const completedCriteria = [];
@@ -4418,6 +4424,7 @@ function createCrudRoutes(config3, configDir, projectDir) {
4418
4424
  const ids = config3.getDefaultIds ? await config3.getDefaultIds() : [];
4419
4425
  res.json({ ids });
4420
4426
  });
4427
+ config3.extraRoutes?.(router);
4421
4428
  router.get("/:id", async (req, res) => {
4422
4429
  const { id } = req.params;
4423
4430
  const effectiveProjectDir = resolveProjectDir(req, projectDir);
@@ -4512,7 +4519,6 @@ function createCrudRoutes(config3, configDir, projectDir) {
4512
4519
  }
4513
4520
  res.status(201).json(duplicated);
4514
4521
  });
4515
- config3.extraRoutes?.(router);
4516
4522
  return router;
4517
4523
  }
4518
4524
 
@@ -6911,7 +6917,7 @@ async function createServerHandle(config3) {
6911
6917
  toolRegistry = createToolRegistry();
6912
6918
  logger.info("MCP tools registered", { count: mcpTools.length });
6913
6919
  }
6914
- const { signalMcpReady } = await import("./server-WPWUYB6I.js");
6920
+ const { signalMcpReady } = await import("./server-GXMZMPXI.js");
6915
6921
  signalMcpReady();
6916
6922
  });
6917
6923
  const app = express();
@@ -9412,7 +9418,7 @@ All file and git operations should use this branch.
9412
9418
  );
9413
9419
  const wss = wssExports.wss;
9414
9420
  deferTasksBroadcast = (projectId, payload) => wssExports.broadcastForProject(projectId, "", { type: "tasks.update", payload });
9415
- const { launchWorkflowRun, abortRunnerRun } = await import("./launch-6I5ADTVT.js");
9421
+ const { launchWorkflowRun, abortRunnerRun } = await import("./launch-UKXVO37B.js");
9416
9422
  deferTasksLaunchWorkflow = (sessionId, launch) => {
9417
9423
  const effective = sessionManager.resolveEffectiveProviderModel(sessionId);
9418
9424
  let llmClient = getLLMClient();
@@ -9457,7 +9463,7 @@ All file and git operations should use this branch.
9457
9463
  const state = sessionManager.getContextState(sessionId);
9458
9464
  wssExports.broadcastForSession(sessionId, createContextStateMessage(state));
9459
9465
  });
9460
- const { QueueProcessor } = await import("./processor-FMEULCNQ.js");
9466
+ const { QueueProcessor } = await import("./processor-V35OLKRV.js");
9461
9467
  const queueProcessor = new QueueProcessor({
9462
9468
  sessionManager,
9463
9469
  providerManager,
@@ -9621,4 +9627,4 @@ export {
9621
9627
  createServerHandle,
9622
9628
  createServer
9623
9629
  };
9624
- //# sourceMappingURL=chunk-ZSBNXJZ5.js.map
9630
+ //# sourceMappingURL=chunk-OUQZZEIQ.js.map
@@ -274,6 +274,21 @@ function findMatchingTransition(transitions, stepOutcome, metadataEntries) {
274
274
  }
275
275
  return null;
276
276
  }
277
+ var STEP_DONE_NUDGE = "You haven't called step_done(). If you haven't finished the task, continue and when you're finished call step_done()";
278
+ var STEP_DONE_REMINDER = "If you have finished the task, call step_done()";
279
+ function isStepTransitionSatisfied(transitions, metadataEntries, currentStepId) {
280
+ const fired = findMatchingTransition(transitions, null, metadataEntries);
281
+ return fired !== null && fired.goto !== currentStepId;
282
+ }
283
+ function buildAgentNudge(nudgePrompt, templateCtx, transitions, metadataEntries, currentStepId) {
284
+ const transitionSatisfied = isStepTransitionSatisfied(transitions, metadataEntries, currentStepId);
285
+ const parts = [];
286
+ if (nudgePrompt && !transitionSatisfied) {
287
+ parts.push(resolveTemplate(nudgePrompt, templateCtx));
288
+ }
289
+ parts.push(transitionSatisfied ? STEP_DONE_REMINDER : STEP_DONE_NUDGE);
290
+ return parts.join("\n\n");
291
+ }
277
292
  var DEFAULT_USER_RESULT = "continue";
278
293
  var CONTINUE_CHOICE_ID = "continue";
279
294
  function userStepChoices(step) {
@@ -499,7 +514,6 @@ async function executeWorkflow(workflow, options, subGroup) {
499
514
  case "agent": {
500
515
  const agentStep = step;
501
516
  const STEP_DONE_PROMPT = "\n\nOnce you're done, call step_done()";
502
- const STEP_DONE_NUDGE = "You haven't called step_done(). If you haven't finished the task, continue and when you're finished call step_done()";
503
517
  const isResumingCurrentStep = isResume && step.id === resumeFromStep && !resumeConsumed;
504
518
  let promptContent;
505
519
  let nudgeContent;
@@ -532,13 +546,13 @@ async function executeWorkflow(workflow, options, subGroup) {
532
546
  );
533
547
  }
534
548
  } else if (firstEntryForStep.has(step.id) && !isResumingCurrentStep) {
535
- const parts = [];
536
- if (agentStep.nudgePrompt) {
537
- const resolvedNudge = resolveTemplate(agentStep.nudgePrompt, templateCtx);
538
- parts.push(resolvedNudge);
539
- }
540
- parts.push(STEP_DONE_NUDGE);
541
- nudgeContent = parts.join("\n\n");
549
+ nudgeContent = buildAgentNudge(
550
+ agentStep.nudgePrompt,
551
+ templateCtx,
552
+ step.transitions,
553
+ session.metadataEntries,
554
+ step.id
555
+ );
542
556
  emitWorkflowMessage(eventStore, sessionId, nudgeContent, currentWindowMessageOptions, onMessage);
543
557
  }
544
558
  const blockOnLLMFailure = (errorMessage) => {
@@ -1002,4 +1016,4 @@ export {
1002
1016
  abortRunnerRun,
1003
1017
  launchWorkflowRun
1004
1018
  };
1005
- //# sourceMappingURL=chunk-GVOOOV7M.js.map
1019
+ //# sourceMappingURL=chunk-P5MSY7ZI.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-EOHEDEIH.js";
4
+ } from "../chunk-OMMPTN6X.js";
5
5
  import "../chunk-AGXJ5O63.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-EOHEDEIH.js";
4
+ } from "../chunk-OMMPTN6X.js";
5
5
  import "../chunk-AGXJ5O63.js";
6
6
  import {
7
7
  logger
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  abortRunnerRun,
3
3
  launchWorkflowRun
4
- } from "./chunk-GVOOOV7M.js";
4
+ } from "./chunk-P5MSY7ZI.js";
5
5
  import "./chunk-GFW2HWJ6.js";
6
6
  import "./chunk-HXHPKGJE.js";
7
7
  import "./chunk-XE6UC5Z3.js";
@@ -50,4 +50,4 @@ export {
50
50
  abortRunnerRun,
51
51
  launchWorkflowRun
52
52
  };
53
- //# sourceMappingURL=launch-6I5ADTVT.js.map
53
+ //# sourceMappingURL=launch-UKXVO37B.js.map
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openfox",
3
- "version": "2.0.132",
3
+ "version": "2.0.133",
4
4
  "description": "Local-LLM-first agentic coding assistant",
5
5
  "type": "module",
6
6
  "bin": {
@@ -132,6 +132,21 @@ var QueueProcessor = class {
132
132
  logger.warn("Cannot start turn: queue is empty", { sessionId });
133
133
  return;
134
134
  }
135
+ const latestExec = sessionManager.getLatestWorkflowExecution(sessionId);
136
+ if (latestExec && latestExec.status === "blocked") {
137
+ logger.info("Cancelling blocked workflow execution before chat turn", {
138
+ sessionId,
139
+ executionId: latestExec.id,
140
+ step: latestExec.currentStepId
141
+ });
142
+ sessionManager.cancelWorkflow(
143
+ sessionId,
144
+ latestExec.id,
145
+ latestExec.workflowId,
146
+ latestExec.workflowName,
147
+ latestExec.workflowColor
148
+ );
149
+ }
135
150
  const controller = new AbortController();
136
151
  this.activeAgents.set(sessionId, controller);
137
152
  sessionManager.setRunning(sessionId, true);
@@ -256,4 +271,4 @@ var QueueProcessor = class {
256
271
  export {
257
272
  QueueProcessor
258
273
  };
259
- //# sourceMappingURL=processor-FMEULCNQ.js.map
274
+ //# sourceMappingURL=processor-V35OLKRV.js.map
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  createServer
3
- } from "./chunk-ZSBNXJZ5.js";
3
+ } from "./chunk-OUQZZEIQ.js";
4
4
  import "./chunk-T3S5MTMD.js";
5
5
  import "./chunk-WLJJRX22.js";
6
6
  import "./chunk-DQTN4B33.js";
7
7
  import "./chunk-IJ53Y77N.js";
8
- import "./chunk-RUFXKUOL.js";
8
+ import "./chunk-A7CB4USC.js";
9
9
  import "./chunk-RRUSYVQD.js";
10
- import "./chunk-GVOOOV7M.js";
10
+ import "./chunk-P5MSY7ZI.js";
11
11
  import "./chunk-GFW2HWJ6.js";
12
12
  import "./chunk-HXHPKGJE.js";
13
13
  import "./chunk-XE6UC5Z3.js";
@@ -42,7 +42,7 @@ import "./chunk-J2GP3J3X.js";
42
42
  import "./chunk-YNMP647F.js";
43
43
  import {
44
44
  VERSION
45
- } from "./chunk-55RHB5JB.js";
45
+ } from "./chunk-JKGHTBEV.js";
46
46
  import "./chunk-DPFET73G.js";
47
47
  import "./chunk-CLDCHOEA.js";
48
48
  import "./chunk-TS5WKTFB.js";
@@ -229,4 +229,4 @@ async function runServe(options) {
229
229
  export {
230
230
  runServe
231
231
  };
232
- //# sourceMappingURL=serve-BFGHUM4Y.js.map
232
+ //# sourceMappingURL=serve-XRVT3D7Z.js.map
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  createServer,
3
3
  createServerHandle
4
- } from "../chunk-ZSBNXJZ5.js";
4
+ } from "../chunk-OUQZZEIQ.js";
5
5
  import "../chunk-T3S5MTMD.js";
6
6
  import "../chunk-WLJJRX22.js";
7
7
  import "../chunk-DQTN4B33.js";
8
8
  import "../chunk-IJ53Y77N.js";
9
- import "../chunk-RUFXKUOL.js";
9
+ import "../chunk-A7CB4USC.js";
10
10
  import "../chunk-RRUSYVQD.js";
11
- import "../chunk-GVOOOV7M.js";
11
+ import "../chunk-P5MSY7ZI.js";
12
12
  import "../chunk-GFW2HWJ6.js";
13
13
  import "../chunk-HXHPKGJE.js";
14
14
  import "../chunk-XE6UC5Z3.js";
@@ -39,7 +39,7 @@ import "../chunk-5JWJEZJ3.js";
39
39
  import "../chunk-OA2FURC3.js";
40
40
  import "../chunk-J2GP3J3X.js";
41
41
  import "../chunk-YNMP647F.js";
42
- import "../chunk-55RHB5JB.js";
42
+ import "../chunk-JKGHTBEV.js";
43
43
  import "../chunk-DPFET73G.js";
44
44
  import "../chunk-CLDCHOEA.js";
45
45
  import "../chunk-TS5WKTFB.js";
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  createWebSocketServer,
3
3
  signalMcpReady
4
- } from "./chunk-RUFXKUOL.js";
4
+ } from "./chunk-A7CB4USC.js";
5
5
  import "./chunk-RRUSYVQD.js";
6
- import "./chunk-GVOOOV7M.js";
6
+ import "./chunk-P5MSY7ZI.js";
7
7
  import "./chunk-GFW2HWJ6.js";
8
8
  import "./chunk-HXHPKGJE.js";
9
9
  import "./chunk-XE6UC5Z3.js";
@@ -53,4 +53,4 @@ export {
53
53
  createWebSocketServer,
54
54
  signalMcpReady
55
55
  };
56
- //# sourceMappingURL=server-WPWUYB6I.js.map
56
+ //# sourceMappingURL=server-GXMZMPXI.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  VERSION
3
- } from "./chunk-55RHB5JB.js";
3
+ } from "./chunk-JKGHTBEV.js";
4
4
  import "./chunk-YLJ4XMA6.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-VPCDKFLD.js.map
49
+ //# sourceMappingURL=update-VC3Y3EOP.js.map