openfox 2.0.125 → 2.0.127

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 (33) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/CHANGELOG.md +20 -0
  3. package/dist/{chat-handler-HJ2RBGNV.js → chat-handler-63VGKLM5.js} +5 -5
  4. package/dist/{chunk-7DO4JMGT.js → chunk-7CBVJAN5.js} +3 -3
  5. package/dist/{chunk-NBOSTFTS.js → chunk-FGK6KPJ5.js} +3 -3
  6. package/dist/{chunk-KETVPTMI.js → chunk-GKDJW4VP.js} +3 -3
  7. package/dist/{chunk-WMAW37GV.js → chunk-IE2OMJIH.js} +6 -6
  8. package/dist/{chunk-O5A3XKE5.js → chunk-IQYI7TWF.js} +22 -15
  9. package/dist/chunk-QDO3BEGW.js +7 -0
  10. package/dist/{chunk-KSXCOHHW.js → chunk-R5FAEKXQ.js} +16 -1
  11. package/dist/{chunk-X2J6BAU7.js → chunk-TY3ONJE4.js} +7 -7
  12. package/dist/{chunk-T2RDFRNK.js → chunk-TZJU6F6Z.js} +75 -42
  13. package/dist/cli/dev.js +1 -1
  14. package/dist/cli/index.js +1 -1
  15. package/dist/{config-TUCHLIWD.js → config-LOK3LXFH.js} +4 -2
  16. package/dist/{dynamic-context-5MQWJTJC.js → dynamic-context-KXZ6VJDE.js} +2 -2
  17. package/dist/{launch-ZHAFPRCP.js → launch-DYWJD6L5.js} +6 -6
  18. package/dist/{orchestrator-KKUXIE3Q.js → orchestrator-LBQWRAXC.js} +5 -5
  19. package/dist/package.json +1 -1
  20. package/dist/{processor-HETUXJFH.js → processor-WP2LQOEV.js} +4 -4
  21. package/dist/{provider-6LUA73HF.js → provider-726LD2KU.js} +3 -3
  22. package/dist/{serve-UVHJHYF3.js → serve-OY3Y5PXK.js} +9 -9
  23. package/dist/server/index.js +8 -8
  24. package/dist/{server-E4DOH4OF.js → server-DMHNVEW4.js} +7 -7
  25. package/dist/{tools-AUHL5MPG.js → tools-CZHV2FAD.js} +3 -3
  26. package/dist/{update-45ZRDWUB.js → update-RCNZQCFG.js} +2 -2
  27. package/dist/web/assets/index-B63UkA7X.js +310 -0
  28. package/dist/web/assets/{index-DFMllFkv.css → index-CbX8veVW.css} +1 -1
  29. package/dist/web/index.html +2 -2
  30. package/dist/web/sw.js +1 -1
  31. package/package.json +1 -1
  32. package/dist/chunk-GZUD5E6E.js +0 -7
  33. package/dist/web/assets/index-DQ3Wg2OF.js +0 -324
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.0.127 - 2026-08-22
4
+
5
+ ### Features
6
+
7
+ - **Reorder providers with drag & drop or arrows** — Manage Providers list gains drag handles and arrows
8
+ - **Workspace switch reminders include a commit recipe** — the exact git commands to commit and push
9
+
10
+ ### Enhancements
11
+
12
+ - **Chat feed keeps a minimum width** — sidebars collapse left-first on narrow windows
13
+ - **Manage providers opens in a modal** — no longer buried in the onboarding wizard
14
+ - **Starring a model selects it** — the model picker now selects a starred model for the session
15
+
16
+ ## 2.0.126 - 2026-08-21
17
+
18
+ ### Bug Fixes
19
+
20
+ - **Numeric criterion ids are no longer rejected** — session_metadata now accepts number-form ids (e.g. 0) for add, update, and remove, so agents can mark criteria complete reliably
21
+ - **Auto-generated metadata ids start at 1** — criteria, todos, and review findings now get sequential ids from 1 instead of 0
22
+
3
23
  ## 2.0.125 - 2026-08-21
4
24
 
5
25
  ### Features
package/dist/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.0.127 - 2026-08-22
4
+
5
+ ### Features
6
+
7
+ - **Reorder providers with drag & drop or arrows** — Manage Providers list gains drag handles and arrows
8
+ - **Workspace switch reminders include a commit recipe** — the exact git commands to commit and push
9
+
10
+ ### Enhancements
11
+
12
+ - **Chat feed keeps a minimum width** — sidebars collapse left-first on narrow windows
13
+ - **Manage providers opens in a modal** — no longer buried in the onboarding wizard
14
+ - **Starring a model selects it** — the model picker now selects a starred model for the session
15
+
16
+ ## 2.0.126 - 2026-08-21
17
+
18
+ ### Bug Fixes
19
+
20
+ - **Numeric criterion ids are no longer rejected** — session_metadata now accepts number-form ids (e.g. 0) for add, update, and remove, so agents can mark criteria complete reliably
21
+ - **Auto-generated metadata ids start at 1** — criteria, todos, and review findings now get sequential ids from 1 instead of 0
22
+
3
23
  ## 2.0.125 - 2026-08-21
4
24
 
5
25
  ### Features
@@ -5,9 +5,9 @@ import {
5
5
  } from "./chunk-HOSFRPPI.js";
6
6
  import {
7
7
  runChatTurn
8
- } from "./chunk-NBOSTFTS.js";
9
- import "./chunk-O5A3XKE5.js";
10
- import "./chunk-KETVPTMI.js";
8
+ } from "./chunk-FGK6KPJ5.js";
9
+ import "./chunk-IQYI7TWF.js";
10
+ import "./chunk-GKDJW4VP.js";
11
11
  import "./chunk-ZIL6VKLU.js";
12
12
  import "./chunk-LJX7KXRU.js";
13
13
  import "./chunk-GIJUWPRQ.js";
@@ -51,7 +51,7 @@ import "./chunk-OYBUJIC3.js";
51
51
  import "./chunk-ISE55FOR.js";
52
52
  import "./chunk-K44MW7JJ.js";
53
53
  import "./chunk-KSDWQ6IZ.js";
54
- import "./chunk-KSXCOHHW.js";
54
+ import "./chunk-R5FAEKXQ.js";
55
55
  import "./chunk-CQGTEGKL.js";
56
56
  import "./chunk-YLJ4XMA6.js";
57
57
 
@@ -174,4 +174,4 @@ export {
174
174
  startChatSession,
175
175
  stopSessionExecution
176
176
  };
177
- //# sourceMappingURL=chat-handler-HJ2RBGNV.js.map
177
+ //# sourceMappingURL=chat-handler-63VGKLM5.js.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  runAgentTurn
3
- } from "./chunk-NBOSTFTS.js";
3
+ } from "./chunk-FGK6KPJ5.js";
4
4
  import {
5
5
  executeSubAgent,
6
6
  getToolRegistryForAgent
7
- } from "./chunk-O5A3XKE5.js";
7
+ } from "./chunk-IQYI7TWF.js";
8
8
  import {
9
9
  TurnMetrics,
10
10
  createMessageStartEvent
@@ -1002,4 +1002,4 @@ export {
1002
1002
  abortRunnerRun,
1003
1003
  launchWorkflowRun
1004
1004
  };
1005
- //# sourceMappingURL=chunk-7DO4JMGT.js.map
1005
+ //# sourceMappingURL=chunk-7CBVJAN5.js.map
@@ -4,12 +4,12 @@ import {
4
4
  getToolRegistryForAgent,
5
5
  processEventsForConversation,
6
6
  runTopLevelAgentLoop
7
- } from "./chunk-O5A3XKE5.js";
7
+ } from "./chunk-IQYI7TWF.js";
8
8
  import {
9
9
  buildCachedPrompt,
10
10
  computeDynamicContextHash,
11
11
  getToolFingerprint
12
- } from "./chunk-KETVPTMI.js";
12
+ } from "./chunk-GKDJW4VP.js";
13
13
  import {
14
14
  getAllInstructions,
15
15
  getEnabledSkillMetadata
@@ -329,4 +329,4 @@ export {
329
329
  runChatTurn,
330
330
  runAgentTurn
331
331
  };
332
- //# sourceMappingURL=chunk-NBOSTFTS.js.map
332
+ //# sourceMappingURL=chunk-FGK6KPJ5.js.map
@@ -105,7 +105,7 @@ function resolveAgentDef(sessionManager, sessionId) {
105
105
  }
106
106
  async function buildCachedPrompt(sessionManager, sessionId, agentDef, modelName) {
107
107
  const { instructionContent, skills } = await loadSessionContext(sessionManager, sessionId);
108
- const { getToolRegistryForAgent } = await import("./tools-AUHL5MPG.js");
108
+ const { getToolRegistryForAgent } = await import("./tools-CZHV2FAD.js");
109
109
  const tools = getToolRegistryForAgent(agentDef, sessionId).definitions;
110
110
  const toolFingerprint = getToolFingerprint(tools);
111
111
  const allAgents = await loadAllAgentsDefault(sessionManager.getProjectWorkdir(sessionId));
@@ -124,7 +124,7 @@ async function buildCachedPrompt(sessionManager, sessionId, agentDef, modelName)
124
124
  async function computeSessionHash(sessionManager, sessionId, modelName) {
125
125
  const { instructionContent, skills } = await loadSessionContext(sessionManager, sessionId);
126
126
  const agentDef = await resolveAgentDef(sessionManager, sessionId);
127
- const { getToolRegistryForAgent } = await import("./tools-AUHL5MPG.js");
127
+ const { getToolRegistryForAgent } = await import("./tools-CZHV2FAD.js");
128
128
  const tools = getToolRegistryForAgent(agentDef, sessionId).definitions;
129
129
  const toolFingerprint = getToolFingerprint(tools);
130
130
  return computeDynamicContextHash(instructionContent, skills, toolFingerprint, modelName);
@@ -148,4 +148,4 @@ export {
148
148
  computeSessionHash,
149
149
  applyDynamicContext
150
150
  };
151
- //# sourceMappingURL=chunk-KETVPTMI.js.map
151
+ //# sourceMappingURL=chunk-GKDJW4VP.js.map
@@ -5,18 +5,18 @@ import {
5
5
  } from "./chunk-HOSFRPPI.js";
6
6
  import {
7
7
  launchWorkflowRun
8
- } from "./chunk-7DO4JMGT.js";
8
+ } from "./chunk-7CBVJAN5.js";
9
9
  import {
10
10
  runChatTurn
11
- } from "./chunk-NBOSTFTS.js";
11
+ } from "./chunk-FGK6KPJ5.js";
12
12
  import {
13
13
  devServerManager
14
- } from "./chunk-O5A3XKE5.js";
14
+ } from "./chunk-IQYI7TWF.js";
15
15
  import {
16
16
  applyDynamicContext,
17
17
  computeSessionHash,
18
18
  computeUnifiedDiff
19
- } from "./chunk-KETVPTMI.js";
19
+ } from "./chunk-GKDJW4VP.js";
20
20
  import {
21
21
  appendCompactionPrompt
22
22
  } from "./chunk-UAAFZEIS.js";
@@ -1299,7 +1299,7 @@ async function handleClientMessage(ws, client, message, _getLLMClient, _getActiv
1299
1299
  }
1300
1300
  const session = sessionManager.requireSession(sessionId);
1301
1301
  try {
1302
- const { buildCachedPrompt } = await import("./dynamic-context-5MQWJTJC.js");
1302
+ const { buildCachedPrompt } = await import("./dynamic-context-KXZ6VJDE.js");
1303
1303
  const allAgents = await import("./registry-Z4GVYFTV.js");
1304
1304
  const agentDef = allAgents.findAgentById(session.mode, await allAgents.loadAllAgentsDefault()) ?? allAgents.findAgentById("planner", await allAgents.loadAllAgentsDefault());
1305
1305
  const modelName = session.providerModel ?? _providerManager?.getCurrentModel();
@@ -1624,4 +1624,4 @@ export {
1624
1624
  signalMcpReady,
1625
1625
  createWebSocketServer
1626
1626
  };
1627
- //# sourceMappingURL=chunk-WMAW37GV.js.map
1627
+ //# sourceMappingURL=chunk-IE2OMJIH.js.map
@@ -132,7 +132,7 @@ import {
132
132
  import {
133
133
  loadGlobalConfig,
134
134
  saveGlobalConfig
135
- } from "./chunk-KSXCOHHW.js";
135
+ } from "./chunk-R5FAEKXQ.js";
136
136
  import {
137
137
  getGlobalConfigDir
138
138
  } from "./chunk-CQGTEGKL.js";
@@ -1381,7 +1381,7 @@ var SCHEMAS = {
1381
1381
  criteria: {
1382
1382
  description: "Acceptance criteria that drive workflow transitions",
1383
1383
  fields: {
1384
- id: "string (auto-generated)",
1384
+ id: "string (auto-generated; numeric ids accepted and normalized)",
1385
1385
  description: "string \u2014 what needs to be done and how to verify it",
1386
1386
  status: "pending | completed | passed | failed"
1387
1387
  }
@@ -1404,9 +1404,14 @@ var SCHEMAS = {
1404
1404
  }
1405
1405
  }
1406
1406
  };
1407
+ function normalizeId(id) {
1408
+ if (typeof id !== "string" && typeof id !== "number") return void 0;
1409
+ if (id === "") return void 0;
1410
+ return String(id);
1411
+ }
1407
1412
  function requireKeyAndId(args, helpers, entries) {
1408
1413
  if (!args.key) return helpers.error("Missing required field: key");
1409
- if (!args.id) return helpers.error("Missing required field: id");
1414
+ if (normalizeId(args.id) === void 0) return helpers.error("Missing required field: id");
1410
1415
  const current = entries[args.key];
1411
1416
  if (!current) return helpers.error(`Key "${args.key}" not found.`);
1412
1417
  return current;
@@ -1432,7 +1437,7 @@ var sessionMetadataTool = createTool(
1432
1437
  },
1433
1438
  id: {
1434
1439
  type: "string",
1435
- description: "Item ID (required for: update, remove)"
1440
+ description: "Item ID (required for: update, remove). Accepts numeric ids too \u2014 they are normalized to strings."
1436
1441
  },
1437
1442
  description: {
1438
1443
  type: "string",
@@ -1490,7 +1495,7 @@ ${Object.entries(schema.fields).map(([f, t]) => ` ${f}: ${t}`).join("\n")}`
1490
1495
  if (!args.description) return helpers.error("Missing required field: description");
1491
1496
  const current = entries[args.key] ?? [];
1492
1497
  const newEntry = {
1493
- id: args.id || current.length.toString(),
1498
+ id: normalizeId(args.id) ?? (current.length + 1).toString(),
1494
1499
  description: args.description,
1495
1500
  status: args.status || "pending"
1496
1501
  };
@@ -1501,8 +1506,9 @@ ${Object.entries(schema.fields).map(([f, t]) => ` ${f}: ${t}`).join("\n")}`
1501
1506
  if (args.action === "update") {
1502
1507
  const current = requireKeyAndId(args, helpers, entries);
1503
1508
  if (!Array.isArray(current)) return current;
1504
- const idx = current.findIndex((e) => e.id === args.id);
1505
- if (idx === -1) return helpers.error(`Item "${args.id}" not found in "${args.key}".`);
1509
+ const id = normalizeId(args.id);
1510
+ const idx = current.findIndex((e) => e.id === id);
1511
+ if (idx === -1) return helpers.error(`Item "${id}" not found in "${args.key}".`);
1506
1512
  const updated = current.map(
1507
1513
  (e, i) => i === idx ? {
1508
1514
  ...e,
@@ -1511,15 +1517,16 @@ ${Object.entries(schema.fields).map(([f, t]) => ` ${f}: ${t}`).join("\n")}`
1511
1517
  } : e
1512
1518
  );
1513
1519
  context.sessionManager.setMetadataEntries(context.sessionId, args.key, updated);
1514
- return helpers.success(`Updated item "${args.id}" in "${args.key}".`);
1520
+ return helpers.success(`Updated item "${id}" in "${args.key}".`);
1515
1521
  }
1516
1522
  if (args.action === "remove") {
1517
1523
  const current = requireKeyAndId(args, helpers, entries);
1518
1524
  if (!Array.isArray(current)) return current;
1519
- const updated = current.filter((e) => e.id !== args.id);
1520
- if (updated.length === current.length) return helpers.error(`Item "${args.id}" not found in "${args.key}".`);
1525
+ const id = normalizeId(args.id);
1526
+ const updated = current.filter((e) => e.id !== id);
1527
+ if (updated.length === current.length) return helpers.error(`Item "${id}" not found in "${args.key}".`);
1521
1528
  context.sessionManager.setMetadataEntries(context.sessionId, args.key, updated);
1522
- return helpers.success(`Removed item "${args.id}" from "${args.key}". ${updated.length} items remaining.`);
1529
+ return helpers.success(`Removed item "${id}" from "${args.key}". ${updated.length} items remaining.`);
1523
1530
  }
1524
1531
  return helpers.error("Unexpected error");
1525
1532
  }
@@ -2512,7 +2519,7 @@ async function describeImageFromDataUrl(dataUrl, visionModel, options) {
2512
2519
  // src/server/context/image-processor.ts
2513
2520
  async function loadVisionModelFromGlobalConfig() {
2514
2521
  try {
2515
- const { loadGlobalConfig: loadGlobalConfig2, resolveVisionFallback } = await import("./config-TUCHLIWD.js");
2522
+ const { loadGlobalConfig: loadGlobalConfig2, resolveVisionFallback } = await import("./config-LOK3LXFH.js");
2516
2523
  const runtimeConfig = getRuntimeConfig();
2517
2524
  const mode = runtimeConfig.mode ?? "production";
2518
2525
  const globalConfig = await loadGlobalConfig2(mode);
@@ -3161,7 +3168,7 @@ var callSubAgentTool = {
3161
3168
  };
3162
3169
  }
3163
3170
  try {
3164
- const { getToolRegistryForAgent: getToolRegistryForAgent2 } = await import("./tools-AUHL5MPG.js");
3171
+ const { getToolRegistryForAgent: getToolRegistryForAgent2 } = await import("./tools-CZHV2FAD.js");
3165
3172
  const toolRegistry = getToolRegistryForAgent2(agentDef);
3166
3173
  const turnMetrics = new TurnMetrics();
3167
3174
  const result = await executeSubAgent({
@@ -4183,7 +4190,7 @@ var mcpConfigTool = createTool(
4183
4190
  mcpNotifyChanged?.(sessionId);
4184
4191
  }
4185
4192
  async function rebuildTools() {
4186
- const { setMcpTools: setMcpTools2 } = await import("./tools-AUHL5MPG.js");
4193
+ const { setMcpTools: setMcpTools2 } = await import("./tools-CZHV2FAD.js");
4187
4194
  const mcpTools = createMcpTools(mcpManagerForTools);
4188
4195
  setMcpTools2(mcpTools);
4189
4196
  }
@@ -5108,4 +5115,4 @@ export {
5108
5115
  getToolRegistryForAgent,
5109
5116
  createToolRegistry
5110
5117
  };
5111
- //# sourceMappingURL=chunk-O5A3XKE5.js.map
5118
+ //# sourceMappingURL=chunk-IQYI7TWF.js.map
@@ -0,0 +1,7 @@
1
+ // src/constants.ts
2
+ var VERSION = "2.0.127";
3
+
4
+ export {
5
+ VERSION
6
+ };
7
+ //# sourceMappingURL=chunk-QDO3BEGW.js.map
@@ -321,6 +321,20 @@ function removeProvider(config, providerId) {
321
321
  ...config.defaultAgent !== void 0 ? { defaultAgent: config.defaultAgent } : {}
322
322
  };
323
323
  }
324
+ function reorderProviders(config, orderedIds) {
325
+ const currentProviders = config.providers ?? [];
326
+ const currentIds = currentProviders.map((p) => p.id);
327
+ const orderedSet = new Set(orderedIds);
328
+ const isPermutation = orderedSet.size === orderedIds.length && orderedIds.length === currentIds.length && orderedIds.every((id) => currentIds.includes(id));
329
+ if (!isPermutation) {
330
+ throw new Error("orderedIds must be a permutation of the current provider ids");
331
+ }
332
+ const idToProvider = new Map(currentProviders.map((p) => [p.id, p]));
333
+ return {
334
+ ...config,
335
+ providers: orderedIds.map((id) => idToProvider.get(id))
336
+ };
337
+ }
324
338
  function activateProvider(config, providerId) {
325
339
  const provider = config.providers?.find((p) => p.id === providerId);
326
340
  if (!provider) {
@@ -367,6 +381,7 @@ export {
367
381
  addProvider,
368
382
  updateProvider,
369
383
  removeProvider,
384
+ reorderProviders,
370
385
  activateProvider
371
386
  };
372
- //# sourceMappingURL=chunk-KSXCOHHW.js.map
387
+ //# sourceMappingURL=chunk-R5FAEKXQ.js.map
@@ -37,7 +37,7 @@ Options:
37
37
  }
38
38
  async function runNetworkSetup(mode) {
39
39
  const { loadAuthConfig, saveAuthConfig, encryptPassword } = await import("./auth-GTGIGX5X.js");
40
- const { saveGlobalConfig } = await import("./config-TUCHLIWD.js");
40
+ const { saveGlobalConfig } = await import("./config-LOK3LXFH.js");
41
41
  const { getAuthKeyPath } = await import("./paths-BHR7CZ7I.js");
42
42
  const existingAuth = await loadAuthConfig(mode);
43
43
  if (existingAuth) {
@@ -104,7 +104,7 @@ async function runNetworkSetup(mode) {
104
104
  console.log("\u2713 Configuration saved!\n");
105
105
  }
106
106
  async function runConfig(mode) {
107
- const { loadGlobalConfig, getActiveProvider, getDefaultModel } = await import("./config-TUCHLIWD.js");
107
+ const { loadGlobalConfig, getActiveProvider, getDefaultModel } = await import("./config-LOK3LXFH.js");
108
108
  const { getGlobalConfigPath } = await import("./paths-BHR7CZ7I.js");
109
109
  const config = await loadGlobalConfig(mode);
110
110
  const configPath = getGlobalConfigPath(mode);
@@ -163,7 +163,7 @@ async function runCli(options) {
163
163
  break;
164
164
  }
165
165
  case "provider": {
166
- const { runProviderCommand } = await import("./provider-6LUA73HF.js");
166
+ const { runProviderCommand } = await import("./provider-726LD2KU.js");
167
167
  const [, subcommand] = positionals;
168
168
  await runProviderCommand(mode, subcommand);
169
169
  break;
@@ -200,7 +200,7 @@ async function runCli(options) {
200
200
  break;
201
201
  }
202
202
  case "update": {
203
- const { runUpdate } = await import("./update-45ZRDWUB.js");
203
+ const { runUpdate } = await import("./update-RCNZQCFG.js");
204
204
  const code = await runUpdate();
205
205
  if (code !== 0) {
206
206
  process.exit(code);
@@ -208,12 +208,12 @@ async function runCli(options) {
208
208
  break;
209
209
  }
210
210
  default: {
211
- const { configFileExists } = await import("./config-TUCHLIWD.js");
211
+ const { configFileExists } = await import("./config-LOK3LXFH.js");
212
212
  const configExists = await configFileExists(mode);
213
213
  if (!configExists) {
214
214
  await runNetworkSetup(mode);
215
215
  }
216
- const { runServe } = await import("./serve-UVHJHYF3.js");
216
+ const { runServe } = await import("./serve-OY3Y5PXK.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-X2J6BAU7.js.map
228
+ //# sourceMappingURL=chunk-TY3ONJE4.js.map