zelari-code 1.38.0 → 1.41.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.
@@ -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