diff --git a/.claude/commands/llms/update-models-anthropic.md b/.claude/commands/llms/update-models-anthropic.md index 1154925ac..3872753ae 100644 --- a/.claude/commands/llms/update-models-anthropic.md +++ b/.claude/commands/llms/update-models-anthropic.md @@ -20,12 +20,12 @@ Reference files (for context only, do not modify): **Discovering feature docs:** The release notes and models overview markdown contain inline links to feature-specific pages (thinking modes, effort, context windows, what's-new pages, etc.). When a new capability is -referenced, follow those links — append `.md` to get markdown. Examples of +referenced, follow those links - append `.md` to get markdown. Examples of pages you might discover this way: -- `about-claude/models/whats-new-claude-*` — per-generation changes -- `build-with-claude/extended-thinking` — thinking budget configuration -- `build-with-claude/effort` — effort parameter levels -- `build-with-claude/adaptive-thinking` — adaptive thinking mode +- `about-claude/models/whats-new-claude-*` - per-generation changes +- `build-with-claude/extended-thinking` - thinking budget configuration +- `build-with-claude/effort` - effort parameter levels +- `build-with-claude/adaptive-thinking` - adaptive thinking mode **Fallback web pages** (crawl if `.md` paths break or structure changes): - https://platform.claude.com/docs/en/about-claude/models/overview diff --git a/src/apps/settings-modal/ShortcutsModal.tsx b/src/apps/settings-modal/ShortcutsModal.tsx index 0300e1a98..925f0c383 100644 --- a/src/apps/settings-modal/ShortcutsModal.tsx +++ b/src/apps/settings-modal/ShortcutsModal.tsx @@ -77,7 +77,7 @@ function _displayKey(key: string): string { /** * Build a set of fingerprints from currently registered shortcuts for active detection. - * Fingerprint: `key_lowercase:ctrl:shift` — matches the global handler resolution. + * Fingerprint: `key_lowercase:ctrl:shift` - matches the global handler resolution. */ function _buildActiveFingerprints(): Set { const allShortcuts = useGlobalShortcutsStore.getState().getAllShortcuts(); diff --git a/src/common/attachment-drafts/attachment-sources/AttachmentSources.tsx b/src/common/attachment-drafts/attachment-sources/AttachmentSources.tsx index ed362e69d..b9d7d926d 100644 --- a/src/common/attachment-drafts/attachment-sources/AttachmentSources.tsx +++ b/src/common/attachment-drafts/attachment-sources/AttachmentSources.tsx @@ -147,8 +147,8 @@ function AutoDownloadToggle(props: { delay?: number }) { * Portable attachment sources component. * * Three modes: - * - **menu-compact**: Mobile-style — icon trigger, simple MenuItems (no descriptions/animations) - * - **menu-rich**: Desktop-style — labeled button trigger, rich items with descriptions and animations + * - **menu-compact**: Mobile-style - icon trigger, simple MenuItems (no descriptions/animations) + * - **menu-rich**: Desktop-style - labeled button trigger, rich items with descriptions and animations * - **inline-buttons**: Individual source buttons rendered inline (no dropdown) */ export const AttachmentSourcesMemo = React.memo(AttachmentSources); @@ -174,7 +174,7 @@ function AttachmentSources(props: { onOpenWebInput: () => void, }) { - // state (screen capture — used in menu modes where the component handles the capture) + // state (screen capture - used in menu modes where the component handles the capture) const [capturingScreen, setCapturingScreen] = React.useState(false); const [screenCaptureError, setScreenCaptureError] = React.useState(null); @@ -201,7 +201,7 @@ function AttachmentSources(props: { }, [onAttachScreenCapture]); - // inline-buttons mode — individual buttons rendered flat (no dropdown) + // inline-buttons mode - individual buttons rendered flat (no dropdown) if (props.mode === 'inline-buttons') return <> @@ -234,7 +234,7 @@ function AttachmentSources(props: { ; - // menu-compact mode (mobile) — simple icon trigger with flat menu items + // menu-compact mode (mobile) - simple icon trigger with flat menu items if (props.mode === 'menu-compact' || props.mode === 'menu-message') { const isMessage = props.mode === 'menu-message'; return <> @@ -321,7 +321,7 @@ function AttachmentSources(props: { } - // menu-rich mode (desktop) — labeled button trigger with animated, descriptive menu items + // menu-rich mode (desktop) - labeled button trigger with animated, descriptive menu items return ( , 'media' | 'origin'>; -/** Inferred return type — used by composable source handler hooks. */ +/** Inferred return type - used by composable source handler hooks. */ export type AttachmentDraftsApi = ReturnType; diff --git a/src/common/components/forms/FormNumberInput.tsx b/src/common/components/forms/FormNumberInput.tsx index 9fcb3c910..396184cde 100644 --- a/src/common/components/forms/FormNumberInput.tsx +++ b/src/common/components/forms/FormNumberInput.tsx @@ -24,8 +24,8 @@ const _style = { /** * Compact numeric input field with label and optional description. * Supports undefined (unset/default) state with a toggle button: - * - undefined: input disabled, X button pressed (soft) — input shows empty - * - number: input active, X button flat (plain) — pressing X clears to undefined + * - undefined: input disabled, X button pressed (soft) - input shows empty + * - number: input active, X button flat (plain) - pressing X clears to undefined */ export function FormNumberInput(props: { title: string, diff --git a/src/common/layout/optima/ChromelessFloatingButtons.tsx b/src/common/layout/optima/ChromelessFloatingButtons.tsx index 159f69e35..eaac8502d 100644 --- a/src/common/layout/optima/ChromelessFloatingButtons.tsx +++ b/src/common/layout/optima/ChromelessFloatingButtons.tsx @@ -24,17 +24,17 @@ const buttonSx: SxProps = { export function ChromelessFloatingButtons() { return <> - {/* Left — where the drawer toggle usually is */} + {/* Left - where the drawer toggle usually is */} - {/* Center — exit chromeless (styled like the scroll-to-bottom button) */} + {/* Center - exit chromeless (styled like the scroll-to-bottom button) */} - {/* Right — where the panel toggle usually is */} + {/* Right - where the panel toggle usually is */} diff --git a/src/common/logic/store-logic-sherpa.ts b/src/common/logic/store-logic-sherpa.ts index d0af91741..9a1ed990f 100644 --- a/src/common/logic/store-logic-sherpa.ts +++ b/src/common/logic/store-logic-sherpa.ts @@ -47,7 +47,7 @@ export const useLogicSherpaStore = create()( ), ); -// increment the usage count (client-only — localStorage is unavailable during SSR) +// increment the usage count (client-only - localStorage is unavailable during SSR) if (isBrowser) useLogicSherpaStore.setState((state) => ({ usageCount: (state.usageCount || 0) + 1 })); diff --git a/src/modules/llms/server/bedrock/bedrock.models.ts b/src/modules/llms/server/bedrock/bedrock.models.ts index ec80b640a..bd76780fe 100644 --- a/src/modules/llms/server/bedrock/bedrock.models.ts +++ b/src/modules/llms/server/bedrock/bedrock.models.ts @@ -24,7 +24,7 @@ import { DModelParameterSpecAny } from '~/common/stores/llms/llms.parameters'; const SKIP_FM_ID_CONTAINS = ['rerank']; const SKIP_IP_ID_STARTSWITH = ['stability.']; -// Known Mantle-only models (no matching foundation model) — override heuristics with accurate metadata +// Known Mantle-only models (no matching foundation model) - override heuristics with accurate metadata const KNOWN_MANTLE_ONLY: Record = { 'deepseek.v3.1': { label: 'DeepSeek V3.1', ctx: 131072, out: 16384 }, 'moonshotai.kimi-k2-thinking': { label: 'Kimi K2 Thinking', ctx: 131072, out: 16384 }, diff --git a/src/modules/llms/server/gemini/gemini.models.ts b/src/modules/llms/server/gemini/gemini.models.ts index 37de56b6a..b443cf52a 100644 --- a/src/modules/llms/server/gemini/gemini.models.ts +++ b/src/modules/llms/server/gemini/gemini.models.ts @@ -163,13 +163,13 @@ const IF_25 = [LLM_IF_OAI_Chat, LLM_IF_OAI_Vision, LLM_IF_OAI_Fn, LLM_IF_OAI_Jso const IF_30 = [...IF_25]; // Note: Gemini 3 Developer Guide recommends temperature=1.0, which is now set as the default via initialTemperature // Gemini Thinking Control (as of 2026-02-19): -// - Gemini 3 models use `thinkingLevel` (llmVndGemEffort) — NOT thinkingBudget. +// - Gemini 3 models use `thinkingLevel` (llmVndGemEffort) - NOT thinkingBudget. // Supported levels: 3.1 Pro=['low','medium','high'], 3 Pro=['low','high'], Flash=['minimal','low','medium','high']. Default is 'high' (dynamic). // Pro does not support disabling thinking. Flash's 'minimal' does not guarantee thinking is off. -// - Gemini 2.5 models use `thinkingBudget` (llmVndGeminiThinkingBudget) — NOT thinkingLevel. +// - Gemini 2.5 models use `thinkingBudget` (llmVndGeminiThinkingBudget) - NOT thinkingLevel. // Budget=0 disables thinking (Flash/Flash-Lite only; Pro cannot disable). Undefined = auto. // Note: the parameter sweep shows thinkingBudget accepted on Gemini 3, but the official docs -// prescribe thinkingLevel for Gemini 3. We follow the docs — do NOT add thinkingBudget to Gemini 3 models. +// prescribe thinkingLevel for Gemini 3. We follow the docs - do NOT add thinkingBudget to Gemini 3 models. // NOTE: LLM_IF_Outputs_Image is auto-implied by llmsAutoImplyInterfaces() from image parameterSpecs (llmVndGeminiAspectRatio, llmVndGeminiImageSize) diff --git a/src/modules/llms/server/openai/models/openrouter.models.ts b/src/modules/llms/server/openai/models/openrouter.models.ts index 33f1e140f..2582670ca 100644 --- a/src/modules/llms/server/openai/models/openrouter.models.ts +++ b/src/modules/llms/server/openai/models/openrouter.models.ts @@ -187,9 +187,9 @@ export function openRouterModelToModelDescription(wireModel: object): ModelDescr if (DEV_DEBUG_OPENROUTER_MODELS && !antLookup && ['anthropic/claude-3.5-sonnet'].every(silence => !model.id.startsWith(silence))) console.log('[DEV] openRouterModelToModelDescription: unknown Anthropic model:', model.id); - // 0-day: non-indexed models only — indexed ones use native definitions via llmOrtAntLookup. + // 0-day: non-indexed models only - indexed ones use native definitions via llmOrtAntLookup. // OR sweep shows effort on all Anthropic models because OR translates reasoning_effort internally; - // the native API only supports effort on select models — trust the manual definitions for those. + // the native API only supports effort on select models - trust the manual definitions for those. if (interfaces.includes(LLM_IF_OAI_Reasoning) && !parameterSpecs.some(p => p.paramId === 'llmVndAntThinkingBudget')) { DEV_DEBUG_OPENROUTER_MODELS && console.log(`[DEV] openRouterModelToModelDescription: unexpected ${antLookup ? 'KNOWN' : 'unknown'} Anthropic reasoning model:`, model.id); parameterSpecs.push({ paramId: 'llmVndAntThinkingBudget' }); // configurable thinking budget @@ -205,7 +205,7 @@ export function openRouterModelToModelDescription(wireModel: object): ModelDescr if (DEV_DEBUG_OPENROUTER_MODELS && !gemLookup && ['google/gemma-', 'google/gemini-2.5-pro-preview-05-06'].every(silence => !model.id.startsWith(silence))) console.log('[DEV] openRouterModelToModelDescription: unknown Gemini model:', model.id); - // 0-day: non-indexed models only — indexed ones use native definitions via llmOrtGemLookup. + // 0-day: non-indexed models only - indexed ones use native definitions via llmOrtGemLookup. // OR sweep shows effort on all Gemini models because OR translates reasoning_effort internally; // the native API uses thinkingLevel (discrete) or thinkingBudget (integer) depending on generation. if (interfaces.includes(LLM_IF_OAI_Reasoning) && !parameterSpecs.some(p => p.paramId === 'llmVndGeminiThinkingBudget' || p.paramId === 'llmVndGemEffort')) { @@ -232,7 +232,7 @@ export function openRouterModelToModelDescription(wireModel: object): ModelDescr if (DEV_DEBUG_OPENROUTER_MODELS && !oaiLookup && ['openai/gpt-oss', 'openai/gpt-3.5'].every(silence => !model.id.startsWith(silence))) console.log('[DEV] openRouterModelToModelDescription: unknown OpenAI model:', model.id); - // 0-day: non-indexed models only — indexed ones use native definitions via llmOrtOaiLookup. + // 0-day: non-indexed models only - indexed ones use native definitions via llmOrtOaiLookup. // OR sweep may show broader effort ranges than the native API supports (OR adds levels internally). if (interfaces.includes(LLM_IF_OAI_Reasoning) && !parameterSpecs.some(p => p.paramId === 'llmVndOaiEffort')) { // console.log('[DEV] openRouterModelToModelDescription: unexpected OpenAI reasoning model:', model.id);