openfox 2.0.118 → 2.0.120

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 (57) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/dist/CHANGELOG.md +34 -0
  3. package/dist/agent-defaults/code-reviewer.agent.md +8 -3
  4. package/dist/{auto-config-AAUO4PKW.js → auto-config-YXNCBYEY.js} +125 -11
  5. package/dist/{chat-handler-KNBP6WVI.js → chat-handler-TIR5CMWE.js} +12 -11
  6. package/dist/{chunk-RXIDGWNV.js → chunk-54FTLSWS.js} +102 -55
  7. package/dist/{chunk-CIYA6BNB.js → chunk-A5JAVQKG.js} +2 -2
  8. package/dist/{chunk-HZSKKJHQ.js → chunk-AS7KAH66.js} +28 -9
  9. package/dist/{chunk-5ZR5O5GC.js → chunk-CYXAMXN5.js} +4 -4
  10. package/dist/{chunk-W7VIYHPQ.js → chunk-GJL3QSMP.js} +3 -2
  11. package/dist/{chunk-CX7UJZA5.js → chunk-HWHWXLM5.js} +4 -4
  12. package/dist/{chunk-NP2SV2CX.js → chunk-IQFPRQWM.js} +10 -4
  13. package/dist/{chunk-5E5G3DLI.js → chunk-IW46BUOP.js} +3 -3
  14. package/dist/{chunk-45OS4H3L.js → chunk-JDBIR2J7.js} +7 -7
  15. package/dist/{chunk-IDUXGSQV.js → chunk-JDWJ2PJJ.js} +16 -12
  16. package/dist/chunk-K2QKX4ZJ.js +31 -0
  17. package/dist/{chunk-MKWS7TQH.js → chunk-KFQKBXLO.js} +22 -16
  18. package/dist/{chunk-TOKQ2UVG.js → chunk-MIPQOHWS.js} +20 -6
  19. package/dist/{chunk-Y6WWEQPC.js → chunk-PI4X3Y6H.js} +11 -11
  20. package/dist/chunk-PXEWE5YP.js +7 -0
  21. package/dist/{chunk-MTFLMNLN.js → chunk-USNG72WA.js} +2 -2
  22. package/dist/{chunk-GZTMCTUS.js → chunk-WN76RDRU.js} +18 -22
  23. package/dist/cli/dev.js +1 -1
  24. package/dist/cli/index.js +1 -1
  25. package/dist/{client-KCNTDTIR.js → client-GXRHODRQ.js} +4 -4
  26. package/dist/{client-pure-B5DHEKQJ.js → client-pure-QSY7TJGK.js} +2 -2
  27. package/dist/{compactor-5ATICQ2A.js → compactor-TI352G7B.js} +5 -5
  28. package/dist/{dynamic-context-4SKLIPJ4.js → dynamic-context-C6HGUQTR.js} +2 -2
  29. package/dist/{launch-Q6GUJ22H.js → launch-SRSMTDEM.js} +12 -11
  30. package/dist/{orchestrator-DVCGWWNA.js → orchestrator-SCH2T4JB.js} +11 -10
  31. package/dist/package.json +1 -1
  32. package/dist/{processor-G6UJGA2K.js → processor-GM4D26E6.js} +11 -10
  33. package/dist/{profiles-GYHXBWPV.js → profiles-3YLLEJ2B.js} +2 -2
  34. package/dist/{protocol-DzJrspsl.d.ts → protocol-D5kJLGWy.d.ts} +1 -1
  35. package/dist/provider/index.d.ts +4 -4
  36. package/dist/{provider-Q7J4UFTS.js → provider-5V6RDVU2.js} +6 -5
  37. package/dist/{provider-manager-TMBO4DFG.js → provider-manager-7QD5HAOL.js} +6 -5
  38. package/dist/{serve-23YIIMXH.js → serve-M7I3HWVQ.js} +17 -16
  39. package/dist/server/index.d.ts +22 -5
  40. package/dist/server/index.js +16 -15
  41. package/dist/{server-IDXIAC5L.js → server-F72WN4KP.js} +15 -14
  42. package/dist/{service-M7XJHAK4.js → service-A3YLLXW3.js} +7 -6
  43. package/dist/session-status-6Q5B5PEN.js +35 -0
  44. package/dist/shared/index.d.ts +3 -3
  45. package/dist/{tasks-X5H5HM4J.js → tasks-X5U7DWZR.js} +9 -7
  46. package/dist/{tools-GOGLGTNV.js → tools-GCBDO7TU.js} +9 -8
  47. package/dist/{types-CIVhQMvD.d.ts → types-B5CI_Ql3.d.ts} +3 -1
  48. package/dist/{types-Df7NM9b5.d.ts → types-CZlj7ufS.d.ts} +2 -0
  49. package/dist/{update-T3YMIWQO.js → update-TUGN3JJE.js} +2 -2
  50. package/dist/web/assets/index-BlYcAqzD.js +324 -0
  51. package/dist/web/assets/{index-XTp1QlHA.css → index-D9sfxcRH.css} +1 -1
  52. package/dist/web/index.html +2 -2
  53. package/dist/web/sw.js +1 -1
  54. package/dist/workflow-defaults/default.workflow.json +1 -1
  55. package/package.json +1 -1
  56. package/dist/chunk-BSULZIPW.js +0 -7
  57. package/dist/web/assets/index-BgENxR9h.js +0 -324
package/CHANGELOG.md CHANGED
@@ -1,5 +1,39 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.0.120 - 2026-08-15
4
+
5
+ ### Bug Fixes
6
+
7
+ - **DeepSeek default temperature matches the model card** — DeepSeek models now sample at 1.0 by default instead of 0.6
8
+ - **Max tokens follow the session's model** — clamping and truncation retry budgets now use the active model's context window, not a global default
9
+ - **Truncation retries no longer send negative max_tokens** — retry budget is floored at 256 tokens, preventing HTTP 400 errors
10
+
11
+ ## 2.0.119 - 2026-08-14
12
+
13
+ ### Features
14
+
15
+ - **Per-model sampling controls** — pick which sampling parameters each backend receives, per model
16
+ - **Read-only session status** — lightweight API and widget expose live state for external integrations
17
+
18
+ ### Enhancements
19
+
20
+ - **Reviewer gets the full picture** — code reviews now factor in intended scope, verifier notes, and changed files
21
+ - **No surprise navigation on In Progress** — moving a task keeps your place; open it via the card link
22
+ - **Task editor shortcuts inverted** — Enter inserts a newline, Shift+Enter saves
23
+
24
+ ### Bug Fixes
25
+
26
+ - **New-task autocomplete fixed** — slash/@ suggestions are no longer clipped and load on cold start
27
+ - **Long chats safer against rejection** — max_tokens now keeps 2048 tokens of headroom
28
+ - **Split panes keep dev state separate** — server status, logs, and config no longer bleed between workdirs
29
+ - **ask_user prompts render as markdown** — no more raw text walls
30
+ - **Submodule changes appear in the diff preview**
31
+ - **Auto-config spots rejected reasoning** — providers that refuse it no longer receive reasoning history
32
+ - **LM Studio context windows set by auto-config** — no longer left at zero
33
+ - **No phantom password prompt** — the login modal no longer flashes while connecting
34
+ - **Silent streams end their turn** — idle LLM connections time out cleanly instead of hanging
35
+ - **Null token usage no longer crashes sessions**
36
+
3
37
  ## 2.0.118 - 2026-08-12
4
38
 
5
39
  ### Features
package/dist/CHANGELOG.md CHANGED
@@ -1,5 +1,39 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.0.120 - 2026-08-15
4
+
5
+ ### Bug Fixes
6
+
7
+ - **DeepSeek default temperature matches the model card** — DeepSeek models now sample at 1.0 by default instead of 0.6
8
+ - **Max tokens follow the session's model** — clamping and truncation retry budgets now use the active model's context window, not a global default
9
+ - **Truncation retries no longer send negative max_tokens** — retry budget is floored at 256 tokens, preventing HTTP 400 errors
10
+
11
+ ## 2.0.119 - 2026-08-14
12
+
13
+ ### Features
14
+
15
+ - **Per-model sampling controls** — pick which sampling parameters each backend receives, per model
16
+ - **Read-only session status** — lightweight API and widget expose live state for external integrations
17
+
18
+ ### Enhancements
19
+
20
+ - **Reviewer gets the full picture** — code reviews now factor in intended scope, verifier notes, and changed files
21
+ - **No surprise navigation on In Progress** — moving a task keeps your place; open it via the card link
22
+ - **Task editor shortcuts inverted** — Enter inserts a newline, Shift+Enter saves
23
+
24
+ ### Bug Fixes
25
+
26
+ - **New-task autocomplete fixed** — slash/@ suggestions are no longer clipped and load on cold start
27
+ - **Long chats safer against rejection** — max_tokens now keeps 2048 tokens of headroom
28
+ - **Split panes keep dev state separate** — server status, logs, and config no longer bleed between workdirs
29
+ - **ask_user prompts render as markdown** — no more raw text walls
30
+ - **Submodule changes appear in the diff preview**
31
+ - **Auto-config spots rejected reasoning** — providers that refuse it no longer receive reasoning history
32
+ - **LM Studio context windows set by auto-config** — no longer left at zero
33
+ - **No phantom password prompt** — the login modal no longer flashes while connecting
34
+ - **Silent streams end their turn** — idle LLM connections time out cleanly instead of hanging
35
+ - **Null token usage no longer crashes sessions**
36
+
3
37
  ## 2.0.118 - 2026-08-12
4
38
 
5
39
  ### Features
@@ -11,14 +11,19 @@ allowedTools:
11
11
  - session_metadata
12
12
  ---
13
13
 
14
- You are a code reviewer. Review the **git diff** of the modified files rather than reading the full files.
14
+ You are a code reviewer. Your caller may provide situational context before the diff — **intended scope (criteria)**, **what the verifier already confirmed**, and the **modified files**. Review the **git diff** of the modified files rather than reading the full files.
15
+
16
+ When context is provided, use it to judge the change against what was actually requested:
17
+
18
+ - Read the intended scope (criteria) and check the diff delivers it faithfully — flag mismatches, partial implementations, or scope creep.
19
+ - Treat the verifier's notes as already-confirmed ground truth. Don't re-verify what it covered; instead catch what it missed.
20
+ - You're not looking for 100% perfection. Just something that feels good to use and doesn't bloat the software.
21
+
15
22
  You're mostly interested in:
16
23
 
17
24
  1. **For the user (UX interaction)** — does this feel good to use? Any rough edges, confusing behavior, or unnecessary friction?
18
25
  2. **For the project (code quality + guidelines)** — does this follow project conventions? Is it maintainable? Does it bloat the software?
19
26
 
20
- You're not looking for 100% perfection. Just something that feels good to use and doesn't bloat the software.
21
-
22
27
  ## Managing Findings
23
28
 
24
29
  Use `session_metadata` to track your findings:
@@ -1,3 +1,6 @@
1
+ import {
2
+ findLmStudioModel
3
+ } from "./chunk-K2QKX4ZJ.js";
1
4
  import {
2
5
  ensureVersionPrefix
3
6
  } from "./chunk-HNCM3D7Y.js";
@@ -98,14 +101,10 @@ async function detectLmstudioInfo(baseUrl, modelId) {
98
101
  const nativeUrl = `${base.replace(/\/v\d+\/?$/, "")}/api/v1/models`;
99
102
  const response = await fetch(nativeUrl, { signal: AbortSignal.timeout(5e3) });
100
103
  if (!response.ok) throw new Error(`HTTP ${response.status}`);
101
- const data = await response.json();
102
- const model = data.find((m) => (m.key ?? m.id) === modelId);
104
+ const model = findLmStudioModel(await response.json(), modelId);
103
105
  if (!model) throw new Error(`Model ${modelId} not found in LM Studio`);
104
- const loadedContext = model.loaded_instances?.[0]?.config?.context_length;
105
- const ctxLen = loadedContext ?? model.max_context_length;
106
- const supportsVision = model.capabilities?.vision ?? false;
107
- if (ctxLen) {
108
- return { contextWindow: ctxLen, source: "backend", supportsVision };
106
+ if (model.contextWindow) {
107
+ return { contextWindow: model.contextWindow, source: "backend", supportsVision: model.supportsVision };
109
108
  }
110
109
  throw new Error("No context_length in LM Studio response");
111
110
  }
@@ -157,6 +156,117 @@ async function probeCombos(baseUrl, apiKey, model, combos) {
157
156
  logger.debug("Auto-config: no working combo found", { model });
158
157
  return null;
159
158
  }
159
+ async function probeReasoningInMessages(baseUrl, apiKey, model) {
160
+ const headers = { "Content-Type": "application/json" };
161
+ if (apiKey) headers["Authorization"] = `Bearer ${apiKey}`;
162
+ try {
163
+ const response = await fetch(`${ensureVersionPrefix(baseUrl)}/chat/completions`, {
164
+ method: "POST",
165
+ headers,
166
+ body: JSON.stringify({
167
+ model,
168
+ messages: [
169
+ { role: "user", content: "say hi in one word" },
170
+ { role: "assistant", content: "hi", reasoning: "probe" },
171
+ { role: "user", content: "say hi in one word" }
172
+ ],
173
+ max_tokens: 1
174
+ }),
175
+ signal: AbortSignal.timeout(15e3)
176
+ });
177
+ return response.ok;
178
+ } catch {
179
+ return void 0;
180
+ }
181
+ }
182
+ var STANDARD_PARAMS = ["temperature", "top_p", "max_tokens", "top_k", "reasoning_effort"];
183
+ var PARAM_VALUES = {
184
+ temperature: 0.7,
185
+ top_p: 0.9,
186
+ max_tokens: 50,
187
+ top_k: 40,
188
+ reasoning_effort: "high"
189
+ };
190
+ var escapeRegExp = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
191
+ var REJECTED_PARAM_PATTERNS = STANDARD_PARAMS.map((param) => ({
192
+ param,
193
+ pattern: new RegExp(`\\b${escapeRegExp(param)}\\b`, "i")
194
+ }));
195
+ function extractRejectedParam(errorText) {
196
+ for (const { param, pattern } of REJECTED_PARAM_PATTERNS) {
197
+ if (pattern.test(errorText)) return param;
198
+ }
199
+ return void 0;
200
+ }
201
+ var DUMMY_TOOL = {
202
+ type: "function",
203
+ function: {
204
+ name: "noop",
205
+ description: "No-op tool for probing",
206
+ parameters: { type: "object", properties: {}, required: [] }
207
+ }
208
+ };
209
+ async function probeChatCompletions(baseUrl, headers, model, samplingParams) {
210
+ const body = {
211
+ model,
212
+ messages: [{ role: "user", content: "say hi in one word" }],
213
+ tools: [DUMMY_TOOL],
214
+ tool_choice: "auto"
215
+ };
216
+ for (const param of samplingParams) {
217
+ body[param] = PARAM_VALUES[param];
218
+ }
219
+ try {
220
+ const response = await fetch(`${ensureVersionPrefix(baseUrl)}/chat/completions`, {
221
+ method: "POST",
222
+ headers,
223
+ body: JSON.stringify(body),
224
+ signal: AbortSignal.timeout(15e3)
225
+ });
226
+ if (response.ok) return { ok: true, status: response.status, errorText: "" };
227
+ return { ok: false, status: response.status, errorText: await response.text() };
228
+ } catch {
229
+ return { ok: false, status: 0, errorText: "" };
230
+ }
231
+ }
232
+ async function probeRejectedParams(baseUrl, apiKey, model, backend) {
233
+ const headers = { "Content-Type": "application/json" };
234
+ if (apiKey) headers["Authorization"] = `Bearer ${apiKey}`;
235
+ const candidates = [...STANDARD_PARAMS];
236
+ if (["openai", "anthropic", "ollama"].includes(backend)) {
237
+ const idx = candidates.indexOf("top_k");
238
+ if (idx !== -1) candidates.splice(idx, 1);
239
+ }
240
+ const control = await probeChatCompletions(baseUrl, headers, model, []);
241
+ if (!control.ok) {
242
+ logger.debug("Auto-config: rejection-probe control failed, skipping param detection", {
243
+ model,
244
+ status: control.status
245
+ });
246
+ return [];
247
+ }
248
+ const rejected = [];
249
+ const remaining = [...candidates];
250
+ while (remaining.length > 0) {
251
+ const probe = await probeChatCompletions(baseUrl, headers, model, remaining);
252
+ if (probe.ok) break;
253
+ if (probe.status === 400) {
254
+ const rejectedParam = extractRejectedParam(probe.errorText);
255
+ if (rejectedParam && remaining.includes(rejectedParam)) {
256
+ rejected.push(rejectedParam);
257
+ remaining.splice(remaining.indexOf(rejectedParam), 1);
258
+ logger.debug("Auto-config: param rejected, retrying without", { model, rejectedParam });
259
+ continue;
260
+ }
261
+ break;
262
+ }
263
+ break;
264
+ }
265
+ if (rejected.length > 0) {
266
+ logger.info("Auto-config: detected rejected params", { model, rejected });
267
+ }
268
+ return rejected;
269
+ }
160
270
  async function autoConfig(input) {
161
271
  const { url, apiKey, backend, models } = input;
162
272
  const baseUrl = url.replace(/\/+$/, "");
@@ -168,17 +278,21 @@ async function autoConfig(input) {
168
278
  source: contextSource,
169
279
  supportsVision
170
280
  } = await detectModelInfo(baseUrl, apiKey, backend, model.id);
171
- const [thinkingConfig, nonThinkingConfig] = await Promise.all([
281
+ const [thinkingConfig, nonThinkingConfig, rejectedParams] = await Promise.all([
172
282
  probeCombos(baseUrl, apiKey, model.id, THINKING_COMBOS),
173
- probeCombos(baseUrl, apiKey, model.id, NON_THINKING_COMBOS)
283
+ probeCombos(baseUrl, apiKey, model.id, NON_THINKING_COMBOS),
284
+ probeRejectedParams(baseUrl, apiKey, model.id, backend)
174
285
  ]);
286
+ const sendReasoningInMessages = thinkingConfig ? await probeReasoningInMessages(baseUrl, apiKey, model.id) : void 0;
175
287
  results.push({
176
288
  id: model.id,
177
289
  contextWindow,
178
290
  contextSource,
179
291
  supportsVision,
180
292
  thinkingConfig,
181
- nonThinkingConfig
293
+ nonThinkingConfig,
294
+ ...sendReasoningInMessages !== void 0 ? { sendReasoningInMessages } : {},
295
+ ...rejectedParams.length > 0 ? { rejectedParams } : {}
182
296
  });
183
297
  }
184
298
  return { models: results };
@@ -186,4 +300,4 @@ async function autoConfig(input) {
186
300
  export {
187
301
  autoConfig
188
302
  };
189
- //# sourceMappingURL=auto-config-AAUO4PKW.js.map
303
+ //# sourceMappingURL=auto-config-YXNCBYEY.js.map
@@ -2,14 +2,14 @@ import {
2
2
  buildRunChatTurnParams,
3
3
  finalizeTurnCompletion,
4
4
  generateSessionNameForSession
5
- } from "./chunk-MTFLMNLN.js";
5
+ } from "./chunk-USNG72WA.js";
6
6
  import {
7
7
  runChatTurn
8
- } from "./chunk-CX7UJZA5.js";
9
- import "./chunk-IDUXGSQV.js";
10
- import "./chunk-5E5G3DLI.js";
8
+ } from "./chunk-HWHWXLM5.js";
9
+ import "./chunk-JDWJ2PJJ.js";
10
+ import "./chunk-IW46BUOP.js";
11
11
  import "./chunk-2FCLCUVR.js";
12
- import "./chunk-NP2SV2CX.js";
12
+ import "./chunk-IQFPRQWM.js";
13
13
  import "./chunk-27NABDXB.js";
14
14
  import "./chunk-M6X6AIEG.js";
15
15
  import "./chunk-ZTOG6LJD.js";
@@ -18,7 +18,7 @@ import "./chunk-JE7LW7Y6.js";
18
18
  import "./chunk-OAN4BXEW.js";
19
19
  import "./chunk-O6DU226D.js";
20
20
  import "./chunk-J7GAZGZT.js";
21
- import "./chunk-HZSKKJHQ.js";
21
+ import "./chunk-AS7KAH66.js";
22
22
  import "./chunk-EQ5CGNOT.js";
23
23
  import "./chunk-XZGQZ42D.js";
24
24
  import {
@@ -38,13 +38,14 @@ import "./chunk-LCLH6ZUL.js";
38
38
  import "./chunk-LNNBLB6G.js";
39
39
  import "./chunk-OSXPQSLW.js";
40
40
  import "./chunk-3PG65AXG.js";
41
- import "./chunk-GZTMCTUS.js";
41
+ import "./chunk-WN76RDRU.js";
42
+ import "./chunk-K2QKX4ZJ.js";
42
43
  import "./chunk-J2GP3J3X.js";
43
- import "./chunk-MKWS7TQH.js";
44
- import "./chunk-W7VIYHPQ.js";
44
+ import "./chunk-KFQKBXLO.js";
45
+ import "./chunk-GJL3QSMP.js";
45
46
  import "./chunk-AZHWLLPP.js";
46
47
  import "./chunk-HNCM3D7Y.js";
47
- import "./chunk-TOKQ2UVG.js";
48
+ import "./chunk-MIPQOHWS.js";
48
49
  import "./chunk-LTYL6ZGH.js";
49
50
  import "./chunk-HD6Y77RO.js";
50
51
  import "./chunk-5PT4UMRR.js";
@@ -173,4 +174,4 @@ export {
173
174
  startChatSession,
174
175
  stopSessionExecution
175
176
  };
176
- //# sourceMappingURL=chat-handler-KNBP6WVI.js.map
177
+ //# sourceMappingURL=chat-handler-TIR5CMWE.js.map