openfox 2.0.122 → 2.0.124

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 (83) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/CHANGELOG.md +27 -0
  3. package/dist/{auto-config-YXNCBYEY.js → auto-config-454YE6KC.js} +24 -17
  4. package/dist/{chat-handler-JQUVSZT3.js → chat-handler-N43TBYLV.js} +29 -28
  5. package/dist/{chunk-DIALH34K.js → chunk-3B232XG4.js} +2 -2
  6. package/dist/{chunk-RMOKNQAS.js → chunk-3NMLSANH.js} +2 -2
  7. package/dist/{chunk-22D7ZR2X.js → chunk-57UCBFBD.js} +50 -37
  8. package/dist/{chunk-SCP5KBNB.js → chunk-5CCM655F.js} +149 -63
  9. package/dist/{chunk-EZ67GBEO.js → chunk-66MG44TF.js} +2 -2
  10. package/dist/{chunk-YBOU4ZFD.js → chunk-7YP4O4XE.js} +3 -3
  11. package/dist/{chunk-UJRWYZHM.js → chunk-A6EZBX62.js} +59 -23
  12. package/dist/{chunk-SLW3KKPP.js → chunk-AQBRI7TM.js} +21 -8
  13. package/dist/{chunk-OXANSWVZ.js → chunk-EHFIUXWZ.js} +2 -2
  14. package/dist/{chunk-AIXVERRI.js → chunk-FAL4WO4V.js} +6 -6
  15. package/dist/{chunk-Y7FGHKBW.js → chunk-GIJUWPRQ.js} +2 -2
  16. package/dist/chunk-ISE55FOR.js +89 -0
  17. package/dist/{chunk-6A2VIV36.js → chunk-JEZN37KV.js} +3 -3
  18. package/dist/{chunk-2N7KFNMY.js → chunk-KBESUA3W.js} +3 -3
  19. package/dist/{chunk-5A4YN6I7.js → chunk-KD4W3I6C.js} +112 -33
  20. package/dist/{chunk-UOEAKQBH.js → chunk-KGFERMCV.js} +15 -15
  21. package/dist/{chunk-FGVMRFDW.js → chunk-N2Q3KYWM.js} +2 -2
  22. package/dist/{chunk-NYQKSKDB.js → chunk-OYBUJIC3.js} +9 -1
  23. package/dist/{chunk-KDC4QHE7.js → chunk-QJNBQCAF.js} +22 -18
  24. package/dist/{chunk-I22B6KWV.js → chunk-RV5G7QQU.js} +3 -3
  25. package/dist/{chunk-ZT7YTM2U.js → chunk-RXLAFEZB.js} +4 -4
  26. package/dist/chunk-SBADOWVC.js +7 -0
  27. package/dist/{chunk-J77SLE3M.js → chunk-SYTEO5LA.js} +3 -2
  28. package/dist/{chunk-STYGFTEB.js → chunk-UGEFD67O.js} +6 -6
  29. package/dist/{chunk-POTCPZJF.js → chunk-VPRB5FNR.js} +2 -2
  30. package/dist/{chunk-WIZUASFY.js → chunk-VUBFPRKT.js} +278 -142
  31. package/dist/{chunk-YDDBPKVP.js → chunk-W4SM4FFZ.js} +15 -15
  32. package/dist/{chunk-J3IJJ55E.js → chunk-YJD5A375.js} +7 -7
  33. package/dist/{chunk-LSEHJ2WI.js → chunk-ZIL6VKLU.js} +3 -3
  34. package/dist/{chunk-LWXLNE6M.js → chunk-ZIYETXOW.js} +2 -2
  35. package/dist/cli/dev.js +1 -1
  36. package/dist/cli/index.js +1 -1
  37. package/dist/{client-JKPDMJ7S.js → client-XHJHOFMU.js} +5 -5
  38. package/dist/{compactor-MKD3CAFM.js → compactor-VTATJTPN.js} +12 -12
  39. package/dist/{dynamic-context-IWFD7U3D.js → dynamic-context-KTQCAPTK.js} +9 -9
  40. package/dist/{events-6P4TDTSD.js → events-GMHRX4LF.js} +8 -8
  41. package/dist/{folding-3LA2WX2B.js → folding-7K2GRPF4.js} +6 -6
  42. package/dist/http-client-N4ASJEKJ.js +11 -0
  43. package/dist/{inspect-proxy-IDLUAQH5.js → inspect-proxy-UKPU3Z64.js} +4 -4
  44. package/dist/launch-Z5D5YFRJ.js +53 -0
  45. package/dist/{manager-NFKTUR64.js → manager-NOKJQTTF.js} +5 -5
  46. package/dist/model-catalog-ZLOWTQA7.js +14 -0
  47. package/dist/{orchestrator-PEXLQK3T.js → orchestrator-BQBBO4US.js} +31 -30
  48. package/dist/package.json +1 -1
  49. package/dist/{path-security-JUF56IB6.js → path-security-YTPZ35SL.js} +14 -12
  50. package/dist/{platform-FM57ZJHA.js → platform-EMKWQTZX.js} +4 -4
  51. package/dist/{processor-2GEVRLJP.js → processor-WTRVYXAO.js} +39 -35
  52. package/dist/{project-creator-J4ITWDZI.js → project-creator-JF3YVQAH.js} +3 -3
  53. package/dist/{projects-FHRTSV6N.js → projects-TPSLCJP2.js} +3 -3
  54. package/dist/{protocol-BLin669D.d.ts → protocol-DCMH9Ufp.d.ts} +1 -1
  55. package/dist/provider/index.d.ts +4 -4
  56. package/dist/{provider-TAFJCWVP.js → provider-LICG53GG.js} +7 -6
  57. package/dist/{provider-manager-EDJN6ARI.js → provider-manager-3QC2MSSR.js} +7 -6
  58. package/dist/{registry-37GL3DAP.js → registry-Z4GVYFTV.js} +5 -5
  59. package/dist/{serve-3BPQGWYE.js → serve-75G5Z7UQ.js} +34 -33
  60. package/dist/server/index.d.ts +27 -6
  61. package/dist/server/index.js +31 -30
  62. package/dist/server-N3VATHIA.js +56 -0
  63. package/dist/{service-2IOCVEXQ.js → service-OURGS2SI.js} +10 -9
  64. package/dist/{session-overrides-EOKSZO2X.js → session-overrides-4WAD3X5Q.js} +7 -7
  65. package/dist/{sessions-XFNU4DZ6.js → sessions-D7VRCHQY.js} +8 -6
  66. package/dist/{settings-SYYDPV43.js → settings-VOWWO4VG.js} +3 -3
  67. package/dist/shared/index.d.ts +3 -3
  68. package/dist/{tasks-G7ACMQM2.js → tasks-4SOLTX6A.js} +11 -10
  69. package/dist/{tools-IKMNLLAY.js → tools-G44LBKD4.js} +24 -23
  70. package/dist/{types-B5_9KtfJ.d.ts → types-Cr4EgGwK.d.ts} +1 -1
  71. package/dist/{types-DeQIEC1U.d.ts → types-PAKlAzp9.d.ts} +16 -0
  72. package/dist/{update-QX6IIUKB.js → update-R2TEHD7V.js} +2 -2
  73. package/dist/web/assets/{index-D9sfxcRH.css → index-DFMllFkv.css} +1 -1
  74. package/dist/web/assets/index-GZTGHRRr.js +324 -0
  75. package/dist/web/index.html +2 -2
  76. package/dist/web/sw.js +1 -1
  77. package/dist/{workspace-ZNZFEONU.js → workspace-J3JEGF6U.js} +4 -4
  78. package/package.json +1 -1
  79. package/dist/chunk-VC3YCHDO.js +0 -7
  80. package/dist/http-client-IKOARXI7.js +0 -11
  81. package/dist/launch-FOUIDMGW.js +0 -52
  82. package/dist/server-HPIR55OH.js +0 -55
  83. package/dist/web/assets/index-CJuw9bwD.js +0 -324
@@ -4,10 +4,29 @@ import {
4
4
  getEnabledSkillMetadata,
5
5
  isSkillEnabled,
6
6
  loadAllSkills
7
- } from "./chunk-LSEHJ2WI.js";
7
+ } from "./chunk-ZIL6VKLU.js";
8
+ import {
9
+ TurnMetrics,
10
+ clearLLMFailure,
11
+ consumeStreamGenerator,
12
+ createChatDoneEvent,
13
+ createMessageDoneEvent,
14
+ createMessageStartEvent,
15
+ createToolCallEvent,
16
+ createToolResultEvent,
17
+ evaluateLLMRetry,
18
+ recordLLMFailure,
19
+ sleepThroughRetryBackoff,
20
+ streamLLMPure
21
+ } from "./chunk-62GUO2EG.js";
22
+ import {
23
+ COMPACTION_PROMPT,
24
+ buildBasePrompt,
25
+ computeEffectiveTools
26
+ } from "./chunk-GIJUWPRQ.js";
8
27
  import {
9
28
  startInspectProxy
10
- } from "./chunk-OXANSWVZ.js";
29
+ } from "./chunk-EHFIUXWZ.js";
11
30
  import {
12
31
  checkAborted,
13
32
  createProcess,
@@ -21,7 +40,7 @@ import {
21
40
  spawnShellProcess,
22
41
  startProcessCommand,
23
42
  stopProcess
24
- } from "./chunk-I22B6KWV.js";
43
+ } from "./chunk-RV5G7QQU.js";
25
44
  import {
26
45
  getMaxPerSession,
27
46
  getSessionProcessCount,
@@ -37,59 +56,28 @@ import {
37
56
  getGitBranch,
38
57
  isGitRepository,
39
58
  listWorkspaces
40
- } from "./chunk-RMOKNQAS.js";
59
+ } from "./chunk-3NMLSANH.js";
41
60
  import {
42
61
  getGateConfig,
43
62
  isTaskConflictError,
44
63
  isTaskGateError
45
- } from "./chunk-STYGFTEB.js";
64
+ } from "./chunk-UGEFD67O.js";
46
65
  import {
47
66
  getSessionDisabledServers
48
- } from "./chunk-YBOU4ZFD.js";
67
+ } from "./chunk-7YP4O4XE.js";
49
68
  import {
50
69
  PathAccessDeniedError,
51
70
  extractAbsolutePathsFromCommand,
52
71
  extractSensitivePathsFromCommand,
53
72
  registerPathConfirmation,
54
- requestPathAccess
55
- } from "./chunk-5A4YN6I7.js";
56
- import {
57
- createChatDoneMessage,
58
- createChatLLMRetryFailedMessage,
59
- createChatLLMRetryMessage,
60
- createChatMessageMessage,
61
- createChatMessageUpdatedMessage,
62
- createChatPathConfirmationMessage,
63
- createQueueStateMessage
64
- } from "./chunk-XAAEP5XM.js";
65
- import {
66
- AskUserInterrupt,
67
- askUserTool
68
- } from "./chunk-JURM3RPZ.js";
69
- import {
70
- TurnMetrics,
71
- clearLLMFailure,
72
- consumeStreamGenerator,
73
- createChatDoneEvent,
74
- createMessageDoneEvent,
75
- createMessageStartEvent,
76
- createToolCallEvent,
77
- createToolResultEvent,
78
- evaluateLLMRetry,
79
- recordLLMFailure,
80
- sleepThroughRetryBackoff,
81
- streamLLMPure
82
- } from "./chunk-62GUO2EG.js";
83
- import {
84
- COMPACTION_PROMPT,
85
- buildBasePrompt,
86
- computeEffectiveTools
87
- } from "./chunk-Y7FGHKBW.js";
73
+ requestPathAccess,
74
+ resolveRelativeTraversals
75
+ } from "./chunk-KD4W3I6C.js";
88
76
  import {
89
77
  getCurrentContextWindowId,
90
78
  getCurrentWindowMessageOptions,
91
79
  getEventStore
92
- } from "./chunk-J3IJJ55E.js";
80
+ } from "./chunk-YJD5A375.js";
93
81
  import {
94
82
  buildContextMessagesFromEventHistory,
95
83
  foldContextState,
@@ -99,13 +87,26 @@ import {
99
87
  handleToolResult,
100
88
  reorderToolMessages,
101
89
  stripOrphanedToolCalls
102
- } from "./chunk-LWXLNE6M.js";
90
+ } from "./chunk-ZIYETXOW.js";
91
+ import {
92
+ createChatDoneMessage,
93
+ createChatLLMRetryFailedMessage,
94
+ createChatLLMRetryMessage,
95
+ createChatMessageMessage,
96
+ createChatMessageUpdatedMessage,
97
+ createChatPathConfirmationMessage,
98
+ createQueueStateMessage
99
+ } from "./chunk-XAAEP5XM.js";
100
+ import {
101
+ AskUserInterrupt,
102
+ askUserTool
103
+ } from "./chunk-JURM3RPZ.js";
103
104
  import {
104
105
  findAgentById,
105
106
  getRuntimeConfig,
106
107
  getSubAgents,
107
108
  loadAllAgentsDefault
108
- } from "./chunk-2N7KFNMY.js";
109
+ } from "./chunk-KBESUA3W.js";
109
110
  import {
110
111
  modelSupportsVision
111
112
  } from "./chunk-GJL3QSMP.js";
@@ -124,7 +125,7 @@ import {
124
125
  SETTINGS_KEYS,
125
126
  getSetting,
126
127
  setSetting
127
- } from "./chunk-FGVMRFDW.js";
128
+ } from "./chunk-N2Q3KYWM.js";
128
129
  import {
129
130
  logger
130
131
  } from "./chunk-K44MW7JJ.js";
@@ -148,7 +149,7 @@ async function requestUserConfirmation(context, toolLabel, desc) {
148
149
  if (context.dangerLevel === "dangerous") return Promise.resolve(true);
149
150
  if (toolLabel === "workspace" || toolLabel === "command") {
150
151
  try {
151
- const { getSetting: getSetting2, SETTINGS_KEYS: SETTINGS_KEYS2 } = await import("./settings-SYYDPV43.js");
152
+ const { getSetting: getSetting2, SETTINGS_KEYS: SETTINGS_KEYS2 } = await import("./settings-VOWWO4VG.js");
152
153
  if (getSetting2(SETTINGS_KEYS2.CONFIRM_ON_WORKSPACE_ACTIONS) !== "true") {
153
154
  return Promise.resolve(true);
154
155
  }
@@ -1218,9 +1219,11 @@ var runCommandTool = createTool(
1218
1219
  const pathsToCheck = [workingDir];
1219
1220
  const commandPaths = extractAbsolutePathsFromCommand(args.command);
1220
1221
  for (const cmdPath of commandPaths) {
1221
- const resolved = isAbsolute(cmdPath) ? cmdPath : resolve3(workingDir, cmdPath);
1222
- pathsToCheck.push(resolved);
1222
+ if (isAbsolute(cmdPath)) {
1223
+ pathsToCheck.push(cmdPath);
1224
+ }
1223
1225
  }
1226
+ pathsToCheck.push(...resolveRelativeTraversals(args.command, workingDir));
1224
1227
  const sensitivePaths = extractSensitivePathsFromCommand(args.command);
1225
1228
  for (const sensitivePath of sensitivePaths) {
1226
1229
  const resolved = isAbsolute(sensitivePath) ? sensitivePath : resolve3(workingDir, sensitivePath);
@@ -1531,7 +1534,8 @@ import { z } from "zod";
1531
1534
  var AGENT_MODEL_OVERRIDES_KEY = SETTINGS_KEYS.AGENT_MODEL_OVERRIDES;
1532
1535
  var overrideSchema = z.object({
1533
1536
  providerId: z.string().min(1),
1534
- model: z.string().min(1)
1537
+ model: z.string().min(1),
1538
+ reasoningEffort: z.string().min(1).optional()
1535
1539
  });
1536
1540
  function parseAgentModelOverrides(raw) {
1537
1541
  if (!raw) return {};
@@ -1566,12 +1570,13 @@ function setAgentModelOverride(agentId, override) {
1566
1570
  }
1567
1571
  setSetting(AGENT_MODEL_OVERRIDES_KEY, JSON.stringify(overrides));
1568
1572
  }
1569
- function resolveLLMClientForAgent(agentId, fallbackClient, providerManager) {
1573
+ function resolveLLMClientForAgent(agentId, fallbackClient, providerManager, pinnedEffort) {
1570
1574
  const override = getAgentModelOverride(agentId);
1571
1575
  if (!override) {
1572
1576
  return { client: fallbackClient, usedOverride: false };
1573
1577
  }
1574
- const client = providerManager.createClient(override.providerId, override.model);
1578
+ const effectiveEffort = pinnedEffort ?? override.reasoningEffort;
1579
+ const client = providerManager.createClient(override.providerId, override.model, effectiveEffort);
1575
1580
  if (!client) {
1576
1581
  return {
1577
1582
  client: fallbackClient,
@@ -1580,7 +1585,11 @@ function resolveLLMClientForAgent(agentId, fallbackClient, providerManager) {
1580
1585
  warning: `Agent '${agentId}' is configured to use model '${override.model}' from provider '${override.providerId}', but it is no longer available. Falling back to the session model.`
1581
1586
  };
1582
1587
  }
1583
- return { client, usedOverride: true, override };
1588
+ return {
1589
+ client,
1590
+ usedOverride: true,
1591
+ override: effectiveEffort ? { ...override, reasoningEffort: effectiveEffort } : override
1592
+ };
1584
1593
  }
1585
1594
 
1586
1595
  // src/server/chat/tool-streaming.ts
@@ -1777,6 +1786,21 @@ Error: ${toolResult.error}` : `Error: ${toolResult.error}`
1777
1786
  return { toolMessages, criteriaChanged: false, returnValueContent, returnValueResult, stepDoneCalled };
1778
1787
  }
1779
1788
 
1789
+ // src/server/chat/token-budget.ts
1790
+ var CHARS_PER_TOKEN = 4;
1791
+ var TOOL_MESSAGE_OVERHEAD_TOKENS = 16;
1792
+ function estimateToolResultTokens(toolMessages) {
1793
+ return toolMessages.reduce(
1794
+ (sum, message) => sum + TOOL_MESSAGE_OVERHEAD_TOKENS + Math.ceil(message.content.length / CHARS_PER_TOKEN),
1795
+ 0
1796
+ );
1797
+ }
1798
+ var CONTEXT_LENGTH_ERROR_PATTERN = /context\s*length|context_length|context window|prompt (?:is )?too long/i;
1799
+ function isContextLengthError(message) {
1800
+ if (!message) return false;
1801
+ return CONTEXT_LENGTH_ERROR_PATTERN.test(message);
1802
+ }
1803
+
1780
1804
  // src/server/chat/retry-limiter.ts
1781
1805
  function createRetryLimiter(max) {
1782
1806
  let current = 0;
@@ -1860,6 +1884,7 @@ function emitDoneAndBreak(assistantMsgId, segments, statsIdentity, mode, turnMet
1860
1884
  }
1861
1885
  }
1862
1886
  var MAX_TRUNCATION_RETRIES = 3;
1887
+ var MAX_CONTEXT_LENGTH_RETRIES = 3;
1863
1888
  var OUTPUT_RESERVE_TOKENS = 2048;
1864
1889
  var CONTINUE_PROMPT = "Continue your previous response. Do NOT repeat what you already wrote.";
1865
1890
  var CONTINUE_AFTER_STREAM_ERROR_PROMPT = "The LLM stream was interrupted mid-response. Continue exactly where you left off \u2014 do not repeat what was already written.";
@@ -1870,6 +1895,8 @@ async function runTopLevelAgentLoop(config, turnMetrics) {
1870
1895
  const resolveClient = () => config.getLLMClient?.() ?? llmClient;
1871
1896
  const retryLimiter = createRetryLimiter(config.maxRetriesPerTurn ?? 10);
1872
1897
  let truncationRetryCount = 0;
1898
+ let contextRetryCount = 0;
1899
+ let pendingToolResultTokens = 0;
1873
1900
  let returnValueContent;
1874
1901
  let returnValueResult;
1875
1902
  let currentMaxTokensOverride;
@@ -1972,8 +1999,14 @@ ${CONTINUE_PROMPT}` : CONTINUE_PROMPT;
1972
1999
  const contextState = sessionManager.getContextState(sessionId);
1973
2000
  previousContextTokens = contextState.currentTokens;
1974
2001
  const contextWindow = sessionManager.getCurrentModelContext(sessionId, config.mode);
1975
- const availableForOutput = Math.max(256, contextWindow - contextState.currentTokens - OUTPUT_RESERVE_TOKENS);
1976
- let modelSettings = config.modelSettings ?? (currentMaxTokensOverride !== void 0 ? { ...sessionManager.getCurrentModelSettings(sessionId, config.mode), maxTokens: currentMaxTokensOverride } : sessionManager.getCurrentModelSettings(sessionId, config.mode));
2002
+ const availableForOutput = Math.max(
2003
+ 256,
2004
+ contextWindow - contextState.currentTokens - pendingToolResultTokens - OUTPUT_RESERVE_TOKENS
2005
+ );
2006
+ let modelSettings = config.modelSettings ?? sessionManager.getCurrentModelSettings(sessionId, config.mode);
2007
+ if (modelSettings && currentMaxTokensOverride !== void 0) {
2008
+ modelSettings = { ...modelSettings, maxTokens: currentMaxTokensOverride };
2009
+ }
1977
2010
  if (modelSettings) {
1978
2011
  const requestedMaxTokens = modelSettings.maxTokens ?? 16384;
1979
2012
  modelSettings = { ...modelSettings, maxTokens: Math.min(requestedMaxTokens, availableForOutput) };
@@ -2015,6 +2048,12 @@ ${CONTINUE_PROMPT}` : CONTINUE_PROMPT;
2015
2048
  continuationAppended = true;
2016
2049
  }
2017
2050
  if (signal?.aborted) throw new Error("Aborted");
2051
+ if (isContextLengthError(attemptResult.error) && contextRetryCount < MAX_CONTEXT_LENGTH_RETRIES) {
2052
+ contextRetryCount += 1;
2053
+ const currentMax = modelSettings?.maxTokens ?? currentMaxTokensOverride ?? 16384;
2054
+ currentMaxTokensOverride = Math.max(256, Math.floor(currentMax / 2));
2055
+ continue;
2056
+ }
2018
2057
  requestFailures += 1;
2019
2058
  if (requestFirstFailureAt === 0) {
2020
2059
  requestFirstFailureAt = Date.now();
@@ -2093,9 +2132,11 @@ ${CONTINUE_PROMPT}` : CONTINUE_PROMPT;
2093
2132
  result.usage.completionTokens,
2094
2133
  config.subAgentMetadata?.subAgentId
2095
2134
  );
2135
+ pendingToolResultTokens = 0;
2136
+ currentMaxTokensOverride = void 0;
2096
2137
  if (!compacting) {
2097
2138
  const contextState = sessionManager.getContextState(sessionId);
2098
- const { shouldCompact, appendCompactionPrompt } = await import("./compactor-MKD3CAFM.js");
2139
+ const { shouldCompact, appendCompactionPrompt } = await import("./compactor-VTATJTPN.js");
2099
2140
  if (shouldCompact(
2100
2141
  contextState.currentTokens,
2101
2142
  contextState.maxTokens,
@@ -2202,6 +2243,7 @@ ${COMPACTION_PROMPT}`,
2202
2243
  }
2203
2244
  batchContext.agentTimeout = getRuntimeConfig().agent.toolTimeout;
2204
2245
  const batchResult = await executeTools(assistantMsgId, result.toolCalls, batchContext, append);
2246
+ pendingToolResultTokens = estimateToolResultTokens(batchResult.toolMessages);
2205
2247
  if (batchResult.stepDoneCalled) {
2206
2248
  emitDoneAndBreak(
2207
2249
  assistantMsgId,
@@ -2880,7 +2922,8 @@ async function executeSubAgent(options) {
2880
2922
  let hasOverride = false;
2881
2923
  let overrideModelSettings;
2882
2924
  if (providerManager) {
2883
- const resolved = resolveLLMClientForAgent(subAgentType, parentLlmClient, providerManager);
2925
+ const pinnedEffort = session.providerPinnedEffort ?? void 0;
2926
+ const resolved = resolveLLMClientForAgent(subAgentType, parentLlmClient, providerManager, pinnedEffort);
2884
2927
  if (resolved.usedOverride && resolved.override) {
2885
2928
  hasOverride = true;
2886
2929
  llmClient = resolved.client;
@@ -2889,7 +2932,8 @@ async function executeSubAgent(options) {
2889
2932
  providerId: resolved.override.providerId,
2890
2933
  providerName: provider?.name ?? resolved.override.providerId,
2891
2934
  backend: provider?.backend ?? resolved.client.getBackend(),
2892
- model: resolved.override.model
2935
+ model: resolved.override.model,
2936
+ ...resolved.override.reasoningEffort ? { reasoningEffort: resolved.override.reasoningEffort } : {}
2893
2937
  };
2894
2938
  overrideModelSettings = providerManager.getModelSettings(resolved.override.providerId, resolved.override.model);
2895
2939
  logger.info("Sub-agent using model override", { subAgentType, ...resolved.override });
@@ -2922,7 +2966,11 @@ async function executeSubAgent(options) {
2922
2966
  } else {
2923
2967
  const effective = sessionManager.resolveEffectiveProviderModel(sessionId, subAgentType);
2924
2968
  if (effective.providerId && effective.model) {
2925
- const effectiveClient = providerManager.createClient(effective.providerId, effective.model);
2969
+ const effectiveClient = providerManager.createClient(
2970
+ effective.providerId,
2971
+ effective.model,
2972
+ effective.reasoningEffort
2973
+ );
2926
2974
  if (effectiveClient) {
2927
2975
  llmClient = effectiveClient;
2928
2976
  const provider = providerManager.getProviders().find((p) => p.id === effective.providerId);
@@ -2930,7 +2978,8 @@ async function executeSubAgent(options) {
2930
2978
  providerId: effective.providerId,
2931
2979
  providerName: provider?.name ?? effective.providerId,
2932
2980
  backend: provider?.backend ?? effectiveClient.getBackend(),
2933
- model: effective.model
2981
+ model: effective.model,
2982
+ ...effective.reasoningEffort ? { reasoningEffort: effective.reasoningEffort } : {}
2934
2983
  };
2935
2984
  }
2936
2985
  }
@@ -3103,7 +3152,7 @@ var callSubAgentTool = {
3103
3152
  };
3104
3153
  }
3105
3154
  try {
3106
- const { getToolRegistryForAgent: getToolRegistryForAgent2 } = await import("./tools-IKMNLLAY.js");
3155
+ const { getToolRegistryForAgent: getToolRegistryForAgent2 } = await import("./tools-G44LBKD4.js");
3107
3156
  const toolRegistry = getToolRegistryForAgent2(agentDef);
3108
3157
  const turnMetrics = new TurnMetrics();
3109
3158
  const result = await executeSubAgent({
@@ -4125,7 +4174,7 @@ var mcpConfigTool = createTool(
4125
4174
  mcpNotifyChanged?.(sessionId);
4126
4175
  }
4127
4176
  async function rebuildTools() {
4128
- const { setMcpTools: setMcpTools2 } = await import("./tools-IKMNLLAY.js");
4177
+ const { setMcpTools: setMcpTools2 } = await import("./tools-G44LBKD4.js");
4129
4178
  const mcpTools = createMcpTools(mcpManagerForTools);
4130
4179
  setMcpTools2(mcpTools);
4131
4180
  }
@@ -4552,13 +4601,15 @@ function getTasksService() {
4552
4601
  }
4553
4602
  var VALID_ACTIONS = ["list", "create", "edit", "move", "set_gate_value", "delete"];
4554
4603
  var LIST_STATUSES = ["todo", "in_progress", "done", "all"];
4604
+ var LIST_DEFAULT_LIMIT = 10;
4605
+ var LIST_MAX_LIMIT = 25;
4555
4606
  var projectTasksTool = createTool(
4556
4607
  "project_tasks",
4557
4608
  {
4558
4609
  type: "function",
4559
4610
  function: {
4560
4611
  name: "project_tasks",
4561
- description: "Kanban task board for this project. Core loop: list \u2192 move \u2192 set_gate_value.\n\nRules:\n- Moving to in_progress binds the task to YOUR current session.\n- Do not move tasks or fill gate values without explicit user approval or a system instruction \u2014 complete the work, then let the user review before the task advances.\n- Moving to done is blocked by unmet gates: the error names the missing fields \u2014 fill them only with user approval, then retry the move.\n- Stale writes fail with CONFLICT \u2014 re-list and retry.\n\nActions:\n- list: tasks (status, gate values, queue position, bound session, audit trail); defaults to open tasks, filter via status (todo | in_progress | done | all)\n- create: add a task to To Do (prompt required)\n- edit: update prompt/attachments/agent/model (taskId + fields)\n- move: change column (to: todo | in_progress | done; optional reason)\n- set_gate_value: fill a gate field (taskId, gateId, value)\n- delete: remove a task (taskId)",
4612
+ description: "Kanban task board for this project. Core loop: list \u2192 move \u2192 set_gate_value.\n\nRules:\n- Moving to in_progress binds the task to YOUR current session.\n- Do not move tasks or fill gate values without explicit user approval or a system instruction \u2014 complete the work, then let the user review before the task advances.\n- Moving to done is blocked by unmet gates: the error names the missing fields \u2014 fill them only with user approval, then retry the move.\n- Stale writes fail with CONFLICT \u2014 re-list and retry.\n\nActions:\n- list: tasks (status, gate values, queue position, bound session, audit trail); defaults to open tasks, filter via status (todo | in_progress | done | all); paginated \u2014 limit 10 max 25, page with offset\n- create: add a task to To Do (prompt required)\n- edit: update prompt/attachments/agent/model (taskId + fields)\n- move: change column (to: todo | in_progress | done; optional reason)\n- set_gate_value: fill a gate field (taskId, gateId, value)\n- delete: remove a task (taskId)",
4562
4613
  parameters: {
4563
4614
  type: "object",
4564
4615
  properties: {
@@ -4578,6 +4629,14 @@ var projectTasksTool = createTool(
4578
4629
  enum: ["todo", "in_progress", "done", "all"],
4579
4630
  description: "Column filter for action=list (default: open tasks)"
4580
4631
  },
4632
+ limit: {
4633
+ type: "number",
4634
+ description: "Max tasks to return for action=list (default: 10, max: 25)"
4635
+ },
4636
+ offset: {
4637
+ type: "number",
4638
+ description: "Number of tasks to skip for action=list pagination (default: 0). Pages are snapshots \u2014 re-list after mutations."
4639
+ },
4581
4640
  expectedVersion: {
4582
4641
  type: "number",
4583
4642
  description: "Task version from your last read; stale writes fail with CONFLICT"
@@ -4605,10 +4664,26 @@ var projectTasksTool = createTool(
4605
4664
  `Invalid "status" filter for action=list: "${String(status)}". Expected one of: todo, in_progress, done, all.`
4606
4665
  );
4607
4666
  }
4667
+ const page = parseListPage(args.limit, args.offset);
4668
+ if (!page.ok) return helpers.error(page.error);
4608
4669
  const tasks = svc.list(projectId);
4609
4670
  const filtered = status === "all" ? tasks : tasks.filter((t) => status === void 0 ? t.status !== "done" : t.status === status);
4671
+ const pageTasks = filtered.slice(page.offset, page.offset + page.limit);
4610
4672
  const gates = getGateConfig(projectId);
4611
- return helpers.success(JSON.stringify({ gates, tasks: filtered.map((t) => taskForAgent(t)) }, null, 2));
4673
+ return helpers.success(
4674
+ JSON.stringify(
4675
+ {
4676
+ gates,
4677
+ tasks: pageTasks.map((t) => taskForAgent(t)),
4678
+ total: filtered.length,
4679
+ limit: page.limit,
4680
+ offset: page.offset,
4681
+ hasMore: page.offset + page.limit < filtered.length
4682
+ },
4683
+ null,
4684
+ 2
4685
+ )
4686
+ );
4612
4687
  }
4613
4688
  case "create": {
4614
4689
  const task = svc.create(
@@ -4701,6 +4776,17 @@ var projectTasksTool = createTool(
4701
4776
  }
4702
4777
  }
4703
4778
  );
4779
+ function parseListPage(limit, offset) {
4780
+ const pageSize = limit ?? LIST_DEFAULT_LIMIT;
4781
+ const skip = offset ?? 0;
4782
+ if (!Number.isInteger(pageSize) || pageSize < 1 || pageSize > LIST_MAX_LIMIT) {
4783
+ return { ok: false, error: `Invalid "limit" for action=list: must be an integer between 1 and ${LIST_MAX_LIMIT}.` };
4784
+ }
4785
+ if (!Number.isInteger(skip) || skip < 0) {
4786
+ return { ok: false, error: 'Invalid "offset" for action=list: must be a non-negative integer.' };
4787
+ }
4788
+ return { ok: true, limit: pageSize, offset: skip };
4789
+ }
4704
4790
  function taskForAgent(task) {
4705
4791
  return {
4706
4792
  id: task.id,
@@ -5013,4 +5099,4 @@ export {
5013
5099
  getToolRegistryForAgent,
5014
5100
  createToolRegistry
5015
5101
  };
5016
- //# sourceMappingURL=chunk-SCP5KBNB.js.map
5102
+ //# sourceMappingURL=chunk-5CCM655F.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  SETTINGS_KEYS,
3
3
  getSetting
4
- } from "./chunk-FGVMRFDW.js";
4
+ } from "./chunk-N2Q3KYWM.js";
5
5
 
6
6
  // src/server/utils/platform.ts
7
7
  import os from "os";
@@ -63,4 +63,4 @@ export {
63
63
  isWindowsPath,
64
64
  isAbsolutePath
65
65
  };
66
- //# sourceMappingURL=chunk-EZ67GBEO.js.map
66
+ //# sourceMappingURL=chunk-66MG44TF.js.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  updateSessionMcpDisabledServers
3
- } from "./chunk-SLW3KKPP.js";
3
+ } from "./chunk-AQBRI7TM.js";
4
4
  import {
5
5
  getDatabase
6
- } from "./chunk-NYQKSKDB.js";
6
+ } from "./chunk-OYBUJIC3.js";
7
7
 
8
8
  // src/server/mcp/session-overrides.ts
9
9
  var sessionOverrides = /* @__PURE__ */ new Map();
@@ -62,4 +62,4 @@ export {
62
62
  clearSessionOverrides,
63
63
  getAllSessionOverrides
64
64
  };
65
- //# sourceMappingURL=chunk-YBOU4ZFD.js.map
65
+ //# sourceMappingURL=chunk-7YP4O4XE.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-K2QKX4ZJ.js";
4
4
  import {
5
5
  createLLMClient
6
- } from "./chunk-J77SLE3M.js";
6
+ } from "./chunk-SYTEO5LA.js";
7
7
  import {
8
8
  getModelProfile
9
9
  } from "./chunk-GJL3QSMP.js";
@@ -18,13 +18,18 @@ import {
18
18
  import {
19
19
  resolveAttachmentsInMessages
20
20
  } from "./chunk-MIPQOHWS.js";
21
+ import {
22
+ getCatalogEntry,
23
+ resolveEffortForModel
24
+ } from "./chunk-ISE55FOR.js";
21
25
  import {
22
26
  logger
23
27
  } from "./chunk-K44MW7JJ.js";
24
28
 
25
29
  // src/server/providers/adapters/transport-client.ts
26
- function createTransportLLMClient(provider, modelId, transport) {
30
+ function createTransportLLMClient(provider, modelId, transport, reasoningEffort) {
27
31
  let model = modelId;
32
+ const effort = reasoningEffort;
28
33
  let backend = provider.backend;
29
34
  const profileFor = (id) => {
30
35
  const base = getModelProfile(id);
@@ -50,6 +55,26 @@ function createTransportLLMClient(provider, modelId, transport) {
50
55
  ...provider.credentialRef && { credentialRef: provider.credentialRef }
51
56
  };
52
57
  };
58
+ const resolveEffort = (request) => {
59
+ if (request.skipClientReasoningEffort) return void 0;
60
+ const configured = provider.models.find((item) => item.id === model);
61
+ const candidate = request.reasoningEffort ?? effort;
62
+ return resolveEffortForModel({
63
+ ...configured?.reasoningEfforts?.length ? { reasoningEfforts: configured.reasoningEfforts } : {},
64
+ ...candidate ? { candidate } : {},
65
+ ...configured?.thinkingEnabled && configured.thinkingLevel ? { defaultEffort: configured.thinkingLevel } : {},
66
+ ...configured?.reasoningEffortOverride ? { override: configured.reasoningEffortOverride } : {}
67
+ });
68
+ };
69
+ const resolveRequest = async (request) => {
70
+ const supportsVision = request.modelSettings?.supportsVision ?? profile.supportsVision ?? false;
71
+ const resolvedEffort = resolveEffort(request);
72
+ return {
73
+ ...request,
74
+ messages: await resolveAttachmentsInMessages(request.messages, supportsVision),
75
+ ...resolvedEffort ? { reasoningEffort: resolvedEffort } : {}
76
+ };
77
+ };
53
78
  return {
54
79
  getModel: () => model,
55
80
  setModel(next) {
@@ -61,15 +86,10 @@ function createTransportLLMClient(provider, modelId, transport) {
61
86
  setBackend(next) {
62
87
  backend = next;
63
88
  },
64
- complete: async (request) => {
65
- const supportsVision = request.modelSettings?.supportsVision ?? profile.supportsVision ?? false;
66
- const resolved = { ...request, messages: await resolveAttachmentsInMessages(request.messages, supportsVision) };
67
- return transport.complete(resolved, context());
68
- },
89
+ getReasoningEffort: () => resolveEffort({}),
90
+ complete: async (request) => transport.complete(await resolveRequest(request), context()),
69
91
  stream: async function* (request) {
70
- const supportsVision = request.modelSettings?.supportsVision ?? profile.supportsVision ?? false;
71
- const resolved = { ...request, messages: await resolveAttachmentsInMessages(request.messages, supportsVision) };
72
- yield* transport.stream(resolved, context());
92
+ yield* transport.stream(await resolveRequest(request), context());
73
93
  }
74
94
  };
75
95
  }
@@ -212,6 +232,16 @@ function enrichWithProfileDefaults(model) {
212
232
  defaultMaxTokens: profile.defaultMaxTokens
213
233
  };
214
234
  }
235
+ function enrichWithCatalogDefaults(model) {
236
+ const entry = getCatalogEntry(model.id);
237
+ if (!entry) return model;
238
+ return {
239
+ ...model,
240
+ // Only fill a genuinely-unset list. An explicitly-empty list (user cleared
241
+ // all presets) is preserved so the model shows no chips.
242
+ ...model.reasoningEfforts !== void 0 ? {} : { reasoningEfforts: entry.reasoningEfforts }
243
+ };
244
+ }
215
245
  function mergeModelsWithUserOverrides(backendModels, userModels, preserveMissingUserModels = true) {
216
246
  const normalizedUserIdMap = new Map(userModels.map((m) => [normalizeModelId(m.id), m]));
217
247
  const updatedModels = backendModels.map((backendModel) => {
@@ -378,16 +408,19 @@ function createProviderManager(config, options = {}) {
378
408
  for (const p of providers) {
379
409
  providerStatus.set(p.id, "unknown");
380
410
  }
381
- function resolveModelThinkingConfig(provider, modelId) {
411
+ function resolveModelThinkingConfig(provider, modelId, explicitEffort) {
382
412
  const modelConfig = provider.models.find((m) => m.id === modelId);
383
413
  if (!modelConfig) return {};
384
- if (modelConfig.thinkingEnabled && modelConfig.thinkingLevel) {
385
- return { reasoningEffort: modelConfig.thinkingLevel };
386
- }
387
- return {};
414
+ const effort = resolveEffortForModel({
415
+ ...modelConfig.reasoningEfforts?.length ? { reasoningEfforts: modelConfig.reasoningEfforts } : {},
416
+ ...explicitEffort ? { candidate: explicitEffort } : {},
417
+ ...modelConfig.thinkingEnabled && modelConfig.thinkingLevel ? { defaultEffort: modelConfig.thinkingLevel } : {},
418
+ ...modelConfig.reasoningEffortOverride ? { override: modelConfig.reasoningEffortOverride } : {}
419
+ });
420
+ return effort ? { reasoningEffort: effort } : {};
388
421
  }
389
- function createConfigForProvider(provider, model) {
390
- const modelThinking = resolveModelThinkingConfig(provider, model);
422
+ function createConfigForProvider(provider, model, reasoningEffort) {
423
+ const modelThinking = resolveModelThinkingConfig(provider, model, reasoningEffort);
391
424
  return {
392
425
  ...config,
393
426
  llm: {
@@ -420,10 +453,10 @@ function createProviderManager(config, options = {}) {
420
453
  }
421
454
  return provider.models.find((m) => m.selected)?.id ?? provider.models[0]?.id ?? requestedModel ?? "auto";
422
455
  }
423
- function createClientForProvider(provider, model) {
456
+ function createClientForProvider(provider, model, reasoningEffort) {
424
457
  const resolvedModel = resolveProviderModel(provider, model);
425
458
  const transport = options.adapters?.getTransport(resolveTransportAdapter(provider));
426
- return transport ? createTransportLLMClient(provider, resolvedModel, transport) : createLLMClient(createConfigForProvider(provider, resolvedModel));
459
+ return transport ? createTransportLLMClient(provider, resolvedModel, transport, reasoningEffort) : createLLMClient(createConfigForProvider(provider, resolvedModel, reasoningEffort));
427
460
  }
428
461
  async function fetchProviderModels(provider) {
429
462
  const transport = options.adapters?.getTransport(resolveTransportAdapter(provider));
@@ -444,9 +477,9 @@ function createProviderManager(config, options = {}) {
444
477
  }
445
478
  }
446
479
  return {
447
- createClient(providerId, model) {
480
+ createClient(providerId, model, reasoningEffort) {
448
481
  const provider = providers.find((p) => p.id === providerId);
449
- return provider ? createClientForProvider(provider, model) : void 0;
482
+ return provider ? createClientForProvider(provider, model, reasoningEffort) : void 0;
450
483
  },
451
484
  resolveModel(providerId, model) {
452
485
  const provider = providers.find((p) => p.id === providerId);
@@ -455,7 +488,8 @@ function createProviderManager(config, options = {}) {
455
488
  getProviders() {
456
489
  return providers.map((p) => ({
457
490
  ...p,
458
- status: providerStatus.get(p.id) ?? "unknown"
491
+ status: providerStatus.get(p.id) ?? "unknown",
492
+ models: p.models.map(enrichWithCatalogDefaults)
459
493
  }));
460
494
  },
461
495
  getActiveProvider() {
@@ -697,6 +731,8 @@ function createProviderManager(config, options = {}) {
697
731
  ...finalSupportsVision !== void 0 && { supportsVision: finalSupportsVision },
698
732
  ...settings.thinkingEnabled !== void 0 ? { thinkingEnabled: settings.thinkingEnabled } : existingModel?.thinkingEnabled !== void 0 ? { thinkingEnabled: existingModel.thinkingEnabled } : {},
699
733
  ...settings.thinkingLevel !== void 0 ? { thinkingLevel: settings.thinkingLevel } : existingModel?.thinkingLevel !== void 0 ? { thinkingLevel: existingModel.thinkingLevel } : {},
734
+ ...settings.reasoningEfforts !== void 0 ? { reasoningEfforts: settings.reasoningEfforts } : existingModel?.reasoningEfforts !== void 0 ? { reasoningEfforts: existingModel.reasoningEfforts } : {},
735
+ ...settings.reasoningEffortOverride !== void 0 ? { reasoningEffortOverride: settings.reasoningEffortOverride } : existingModel?.reasoningEffortOverride !== void 0 ? { reasoningEffortOverride: existingModel.reasoningEffortOverride } : {},
700
736
  ...settings.nonThinkingEnabled !== void 0 ? { nonThinkingEnabled: settings.nonThinkingEnabled } : existingModel?.nonThinkingEnabled !== void 0 ? { nonThinkingEnabled: existingModel.nonThinkingEnabled } : {},
701
737
  ...settings.thinkingExtraKwargs !== void 0 ? { thinkingExtraKwargs: settings.thinkingExtraKwargs } : existingModel?.thinkingExtraKwargs !== void 0 ? { thinkingExtraKwargs: existingModel.thinkingExtraKwargs } : {},
702
738
  ...settings.nonThinkingExtraKwargs !== void 0 ? { nonThinkingExtraKwargs: settings.nonThinkingExtraKwargs } : existingModel?.nonThinkingExtraKwargs !== void 0 ? { nonThinkingExtraKwargs: existingModel.nonThinkingExtraKwargs } : {},
@@ -805,4 +841,4 @@ export {
805
841
  parseDefaultModelSelection,
806
842
  createProviderManager
807
843
  };
808
- //# sourceMappingURL=chunk-UJRWYZHM.js.map
844
+ //# sourceMappingURL=chunk-A6EZBX62.js.map