@molecule/app-ide-react 1.9.0 → 1.9.1
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.
- package/dist/command-metadata.js +2 -2
- package/dist/command-metadata.js.map +1 -1
- package/dist/components/ChatPanel.d.ts.map +1 -1
- package/dist/components/ChatPanel.js +285 -34
- package/dist/components/ChatPanel.js.map +1 -1
- package/dist/components/PreviewPanel.d.ts.map +1 -1
- package/dist/components/PreviewPanel.js +25 -1
- package/dist/components/PreviewPanel.js.map +1 -1
- package/dist/components/chat-effort-utilities.d.ts +11 -3
- package/dist/components/chat-effort-utilities.d.ts.map +1 -1
- package/dist/components/chat-effort-utilities.js +5 -3
- package/dist/components/chat-effort-utilities.js.map +1 -1
- package/package.json +2 -2
package/dist/command-metadata.js
CHANGED
|
@@ -142,9 +142,9 @@ export const COMMANDS = [
|
|
|
142
142
|
{
|
|
143
143
|
id: 'effort',
|
|
144
144
|
label: '/effort',
|
|
145
|
-
description: "
|
|
145
|
+
description: "Pick reasoning effort per mode from the model's own levels",
|
|
146
146
|
category: 'model',
|
|
147
|
-
usage: '/effort [--plan|--execute]
|
|
147
|
+
usage: '/effort [--plan|--execute] [level]',
|
|
148
148
|
},
|
|
149
149
|
// Settings
|
|
150
150
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-metadata.js","sourceRoot":"","sources":["../src/command-metadata.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"command-metadata.js","sourceRoot":"","sources":["../src/command-metadata.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatPanel.d.ts","sourceRoot":"","sources":["../../src/components/ChatPanel.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAa,MAAM,OAAO,CAAA;AAY3C,OAAO,KAAK,EAAa,WAAW,EAAmB,MAAM,uBAAuB,CAAA;AAuCpF,OAAO,KAAK,EAAE,cAAc,EAAoB,eAAe,EAAE,MAAM,aAAa,CAAA;AACpF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAevD,OAAO,EAEL,KAAK,UAAU,EAGhB,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"ChatPanel.d.ts","sourceRoot":"","sources":["../../src/components/ChatPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -19,7 +19,7 @@ import { CHAT_CARD_ICON_SIZE, chatCardBorder, chatCardStyle } from './chat-card-
|
|
|
19
19
|
import { COMMAND_CATEGORIES, COMMANDS, matchesSideChannelCommand, } from './chat-commands.js';
|
|
20
20
|
import { stripCommitCoauthorTrailer } from './chat-commit-utilities.js';
|
|
21
21
|
import { cachedPromptTokens, formatTokenTotal } from './chat-cost-utilities.js';
|
|
22
|
-
import { effortOptionsForModel, nativeEffortName, parseEffortCommand, resolveEffortArg, } from './chat-effort-utilities.js';
|
|
22
|
+
import { defaultEffortForModel, effortOptionsForModel, nativeEffortName, parseEffortCommand, resolveEffortArg, } from './chat-effort-utilities.js';
|
|
23
23
|
import { buildHelpText } from './chat-help-utilities.js';
|
|
24
24
|
import { effectiveModeModelId, freeTierLockReason, freeTierUsableMode, isModeModelLocked, modeSettingKey, parseModelModeCommand, resolveModeModel, } from './chat-model-mode-utilities.js';
|
|
25
25
|
import { modelHasPeakPricing, modelPeakMultiplier, modelPeakWindowLabels, modelUsageRate, sortModels, } from './chat-models-utilities.js';
|
|
@@ -1265,19 +1265,39 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
1265
1265
|
const soundsConfigRef = useRef({ ...DEFAULT_SOUNDS_CONFIG });
|
|
1266
1266
|
// ── Context usage tracking (ring indicator) ─────────────────────────────
|
|
1267
1267
|
const [contextUsage, setContextUsage] = useState(null);
|
|
1268
|
-
// Restore context usage from the history endpoint on mount
|
|
1268
|
+
// Restore context usage from the history endpoint on mount. Retries a few
|
|
1269
|
+
// times on failure: this used to be one-shot, so a single transient error at
|
|
1270
|
+
// mount (an API deploy restart, a rate-limit blip) silently cost the context
|
|
1271
|
+
// ring for the entire session — the state only ever refills from the next
|
|
1272
|
+
// turn's `done` event (observed live 2026-08-29: ring gone, server data fine,
|
|
1273
|
+
// reload fixed it).
|
|
1269
1274
|
useEffect(() => {
|
|
1270
1275
|
if (!hasConversation)
|
|
1271
1276
|
return;
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1277
|
+
let cancelled = false;
|
|
1278
|
+
let attempt = 0;
|
|
1279
|
+
const load = () => {
|
|
1280
|
+
http
|
|
1281
|
+
.get(endpoint)
|
|
1282
|
+
.then((res) => {
|
|
1283
|
+
if (cancelled)
|
|
1284
|
+
return;
|
|
1285
|
+
if (res.data.contextUsage)
|
|
1286
|
+
setContextUsage(res.data.contextUsage);
|
|
1287
|
+
})
|
|
1288
|
+
.catch((_error) => {
|
|
1289
|
+
// Transient failure — retry with backoff (bounded); after the budget,
|
|
1290
|
+
// the next turn's done event repopulates the ring.
|
|
1291
|
+
if (cancelled || attempt >= 3)
|
|
1292
|
+
return;
|
|
1293
|
+
attempt++;
|
|
1294
|
+
setTimeout(load, attempt * 4000);
|
|
1295
|
+
});
|
|
1296
|
+
};
|
|
1297
|
+
load();
|
|
1298
|
+
return () => {
|
|
1299
|
+
cancelled = true;
|
|
1300
|
+
};
|
|
1281
1301
|
}, [endpoint, hasConversation, http]);
|
|
1282
1302
|
// ── Auto-fix countdown state ──────────────────────────────────────────────
|
|
1283
1303
|
// After the AI finishes, if verification found errors, show a countdown
|
|
@@ -1919,6 +1939,7 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
1919
1939
|
setIsListening(false);
|
|
1920
1940
|
setCommandMenu(null);
|
|
1921
1941
|
setModelPicker(null);
|
|
1942
|
+
setEffortPicker(null);
|
|
1922
1943
|
setSoundsPicker(null);
|
|
1923
1944
|
setFilePicker(null);
|
|
1924
1945
|
setPanelOverlay(null);
|
|
@@ -2115,6 +2136,7 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
2115
2136
|
// Popups are one-at-a-time — close any sibling before opening the picker
|
|
2116
2137
|
setCommandMenu(null);
|
|
2117
2138
|
setModelPicker(null);
|
|
2139
|
+
setEffortPicker(null);
|
|
2118
2140
|
setSoundsPicker(null);
|
|
2119
2141
|
setFilePicker(null);
|
|
2120
2142
|
setPanelOverlay(null);
|
|
@@ -2155,6 +2177,7 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
2155
2177
|
const [commandMenu, setCommandMenu] = useState(null);
|
|
2156
2178
|
// ── Model picker (shown when typing /model <filter>) ──────────────────────
|
|
2157
2179
|
const [modelPicker, setModelPicker] = useState(null);
|
|
2180
|
+
const [effortPicker, setEffortPicker] = useState(null);
|
|
2158
2181
|
// ── System cards (persistent inline notifications in chat history) ────────
|
|
2159
2182
|
const [systemCards, setSystemCards] = useState([]);
|
|
2160
2183
|
// Bug-report modal — `{ title }` (seed) when open, null when closed. Opened by
|
|
@@ -2519,6 +2542,7 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
2519
2542
|
// Close any sibling popup so overlays never stack (matches how the model
|
|
2520
2543
|
// picker / sounds picker each own this region exclusively).
|
|
2521
2544
|
setModelPicker(null);
|
|
2545
|
+
setEffortPicker(null);
|
|
2522
2546
|
setSoundsPicker(null);
|
|
2523
2547
|
setCommandMenu(null);
|
|
2524
2548
|
setPanelOverlayQuery(query);
|
|
@@ -3591,6 +3615,23 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
3591
3615
|
return;
|
|
3592
3616
|
}
|
|
3593
3617
|
setModelPicker(null);
|
|
3618
|
+
// Show the effort picker while typing "/effort ..." — same live behavior
|
|
3619
|
+
// as /model. Text after the command (minus the --plan/--execute flag)
|
|
3620
|
+
// filters the level list; "?" keeps the textual status path instead. A
|
|
3621
|
+
// dropdown-chosen mode survives further keystrokes unless a flag names one.
|
|
3622
|
+
if (/^\/effort\s/i.test(val)) {
|
|
3623
|
+
const typed = parseEffortCommand(val);
|
|
3624
|
+
if (typed && (typed.kind === 'menu' || (typed.kind === 'set' && typed.arg !== '?'))) {
|
|
3625
|
+
const typedMode = typed.mode;
|
|
3626
|
+
setEffortPicker((p) => ({
|
|
3627
|
+
selectedIdx: -1,
|
|
3628
|
+
mode: typedMode ?? p?.mode ?? liveModelMode,
|
|
3629
|
+
}));
|
|
3630
|
+
setCommandMenu(null);
|
|
3631
|
+
return;
|
|
3632
|
+
}
|
|
3633
|
+
}
|
|
3634
|
+
setEffortPicker(null);
|
|
3594
3635
|
if (val.startsWith('/') && !val.includes(' ')) {
|
|
3595
3636
|
setCommandMenu({ selectedIdx: -1 });
|
|
3596
3637
|
}
|
|
@@ -3686,6 +3727,29 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
3686
3727
|
logger.warn('Failed to update model processing region', { error });
|
|
3687
3728
|
}
|
|
3688
3729
|
}, [http, projectId, modelRegions]);
|
|
3730
|
+
// Persist a mode's reasoning effort (used by both the /effort <level> typed
|
|
3731
|
+
// path and the effort picker). Shallow-merge on the server means we send the
|
|
3732
|
+
// WHOLE effortByMode map, not just the changed entry.
|
|
3733
|
+
const applyEffortLevel = useCallback(async (targetMode, level, targetModel) => {
|
|
3734
|
+
setEffortPicker(null);
|
|
3735
|
+
setInputValue('');
|
|
3736
|
+
try {
|
|
3737
|
+
const nextByMode = { ...effortByMode, [targetMode]: level };
|
|
3738
|
+
await http.patch(settingsPatchUrl(), { settings: { effortByMode: nextByMode } });
|
|
3739
|
+
setEffortByMode(nextByMode);
|
|
3740
|
+
addSystemCard(t('ide.chat.effort.setMode', {
|
|
3741
|
+
mode: targetMode,
|
|
3742
|
+
level: nativeEffortName(targetModel, level) ?? level,
|
|
3743
|
+
model: targetModel?.label ?? '?',
|
|
3744
|
+
}, { defaultValue: 'Reasoning effort for {{mode}} set to {{level}} ({{model}}).' }));
|
|
3745
|
+
}
|
|
3746
|
+
catch (error) {
|
|
3747
|
+
logger.warn('Failed to update reasoning effort level', { error });
|
|
3748
|
+
addSystemCard(t('ide.chat.effort.error', undefined, {
|
|
3749
|
+
defaultValue: 'Failed to update reasoning effort.',
|
|
3750
|
+
}));
|
|
3751
|
+
}
|
|
3752
|
+
}, [http, effortByMode, settingsPatchUrl, addSystemCard]);
|
|
3689
3753
|
// The shared command registry UNION any host-provided commands (e.g.
|
|
3690
3754
|
// molecule.dev's /deploy, /push, /invite, /teamsay), so the menu, grouping,
|
|
3691
3755
|
// and dispatch all see one list and host commands never go missing. Declared
|
|
@@ -3694,11 +3758,12 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
3694
3758
|
const extraCommandIds = useMemo(() => new Set((extraCommands ?? []).map((c) => c.id)), [extraCommands]);
|
|
3695
3759
|
const executeCommand = useCallback(async (id) => {
|
|
3696
3760
|
setCommandMenu(null);
|
|
3697
|
-
// Any command closes every sibling popup (panel overlay, model/
|
|
3698
|
-
// pickers) so popups are strictly one-at-a-time — the branches
|
|
3699
|
-
// re-open their own.
|
|
3761
|
+
// Any command closes every sibling popup (panel overlay, model/effort/
|
|
3762
|
+
// sounds/mic pickers) so popups are strictly one-at-a-time — the branches
|
|
3763
|
+
// below re-open their own.
|
|
3700
3764
|
setPanelOverlay(null);
|
|
3701
3765
|
setModelPicker(null);
|
|
3766
|
+
setEffortPicker(null);
|
|
3702
3767
|
setSoundsPicker(null);
|
|
3703
3768
|
setMicPicker(null);
|
|
3704
3769
|
// Host-provided commands (e.g. molecule.dev's /deploy, /push, /invite,
|
|
@@ -3743,8 +3808,10 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
3743
3808
|
setInputAndCursorEnd('/maxloops ');
|
|
3744
3809
|
}
|
|
3745
3810
|
else if (id === 'effort') {
|
|
3746
|
-
//
|
|
3747
|
-
|
|
3811
|
+
// Open the selectable level picker (mirrors /model) scoped to the live
|
|
3812
|
+
// conversation mode; its mode dropdown re-scopes in place.
|
|
3813
|
+
setInputValue('');
|
|
3814
|
+
setEffortPicker({ selectedIdx: -1, mode: liveModelMode });
|
|
3748
3815
|
}
|
|
3749
3816
|
else if (id === 'autocommit') {
|
|
3750
3817
|
// Prefill so the user types the cadence (seconds); 0 cancels.
|
|
@@ -4255,6 +4322,7 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
4255
4322
|
setPanelOverlay(null);
|
|
4256
4323
|
setCommandMenu(null);
|
|
4257
4324
|
setModelPicker(null);
|
|
4325
|
+
setEffortPicker(null);
|
|
4258
4326
|
setSoundsPicker(null);
|
|
4259
4327
|
setMicPicker({ autoStart: false });
|
|
4260
4328
|
return;
|
|
@@ -4304,6 +4372,18 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
4304
4372
|
const effortCmd = parseEffortCommand(trimmed);
|
|
4305
4373
|
if (effortCmd) {
|
|
4306
4374
|
setInputValue('');
|
|
4375
|
+
// Bare /effort (or a bare --plan/--execute flag) opens the selectable
|
|
4376
|
+
// level picker — same interaction as bare /model. The picker lists the
|
|
4377
|
+
// target mode's model's own levels; its mode dropdown re-scopes in place.
|
|
4378
|
+
if (effortCmd.kind === 'menu') {
|
|
4379
|
+
setPanelOverlay(null);
|
|
4380
|
+
setCommandMenu(null);
|
|
4381
|
+
setModelPicker(null);
|
|
4382
|
+
setSoundsPicker(null);
|
|
4383
|
+
setMicPicker(null);
|
|
4384
|
+
setEffortPicker({ selectedIdx: -1, mode: effortCmd.mode ?? liveModelMode });
|
|
4385
|
+
return;
|
|
4386
|
+
}
|
|
4307
4387
|
// Resolve the model a given mode will actually use — mirrors the /model
|
|
4308
4388
|
// picker + slash-suffix resolveModeModel logic (P2-10: each mode's
|
|
4309
4389
|
// options come from ITS model's reasoning capabilities).
|
|
@@ -4361,22 +4441,7 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
4361
4441
|
}, { defaultValue: "{{level}} isn't available for {{model}}. Available: {{levels}}" }));
|
|
4362
4442
|
return;
|
|
4363
4443
|
}
|
|
4364
|
-
|
|
4365
|
-
const nextByMode = { ...effortByMode, [targetMode]: level };
|
|
4366
|
-
await http.patch(settingsPatchUrl(), { settings: { effortByMode: nextByMode } });
|
|
4367
|
-
setEffortByMode(nextByMode);
|
|
4368
|
-
addSystemCard(t('ide.chat.effort.setMode', {
|
|
4369
|
-
mode: targetMode,
|
|
4370
|
-
level: nativeEffortName(targetModel, level) ?? effortCmd.arg,
|
|
4371
|
-
model: targetModelLabel,
|
|
4372
|
-
}, { defaultValue: 'Reasoning effort for {{mode}} set to {{level}} ({{model}}).' }));
|
|
4373
|
-
}
|
|
4374
|
-
catch (error) {
|
|
4375
|
-
logger.warn('Failed to update reasoning effort level', { error });
|
|
4376
|
-
addSystemCard(t('ide.chat.effort.error', undefined, {
|
|
4377
|
-
defaultValue: 'Failed to update reasoning effort.',
|
|
4378
|
-
}));
|
|
4379
|
-
}
|
|
4444
|
+
await applyEffortLevel(targetMode, level, targetModel);
|
|
4380
4445
|
}
|
|
4381
4446
|
return;
|
|
4382
4447
|
}
|
|
@@ -4530,6 +4595,7 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
4530
4595
|
runSavedScript,
|
|
4531
4596
|
allCommands,
|
|
4532
4597
|
selectModel,
|
|
4598
|
+
applyEffortLevel,
|
|
4533
4599
|
liveModelMode,
|
|
4534
4600
|
]);
|
|
4535
4601
|
// External auto-submit. When the signal changes, submit the current input —
|
|
@@ -4746,6 +4812,43 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
4746
4812
|
? (resolveModeModel({ planModel, executeModel, commitModel, compactModel, chatModel: savedChatModel }, modelPicker.mode) ?? serverModelDefaults?.[modelPicker.mode])
|
|
4747
4813
|
: savedChatModel || undefined
|
|
4748
4814
|
: undefined;
|
|
4815
|
+
// ── Effort picker derived state ─────────────────────────────────────────────
|
|
4816
|
+
// The model whose levels the open /effort picker lists — the model the
|
|
4817
|
+
// selected mode will actually run — plus its selectable options and the level
|
|
4818
|
+
// the "current" pill marks (the persisted per-mode value resolved per-model,
|
|
4819
|
+
// so an unset mode correctly pills the model's own default). Cheap to
|
|
4820
|
+
// recompute per render, mirroring pickerModeOptions above.
|
|
4821
|
+
const effortPickerModel = effortPicker
|
|
4822
|
+
? AVAILABLE_MODELS.find((m) => m.id === effectiveModelForMode(effortPicker.mode))
|
|
4823
|
+
: undefined;
|
|
4824
|
+
const effortPickerOptions = effortOptionsForModel(effortPickerModel);
|
|
4825
|
+
// Typed filter, mirroring filteredModels: the text after "/effort" (minus a
|
|
4826
|
+
// mode flag) narrows the rows, so "/effort xh" + Enter selects xhigh. Read
|
|
4827
|
+
// from inputRef — it stays fresh because each keystroke re-sets effortPicker.
|
|
4828
|
+
const effortPickerVisibleOptions = (() => {
|
|
4829
|
+
if (!effortPicker)
|
|
4830
|
+
return [];
|
|
4831
|
+
const typed = parseEffortCommand(inputRef.current);
|
|
4832
|
+
const q = typed?.kind === 'set' ? typed.arg.toLowerCase() : '';
|
|
4833
|
+
if (!q)
|
|
4834
|
+
return effortPickerOptions;
|
|
4835
|
+
return effortPickerOptions.filter((o) => o.value.toLowerCase().includes(q));
|
|
4836
|
+
})();
|
|
4837
|
+
const effortPickerCurrent = effortPicker
|
|
4838
|
+
? nativeEffortName(effortPickerModel, effortByMode[effortPicker.mode] ?? (effortLevel || undefined))
|
|
4839
|
+
: null;
|
|
4840
|
+
// Mode dropdown rows ("Plan · <model>") — effort exists only for the two
|
|
4841
|
+
// conversation modes, each scoped to ITS model's native levels.
|
|
4842
|
+
const effortPickerModeOptions = ['plan', 'execute'].map((m) => ({
|
|
4843
|
+
value: m,
|
|
4844
|
+
label: t('ide.chat.modelModeOption', {
|
|
4845
|
+
mode: m === 'plan'
|
|
4846
|
+
? t('ide.chat.settings.modePlan', undefined, { defaultValue: 'Plan' })
|
|
4847
|
+
: t('ide.chat.settings.modeExecute', undefined, { defaultValue: 'Execute' }),
|
|
4848
|
+
model: AVAILABLE_MODELS.find((x) => x.id === effectiveModelForMode(m))?.label ??
|
|
4849
|
+
effectiveModelForMode(m),
|
|
4850
|
+
}, { defaultValue: '{{mode}} · {{model}}' }),
|
|
4851
|
+
}));
|
|
4749
4852
|
const filteredEntries = useMemo(() => {
|
|
4750
4853
|
if (!filePicker)
|
|
4751
4854
|
return [];
|
|
@@ -4807,6 +4910,10 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
4807
4910
|
setMicPicker(null);
|
|
4808
4911
|
return;
|
|
4809
4912
|
}
|
|
4913
|
+
if (effortPicker) {
|
|
4914
|
+
setEffortPicker(null);
|
|
4915
|
+
return;
|
|
4916
|
+
}
|
|
4810
4917
|
if (modelPicker) {
|
|
4811
4918
|
setModelPicker(null);
|
|
4812
4919
|
return;
|
|
@@ -4851,6 +4958,43 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
4851
4958
|
return;
|
|
4852
4959
|
}
|
|
4853
4960
|
}
|
|
4961
|
+
// Effort picker: one row per (typed-filter-matching) level of the selected
|
|
4962
|
+
// mode's model. A fixed-reasoning model or an unmatched filter lists
|
|
4963
|
+
// nothing — arrows/Enter fall through (Escape closes; Enter submits the
|
|
4964
|
+
// typed text, so an unknown level still gets the "isn't available" card).
|
|
4965
|
+
if (effortPicker && effortPickerVisibleOptions.length > 0) {
|
|
4966
|
+
if (e.key === 'ArrowDown') {
|
|
4967
|
+
e.preventDefault();
|
|
4968
|
+
setEffortPicker((p) => p
|
|
4969
|
+
? { ...p, selectedIdx: wrapIdx(p.selectedIdx, 1, effortPickerVisibleOptions.length) }
|
|
4970
|
+
: null);
|
|
4971
|
+
return;
|
|
4972
|
+
}
|
|
4973
|
+
if (e.key === 'ArrowUp') {
|
|
4974
|
+
e.preventDefault();
|
|
4975
|
+
setEffortPicker((p) => p
|
|
4976
|
+
? { ...p, selectedIdx: wrapIdx(p.selectedIdx, -1, effortPickerVisibleOptions.length) }
|
|
4977
|
+
: null);
|
|
4978
|
+
return;
|
|
4979
|
+
}
|
|
4980
|
+
if (e.key === 'Enter' || e.key === 'Tab') {
|
|
4981
|
+
e.preventDefault();
|
|
4982
|
+
// Highlighted row wins; otherwise an exactly-typed level beats the
|
|
4983
|
+
// first substring match ("/effort high" must never apply xhigh's
|
|
4984
|
+
// neighbor), then default to the first visible row (mirrors /model).
|
|
4985
|
+
let option = effortPickerVisibleOptions[effortPicker.selectedIdx];
|
|
4986
|
+
if (!option) {
|
|
4987
|
+
const typed = parseEffortCommand(inputRef.current);
|
|
4988
|
+
const q = typed?.kind === 'set' ? typed.arg.toLowerCase() : '';
|
|
4989
|
+
option =
|
|
4990
|
+
(q ? effortPickerVisibleOptions.find((o) => o.value.toLowerCase() === q) : undefined) ??
|
|
4991
|
+
effortPickerVisibleOptions[0];
|
|
4992
|
+
}
|
|
4993
|
+
if (option)
|
|
4994
|
+
void applyEffortLevel(effortPicker.mode, option.value, effortPickerModel);
|
|
4995
|
+
return;
|
|
4996
|
+
}
|
|
4997
|
+
}
|
|
4854
4998
|
// The optional "manage your own models" row sits after the model rows and
|
|
4855
4999
|
// participates in arrow/Enter navigation as the last index.
|
|
4856
5000
|
const modelRowCount = visibleModels.length + (onManageCustomModels ? 1 : 0);
|
|
@@ -6260,7 +6404,108 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
6260
6404
|
: 'color-mix(in srgb, var(--mol-color-primary, #6366f1) 12%, transparent)',
|
|
6261
6405
|
}, children: t('ide.chat.manageCustomModels', undefined, {
|
|
6262
6406
|
defaultValue: 'Add or manage your own models…',
|
|
6263
|
-
}) }))] })),
|
|
6407
|
+
}) }))] })), effortPicker && (_jsxs("div", { className: cm.cn(cm.surface, cm.borderAll), style: {
|
|
6408
|
+
position: 'absolute',
|
|
6409
|
+
bottom: '100%',
|
|
6410
|
+
left: 0,
|
|
6411
|
+
right: 0,
|
|
6412
|
+
marginBottom: 0,
|
|
6413
|
+
borderRadius: '6px 6px 0 0',
|
|
6414
|
+
zIndex: 100,
|
|
6415
|
+
boxShadow: '0 -4px 16px rgba(0,0,0,0.25)',
|
|
6416
|
+
display: 'flex',
|
|
6417
|
+
flexDirection: 'column',
|
|
6418
|
+
maxHeight: popupMaxHeight,
|
|
6419
|
+
}, children: [_jsxs("div", { className: cm.cn(cm.textSize('xs'), cm.textMuted), style: {
|
|
6420
|
+
padding: '6px 12px',
|
|
6421
|
+
borderBottom: '1px solid rgba(128,128,128,0.12)',
|
|
6422
|
+
display: 'flex',
|
|
6423
|
+
alignItems: 'center',
|
|
6424
|
+
gap: 10,
|
|
6425
|
+
flexShrink: 0,
|
|
6426
|
+
flexWrap: 'wrap',
|
|
6427
|
+
}, children: [_jsx("span", { style: { flexShrink: 0 }, children: t('ide.chat.settings.effort.label', undefined, {
|
|
6428
|
+
defaultValue: 'Reasoning effort',
|
|
6429
|
+
}) }), _jsxs("div", { style: {
|
|
6430
|
+
display: 'flex',
|
|
6431
|
+
alignItems: 'center',
|
|
6432
|
+
gap: 6,
|
|
6433
|
+
flex: '1 1 190px',
|
|
6434
|
+
minWidth: 0,
|
|
6435
|
+
}, children: [_jsx("span", { style: { flexShrink: 0 }, children: t('ide.chat.modelModeLabel', undefined, { defaultValue: 'Mode' }) }), _jsx("select", { "data-mol-id": "chat-effort-mode-select", "aria-label": t('ide.chat.modelModeLabel', undefined, { defaultValue: 'Mode' }), value: effortPicker.mode, onChange: (e) => {
|
|
6436
|
+
const v = e.target.value;
|
|
6437
|
+
// Reset the highlighted row — the level list changes with
|
|
6438
|
+
// the mode's model.
|
|
6439
|
+
setEffortPicker((p) => (p ? { mode: v, selectedIdx: -1 } : p));
|
|
6440
|
+
}, className: cm.cn(cm.surfaceSecondary, cm.borderAll, cm.textSize('xs')), style: {
|
|
6441
|
+
borderRadius: 4,
|
|
6442
|
+
// Extra right padding clears the native dropdown arrow so
|
|
6443
|
+
// the selected label never runs underneath it.
|
|
6444
|
+
padding: '2px 18px 2px 6px',
|
|
6445
|
+
color: 'inherit',
|
|
6446
|
+
cursor: 'pointer',
|
|
6447
|
+
height: 24,
|
|
6448
|
+
boxSizing: 'border-box',
|
|
6449
|
+
flex: 1,
|
|
6450
|
+
minWidth: 0,
|
|
6451
|
+
overflow: 'hidden',
|
|
6452
|
+
whiteSpace: 'nowrap',
|
|
6453
|
+
textOverflow: 'ellipsis',
|
|
6454
|
+
}, children: effortPickerModeOptions.map((o) => (_jsx("option", { value: o.value, children: o.label }, o.value))) })] }), _jsx("button", { type: "button", "data-mol-id": "chat-effort-picker-close", onClick: () => setEffortPicker(null), style: {
|
|
6455
|
+
background: 'none',
|
|
6456
|
+
border: 'none',
|
|
6457
|
+
cursor: 'pointer',
|
|
6458
|
+
color: 'inherit',
|
|
6459
|
+
padding: '0 2px',
|
|
6460
|
+
fontSize: '14px',
|
|
6461
|
+
lineHeight: 1,
|
|
6462
|
+
opacity: 0.6,
|
|
6463
|
+
// Touch floor for this secondary header ✕ (36px, like the
|
|
6464
|
+
// notice-card actions); fine pointers keep the slim header.
|
|
6465
|
+
...(isCoarse
|
|
6466
|
+
? {
|
|
6467
|
+
display: 'inline-flex',
|
|
6468
|
+
alignItems: 'center',
|
|
6469
|
+
justifyContent: 'center',
|
|
6470
|
+
minWidth: 36,
|
|
6471
|
+
minHeight: 36,
|
|
6472
|
+
}
|
|
6473
|
+
: {}),
|
|
6474
|
+
}, children: '✕' })] }), _jsx("div", { style: { overflowY: 'auto', flex: 1 }, children: effortPickerOptions.length === 0 ? (_jsx("div", { className: cm.cn(cm.textSize('sm'), cm.textMuted), style: { padding: 12 }, children: t('ide.chat.effort.fixedForModel', { mode: effortPicker.mode, model: effortPickerModel?.label ?? '?' }, {
|
|
6475
|
+
defaultValue: 'Reasoning effort is fixed on {{model}} ({{mode}} mode) — nothing to set.',
|
|
6476
|
+
}) })) : (effortPickerVisibleOptions.map((option, idx) => (_jsxs("button", { type: "button", "data-mol-id": `chat-effort-level-${option.value}`, onClick: () => void applyEffortLevel(effortPicker.mode, option.value, effortPickerModel), onMouseEnter: (e) => {
|
|
6477
|
+
;
|
|
6478
|
+
e.currentTarget.style.background = 'rgba(128,128,128,0.15)';
|
|
6479
|
+
}, onMouseLeave: (e) => {
|
|
6480
|
+
;
|
|
6481
|
+
e.currentTarget.style.background =
|
|
6482
|
+
idx === effortPicker.selectedIdx ? 'rgba(128,128,128,0.1)' : 'transparent';
|
|
6483
|
+
}, className: cm.w('full'), style: {
|
|
6484
|
+
display: 'flex',
|
|
6485
|
+
alignItems: 'center',
|
|
6486
|
+
gap: '6px',
|
|
6487
|
+
width: '100%',
|
|
6488
|
+
minHeight: '40px',
|
|
6489
|
+
padding: '8px 12px',
|
|
6490
|
+
border: 'none',
|
|
6491
|
+
borderTop: idx === 0 ? 'none' : '1px solid rgba(128,128,128,0.12)',
|
|
6492
|
+
cursor: 'pointer',
|
|
6493
|
+
color: 'inherit',
|
|
6494
|
+
textAlign: 'left',
|
|
6495
|
+
fontSize: '13px',
|
|
6496
|
+
background: idx === effortPicker.selectedIdx ? 'rgba(128,128,128,0.1)' : 'transparent',
|
|
6497
|
+
}, children: [_jsx("span", { className: cm.fontWeight('medium'), children: option.value }), defaultEffortForModel(effortPickerModel) === option.value && (_jsx("span", { className: cm.textMuted, style: { fontSize: '10px' }, children: t('ide.chat.modelMode.default', undefined, { defaultValue: 'Default' }) })), effortPickerCurrent === option.value && (_jsx("span", { "data-mol-id": `effort-current-${option.value}`, className: cm.fontWeight('medium'), style: {
|
|
6498
|
+
// Right-aligned + primary-tinted, matching the model
|
|
6499
|
+
// picker's "current" pill (hex is only the var()
|
|
6500
|
+
// fallback; the theme token wins).
|
|
6501
|
+
marginLeft: 'auto',
|
|
6502
|
+
fontSize: '10px',
|
|
6503
|
+
color: 'var(--mol-color-primary, #6366f1)',
|
|
6504
|
+
background: 'color-mix(in srgb, var(--mol-color-primary, #6366f1) 16%, transparent)',
|
|
6505
|
+
border: '1px solid color-mix(in srgb, var(--mol-color-primary, #6366f1) 42%, transparent)',
|
|
6506
|
+
padding: '1px 7px',
|
|
6507
|
+
borderRadius: '999px',
|
|
6508
|
+
}, children: t('ide.chat.currentBadge', undefined, { defaultValue: 'current' }) }))] }, option.value)))) })] })), soundsPicker && (_jsxs("div", { className: cm.cn(cm.surface, cm.borderAll), style: {
|
|
6264
6509
|
position: 'absolute',
|
|
6265
6510
|
bottom: '100%',
|
|
6266
6511
|
left: 0,
|
|
@@ -6501,7 +6746,11 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
6501
6746
|
? t('ide.chat.activeFile', undefined, { defaultValue: 'active' })
|
|
6502
6747
|
: t('ide.chat.openTab', undefined, { defaultValue: 'open' }) }))] }, entry.name));
|
|
6503
6748
|
}) }));
|
|
6504
|
-
})(), queuedMessages.length > 0 &&
|
|
6749
|
+
})(), queuedMessages.length > 0 &&
|
|
6750
|
+
!commandMenu &&
|
|
6751
|
+
!modelPicker &&
|
|
6752
|
+
!effortPicker &&
|
|
6753
|
+
!panelOverlay && (_jsxs("div", { style: {
|
|
6505
6754
|
borderTop: '1px solid rgba(128,128,128,0.15)',
|
|
6506
6755
|
padding: '6px 8px 6px 10px',
|
|
6507
6756
|
}, children: [_jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: 4, marginBottom: 3 }, children: [_jsx(Icon, { name: "clock", size: 11, "aria-hidden": "true", style: { opacity: 0.5, flexShrink: 0 } }), _jsx("span", { className: cm.cn(cm.textMuted, cm.textSize('xs')), style: { fontStyle: 'italic' }, children: t('ide.chat.queuedCount', { count: queuedMessages.length }, { defaultValue: '{{count}} queued' }) })] }), _jsx("div", { style: {
|
|
@@ -6637,6 +6886,7 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
6637
6886
|
pendingFiles.length > 0 &&
|
|
6638
6887
|
!commandMenu &&
|
|
6639
6888
|
!modelPicker &&
|
|
6889
|
+
!effortPicker &&
|
|
6640
6890
|
!panelOverlay && (_jsxs("div", { style: {
|
|
6641
6891
|
borderTop: '1px solid rgba(128,128,128,0.15)',
|
|
6642
6892
|
// Equal top/right/bottom (8px) so the commit button — flush to the
|
|
@@ -7002,6 +7252,7 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
7002
7252
|
// Popups are one-at-a-time — close siblings first.
|
|
7003
7253
|
setMicPicker(null);
|
|
7004
7254
|
setModelPicker(null);
|
|
7255
|
+
setEffortPicker(null);
|
|
7005
7256
|
setSoundsPicker(null);
|
|
7006
7257
|
const cur = inputRef.current;
|
|
7007
7258
|
if (!cur)
|