@xopcai/xopc 0.0.75 → 0.0.77

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 (53) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/telegram/xopc.extension.json +1 -1
  3. package/dist/gateway/static/root/assets/{agents-Bq-2L2z0.js → agents-DN3vr8pb.js} +2 -2
  4. package/dist/gateway/static/root/assets/{agents-Bq-2L2z0.js.map → agents-DN3vr8pb.js.map} +1 -1
  5. package/dist/gateway/static/root/assets/{apps-page-DitlAmYZ.js → apps-page-BUn41aPi.js} +2 -2
  6. package/dist/gateway/static/root/assets/{apps-page-DitlAmYZ.js.map → apps-page-BUn41aPi.js.map} +1 -1
  7. package/dist/gateway/static/root/assets/{channels-settings-BzJYkjyh.js → channels-settings-CYMmWDtP.js} +2 -2
  8. package/dist/gateway/static/root/assets/{channels-settings-BzJYkjyh.js.map → channels-settings-CYMmWDtP.js.map} +1 -1
  9. package/dist/gateway/static/root/assets/{channels-status-swr-CiY7i2IN.js → channels-status-swr-sJj4ueTp.js} +2 -2
  10. package/dist/gateway/static/root/assets/{channels-status-swr-CiY7i2IN.js.map → channels-status-swr-sJj4ueTp.js.map} +1 -1
  11. package/dist/gateway/static/root/assets/{cron-api-S4gy4e5e.js → cron-api-CLxnaHdq.js} +2 -2
  12. package/dist/gateway/static/root/assets/{cron-api-S4gy4e5e.js.map → cron-api-CLxnaHdq.js.map} +1 -1
  13. package/dist/gateway/static/root/assets/{cron-page-7uMZvuju.js → cron-page-BAQ8xSnJ.js} +2 -2
  14. package/dist/gateway/static/root/assets/{cron-page-7uMZvuju.js.map → cron-page-BAQ8xSnJ.js.map} +1 -1
  15. package/dist/gateway/static/root/assets/{dist-DXGDHevt.js → dist-BfJYxiK5.js} +2 -2
  16. package/dist/gateway/static/root/assets/{dist-DXGDHevt.js.map → dist-BfJYxiK5.js.map} +1 -1
  17. package/dist/gateway/static/root/assets/{extension-debug-page-DYLqqlXt.js → extension-debug-page-bgvVs-Sy.js} +2 -2
  18. package/dist/gateway/static/root/assets/{extension-debug-page-DYLqqlXt.js.map → extension-debug-page-bgvVs-Sy.js.map} +1 -1
  19. package/dist/gateway/static/root/assets/{extension-page-H9Odxw56.js → extension-page-SG4TVv-u.js} +2 -2
  20. package/dist/gateway/static/root/assets/{extension-page-H9Odxw56.js.map → extension-page-SG4TVv-u.js.map} +1 -1
  21. package/dist/gateway/static/root/assets/{extension-settings-page-Ch6vY8Uy.js → extension-settings-page-CJZRTsjF.js} +2 -2
  22. package/dist/gateway/static/root/assets/{extension-settings-page-Ch6vY8Uy.js.map → extension-settings-page-CJZRTsjF.js.map} +1 -1
  23. package/dist/gateway/static/root/assets/{field-primitives-CrexIsCD.js → field-primitives-Z76hyBYS.js} +2 -2
  24. package/dist/gateway/static/root/assets/{field-primitives-CrexIsCD.js.map → field-primitives-Z76hyBYS.js.map} +1 -1
  25. package/dist/gateway/static/root/assets/{heartbeat-config-api-CVGIOMMM.js → heartbeat-config-api-BqfDabSI.js} +2 -2
  26. package/dist/gateway/static/root/assets/{heartbeat-config-api-CVGIOMMM.js.map → heartbeat-config-api-BqfDabSI.js.map} +1 -1
  27. package/dist/gateway/static/root/assets/{index-S3bgG2JF.js → index-ChiUhJAs.js} +44 -41
  28. package/dist/gateway/static/root/assets/{index-S3bgG2JF.js.map → index-ChiUhJAs.js.map} +1 -1
  29. package/dist/gateway/static/root/assets/{logs-page-BKpRWihz.js → logs-page-DrIMhDE2.js} +2 -2
  30. package/dist/gateway/static/root/assets/{logs-page-BKpRWihz.js.map → logs-page-DrIMhDE2.js.map} +1 -1
  31. package/dist/gateway/static/root/assets/{sessions-page-BRFJ-djK.js → sessions-page-B-RGO3N0.js} +2 -2
  32. package/dist/gateway/static/root/assets/{sessions-page-BRFJ-djK.js.map → sessions-page-B-RGO3N0.js.map} +1 -1
  33. package/dist/gateway/static/root/assets/{settings-form-section-cS13ImiU.js → settings-form-section-Csvl1iL6.js} +2 -2
  34. package/dist/gateway/static/root/assets/{settings-form-section-cS13ImiU.js.map → settings-form-section-Csvl1iL6.js.map} +1 -1
  35. package/dist/gateway/static/root/assets/{settings-page-D99K6Jjx.js → settings-page-nxAc0ta1.js} +2 -2
  36. package/dist/gateway/static/root/assets/{settings-page-D99K6Jjx.js.map → settings-page-nxAc0ta1.js.map} +1 -1
  37. package/dist/gateway/static/root/assets/{skills-page-CjBO9BH2.js → skills-page-dHwx2vh0.js} +2 -2
  38. package/dist/gateway/static/root/assets/{skills-page-CjBO9BH2.js.map → skills-page-dHwx2vh0.js.map} +1 -1
  39. package/dist/gateway/static/root/assets/{utils-DVw8OvAC.js → utils-COYrNFF7.js} +2 -2
  40. package/dist/gateway/static/root/assets/{utils-DVw8OvAC.js.map → utils-COYrNFF7.js.map} +1 -1
  41. package/dist/gateway/static/root/assets/{voice-api-key-field-BIh7mDN6.js → voice-api-key-field-5WZZaxH3.js} +2 -2
  42. package/dist/gateway/static/root/assets/{voice-api-key-field-BIh7mDN6.js.map → voice-api-key-field-5WZZaxH3.js.map} +1 -1
  43. package/dist/gateway/static/root/index.html +1 -1
  44. package/dist/package.js +1 -1
  45. package/dist/src/agent/embedded/session-manager-init.js +5 -1
  46. package/dist/src/agent/embedded/session-manager-init.js.map +1 -1
  47. package/dist/src/channels/index.js +1 -1
  48. package/dist/src/channels/manager.js +1 -1
  49. package/dist/src/cli/commands/channels.js +1 -1
  50. package/dist/src/gateway/heartbeat/service.js +1 -1
  51. package/dist/src/gateway/service.js +1 -1
  52. package/dist/src/heartbeat/index.js +1 -1
  53. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"extension-settings-page-Ch6vY8Uy.js","names":["Loader2","useMemo","useSWR","fetchImageProvidersList","ImageProviderCredentialsPanel","ImageProviderCredentialsPanelMessages","IMAGE_PROVIDERS_SWR_KEY","useImageProviderCredentials","apiUrl","messages","MessageBundle","useGatewayStore","useLocaleStore","imageProvidersSwrKey","panelMessagesFromBundle","t","credentialsIntro","regionHint","endpointPresetsHint","apiKeyLabel","optionalPlaceholder","regionLabel","baseUrlLabel","imageBaseUrlLabel","saveCredentials","savingCredentials","credentialsSaved","discardCredentials","credentialsNothingToSave","credentialsSaveError","regionPresetDefault","regionPresetCustom","baseUrlPresetDefault","baseUrlPresetCustom","openExtensionSettings","openImageModelsPage","extensionSettingsLinkTitle","imageModelsLinkTitle","configured","missingKey","unsavedChanges","expandProvider","collapseProvider","defaultModel","modelsLabel","modelCountOne","modelCountMany","imageBaseUrlPresetHint","dashscopeRegion_beijing","dashscopeRegion_singapore","dashscopeRegion_us","apiKeyMaskedHelp","apiKeyCopy","apiKeyCopied","apiKeyShow","apiKeyHide","apiKeyNotInConfigFile","apiKeyRevealFailed","minimaxClusterLabel","minimaxClusterHint","falQueueBaseLabel","falQueueBaseHint","ExtensionImageProviderSettings","t0","$","_c","extensionId","language","_temp","t1","m","imageModelsSettings","hasToken","_temp2","t2","t3","Symbol","for","revalidateOnFocus","data","t4","isLoading","t5","undefined","all","t6","t7","p","id","filter","summaries","cred","panelMsg","t8","providersSettings","getApiKey","getApiKeyCn","getApiKeyIntl","apiKeyLinkLabels","t9","length","t10","Set","t11","credBaseline","credDirty","credDraft","credError","credNoopFlash","credSavedFlash","credSaving","onDiscardCredentials","updateCredRow","s_0","Boolean","s","token","Loader2","useCallback","useMemo","useRef","useState","useSWR","Button","FieldLabel","VoiceApiKeyField","VoiceApiKeyFieldLabels","fetchVoiceSettings","fetchVoiceSttProviders","patchVoiceSettings","VoiceSettingsState","nativeSelectMaxWidthClass","selectControlBaseClass","settingsInputFocusClass","cn","fetchJson","apiUrl","messages","useGatewayStore","useLocaleStore","GROQ_MODELS","id","name","const","ExtensionDetailResponse","manifest","mediaUnderstandingProviders","contracts","resolveMediaProviderId","detail","primary","trim","contract","undefined","selectClassName","inputClassName","SttCredSlice","apiKey","model","savedSliceFromVoiceSettings","voiceSettings","providerId","stt","alibaba","openai","slice","providers","ExtensionSttProviderSettingsBody","mutateVoice","ReturnType","language","s","m","v","xs","extensionSttMedia","apiKeyLabels","maskedHelp","apiKeyMaskedHelp","copy","apiKeyCopy","copied","apiKeyCopied","show","apiKeyShow","hide","apiKeyHide","notInConfigFile","apiKeyNotInConfigFile","loadFailed","apiKeyRevealFailed","data","sttProviders","revalidateOnFocus","configured","some","p","savedSlice","dirtyRef","localDraft","setLocalDraft","saving","setSaving","error","setError","savedFlash","setSavedFlash","credDraft","credBaseline","dirty","handleSave","next","structuredClone","enabled","provider","current","window","setTimeout","e","Error","message","String","modelOptions","credentialsTitle","credentialsHint","replace","notConfigured","prev","base","apiKeyDesc","target","value","map","entry","saved","discard","save","ExtensionSttProviderSettings","t0","$","_c","extensionId","_temp","hasToken","_temp2","t1","encodeURIComponent","isLoading","detailLoading","t2","t3","Symbol","for","mutate","voiceLoading","t4","t5","s_0","Boolean","token","useCallback","useMemo","cn","JsonSchema","Record","SchemaFormProps","schema","values","onChange","disabled","className","isRecord","x","Array","isArray","FieldDef","key","sub","order","group","hidden","getXOrder","s","v","Number","isNaN","getXGroup","length","isHidden","sortedFields","props","properties","out","Object","entries","push","sort","a","b","localeCompare","groupFields","fields","Map","m","f","g","has","set","get","StringField","t0","$","_c","name","value","desc","description","undefined","placeholder","fmt","format","enum","every","_temp","t1","t2","e","target","t3","map","_temp2","t4","t5","inputType","e_0","op","NumberField","isFinite","BooleanField","labelText","title","checked","ArrayStringField","items","isStringItems","type","Symbol","for","t","n","trim","includes","add","t_0","filter","preventDefault","HTMLInputElement","t6","t7","FieldRow","k","onValue","_temp3","SchemaForm","bb0","bb1","grouped","next","setKey","groupKeys","from","keys","_temp4","gk","list","block","extractObjectDefaults","prototype","hasOwnProperty","call","default","useCallback","useMemo","useReducer","useRef","useState","useSWR","Button","extractObjectDefaults","SchemaForm","JsonSchema","apiFetch","fetchJson","apiUrl","messages","useGatewayStore","useLocaleStore","ExtensionDetailResponse","manifest","configSchema","ExtensionSettingsDraft","localValues","Record","isDirty","saving","saveError","saveSuccess","ExtensionSettingsAction","type","value","message","extensionSettingsReducer","state","action","ExtensionAutoSettings","extensionId","language","s","a","agentSettings","hasToken","Boolean","token","data","detail","error","detailError","encodeURIComponent","remoteConfig","mutate","mutateConfig","configError","schema","defaults","savedValues","draft","dispatch","saveSuccessFlash","setSaveSuccessFlash","dirtyRef","trackedSavedRef","current","onChange","next","handleDiscard","handleResetDefaults","handleSave","res","method","body","JSON","stringify","ok","json","catch","Error","statusText","window","setTimeout","e","String","err","saved","discard","save","Link","useParams","ExtensionImageProviderSettings","ExtensionSttProviderSettings","messages","useLocaleStore","ExtensionAutoSettings","ExtensionIframeHost","useExtensions","ExtensionSettingsPage","$","_c","language","_temp","t0","m","xm","extensionImageGen","xs","extensionSttMedia","extensionId","panelId","extensions","t1","Symbol","for","extension","t2","bb0","t3","ext","id","find","t4","t5","panels","ui","contributions","settingsPanels","p","panel","hasIframe","Boolean","hasAutoForm","hasConfigSchema","isImageGeneration","kind","isMediaProvider","hasProviderCredentialsUi","title","name","imageModelsSettings","banner","imageModelsLinkTitle","openImageModels","t6","openVoice","t7","t8","t9","entrypoint","permissions","t10","s","SettingsPanelNotFound","message"],"sources":["../../../../../web/src/features/settings/extension-image-provider-settings.tsx","../../../../../web/src/features/settings/extension-stt-provider-settings.tsx","../../../../../web/src/components/ui/schema-form.tsx","../../../../../web/src/features/extensions/extension-auto-settings.tsx","../../../../../web/src/features/extensions/extension-settings-page.tsx"],"sourcesContent":["import { Loader2 } from 'lucide-react';\nimport { useMemo } from 'react';\nimport useSWR from 'swr';\n\nimport { fetchImageProvidersList } from '@/features/settings/fetch-image-providers';\nimport {\n ImageProviderCredentialsPanel,\n type ImageProviderCredentialsPanelMessages,\n} from '@/features/settings/image-provider-credentials-panel';\nimport { IMAGE_PROVIDERS_SWR_KEY } from '@/features/settings/image-providers-swr-key';\nimport { useImageProviderCredentials } from '@/features/settings/use-image-provider-credentials';\nimport { apiUrl } from '@/lib/url';\nimport { messages, type MessageBundle } from '@/i18n/messages';\nimport { useGatewayStore } from '@/stores/gateway-store';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nconst imageProvidersSwrKey = () => apiUrl(IMAGE_PROVIDERS_SWR_KEY);\n\nfunction panelMessagesFromBundle(t: MessageBundle['imageModelsSettings']): ImageProviderCredentialsPanelMessages {\n return {\n credentialsIntro: t.credentialsIntro,\n regionHint: t.regionHint,\n endpointPresetsHint: t.endpointPresetsHint,\n apiKeyLabel: t.apiKeyLabel,\n optionalPlaceholder: t.optionalPlaceholder,\n regionLabel: t.regionLabel,\n baseUrlLabel: t.baseUrlLabel,\n imageBaseUrlLabel: t.imageBaseUrlLabel,\n saveCredentials: t.saveCredentials,\n savingCredentials: t.savingCredentials,\n credentialsSaved: t.credentialsSaved,\n discardCredentials: t.discardCredentials,\n credentialsNothingToSave: t.credentialsNothingToSave,\n credentialsSaveError: t.credentialsSaveError,\n regionPresetDefault: t.regionPresetDefault,\n regionPresetCustom: t.regionPresetCustom,\n baseUrlPresetDefault: t.baseUrlPresetDefault,\n baseUrlPresetCustom: t.baseUrlPresetCustom,\n openExtensionSettings: t.openExtensionSettings,\n openImageModelsPage: t.openImageModelsPage,\n extensionSettingsLinkTitle: t.extensionSettingsLinkTitle,\n imageModelsLinkTitle: t.imageModelsLinkTitle,\n configured: t.configured,\n missingKey: t.missingKey,\n unsavedChanges: t.unsavedChanges,\n expandProvider: t.expandProvider,\n collapseProvider: t.collapseProvider,\n defaultModel: t.defaultModel,\n modelsLabel: t.modelsLabel,\n modelCountOne: t.modelCountOne,\n modelCountMany: t.modelCountMany,\n imageBaseUrlPresetHint: t.imageBaseUrlPresetHint,\n dashscopeRegion_beijing: t.dashscopeRegion_beijing,\n dashscopeRegion_singapore: t.dashscopeRegion_singapore,\n dashscopeRegion_us: t.dashscopeRegion_us,\n apiKeyMaskedHelp: t.apiKeyMaskedHelp,\n apiKeyCopy: t.apiKeyCopy,\n apiKeyCopied: t.apiKeyCopied,\n apiKeyShow: t.apiKeyShow,\n apiKeyHide: t.apiKeyHide,\n apiKeyNotInConfigFile: t.apiKeyNotInConfigFile,\n apiKeyRevealFailed: t.apiKeyRevealFailed,\n minimaxClusterLabel: t.minimaxClusterLabel,\n minimaxClusterHint: t.minimaxClusterHint,\n falQueueBaseLabel: t.falQueueBaseLabel,\n falQueueBaseHint: t.falQueueBaseHint,\n };\n}\n\nexport function ExtensionImageProviderSettings({ extensionId }: { extensionId: string }) {\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const t = m.imageModelsSettings;\n const hasToken = useGatewayStore((s) => Boolean(s.token));\n\n const { data: all = [], isLoading } = useSWR(\n hasToken ? imageProvidersSwrKey() : null,\n fetchImageProvidersList,\n { revalidateOnFocus: false },\n );\n\n const summaries = useMemo(\n () => all.filter((p) => p.id === extensionId),\n [all, extensionId],\n );\n\n const cred = useImageProviderCredentials(summaries);\n const panelMsg = useMemo(() => panelMessagesFromBundle(t), [t]);\n const apiKeyLinkLabels = useMemo(\n () => ({\n getApiKey: m.providersSettings.getApiKey,\n getApiKeyIntl: m.providersSettings.getApiKeyIntl,\n getApiKeyCn: m.providersSettings.getApiKeyCn,\n }),\n [m.providersSettings],\n );\n\n if (!hasToken) {\n return null;\n }\n\n if (isLoading) {\n return (\n <div className=\"flex items-center gap-2 py-6 text-sm text-fg-muted\">\n <Loader2 className=\"size-4 animate-spin\" />\n …\n </div>\n );\n }\n\n if (summaries.length === 0) {\n return (\n <p className=\"text-sm text-fg-muted\">\n {language === 'zh'\n ? '网关未注册该图像 Provider,或扩展已被禁用。'\n : 'This image provider is not registered on the gateway, or the extension is disabled.'}\n </p>\n );\n }\n\n return (\n <ImageProviderCredentialsPanel\n summaries={summaries}\n credDraft={cred.credDraft}\n credBaseline={cred.credBaseline}\n credDirty={cred.credDirty}\n credSaving={cred.credSaving}\n credError={cred.credError}\n credSavedFlash={cred.credSavedFlash}\n credNoopFlash={cred.credNoopFlash}\n updateCredRow={cred.updateCredRow}\n onDiscardCredentials={cred.onDiscardCredentials}\n onSaveCredentials={() => void cred.saveCredentials(t.credentialsSaveError)}\n extensionIds={new Set()}\n showExtensionLinks={false}\n showImageModelsLink={false}\n language={language}\n apiKeyLinkLabels={apiKeyLinkLabels}\n messages={panelMsg}\n />\n );\n}\n","import { Loader2 } from 'lucide-react';\nimport { useCallback, useMemo, useRef, useState } from 'react';\nimport useSWR from 'swr';\n\nimport { Button } from '@/components/ui/button';\nimport { FieldLabel } from '@/features/settings/channels/field-primitives';\nimport {\n VoiceApiKeyField,\n type VoiceApiKeyFieldLabels,\n} from '@/features/settings/voice-api-key-field';\nimport {\n fetchVoiceSettings,\n fetchVoiceSttProviders,\n patchVoiceSettings,\n type VoiceSettingsState,\n} from '@/features/settings/voice-config-api';\nimport { nativeSelectMaxWidthClass, selectControlBaseClass, settingsInputFocusClass } from '@/lib/form-field-width';\nimport { cn } from '@/lib/cn';\nimport { fetchJson } from '@/lib/fetch';\nimport { apiUrl } from '@/lib/url';\nimport { messages } from '@/i18n/messages';\nimport { useGatewayStore } from '@/stores/gateway-store';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nconst GROQ_MODELS = [\n { id: 'whisper-large-v3-turbo', name: 'Whisper Large v3 Turbo' },\n { id: 'whisper-large-v3', name: 'Whisper Large v3' },\n] as const;\n\ntype ExtensionDetailResponse = {\n manifest?: {\n mediaUnderstandingProviders?: string[];\n contracts?: { mediaUnderstandingProviders?: string[] };\n };\n};\n\nfunction resolveMediaProviderId(detail: ExtensionDetailResponse | undefined): string | undefined {\n const primary = detail?.manifest?.mediaUnderstandingProviders?.[0];\n if (typeof primary === 'string' && primary.trim()) {\n return primary.trim();\n }\n const contract = detail?.manifest?.contracts?.mediaUnderstandingProviders?.[0];\n if (typeof contract === 'string' && contract.trim()) {\n return contract.trim();\n }\n return undefined;\n}\n\nfunction selectClassName(): string {\n return cn(selectControlBaseClass, nativeSelectMaxWidthClass);\n}\n\nfunction inputClassName(): string {\n return cn(\n 'w-full rounded-lg border border-edge bg-surface-panel px-3 py-2 text-sm text-fg',\n 'placeholder:text-fg-subtle',\n settingsInputFocusClass,\n 'dark:border-edge',\n );\n}\n\ntype SttCredSlice = { apiKey: string; model: string };\n\nfunction savedSliceFromVoiceSettings(\n voiceSettings: VoiceSettingsState | undefined,\n providerId: string | undefined,\n): SttCredSlice {\n if (!voiceSettings || !providerId) return { apiKey: '', model: GROQ_MODELS[0].id };\n if (providerId === 'alibaba') {\n return {\n apiKey: voiceSettings.stt.alibaba?.apiKey ?? '',\n model: voiceSettings.stt.alibaba?.model ?? 'paraformer-v2',\n };\n }\n if (providerId === 'openai') {\n return {\n apiKey: voiceSettings.stt.openai?.apiKey ?? '',\n model: voiceSettings.stt.openai?.model ?? 'whisper-1',\n };\n }\n const slice = voiceSettings.stt.providers?.[providerId];\n return {\n apiKey: typeof slice?.apiKey === 'string' ? slice.apiKey : '',\n model: typeof slice?.model === 'string' ? slice.model : GROQ_MODELS[0].id,\n };\n}\n\nfunction ExtensionSttProviderSettingsBody({\n providerId,\n voiceSettings,\n mutateVoice,\n}: {\n providerId: string;\n voiceSettings: VoiceSettingsState;\n mutateVoice: ReturnType<typeof useSWR<VoiceSettingsState>>['mutate'];\n}) {\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const v = m.voiceSettings;\n const xs = m.extensionSttMedia;\n const apiKeyLabels: VoiceApiKeyFieldLabels = {\n maskedHelp: v.apiKeyMaskedHelp,\n copy: v.apiKeyCopy,\n copied: v.apiKeyCopied,\n show: v.apiKeyShow,\n hide: v.apiKeyHide,\n notInConfigFile: v.apiKeyNotInConfigFile,\n loadFailed: v.apiKeyRevealFailed,\n };\n\n const { data: sttProviders } = useSWR(\n apiUrl('/api/voice/stt-providers'),\n fetchVoiceSttProviders,\n { revalidateOnFocus: false },\n );\n\n const configured = useMemo(\n () => sttProviders?.providers.some((p) => p.id === providerId && p.configured) ?? false,\n [providerId, sttProviders],\n );\n\n const savedSlice = useMemo(\n () => savedSliceFromVoiceSettings(voiceSettings, providerId),\n [providerId, voiceSettings],\n );\n\n const dirtyRef = useRef(false);\n const [localDraft, setLocalDraft] = useState<SttCredSlice | null>(null);\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [savedFlash, setSavedFlash] = useState(false);\n\n const credDraft = localDraft ?? savedSlice;\n const credBaseline = savedSlice;\n\n const dirty =\n credDraft.apiKey !== credBaseline.apiKey || credDraft.model !== credBaseline.model;\n\n const handleSave = useCallback(async () => {\n setSaving(true);\n setError(null);\n try {\n const next: VoiceSettingsState = structuredClone(voiceSettings);\n next.stt.enabled = true;\n if (providerId === 'alibaba') {\n next.stt.provider = 'alibaba';\n next.stt.alibaba = { ...next.stt.alibaba, apiKey: credDraft.apiKey, model: credDraft.model };\n } else if (providerId === 'openai') {\n next.stt.provider = 'openai';\n next.stt.openai = { ...next.stt.openai, apiKey: credDraft.apiKey, model: credDraft.model };\n } else {\n next.stt.providers = {\n ...(next.stt.providers ?? {}),\n [providerId]: {\n ...(next.stt.providers?.[providerId] ?? {}),\n apiKey: credDraft.apiKey,\n model: credDraft.model,\n },\n };\n if (!next.stt.provider || next.stt.provider === 'alibaba' || next.stt.provider === 'openai') {\n next.stt.provider = providerId;\n }\n }\n await patchVoiceSettings(next);\n await mutateVoice(next, false);\n dirtyRef.current = false;\n setLocalDraft(null);\n setSavedFlash(true);\n window.setTimeout(() => setSavedFlash(false), 2500);\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n } finally {\n setSaving(false);\n }\n }, [credDraft.apiKey, credDraft.model, mutateVoice, providerId, voiceSettings]);\n\n const modelOptions = providerId === 'groq' ? GROQ_MODELS : [{ id: credDraft.model, name: credDraft.model }];\n\n return (\n <div className=\"flex flex-col gap-4 rounded-xl border border-edge bg-surface-base p-4\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <div>\n <h2 className=\"text-sm font-semibold text-fg\">{xs.credentialsTitle}</h2>\n <p className=\"mt-1 text-xs text-fg-muted\">\n {xs.credentialsHint.replace('{providerId}', providerId)}\n </p>\n </div>\n <span\n className={cn(\n 'rounded-full px-2 py-0.5 text-xs font-medium',\n configured\n ? 'bg-emerald-500/10 text-emerald-700 dark:text-emerald-300'\n : 'bg-amber-500/10 text-amber-800 dark:text-amber-200',\n )}\n >\n {configured ? xs.configured : xs.notConfigured}\n </span>\n </div>\n\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <div className={cn('flex flex-col gap-1.5', nativeSelectMaxWidthClass)}>\n <FieldLabel>{v.stt.apiKey}</FieldLabel>\n <VoiceApiKeyField\n kind=\"stt\"\n providerId={providerId}\n fieldId={`ext-stt-${providerId}-api-key`}\n value={credDraft.apiKey}\n onChange={(next) => {\n dirtyRef.current = true;\n setLocalDraft((prev) => {\n const base = prev ?? savedSlice;\n return { ...base, apiKey: next };\n });\n setError(null);\n }}\n labels={apiKeyLabels}\n placeholder={providerId === 'groq' ? 'gsk_...' : 'sk-...'}\n />\n <p className=\"text-xs text-fg-subtle\">\n {v.stt.apiKeyDesc}\n {providerId === 'groq' ? ' (GROQ_API_KEY)' : ''}\n </p>\n </div>\n <div className={cn('flex flex-col gap-1.5', nativeSelectMaxWidthClass)}>\n <FieldLabel>{v.stt.model}</FieldLabel>\n {providerId === 'groq' ? (\n <select\n className={selectClassName()}\n value={credDraft.model}\n onChange={(e) => {\n dirtyRef.current = true;\n setLocalDraft((prev) => {\n const base = prev ?? savedSlice;\n return { ...base, model: e.target.value };\n });\n setError(null);\n }}\n >\n {modelOptions.map((entry) => (\n <option key={entry.id} value={entry.id}>\n {entry.name}\n </option>\n ))}\n </select>\n ) : (\n <input\n className={inputClassName()}\n value={credDraft.model}\n onChange={(e) => {\n dirtyRef.current = true;\n setLocalDraft((prev) => {\n const base = prev ?? savedSlice;\n return { ...base, model: e.target.value };\n });\n setError(null);\n }}\n />\n )}\n </div>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n {savedFlash ? (\n <span className=\"text-xs text-emerald-600 dark:text-emerald-400\">{v.saved}</span>\n ) : null}\n {error ? <span className=\"text-xs text-red-600 dark:text-red-400\">{error}</span> : null}\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"h-8 text-xs\"\n disabled={!dirty || saving}\n onClick={() => {\n dirtyRef.current = false;\n setLocalDraft(null);\n setError(null);\n }}\n >\n {v.discard}\n </Button>\n <Button\n type=\"button\"\n variant=\"primary\"\n className=\"h-8 text-xs\"\n disabled={!dirty || saving}\n onClick={() => void handleSave()}\n >\n {saving ? v.saving : v.save}\n </Button>\n </div>\n </div>\n );\n}\n\nexport function ExtensionSttProviderSettings({ extensionId }: { extensionId: string }) {\n const language = useLocaleStore((s) => s.language);\n const hasToken = useGatewayStore((s) => Boolean(s.token));\n\n const { data: detail, isLoading: detailLoading } = useSWR(\n hasToken && extensionId ? `ext-stt-detail-${extensionId}` : null,\n () => fetchJson<ExtensionDetailResponse>(apiUrl(`/api/extensions/${encodeURIComponent(extensionId)}`)),\n );\n\n const providerId = resolveMediaProviderId(detail);\n\n const {\n data: voiceSettings,\n mutate: mutateVoice,\n isLoading: voiceLoading,\n } = useSWR(hasToken ? 'voice-settings-ext-stt' : null, fetchVoiceSettings, {\n revalidateOnFocus: false,\n });\n\n if (!hasToken) {\n return null;\n }\n\n if (detailLoading || voiceLoading) {\n return (\n <div className=\"flex items-center gap-2 py-6 text-sm text-fg-muted\">\n <Loader2 className=\"size-4 animate-spin\" />\n …\n </div>\n );\n }\n\n if (!providerId) {\n return (\n <p className=\"text-sm text-fg-muted\">\n {language === 'zh'\n ? '该扩展未声明 mediaUnderstandingProviders。'\n : 'This extension does not declare mediaUnderstandingProviders.'}\n </p>\n );\n }\n\n if (!voiceSettings) {\n return null;\n }\n\n return (\n <ExtensionSttProviderSettingsBody\n key={`${extensionId}:${providerId}`}\n providerId={providerId}\n voiceSettings={voiceSettings}\n mutateVoice={mutateVoice}\n />\n );\n}\n","import { useCallback, useMemo } from 'react';\n\nimport { cn } from '@/lib/cn';\n\nexport type JsonSchema = Record<string, unknown>;\n\ntype SchemaFormProps = {\n schema: JsonSchema;\n values: Record<string, unknown>;\n onChange: (values: Record<string, unknown>) => void;\n disabled?: boolean;\n className?: string;\n};\n\nfunction isRecord(x: unknown): x is Record<string, unknown> {\n return typeof x === 'object' && x !== null && !Array.isArray(x);\n}\n\ntype FieldDef = {\n key: string;\n sub: JsonSchema;\n order: number;\n group: string;\n hidden: boolean;\n};\n\nfunction getXOrder(s: JsonSchema): number {\n const v = s['x-order'];\n return typeof v === 'number' && !Number.isNaN(v) ? v : 999;\n}\n\nfunction getXGroup(s: JsonSchema): string {\n const v = s['x-group'];\n return typeof v === 'string' && v.length > 0 ? v : '';\n}\n\nfunction isHidden(s: JsonSchema): boolean {\n return s['x-hidden'] === true;\n}\n\nfunction sortedFields(schema: JsonSchema): FieldDef[] {\n const props = schema.properties;\n if (!isRecord(props)) return [];\n const out: FieldDef[] = [];\n for (const [key, sub] of Object.entries(props)) {\n if (!isRecord(sub)) continue;\n if (isHidden(sub)) continue;\n out.push({\n key,\n sub: sub,\n order: getXOrder(sub),\n group: getXGroup(sub),\n hidden: false,\n });\n }\n out.sort((a, b) => a.order - b.order || a.key.localeCompare(b.key));\n return out;\n}\n\nfunction groupFields(fields: FieldDef[]): Map<string, FieldDef[]> {\n const m = new Map<string, FieldDef[]>();\n for (const f of fields) {\n const g = f.group;\n if (!m.has(g)) m.set(g, []);\n m.get(g)!.push(f);\n }\n return m;\n}\n\nfunction StringField({\n name,\n s,\n value,\n onChange,\n disabled,\n}: {\n name: string;\n s: JsonSchema;\n value: string;\n onChange: (v: string) => void;\n disabled: boolean;\n}) {\n const desc = typeof s.description === 'string' ? s.description : undefined;\n const placeholder =\n (typeof s['x-placeholder'] === 'string' ? s['x-placeholder'] : null) || desc;\n const fmt = s.format;\n if (Array.isArray(s.enum) && s.enum.every((x) => typeof x === 'string')) {\n return (\n <div className=\"flex flex-col gap-1.5\">\n {desc ? <label className=\"text-xs text-fg-muted\">{desc}</label> : null}\n <select\n name={name}\n className=\"ui-input h-9 rounded-md border border-edge bg-surface-base px-2 text-sm text-fg\"\n value={value}\n disabled={disabled}\n onChange={(e) => onChange(e.target.value)}\n >\n {(s.enum).map((op) => (\n <option key={op} value={op}>\n {op}\n </option>\n ))}\n </select>\n </div>\n );\n }\n const inputType = fmt === 'password' ? 'password' : 'text';\n return (\n <div className=\"flex flex-col gap-1.5\">\n {desc ? <label className=\"text-xs text-fg-muted\">{desc}</label> : null}\n <input\n name={name}\n type={inputType}\n className=\"ui-input h-9 rounded-md border border-edge bg-surface-base px-2.5 text-sm text-fg placeholder:text-fg-muted/70\"\n value={value}\n placeholder={placeholder}\n disabled={disabled}\n onChange={(e) => onChange(e.target.value)}\n />\n </div>\n );\n}\n\nfunction NumberField({\n s,\n value,\n onChange,\n disabled,\n}: {\n s: JsonSchema;\n value: number;\n onChange: (v: number) => void;\n disabled: boolean;\n}) {\n const desc = typeof s.description === 'string' ? s.description : undefined;\n return (\n <div className=\"flex flex-col gap-1.5\">\n {desc ? <label className=\"text-xs text-fg-muted\">{desc}</label> : null}\n <input\n type=\"number\"\n className=\"ui-input h-9 rounded-md border border-edge bg-surface-base px-2.5 text-sm text-fg\"\n value={Number.isFinite(value) ? value : 0}\n disabled={disabled}\n onChange={(e) => onChange(Number(e.target.value))}\n />\n </div>\n );\n}\n\nfunction BooleanField({\n s,\n value,\n onChange,\n disabled,\n}: {\n s: JsonSchema;\n value: boolean;\n onChange: (v: boolean) => void;\n disabled: boolean;\n}) {\n const desc = typeof s.description === 'string' ? s.description : undefined;\n const labelText =\n desc ?? (typeof s.title === 'string' && s.title.length > 0 ? s.title : 'Enable');\n return (\n <label className=\"flex items-center gap-2 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"size-4 rounded border border-edge\"\n checked={value}\n disabled={disabled}\n onChange={(e) => onChange(e.target.checked)}\n />\n <span>{labelText}</span>\n </label>\n );\n}\n\nfunction ArrayStringField({\n s,\n value,\n onChange,\n disabled,\n}: {\n s: JsonSchema;\n value: string[];\n onChange: (v: string[]) => void;\n disabled: boolean;\n}) {\n const desc = typeof s.description === 'string' ? s.description : undefined;\n const items = s.items;\n const isStringItems = isRecord(items) && items.type === 'string';\n if (!isStringItems) {\n return <p className=\"text-xs text-fg-muted\">Unsupported array type</p>;\n }\n const add = (t: string) => {\n const n = t.trim();\n if (!n || value.includes(n)) return;\n onChange([...value, n]);\n };\n return (\n <div className=\"flex flex-col gap-1.5\">\n {desc ? <label className=\"text-xs text-fg-muted\">{desc}</label> : null}\n <div className=\"flex flex-wrap gap-1\">\n {value.map((t) => (\n <span\n key={t}\n className=\"inline-flex items-center gap-1 rounded-md border border-edge bg-surface-panel px-2 py-0.5 text-sm\"\n >\n {t}\n <button\n type=\"button\"\n className=\"text-fg-muted hover:text-fg\"\n disabled={disabled}\n onClick={() => onChange(value.filter((x) => x !== t))}\n >\n ×\n </button>\n </span>\n ))}\n </div>\n <input\n className=\"ui-input h-9 rounded-md border border-edge bg-surface-base px-2.5 text-sm\"\n disabled={disabled}\n placeholder=\"Add and press Enter\"\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n add((e.target as HTMLInputElement).value);\n (e.target as HTMLInputElement).value = '';\n }\n }}\n />\n </div>\n );\n}\n\nfunction FieldRow({\n k,\n sub,\n value,\n onValue,\n disabled,\n}: {\n k: string;\n sub: JsonSchema;\n value: unknown;\n onValue: (next: unknown) => void;\n disabled: boolean;\n}) {\n const t = sub.type;\n const title =\n (typeof sub.title === 'string' && sub.title.length > 0 ? sub.title : null) ?? k;\n if (t === 'boolean') {\n return (\n <div className=\"space-y-1.5\">\n <p className=\"text-sm font-medium text-fg\">{title}</p>\n <BooleanField\n s={sub}\n value={value === true}\n disabled={disabled}\n onChange={(b) => onValue(b)}\n />\n </div>\n );\n }\n if (t === 'number' || t === 'integer') {\n return (\n <div className=\"space-y-1.5\">\n <p className=\"text-sm font-medium text-fg\">{title}</p>\n <NumberField\n s={sub}\n value={typeof value === 'number' ? value : 0}\n disabled={disabled}\n onChange={onValue}\n />\n </div>\n );\n }\n if (t === 'string') {\n return (\n <div className=\"space-y-1.5\">\n <p className=\"text-sm font-medium text-fg\">{title}</p>\n <StringField\n name={k}\n s={sub}\n value={typeof value === 'string' ? value : ''}\n disabled={disabled}\n onChange={onValue}\n />\n </div>\n );\n }\n if (t === 'array') {\n const items = sub.items;\n if (isRecord(items) && items.type === 'string') {\n return (\n <div className=\"space-y-1.5\">\n <p className=\"text-sm font-medium text-fg\">{title}</p>\n <ArrayStringField\n s={sub}\n value={Array.isArray(value) && value.every((x) => typeof x === 'string') ? value : []}\n disabled={disabled}\n onChange={onValue}\n />\n </div>\n );\n }\n }\n return (\n <p className=\"text-xs text-fg-muted\">\n {title}: unsupported field type\n {typeof t === 'string' ? ` (${t})` : ''}\n </p>\n );\n}\n\n/**\n * Renders a JSON Schema (type: object) as a form using Gateway Console design tokens.\n */\nexport function SchemaForm({ schema, values, onChange, disabled = false, className }: SchemaFormProps) {\n const fields = useMemo(() => {\n if (schema.type !== 'object') return [];\n return sortedFields(schema);\n }, [schema]);\n\n const grouped = useMemo(() => {\n if (fields.length === 0) return new Map<string, FieldDef[]>();\n return groupFields(fields);\n }, [fields]);\n\n const setKey = useCallback(\n (key: string, next: unknown) => {\n onChange({ ...values, [key]: next });\n },\n [onChange, values],\n );\n\n if (schema.type !== 'object' || !isRecord(schema.properties) || fields.length === 0) {\n return null;\n }\n\n const groupKeys = Array.from(grouped.keys()).sort((a, b) => {\n if (a === '') return -1;\n if (b === '') return 1;\n return a.localeCompare(b);\n });\n\n return (\n <div className={cn('flex flex-col gap-4', className)}>\n {groupKeys.map((gk) => {\n const list = grouped.get(gk) ?? [];\n const block = list.map((f) => (\n <FieldRow\n key={f.key}\n k={f.key}\n sub={f.sub}\n value={values[f.key]}\n onValue={(v) => setKey(f.key, v)}\n disabled={disabled}\n />\n ));\n if (gk === '') {\n return <div key=\"default\">{block}</div>;\n }\n return (\n <details\n key={gk}\n className=\"group rounded-lg border border-edge bg-surface-panel/40 open:bg-surface-base\"\n open\n >\n <summary className=\"cursor-pointer select-none px-3 py-2 text-sm font-medium text-fg group-open:rounded-b-none\">\n {gk}\n </summary>\n <div className=\"space-y-4 border-t border-edge p-3\">{block}</div>\n </details>\n );\n })}\n </div>\n );\n}\n\n/** Extract per-key defaults from a JSON object schema for \"Reset\" actions. */\nexport function extractObjectDefaults(\n schema: JsonSchema,\n): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n if (schema.type !== 'object' || !isRecord(schema.properties)) {\n return out;\n }\n for (const [k, sub] of Object.entries(schema.properties)) {\n if (!isRecord(sub)) continue;\n if (Object.prototype.hasOwnProperty.call(sub, 'default')) {\n out[k] = sub.default;\n }\n }\n return out;\n}\n","import { useCallback, useMemo, useReducer, useRef, useState } from 'react';\nimport useSWR from 'swr';\n\nimport { Button } from '@/components/ui/button';\nimport { extractObjectDefaults, SchemaForm, type JsonSchema } from '@/components/ui/schema-form';\nimport { apiFetch, fetchJson } from '@/lib/fetch';\nimport { apiUrl } from '@/lib/url';\nimport { messages } from '@/i18n/messages';\nimport { useGatewayStore } from '@/stores/gateway-store';\nimport { useLocaleStore } from '@/stores/locale-store';\n\ntype ExtensionDetailResponse = {\n manifest: { configSchema?: JsonSchema };\n};\n\ntype ExtensionSettingsDraft = {\n localValues: Record<string, unknown>;\n isDirty: boolean;\n saving: boolean;\n saveError: string | null;\n saveSuccess: boolean;\n};\n\ntype ExtensionSettingsAction =\n | { type: 'sync'; value: Record<string, unknown> }\n | { type: 'change'; value: Record<string, unknown> }\n | { type: 'discard'; value: Record<string, unknown> }\n | { type: 'reset-defaults'; value: Record<string, unknown> }\n | { type: 'save-start' }\n | { type: 'save-success'; value: Record<string, unknown> }\n | { type: 'save-error'; message: string };\n\nfunction extensionSettingsReducer(\n state: ExtensionSettingsDraft,\n action: ExtensionSettingsAction,\n): ExtensionSettingsDraft {\n switch (action.type) {\n case 'sync':\n return { ...state, localValues: action.value, isDirty: false, saveError: null };\n case 'change':\n return { ...state, localValues: action.value, isDirty: true, saveError: null, saveSuccess: false };\n case 'discard':\n return { ...state, localValues: action.value, isDirty: false, saveError: null };\n case 'reset-defaults':\n return { ...state, localValues: action.value, isDirty: true, saveError: null, saveSuccess: false };\n case 'save-start':\n return { ...state, saving: true, saveError: null };\n case 'save-success':\n return {\n ...state,\n localValues: action.value,\n isDirty: false,\n saving: false,\n saveSuccess: true,\n saveError: null,\n };\n case 'save-error':\n return { ...state, saving: false, saveError: action.message };\n }\n}\n\nexport function ExtensionAutoSettings({ extensionId }: { extensionId: string }) {\n const language = useLocaleStore((s) => s.language);\n const a = messages(language).agentSettings;\n const hasToken = useGatewayStore((s) => Boolean(s.token));\n const { data: detail, error: detailError } = useSWR(\n hasToken && extensionId ? `ext-detail-${extensionId}` : null,\n () => fetchJson<ExtensionDetailResponse>(apiUrl(`/api/extensions/${encodeURIComponent(extensionId)}`)),\n );\n\n const { data: remoteConfig, mutate: mutateConfig, error: configError } = useSWR(\n hasToken && extensionId ? `ext-cfg-${extensionId}` : null,\n () =>\n fetchJson<Record<string, unknown>>(\n apiUrl(`/api/extensions/${encodeURIComponent(extensionId)}/config`),\n ),\n );\n\n const schema = detail?.manifest?.configSchema;\n const defaults = useMemo(\n () => (schema && schema.type === 'object' ? extractObjectDefaults(schema) : {}),\n [schema],\n );\n\n const savedValues = useMemo(\n () => ({ ...defaults, ...(remoteConfig ?? {}) }),\n [defaults, remoteConfig],\n );\n\n const [draft, dispatch] = useReducer(extensionSettingsReducer, {\n localValues: {},\n isDirty: false,\n saving: false,\n saveError: null,\n saveSuccess: false,\n });\n const [saveSuccessFlash, setSaveSuccessFlash] = useState(false);\n\n const dirtyRef = useRef(false);\n const trackedSavedRef = useRef(savedValues);\n if (!dirtyRef.current && trackedSavedRef.current !== savedValues) {\n trackedSavedRef.current = savedValues;\n dispatch({ type: 'sync', value: savedValues });\n }\n\n const onChange = useCallback((next: Record<string, unknown>) => {\n dirtyRef.current = true;\n dispatch({ type: 'change', value: next });\n }, []);\n\n const handleDiscard = useCallback(() => {\n dirtyRef.current = false;\n dispatch({ type: 'discard', value: savedValues });\n }, [savedValues]);\n\n const handleResetDefaults = useCallback(() => {\n if (!schema || schema.type !== 'object') return;\n dirtyRef.current = true;\n dispatch({ type: 'reset-defaults', value: { ...extractObjectDefaults(schema) } });\n }, [schema]);\n\n const handleSave = useCallback(async () => {\n if (!extensionId) return;\n dispatch({ type: 'save-start' });\n try {\n const res = await apiFetch(\n apiUrl(`/api/extensions/${encodeURIComponent(extensionId)}/config`),\n { method: 'PATCH', body: JSON.stringify(draft.localValues) },\n );\n if (!res.ok) {\n const body = (await res.json().catch(() => ({}))) as { error?: { message?: string } };\n throw new Error(body.error?.message ?? res.statusText);\n }\n await mutateConfig(draft.localValues, false);\n dirtyRef.current = false;\n dispatch({ type: 'save-success', value: draft.localValues });\n setSaveSuccessFlash(true);\n window.setTimeout(() => setSaveSuccessFlash(false), 3000);\n } catch (e) {\n dispatch({ type: 'save-error', message: e instanceof Error ? e.message : String(e) });\n }\n }, [draft.localValues, extensionId, mutateConfig]);\n\n if (!hasToken) {\n return null;\n }\n\n if (detailError || configError) {\n const err = (detailError ?? configError) as Error;\n return (\n <p className=\"text-sm text-fg-muted\">\n Could not load extension settings: {err instanceof Error ? err.message : String(err)}\n </p>\n );\n }\n\n if (!schema || schema.type !== 'object') {\n return null;\n }\n\n return (\n <div className=\"mb-6 flex flex-col gap-3 rounded-xl border border-edge bg-surface-base p-4\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <h2 className=\"text-sm font-semibold text-fg\">Configuration</h2>\n <div className=\"flex flex-wrap items-center gap-2\">\n {saveSuccessFlash ? (\n <span className=\"text-xs text-emerald-600 dark:text-emerald-400\">{a.saved}</span>\n ) : null}\n {draft.saveError ? <span className=\"text-xs text-red-600 dark:text-red-400\">{draft.saveError}</span> : null}\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"h-8 text-xs\"\n disabled={!draft.isDirty}\n onClick={handleDiscard}\n >\n {a.discard}\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"h-8 text-xs\"\n onClick={handleResetDefaults}\n >\n Reset to defaults\n </Button>\n <Button\n type=\"button\"\n variant=\"primary\"\n className=\"h-8 text-xs\"\n disabled={!draft.isDirty || draft.saving}\n onClick={() => void handleSave()}\n >\n {draft.saving ? a.saving : a.save}\n </Button>\n </div>\n </div>\n <SchemaForm schema={schema} values={draft.localValues} onChange={onChange} disabled={draft.saving} />\n </div>\n );\n}\n","/**\n * Extension settings: auto-generated config form (configSchema) + optional iframe (settingsPanels).\n *\n * Routes: /settings/ext/:extensionId, /settings/ext/:extensionId/:panelId\n */\n\nimport { Link, useParams } from 'react-router-dom';\n\nimport { ExtensionImageProviderSettings } from '@/features/settings/extension-image-provider-settings';\nimport { ExtensionSttProviderSettings } from '@/features/settings/extension-stt-provider-settings';\nimport { messages } from '@/i18n/messages';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nimport { ExtensionAutoSettings } from './extension-auto-settings';\nimport { ExtensionIframeHost } from './extension-iframe-host';\nimport { useExtensions } from './extension-provider';\n\nexport function ExtensionSettingsPage() {\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const xm = m.extensionImageGen;\n const xs = m.extensionSttMedia;\n const { extensionId, panelId } = useParams<{ extensionId: string; panelId?: string }>();\n const extensions = useExtensions();\n\n if (!extensionId) {\n return <SettingsPanelNotFound message=\"No extension ID provided.\" />;\n }\n\n const extension = extensions.find((ext) => ext.id === extensionId);\n if (!extension) {\n return (\n <SettingsPanelNotFound\n message={`Extension \"${extensionId}\" not found or is not available in this workspace.`}\n />\n );\n }\n\n const panels = extension.ui?.contributions?.settingsPanels;\n const panel = panelId\n ? panels?.find((p) => p.id === panelId || p.id === `${extensionId}.${panelId}`)\n : panels?.[0];\n\n const hasIframe = Boolean(panel && extension.ui);\n const hasAutoForm = Boolean(extension.hasConfigSchema);\n const isImageGeneration = extension.kind === 'image-generation';\n const isMediaProvider = extension.kind === 'media-provider';\n const hasProviderCredentialsUi = isImageGeneration || isMediaProvider;\n\n if (!hasAutoForm && !hasIframe && !hasProviderCredentialsUi) {\n return (\n <SettingsPanelNotFound\n message={`Extension \"${extensionId}\" has no settings panels or config schema.`}\n />\n );\n }\n\n const title = panel?.title ?? `${extension.name} Settings`;\n\n return (\n <div className=\"mx-auto flex w-full max-w-app-main flex-col gap-3 px-4 py-8\">\n <h1 className=\"text-lg font-semibold text-fg\">{title}</h1>\n {isImageGeneration ? (\n <div className=\"flex flex-col gap-2 rounded-lg border border-edge-subtle bg-surface-base px-4 py-3 text-sm\">\n <p className=\"leading-relaxed text-fg-muted\">{xm.banner}</p>\n <Link\n to=\"/settings/image-models\"\n className=\"w-fit font-medium text-accent hover:underline\"\n title={m.imageModelsSettings.imageModelsLinkTitle}\n >\n {xm.openImageModels}\n </Link>\n </div>\n ) : null}\n {isImageGeneration ? <ExtensionImageProviderSettings extensionId={extensionId} /> : null}\n {isMediaProvider ? (\n <div className=\"flex flex-col gap-2 rounded-lg border border-edge-subtle bg-surface-base px-4 py-3 text-sm\">\n <p className=\"leading-relaxed text-fg-muted\">{xs.banner}</p>\n <Link to=\"/settings/voice\" className=\"w-fit font-medium text-accent hover:underline\">\n {xs.openVoice}\n </Link>\n </div>\n ) : null}\n {isMediaProvider ? <ExtensionSttProviderSettings extensionId={extensionId} /> : null}\n {hasAutoForm ? <ExtensionAutoSettings extensionId={extensionId} /> : null}\n {hasIframe && panel && extension.ui ? (\n <div className=\"overflow-hidden rounded-xl border border-edge bg-surface-base\">\n <ExtensionIframeHost\n extensionId={extensionId}\n extensionName={extension.name}\n entrypoint={panel.entrypoint}\n permissions={extension.ui?.permissions}\n title={panel.title}\n className=\"w-full\"\n minHeight={120}\n maxHeight={2000}\n />\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction SettingsPanelNotFound({ message }: { message: string }) {\n return (\n <div className=\"mx-auto flex w-full max-w-app-main flex-col gap-3 px-4 py-8\">\n <p className=\"text-sm text-fg-muted\">{message}</p>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"extension-settings-page-CJZRTsjF.js","names":["Loader2","useMemo","useSWR","fetchImageProvidersList","ImageProviderCredentialsPanel","ImageProviderCredentialsPanelMessages","IMAGE_PROVIDERS_SWR_KEY","useImageProviderCredentials","apiUrl","messages","MessageBundle","useGatewayStore","useLocaleStore","imageProvidersSwrKey","panelMessagesFromBundle","t","credentialsIntro","regionHint","endpointPresetsHint","apiKeyLabel","optionalPlaceholder","regionLabel","baseUrlLabel","imageBaseUrlLabel","saveCredentials","savingCredentials","credentialsSaved","discardCredentials","credentialsNothingToSave","credentialsSaveError","regionPresetDefault","regionPresetCustom","baseUrlPresetDefault","baseUrlPresetCustom","openExtensionSettings","openImageModelsPage","extensionSettingsLinkTitle","imageModelsLinkTitle","configured","missingKey","unsavedChanges","expandProvider","collapseProvider","defaultModel","modelsLabel","modelCountOne","modelCountMany","imageBaseUrlPresetHint","dashscopeRegion_beijing","dashscopeRegion_singapore","dashscopeRegion_us","apiKeyMaskedHelp","apiKeyCopy","apiKeyCopied","apiKeyShow","apiKeyHide","apiKeyNotInConfigFile","apiKeyRevealFailed","minimaxClusterLabel","minimaxClusterHint","falQueueBaseLabel","falQueueBaseHint","ExtensionImageProviderSettings","t0","$","_c","extensionId","language","_temp","t1","m","imageModelsSettings","hasToken","_temp2","t2","t3","Symbol","for","revalidateOnFocus","data","t4","isLoading","t5","undefined","all","t6","t7","p","id","filter","summaries","cred","panelMsg","t8","providersSettings","getApiKey","getApiKeyCn","getApiKeyIntl","apiKeyLinkLabels","t9","length","t10","Set","t11","credBaseline","credDirty","credDraft","credError","credNoopFlash","credSavedFlash","credSaving","onDiscardCredentials","updateCredRow","s_0","Boolean","s","token","Loader2","useCallback","useMemo","useRef","useState","useSWR","Button","FieldLabel","VoiceApiKeyField","VoiceApiKeyFieldLabels","fetchVoiceSettings","fetchVoiceSttProviders","patchVoiceSettings","VoiceSettingsState","nativeSelectMaxWidthClass","selectControlBaseClass","settingsInputFocusClass","cn","fetchJson","apiUrl","messages","useGatewayStore","useLocaleStore","GROQ_MODELS","id","name","const","ExtensionDetailResponse","manifest","mediaUnderstandingProviders","contracts","resolveMediaProviderId","detail","primary","trim","contract","undefined","selectClassName","inputClassName","SttCredSlice","apiKey","model","savedSliceFromVoiceSettings","voiceSettings","providerId","stt","alibaba","openai","slice","providers","ExtensionSttProviderSettingsBody","mutateVoice","ReturnType","language","s","m","v","xs","extensionSttMedia","apiKeyLabels","maskedHelp","apiKeyMaskedHelp","copy","apiKeyCopy","copied","apiKeyCopied","show","apiKeyShow","hide","apiKeyHide","notInConfigFile","apiKeyNotInConfigFile","loadFailed","apiKeyRevealFailed","data","sttProviders","revalidateOnFocus","configured","some","p","savedSlice","dirtyRef","localDraft","setLocalDraft","saving","setSaving","error","setError","savedFlash","setSavedFlash","credDraft","credBaseline","dirty","handleSave","next","structuredClone","enabled","provider","current","window","setTimeout","e","Error","message","String","modelOptions","credentialsTitle","credentialsHint","replace","notConfigured","prev","base","apiKeyDesc","target","value","map","entry","saved","discard","save","ExtensionSttProviderSettings","t0","$","_c","extensionId","_temp","hasToken","_temp2","t1","encodeURIComponent","isLoading","detailLoading","t2","t3","Symbol","for","mutate","voiceLoading","t4","t5","s_0","Boolean","token","useCallback","useMemo","cn","JsonSchema","Record","SchemaFormProps","schema","values","onChange","disabled","className","isRecord","x","Array","isArray","FieldDef","key","sub","order","group","hidden","getXOrder","s","v","Number","isNaN","getXGroup","length","isHidden","sortedFields","props","properties","out","Object","entries","push","sort","a","b","localeCompare","groupFields","fields","Map","m","f","g","has","set","get","StringField","t0","$","_c","name","value","desc","description","undefined","placeholder","fmt","format","enum","every","_temp","t1","t2","e","target","t3","map","_temp2","t4","t5","inputType","e_0","op","NumberField","isFinite","BooleanField","labelText","title","checked","ArrayStringField","items","isStringItems","type","Symbol","for","t","n","trim","includes","add","t_0","filter","preventDefault","HTMLInputElement","t6","t7","FieldRow","k","onValue","_temp3","SchemaForm","bb0","bb1","grouped","next","setKey","groupKeys","from","keys","_temp4","gk","list","block","extractObjectDefaults","prototype","hasOwnProperty","call","default","useCallback","useMemo","useReducer","useRef","useState","useSWR","Button","extractObjectDefaults","SchemaForm","JsonSchema","apiFetch","fetchJson","apiUrl","messages","useGatewayStore","useLocaleStore","ExtensionDetailResponse","manifest","configSchema","ExtensionSettingsDraft","localValues","Record","isDirty","saving","saveError","saveSuccess","ExtensionSettingsAction","type","value","message","extensionSettingsReducer","state","action","ExtensionAutoSettings","extensionId","language","s","a","agentSettings","hasToken","Boolean","token","data","detail","error","detailError","encodeURIComponent","remoteConfig","mutate","mutateConfig","configError","schema","defaults","savedValues","draft","dispatch","saveSuccessFlash","setSaveSuccessFlash","dirtyRef","trackedSavedRef","current","onChange","next","handleDiscard","handleResetDefaults","handleSave","res","method","body","JSON","stringify","ok","json","catch","Error","statusText","window","setTimeout","e","String","err","saved","discard","save","Link","useParams","ExtensionImageProviderSettings","ExtensionSttProviderSettings","messages","useLocaleStore","ExtensionAutoSettings","ExtensionIframeHost","useExtensions","ExtensionSettingsPage","$","_c","language","_temp","t0","m","xm","extensionImageGen","xs","extensionSttMedia","extensionId","panelId","extensions","t1","Symbol","for","extension","t2","bb0","t3","ext","id","find","t4","t5","panels","ui","contributions","settingsPanels","p","panel","hasIframe","Boolean","hasAutoForm","hasConfigSchema","isImageGeneration","kind","isMediaProvider","hasProviderCredentialsUi","title","name","imageModelsSettings","banner","imageModelsLinkTitle","openImageModels","t6","openVoice","t7","t8","t9","entrypoint","permissions","t10","s","SettingsPanelNotFound","message"],"sources":["../../../../../web/src/features/settings/extension-image-provider-settings.tsx","../../../../../web/src/features/settings/extension-stt-provider-settings.tsx","../../../../../web/src/components/ui/schema-form.tsx","../../../../../web/src/features/extensions/extension-auto-settings.tsx","../../../../../web/src/features/extensions/extension-settings-page.tsx"],"sourcesContent":["import { Loader2 } from 'lucide-react';\nimport { useMemo } from 'react';\nimport useSWR from 'swr';\n\nimport { fetchImageProvidersList } from '@/features/settings/fetch-image-providers';\nimport {\n ImageProviderCredentialsPanel,\n type ImageProviderCredentialsPanelMessages,\n} from '@/features/settings/image-provider-credentials-panel';\nimport { IMAGE_PROVIDERS_SWR_KEY } from '@/features/settings/image-providers-swr-key';\nimport { useImageProviderCredentials } from '@/features/settings/use-image-provider-credentials';\nimport { apiUrl } from '@/lib/url';\nimport { messages, type MessageBundle } from '@/i18n/messages';\nimport { useGatewayStore } from '@/stores/gateway-store';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nconst imageProvidersSwrKey = () => apiUrl(IMAGE_PROVIDERS_SWR_KEY);\n\nfunction panelMessagesFromBundle(t: MessageBundle['imageModelsSettings']): ImageProviderCredentialsPanelMessages {\n return {\n credentialsIntro: t.credentialsIntro,\n regionHint: t.regionHint,\n endpointPresetsHint: t.endpointPresetsHint,\n apiKeyLabel: t.apiKeyLabel,\n optionalPlaceholder: t.optionalPlaceholder,\n regionLabel: t.regionLabel,\n baseUrlLabel: t.baseUrlLabel,\n imageBaseUrlLabel: t.imageBaseUrlLabel,\n saveCredentials: t.saveCredentials,\n savingCredentials: t.savingCredentials,\n credentialsSaved: t.credentialsSaved,\n discardCredentials: t.discardCredentials,\n credentialsNothingToSave: t.credentialsNothingToSave,\n credentialsSaveError: t.credentialsSaveError,\n regionPresetDefault: t.regionPresetDefault,\n regionPresetCustom: t.regionPresetCustom,\n baseUrlPresetDefault: t.baseUrlPresetDefault,\n baseUrlPresetCustom: t.baseUrlPresetCustom,\n openExtensionSettings: t.openExtensionSettings,\n openImageModelsPage: t.openImageModelsPage,\n extensionSettingsLinkTitle: t.extensionSettingsLinkTitle,\n imageModelsLinkTitle: t.imageModelsLinkTitle,\n configured: t.configured,\n missingKey: t.missingKey,\n unsavedChanges: t.unsavedChanges,\n expandProvider: t.expandProvider,\n collapseProvider: t.collapseProvider,\n defaultModel: t.defaultModel,\n modelsLabel: t.modelsLabel,\n modelCountOne: t.modelCountOne,\n modelCountMany: t.modelCountMany,\n imageBaseUrlPresetHint: t.imageBaseUrlPresetHint,\n dashscopeRegion_beijing: t.dashscopeRegion_beijing,\n dashscopeRegion_singapore: t.dashscopeRegion_singapore,\n dashscopeRegion_us: t.dashscopeRegion_us,\n apiKeyMaskedHelp: t.apiKeyMaskedHelp,\n apiKeyCopy: t.apiKeyCopy,\n apiKeyCopied: t.apiKeyCopied,\n apiKeyShow: t.apiKeyShow,\n apiKeyHide: t.apiKeyHide,\n apiKeyNotInConfigFile: t.apiKeyNotInConfigFile,\n apiKeyRevealFailed: t.apiKeyRevealFailed,\n minimaxClusterLabel: t.minimaxClusterLabel,\n minimaxClusterHint: t.minimaxClusterHint,\n falQueueBaseLabel: t.falQueueBaseLabel,\n falQueueBaseHint: t.falQueueBaseHint,\n };\n}\n\nexport function ExtensionImageProviderSettings({ extensionId }: { extensionId: string }) {\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const t = m.imageModelsSettings;\n const hasToken = useGatewayStore((s) => Boolean(s.token));\n\n const { data: all = [], isLoading } = useSWR(\n hasToken ? imageProvidersSwrKey() : null,\n fetchImageProvidersList,\n { revalidateOnFocus: false },\n );\n\n const summaries = useMemo(\n () => all.filter((p) => p.id === extensionId),\n [all, extensionId],\n );\n\n const cred = useImageProviderCredentials(summaries);\n const panelMsg = useMemo(() => panelMessagesFromBundle(t), [t]);\n const apiKeyLinkLabels = useMemo(\n () => ({\n getApiKey: m.providersSettings.getApiKey,\n getApiKeyIntl: m.providersSettings.getApiKeyIntl,\n getApiKeyCn: m.providersSettings.getApiKeyCn,\n }),\n [m.providersSettings],\n );\n\n if (!hasToken) {\n return null;\n }\n\n if (isLoading) {\n return (\n <div className=\"flex items-center gap-2 py-6 text-sm text-fg-muted\">\n <Loader2 className=\"size-4 animate-spin\" />\n …\n </div>\n );\n }\n\n if (summaries.length === 0) {\n return (\n <p className=\"text-sm text-fg-muted\">\n {language === 'zh'\n ? '网关未注册该图像 Provider,或扩展已被禁用。'\n : 'This image provider is not registered on the gateway, or the extension is disabled.'}\n </p>\n );\n }\n\n return (\n <ImageProviderCredentialsPanel\n summaries={summaries}\n credDraft={cred.credDraft}\n credBaseline={cred.credBaseline}\n credDirty={cred.credDirty}\n credSaving={cred.credSaving}\n credError={cred.credError}\n credSavedFlash={cred.credSavedFlash}\n credNoopFlash={cred.credNoopFlash}\n updateCredRow={cred.updateCredRow}\n onDiscardCredentials={cred.onDiscardCredentials}\n onSaveCredentials={() => void cred.saveCredentials(t.credentialsSaveError)}\n extensionIds={new Set()}\n showExtensionLinks={false}\n showImageModelsLink={false}\n language={language}\n apiKeyLinkLabels={apiKeyLinkLabels}\n messages={panelMsg}\n />\n );\n}\n","import { Loader2 } from 'lucide-react';\nimport { useCallback, useMemo, useRef, useState } from 'react';\nimport useSWR from 'swr';\n\nimport { Button } from '@/components/ui/button';\nimport { FieldLabel } from '@/features/settings/channels/field-primitives';\nimport {\n VoiceApiKeyField,\n type VoiceApiKeyFieldLabels,\n} from '@/features/settings/voice-api-key-field';\nimport {\n fetchVoiceSettings,\n fetchVoiceSttProviders,\n patchVoiceSettings,\n type VoiceSettingsState,\n} from '@/features/settings/voice-config-api';\nimport { nativeSelectMaxWidthClass, selectControlBaseClass, settingsInputFocusClass } from '@/lib/form-field-width';\nimport { cn } from '@/lib/cn';\nimport { fetchJson } from '@/lib/fetch';\nimport { apiUrl } from '@/lib/url';\nimport { messages } from '@/i18n/messages';\nimport { useGatewayStore } from '@/stores/gateway-store';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nconst GROQ_MODELS = [\n { id: 'whisper-large-v3-turbo', name: 'Whisper Large v3 Turbo' },\n { id: 'whisper-large-v3', name: 'Whisper Large v3' },\n] as const;\n\ntype ExtensionDetailResponse = {\n manifest?: {\n mediaUnderstandingProviders?: string[];\n contracts?: { mediaUnderstandingProviders?: string[] };\n };\n};\n\nfunction resolveMediaProviderId(detail: ExtensionDetailResponse | undefined): string | undefined {\n const primary = detail?.manifest?.mediaUnderstandingProviders?.[0];\n if (typeof primary === 'string' && primary.trim()) {\n return primary.trim();\n }\n const contract = detail?.manifest?.contracts?.mediaUnderstandingProviders?.[0];\n if (typeof contract === 'string' && contract.trim()) {\n return contract.trim();\n }\n return undefined;\n}\n\nfunction selectClassName(): string {\n return cn(selectControlBaseClass, nativeSelectMaxWidthClass);\n}\n\nfunction inputClassName(): string {\n return cn(\n 'w-full rounded-lg border border-edge bg-surface-panel px-3 py-2 text-sm text-fg',\n 'placeholder:text-fg-subtle',\n settingsInputFocusClass,\n 'dark:border-edge',\n );\n}\n\ntype SttCredSlice = { apiKey: string; model: string };\n\nfunction savedSliceFromVoiceSettings(\n voiceSettings: VoiceSettingsState | undefined,\n providerId: string | undefined,\n): SttCredSlice {\n if (!voiceSettings || !providerId) return { apiKey: '', model: GROQ_MODELS[0].id };\n if (providerId === 'alibaba') {\n return {\n apiKey: voiceSettings.stt.alibaba?.apiKey ?? '',\n model: voiceSettings.stt.alibaba?.model ?? 'paraformer-v2',\n };\n }\n if (providerId === 'openai') {\n return {\n apiKey: voiceSettings.stt.openai?.apiKey ?? '',\n model: voiceSettings.stt.openai?.model ?? 'whisper-1',\n };\n }\n const slice = voiceSettings.stt.providers?.[providerId];\n return {\n apiKey: typeof slice?.apiKey === 'string' ? slice.apiKey : '',\n model: typeof slice?.model === 'string' ? slice.model : GROQ_MODELS[0].id,\n };\n}\n\nfunction ExtensionSttProviderSettingsBody({\n providerId,\n voiceSettings,\n mutateVoice,\n}: {\n providerId: string;\n voiceSettings: VoiceSettingsState;\n mutateVoice: ReturnType<typeof useSWR<VoiceSettingsState>>['mutate'];\n}) {\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const v = m.voiceSettings;\n const xs = m.extensionSttMedia;\n const apiKeyLabels: VoiceApiKeyFieldLabels = {\n maskedHelp: v.apiKeyMaskedHelp,\n copy: v.apiKeyCopy,\n copied: v.apiKeyCopied,\n show: v.apiKeyShow,\n hide: v.apiKeyHide,\n notInConfigFile: v.apiKeyNotInConfigFile,\n loadFailed: v.apiKeyRevealFailed,\n };\n\n const { data: sttProviders } = useSWR(\n apiUrl('/api/voice/stt-providers'),\n fetchVoiceSttProviders,\n { revalidateOnFocus: false },\n );\n\n const configured = useMemo(\n () => sttProviders?.providers.some((p) => p.id === providerId && p.configured) ?? false,\n [providerId, sttProviders],\n );\n\n const savedSlice = useMemo(\n () => savedSliceFromVoiceSettings(voiceSettings, providerId),\n [providerId, voiceSettings],\n );\n\n const dirtyRef = useRef(false);\n const [localDraft, setLocalDraft] = useState<SttCredSlice | null>(null);\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [savedFlash, setSavedFlash] = useState(false);\n\n const credDraft = localDraft ?? savedSlice;\n const credBaseline = savedSlice;\n\n const dirty =\n credDraft.apiKey !== credBaseline.apiKey || credDraft.model !== credBaseline.model;\n\n const handleSave = useCallback(async () => {\n setSaving(true);\n setError(null);\n try {\n const next: VoiceSettingsState = structuredClone(voiceSettings);\n next.stt.enabled = true;\n if (providerId === 'alibaba') {\n next.stt.provider = 'alibaba';\n next.stt.alibaba = { ...next.stt.alibaba, apiKey: credDraft.apiKey, model: credDraft.model };\n } else if (providerId === 'openai') {\n next.stt.provider = 'openai';\n next.stt.openai = { ...next.stt.openai, apiKey: credDraft.apiKey, model: credDraft.model };\n } else {\n next.stt.providers = {\n ...(next.stt.providers ?? {}),\n [providerId]: {\n ...(next.stt.providers?.[providerId] ?? {}),\n apiKey: credDraft.apiKey,\n model: credDraft.model,\n },\n };\n if (!next.stt.provider || next.stt.provider === 'alibaba' || next.stt.provider === 'openai') {\n next.stt.provider = providerId;\n }\n }\n await patchVoiceSettings(next);\n await mutateVoice(next, false);\n dirtyRef.current = false;\n setLocalDraft(null);\n setSavedFlash(true);\n window.setTimeout(() => setSavedFlash(false), 2500);\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n } finally {\n setSaving(false);\n }\n }, [credDraft.apiKey, credDraft.model, mutateVoice, providerId, voiceSettings]);\n\n const modelOptions = providerId === 'groq' ? GROQ_MODELS : [{ id: credDraft.model, name: credDraft.model }];\n\n return (\n <div className=\"flex flex-col gap-4 rounded-xl border border-edge bg-surface-base p-4\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <div>\n <h2 className=\"text-sm font-semibold text-fg\">{xs.credentialsTitle}</h2>\n <p className=\"mt-1 text-xs text-fg-muted\">\n {xs.credentialsHint.replace('{providerId}', providerId)}\n </p>\n </div>\n <span\n className={cn(\n 'rounded-full px-2 py-0.5 text-xs font-medium',\n configured\n ? 'bg-emerald-500/10 text-emerald-700 dark:text-emerald-300'\n : 'bg-amber-500/10 text-amber-800 dark:text-amber-200',\n )}\n >\n {configured ? xs.configured : xs.notConfigured}\n </span>\n </div>\n\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <div className={cn('flex flex-col gap-1.5', nativeSelectMaxWidthClass)}>\n <FieldLabel>{v.stt.apiKey}</FieldLabel>\n <VoiceApiKeyField\n kind=\"stt\"\n providerId={providerId}\n fieldId={`ext-stt-${providerId}-api-key`}\n value={credDraft.apiKey}\n onChange={(next) => {\n dirtyRef.current = true;\n setLocalDraft((prev) => {\n const base = prev ?? savedSlice;\n return { ...base, apiKey: next };\n });\n setError(null);\n }}\n labels={apiKeyLabels}\n placeholder={providerId === 'groq' ? 'gsk_...' : 'sk-...'}\n />\n <p className=\"text-xs text-fg-subtle\">\n {v.stt.apiKeyDesc}\n {providerId === 'groq' ? ' (GROQ_API_KEY)' : ''}\n </p>\n </div>\n <div className={cn('flex flex-col gap-1.5', nativeSelectMaxWidthClass)}>\n <FieldLabel>{v.stt.model}</FieldLabel>\n {providerId === 'groq' ? (\n <select\n className={selectClassName()}\n value={credDraft.model}\n onChange={(e) => {\n dirtyRef.current = true;\n setLocalDraft((prev) => {\n const base = prev ?? savedSlice;\n return { ...base, model: e.target.value };\n });\n setError(null);\n }}\n >\n {modelOptions.map((entry) => (\n <option key={entry.id} value={entry.id}>\n {entry.name}\n </option>\n ))}\n </select>\n ) : (\n <input\n className={inputClassName()}\n value={credDraft.model}\n onChange={(e) => {\n dirtyRef.current = true;\n setLocalDraft((prev) => {\n const base = prev ?? savedSlice;\n return { ...base, model: e.target.value };\n });\n setError(null);\n }}\n />\n )}\n </div>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n {savedFlash ? (\n <span className=\"text-xs text-emerald-600 dark:text-emerald-400\">{v.saved}</span>\n ) : null}\n {error ? <span className=\"text-xs text-red-600 dark:text-red-400\">{error}</span> : null}\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"h-8 text-xs\"\n disabled={!dirty || saving}\n onClick={() => {\n dirtyRef.current = false;\n setLocalDraft(null);\n setError(null);\n }}\n >\n {v.discard}\n </Button>\n <Button\n type=\"button\"\n variant=\"primary\"\n className=\"h-8 text-xs\"\n disabled={!dirty || saving}\n onClick={() => void handleSave()}\n >\n {saving ? v.saving : v.save}\n </Button>\n </div>\n </div>\n );\n}\n\nexport function ExtensionSttProviderSettings({ extensionId }: { extensionId: string }) {\n const language = useLocaleStore((s) => s.language);\n const hasToken = useGatewayStore((s) => Boolean(s.token));\n\n const { data: detail, isLoading: detailLoading } = useSWR(\n hasToken && extensionId ? `ext-stt-detail-${extensionId}` : null,\n () => fetchJson<ExtensionDetailResponse>(apiUrl(`/api/extensions/${encodeURIComponent(extensionId)}`)),\n );\n\n const providerId = resolveMediaProviderId(detail);\n\n const {\n data: voiceSettings,\n mutate: mutateVoice,\n isLoading: voiceLoading,\n } = useSWR(hasToken ? 'voice-settings-ext-stt' : null, fetchVoiceSettings, {\n revalidateOnFocus: false,\n });\n\n if (!hasToken) {\n return null;\n }\n\n if (detailLoading || voiceLoading) {\n return (\n <div className=\"flex items-center gap-2 py-6 text-sm text-fg-muted\">\n <Loader2 className=\"size-4 animate-spin\" />\n …\n </div>\n );\n }\n\n if (!providerId) {\n return (\n <p className=\"text-sm text-fg-muted\">\n {language === 'zh'\n ? '该扩展未声明 mediaUnderstandingProviders。'\n : 'This extension does not declare mediaUnderstandingProviders.'}\n </p>\n );\n }\n\n if (!voiceSettings) {\n return null;\n }\n\n return (\n <ExtensionSttProviderSettingsBody\n key={`${extensionId}:${providerId}`}\n providerId={providerId}\n voiceSettings={voiceSettings}\n mutateVoice={mutateVoice}\n />\n );\n}\n","import { useCallback, useMemo } from 'react';\n\nimport { cn } from '@/lib/cn';\n\nexport type JsonSchema = Record<string, unknown>;\n\ntype SchemaFormProps = {\n schema: JsonSchema;\n values: Record<string, unknown>;\n onChange: (values: Record<string, unknown>) => void;\n disabled?: boolean;\n className?: string;\n};\n\nfunction isRecord(x: unknown): x is Record<string, unknown> {\n return typeof x === 'object' && x !== null && !Array.isArray(x);\n}\n\ntype FieldDef = {\n key: string;\n sub: JsonSchema;\n order: number;\n group: string;\n hidden: boolean;\n};\n\nfunction getXOrder(s: JsonSchema): number {\n const v = s['x-order'];\n return typeof v === 'number' && !Number.isNaN(v) ? v : 999;\n}\n\nfunction getXGroup(s: JsonSchema): string {\n const v = s['x-group'];\n return typeof v === 'string' && v.length > 0 ? v : '';\n}\n\nfunction isHidden(s: JsonSchema): boolean {\n return s['x-hidden'] === true;\n}\n\nfunction sortedFields(schema: JsonSchema): FieldDef[] {\n const props = schema.properties;\n if (!isRecord(props)) return [];\n const out: FieldDef[] = [];\n for (const [key, sub] of Object.entries(props)) {\n if (!isRecord(sub)) continue;\n if (isHidden(sub)) continue;\n out.push({\n key,\n sub: sub,\n order: getXOrder(sub),\n group: getXGroup(sub),\n hidden: false,\n });\n }\n out.sort((a, b) => a.order - b.order || a.key.localeCompare(b.key));\n return out;\n}\n\nfunction groupFields(fields: FieldDef[]): Map<string, FieldDef[]> {\n const m = new Map<string, FieldDef[]>();\n for (const f of fields) {\n const g = f.group;\n if (!m.has(g)) m.set(g, []);\n m.get(g)!.push(f);\n }\n return m;\n}\n\nfunction StringField({\n name,\n s,\n value,\n onChange,\n disabled,\n}: {\n name: string;\n s: JsonSchema;\n value: string;\n onChange: (v: string) => void;\n disabled: boolean;\n}) {\n const desc = typeof s.description === 'string' ? s.description : undefined;\n const placeholder =\n (typeof s['x-placeholder'] === 'string' ? s['x-placeholder'] : null) || desc;\n const fmt = s.format;\n if (Array.isArray(s.enum) && s.enum.every((x) => typeof x === 'string')) {\n return (\n <div className=\"flex flex-col gap-1.5\">\n {desc ? <label className=\"text-xs text-fg-muted\">{desc}</label> : null}\n <select\n name={name}\n className=\"ui-input h-9 rounded-md border border-edge bg-surface-base px-2 text-sm text-fg\"\n value={value}\n disabled={disabled}\n onChange={(e) => onChange(e.target.value)}\n >\n {(s.enum).map((op) => (\n <option key={op} value={op}>\n {op}\n </option>\n ))}\n </select>\n </div>\n );\n }\n const inputType = fmt === 'password' ? 'password' : 'text';\n return (\n <div className=\"flex flex-col gap-1.5\">\n {desc ? <label className=\"text-xs text-fg-muted\">{desc}</label> : null}\n <input\n name={name}\n type={inputType}\n className=\"ui-input h-9 rounded-md border border-edge bg-surface-base px-2.5 text-sm text-fg placeholder:text-fg-muted/70\"\n value={value}\n placeholder={placeholder}\n disabled={disabled}\n onChange={(e) => onChange(e.target.value)}\n />\n </div>\n );\n}\n\nfunction NumberField({\n s,\n value,\n onChange,\n disabled,\n}: {\n s: JsonSchema;\n value: number;\n onChange: (v: number) => void;\n disabled: boolean;\n}) {\n const desc = typeof s.description === 'string' ? s.description : undefined;\n return (\n <div className=\"flex flex-col gap-1.5\">\n {desc ? <label className=\"text-xs text-fg-muted\">{desc}</label> : null}\n <input\n type=\"number\"\n className=\"ui-input h-9 rounded-md border border-edge bg-surface-base px-2.5 text-sm text-fg\"\n value={Number.isFinite(value) ? value : 0}\n disabled={disabled}\n onChange={(e) => onChange(Number(e.target.value))}\n />\n </div>\n );\n}\n\nfunction BooleanField({\n s,\n value,\n onChange,\n disabled,\n}: {\n s: JsonSchema;\n value: boolean;\n onChange: (v: boolean) => void;\n disabled: boolean;\n}) {\n const desc = typeof s.description === 'string' ? s.description : undefined;\n const labelText =\n desc ?? (typeof s.title === 'string' && s.title.length > 0 ? s.title : 'Enable');\n return (\n <label className=\"flex items-center gap-2 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"size-4 rounded border border-edge\"\n checked={value}\n disabled={disabled}\n onChange={(e) => onChange(e.target.checked)}\n />\n <span>{labelText}</span>\n </label>\n );\n}\n\nfunction ArrayStringField({\n s,\n value,\n onChange,\n disabled,\n}: {\n s: JsonSchema;\n value: string[];\n onChange: (v: string[]) => void;\n disabled: boolean;\n}) {\n const desc = typeof s.description === 'string' ? s.description : undefined;\n const items = s.items;\n const isStringItems = isRecord(items) && items.type === 'string';\n if (!isStringItems) {\n return <p className=\"text-xs text-fg-muted\">Unsupported array type</p>;\n }\n const add = (t: string) => {\n const n = t.trim();\n if (!n || value.includes(n)) return;\n onChange([...value, n]);\n };\n return (\n <div className=\"flex flex-col gap-1.5\">\n {desc ? <label className=\"text-xs text-fg-muted\">{desc}</label> : null}\n <div className=\"flex flex-wrap gap-1\">\n {value.map((t) => (\n <span\n key={t}\n className=\"inline-flex items-center gap-1 rounded-md border border-edge bg-surface-panel px-2 py-0.5 text-sm\"\n >\n {t}\n <button\n type=\"button\"\n className=\"text-fg-muted hover:text-fg\"\n disabled={disabled}\n onClick={() => onChange(value.filter((x) => x !== t))}\n >\n ×\n </button>\n </span>\n ))}\n </div>\n <input\n className=\"ui-input h-9 rounded-md border border-edge bg-surface-base px-2.5 text-sm\"\n disabled={disabled}\n placeholder=\"Add and press Enter\"\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n add((e.target as HTMLInputElement).value);\n (e.target as HTMLInputElement).value = '';\n }\n }}\n />\n </div>\n );\n}\n\nfunction FieldRow({\n k,\n sub,\n value,\n onValue,\n disabled,\n}: {\n k: string;\n sub: JsonSchema;\n value: unknown;\n onValue: (next: unknown) => void;\n disabled: boolean;\n}) {\n const t = sub.type;\n const title =\n (typeof sub.title === 'string' && sub.title.length > 0 ? sub.title : null) ?? k;\n if (t === 'boolean') {\n return (\n <div className=\"space-y-1.5\">\n <p className=\"text-sm font-medium text-fg\">{title}</p>\n <BooleanField\n s={sub}\n value={value === true}\n disabled={disabled}\n onChange={(b) => onValue(b)}\n />\n </div>\n );\n }\n if (t === 'number' || t === 'integer') {\n return (\n <div className=\"space-y-1.5\">\n <p className=\"text-sm font-medium text-fg\">{title}</p>\n <NumberField\n s={sub}\n value={typeof value === 'number' ? value : 0}\n disabled={disabled}\n onChange={onValue}\n />\n </div>\n );\n }\n if (t === 'string') {\n return (\n <div className=\"space-y-1.5\">\n <p className=\"text-sm font-medium text-fg\">{title}</p>\n <StringField\n name={k}\n s={sub}\n value={typeof value === 'string' ? value : ''}\n disabled={disabled}\n onChange={onValue}\n />\n </div>\n );\n }\n if (t === 'array') {\n const items = sub.items;\n if (isRecord(items) && items.type === 'string') {\n return (\n <div className=\"space-y-1.5\">\n <p className=\"text-sm font-medium text-fg\">{title}</p>\n <ArrayStringField\n s={sub}\n value={Array.isArray(value) && value.every((x) => typeof x === 'string') ? value : []}\n disabled={disabled}\n onChange={onValue}\n />\n </div>\n );\n }\n }\n return (\n <p className=\"text-xs text-fg-muted\">\n {title}: unsupported field type\n {typeof t === 'string' ? ` (${t})` : ''}\n </p>\n );\n}\n\n/**\n * Renders a JSON Schema (type: object) as a form using Gateway Console design tokens.\n */\nexport function SchemaForm({ schema, values, onChange, disabled = false, className }: SchemaFormProps) {\n const fields = useMemo(() => {\n if (schema.type !== 'object') return [];\n return sortedFields(schema);\n }, [schema]);\n\n const grouped = useMemo(() => {\n if (fields.length === 0) return new Map<string, FieldDef[]>();\n return groupFields(fields);\n }, [fields]);\n\n const setKey = useCallback(\n (key: string, next: unknown) => {\n onChange({ ...values, [key]: next });\n },\n [onChange, values],\n );\n\n if (schema.type !== 'object' || !isRecord(schema.properties) || fields.length === 0) {\n return null;\n }\n\n const groupKeys = Array.from(grouped.keys()).sort((a, b) => {\n if (a === '') return -1;\n if (b === '') return 1;\n return a.localeCompare(b);\n });\n\n return (\n <div className={cn('flex flex-col gap-4', className)}>\n {groupKeys.map((gk) => {\n const list = grouped.get(gk) ?? [];\n const block = list.map((f) => (\n <FieldRow\n key={f.key}\n k={f.key}\n sub={f.sub}\n value={values[f.key]}\n onValue={(v) => setKey(f.key, v)}\n disabled={disabled}\n />\n ));\n if (gk === '') {\n return <div key=\"default\">{block}</div>;\n }\n return (\n <details\n key={gk}\n className=\"group rounded-lg border border-edge bg-surface-panel/40 open:bg-surface-base\"\n open\n >\n <summary className=\"cursor-pointer select-none px-3 py-2 text-sm font-medium text-fg group-open:rounded-b-none\">\n {gk}\n </summary>\n <div className=\"space-y-4 border-t border-edge p-3\">{block}</div>\n </details>\n );\n })}\n </div>\n );\n}\n\n/** Extract per-key defaults from a JSON object schema for \"Reset\" actions. */\nexport function extractObjectDefaults(\n schema: JsonSchema,\n): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n if (schema.type !== 'object' || !isRecord(schema.properties)) {\n return out;\n }\n for (const [k, sub] of Object.entries(schema.properties)) {\n if (!isRecord(sub)) continue;\n if (Object.prototype.hasOwnProperty.call(sub, 'default')) {\n out[k] = sub.default;\n }\n }\n return out;\n}\n","import { useCallback, useMemo, useReducer, useRef, useState } from 'react';\nimport useSWR from 'swr';\n\nimport { Button } from '@/components/ui/button';\nimport { extractObjectDefaults, SchemaForm, type JsonSchema } from '@/components/ui/schema-form';\nimport { apiFetch, fetchJson } from '@/lib/fetch';\nimport { apiUrl } from '@/lib/url';\nimport { messages } from '@/i18n/messages';\nimport { useGatewayStore } from '@/stores/gateway-store';\nimport { useLocaleStore } from '@/stores/locale-store';\n\ntype ExtensionDetailResponse = {\n manifest: { configSchema?: JsonSchema };\n};\n\ntype ExtensionSettingsDraft = {\n localValues: Record<string, unknown>;\n isDirty: boolean;\n saving: boolean;\n saveError: string | null;\n saveSuccess: boolean;\n};\n\ntype ExtensionSettingsAction =\n | { type: 'sync'; value: Record<string, unknown> }\n | { type: 'change'; value: Record<string, unknown> }\n | { type: 'discard'; value: Record<string, unknown> }\n | { type: 'reset-defaults'; value: Record<string, unknown> }\n | { type: 'save-start' }\n | { type: 'save-success'; value: Record<string, unknown> }\n | { type: 'save-error'; message: string };\n\nfunction extensionSettingsReducer(\n state: ExtensionSettingsDraft,\n action: ExtensionSettingsAction,\n): ExtensionSettingsDraft {\n switch (action.type) {\n case 'sync':\n return { ...state, localValues: action.value, isDirty: false, saveError: null };\n case 'change':\n return { ...state, localValues: action.value, isDirty: true, saveError: null, saveSuccess: false };\n case 'discard':\n return { ...state, localValues: action.value, isDirty: false, saveError: null };\n case 'reset-defaults':\n return { ...state, localValues: action.value, isDirty: true, saveError: null, saveSuccess: false };\n case 'save-start':\n return { ...state, saving: true, saveError: null };\n case 'save-success':\n return {\n ...state,\n localValues: action.value,\n isDirty: false,\n saving: false,\n saveSuccess: true,\n saveError: null,\n };\n case 'save-error':\n return { ...state, saving: false, saveError: action.message };\n }\n}\n\nexport function ExtensionAutoSettings({ extensionId }: { extensionId: string }) {\n const language = useLocaleStore((s) => s.language);\n const a = messages(language).agentSettings;\n const hasToken = useGatewayStore((s) => Boolean(s.token));\n const { data: detail, error: detailError } = useSWR(\n hasToken && extensionId ? `ext-detail-${extensionId}` : null,\n () => fetchJson<ExtensionDetailResponse>(apiUrl(`/api/extensions/${encodeURIComponent(extensionId)}`)),\n );\n\n const { data: remoteConfig, mutate: mutateConfig, error: configError } = useSWR(\n hasToken && extensionId ? `ext-cfg-${extensionId}` : null,\n () =>\n fetchJson<Record<string, unknown>>(\n apiUrl(`/api/extensions/${encodeURIComponent(extensionId)}/config`),\n ),\n );\n\n const schema = detail?.manifest?.configSchema;\n const defaults = useMemo(\n () => (schema && schema.type === 'object' ? extractObjectDefaults(schema) : {}),\n [schema],\n );\n\n const savedValues = useMemo(\n () => ({ ...defaults, ...(remoteConfig ?? {}) }),\n [defaults, remoteConfig],\n );\n\n const [draft, dispatch] = useReducer(extensionSettingsReducer, {\n localValues: {},\n isDirty: false,\n saving: false,\n saveError: null,\n saveSuccess: false,\n });\n const [saveSuccessFlash, setSaveSuccessFlash] = useState(false);\n\n const dirtyRef = useRef(false);\n const trackedSavedRef = useRef(savedValues);\n if (!dirtyRef.current && trackedSavedRef.current !== savedValues) {\n trackedSavedRef.current = savedValues;\n dispatch({ type: 'sync', value: savedValues });\n }\n\n const onChange = useCallback((next: Record<string, unknown>) => {\n dirtyRef.current = true;\n dispatch({ type: 'change', value: next });\n }, []);\n\n const handleDiscard = useCallback(() => {\n dirtyRef.current = false;\n dispatch({ type: 'discard', value: savedValues });\n }, [savedValues]);\n\n const handleResetDefaults = useCallback(() => {\n if (!schema || schema.type !== 'object') return;\n dirtyRef.current = true;\n dispatch({ type: 'reset-defaults', value: { ...extractObjectDefaults(schema) } });\n }, [schema]);\n\n const handleSave = useCallback(async () => {\n if (!extensionId) return;\n dispatch({ type: 'save-start' });\n try {\n const res = await apiFetch(\n apiUrl(`/api/extensions/${encodeURIComponent(extensionId)}/config`),\n { method: 'PATCH', body: JSON.stringify(draft.localValues) },\n );\n if (!res.ok) {\n const body = (await res.json().catch(() => ({}))) as { error?: { message?: string } };\n throw new Error(body.error?.message ?? res.statusText);\n }\n await mutateConfig(draft.localValues, false);\n dirtyRef.current = false;\n dispatch({ type: 'save-success', value: draft.localValues });\n setSaveSuccessFlash(true);\n window.setTimeout(() => setSaveSuccessFlash(false), 3000);\n } catch (e) {\n dispatch({ type: 'save-error', message: e instanceof Error ? e.message : String(e) });\n }\n }, [draft.localValues, extensionId, mutateConfig]);\n\n if (!hasToken) {\n return null;\n }\n\n if (detailError || configError) {\n const err = (detailError ?? configError) as Error;\n return (\n <p className=\"text-sm text-fg-muted\">\n Could not load extension settings: {err instanceof Error ? err.message : String(err)}\n </p>\n );\n }\n\n if (!schema || schema.type !== 'object') {\n return null;\n }\n\n return (\n <div className=\"mb-6 flex flex-col gap-3 rounded-xl border border-edge bg-surface-base p-4\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <h2 className=\"text-sm font-semibold text-fg\">Configuration</h2>\n <div className=\"flex flex-wrap items-center gap-2\">\n {saveSuccessFlash ? (\n <span className=\"text-xs text-emerald-600 dark:text-emerald-400\">{a.saved}</span>\n ) : null}\n {draft.saveError ? <span className=\"text-xs text-red-600 dark:text-red-400\">{draft.saveError}</span> : null}\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"h-8 text-xs\"\n disabled={!draft.isDirty}\n onClick={handleDiscard}\n >\n {a.discard}\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"h-8 text-xs\"\n onClick={handleResetDefaults}\n >\n Reset to defaults\n </Button>\n <Button\n type=\"button\"\n variant=\"primary\"\n className=\"h-8 text-xs\"\n disabled={!draft.isDirty || draft.saving}\n onClick={() => void handleSave()}\n >\n {draft.saving ? a.saving : a.save}\n </Button>\n </div>\n </div>\n <SchemaForm schema={schema} values={draft.localValues} onChange={onChange} disabled={draft.saving} />\n </div>\n );\n}\n","/**\n * Extension settings: auto-generated config form (configSchema) + optional iframe (settingsPanels).\n *\n * Routes: /settings/ext/:extensionId, /settings/ext/:extensionId/:panelId\n */\n\nimport { Link, useParams } from 'react-router-dom';\n\nimport { ExtensionImageProviderSettings } from '@/features/settings/extension-image-provider-settings';\nimport { ExtensionSttProviderSettings } from '@/features/settings/extension-stt-provider-settings';\nimport { messages } from '@/i18n/messages';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nimport { ExtensionAutoSettings } from './extension-auto-settings';\nimport { ExtensionIframeHost } from './extension-iframe-host';\nimport { useExtensions } from './extension-provider';\n\nexport function ExtensionSettingsPage() {\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const xm = m.extensionImageGen;\n const xs = m.extensionSttMedia;\n const { extensionId, panelId } = useParams<{ extensionId: string; panelId?: string }>();\n const extensions = useExtensions();\n\n if (!extensionId) {\n return <SettingsPanelNotFound message=\"No extension ID provided.\" />;\n }\n\n const extension = extensions.find((ext) => ext.id === extensionId);\n if (!extension) {\n return (\n <SettingsPanelNotFound\n message={`Extension \"${extensionId}\" not found or is not available in this workspace.`}\n />\n );\n }\n\n const panels = extension.ui?.contributions?.settingsPanels;\n const panel = panelId\n ? panels?.find((p) => p.id === panelId || p.id === `${extensionId}.${panelId}`)\n : panels?.[0];\n\n const hasIframe = Boolean(panel && extension.ui);\n const hasAutoForm = Boolean(extension.hasConfigSchema);\n const isImageGeneration = extension.kind === 'image-generation';\n const isMediaProvider = extension.kind === 'media-provider';\n const hasProviderCredentialsUi = isImageGeneration || isMediaProvider;\n\n if (!hasAutoForm && !hasIframe && !hasProviderCredentialsUi) {\n return (\n <SettingsPanelNotFound\n message={`Extension \"${extensionId}\" has no settings panels or config schema.`}\n />\n );\n }\n\n const title = panel?.title ?? `${extension.name} Settings`;\n\n return (\n <div className=\"mx-auto flex w-full max-w-app-main flex-col gap-3 px-4 py-8\">\n <h1 className=\"text-lg font-semibold text-fg\">{title}</h1>\n {isImageGeneration ? (\n <div className=\"flex flex-col gap-2 rounded-lg border border-edge-subtle bg-surface-base px-4 py-3 text-sm\">\n <p className=\"leading-relaxed text-fg-muted\">{xm.banner}</p>\n <Link\n to=\"/settings/image-models\"\n className=\"w-fit font-medium text-accent hover:underline\"\n title={m.imageModelsSettings.imageModelsLinkTitle}\n >\n {xm.openImageModels}\n </Link>\n </div>\n ) : null}\n {isImageGeneration ? <ExtensionImageProviderSettings extensionId={extensionId} /> : null}\n {isMediaProvider ? (\n <div className=\"flex flex-col gap-2 rounded-lg border border-edge-subtle bg-surface-base px-4 py-3 text-sm\">\n <p className=\"leading-relaxed text-fg-muted\">{xs.banner}</p>\n <Link to=\"/settings/voice\" className=\"w-fit font-medium text-accent hover:underline\">\n {xs.openVoice}\n </Link>\n </div>\n ) : null}\n {isMediaProvider ? <ExtensionSttProviderSettings extensionId={extensionId} /> : null}\n {hasAutoForm ? <ExtensionAutoSettings extensionId={extensionId} /> : null}\n {hasIframe && panel && extension.ui ? (\n <div className=\"overflow-hidden rounded-xl border border-edge bg-surface-base\">\n <ExtensionIframeHost\n extensionId={extensionId}\n extensionName={extension.name}\n entrypoint={panel.entrypoint}\n permissions={extension.ui?.permissions}\n title={panel.title}\n className=\"w-full\"\n minHeight={120}\n maxHeight={2000}\n />\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction SettingsPanelNotFound({ message }: { message: string }) {\n return (\n <div className=\"mx-auto flex w-full max-w-app-main flex-col gap-3 px-4 py-8\">\n <p className=\"text-sm text-fg-muted\">{message}</p>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{n as e,t}from"./vendor-react-BOUWij0V.js";import{n}from"./utils-DVw8OvAC.js";var r=e(),i=t();function a(e){let t=(0,r.c)(2),{children:n}=e,a;return t[0]===n?a=t[1]:(a=(0,i.jsx)(`div`,{className:`text-sm font-medium text-fg`,children:n}),t[0]=n,t[1]=a),a}function o(e){let t=(0,r.c)(2),{children:n}=e,a;return t[0]===n?a=t[1]:(a=(0,i.jsx)(`p`,{className:`text-xs leading-relaxed text-fg-subtle`,children:n}),t[0]=n,t[1]=a),a}function s(e){let t=(0,r.c)(14),{label:o,value:s,onChange:l,options:u}=e,d;t[0]===o?d=t[1]:(d=(0,i.jsx)(a,{children:o}),t[0]=o,t[1]=d);let f;t[2]===Symbol.for(`react.memo_cache_sentinel`)?(f=n(),t[2]=f):f=t[2];let p;t[3]===l?p=t[4]:(p=e=>l(e.target.value),t[3]=l,t[4]=p);let m;t[5]===u?m=t[6]:(m=u.map(c),t[5]=u,t[6]=m);let h;t[7]!==p||t[8]!==m||t[9]!==s?(h=(0,i.jsx)(`select`,{className:f,value:s,onChange:p,children:m}),t[7]=p,t[8]=m,t[9]=s,t[10]=h):h=t[10];let g;return t[11]!==d||t[12]!==h?(g=(0,i.jsxs)(`div`,{className:`flex flex-col gap-1.5`,children:[d,h]}),t[11]=d,t[12]=h,t[13]=g):g=t[13],g}function c(e){return(0,i.jsx)(`option`,{value:e.value,children:e.label},e.value)}export{a as n,s as r,o as t};
2
- //# sourceMappingURL=field-primitives-CrexIsCD.js.map
1
+ import{n as e,t}from"./vendor-react-BOUWij0V.js";import{n}from"./utils-COYrNFF7.js";var r=e(),i=t();function a(e){let t=(0,r.c)(2),{children:n}=e,a;return t[0]===n?a=t[1]:(a=(0,i.jsx)(`div`,{className:`text-sm font-medium text-fg`,children:n}),t[0]=n,t[1]=a),a}function o(e){let t=(0,r.c)(2),{children:n}=e,a;return t[0]===n?a=t[1]:(a=(0,i.jsx)(`p`,{className:`text-xs leading-relaxed text-fg-subtle`,children:n}),t[0]=n,t[1]=a),a}function s(e){let t=(0,r.c)(14),{label:o,value:s,onChange:l,options:u}=e,d;t[0]===o?d=t[1]:(d=(0,i.jsx)(a,{children:o}),t[0]=o,t[1]=d);let f;t[2]===Symbol.for(`react.memo_cache_sentinel`)?(f=n(),t[2]=f):f=t[2];let p;t[3]===l?p=t[4]:(p=e=>l(e.target.value),t[3]=l,t[4]=p);let m;t[5]===u?m=t[6]:(m=u.map(c),t[5]=u,t[6]=m);let h;t[7]!==p||t[8]!==m||t[9]!==s?(h=(0,i.jsx)(`select`,{className:f,value:s,onChange:p,children:m}),t[7]=p,t[8]=m,t[9]=s,t[10]=h):h=t[10];let g;return t[11]!==d||t[12]!==h?(g=(0,i.jsxs)(`div`,{className:`flex flex-col gap-1.5`,children:[d,h]}),t[11]=d,t[12]=h,t[13]=g):g=t[13],g}function c(e){return(0,i.jsx)(`option`,{value:e.value,children:e.label},e.value)}export{a as n,s as r,o as t};
2
+ //# sourceMappingURL=field-primitives-Z76hyBYS.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"field-primitives-CrexIsCD.js","names":["ReactNode","channelsSelectClassName","FieldLabel","t0","$","_c","children","t1","FieldHint","SelectFieldProps","label","value","T","onChange","v","options","SelectField","t2","Symbol","for","t3","e","target","t4","map","_temp","t5","t6","o"],"sources":["../../../../../web/src/features/settings/channels/field-primitives.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { channelsSelectClassName } from './utils';\n\nexport function FieldLabel({ children }: { children: ReactNode }) {\n return <div className=\"text-sm font-medium text-fg\">{children}</div>;\n}\n\nexport function FieldHint({ children }: { children: ReactNode }) {\n return <p className=\"text-xs leading-relaxed text-fg-subtle\">{children}</p>;\n}\n\ntype SelectFieldProps<T extends string> = {\n label: string;\n value: T;\n onChange: (v: T) => void;\n options: { value: T; label: string }[];\n};\n\nexport function SelectField<T extends string>({ label, value, onChange, options }: SelectFieldProps<T>) {\n return (\n <div className=\"flex flex-col gap-1.5\">\n <FieldLabel>{label}</FieldLabel>\n <select className={channelsSelectClassName()} value={value} onChange={(e) => onChange(e.target.value as T)}>\n {options.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n </select>\n </div>\n );\n}\n"],"mappings":"oGAIA,SAAOE,EAAAC,EAAA,CAAA,IAAAC,GAAAA,EAAAA,EAAAA,GAAA,CAAA,EAAoB,CAAAE,YAAAH,EAAqCI,EACM,OADNH,EAAA,KAAAE,EACMC,EAAAH,EAAA,IAA7DG,GAAA,EAAA,EAAA,KAAA,MAAA,CAAe,UAAA,8BAA+BD,UAAe,CAAA,EAAAF,EAAA,GAAAE,EAAAF,EAAA,GAAAG,GAA7DA,CAA6D,CAGtE,SAAOC,EAAAL,EAAA,CAAA,IAAAC,GAAAA,EAAAA,EAAAA,GAAA,CAAA,EAAmB,CAAAE,YAAAH,EAAqCI,EACc,OADdH,EAAA,KAAAE,EACcC,EAAAH,EAAA,IAApEG,GAAA,EAAA,EAAA,KAAA,IAAA,CAAa,UAAA,yCAA0CD,UAAa,CAAA,EAAAF,EAAA,GAAAE,EAAAF,EAAA,GAAAG,GAApEA,CAAoE,CAU7E,SAAOS,EAAAb,EAAA,CAAA,IAAAC,GAAAA,EAAAA,EAAAA,GAAA,EAAA,EAAuC,CAAAM,QAAAC,QAAAE,WAAAE,WAAAZ,EAAwDI,EAAAH,EAAA,KAAAM,EAGhEH,EAAAH,EAAA,IAAhCG,GAAA,EAAA,EAAA,KAAC,EAAD,CAAA,SAAaG,CAAF,CAAA,EAAqBN,EAAA,GAAAM,EAAAN,EAAA,GAAAG,GAAA,IAAAU,EAAAb,EAAA,KAAAc,OAAAC,IAAA,2BAAA,GACbF,EAAAhB,EAAwB,EAACG,EAAA,GAAAa,GAAAA,EAAAb,EAAA,GAAA,IAAAgB,EAAAhB,EAAA,KAAAS,EAA8DO,EAAAhB,EAAA,IAApCgB,EAAAC,GAAOR,EAASQ,EAACC,OAAOX,KAAW,EAACP,EAAA,GAAAS,EAAAT,EAAA,GAAAgB,GAAA,IAAAG,EAAAnB,EAAA,KAAAW,EAKtGQ,EAAAnB,EAAA,IAJDmB,EAAAR,EAAOS,IAAKC,CAIZ,EAACrB,EAAA,GAAAW,EAAAX,EAAA,GAAAmB,GAAA,IAAAG,EAAAtB,EAAA,KAAAgB,GAAAhB,EAAA,KAAAmB,GAAAnB,EAAA,KAAAO,GALJe,GAAA,EAAA,EAAA,KAAA,SAAA,CAAmB,UAAAT,EAAkCN,QAAiB,SAAAS,WACnEG,CAKM,CAAA,EAAAnB,EAAA,GAAAgB,EAAAhB,EAAA,GAAAmB,EAAAnB,EAAA,GAAAO,EAAAP,EAAA,IAAAsB,GAAAA,EAAAtB,EAAA,IAAA,IAAAuB,EACL,OADKvB,EAAA,MAAAG,GAAAH,EAAA,MAAAsB,GARXC,GAAA,EAAA,EAAA,MAAA,MAAA,CAAe,UAAA,iCAAf,CACEpB,EACAmB,CAOI,IAAAtB,EAAA,IAAAG,EAAAH,EAAA,IAAAsB,EAAAtB,EAAA,IAAAuB,GAAAA,EAAAvB,EAAA,IATNuB,CASM,CAXH,SAAAF,EAAAG,EAAA,CAAA,OAMG,EAAA,EAAA,KAAA,SAAA,CAA6B,MAAAA,EAACjB,eAC3BiB,EAAClB,KACK,EAFIkB,EAACjB,KAEL,CAAA"}
1
+ {"version":3,"file":"field-primitives-Z76hyBYS.js","names":["ReactNode","channelsSelectClassName","FieldLabel","t0","$","_c","children","t1","FieldHint","SelectFieldProps","label","value","T","onChange","v","options","SelectField","t2","Symbol","for","t3","e","target","t4","map","_temp","t5","t6","o"],"sources":["../../../../../web/src/features/settings/channels/field-primitives.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { channelsSelectClassName } from './utils';\n\nexport function FieldLabel({ children }: { children: ReactNode }) {\n return <div className=\"text-sm font-medium text-fg\">{children}</div>;\n}\n\nexport function FieldHint({ children }: { children: ReactNode }) {\n return <p className=\"text-xs leading-relaxed text-fg-subtle\">{children}</p>;\n}\n\ntype SelectFieldProps<T extends string> = {\n label: string;\n value: T;\n onChange: (v: T) => void;\n options: { value: T; label: string }[];\n};\n\nexport function SelectField<T extends string>({ label, value, onChange, options }: SelectFieldProps<T>) {\n return (\n <div className=\"flex flex-col gap-1.5\">\n <FieldLabel>{label}</FieldLabel>\n <select className={channelsSelectClassName()} value={value} onChange={(e) => onChange(e.target.value as T)}>\n {options.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n </select>\n </div>\n );\n}\n"],"mappings":"oGAIA,SAAOE,EAAAC,EAAA,CAAA,IAAAC,GAAAA,EAAAA,EAAAA,GAAA,CAAA,EAAoB,CAAAE,YAAAH,EAAqCI,EACM,OADNH,EAAA,KAAAE,EACMC,EAAAH,EAAA,IAA7DG,GAAA,EAAA,EAAA,KAAA,MAAA,CAAe,UAAA,8BAA+BD,UAAe,CAAA,EAAAF,EAAA,GAAAE,EAAAF,EAAA,GAAAG,GAA7DA,CAA6D,CAGtE,SAAOC,EAAAL,EAAA,CAAA,IAAAC,GAAAA,EAAAA,EAAAA,GAAA,CAAA,EAAmB,CAAAE,YAAAH,EAAqCI,EACc,OADdH,EAAA,KAAAE,EACcC,EAAAH,EAAA,IAApEG,GAAA,EAAA,EAAA,KAAA,IAAA,CAAa,UAAA,yCAA0CD,UAAa,CAAA,EAAAF,EAAA,GAAAE,EAAAF,EAAA,GAAAG,GAApEA,CAAoE,CAU7E,SAAOS,EAAAb,EAAA,CAAA,IAAAC,GAAAA,EAAAA,EAAAA,GAAA,EAAA,EAAuC,CAAAM,QAAAC,QAAAE,WAAAE,WAAAZ,EAAwDI,EAAAH,EAAA,KAAAM,EAGhEH,EAAAH,EAAA,IAAhCG,GAAA,EAAA,EAAA,KAAC,EAAD,CAAA,SAAaG,CAAF,CAAA,EAAqBN,EAAA,GAAAM,EAAAN,EAAA,GAAAG,GAAA,IAAAU,EAAAb,EAAA,KAAAc,OAAAC,IAAA,2BAAA,GACbF,EAAAhB,EAAwB,EAACG,EAAA,GAAAa,GAAAA,EAAAb,EAAA,GAAA,IAAAgB,EAAAhB,EAAA,KAAAS,EAA8DO,EAAAhB,EAAA,IAApCgB,EAAAC,GAAOR,EAASQ,EAACC,OAAOX,KAAW,EAACP,EAAA,GAAAS,EAAAT,EAAA,GAAAgB,GAAA,IAAAG,EAAAnB,EAAA,KAAAW,EAKtGQ,EAAAnB,EAAA,IAJDmB,EAAAR,EAAOS,IAAKC,CAIZ,EAACrB,EAAA,GAAAW,EAAAX,EAAA,GAAAmB,GAAA,IAAAG,EAAAtB,EAAA,KAAAgB,GAAAhB,EAAA,KAAAmB,GAAAnB,EAAA,KAAAO,GALJe,GAAA,EAAA,EAAA,KAAA,SAAA,CAAmB,UAAAT,EAAkCN,QAAiB,SAAAS,WACnEG,CAKM,CAAA,EAAAnB,EAAA,GAAAgB,EAAAhB,EAAA,GAAAmB,EAAAnB,EAAA,GAAAO,EAAAP,EAAA,IAAAsB,GAAAA,EAAAtB,EAAA,IAAA,IAAAuB,EACL,OADKvB,EAAA,MAAAG,GAAAH,EAAA,MAAAsB,GARXC,GAAA,EAAA,EAAA,MAAA,MAAA,CAAe,UAAA,iCAAf,CACEpB,EACAmB,CAOI,IAAAtB,EAAA,IAAAG,EAAAH,EAAA,IAAAsB,EAAAtB,EAAA,IAAAuB,GAAAA,EAAAvB,EAAA,IATNuB,CASM,CAXH,SAAAF,EAAAG,EAAA,CAAA,OAMG,EAAA,EAAA,KAAA,SAAA,CAA6B,MAAAA,EAACjB,eAC3BiB,EAAClB,KACK,EAFIkB,EAACjB,KAEL,CAAA"}
@@ -1,2 +1,2 @@
1
- import{i as e}from"./rolldown-runtime-aKtaBQYM.js";import{a as t,t as n}from"./vendor-react-BOUWij0V.js";import{i as r,n as i}from"./fetch-K_0JRCXU.js";import{o as a}from"./vendor-swr-BIWyz7Rc.js";import{n as o}from"./button-KafIU8dx.js";import{Rn as s,Vn as c,sn as l}from"./index-S3bgG2JF.js";import{m as u,p as d}from"./cron-dreaming-jobs-DueM3rBz.js";var f=e(t(),1),p=n(),m=Array.from({length:60},(e,t)=>t),h=o(c,`min-w-0 shrink text-xs sm:min-w-[7rem] sm:max-w-[11rem]`),g=o(`h-9 min-w-[6.5rem] shrink-0 rounded-lg border border-edge-subtle bg-surface-panel px-2 py-1.5 text-sm text-fg`,s,`dark:bg-surface-panel`),_=o(`h-9 min-w-[9.5rem] shrink-0 rounded-lg border border-edge-subtle bg-surface-panel px-2 py-1.5 text-sm text-fg`,s),v=o(`h-9 w-14 shrink-0 rounded-lg border border-edge-subtle bg-surface-panel px-2 py-1.5 text-center text-sm tabular-nums text-fg`,s),y=o(`min-h-[2.5rem] w-full rounded-lg border border-edge-subtle bg-surface-base px-3 py-2 font-mono text-xs text-fg`,s);function b(e){return{...e,intervalMinutesDraft:null,intervalHoursDraft:null}}function x(e){let{intervalMinutesDraft:t,intervalHoursDraft:n,...r}=e;return r}function S(e,t){switch(t.type){case`reset`:return b(t.state);case`replace`:return t.state}}function C({value:e,onChange:t,labels:n,disabled:r,showHeading:i=!0}){let a=(0,f.useMemo)(()=>u(e),[e]),[s,c]=(0,f.useReducer)(S,a,b),l=(0,f.useRef)(e);l.current!==e&&(l.current=e,c({type:`reset`,state:a}));let C=(0,f.useCallback)(e=>{let n={...s,...e};c({type:`replace`,state:n});let r=x(n),i=x(s);Object.keys(r).some(e=>r[e]!==i[e])&&t(d(r))},[t,s]),{mode:w,intervalKind:T,onceDate:E,intervalMinutes:D,intervalHours:O,minute:k,hour:A,weekDays:j,dayOfMonth:M,rawCron:N,intervalMinutesDraft:P,intervalHoursDraft:F}=s,I=`${String(A).padStart(2,`0`)}:${String(k).padStart(2,`0`)}`,L=e=>{let t=e.target.value;if(!t)return;let[n,r]=t.split(`:`).map(e=>parseInt(e,10));Number.isNaN(n)||Number.isNaN(r)||C({minute:r,hour:n})},R=(0,p.jsxs)(`div`,{className:`flex min-w-0 flex-nowrap items-center gap-2 overflow-x-auto pb-0.5`,children:[(0,p.jsxs)(`select`,{className:h,disabled:r,value:w,onChange:e=>{let t=e.target.value;C({mode:t})},"aria-label":n.scheduleTimeLabel,children:[(0,p.jsx)(`option`,{value:`no_repeat`,children:n.modeNoRepeat}),(0,p.jsx)(`option`,{value:`interval`,children:n.modeInterval}),(0,p.jsx)(`option`,{value:`hourly`,children:n.modeHourly}),(0,p.jsx)(`option`,{value:`daily`,children:n.modeDaily}),(0,p.jsx)(`option`,{value:`weekly`,children:n.modeWeekly}),(0,p.jsx)(`option`,{value:`monthly`,children:n.modeMonthly}),(0,p.jsx)(`option`,{value:`custom`,children:n.modeCustom})]}),w===`no_repeat`&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`input`,{type:`date`,disabled:r,className:_,value:E,onChange:e=>{C({onceDate:e.target.value})},"aria-label":n.modeNoRepeat}),(0,p.jsx)(`input`,{type:`time`,step:60,disabled:r,className:g,value:I,onChange:L,"aria-label":n.scheduleTimeLabel})]}),w===`interval`&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(`select`,{className:o(h,`w-auto min-w-[5rem]`),disabled:r,value:T,onChange:e=>{let t=e.target.value;C({intervalKind:t,intervalMinutesDraft:null,intervalHoursDraft:null})},"aria-label":n.modeInterval,children:[(0,p.jsx)(`option`,{value:`minutes`,children:n.intervalKindMinutes}),(0,p.jsx)(`option`,{value:`hours`,children:n.intervalKindHours})]}),T===`minutes`?(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`input`,{type:`number`,min:1,max:59,disabled:r,className:v,value:P??String(D),onChange:e=>{let t=e.target.value,n=parseInt(t,10),r={intervalMinutesDraft:t};Number.isFinite(n)&&n>=1&&n<=59&&(r.intervalMinutes=n),C(r)},onBlur:()=>{if(P===null)return;let e=parseInt(P,10);C({intervalMinutes:!Number.isFinite(e)||e<1?5:Math.min(59,Math.max(1,Math.round(e))),intervalMinutesDraft:null})},"aria-label":n.intervalMinutes}),(0,p.jsx)(`span`,{className:`shrink-0 text-sm text-fg-muted`,children:n.minuteUnit})]}):(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`input`,{type:`number`,min:1,max:23,disabled:r,className:v,value:F??String(O),onChange:e=>{let t=e.target.value,n=parseInt(t,10),r={intervalHoursDraft:t};Number.isFinite(n)&&n>=1&&n<=23&&(r.intervalHours=n),C(r)},onBlur:()=>{if(F===null)return;let e=parseInt(F,10);C({intervalHours:!Number.isFinite(e)||e<1?2:Math.min(23,Math.max(1,Math.round(e))),intervalHoursDraft:null})},"aria-label":n.intervalHours}),(0,p.jsx)(`span`,{className:`shrink-0 text-sm text-fg-muted`,children:n.hourUnit}),(0,p.jsx)(`select`,{className:o(h,`w-auto min-w-[4rem]`),disabled:r,value:k,onChange:e=>{C({minute:parseInt(e.target.value,10)})},"aria-label":n.minuteAtHour,children:m.map(e=>(0,p.jsx)(`option`,{value:e,children:String(e).padStart(2,`0`)},e))}),(0,p.jsx)(`span`,{className:`shrink-0 text-sm text-fg-muted`,children:n.minuteUnit})]})]}),w===`daily`&&(0,p.jsx)(`input`,{type:`time`,step:60,disabled:r,className:g,value:I,onChange:L,"aria-label":n.scheduleTimeLabel}),w===`weekly`&&(0,p.jsx)(`input`,{type:`time`,step:60,disabled:r,className:g,value:I,onChange:L,"aria-label":n.scheduleTimeLabel}),w===`monthly`&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`select`,{className:o(h,`w-auto min-w-[4.5rem]`),disabled:r,value:M,onChange:e=>{C({dayOfMonth:parseInt(e.target.value,10)})},"aria-label":n.dayOfMonth,children:Array.from({length:31},(e,t)=>t+1).map(e=>(0,p.jsx)(`option`,{value:e,children:e},e))}),(0,p.jsx)(`input`,{type:`time`,step:60,disabled:r,className:g,value:I,onChange:L,"aria-label":n.scheduleTimeLabel})]}),w===`hourly`&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`select`,{className:o(h,`w-auto min-w-[4rem]`),disabled:r,value:k,onChange:e=>{C({minute:parseInt(e.target.value,10)})},"aria-label":n.minuteAtHour,children:m.map(e=>(0,p.jsx)(`option`,{value:e,children:String(e).padStart(2,`0`)},e))}),(0,p.jsx)(`span`,{className:`shrink-0 text-sm text-fg-muted`,children:n.minuteUnit})]})]}),z=w===`weekly`?(0,p.jsx)(`div`,{className:`flex flex-wrap gap-1.5 pt-1`,role:`group`,"aria-label":n.modeWeekly,children:n.weekdays.map((e,t)=>{let n=j[t];return(0,p.jsx)(`button`,{type:`button`,disabled:r,className:o(`flex size-9 select-none items-center justify-center rounded-full border text-xs font-medium transition-colors`,n?`border-fg bg-fg text-surface-panel`:`border-edge-subtle bg-surface-panel text-fg hover:border-edge`),"aria-pressed":n,onClick:()=>{let e=[...j];e[t]=!e[t],C({weekDays:e})},children:e},e)})}):null,B=w===`custom`?(0,p.jsxs)(`div`,{className:`pt-1`,children:[(0,p.jsx)(`textarea`,{disabled:r,className:y,rows:2,spellCheck:!1,value:N,placeholder:`*/5 * * * *`,onChange:e=>{C({rawCron:e.target.value})},"aria-label":n.modeCustom}),(0,p.jsx)(`p`,{className:`mt-1 text-xs text-fg-muted`,children:n.customCronHint})]}):null;return(0,p.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[i?(0,p.jsx)(`span`,{className:`text-xs font-medium text-fg-muted`,children:n.scheduleTimeLabel}):null,R,z,B]})}function w(){return r(`/api/workspace/heartbeat-md`)}async function T(){let e=await i(w());return typeof e.payload?.content==`string`?e.payload.content:``}function E(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function D(e){let t=E(e)?e:{},n=E(t.gateway)?t.gateway:{},r=E(n.heartbeat)?n.heartbeat:{},i=r.activeHours,a=E(i)?i:null,o=a&&typeof a.start==`string`&&typeof a.end==`string`&&a.start&&a.end?{start:a.start,end:a.end,timezone:typeof a.timezone==`string`?a.timezone:``}:null;return{enabled:!!(r.enabled??!0),intervalMs:typeof r.intervalMs==`number`&&Number.isFinite(r.intervalMs)?r.intervalMs:18e5,includeSystemPromptSection:r.includeSystemPromptSection===!0,target:typeof r.target==`string`?r.target:``,targetChatId:typeof r.targetChatId==`string`?r.targetChatId:``,prompt:typeof r.prompt==`string`?r.prompt:``,ackMaxChars:typeof r.ackMaxChars==`number`&&Number.isFinite(r.ackMaxChars)?r.ackMaxChars:``,isolatedSession:!!r.isolatedSession,activeHours:o}}function O(e){let t={enabled:e.enabled,intervalMs:e.intervalMs,includeSystemPromptSection:e.includeSystemPromptSection};return e.target.trim()?t.target=e.target.trim():t.target=null,e.targetChatId.trim()?t.targetChatId=e.targetChatId.trim():t.targetChatId=null,e.prompt.trim()?t.prompt=e.prompt.trim():t.prompt=null,e.ackMaxChars===``||e.ackMaxChars===void 0?t.ackMaxChars=null:t.ackMaxChars=e.ackMaxChars,e.isolatedSession?t.isolatedSession=!0:t.isolatedSession=null,e.activeHours?.start?.trim()&&e.activeHours?.end?.trim()?t.activeHours={start:e.activeHours.start.trim(),end:e.activeHours.end.trim(),...e.activeHours.timezone.trim()?{timezone:e.activeHours.timezone.trim()}:{}}:t.activeHours=null,t}async function k(e){await i(r(`/api/config`),{method:`PATCH`,body:JSON.stringify({gateway:{heartbeat:O(e)}})}),l()}async function A(e){await i(r(`/api/workspace/heartbeat-md`),{method:`PUT`,body:JSON.stringify({content:e})}),a(w())}async function j(e){await i(r(`/api/heartbeat/trigger`),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e?{reason:e}:{})})}export{T as a,j as i,k as n,w as o,A as r,C as s,D as t};
2
- //# sourceMappingURL=heartbeat-config-api-CVGIOMMM.js.map
1
+ import{i as e}from"./rolldown-runtime-aKtaBQYM.js";import{a as t,t as n}from"./vendor-react-BOUWij0V.js";import{i as r,n as i}from"./fetch-K_0JRCXU.js";import{o as a}from"./vendor-swr-BIWyz7Rc.js";import{n as o}from"./button-KafIU8dx.js";import{Rn as s,Vn as c,sn as l}from"./index-ChiUhJAs.js";import{m as u,p as d}from"./cron-dreaming-jobs-DueM3rBz.js";var f=e(t(),1),p=n(),m=Array.from({length:60},(e,t)=>t),h=o(c,`min-w-0 shrink text-xs sm:min-w-[7rem] sm:max-w-[11rem]`),g=o(`h-9 min-w-[6.5rem] shrink-0 rounded-lg border border-edge-subtle bg-surface-panel px-2 py-1.5 text-sm text-fg`,s,`dark:bg-surface-panel`),_=o(`h-9 min-w-[9.5rem] shrink-0 rounded-lg border border-edge-subtle bg-surface-panel px-2 py-1.5 text-sm text-fg`,s),v=o(`h-9 w-14 shrink-0 rounded-lg border border-edge-subtle bg-surface-panel px-2 py-1.5 text-center text-sm tabular-nums text-fg`,s),y=o(`min-h-[2.5rem] w-full rounded-lg border border-edge-subtle bg-surface-base px-3 py-2 font-mono text-xs text-fg`,s);function b(e){return{...e,intervalMinutesDraft:null,intervalHoursDraft:null}}function x(e){let{intervalMinutesDraft:t,intervalHoursDraft:n,...r}=e;return r}function S(e,t){switch(t.type){case`reset`:return b(t.state);case`replace`:return t.state}}function C({value:e,onChange:t,labels:n,disabled:r,showHeading:i=!0}){let a=(0,f.useMemo)(()=>u(e),[e]),[s,c]=(0,f.useReducer)(S,a,b),l=(0,f.useRef)(e);l.current!==e&&(l.current=e,c({type:`reset`,state:a}));let C=(0,f.useCallback)(e=>{let n={...s,...e};c({type:`replace`,state:n});let r=x(n),i=x(s);Object.keys(r).some(e=>r[e]!==i[e])&&t(d(r))},[t,s]),{mode:w,intervalKind:T,onceDate:E,intervalMinutes:D,intervalHours:O,minute:k,hour:A,weekDays:j,dayOfMonth:M,rawCron:N,intervalMinutesDraft:P,intervalHoursDraft:F}=s,I=`${String(A).padStart(2,`0`)}:${String(k).padStart(2,`0`)}`,L=e=>{let t=e.target.value;if(!t)return;let[n,r]=t.split(`:`).map(e=>parseInt(e,10));Number.isNaN(n)||Number.isNaN(r)||C({minute:r,hour:n})},R=(0,p.jsxs)(`div`,{className:`flex min-w-0 flex-nowrap items-center gap-2 overflow-x-auto pb-0.5`,children:[(0,p.jsxs)(`select`,{className:h,disabled:r,value:w,onChange:e=>{let t=e.target.value;C({mode:t})},"aria-label":n.scheduleTimeLabel,children:[(0,p.jsx)(`option`,{value:`no_repeat`,children:n.modeNoRepeat}),(0,p.jsx)(`option`,{value:`interval`,children:n.modeInterval}),(0,p.jsx)(`option`,{value:`hourly`,children:n.modeHourly}),(0,p.jsx)(`option`,{value:`daily`,children:n.modeDaily}),(0,p.jsx)(`option`,{value:`weekly`,children:n.modeWeekly}),(0,p.jsx)(`option`,{value:`monthly`,children:n.modeMonthly}),(0,p.jsx)(`option`,{value:`custom`,children:n.modeCustom})]}),w===`no_repeat`&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`input`,{type:`date`,disabled:r,className:_,value:E,onChange:e=>{C({onceDate:e.target.value})},"aria-label":n.modeNoRepeat}),(0,p.jsx)(`input`,{type:`time`,step:60,disabled:r,className:g,value:I,onChange:L,"aria-label":n.scheduleTimeLabel})]}),w===`interval`&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(`select`,{className:o(h,`w-auto min-w-[5rem]`),disabled:r,value:T,onChange:e=>{let t=e.target.value;C({intervalKind:t,intervalMinutesDraft:null,intervalHoursDraft:null})},"aria-label":n.modeInterval,children:[(0,p.jsx)(`option`,{value:`minutes`,children:n.intervalKindMinutes}),(0,p.jsx)(`option`,{value:`hours`,children:n.intervalKindHours})]}),T===`minutes`?(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`input`,{type:`number`,min:1,max:59,disabled:r,className:v,value:P??String(D),onChange:e=>{let t=e.target.value,n=parseInt(t,10),r={intervalMinutesDraft:t};Number.isFinite(n)&&n>=1&&n<=59&&(r.intervalMinutes=n),C(r)},onBlur:()=>{if(P===null)return;let e=parseInt(P,10);C({intervalMinutes:!Number.isFinite(e)||e<1?5:Math.min(59,Math.max(1,Math.round(e))),intervalMinutesDraft:null})},"aria-label":n.intervalMinutes}),(0,p.jsx)(`span`,{className:`shrink-0 text-sm text-fg-muted`,children:n.minuteUnit})]}):(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`input`,{type:`number`,min:1,max:23,disabled:r,className:v,value:F??String(O),onChange:e=>{let t=e.target.value,n=parseInt(t,10),r={intervalHoursDraft:t};Number.isFinite(n)&&n>=1&&n<=23&&(r.intervalHours=n),C(r)},onBlur:()=>{if(F===null)return;let e=parseInt(F,10);C({intervalHours:!Number.isFinite(e)||e<1?2:Math.min(23,Math.max(1,Math.round(e))),intervalHoursDraft:null})},"aria-label":n.intervalHours}),(0,p.jsx)(`span`,{className:`shrink-0 text-sm text-fg-muted`,children:n.hourUnit}),(0,p.jsx)(`select`,{className:o(h,`w-auto min-w-[4rem]`),disabled:r,value:k,onChange:e=>{C({minute:parseInt(e.target.value,10)})},"aria-label":n.minuteAtHour,children:m.map(e=>(0,p.jsx)(`option`,{value:e,children:String(e).padStart(2,`0`)},e))}),(0,p.jsx)(`span`,{className:`shrink-0 text-sm text-fg-muted`,children:n.minuteUnit})]})]}),w===`daily`&&(0,p.jsx)(`input`,{type:`time`,step:60,disabled:r,className:g,value:I,onChange:L,"aria-label":n.scheduleTimeLabel}),w===`weekly`&&(0,p.jsx)(`input`,{type:`time`,step:60,disabled:r,className:g,value:I,onChange:L,"aria-label":n.scheduleTimeLabel}),w===`monthly`&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`select`,{className:o(h,`w-auto min-w-[4.5rem]`),disabled:r,value:M,onChange:e=>{C({dayOfMonth:parseInt(e.target.value,10)})},"aria-label":n.dayOfMonth,children:Array.from({length:31},(e,t)=>t+1).map(e=>(0,p.jsx)(`option`,{value:e,children:e},e))}),(0,p.jsx)(`input`,{type:`time`,step:60,disabled:r,className:g,value:I,onChange:L,"aria-label":n.scheduleTimeLabel})]}),w===`hourly`&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`select`,{className:o(h,`w-auto min-w-[4rem]`),disabled:r,value:k,onChange:e=>{C({minute:parseInt(e.target.value,10)})},"aria-label":n.minuteAtHour,children:m.map(e=>(0,p.jsx)(`option`,{value:e,children:String(e).padStart(2,`0`)},e))}),(0,p.jsx)(`span`,{className:`shrink-0 text-sm text-fg-muted`,children:n.minuteUnit})]})]}),z=w===`weekly`?(0,p.jsx)(`div`,{className:`flex flex-wrap gap-1.5 pt-1`,role:`group`,"aria-label":n.modeWeekly,children:n.weekdays.map((e,t)=>{let n=j[t];return(0,p.jsx)(`button`,{type:`button`,disabled:r,className:o(`flex size-9 select-none items-center justify-center rounded-full border text-xs font-medium transition-colors`,n?`border-fg bg-fg text-surface-panel`:`border-edge-subtle bg-surface-panel text-fg hover:border-edge`),"aria-pressed":n,onClick:()=>{let e=[...j];e[t]=!e[t],C({weekDays:e})},children:e},e)})}):null,B=w===`custom`?(0,p.jsxs)(`div`,{className:`pt-1`,children:[(0,p.jsx)(`textarea`,{disabled:r,className:y,rows:2,spellCheck:!1,value:N,placeholder:`*/5 * * * *`,onChange:e=>{C({rawCron:e.target.value})},"aria-label":n.modeCustom}),(0,p.jsx)(`p`,{className:`mt-1 text-xs text-fg-muted`,children:n.customCronHint})]}):null;return(0,p.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[i?(0,p.jsx)(`span`,{className:`text-xs font-medium text-fg-muted`,children:n.scheduleTimeLabel}):null,R,z,B]})}function w(){return r(`/api/workspace/heartbeat-md`)}async function T(){let e=await i(w());return typeof e.payload?.content==`string`?e.payload.content:``}function E(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function D(e){let t=E(e)?e:{},n=E(t.gateway)?t.gateway:{},r=E(n.heartbeat)?n.heartbeat:{},i=r.activeHours,a=E(i)?i:null,o=a&&typeof a.start==`string`&&typeof a.end==`string`&&a.start&&a.end?{start:a.start,end:a.end,timezone:typeof a.timezone==`string`?a.timezone:``}:null;return{enabled:!!(r.enabled??!0),intervalMs:typeof r.intervalMs==`number`&&Number.isFinite(r.intervalMs)?r.intervalMs:18e5,includeSystemPromptSection:r.includeSystemPromptSection===!0,target:typeof r.target==`string`?r.target:``,targetChatId:typeof r.targetChatId==`string`?r.targetChatId:``,prompt:typeof r.prompt==`string`?r.prompt:``,ackMaxChars:typeof r.ackMaxChars==`number`&&Number.isFinite(r.ackMaxChars)?r.ackMaxChars:``,isolatedSession:!!r.isolatedSession,activeHours:o}}function O(e){let t={enabled:e.enabled,intervalMs:e.intervalMs,includeSystemPromptSection:e.includeSystemPromptSection};return e.target.trim()?t.target=e.target.trim():t.target=null,e.targetChatId.trim()?t.targetChatId=e.targetChatId.trim():t.targetChatId=null,e.prompt.trim()?t.prompt=e.prompt.trim():t.prompt=null,e.ackMaxChars===``||e.ackMaxChars===void 0?t.ackMaxChars=null:t.ackMaxChars=e.ackMaxChars,e.isolatedSession?t.isolatedSession=!0:t.isolatedSession=null,e.activeHours?.start?.trim()&&e.activeHours?.end?.trim()?t.activeHours={start:e.activeHours.start.trim(),end:e.activeHours.end.trim(),...e.activeHours.timezone.trim()?{timezone:e.activeHours.timezone.trim()}:{}}:t.activeHours=null,t}async function k(e){await i(r(`/api/config`),{method:`PATCH`,body:JSON.stringify({gateway:{heartbeat:O(e)}})}),l()}async function A(e){await i(r(`/api/workspace/heartbeat-md`),{method:`PUT`,body:JSON.stringify({content:e})}),a(w())}async function j(e){await i(r(`/api/heartbeat/trigger`),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e?{reason:e}:{})})}export{T as a,j as i,k as n,w as o,A as r,C as s,D as t};
2
+ //# sourceMappingURL=heartbeat-config-api-BqfDabSI.js.map