diff --git a/apps/desktop/src/renderer/locales/settings-web-search-copy.ts b/apps/desktop/src/renderer/locales/settings-web-search-copy.ts index 032fcc8cd6..9f42cbfcc7 100644 --- a/apps/desktop/src/renderer/locales/settings-web-search-copy.ts +++ b/apps/desktop/src/renderer/locales/settings-web-search-copy.ts @@ -62,7 +62,7 @@ const SETTINGS_WEB_SEARCH_COPY = { provider: 'Search source', providerHelp: 'Reuse the current model provider when it supports hosted search, or explicitly use Tavily.', providerModel: 'Current model', providerTavily: 'Tavily', modelCredential: 'Primary-model native search', modelCredentialHelp: 'At the start of each turn, Maka uses the current connection and exact model to decide whether to inject native web_search into the same model request. It stores no second search key and sends no separate model call from Settings.', statusAria: 'Web search credential status', lastTest: 'Last tested ', enabledAria: 'Enable web search', key: 'Tavily key', - envKeyHelp: 'Currently using TAVILY_API_KEY / MAKA_TAVILY_API_KEY from the environment. Remove the environment variable and restart to use a saved key.', savedKeyHelp: 'The key is stored only on this machine. Apply at:', + envKeyHelp: 'Currently using TAVILY_API_KEY / MAKA_TAVILY_API_KEY from the environment. Remove the environment variable and restart to use a saved key.', savedKeyHelp: 'The key is stored only on this machine. Apply at: ', envPlaceholder: 'Provided by environment variable', storedPlaceholder: 'Saved (enter a new key to replace)', keyPlaceholder: 'tvly-xxxxxxxx', keyAria: 'Tavily key', actions: 'Credential actions', actionsHelp: 'After saving, test with a real request. Clearing credentials also disables web search.', saving: 'Saving…', saveKey: 'Save key', testing: 'Testing…', testKey: 'Test credentials', clearing: 'Clearing…', clearKey: 'Clear key', testSearch: 'Test search', testSearchHelp: 'Send a real query to confirm the selected web search source is configured and working. Results appear here only and are not written to the task.', queryPlaceholder: 'For example: AI product launches this week', diff --git a/apps/desktop/src/renderer/settings/password-input.tsx b/apps/desktop/src/renderer/settings/password-input.tsx index 278db46b1b..7aa0ac37fa 100644 --- a/apps/desktop/src/renderer/settings/password-input.tsx +++ b/apps/desktop/src/renderer/settings/password-input.tsx @@ -17,7 +17,7 @@ * under the License. */ -import { useEffect, useRef, useState } from 'react'; +import { useEffect, useRef, useState, type ReactNode } from 'react'; import { ICON_SIZE, Check, Copy, Eye, EyeOff } from '@maka/ui/icons'; import { IconButton, @@ -53,7 +53,12 @@ export function PasswordInput(props: { placeholder?: string; label: string; isLabelHidden?: boolean; - description?: string; + // ReactNode, not string: a description may carry an inline link (e.g. the web + // search "申请地址:tavily.com" apply link). Astryx FieldLabel already renders + // a ReactNode description and its click-forwarding skips nested interactive + // content; only the InputGroup/Field prop types under-declare it as `string`, + // which the single cast at the InputGroup call site below papers over. + description?: ReactNode; status?: InputGroupProps['status']; isRequired?: boolean; isOptional?: boolean; @@ -112,7 +117,9 @@ export function PasswordInput(props: { // written on, and the group's `aria-labelledby` is what names it. + {copy.savedKeyHelp} + tavily.com + + )} /> - {!usingEnvKey && ( - - tavily.com - - )} diff --git a/apps/desktop/src/renderer/styles/native-cursor.css b/apps/desktop/src/renderer/styles/native-cursor.css index d95c3d16d2..ed42ad88f3 100644 --- a/apps/desktop/src/renderer/styles/native-cursor.css +++ b/apps/desktop/src/renderer/styles/native-cursor.css @@ -49,10 +49,16 @@ /* 1. Generic interactive roles (Button, menu rows, options, labels, trees…). * Astryx FieldLabel / TreeListItem set StyleX cursor:pointer on