zelari-code 1.38.0 → 1.42.0

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 (38) hide show
  1. package/dist/cli/budget/llmCompact.js +97 -83
  2. package/dist/cli/budget/llmCompact.js.map +1 -1
  3. package/dist/cli/budget/requestMeter.js +138 -0
  4. package/dist/cli/budget/requestMeter.js.map +1 -0
  5. package/dist/cli/budget/requestSnapshotStore.js +55 -0
  6. package/dist/cli/budget/requestSnapshotStore.js.map +1 -0
  7. package/dist/cli/budget/tokenBudget.js +147 -15
  8. package/dist/cli/budget/tokenBudget.js.map +1 -1
  9. package/dist/cli/desktopConfig.js +8 -2
  10. package/dist/cli/desktopConfig.js.map +1 -1
  11. package/dist/cli/hooks/conversationContext.js +4 -0
  12. package/dist/cli/hooks/conversationContext.js.map +1 -1
  13. package/dist/cli/hooks/historyCompaction.js +76 -21
  14. package/dist/cli/hooks/historyCompaction.js.map +1 -1
  15. package/dist/cli/hooks/useChatTurn.js +90 -23
  16. package/dist/cli/hooks/useChatTurn.js.map +1 -1
  17. package/dist/cli/main.bundled.js +718 -297
  18. package/dist/cli/main.bundled.js.map +4 -4
  19. package/dist/cli/modelDiscovery.js +22 -33
  20. package/dist/cli/modelDiscovery.js.map +1 -1
  21. package/dist/cli/oauthDesktop.js +3 -3
  22. package/dist/cli/provider/anthropic.js +1 -1
  23. package/dist/cli/provider/anthropic.js.map +1 -1
  24. package/dist/cli/provider/chatgpt.js +1 -1
  25. package/dist/cli/provider/chatgpt.js.map +1 -1
  26. package/dist/cli/provider/openai-compatible.js +12 -2
  27. package/dist/cli/provider/openai-compatible.js.map +1 -1
  28. package/dist/cli/providerConfig.js +5 -5
  29. package/dist/cli/providerConfig.js.map +1 -1
  30. package/dist/cli/slashHandlers/provider.js +3 -3
  31. package/dist/cli/slashHandlers/provider.js.map +1 -1
  32. package/dist/cli/thinking.js +102 -43
  33. package/dist/cli/thinking.js.map +1 -1
  34. package/dist/cli/thinking.test.js +125 -4
  35. package/dist/cli/thinking.test.js.map +1 -1
  36. package/dist/cli/thinkingCapability.js +160 -0
  37. package/dist/cli/thinkingCapability.js.map +1 -0
  38. package/package.json +2 -2
@@ -1,37 +1,77 @@
1
1
  /**
2
2
  * thinking — unified "thinking effort" selection for all providers.
3
3
  *
4
- * ADR-0017. A single `ThinkingSpec` abstraction is translated, per provider,
5
- * into the vendor-specific request parameters that control how much the model
6
- * reasons before answering:
4
+ * ADR-0017. A single `ThinkingSpec` abstraction is translated, per provider
5
+ * (and, when known, per model), into the vendor-specific request parameters
6
+ * that control how much the model reasons before answering:
7
7
  *
8
- * - OpenAI / xAI → `reasoning_effort` enum (low/medium/high).
9
- * - Anthropic / GLM → `thinking` block (enabled + budget_tokens, or disabled).
8
+ * - OpenAI / xAI → `reasoning_effort` enum (low/medium/high/xhigh).
9
+ * - ChatGPT Responses → `reasoning.effort` (low/medium/high/xhigh/max).
10
+ * - Anthropic → `thinking` budget block, or `output_config.effort` on 4.6+.
11
+ * - GLM-4.x → `thinking` budget block; GLM-5.x → `reasoning_effort` + toggle.
10
12
  * - DeepSeek → `thinking` toggle + `reasoning_effort` (high/max).
11
- * - OpenAI Responses (ChatGPT) → `reasoning.effort`.
12
13
  *
13
14
  * Any unsupported combination degrades to `'auto'` (no parameter sent → the
14
15
  * provider default) with a `degraded: true` flag + a human-readable `note`,
15
- * never an error. This keeps the UI honest and the wire safe even as vendor
16
- * APIs drift.
16
+ * never an error. Levels that exist on the family but not on this model are
17
+ * *clamped* to the nearest native value (still sent) instead of dropped.
17
18
  */
19
+ import { THINKING_EFFORTS, thinkingCapabilityFor, effortLevelsFor, grokHasXhigh, gptHasXhigh, gptHasMax, claudeHasMax, claudeHasXhigh, glmHasEffortScale, thinkingSelectOptions, } from './thinkingCapability.js';
20
+ export { THINKING_EFFORTS, thinkingCapabilityFor, effortLevelsFor, grokHasXhigh, gptHasXhigh, gptHasMax, claudeHasMax, claudeHasXhigh, glmHasEffortScale, thinkingSelectOptions, };
18
21
  /**
19
22
  * Capability table (per ADR-0017). Effort = reasoning_effort enum; budget =
20
- * budget_tokens block. DeepSeek exposes an effort enum (high/max) + a toggle,
21
- * so it is `effort` here; GLM takes an Anthropic-style `thinking` budget block.
23
+ * budget_tokens block. Extra native levels (xhigh/max) are model-gated via
24
+ * `effortLevelsFor`.
22
25
  */
23
26
  export const PROVIDER_THINKING_CAPABILITY = {
24
27
  'openai-compatible': { effort: true },
25
- 'grok': { effort: true },
26
- 'chatgpt': { effort: true },
27
- 'anthropic': { budget: true },
28
- 'glm': { budget: true },
29
- 'deepseek': { effort: true },
30
- 'minimax': { effort: true },
31
- 'custom': { effort: true },
28
+ grok: { effort: true },
29
+ chatgpt: { effort: true },
30
+ anthropic: { budget: true },
31
+ glm: { budget: true },
32
+ deepseek: { effort: true },
33
+ minimax: { effort: true },
34
+ custom: { effort: true },
32
35
  };
33
- export function thinkingCapabilityFor(id) {
34
- return PROVIDER_THINKING_CAPABILITY[id] ?? {};
36
+ const EFFORT_RANK = {
37
+ low: 1,
38
+ medium: 2,
39
+ high: 3,
40
+ xhigh: 4,
41
+ max: 5,
42
+ };
43
+ /**
44
+ * Clamp a requested effort to the nearest native level for this model.
45
+ * Returns the original value when it is already native.
46
+ */
47
+ export function clampEffort(id, model, requested) {
48
+ const native = effortLevelsFor(id, model);
49
+ if (native.includes(requested)) {
50
+ return { effort: requested, clamped: false };
51
+ }
52
+ if (native.length === 0) {
53
+ return {
54
+ effort: requested,
55
+ clamped: true,
56
+ note: `thinking '${requested}' is not supported for provider "${id}"`,
57
+ };
58
+ }
59
+ const want = EFFORT_RANK[requested];
60
+ let best = native[0];
61
+ let bestDist = Math.abs(EFFORT_RANK[best] - want);
62
+ for (const level of native) {
63
+ const dist = Math.abs(EFFORT_RANK[level] - want);
64
+ if (dist < bestDist || (dist === bestDist && EFFORT_RANK[level] > EFFORT_RANK[best])) {
65
+ best = level;
66
+ bestDist = dist;
67
+ }
68
+ }
69
+ const label = model ? `${id}/${model}` : id;
70
+ return {
71
+ effort: best,
72
+ clamped: true,
73
+ note: `'${requested}' is not native on ${label} — using '${best}'`,
74
+ };
35
75
  }
36
76
  /** Canonical string form used for persistence + CLI/slash surfaces. */
37
77
  export function stringifyThinkingSpec(spec) {
@@ -50,8 +90,9 @@ export function parseThinkingSpec(raw) {
50
90
  return 'auto';
51
91
  if (s === 'off')
52
92
  return { kind: 'off' };
53
- if (s === 'low' || s === 'medium' || s === 'high')
93
+ if (THINKING_EFFORTS.includes(s)) {
54
94
  return { kind: 'effort', effort: s };
95
+ }
55
96
  const m = /^budget:(\d+)$/.exec(s);
56
97
  if (m) {
57
98
  const n = Number.parseInt(m[1], 10);
@@ -63,47 +104,57 @@ export function parseThinkingSpec(raw) {
63
104
  /** Strict validity check for interactive surfaces (distinguishes 'auto' from garbage). */
64
105
  export function isValidThinkingInput(raw) {
65
106
  const s = raw.trim().toLowerCase();
66
- if (s === 'auto' || s === 'off' || s === 'low' || s === 'medium' || s === 'high')
107
+ if (s === 'auto' || s === 'off')
108
+ return true;
109
+ if (THINKING_EFFORTS.includes(s))
67
110
  return true;
68
111
  return /^budget:\d+$/.test(s) && Number.parseInt(s.slice(7), 10) > 0;
69
112
  }
70
113
  function degrade(note) {
71
114
  return { patch: {}, degraded: true, note };
72
115
  }
116
+ function withClampNote(patch, clamped, note) {
117
+ return { patch, degraded: false, note: clamped ? note : undefined };
118
+ }
73
119
  /**
74
120
  * OpenAI chat.completions adapter (grok, glm, minimax, deepseek,
75
121
  * openai-compatible, custom). Maps a ThinkingSpec to the fields the
76
122
  * chat.completions body accepts.
77
123
  */
78
- export function translateOpenAiCompatibleThinking(providerId, spec) {
124
+ export function translateOpenAiCompatibleThinking(providerId, spec, model) {
79
125
  if (spec === 'auto')
80
126
  return { patch: {}, degraded: false };
81
- const cap = thinkingCapabilityFor(providerId);
127
+ const cap = thinkingCapabilityFor(providerId, model);
82
128
  switch (spec.kind) {
83
129
  case 'off':
84
- // Providers with a thinking toggle disable it; effort-enum providers
85
- // have no true "off" — degrade to the cheapest effort instead.
86
130
  if (providerId === 'deepseek' || providerId === 'glm') {
87
131
  return { patch: { thinking: { type: 'disabled' } }, degraded: false };
88
132
  }
89
133
  if (cap.effort)
90
134
  return { patch: { reasoning_effort: 'low' }, degraded: false };
91
135
  return degrade(`thinking 'off' is not supported for provider "${providerId}"`);
92
- case 'effort':
93
- if (!cap.effort) {
136
+ case 'effort': {
137
+ if (!cap.effort && !cap.efforts?.length) {
94
138
  return degrade(`thinking 'effort' is not supported for provider "${providerId}"`);
95
139
  }
140
+ const resolved = clampEffort(providerId, model, spec.effort);
96
141
  if (providerId === 'deepseek') {
97
- // DeepSeek only distinguishes high/max; collapse low/medium → high.
98
- return {
99
- patch: {
100
- thinking: { type: 'enabled' },
101
- reasoning_effort: spec.effort === 'high' ? 'max' : 'high',
102
- },
103
- degraded: false,
104
- };
142
+ return withClampNote({
143
+ thinking: { type: 'enabled' },
144
+ reasoning_effort: resolved.effort === 'max' ? 'max' : 'high',
145
+ }, resolved.clamped, resolved.note);
105
146
  }
106
- return { patch: { reasoning_effort: spec.effort }, degraded: false };
147
+ if (providerId === 'glm') {
148
+ if (!glmHasEffortScale(model)) {
149
+ return degrade(`thinking 'effort' is not supported for GLM ${model || '4.x'} — use budget:N`);
150
+ }
151
+ return withClampNote({
152
+ thinking: { type: 'enabled' },
153
+ reasoning_effort: resolved.effort,
154
+ }, resolved.clamped, resolved.note);
155
+ }
156
+ return withClampNote({ reasoning_effort: resolved.effort }, resolved.clamped, resolved.note);
157
+ }
107
158
  case 'budget':
108
159
  if (!cap.budget) {
109
160
  return degrade(`thinking 'budget' is not supported for provider "${providerId}"`);
@@ -115,21 +166,23 @@ export function translateOpenAiCompatibleThinking(providerId, spec) {
115
166
  }
116
167
  }
117
168
  /** OpenAI Responses adapter (chatgpt). */
118
- export function translateResponsesThinking(spec) {
169
+ export function translateResponsesThinking(spec, model) {
119
170
  if (spec === 'auto')
120
171
  return { patch: {}, degraded: false };
121
172
  switch (spec.kind) {
122
173
  case 'off':
123
174
  // Responses API has no hard off; 'minimal' is the cheapest effort.
124
175
  return { patch: { reasoning: { effort: 'minimal' } }, degraded: false };
125
- case 'effort':
126
- return { patch: { reasoning: { effort: spec.effort } }, degraded: false };
176
+ case 'effort': {
177
+ const resolved = clampEffort('chatgpt', model, spec.effort);
178
+ return withClampNote({ reasoning: { effort: resolved.effort } }, resolved.clamped, resolved.note);
179
+ }
127
180
  case 'budget':
128
- return degrade('thinking "budget" is not supported for chatgpt — use low/medium/high');
181
+ return degrade('thinking "budget" is not supported for chatgpt — use low/medium/high/xhigh/max');
129
182
  }
130
183
  }
131
184
  /** Anthropic Messages adapter. */
132
- export function translateAnthropicThinking(spec) {
185
+ export function translateAnthropicThinking(spec, model) {
133
186
  if (spec === 'auto')
134
187
  return { patch: {}, degraded: false };
135
188
  switch (spec.kind) {
@@ -140,8 +193,14 @@ export function translateAnthropicThinking(spec) {
140
193
  patch: { thinking: { type: 'enabled', budget_tokens: spec.budgetTokens } },
141
194
  degraded: false,
142
195
  };
143
- case 'effort':
144
- return degrade('thinking "effort" is not supported for anthropic — use budget:N');
196
+ case 'effort': {
197
+ const levels = effortLevelsFor('anthropic', model);
198
+ if (levels.length === 0) {
199
+ return degrade('thinking "effort" is not supported for this Claude model — use budget:N');
200
+ }
201
+ const resolved = clampEffort('anthropic', model, spec.effort);
202
+ return withClampNote({ output_config: { effort: resolved.effort } }, resolved.clamped, resolved.note);
203
+ }
145
204
  }
146
205
  }
147
206
  //# sourceMappingURL=thinking.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"thinking.js","sourceRoot":"","sources":["../../src/cli/thinking.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"thinking.js","sourceRoot":"","sources":["../../src/cli/thinking.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect } from 'vitest';
2
- import { parseThinkingSpec, stringifyThinkingSpec, isValidThinkingInput, thinkingCapabilityFor, translateOpenAiCompatibleThinking, translateResponsesThinking, translateAnthropicThinking, } from './thinking.js';
2
+ import { parseThinkingSpec, stringifyThinkingSpec, isValidThinkingInput, thinkingCapabilityFor, effortLevelsFor, thinkingSelectOptions, clampEffort, translateOpenAiCompatibleThinking, translateResponsesThinking, translateAnthropicThinking, } from './thinking.js';
3
3
  describe('parseThinkingSpec', () => {
4
4
  it('maps canonical strings', () => {
5
5
  expect(parseThinkingSpec('auto')).toBe('auto');
@@ -7,6 +7,8 @@ describe('parseThinkingSpec', () => {
7
7
  expect(parseThinkingSpec('off')).toEqual({ kind: 'off' });
8
8
  expect(parseThinkingSpec('low')).toEqual({ kind: 'effort', effort: 'low' });
9
9
  expect(parseThinkingSpec('high')).toEqual({ kind: 'effort', effort: 'high' });
10
+ expect(parseThinkingSpec('xhigh')).toEqual({ kind: 'effort', effort: 'xhigh' });
11
+ expect(parseThinkingSpec('max')).toEqual({ kind: 'effort', effort: 'max' });
10
12
  expect(parseThinkingSpec('budget:16000')).toEqual({ kind: 'budget', budgetTokens: 16000 });
11
13
  });
12
14
  it('degrades unknown input to auto (never throws)', () => {
@@ -18,6 +20,8 @@ describe('parseThinkingSpec', () => {
18
20
  describe('stringifyThinkingSpec / isValidThinkingInput', () => {
19
21
  it('round-trips', () => {
20
22
  expect(stringifyThinkingSpec(parseThinkingSpec('high'))).toBe('high');
23
+ expect(stringifyThinkingSpec(parseThinkingSpec('xhigh'))).toBe('xhigh');
24
+ expect(stringifyThinkingSpec(parseThinkingSpec('max'))).toBe('max');
21
25
  expect(stringifyThinkingSpec(parseThinkingSpec('budget:16000'))).toBe('budget:16000');
22
26
  expect(stringifyThinkingSpec('auto')).toBe('auto');
23
27
  });
@@ -25,18 +29,84 @@ describe('stringifyThinkingSpec / isValidThinkingInput', () => {
25
29
  expect(isValidThinkingInput('auto')).toBe(true);
26
30
  expect(isValidThinkingInput('off')).toBe(true);
27
31
  expect(isValidThinkingInput('medium')).toBe(true);
32
+ expect(isValidThinkingInput('xhigh')).toBe(true);
33
+ expect(isValidThinkingInput('max')).toBe(true);
28
34
  expect(isValidThinkingInput('budget:16000')).toBe(true);
29
35
  expect(isValidThinkingInput('garbage')).toBe(false);
30
36
  expect(isValidThinkingInput('budget:0')).toBe(false);
31
37
  });
32
38
  });
33
- describe('thinkingCapabilityFor', () => {
39
+ describe('thinkingCapabilityFor / effortLevelsFor', () => {
34
40
  it('flags effort vs budget providers', () => {
35
41
  expect(thinkingCapabilityFor('grok').effort).toBe(true);
36
42
  expect(thinkingCapabilityFor('anthropic').budget).toBe(true);
37
43
  expect(thinkingCapabilityFor('glm').budget).toBe(true);
38
44
  expect(thinkingCapabilityFor('deepseek').effort).toBe(true);
39
45
  });
46
+ it('gates xhigh/max on the model family', () => {
47
+ expect(effortLevelsFor('grok', 'grok-4.5')).toEqual(['low', 'medium', 'high']);
48
+ expect(effortLevelsFor('grok', 'grok-4.6')).toEqual(['low', 'medium', 'high', 'xhigh']);
49
+ expect(effortLevelsFor('chatgpt', 'gpt-5.2-codex')).toEqual(['low', 'medium', 'high']);
50
+ expect(effortLevelsFor('chatgpt', 'gpt-5.4')).toEqual(['low', 'medium', 'high', 'xhigh']);
51
+ expect(effortLevelsFor('chatgpt', 'gpt-5.6-codex')).toEqual(['low', 'medium', 'high', 'xhigh', 'max']);
52
+ expect(effortLevelsFor('deepseek', 'deepseek-v4-pro')).toEqual(['high', 'max']);
53
+ expect(effortLevelsFor('anthropic', 'claude-sonnet-4-5')).toEqual([]);
54
+ expect(effortLevelsFor('anthropic', 'claude-sonnet-4-6')).toEqual(['high', 'max']);
55
+ expect(effortLevelsFor('anthropic', 'claude-opus-4-7')).toEqual(['high', 'xhigh', 'max']);
56
+ expect(effortLevelsFor('glm', 'glm-4.6')).toEqual([]);
57
+ expect(effortLevelsFor('glm', 'glm-5.3')).toEqual(['low', 'high', 'max']);
58
+ expect(effortLevelsFor('minimax', 'MiniMax-M2.5')).toEqual(['low', 'medium', 'high']);
59
+ });
60
+ it('exposes native efforts on the capability snapshot', () => {
61
+ expect(thinkingCapabilityFor('grok', 'grok-4.6').efforts).toContain('xhigh');
62
+ expect(thinkingCapabilityFor('chatgpt', 'gpt-5.6').efforts).toContain('max');
63
+ expect(thinkingCapabilityFor('anthropic', 'claude-sonnet-4-6').effort).toBe(true);
64
+ expect(thinkingCapabilityFor('anthropic', 'claude-sonnet-4-6').budget).toBe(true);
65
+ expect(thinkingCapabilityFor('glm', 'glm-5.3').budget).toBe(false);
66
+ expect(thinkingCapabilityFor('glm', 'glm-5.3').effort).toBe(true);
67
+ });
68
+ });
69
+ describe('thinkingSelectOptions', () => {
70
+ it('shows xHigh for grok-4.6 and not grok-4.5', () => {
71
+ const v46 = thinkingSelectOptions('grok', 'grok-4.6').map((o) => o.value);
72
+ const v45 = thinkingSelectOptions('grok', 'grok-4.5').map((o) => o.value);
73
+ expect(v46).toEqual(['auto', 'off', 'low', 'medium', 'high', 'xhigh']);
74
+ expect(v45).toEqual(['auto', 'off', 'low', 'medium', 'high']);
75
+ });
76
+ it('shows Max (not Low/Medium) for DeepSeek regardless of model id', () => {
77
+ const v = thinkingSelectOptions('deepseek', 'deepseek-v4-flash').map((o) => o.value);
78
+ expect(v).toEqual(['auto', 'off', 'high', 'max']);
79
+ expect(v).not.toContain('low');
80
+ expect(v).not.toContain('medium');
81
+ });
82
+ it('shows xHigh+Max for gpt-5.6-codex', () => {
83
+ const v = thinkingSelectOptions('chatgpt', 'gpt-5.6-codex').map((o) => o.value);
84
+ expect(v).toContain('xhigh');
85
+ expect(v).toContain('max');
86
+ });
87
+ });
88
+ describe('clampEffort', () => {
89
+ it('keeps native levels', () => {
90
+ expect(clampEffort('grok', 'grok-4.6', 'xhigh')).toEqual({
91
+ effort: 'xhigh',
92
+ clamped: false,
93
+ });
94
+ });
95
+ it('clamps xhigh on grok-4.5 to high', () => {
96
+ const r = clampEffort('grok', 'grok-4.5', 'xhigh');
97
+ expect(r.effort).toBe('high');
98
+ expect(r.clamped).toBe(true);
99
+ });
100
+ it('clamps xhigh on glm-5.3 to max', () => {
101
+ const r = clampEffort('glm', 'glm-5.3', 'xhigh');
102
+ expect(r.effort).toBe('max');
103
+ expect(r.clamped).toBe(true);
104
+ });
105
+ it('clamps low on deepseek to high', () => {
106
+ const r = clampEffort('deepseek', 'deepseek-v4-pro', 'low');
107
+ expect(r.effort).toBe('high');
108
+ expect(r.clamped).toBe(true);
109
+ });
40
110
  });
41
111
  describe('translateOpenAiCompatibleThinking', () => {
42
112
  it('auto → empty patch', () => {
@@ -50,6 +120,37 @@ describe('translateOpenAiCompatibleThinking', () => {
50
120
  expect(translateOpenAiCompatibleThinking('grok', { kind: 'effort', effort: 'high' }))
51
121
  .toEqual({ patch: { reasoning_effort: 'high' }, degraded: false });
52
122
  });
123
+ it('xhigh on grok-4.6 is sent native', () => {
124
+ expect(translateOpenAiCompatibleThinking('grok', { kind: 'effort', effort: 'xhigh' }, 'grok-4.6'))
125
+ .toEqual({ patch: { reasoning_effort: 'xhigh' }, degraded: false });
126
+ });
127
+ it('xhigh on grok-4.5 clamps to high (still sent)', () => {
128
+ const r = translateOpenAiCompatibleThinking('grok', { kind: 'effort', effort: 'xhigh' }, 'grok-4.5');
129
+ expect(r.patch).toEqual({ reasoning_effort: 'high' });
130
+ expect(r.degraded).toBe(false);
131
+ expect(r.note).toMatch(/xhigh/);
132
+ });
133
+ it('max on deepseek is sent native', () => {
134
+ expect(translateOpenAiCompatibleThinking('deepseek', { kind: 'effort', effort: 'max' }, 'deepseek-v4-pro'))
135
+ .toEqual({
136
+ patch: { thinking: { type: 'enabled' }, reasoning_effort: 'max' },
137
+ degraded: false,
138
+ });
139
+ });
140
+ it('high on deepseek stays high (max is a separate level)', () => {
141
+ expect(translateOpenAiCompatibleThinking('deepseek', { kind: 'effort', effort: 'high' }))
142
+ .toEqual({
143
+ patch: { thinking: { type: 'enabled' }, reasoning_effort: 'high' },
144
+ degraded: false,
145
+ });
146
+ });
147
+ it('glm-5.3 effort uses reasoning_effort + thinking toggle', () => {
148
+ expect(translateOpenAiCompatibleThinking('glm', { kind: 'effort', effort: 'max' }, 'glm-5.3'))
149
+ .toEqual({
150
+ patch: { thinking: { type: 'enabled' }, reasoning_effort: 'max' },
151
+ degraded: false,
152
+ });
153
+ });
53
154
  it('budget on effort-only providers degrades to auto', () => {
54
155
  const r = translateOpenAiCompatibleThinking('grok', { kind: 'budget', budgetTokens: 1000 });
55
156
  expect(r.degraded).toBe(true);
@@ -73,6 +174,18 @@ describe('translateResponsesThinking', () => {
73
174
  expect(translateResponsesThinking({ kind: 'effort', effort: 'high' }))
74
175
  .toEqual({ patch: { reasoning: { effort: 'high' } }, degraded: false });
75
176
  });
177
+ it('xhigh/max on gpt-5.6 are sent native', () => {
178
+ expect(translateResponsesThinking({ kind: 'effort', effort: 'xhigh' }, 'gpt-5.6'))
179
+ .toEqual({ patch: { reasoning: { effort: 'xhigh' } }, degraded: false });
180
+ expect(translateResponsesThinking({ kind: 'effort', effort: 'max' }, 'gpt-5.6-codex'))
181
+ .toEqual({ patch: { reasoning: { effort: 'max' } }, degraded: false });
182
+ });
183
+ it('max on gpt-5.2 clamps to high', () => {
184
+ const r = translateResponsesThinking({ kind: 'effort', effort: 'max' }, 'gpt-5.2-codex');
185
+ expect(r.patch).toEqual({ reasoning: { effort: 'high' } });
186
+ expect(r.degraded).toBe(false);
187
+ expect(r.note).toMatch(/max/);
188
+ });
76
189
  it('budget → degraded', () => {
77
190
  expect(translateResponsesThinking({ kind: 'budget', budgetTokens: 1000 }).degraded).toBe(true);
78
191
  });
@@ -86,8 +199,16 @@ describe('translateAnthropicThinking', () => {
86
199
  expect(translateAnthropicThinking({ kind: 'budget', budgetTokens: 32000 }))
87
200
  .toEqual({ patch: { thinking: { type: 'enabled', budget_tokens: 32000 } }, degraded: false });
88
201
  });
89
- it('effort → degraded', () => {
90
- expect(translateAnthropicThinking({ kind: 'effort', effort: 'high' }).degraded).toBe(true);
202
+ it('effort on sonnet 4.5 → degraded', () => {
203
+ expect(translateAnthropicThinking({ kind: 'effort', effort: 'high' }, 'claude-sonnet-4-5').degraded).toBe(true);
204
+ });
205
+ it('effort on sonnet 4.6 → output_config.effort', () => {
206
+ expect(translateAnthropicThinking({ kind: 'effort', effort: 'max' }, 'claude-sonnet-4-6'))
207
+ .toEqual({ patch: { output_config: { effort: 'max' } }, degraded: false });
208
+ });
209
+ it('xhigh on opus 4.7 is native', () => {
210
+ expect(translateAnthropicThinking({ kind: 'effort', effort: 'xhigh' }, 'claude-opus-4-7'))
211
+ .toEqual({ patch: { output_config: { effort: 'xhigh' } }, degraded: false });
91
212
  });
92
213
  });
93
214
  //# sourceMappingURL=thinking.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"thinking.test.js","sourceRoot":"","sources":["../../src/cli/thinking.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"thinking.test.js","sourceRoot":"","sources":["../../src/cli/thinking.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,160 @@
1
+ /**
2
+ * thinkingCapability — browser-safe table of native thinking levels.
3
+ *
4
+ * Kept free of Node / keyStore so Desktop can import it and compute the
5
+ * Thinking dropdown from the *selected* model, not the snapshot default.
6
+ */
7
+ export const THINKING_EFFORTS = [
8
+ 'low',
9
+ 'medium',
10
+ 'high',
11
+ 'xhigh',
12
+ 'max',
13
+ ];
14
+ const BASE_EFFORTS = ['low', 'medium', 'high'];
15
+ const PROVIDER_THINKING_CAPABILITY = {
16
+ 'openai-compatible': { effort: true },
17
+ grok: { effort: true },
18
+ chatgpt: { effort: true },
19
+ anthropic: { budget: true },
20
+ glm: { budget: true },
21
+ deepseek: { effort: true },
22
+ minimax: { effort: true },
23
+ custom: { effort: true },
24
+ };
25
+ export function thinkingCapabilityFor(id, model) {
26
+ const base = PROVIDER_THINKING_CAPABILITY[id] ?? {};
27
+ const efforts = effortLevelsFor(id, model);
28
+ const budget = supportsBudget(id, model);
29
+ return {
30
+ ...base,
31
+ effort: efforts.length > 0 || Boolean(base.effort),
32
+ budget,
33
+ efforts: efforts.length > 0 ? efforts : undefined,
34
+ };
35
+ }
36
+ /** Native effort enum values this (provider, model) accepts on the wire. */
37
+ export function effortLevelsFor(id, model) {
38
+ const m = (model ?? '').trim();
39
+ switch (id) {
40
+ case 'grok':
41
+ case 'openai-compatible':
42
+ case 'custom':
43
+ if (grokHasXhigh(m))
44
+ return [...BASE_EFFORTS, 'xhigh'];
45
+ return [...BASE_EFFORTS];
46
+ case 'chatgpt':
47
+ if (gptHasMax(m))
48
+ return [...BASE_EFFORTS, 'xhigh', 'max'];
49
+ if (gptHasXhigh(m))
50
+ return [...BASE_EFFORTS, 'xhigh'];
51
+ return [...BASE_EFFORTS];
52
+ case 'deepseek':
53
+ return ['high', 'max'];
54
+ case 'minimax':
55
+ return [...BASE_EFFORTS];
56
+ case 'glm':
57
+ if (glmHasEffortScale(m))
58
+ return ['low', 'high', 'max'];
59
+ return [];
60
+ case 'anthropic':
61
+ if (claudeHasXhigh(m))
62
+ return ['high', 'xhigh', 'max'];
63
+ if (claudeHasMax(m))
64
+ return ['high', 'max'];
65
+ return [];
66
+ default:
67
+ return [];
68
+ }
69
+ }
70
+ export function supportsBudget(id, model) {
71
+ if (id === 'anthropic')
72
+ return true;
73
+ if (id === 'glm')
74
+ return !glmHasEffortScale(model);
75
+ return Boolean(PROVIDER_THINKING_CAPABILITY[id]?.budget);
76
+ }
77
+ export function grokHasXhigh(model) {
78
+ const v = parseDottedVersion(model, /grok[-_]?(\d+)(?:[.-](\d+))?/i);
79
+ if (!v)
80
+ return false;
81
+ return v.major > 4 || (v.major === 4 && v.minor >= 6);
82
+ }
83
+ export function gptHasXhigh(model) {
84
+ const v = parseDottedVersion(model, /gpt[-_]?(\d+)(?:[.-](\d+))?/i);
85
+ if (!v)
86
+ return false;
87
+ return v.major > 5 || (v.major === 5 && v.minor >= 4);
88
+ }
89
+ export function gptHasMax(model) {
90
+ const v = parseDottedVersion(model, /gpt[-_]?(\d+)(?:[.-](\d+))?/i);
91
+ if (!v)
92
+ return false;
93
+ return v.major > 5 || (v.major === 5 && v.minor >= 6);
94
+ }
95
+ export function claudeHasMax(model) {
96
+ const v = parseClaudeVersion(model);
97
+ if (!v)
98
+ return false;
99
+ return v.major > 4 || (v.major === 4 && v.minor >= 6);
100
+ }
101
+ export function claudeHasXhigh(model) {
102
+ const v = parseClaudeVersion(model);
103
+ if (!v)
104
+ return false;
105
+ if (v.major >= 5)
106
+ return true;
107
+ return v.major === 4 && v.minor >= 7;
108
+ }
109
+ export function glmHasEffortScale(model) {
110
+ const v = parseDottedVersion(model ?? '', /glm[-_]?(\d+)(?:[.-](\d+))?/i);
111
+ if (!v)
112
+ return false;
113
+ return v.major >= 5;
114
+ }
115
+ function parseDottedVersion(model, re) {
116
+ const m = re.exec(model);
117
+ if (!m)
118
+ return null;
119
+ return {
120
+ major: Number.parseInt(m[1], 10),
121
+ minor: m[2] ? Number.parseInt(m[2], 10) : 0,
122
+ };
123
+ }
124
+ function parseClaudeVersion(model) {
125
+ const m = /claude-(?:sonnet|opus|haiku)[-_]?(\d+)(?:[.-](\d+))?/i.exec(model);
126
+ if (!m)
127
+ return null;
128
+ return {
129
+ major: Number.parseInt(m[1], 10),
130
+ minor: m[2] ? Number.parseInt(m[2], 10) : 0,
131
+ };
132
+ }
133
+ const EFFORT_LABELS = {
134
+ low: 'Low',
135
+ medium: 'Medium',
136
+ high: 'High',
137
+ xhigh: 'xHigh',
138
+ max: 'Max',
139
+ };
140
+ /**
141
+ * Options for the Desktop / CLI thinking picker, computed from the
142
+ * *selected* provider + model. Never falls back to a generic L/M/H list
143
+ * when the provider has a native scale (DeepSeek = high/max).
144
+ */
145
+ export function thinkingSelectOptions(providerId, model) {
146
+ const cap = thinkingCapabilityFor(providerId, model);
147
+ const options = [
148
+ { value: 'auto', label: 'Auto' },
149
+ { value: 'off', label: 'Off' },
150
+ ];
151
+ const levels = cap.efforts ?? [];
152
+ for (const level of levels) {
153
+ options.push({ value: level, label: EFFORT_LABELS[level] ?? level });
154
+ }
155
+ if (cap.budget) {
156
+ options.push({ value: 'budget:4000', label: '4k tokens' }, { value: 'budget:8000', label: '8k tokens' }, { value: 'budget:16000', label: '16k tokens' }, { value: 'budget:32000', label: '32k tokens' });
157
+ }
158
+ return options;
159
+ }
160
+ //# sourceMappingURL=thinkingCapability.js.map