@xopcai/xopc 0.0.77 → 0.0.78

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 (126) 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-DN3vr8pb.js → agents-Bh_9-1KB.js} +2 -2
  4. package/dist/gateway/static/root/assets/{agents-DN3vr8pb.js.map → agents-Bh_9-1KB.js.map} +1 -1
  5. package/dist/gateway/static/root/assets/{apps-page-BUn41aPi.js → apps-page-CB5anZpc.js} +2 -2
  6. package/dist/gateway/static/root/assets/{apps-page-BUn41aPi.js.map → apps-page-CB5anZpc.js.map} +1 -1
  7. package/dist/gateway/static/root/assets/{channels-settings-CYMmWDtP.js → channels-settings-Bt1sprhC.js} +2 -2
  8. package/dist/gateway/static/root/assets/{channels-settings-CYMmWDtP.js.map → channels-settings-Bt1sprhC.js.map} +1 -1
  9. package/dist/gateway/static/root/assets/{channels-status-swr-sJj4ueTp.js → channels-status-swr-Crgak3fg.js} +2 -2
  10. package/dist/gateway/static/root/assets/{channels-status-swr-sJj4ueTp.js.map → channels-status-swr-Crgak3fg.js.map} +1 -1
  11. package/dist/gateway/static/root/assets/{cron-api-CLxnaHdq.js → cron-api-CzJGvQQ7.js} +2 -2
  12. package/dist/gateway/static/root/assets/{cron-api-CLxnaHdq.js.map → cron-api-CzJGvQQ7.js.map} +1 -1
  13. package/dist/gateway/static/root/assets/{cron-page-BAQ8xSnJ.js → cron-page-BoNRJNVV.js} +2 -2
  14. package/dist/gateway/static/root/assets/{cron-page-BAQ8xSnJ.js.map → cron-page-BoNRJNVV.js.map} +1 -1
  15. package/dist/gateway/static/root/assets/{dist-BfJYxiK5.js → dist-a-eaOUvs.js} +2 -2
  16. package/dist/gateway/static/root/assets/{dist-BfJYxiK5.js.map → dist-a-eaOUvs.js.map} +1 -1
  17. package/dist/gateway/static/root/assets/{extension-debug-page-bgvVs-Sy.js → extension-debug-page-D-O1XjAa.js} +2 -2
  18. package/dist/gateway/static/root/assets/{extension-debug-page-bgvVs-Sy.js.map → extension-debug-page-D-O1XjAa.js.map} +1 -1
  19. package/dist/gateway/static/root/assets/{extension-page-SG4TVv-u.js → extension-page-B2VpqBTH.js} +2 -2
  20. package/dist/gateway/static/root/assets/{extension-page-SG4TVv-u.js.map → extension-page-B2VpqBTH.js.map} +1 -1
  21. package/dist/gateway/static/root/assets/{extension-settings-page-CJZRTsjF.js → extension-settings-page-CmBcQfeO.js} +2 -2
  22. package/dist/gateway/static/root/assets/{extension-settings-page-CJZRTsjF.js.map → extension-settings-page-CmBcQfeO.js.map} +1 -1
  23. package/dist/gateway/static/root/assets/{fetch-K_0JRCXU.js → fetch-EGO9T3MN.js} +3 -3
  24. package/dist/gateway/static/root/assets/{fetch-K_0JRCXU.js.map → fetch-EGO9T3MN.js.map} +1 -1
  25. package/dist/gateway/static/root/assets/{field-primitives-Z76hyBYS.js → field-primitives-Bh7G1y4D.js} +2 -2
  26. package/dist/gateway/static/root/assets/{field-primitives-Z76hyBYS.js.map → field-primitives-Bh7G1y4D.js.map} +1 -1
  27. package/dist/gateway/static/root/assets/{heartbeat-config-api-BqfDabSI.js → heartbeat-config-api-DxpIEZNs.js} +2 -2
  28. package/dist/gateway/static/root/assets/{heartbeat-config-api-BqfDabSI.js.map → heartbeat-config-api-DxpIEZNs.js.map} +1 -1
  29. package/dist/gateway/static/root/assets/{index-ChiUhJAs.js → index-Dxy9ZCtC.js} +5 -5
  30. package/dist/gateway/static/root/assets/{index-ChiUhJAs.js.map → index-Dxy9ZCtC.js.map} +1 -1
  31. package/dist/gateway/static/root/assets/{logs-page-DrIMhDE2.js → logs-page-Dw58E2GE.js} +2 -2
  32. package/dist/gateway/static/root/assets/{logs-page-DrIMhDE2.js.map → logs-page-Dw58E2GE.js.map} +1 -1
  33. package/dist/gateway/static/root/assets/{sessions-page-B-RGO3N0.js → sessions-page-CPkhCy57.js} +2 -2
  34. package/dist/gateway/static/root/assets/{sessions-page-B-RGO3N0.js.map → sessions-page-CPkhCy57.js.map} +1 -1
  35. package/dist/gateway/static/root/assets/{settings-form-section-Csvl1iL6.js → settings-form-section-DLZDVMEf.js} +2 -2
  36. package/dist/gateway/static/root/assets/{settings-form-section-Csvl1iL6.js.map → settings-form-section-DLZDVMEf.js.map} +1 -1
  37. package/dist/gateway/static/root/assets/settings-page-CVPCa0PE.js +4 -0
  38. package/dist/gateway/static/root/assets/settings-page-CVPCa0PE.js.map +1 -0
  39. package/dist/gateway/static/root/assets/{skills-page-dHwx2vh0.js → skills-page-DueZ9Qfg.js} +2 -2
  40. package/dist/gateway/static/root/assets/{skills-page-dHwx2vh0.js.map → skills-page-DueZ9Qfg.js.map} +1 -1
  41. package/dist/gateway/static/root/assets/{theme-store-Bl5A2Fd_.js → theme-store-CWPq9gW1.js} +2 -2
  42. package/dist/gateway/static/root/assets/{theme-store-Bl5A2Fd_.js.map → theme-store-CWPq9gW1.js.map} +1 -1
  43. package/dist/gateway/static/root/assets/{utils-COYrNFF7.js → utils-Cnix55r9.js} +2 -2
  44. package/dist/gateway/static/root/assets/{utils-COYrNFF7.js.map → utils-Cnix55r9.js.map} +1 -1
  45. package/dist/gateway/static/root/assets/{voice-api-key-field-5WZZaxH3.js → voice-api-key-field-BR3Ut06g.js} +2 -2
  46. package/dist/gateway/static/root/assets/{voice-api-key-field-5WZZaxH3.js.map → voice-api-key-field-BR3Ut06g.js.map} +1 -1
  47. package/dist/gateway/static/root/index.html +3 -3
  48. package/dist/package.js +1 -1
  49. package/dist/src/browser/providers/browser-ext-install.js +23 -4
  50. package/dist/src/browser/providers/browser-ext-install.js.map +1 -1
  51. package/dist/src/cli/commands/tunnel.js +4 -5
  52. package/dist/src/cli/commands/tunnel.js.map +1 -1
  53. package/dist/src/config/index.js +2 -2
  54. package/dist/src/config/rules.js +0 -5
  55. package/dist/src/config/rules.js.map +1 -1
  56. package/dist/src/config/schema.d.ts +0 -27
  57. package/dist/src/config/schema.js +4 -18
  58. package/dist/src/config/schema.js.map +1 -1
  59. package/dist/src/gateway/auth-rate-limit.d.ts +2 -0
  60. package/dist/src/gateway/auth-rate-limit.js +9 -3
  61. package/dist/src/gateway/auth-rate-limit.js.map +1 -1
  62. package/dist/src/gateway/hono/app.js +19 -13
  63. package/dist/src/gateway/hono/app.js.map +1 -1
  64. package/dist/src/gateway/hono/lib/config-payload.d.ts +3 -1
  65. package/dist/src/gateway/hono/lib/config-payload.js +1 -2
  66. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  67. package/dist/src/gateway/hono/routes/tunnel.js +32 -30
  68. package/dist/src/gateway/hono/routes/tunnel.js.map +1 -1
  69. package/dist/src/gateway/host.d.ts +24 -0
  70. package/dist/src/gateway/host.js +33 -1
  71. package/dist/src/gateway/host.js.map +1 -1
  72. package/dist/src/gateway/index.d.ts +1 -1
  73. package/dist/src/gateway/index.js +2 -2
  74. package/dist/src/gateway/runtime-config.js +1 -8
  75. package/dist/src/gateway/runtime-config.js.map +1 -1
  76. package/dist/src/gateway/security/audit.js +4 -4
  77. package/dist/src/gateway/security/audit.js.map +1 -1
  78. package/dist/src/gateway/server.js +2 -3
  79. package/dist/src/gateway/server.js.map +1 -1
  80. package/dist/src/gateway/service/types.d.ts +2 -0
  81. package/dist/src/gateway/service.d.ts +2 -0
  82. package/dist/src/gateway/service.js +7 -2
  83. package/dist/src/gateway/service.js.map +1 -1
  84. package/dist/src/tunnel/frp-subdomain-host.d.ts +2 -0
  85. package/dist/src/tunnel/frp-subdomain-host.js +15 -0
  86. package/dist/src/tunnel/frp-subdomain-host.js.map +1 -0
  87. package/dist/src/tunnel/gateway-lifecycle.d.ts +0 -4
  88. package/dist/src/tunnel/gateway-lifecycle.js +9 -11
  89. package/dist/src/tunnel/gateway-lifecycle.js.map +1 -1
  90. package/dist/src/tunnel/index.d.ts +2 -4
  91. package/dist/src/tunnel/index.js +2 -4
  92. package/dist/src/tunnel/pair-url.js +7 -1
  93. package/dist/src/tunnel/pair-url.js.map +1 -1
  94. package/dist/src/tunnel/pairing.d.ts +13 -0
  95. package/dist/src/tunnel/pairing.js +48 -1
  96. package/dist/src/tunnel/pairing.js.map +1 -1
  97. package/dist/src/tunnel/tunnel-config.js +2 -16
  98. package/dist/src/tunnel/tunnel-config.js.map +1 -1
  99. package/dist/src/tunnel/tunnel-service.d.ts +1 -10
  100. package/dist/src/tunnel/tunnel-service.js +7 -60
  101. package/dist/src/tunnel/tunnel-service.js.map +1 -1
  102. package/dist/src/tunnel/tunnel-types.d.ts +3 -18
  103. package/dist/src/tunnel/well-known.d.ts +5 -0
  104. package/dist/src/tunnel/well-known.js +2 -1
  105. package/dist/src/tunnel/well-known.js.map +1 -1
  106. package/package.json +2 -2
  107. package/dist/gateway/static/root/assets/settings-page-nxAc0ta1.js +0 -4
  108. package/dist/gateway/static/root/assets/settings-page-nxAc0ta1.js.map +0 -1
  109. package/dist/src/tunnel/acme-cert-store.d.ts +0 -34
  110. package/dist/src/tunnel/acme-cert-store.js +0 -184
  111. package/dist/src/tunnel/acme-cert-store.js.map +0 -1
  112. package/dist/src/tunnel/acme-client.d.ts +0 -50
  113. package/dist/src/tunnel/acme-client.js +0 -473
  114. package/dist/src/tunnel/acme-client.js.map +0 -1
  115. package/dist/src/tunnel/acme-crypto.d.ts +0 -25
  116. package/dist/src/tunnel/acme-crypto.js +0 -58
  117. package/dist/src/tunnel/acme-crypto.js.map +0 -1
  118. package/dist/src/tunnel/acme-csr.d.ts +0 -5
  119. package/dist/src/tunnel/acme-csr.js +0 -48
  120. package/dist/src/tunnel/acme-csr.js.map +0 -1
  121. package/dist/src/tunnel/tls-server.d.ts +0 -14
  122. package/dist/src/tunnel/tls-server.js +0 -126
  123. package/dist/src/tunnel/tls-server.js.map +0 -1
  124. package/dist/src/tunnel/tunnel-e2e-config.d.ts +0 -11
  125. package/dist/src/tunnel/tunnel-e2e-config.js +0 -29
  126. package/dist/src/tunnel/tunnel-e2e-config.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-page-CVPCa0PE.js","names":["ScenarioPresetId","ScenarioPresetStep","path","labelKey","ScenarioPreset","id","steps","SCENARIO_PRESETS","SCENARIO_PRESETS_DISMISSED_KEY","readScenarioPresetsDismissed","localStorage","getItem","dismissScenarioPresets","setItem","Sparkles","X","useState","Link","SettingsFormSection","SettingsFormSectionHeader","messages","cn","interaction","useLocaleStore","dismissScenarioPresets","readScenarioPresetsDismissed","SCENARIO_PRESETS","ScenarioPresetStep","stepLabel","step","steps","Record","labelKey","SetupScenarioPresets","$","_c","language","_temp","m","s_0","setupStatus","scenarios","dismissed","setDismissed","t0","t1","t2","Symbol","for","press","t3","t4","map","preset","copy","s","presets","id","title","description","index","path","t5","subtitle","dismiss","normalizeChannelsFromConfig","isFeishuConfigured","isTelegramConfigured","isWeixinConfigured","SetupChecklistItemId","SetupChecklistItemState","id","done","optional","detail","SetupStatusSnapshot","gatewayConnected","providerConfigured","providerCount","providerMetaConfigured","providerMetaTotal","defaultModel","defaultModelConfigured","channelConfigured","skillInstalled","skillCount","presetsDone","agentCount","checklist","requiredComplete","allComplete","countConfiguredProviders","config","providers","Record","Array","isArray","Object","values","filter","v","length","readDefaultModel","agents","defaults","model","trim","isAnyChannelConfigured","channels","telegram","enabled","weixin","feishu","buildSetupStatusSnapshot","input","hasToken","sseConnected","providerMeta","configured","total","labels","gatewayOnline","gatewayOffline","providersConfigured","count","providersMetaReady","providersMissing","modelConfigured","modelMissing","channelMissing","skillsConfigured","skillsMissing","presetsConfigured","presetsMissing","item","every","useMemo","useSWR","CONFIGURED_MODELS_SWR_KEY","fetchConfiguredModelsCached","fetchGatewayAgents","PRESET_AGENTS_SKIPPED_KEY","useGatewayConfigSwr","fetchProviderMetaList","getSkills","messages","useGatewaySseStore","useGatewayStore","useLocaleStore","buildSetupStatusSnapshot","SetupStatusSnapshot","readPresetsSkipped","localStorage","getItem","computePresetsDone","agents","id","defaultId","length","onlyMain","every","ag","useSetupChecklist","$","_c","token","_temp","language","_temp2","t0","m","l","setupStatus","labels","sseConnected","_temp3","data","configData","error","configError","isLoading","configLoading","mutate","mutateConfig","Boolean","t1","t2","t3","Symbol","for","revalidateOnFocus","skillsData","skillsError","skillsLoading","mutateSkills","t4","providerMeta","providerMetaError","providerMetaLoading","mutateProviderMeta","t5","agentsData","agentsError","agentsLoading","mutateAgents","t6","ready","t7","bb0","skillCount","catalog","t8","payload","config","channelConfigured","channelMissing","gatewayOffline","gatewayOnline","modelConfigured","modelMissing","presetsConfigured","presetsMissing","providersConfigured","providersMetaReady","providersMissing","skillsConfigured","skillsMissing","metaConfigured","filter","_temp4","metaTotal","agentCount","presetsDone","t9","count","replace","String","t10","configured","total","t11","model","t12","count_0","hasToken","snapshot","Promise","all","refresh","p","s_1","s","connectionState","s_0","Check","ChevronRight","Circle","Loader2","RefreshCw","Link","SettingsFormSection","SettingsFormSectionHeader","messages","cn","interaction","useLocaleStore","SetupChecklistItemId","SetupScenarioPresets","useSetupChecklist","CHECKLIST_PATHS","Record","gateway","provider","defaultModel","channel","skill","presets","StatusPill","t0","$","_c","ok","label","t1","t2","t3","SetupStatusPanel","language","_temp","m","s_0","setupStatus","ready","error","snapshot","refresh","Symbol","for","press","t4","s","title","subtitle","loadError","loading","summaryTitle","summarySubtitle","summaryGateway","gatewayConnected","statusOnline","statusOffline","summaryProviders","providerConfigured","providerMetaTotal","labels","providersMetaReady","replace","String","providerMetaConfigured","providersConfigured","providerCount","providersMissing","summaryModel","defaultModelConfigured","modelMissing","requiredComplete","requiredCompleteMessage","requiredIncompleteMessage","checklistTitle","checklistSubtitle","checklist","map","item","itemCopy","items","id","done","optional","optionalBadge","description","detail","create","SaveBarSection","id","dirty","saving","save","Promise","ok","error","discard","SaveAllFailure","SaveAllOutcome","saved","failures","State","sections","Map","saveAllInFlight","anyDirty","dirtyCount","anySaving","registerSection","section","unregisterSection","saveAll","discardAll","computeAggregates","s","values","useSaveBarStore","set","get","state","next","has","delete","Array","from","filter","length","outcomes","all","map","result","err","const","Error","message","String","push","useEffect","useRef","useSaveBarStore","RegistrationArgs","id","dirty","saving","save","Promise","discard","useSaveBarRegistration","saveRef","discardRef","current","registerSection","s","unregisterSection","ok","err","error","Error","message","String","ChevronDown","LucideIcon","ReactNode","cn","Props","showLabel","hideLabel","icon","hint","children","className","defaultOpen","SettingsCollapsibleSection","t0","$","_c","Icon","t1","t2","Symbol","for","t3","t4","t5","t6","t7","t8","t9","Popover","Check","ChevronsUpDown","useCallback","useMemo","useState","useSWR","comboboxTriggerLayoutClass","formControlBorderFocusClass","selectComboboxTriggerFocusClass","cn","apiFetch","SETTINGS_SHELL_POPOVER_Z","interaction","apiUrl","ImageProviderSummary","id","defaultModel","models","configured","fetchImageGenerationProviders","Promise","res","ok","Error","status","data","json","payload","providers","modelIdsForProviders","providerList","seen","Set","out","p","length","m","has","add","push","buildConfiguredModelIds","currentValueTrimmed","configuredOnly","filter","fromRegistry","includes","idsMatchingQuery","ids","query","raw","trim","toLowerCase","tokens","split","Boolean","h","lower","every","t","SWR_KEY","ImageGenerationModelInput","t0","$","_c","value","disabled","placeholder","searchPlaceholder","noMatches","registryEmptyHint","outOfFilterNote","className","onChange","open","setOpen","setQuery","t1","Symbol","for","revalidateOnFocus","isLoading","error","t2","valueTrimmed","t3","_temp","configuredOnlyIds","t4","t5","allIds","t6","filtered","t7","showOutOfFilterNote","t8","label","t9","titleText","t10","next","handleOpenChange","t11","t12","t13","transition","press","t14","t15","t16","t17","t18","t19","t20","e_0","e","target","t21","_temp3","t22","message","t23","t24","t25","t26","map","t27","_temp2","t28","t29","t30","e_1","stopPropagation","preventDefault","Image","ImageIcon","Plus","Trash2","Button","ModelSelector","SettingsFormSection","SettingsFormSectionHeader","AgentDefaultsField","AgentDefaultsPanelProps","ImageGenerationModelInput","modelFallbackRowKey","modelId","index","all","trimmed","trim","emptySlot","slice","filter","id","length","ImageModelPrimarySelectors","props","$","_c","a","chat","form","update","t0","cardModelsSubtitle","cardModelsTitle","t1","imageModel","t2","visionOutOfFilterNote","visionRegistryEmpty","modelNoMatches","modelPlaceholder","modelSearchPlaceholder","t3","desc","label","t4","modelId_0","imageGenerationModel","t5","imageGenOutOfFilterNote","imageGenRegistryEmpty","t6","t7","t8","ImageModelFallbackChains","imageModelFallbacks","removeModelFallback","map","fb","idx","next","_","j","Symbol","for","addModelFallback","imageGenerationModelFallbacks","t9","t10","fb_0","idx_0","next_0","__0","j_0","t11","t12","t13","t14","t15","t16","Loader2","Save","Server","useCallback","useEffect","useMemo","useReducer","createFormDraftReducer","uiPatchReducer","useSWR","Button","useExtensions","useGatewayConfigSwr","useSaveBarRegistration","SettingsCollapsibleSection","fetchImageProvidersList","ImageProviderCredentialsPanel","ImageProviderCredentialsPanelMessages","IMAGE_PROVIDERS_SWR_KEY","ImageModelPrimarySelectors","ImageModelFallbackChains","fetchAgentDefaults","parseParamsJsonForSave","patchAgentDefaults","AgentDefaultsState","useImageProviderCredentials","settingsInputFocusClass","apiUrl","cn","messages","MessageBundle","useGatewayStore","useLocaleStore","inputClass","imageProvidersSwrKey","pickImageDefaultsSlice","s","imageModel","imageModelFallbacks","imageGenerationModel","imageGenerationModelFallbacks","imageGenerationModelTimeoutMs","imageGenerationModelAutoProviderFallback","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","agentDefaultsFormReducer","ImageModelsUi","loading","saving","savedFlash","error","initialImageModelsUi","undefined","ImageModelsSettingsPanel","embedded","language","m","imageModelsSettings","token","st","hasToken","Boolean","formDraft","dispatchForm","form","baseline","state","ui","dispatchUi","extensions","extensionIds","Set","map","e","id","reload","type","patch","fresh","snapshot","structuredClone","value","err","Error","message","String","patchAgentDefaultsLocal","Partial","data","providers","revalidateOnFocus","hasConfiguredProvider","some","p","gwSwr","cred","dirty","JSON","stringify","anyDirty","credDirty","onBeforeUnload","BeforeUnloadEvent","preventDefault","returnValue","window","addEventListener","removeEventListener","onSave","paramsJson","SyntaxError","agentSettings","advanced","paramsInvalidJson","savePromises","Promise","push","then","mutate","all","setTimeout","onDiscard","onDiscardCredentials","save","discard","panelMsg","apiKeyLinkLabels","getApiKey","providersSettings","getApiKeyIntl","getApiKeyCn","outerClass","stubClass","stubFlexClass","title","subtitle","saved","chat","fallbackChainsTitle","runtimeTuningTitle","timeoutLabel","raw","target","trim","next","Math","max","floor","Number","timeoutHint","checked","autoFallbackLabel","autoFallbackHint","providersTitle","length","providersEmpty","credDraft","credBaseline","credSaving","credError","credSavedFlash","credNoopFlash","updateCredRow","apiFetch","apiUrl","ApiType","CustomModel","ModelsJsonConfig","ValidationResult","ProviderConfig","ModelsJsonStatus","config","path","exists","loadError","ApiKeyTestResult","type","resolved","error","API_TYPE_OPTIONS","value","label","gatewayErrorMessage","body","undefined","o","m","message","normalizeModelsJsonConfig","input","providers","Record","raw","Array","isArray","fetchModelsJson","Promise","res","data","json","catch","ok","payload","Error","status","validateModelsJson","method","JSON","stringify","saveModelsJson","saved","modelCount","reloadModelsJson","testApiKey","createCustomModel","id","name","overrides","Partial","contextWindow","maxTokens","cost","output","cacheRead","cacheWrite","isShellCommand","startsWith","isEnvVar","test","getApiKeyType","maskApiKey","length","slice","nativeSelectMaxWidthClass","selectControlBaseClass","settingsInputFocusClass","cn","CustomModel","ModelsJsonConfig","ProviderConfig","PROVIDER_PRESETS","Record","Partial","ollama","baseUrl","api","apiKey","lmstudio","openrouter","zhipuCn","zaiGeneral","providerIdForPreset","presetKey","INPUT_OPTIONS","value","labelKey","const","inputClassName","selectClassName","parseInputSelect","model","i","input","includes","inputFromSelect","sel","updateProvider","config","providerId","updates","providers","removeProvider","addProviderEntry","prov","Dialog","X","useState","Button","cn","ghostIconButton","SETTINGS_SHELL_CONTENT_Z","SETTINGS_SHELL_OVERLAY_Z","ModelsSettingsMessages","createCustomModel","CustomModel","inputClassName","INPUT_OPTIONS","inputFromSelect","parseInputSelect","selectClassName","ModelDialogProps","open","onOpenChange","o","providerId","model","isNew","onSave","m","ModelEditForm","t0","$","_c","onClose","t1","form","setForm","errors","setErrors","_temp","t2","Symbol","for","field","value","f","prev","next","Map","delete","update","t3","contextWindow","id","maxTokens","modelIdRequired","mustBePositive","next_0","trim","set","undefined","size","validate","t4","id_0","result","name","reasoning","input","cost","output","cacheRead","cacheWrite","handleSave","t5","t6","inputSel","t7","addModelTitle","editModelTitle","t8","t9","modelProviderLabel","t10","t11","t12","t13","close","t14","t15","t16","modelId","t17","has","t18","t19","e","target","t20","t21","t22","get","t23","t24","displayName","t25","t26","t27","e_0","t28","t29","t30","inputTypes","t31","t32","e_1","t33","map","opt","labelKey","t34","t35","t36","t37","e_2","checked","t38","t39","t40","t41","t42","t43","t44","e_3","parseInt","t45","t46","t47","t48","maxOutputTokens","t49","t50","t51","e_4","t52","t53","t54","t55","t56","costSection","t57","costInput","t58","t59","t60","e_5","parseFloat","t61","t62","t63","costOutput","t64","t65","t66","e_6","t67","t68","t69","t70","t71","t72","cancel","t73","addModelConfirm","saveModelConfirm","t74","t75","t76","ModelEditDialogContent","_temp2","preventDefault","Dialog","AlertCircle","X","useReducer","useRef","Button","cn","ghostIconButton","SETTINGS_SHELL_CONTENT_Z","SETTINGS_SHELL_OVERLAY_Z","ModelsSettingsMessages","API_TYPE_OPTIONS","ApiType","ProviderConfig","inputClassName","PROVIDER_PRESETS","providerIdForPreset","selectClassName","ProviderDialogProps","open","onOpenChange","o","presetKey","onConfirm","providerId","prov","m","FormState","preset","baseUrl","api","apiKey","error","formStateFromPreset","pk","p","FormAction","type","key","value","formReducer","state","action","ProviderAddDialog","form","dispatch","undefined","dialogResetKey","trackedDialogResetKeyRef","current","handleSubmit","id","trim","providerIdRequired","models","e","preventDefault","addProviderTitle","addProviderSubtitle","close","presetLabel","target","presetCustom","presetOllama","presetLmStudio","presetOpenRouter","presetZhipuCn","presetZaiGeneral","providerIdLabel","providerIdPlaceholder","apiType","map","opt","label","apiKeyPlaceholder","cancel","addProviderConfirm","Box","ChevronDown","ChevronRight","Cpu","Eye","EyeOff","Pencil","Plus","Trash2","Zap","Dispatch","SetStateAction","Button","cn","interaction","ModelsSettingsMessages","API_TYPE_OPTIONS","getApiKeyType","maskApiKey","ApiType","CustomModel","ModelsJsonConfig","inputClassName","selectClassName","updateProvider","ModelsTestResult","type","resolved","error","ModelsProvidersListProps","config","setConfig","expanded","Set","toggleExpand","id","showPw","toggleShowPw","testResults","Map","runTestKey","providerId","value","ms","removeProv","openModelDialog","model","isNew","setTestResults","ModelsProvidersList","t0","$","_c","t1","providers","t2","t3","prov","isEx","has","nModels","models","length","keyType","apiKey","testResult","get","pwVisible","badgeShell","badgeEnv","badgeLiteral","press","removeProvider","baseUrl","e","c","target","apiType","api","e_0","c_0","map","_temp2","e_1","v","c_1","prev","next","delete","apiKeyPlaceholder","hide","show","testKey","testError","testOk","apiKeyHint","authHeader","e_2","c_2","checked","modelsSection","addModel","modelsEmpty","mod","name","editModel","window","confirm","removeModelConfirm","replace","c_3","p","filter","mm","removeModel","Object","entries","sort","_temp","opt","label","a","b","localeCompare","ModelsSettingsEmptyStateProps","openAddProvider","preset","ModelsSettingsEmptyState","Symbol","for","emptyTitle","emptyDesc","t4","t5","t6","emptyCta","t7","transition","focusRingBase","t8","t9","t10","presetOllama","t11","t12","t13","t14","presetOpenRouter","t15","t16","t17","t18","presetLmStudio","t19","t20","t21","t22","presetZhipuCn","t23","t24","t25","t26","presetZaiGeneral","t27","t28","AlertCircle","ExternalLink","Loader2","Plus","RefreshCw","useCallback","useEffect","useMemo","useReducer","Dispatch","SetStateAction","createFormDraftReducer","uiPatchReducer","Button","useSaveBarRegistration","cn","interaction","messages","docsGuidePageUrl","useGatewayStore","useLocaleStore","fetchModelsJson","normalizeModelsJsonConfig","reloadModelsJson","saveModelsJson","testApiKey","validateModelsJson","CustomModel","ModelsJsonConfig","ProviderConfig","ValidationResult","useAgentDefaultsForm","ModelEditDialogContent","ProviderAddDialog","ModelsProvidersList","ModelsSettingsEmptyState","ModelsTestResult","addProviderEntry","inputClassName","removeProvider","updateProvider","modelsFormReducer","ModelsUi","path","loadMetaError","loading","saving","validating","reloading","error","saveOk","validation","expanded","Set","editorMode","rawText","rawError","showPw","testResults","Map","providerDialogOpen","providerPreset","modelDialogOpen","modelDialogCtx","providerId","model","isNew","initialModelsUi","undefined","ModelsSettingsPanel","embedded","language","s","m","ms","modelsSettings","agentVm","agentSettings","token","st","hasToken","Boolean","formDraft","dispatchForm","form","providers","baseline","config","ui","dispatchUi","setConfig","updater","prev","type","load","opts","skipFullPageLoading","showFullPageLoading","patch","norm","value","loadError","e","Error","message","dirty","JSON","stringify","combinedDirty","stats","ids","Object","keys","models","p","values","length","toggleExpand","id","next","has","delete","add","toggleShowPw","syncRawFromConfig","selectEditorMode","mode","applyRawJson","parsed","parse","jsonParseError","runValidate","r","validateError","runSave","hadJsonDirty","hadAgentDirty","structuredClone","agentOk","save","saveError","runDiscard","discard","runReload","reloadError","runTestKey","set","openAddProvider","preset","onProviderAdded","prov","c","removeProv","window","confirm","removeProviderConfirm","replace","openModelDialog","patchTestResults","onModelSaved","updated","map","mm","outerClass","compactClass","settingsSections","needToken","subtitle","docsLink","loadFileWarning","filePath","modeGuided","const","press","modeExpert","modeGuidedHint","modeExpertHint","addProvider","validate","reload","statsProviders","String","statsModels","unsavedHint","saved","errors","valid","validationWarnings","validationErrors","err","severity","target","jsonReset","jsonApply","open","o","apiFetch","apiUrl","OAuthStartResult","sessionId","provider","status","OAuthSessionStatus","authUrl","instructions","message","error","expiresAt","startAsyncOAuthLogin","Promise","res","method","body","JSON","stringify","ok","err","json","catch","Error","data","payload","fetchOAuthSessionStatus","encodeURIComponent","submitOAuthCode","code","cancelOAuth","cleanupOAuthSession","revokeOAuth","Popover","ExternalLink","Info","X","cn","ghostIconButton","SETTINGS_SHELL_POPOVER_Z","StoredLanguage","PROVIDER_ENRICHMENT","ProviderInfoPopoverProps","providerId","language","ProviderInfoPopover","t0","$","_c","enrichment","isZh","description","descriptionZh","t1","Symbol","for","t2","t3","t4","t5","t6","t7","t8","t9","t10","t11","t12","t13","bestFor","length","map","_temp","t14","freeTier","freeTierNote","undefined","t15","docsUrl","pricingUrl","t16","t17","t18","tag","ProviderActiveKeySource","ProviderCategory","ProviderRowModel","ProvidersSettingsMessages","CATEGORY_ORDER","groupByCategory","rows","Map","map","c","set","r","cat","category","list","get","push","interpolate","template","params","Record","replace","_","key","String","activeSourceLabel","labels","src","sourceAgent","sourceGateway","sourceOauth","sourceEnv","sourceModelsJson","sourceExtension","sourceNone","AlertCircle","CheckCircle2","ChevronDown","Copy","ExternalLink","Eye","EyeOff","Info","KeyRound","Loader2","LogIn","LogOut","Trash2","X","useCallback","useEffect","useEffectEvent","useMemo","useReducer","useRef","useState","Button","ConfirmDialog","ConfiguredModel","cancelOAuth","cleanupOAuthSession","fetchOAuthSessionStatus","revokeOAuth","startAsyncOAuthLogin","submitOAuthCode","deleteProviderApiKey","isMaskedKey","testProviderKeyResolution","ProviderRowModel","getOrderedApiKeyLinks","PROVIDER_ENRICHMENT","providerApiKeyLinkLabel","ProviderInfoPopover","activeSourceLabel","interpolate","settingsInputFocusClass","copyTextToClipboard","cn","interaction","StoredLanguage","ProvidersSettingsMessages","EnvVarCopyRow","t0","$","_c","envVar","labels","copied","setCopied","t1","ok","window","setTimeout","handleCopy","t2","t3","t4","Symbol","for","press","t5","copy","t6","t7","t8","t9","OAuthState","loading","sessionId","status","message","authUrl","instructions","codeInput","OAuthAction","type","value","initialOAuthState","oauthReducer","state","action","undefined","RowUiState","showKey","revokeError","removeLoading","removeMessage","removeConfirmOpen","testLoading","testMessage","testOk","RowUiAction","open","initialRowUi","rowUiReducer","MoreOptionsSection","label","children","setOpen","_temp","toggle","v","ProviderCredentialRow","row","rowDirty","language","onChange","onReload","justSaved","availableModels","autoExpand","autoFocusInput","id","expanded","setExpanded","keyInputRef","HTMLInputElement","trackedAutoExpandRef","current","bindKeyInputRef","el","focus","ui","dispatchUi","oauth","dispatchOAuth","oauthLoading","oauthSessionId","oauthStatus","oauthMessage","oauthSessionIdRef","masked","inputValue","isOAuthConfigured","configured","Boolean","activeSrc","activeKeySource","apiKeyLinks","catch","reloadProviders","setInterval","st","clearInterval","error","startOAuth","oauthStarting","res","e","Error","cancelFlow","submitCode","trim","oauthProcessingCode","doRevoke","confirm","revokeConfirm","name","then","revokeFailed","doRemoveKey","removeKeySuccess","removeKeyFailed","canRemoveKey","copyKey","runTest","testFailed","testOkEnv","testOkCommand","testOkLiteral","secondaryLine","metaWillSave","metaMasked","runtimeLabelPrefix","metaNotConfigured","detailsId","expandRowDetails","supportsApiKey","placeholderOverride","placeholderKeep","placeholderKey","target","transition","focusRingPanel","hide","show","testingKey","testKey","supportsOAuth","revoke","openAuthPage","pasteRedirectUrl","key","envHint","maskedStoredHint","providerModels","filter","m","provider","length","savedNoModels","preview","slice","map","join","suffix","savedModelsAvailable","envVars","hasMore","moreOptions","envVarAlt","link","kind","href","removeKey","removeKeyConfirm","CheckCircle2","ChevronDown","KeyRound","Search","useCallback","useEffect","useMemo","useReducer","useRef","uiPatchReducer","useSWR","Button","CONFIGURED_MODELS_SWR_KEY","fetchConfiguredModelsCached","useSaveBarRegistration","useGatewayConfigSwr","isMaskedKey","mergeProviderRows","patchProviderApiKeys","providersKeysFromConfigRoot","ProviderMeta","ProviderRowModel","PROVIDER_ENRICHMENT","ProviderCredentialRow","CATEGORY_ORDER","groupByCategory","interpolate","fetchJson","apiUrl","settingsInputFocusClass","cn","interaction","messages","useGatewayStore","useLocaleStore","ProvidersDraft","draft","Record","baseline","ProvidersDraftAction","type","rows","id","value","providersDraftReducer","state","action","d","r","apiKey","ProvidersUi","saving","error","saveNotice","expandedCats","Set","searchQuery","unconfiguredOnly","savedProviderIds","quickStartProviderId","initialProvidersUi","ProvidersSettingsPanel","embedded","language","s","m","p","providersSettings","token","st","hasToken","Boolean","draftState","dispatchDraft","ui","dispatchUi","dirtyRef","metaUrl","fetchMetaList","url","data","ok","payload","providers","cfgData","cfgErr","isLoading","cfgLoading","mutate","mutCfg","metaList","metaErr","metaLoading","mutMeta","revalidateOnFocus","models","mutModels","mergedRows","undefined","keys","config","fetchError","Error","message","String","loading","dirty","JSON","stringify","onBeforeUnload","e","BeforeUnloadEvent","preventDefault","returnValue","window","addEventListener","removeEventListener","current","metaRows","filteredRows","q","trim","toLowerCase","filter","enrichment","aliases","includes","name","some","alias","configured","groups","searchTrim","effectiveExpandedCats","next","c","get","length","add","save","toPatch","Object","v","patch","setTimeout","freshModels","nextCfg","nextMeta","Promise","all","list","Array","isArray","cfg","saveError","discard","toggleCat","cat","has","delete","refreshProviders","filtersActive","outerClass","compactClass","skeletonClass","settingsSections","needToken","logs","loadError","empty","refresh","subtitle","rotateHint","saved","noChangesSaved","unsavedHint","every","quickStartIntro","intro","row","find","category","target","searchPlaceholder","checked","clearFilters","noMatches","map","expanded","configuredCount","panelId","pressCard","categories","count","isQuickTarget","ProviderQuickStart","t0","$","_c","recommended","onPick","t1","t2","t3","t4","t5","Symbol","for","bb0","t6","available","t7","Map","_temp","lookup","t8","id_0","meta","label","r_0","Loader2","useState","Button","messages","cn","useLocaleStore","useSaveBarStore","SaveAllFailure","SaveBarControls","$","_c","language","_temp","m","t","modelsHub","saveBar","anyDirty","_temp2","anySaving","_temp3","dirtyCount","_temp4","saveAll","_temp5","discardAll","_temp6","t0","Symbol","for","failures","setFailures","savedFlash","setSavedFlash","length","t1","result","ok","saved","window","setTimeout","onSaveAll","t2","t3","t4","failuresSummary","replace","String","t5","t6","t7","t8","t9","t10","t11","undefined","t12","t13","t14","title","dirtySummary","savedSummary","cleanSummary","s_4","s","s_3","s_2","s_1","s_0","ExternalLink","Loader2","Mic","Volume2","useCallback","useMemo","useReducer","useRef","useState","ReactNode","useSWR","Button","useSaveBarRegistration","useGatewayConfigSwr","fetchVoiceModels","fetchVoiceProviders","fetchVoiceSttProviders","normalizeVoiceSettings","patchVoiceSettings","SttProviderListEntry","TtsProviderListEntry","VoiceModelsPayload","VoiceSettingsState","VoiceApiKeyField","VoiceApiKeyFieldLabels","apiUrl","nativeSelectMaxWidthClass","selectControlBaseClass","settingsInputFocusClass","cn","messages","VoiceSettingsMessages","docsGuidePageUrl","useGatewayStore","useLocaleStore","credentialFieldWidthClass","sttEnvHint","provider","ttsEnvHint","inputClassName","selectClassName","STT_ALIBABA_FALLBACK","id","name","STT_OPENAI_FALLBACK","STT_GROQ_MODELS_FALLBACK","TTS_OPENAI_MODELS_FALLBACK","TTS_OPENAI_VOICES_FALLBACK","TTS_ALIBABA_MODELS_FALLBACK","TTS_ALIBABA_VOICES_FALLBACK","TTS_EDGE_VOICES_FALLBACK","TTS_MINIMAX_MODELS_FALLBACK","TTS_MINIMAX_VOICES_FALLBACK","FALLBACK_TTS_PROVIDERS","aliases","configured","FALLBACK_STT_PROVIDERS","sttProviderLabel","v","stt","openai","alibaba","ttsProviderLabel","tts","providerOpenai","providerEdge","providerLocalCli","voiceApiKeyLabels","maskedHelp","apiKeyMaskedHelp","copy","apiKeyCopy","copied","apiKeyCopied","show","apiKeyShow","hide","apiKeyHide","notInConfigFile","apiKeyNotInConfigFile","loadFailed","apiKeyRevealFailed","VoiceFormDraft","form","baseline","VoiceFormAction","type","value","updater","prev","voiceFormReducer","state","action","snapshot","structuredClone","VoiceSettingsPanel","embedded","language","s","m","voiceSettings","token","st","hasToken","Boolean","formDraft","dispatchForm","models","setModels","saving","setSaving","error","setError","saveOk","setSaveOk","dirtyRef","trackedVoiceSyncRef","parsed","undefined","data","cfgData","cfgErr","isLoading","cfgLoading","mutate","mutCfg","voiceModels","vmErr","vmLoading","mutVm","revalidateOnFocus","voiceProviders","vpErr","vpLoading","voiceSttProviders","vspErr","vspLoading","ttsProviders","providers","sttProviders","voiceParsed","payload","config","dirty","JSON","stringify","current","loading","fetchError","Error","message","String","updateStt","patch","Partial","f","updateSttAlibaba","NonNullable","updateSttOpenai","updateSttFallback","cur","fallback","enabled","order","updateTts","updateTtsAlibaba","updateTtsOpenai","updateTtsEdge","edge","updateTtsMinimax","minimax","updateTtsLocalCli","save","window","setTimeout","e","saveError","discard","outerClass","compactClass","settingsSections","voice","needToken","loadError","retry","apiKeyLabels","subtitle","docsLink","saved","unsavedHint","notes","title","duration","envVars","SttSection","t0","$","_c","alibabaModels","length","openaiModels","options","seen","Set","entry","has","add","push","t1","Symbol","for","t2","providerOptions","extensionProviderSlice","extensionApiKey","apiKey","extensionModel","model","updateExtensionProvider","t3","t4","description","t5","t6","enable","t7","enableDesc","t8","t9","target","checked","t10","t11","t12","e_0","map","entry_0","e_1","_temp","e_2","_temp2","e_3","_temp3","e_4","next","apiKeyDesc","fallbackDesc","e_5","t13","t14","m_1","m_0","TtsSection","t","triggerDescOff","triggerDescAlways","triggerDescInbound","triggerDescTagged","triggerDesc","ttsOpenai","ttsVoicesOpenai","ttsVoices","ttsAlibaba","ttsVoicesAlibaba","ttsVoicesEdge","ttsMinimax","ttsVoicesMinimax","trigger","triggerOff","triggerAlways","triggerInbound","triggerTagged","_temp4","_temp5","_temp6","edgeHint","localCli","command","commandPlaceholder","commandDesc","cwd","e_6","cwdDesc","outputFormat","e_7","outputFormatDesc","timeoutMs","e_8","raw","trim","num","Number","isFinite","timeoutMsDesc","hint","FieldLabel","children","revalidateGatewayConfig","fetchJson","apiUrl","SearchProviderRow","type","apiKey","url","disabled","WebSearchSettingsState","regionMode","maxResults","providers","blocklistEnabled","blocklistDomains","normalizeWebSearchSettingsFromConfig","cfg","tools","undefined","web","region","search","s","Record","Number","isFinite","Math","floor","blocklist","bl","Array","isArray","domains","filter","d","trim","length","rawProviders","rows","map","p","o","t","enabled","patchWebSearchSettings","state","Promise","row","replace","method","body","JSON","stringify","Ban","ExternalLink","Loader2","Plus","Search","Trash2","useCallback","useMemo","useReducer","useRef","useState","ReactNode","Button","useGatewayConfigSwr","normalizeWebSearchSettingsFromConfig","patchWebSearchSettings","SearchProviderRow","WebSearchSettingsState","useSaveBarRegistration","SettingsFormSection","SettingsFormSectionHeader","isMaskedKey","nativeSelectMaxWidthClass","selectControlBaseClass","settingsInputFocusClass","cn","messages","WebSearchSettingsMessages","docsGuidePageUrl","createFormDraftReducer","syncFormDraftFromParsed","useGatewayStore","useLocaleStore","Field","t0","$","_c","label","description","children","t1","t2","t3","inputClassName","selectClassName","PROVIDER_TYPES","emptyProviderRow","type","apiKey","url","disabled","webSearchFormReducer","WebSearchSettingsPanel","embedded","language","s","m","w","webSearchSettings","logs","token","st","hasToken","Boolean","formDraft","dispatchForm","form","baseline","saving","setSaving","error","setError","saveOk","setSaveOk","dirtyRef","trackedParsedRef","data","swrError","isLoading","mutate","parsed","payload","config","undefined","enabled","dirty","current","dispatch","onResetDirty","loading","fetchError","Error","message","String","JSON","stringify","update","patch","Partial","save","value","window","setTimeout","e","saveError","discard","id","outerClass","compactClass","title","needToken","loadError","refresh","subtitle","docsLink","saved","unsavedHint","sectionRegion","sectionRegionHint","regionLabel","regionDesc","regionMode","target","regionAuto","regionCn","regionGlobal","sectionBlocklist","sectionBlocklistHint","blocklistEnabled","checked","blocklistEnabledDesc","blocklistDomains","blocklistDomainsDesc","join","blocklistDomainsPlaceholder","domains","split","flatMap","line","v","trim","toLowerCase","sectionSearch","sectionSearchHint","maxResultsLabel","maxResultsDesc","maxResults","Math","max","min","Number","providersTitle","providers","map","row","index","next","nextRows","filter","_","i","addProvider","footerHint","ProviderRowEditor","labels","onChange","onRemove","Symbol","for","t4","providerTypes","t","t5","t6","e_0","t7","t8","t9","t10","t11","t12","t13","urlDesc","urlLabel","e_1","t14","apiKeyLabel","t15","apiKeyDesc","t16","t17","t18","keyPlaceholderMasked","keyPlaceholder","t19","e_2","t20","t21","t22","ModelsHubTabId","MODELS_HUB_TABS","const","parseModelsHubTab","raw","id","trim","includes","Bot","ExternalLink","ImageIcon","KeyRound","Mic","Search","LucideIcon","useCallback","useRef","useSearchParams","ImageModelsSettingsPanel","ModelsSettingsPanel","ProvidersSettingsPanel","SaveBarControls","VoiceSettingsPanel","WebSearchSettingsPanel","messages","cn","interaction","docsGuidePageUrl","useLocaleStore","MODELS_HUB_TABS","parseModelsHubTab","ModelsHubTabId","TabDef","id","icon","labelKey","hintKey","TAB_DEFS","ModelsHubPanel","$","_c","language","_temp","t0","m","sections","settingsSections","c","modelsHub","searchParams","setSearchParams","t1","get","activeTab","t2","tab","prev","next","URLSearchParams","delete","set","replace","setActiveTab","t3","credentials","t4","subtitle","t5","t6","Symbol","for","t7","docsLink","t8","t9","t10","tabsAria","t11","e","key","preventDefault","idx","indexOf","delta","len","length","t12","map","t13","Icon","selected","press","t14","t15","providersHint","t16","t17","modelsHint","t18","t19","imageHint","t20","t21","voiceHint","t22","t23","searchHint","t24","s","LazyPanelHost","hint","children","React","ReactNode","visible","mountedRef","current","undefined","PreferenceSelectFields","messages","cn","interaction","useLocaleStore","ColorScheme","useThemeStore","preferenceCardClassName","SCHEME_PREVIEW","Record","light","canvas","panel","accent","fg","muted","dark","default","emerald","mono","clay","SchemePreviewHalf","t0","$","_c","t1","backgroundColor","t2","borderColor","t3","t4","opacity","t5","t6","t7","t8","t9","SchemePreviewSwatch","scheme","Symbol","for","COLOR_SCHEME_OPTIONS","value","labelKey","ColorSchemeSelector","language","_temp","m","a","appearanceSettings","colorScheme","_temp2","setColorScheme","_temp3","colorSchemeTitle","colorSchemeDescription","map","isSelected","pressCard","s_1","s","s_0","AppearanceSettingsPanel","_temp4","pageTitle","subtitle","languageTitle","themeTitle","t10","t11","t12","t13","fetchJson","apiUrl","DreamingPhaseId","DreamingLastRunRecord","version","phase","runId","startedAt","finishedAt","durationMs","ok","reason","errorMessage","config","enabled","minScore","minRecallCount","limit","memoryPath","deep","candidatesRanked","applied","skipped","alreadyPromotedKey","rehydrateFailed","contaminated","hashDuplicate","PhaseLastRun","exists","path","raw","DreamingGatewayStatus","workspaceDir","frequency","timezone","phases","light","cron","lookbackDays","dedupeSimilarity","minUniqueQueries","recencyHalfLifeDays","maxAgeDays","rem","minPatternStrength","storePath","store","updatedAt","entryCount","promotedCount","lastPromotedAt","lock","locked","content","mtimeMs","lastRun","record","parseError","lightLastRun","remLastRun","dreamingSwrKey","fetchDreamingStatus","Promise","res","payload","Error","postDreamingAction","action","method","body","JSON","stringify","postDreamingRunNow","triggered","jobId","Boolean","DreamingPreviewItem","key","hash","snippet","startLine","endLine","score","avgScore","recallCount","recencyDecay","alreadyPromotedByKey","alreadyPromotedByHash","skippedReason","DreamingPreviewResponse","items","fetchDreamingPreview","q","Number","isFinite","encodeURIComponent","String","DreamingEvent","timestamp","scannedEntries","newSignals","deduped","candidates","patternsDiscovered","entriesAnalyzed","fetchDreamingEvents","events","revalidateGatewayConfig","fetchJson","apiUrl","isRecord","v","Record","Array","isArray","DreamingLightConfigState","enabled","cron","lookbackDays","limit","dedupeSimilarity","DreamingDeepConfigState","minScore","minRecallCount","recencyHalfLifeDays","maxAgeDays","DreamingRemConfigState","minPatternStrength","DreamingConfigState","frequency","timezone","deepEnabled","light","deep","rem","LIGHT_DEFAULTS","DEEP_DEFAULTS","REM_DEFAULTS","DEFAULTS","clamp01","n","fallback","Number","isFinite","Math","max","min","toInt","x","floor","toNum","value","num","normalizeDreamingFromConfig","config","c","agents","defaults","memory","dreaming","phases","lightRaw","deepRaw","remRaw","trim","patchDreamingConfig","state","Promise","freq","tz","method","body","JSON","stringify","Boolean","useMemo","useRef","useState","HEARTBEAT_INTERVAL_PRESET_MS_ORDER","IntervalPresetLabels","cn","formControlBorderFocusClass","selectControlBaseClass","IntervalSchedulePickerLabels","secondsLabel","presets","numberInputClass","presetSelectClass","presetOptionLabel","ms","every30s","every1min","every5min","every10min","every15min","every30min","every1h","every2h","String","IntervalSchedulePickerProps","valueMs","onChangeMs","labels","disabled","minSeconds","IntervalSchedulePicker","presetSet","Set","intervalPresetSelectValue","has","secondsDraft","setSecondsDraft","trackedValueMsRef","current","secondsCommitted","Math","max","round","secondsInputValue","e","next","target","value","raw","parseInt","Number","isFinite","v","custom","map","Button","cn","formControlBorderFocusClass","ActiveHoursValue","start","end","timezone","ActiveHoursPickerLabels","add","clear","timeInputClass","defaultActiveHours","ActiveHoursPickerProps","value","onChange","labels","disabled","ActiveHoursPicker","t0","$","_c","t1","t2","e","target","t3","t4","t5","t6","e_0","t7","t8","t9","t10","e_1","t11","t12","t13","t14","t15","t16","CronSchedulePickerLabels","CronSchedulePicker","IntervalSchedulePicker","IntervalSchedulePickerLabels","HEARTBEAT_INTERVAL_PRESET_MS_ORDER","ActiveHoursPicker","ActiveHoursPickerLabels","ActiveHoursValue","cn","ScheduleFieldShellProps","disabled","label","hint","className","CronScheduleFieldProps","kind","value","onChange","cron","labels","IntervalScheduleFieldProps","valueMs","onChangeMs","ms","presets","minSeconds","ActiveHoursScheduleFieldProps","ScheduleFieldProps","ScheduleField","props","$","_c","t0","t1","t2","t3","t4","t5","t6","ReactNode","DreamingGatewayStatus","DreamingLastRunRecord","PhaseLastRun","CronSchedulePickerLabels","ScheduleField","MessageBundle","cn","formControlBorderFocusClass","sectionTightClass","sectionHeaderTightClass","phasePanelClass","numInputClass","DreamingSettingsI18n","rowLabelClass","rowValueClass","FieldCell","t0","$","_c","label","children","className","t1","t2","StatCell","t3","Symbol","for","t4","t5","PanelHeading","isoShort","v","replace","formatDurationMs","ms","undefined","Number","isFinite","Math","round","toFixed","lockStatusLabel","s","labels","Pick","text","locked","lockValueLocked","lockValueUnlocked","PhaseConfigPanel","icon","title","hint","enabled","onEnabledChange","cron","onCronChange","scheduleLabels","disabled","onLabel","offLabel","cronLabel","t6","e","target","checked","t7","t8","t9","t10","t11","t12","t13","t14","PhaseStatusCard","scheduleSummary","details","t","on","off","PhaseLastRunBlock","lastRun","lastRunRaw","phaseLastRunEmpty","exists","JSON","stringify","raw","LastRunStructuredView","r","deep","skipped","ok","lastRunSuccess","lastRunFailure","lastRunStatus","lastRunDuration","durationMs","lastRunRanked","String","candidatesRanked","lastRunApplied","applied","reason","t15","errorMessage","lastRunError","t16","lastRunReason","t17","lastRunSkipContaminated","lastRunSkipHash","lastRunSkipKey","lastRunSkipRehydrate","alreadyPromotedKey","rehydrateFailed","contaminated","hashDuplicate","t18","Loader2","Moon","Settings2","Sparkles","Sun","Button","DreamingConfigState","FieldCell","PhaseConfigPanel","numInputClass","phasePanelClass","sectionHeaderTightClass","sectionTightClass","DreamingSettingsI18n","SettingsFormSection","SettingsFormSectionHeader","CronSchedulePickerLabels","ScheduleField","cn","Props","t","schedulePickerLabels","hasToken","cfgForm","cfgBaseline","cfgSaving","cfgDirty","setCfgForm","next","prev","setCfgOk","v","setCfgError","saveConfig","Promise","DreamingConfigSection","t0","$","_c","t1","Symbol","for","t2","t3","t4","t5","t6","t7","t8","resetConfig","t9","t10","configHint","configTitle","t11","configDeepHalfLife","configDeepLimit","configDeepMaxAge","configDeepMinRecallCount","configDeepMinScore","configFrequency","configLightDedupe","configLightLimit","configLightLookbackDays","configLoading","configPhaseCron","configPhaseDeep","configPhaseDeepHint","configPhaseLight","configPhaseLightHint","configPhaseRem","configPhaseRemHint","configRemLimit","configRemLookbackDays","configRemMinStrength","configTimezone","off","on","frequency","timezone","e","prev_0","target","value","light","enabled","prev_1","cron","prev_2","lookbackDays","e_0","prev_3","Number","limit","e_1","prev_4","dedupeSimilarity","e_2","prev_5","deep","enabled_0","prev_6","cron_0","prev_7","minScore","e_3","prev_8","minRecallCount","e_4","prev_9","e_5","prev_10","recencyHalfLifeDays","e_6","prev_11","maxAgeDays","e_7","prev_12","rem","enabled_1","prev_13","cron_1","prev_14","e_8","prev_15","e_9","prev_16","minPatternStrength","e_10","prev_17","t12","Activity","Loader2","Button","DreamingEvent","formatDurationMs","isoShort","sectionHeaderTightClass","sectionTightClass","DreamingSettingsI18n","SettingsFormSection","SettingsFormSectionHeader","cn","Props","t","hasToken","eventsLoading","events","loadEvents","Promise","DreamingEventsSection","t0","$","_c","t1","t2","t3","t4","eventsLoad","t5","eventsHint","eventsTitle","t6","eventsEmpty","eventsNotLoaded","length","map","_temp","t7","ev","phaseIcon","phase","metrics","scannedEntries","newSignals","deduped","patternsDiscovered","entriesAnalyzed","candidates","applied","timestamp","ok","durationMs","Loader2","Play","RefreshCw","Button","DreamingPhaseId","DreamingConfigState","DreamingSettingsI18n","cn","Props","t","cfgForm","dreamingEnabled","hasToken","cfgSaving","enableSaving","runPhase","setRunPhase","p","runBusy","doRunNow","phase","Promise","doRefresh","setDreamingEnabled","enabled","DreamingHeader","t0","$","_c","t1","title","t2","subtitle","t3","t4","configEnabled","off","on","e","target","checked","t5","runNow","runNowHint","e_0","value","t6","t7","t8","Symbol","for","t9","refresh","t10","t11","Loader2","Trash2","Unlock","Wrench","Button","sectionHeaderTightClass","sectionTightClass","DreamingSettingsI18n","SettingsFormSection","SettingsFormSectionHeader","cn","Props","t","disabled","actionBusy","doAction","action","Promise","DreamingMaintenanceSection","t0","$","_c","t1","Symbol","for","t2","maintenanceHint","maintenanceTitle","t3","confirmResetStore","confirm","t4","t5","resetStore","t6","confirmClearLock","t7","t8","clearLock","t9","t10","Loader2","ScanLine","Button","DreamingPreviewItem","sectionHeaderTightClass","sectionTightClass","DreamingSettingsI18n","SettingsFormSection","SettingsFormSectionHeader","Props","t","hasToken","previewLoading","previewItems","loadPreview","Promise","DreamingPreviewSection","t0","$","_c","t1","t2","t3","t4","previewLoad","t5","previewHint","previewTitle","t6","previewEligible","previewEmpty","previewNotLoaded","length","map","it","src","path","startLine","endLine","skipped","skippedReason","key","hash","score","toFixed","recallCount","avgScore","recencyDecay","snippet","t7","Activity","Loader2","Moon","Sparkles","Sun","DreamingGatewayStatus","PanelHeading","PhaseLastRunBlock","PhaseStatusCard","StatCell","isoShort","lockStatusLabel","phasePanelClass","sectionHeaderTightClass","sectionTightClass","DreamingSettingsI18n","LastRunStructuredView","SettingsFormSection","SettingsFormSectionHeader","formatCronExpressionLabel","ScheduleBadgeLabels","ScheduleSummary","cn","Props","t","data","isLoading","localeTag","scheduleBadgeLabels","DreamingRuntimeSection","t0","$","_c","t1","lock","lockLabel","t2","Symbol","for","t3","t4","runtimeHint","runtimeTitle","t5","subsectionSchedule","t6","config","enabled","on","off","t7","t8","className","t9","text","t10","t11","t12","timezone","t13","t14","frequency","undefined","t15","t16","schedule","t17","t18","t19","subsectionStore","t20","String","store","entryCount","t21","storeEntries","t22","promotedCount","t23","storePromoted","t24","updatedAt","t25","storeUpdatedAt","t26","lastPromotedAt","t27","storeLastPromotedAt","t28","t29","t30","phases","subsectionPhases","light","cron","lookbackDays","limit","dedupeSimilarity","deep","minScore","minRecallCount","recencyHalfLifeDays","rem","minPatternStrength","t31","subsectionLastRun","t32","lastRunBlockHint","t33","lastRun","exists","parseError","lastRunParseError","record","raw","lastRunRaw","JSON","stringify","lastRunEmpty","t34","t35","lightLastRun","t36","subsectionLightLastRun","t37","remLastRun","t38","subsectionRemLastRun","t39","t40","Activity","ScanLine","Settings2","Wrench","LucideIcon","useCallback","useEffect","useMemo","useReducer","useRef","ReactNode","uiPatchReducer","useSearchParams","useSWR","useGatewayConfigSwr","dreamingSwrKey","fetchDreamingEvents","fetchDreamingPreview","fetchDreamingStatus","postDreamingAction","postDreamingRunNow","DreamingEvent","DreamingPhaseId","DreamingPreviewItem","normalizeDreamingFromConfig","patchDreamingConfig","DreamingConfigState","DreamingConfigSection","DreamingEventsSection","DreamingHeader","DreamingMaintenanceSection","DreamingPreviewSection","DreamingRuntimeSection","cn","interaction","messages","MessageBundle","useGatewayStore","useLocaleStore","DreamingSettingsI18n","DreamingSettingsTabId","DREAMING_SETTINGS_TABS","DREAMING_SETTINGS_TAB_ICONS","Record","config","runtime","insights","maintenance","parseDreamingSettingsTab","raw","includes","dreamingSettingsTabLabel","t","tab","tabConfig","tabRuntime","tabInsights","tabMaintenance","dreamingSettingsTabHint","configTabHint","runtimeTabHint","insightsTabHint","maintenanceTabHint","DreamingFormDraft","form","baseline","DreamingFormAction","type","value","dreamingFormReducer","state","action","DreamingUi","actionBusy","actionError","actionOk","runBusy","runOk","runError","runPhase","cfgSaving","enableSaving","cfgOk","cfgError","previewLoading","previewError","previewItems","eventsLoading","eventsError","events","initialDreamingUi","DreamingSettingsPanel","language","s","m","dreamingSettings","schedulePickerLabels","cron","schedulePicker","scheduleBadgeLabels","scheduleBadge","localeTag","token","st","hasToken","Boolean","searchParams","setSearchParams","activeTab","get","setActiveTab","prev","next","URLSearchParams","delete","set","replace","data","cfgData","ui","dispatchUi","cfgDraft","dispatchCfg","cfgForm","cfgBaseline","cfgDirtyRef","error","isLoading","mutate","revalidateOnFocus","errorMessages","list","push","Error","message","String","successMessages","configSaved","runQueued","doRefresh","patch","loadPreview","res","items","e","loadEvents","result","doRunNow","phase","doAction","disabled","cfgFromGateway","rawCfg","payload","current","cfgDirty","JSON","stringify","saveConfig","setDreamingEnabled","enabled","dreamingEnabled","length","map","line","resolved","ok","err","DreamingSettingsTabs","t0","$","_c","onChange","t1","tabsAriaLabel","t2","event","key","preventDefault","currentIndex","indexOf","delta","nextIndex","t3","Icon","selected","press","t4","DreamingTabPanel","id","children","t5","t6","t7","t8","revalidateGatewayConfig","fetchJson","apiUrl","CronGlobalsState","enabled","maxConcurrentJobs","defaultTimezone","historyRetentionDays","enableMetrics","DEFAULT_CRON_GLOBALS","isRecord","v","Record","Array","isArray","normalizeCronGlobalsFromConfig","config","c","cron","Number","isFinite","Math","max","min","floor","trim","patchCronGlobals","state","Promise","method","body","JSON","stringify","Clock","Loader2","useCallback","useMemo","useReducer","useRef","Button","useGatewayConfigSwr","normalizeCronGlobalsFromConfig","patchCronGlobals","CronGlobalsState","SettingsFormSection","SettingsFormSectionHeader","settingsInputFocusClass","cn","messages","useLocaleStore","inputClassName","GlobalsUiState","form","baseline","saving","error","saveOk","dirty","GlobalsAction","type","parsed","patch","Partial","initialGlobalsUiState","globalsReducer","state","action","structuredClone","CronGlobalsSection","hasToken","language","s","t","cron","globals","data","isLoading","payload","config","undefined","ui","dispatch","trackedParsedRef","current","Boolean","JSON","stringify","update","save","window","setTimeout","e","Error","message","saveError","loading","title","hint","saved","discard","enabled","target","checked","maxConcurrent","maxConcurrentJobs","timezone","defaultTimezone","retentionDays","historyRetentionDays","enableMetrics","metrics","Field","t0","$","_c","label","value","min","max","disabled","text","onChange","onTextChange","t1","t2","String","e_0","n","Number","isFinite","Math","floor","t3","Link","CronGlobalsSection","messages","pathForTab","useGatewayStore","useLocaleStore","CronSettingsPanel","$","_c","language","_temp","t0","t","cronSettingsPage","token","_temp2","hasToken","Boolean","t1","title","t2","subtitle","t3","Symbol","for","t4","tasksLink","t5","t6","t7","st","s","revalidateGatewayConfig","fetchJson","apiUrl","GoalsConfigState","maxTurns","judgeModelRef","checklistMode","maxConsecutiveParseFailures","judgeTimeoutSec","checklistHistoryChars","DEFAULT_GOALS_CONFIG","isRecord","v","Record","Array","isArray","normalizeGoalsConfigFromConfig","config","c","goals","Number","isFinite","Math","max","min","floor","judgeTimeoutMs","round","patchGoalsConfig","state","Promise","method","body","JSON","stringify","trim","Target","Loader2","useCallback","useMemo","useReducer","useRef","useState","Button","ModelSelector","useGatewayConfigSwr","normalizeGoalsConfigFromConfig","patchGoalsConfig","GoalsConfigState","SettingsFormSection","SettingsFormSectionHeader","settingsInputFocusClass","cn","messages","useLocaleStore","inputClassName","GoalsFormDraft","form","baseline","GoalsFormAction","type","value","patch","Partial","goalsFormReducer","state","action","snapshot","structuredClone","GoalsConfigSection","hasToken","language","s","t","goalsSettings","chatM","chat","data","isLoading","parsed","payload","config","undefined","formDraft","dispatchForm","saving","setSaving","error","setError","dirtyRef","trackedParsedRef","current","dirty","JSON","stringify","update","title","hint","discard","e","Error","message","saveError","save","maxTurns","Number","target","judgeModelRef","judgeModelRefPlaceholder","modelSearchPlaceholder","modelNoMatches","modelId","trim","judgeModelRefUseDefault","judgeModelRefHint","checklistMode","checked","parseFailures","maxConsecutiveParseFailures","judgeTimeoutSec","checklistHistoryChars","Math","max","min","floor","checklistHistoryCharsHint","GoalsConfigSection","messages","useGatewayStore","useLocaleStore","GoalsSettingsPanel","$","_c","language","_temp","t0","t","goalsSettingsPage","token","_temp2","hasToken","Boolean","t1","title","t2","subtitle","t3","t4","t5","st","s","GatewayBindMode","GatewayAuthMode","UpdatePackageChannel","GatewayAuthRateLimitState","enabled","maxAttempts","windowMs","blockDurationMs","exemptLoopback","GatewayTrustedProxyState","userHeader","requiredHeaders","allowUsers","allowLoopback","GatewayChannelConnectDeferMode","GatewaySettingsState","bind","customBindHost","port","auth","mode","token","password","rateLimit","trustedProxy","corsOrigins","trustedProxies","allowRealIpFallback","dangerouslyAllowHostHeaderOriginFallback","securityStrict","maxSseConnections","channelConnectDeferMode","channelConnectDeferIds","channelConnectDeferSkipIds","updateChannel","updateCheckOnStart","updateAutoEnabled","updateAutoStableDelayHours","updateAutoStableJitterHours","updateAutoBetaCheckIntervalHours","DEFAULT_GATEWAY_PORT","DEFAULT_MAX_SSE_CONNECTIONS","MAX_CHANNEL_DEFER_LIST_SIZE","DEFAULT_AUTH_RATE_LIMIT","DEFAULT_TRUSTED_PROXY","revalidateGatewayConfig","fetchJson","apiUrl","DEFAULT_AUTH_RATE_LIMIT","DEFAULT_GATEWAY_PORT","DEFAULT_MAX_SSE_CONNECTIONS","MAX_CHANNEL_DEFER_LIST_SIZE","GatewayAuthMode","GatewayAuthRateLimitState","GatewayBindMode","GatewayChannelConnectDeferMode","GatewaySettingsState","GatewayTrustedProxyState","UpdatePackageChannel","isRecord","v","Record","Array","isArray","isMaskedGatewaySecret","value","normalizeSecretForRestartCompare","trim","sortedStringList","values","map","sort","snapshotGatewayRestartSettings","state","JSON","stringify","bind","customBindHost","port","auth","mode","token","password","rateLimit","trustedProxy","userHeader","requiredHeaders","allowUsers","allowLoopback","corsOrigins","trustedProxies","allowRealIpFallback","dangerouslyAllowHostHeaderOriginFallback","gatewaySettingsRequireRestart","from","to","normalizeAuthMode","raw","normalizeRateLimit","rl","enabled","maxAttempts","Number","isFinite","Math","max","floor","windowMs","blockDurationMs","lockoutMs","exemptLoopback","normalizeTrustedProxy","tp","normalizeStringIdList","normalizeDeferMode","filter","x","length","slice","normalizeBindMode","isNonLoopbackGatewayBind","host","toLowerCase","validateGatewaySettings","nonLoopback","includes","normalizeGatewayFromConfig","config","c","gw","gateway","security","upd","update","auto","ch","channel","updateChannel","securityStrict","strict","maxSseConnections","channelConnectDeferMode","channelConnectDeferIds","channelConnectDeferSkipIds","updateCheckOnStart","checkOnStart","updateAutoEnabled","updateAutoStableDelayHours","stableDelayHours","updateAutoStableJitterHours","stableJitterHours","updateAutoBetaCheckIntervalHours","betaCheckIntervalHours","buildAuthPatch","patchGatewaySettings","Promise","validationError","Error","method","body","fetchJson","apiUrl","GatewaySecurityAuditSeverity","GatewaySecurityAuditFinding","checkId","severity","title","detail","remediation","GatewaySecurityAuditStatus","GatewaySecurityAuditResult","status","message","hints","findings","DoctorCheckResponse","id","label","DoctorApiResponse","ok","checks","SEVERITY_RANK","Record","critical","warn","info","gatewaySecurityAuditSwrKey","sortSecurityAuditFindings","toSorted","a","b","localeCompare","parseGatewaySecurityAuditResponse","data","check","find","c","filter","f","Array","isArray","h","fetchGatewaySecurityAudit","Promise","res","AlertCircle","AlertTriangle","Info","Loader2","RefreshCw","ShieldCheck","useSWR","mutate","SettingsFormSection","SettingsFormSectionHeader","fetchGatewaySecurityAudit","gatewaySecurityAuditSwrKey","GatewaySecurityAuditFinding","GatewaySecurityAuditResult","GatewaySecurityAuditSeverity","GatewaySecurityAuditStatus","Button","cn","messages","GatewaySettingsMessages","useLocaleStore","Props","enabled","refreshToken","GatewaySecurityAuditCard","t0","$","_c","t1","undefined","language","_temp","t2","g","gatewaySettings","t3","t4","Symbol","for","revalidateOnFocus","data","error","isLoading","isValidating","localMutate","_temp2","audit","fetchError","Error","message","String","refreshing","t5","refresh","t6","t7","t8","securityAuditRefresh","t9","t10","securityAuditSubtitle","securityAuditTitle","t11","securityAuditSavedConfigHint","t12","securityAuditLoadError","t13","securityAuditLoading","t14","t15","s","SecurityAuditBody","T0","summary","findings","status","statusSummary","bannerClass","icon","iconClass","title","length","map","finding","checkId","securityAuditNoFindings","hints","securityAuditHintsTitle","_temp3","hint","FindingRow","severity","meta","severityMeta","detail","remediation","securityAuditRemediation","criticalCount","filter","f","warnCount","securityAuditStatusFail","securityAuditStatusWarn","securityAuditStatusSkip","securityAuditStatusPass","AlertCircle","Check","Copy","ExternalLink","Eye","EyeOff","KeyRound","Loader2","Network","RefreshCw","RotateCw","Shield","SlidersHorizontal","LucideIcon","useCallback","useMemo","useReducer","useRef","ReactNode","uiPatchReducer","useSearchParams","Button","ConfirmDialog","useGatewayConfigSwr","gatewaySettingsRequireRestart","normalizeGatewayFromConfig","patchGatewaySettings","validateGatewaySettings","GatewaySettingsState","GatewaySecurityAuditCard","MAX_CHANNEL_DEFER_LIST_SIZE","restartGatewayAfterConfigChange","settingsInputFocusClass","cn","copyTextToClipboard","interaction","messages","GatewaySettingsMessages","docsGuidePageUrl","useGatewayStore","useLocaleStore","inputClassName","GatewaySettingsTabId","GATEWAY_SETTINGS_TABS","GATEWAY_SETTINGS_TAB_ICONS","Record","network","access","updates","security","advanced","parseGatewaySettingsTab","raw","includes","gatewaySettingsTabLabel","g","tab","tabNetwork","tabAccess","tabUpdates","tabSecurity","tabAdvanced","gatewaySettingsTabHint","networkTabHint","accessTabHint","updatesTabHint","securitySectionHint","advancedSectionHint","GatewayFormDraft","form","baseline","appliedBaseline","GatewayFormAction","type","value","updater","prev","gatewayFormReducer","state","action","structuredClone","snapshot","GatewayUi","saving","error","saveOk","showAccessToken","showPassword","copied","auditRefreshToken","restarting","restartConfirmOpen","initialGatewayUi","GatewaySettingsPanel","language","s","m","gatewaySettings","searchParams","setSearchParams","activeTab","get","setActiveTab","next","URLSearchParams","delete","set","replace","token","st","tokenExpired","openTokenDialog","hasToken","Boolean","formDraft","dispatchForm","ui","dispatchUi","dirtyRef","trackedParsedRef","appliedBaselineInitializedRef","data","swrError","isLoading","mutate","parsed","payload","config","undefined","current","patch","loading","fetchError","Error","message","String","dirty","JSON","stringify","showRestartPrompt","updateAuth","Partial","f","auth","updateChannel","channel","updateCorsOrigins","corsOrigins","updateBind","bind","updateCustomBindHost","customBindHost","updatePort","port","updateRateLimit","rateLimit","updateMaxSseConnections","maxSseConnections","updateChannelConnectDeferMode","channelConnectDeferMode","updateChannelConnectDeferIds","channelConnectDeferIds","updateChannelConnectDeferSkipIds","channelConnectDeferSkipIds","updateTrustedProxies","trustedProxies","updateTrustedProxy","trustedProxy","updateSecurityStrict","securityStrict","updateAllowRealIpFallback","allowRealIpFallback","updateDangerouslyAllowHostHeaderOriginFallback","dangerouslyAllowHostHeaderOriginFallback","save","validationError","window","setTimeout","e","saveError","discard","copyAccessToken","t","ok","executeRestart","res","dispatchEvent","Event","CustomEvent","detail","title","restartGatewayFailed","settingsSections","gateway","needToken","loadError","retry","subtitle","docsLink","saved","updateToken","unsavedHint","restartHint","restartGatewayButton","restartGatewayConfirm","bindMode","event","target","bindLoopback","bindLan","bindAuto","bindCustom","bindTailnet","customBindHostPlaceholder","listenPort","nextPort","Number","isFinite","Math","max","min","floor","listenHint","mode","authModeNone","authMode","authModeToken","authModePassword","authModeTrustedProxy","authModeNoneLabel","accessToken","tokenHelp","tokenPlaceholder","tokenValue","changeToken","authPassword","authPasswordHelp","authPasswordPlaceholder","password","passwordValue","channelStable","channelBeta","channelDev","updateChannelHint","updateAutoSection","updateAutoSectionHint","updateCheckOnStart","currentForm","checked","updateCheckOnStartHint","updateAutoEnabled","updateAutoEnabledHint","updateAutoStableDelayHours","updateAutoStableDelayHoursHint","updateAutoStableJitterHours","updateAutoStableJitterHoursHint","updateAutoBetaCheckIntervalHours","updateAutoBetaCheckIntervalHoursHint","GatewaySettingsTabs","t0","$","_c","onChange","t1","tabsAriaLabel","t2","key","preventDefault","currentIndex","indexOf","delta","nextIndex","length","t3","map","Icon","selected","press","t4","GatewayTabPanel","id","children","t5","t6","t7","t8","t9","GatewaySecurityFields","onSecurityStrictChange","onDangerouslyAllowHostHeaderOriginFallbackChange","securityStrictHint","e_0","t10","dangerouslyAllowHostHeaderOriginFallbackHint","t11","t12","t13","dangerouslyAllowHostHeaderOriginFallbackWarning","t14","TrustedProxyAuthFields","onTrustedProxyChange","onTrustedProxiesChange","onAllowRealIpFallbackChange","tp","authModeTrustedProxyHint","trustedProxyUserHeader","Symbol","for","userHeader","trustedProxyUserHeaderPlaceholder","trustedProxyUserHeaderHint","requiredHeaders","channelIdListEmpty","trustedProxyRequiredHeaders","trustedProxyRequiredHeadersHint","allowUsers","trustedProxyAllowUsers","trustedProxyAllowUsersHint","allowLoopback","trustedProxyAllowLoopback","t15","trustedProxyAllowLoopbackHint","t16","t17","t18","trustedProxiesEmpty","trustedProxiesHint","trustedProxiesPlaceholder","t19","e_1","t20","t21","t22","allowRealIpFallbackHint","t23","t24","t25","GatewayAdvancedFields","onMaxSseConnectionsChange","onDeferModeChange","onDeferIdsChange","onSkipIdsChange","n","maxSseConnectionsHint","channelConnectDeferModeAuto","channelConnectDeferModeOff","channelConnectDeferModeExplicit","channelConnectDeferModeHint","channelConnectDeferIdsHint","channelIdListPlaceholder","channelConnectDeferSkipIdsHint","GatewayStringListField","hint","emptyText","placeholder","values","maxItems","trim","addValue","filter","x","HTMLInputElement","CorsOriginsField","origins","hasWildcard","corsOriginsWildcardWarning","corsOriginsEmpty","corsOriginsHint","corsOriginsPlaceholder","AuthRateLimitFields","rateLimitTitle","rateLimitHint","enabled","rateLimitEnabled","exemptLoopback","rateLimitExemptLoopback","rateLimitMaxAttempts","maxAttempts","rateLimitWindowMinutes","windowMs","round","e_2","n_0","rateLimitBlockMinutes","t26","blockDurationMs","t27","t28","e_3","n_1","t29","t30","t31","t32","SecretCredentialField","label","help","show","onToggleShow","onCopy","copy","hide","Clock","ExternalLink","FileText","Heart","Loader2","MessageSquare","Play","RefreshCw","LucideIcon","useCallback","useEffect","useMemo","useReducer","useRef","ReactNode","uiPatchReducer","useSearchParams","useSWR","Button","getSessionChatIds","ChannelStatus","SessionChatId","formatRecipientOptionLabel","useGatewayConfigSwr","channelsStatusSwrKey","fetchChannelsStatusSwr","normalizeHeartbeatFromConfig","patchHeartbeatSettings","putHeartbeatMd","triggerHeartbeat","fetchHeartbeatMdSwr","heartbeatMdSwrKey","HeartbeatSettingsState","SaveBarControls","useSaveBarRegistration","nativeSelectMaxWidthClass","selectControlBaseClass","settingsInputFocusClass","cn","interaction","messages","HeartbeatSettingsMessages","ScheduleField","docsGuidePageUrl","useGatewayStore","useLocaleStore","useAsyncResource","inputClassName","selectClassName","CronMessages","ReturnType","HeartbeatSettingsTabId","HEARTBEAT_SETTINGS_TABS","HEARTBEAT_SETTINGS_TAB_ICONS","Record","schedule","delivery","prompt","document","parseHeartbeatSettingsTab","raw","includes","heartbeatSettingsTabLabel","h","tab","tabSchedule","tabDelivery","tabPrompt","tabDocument","heartbeatSettingsTabHint","scheduleTabHint","deliveryTabHint","promptTabHint","documentTabHint","HeartbeatFormDraft","form","baseline","HeartbeatFormAction","type","value","patch","Partial","heartbeatFormReducer","state","action","snapshot","structuredClone","HeartbeatDocDraft","doc","HeartbeatDocAction","heartbeatDocReducer","workspacePathFromConfig","cfg","Array","isArray","agents","defaults","w","workspace","HeartbeatUi","saving","error","triggerLoading","triggerOk","triggerError","initialHeartbeatUi","HeartbeatSettingsPanel","language","s","m","heartbeatSettings","token","st","hasToken","Boolean","searchParams","setSearchParams","activeTab","get","setActiveTab","prev","next","URLSearchParams","delete","set","replace","formDraft","dispatchForm","docDraft","dispatchDoc","docBaseline","ui","dispatchUi","configDirtyRef","docDirtyRef","data","cfgData","cfgErr","isLoading","cfgLoading","mutate","mutCfg","mdContent","mdErr","mdLoading","mutMd","revalidateOnFocus","channels","workspacePath","payload","config","heartbeatParsed","dirtyConfig","JSON","stringify","dirtyDoc","current","undefined","fetchError","Error","message","String","loading","deliveryTarget","target","trim","sessionChatIds","setData","setSessionChatIds","enabled","length","initial","errorData","refreshSessionChatIds","then","runHeartbeatNow","window","setTimeout","e","update","dirty","discard","save","fallback","saveConfigError","saveDocError","id","settingsSections","heartbeat","needToken","loadError","retry","subtitle","docsLink","triggering","triggerNow","triggered","workspaceLabel","cron","docHint","docSection","HeartbeatSettingsTabs","t0","$","_c","onChange","t1","tabsAriaLabel","t2","event","key","preventDefault","currentIndex","indexOf","delta","nextIndex","t3","map","Icon","selected","press","t4","HeartbeatTabPanel","children","t5","t6","t7","t8","t9","HeartbeatScheduleFields","checked","enable","intervalMs","intervalPresets","intervalSecondsLabel","secondsLabel","presets","intervalHintPreset","intervalHint","interval","activeHours","activeEnd","activeStart","activeTimezone","addActiveHours","clearActiveHours","start","end","timezone","add","clear","t10","activeHoursHint","activeHoursTitle","t11","HeartbeatDeliveryFields","c","onRefreshChatIds","inputCn","selectCn","Set","_temp","channelNames","targetTrim","showCustomChannel","has","deliveryHint","channel","targetChatId","channelNone","customChannelSuffix","_temp2","t12","enterManuallyOrSelect","lastActiveLabels","noRecentChats","noRecentChatsOption","recipient","recipientPlaceholder","refreshList","refreshRecipientHint","selectRecipient","event_0","event_1","value_0","item","chatId","t13","channel_0","name","HeartbeatPromptFields","includeSystemPromptSection","includeSystemPromptSectionHint","promptPlaceholder","promptHint","ackMaxChars","t14","t15","parsedValue","parseInt","Number","isFinite","t16","ackDefaultPlaceholder","t17","ackMaxCharsHint","t18","t19","event_2","isolatedSession","t20","t21","isolatedSessionHint","t22","t23","t24","useCallback","useState","useSWRConfig","revalidateGatewayConfig","restartGatewayAfterConfigChange","waitForGatewayApiReady","waitForPairingReadyAfterRestart","enableLanMobilePairing","MobilePairContextResponse","useEnableLanPairing","gatewayToken","onSuccess","context","mutate","globalMutate","busy","setBusy","error","setError","confirmOpen","setConfirmOpen","refreshPairingState","Promise","all","runEnableLanPairing","result","ok","Error","requiresRestart","restart","message","apiReady","pairingReady","e","clearError","Loader2","RefreshCw","Smartphone","Link","Button","CopyTextRow","ConfirmDialog","SettingsFormSection","MobilePairQrState","useEnableLanPairing","settingsInputFocusClass","cn","messages","useLocaleStore","inputClassName","MobilePairQrSection","t0","$","_c","pairQr","gatewayToken","streamlined","t1","lanOnly","t2","onRefreshQr","undefined","language","_temp","t3","m","t","tunnelSettings","lanCopy","remoteAccess","lan","t4","clipboard","copyFailed","pairCopied","pairCopyLink","copy","copied","copyLabels","tunnelActive","tunnelStatus","tunnelQr","pairContext","pairBaseUrl","setPairBaseUrl","applySuggestedPairUrl","applyCandidateUrl","resetPairBaseFromContext","baseOk","localhostWarn","pairingBlocked","deepLink","qrPayload","qrDataUrl","qrGenFailed","encoding","t5","context","recommended","url","enableLan","effectiveStreamlined","t6","t7","t8","t9","candidates","pairBaseUrlHint","pairBaseUrlLabel","pairBaseUrlPlaceholder","pairBlockedLoopbackBody","pairBlockedNextSteps","pairBlockedTitle","pairCandidatesTitle","pairEnableLanButton","pairEnableLanEnabling","pairEnableLanSecurityAuditLink","pairInvalidBaseUrl","pairLocalhostWarning","pairSelectCandidateHint","pairSelectCandidateTitle","pairSubtitle","pairSuggestedLanLabel","pairTitle","pairTunnelActive","pairTunnelLanUrl","pairTunnelPublicUrl","pairUseSuggestedUrl","pairWaitingForTunnel","refreshQr","publicUrl","Symbol","for","bb0","lanCandidates","filter","_temp2","suggestedUrl","find","_temp3","trim","showLanCandidatePicker","length","renderLanCandidateList","tone","itemClass","labelClass","map","candidate","label","t10","t11","t12","t13","showRefreshButton","Boolean","t14","t15","t16","busy","setConfirmOpen","error","pairPublicTabLink","lanUrl","e","target","value","pairSecurityNote","pairEncoding","pairImageError","pairQrDisabled","deeplinkTitle","pairMobileProbeHint","pairSchemeHint","runEnableLanPairing","confirmOpen","consentCancel","pairEnableLanConfirmBody","pairEnableLanConfirmTitle","t17","sectionBody","c_0","c","reachable","kind","s","Dialog","useState","Button","cn","SETTINGS_SHELL_CONTENT_Z","SETTINGS_SHELL_OVERLAY_Z","TunnelConsentDialogProps","open","title","intro","bullets","checkboxLabel","confirmLabel","cancelLabel","onConfirm","onCancel","TunnelConsentDialog","t0","$","_c","checked","setChecked","t1","next","t2","Symbol","for","t3","t4","t5","t6","map","_temp2","t7","t8","e_0","e","target","t9","t10","t11","t12","t13","t14","t15","t16","_temp","t17","line","preventDefault","Check","Circle","Loader2","useEffect","useState","TunnelStatusResponse","TunnelSettingsMessages","cn","StepId","formatByteCount","bytes","toFixed","STEP_ORDER","phaseIndex","phase","indexOf","stepState","stepId","status","state","current","startProgress","idx","currentIdx","stepDetail","t","progress","frpcDownload","frpcExtracting","percent","frpcDownloadingPercent","replace","String","frpcDownloading","publicUrl","stepRegisterDetail","stepReconnectDetail","stepFrpcDetail","stepLabel","stepPrepareFrpc","stepRegister","stepFrpcLogin","formatPhaseElapsed","startedAt","sec","Math","max","floor","Date","now","getTime","TunnelStartProgressPanel","t0","$","_c","setTick","t1","id","window","setInterval","_temp","clearInterval","t2","t3","showSteps","Boolean","showPendingUrlNotice","t4","t5","t6","t7","elapsed","t8","startProgressTitle","t9","startProgressHint","t10","map","detail","width","undefined","bytesReceived","totalBytes","url","frpcDownloadingUrlLabel","startProgressElapsed","publicUrlPendingNotice","n","AlertTriangle","Globe","Loader2","Power","CopyTextRow","Button","settingsFormSectionClassName","TunnelStatusResponse","TunnelStartProgressPanel","cn","TunnelSettingsMessages","statusLabel","t","status","state","statusConnected","statusError","startProgress","phase","statusReconnecting","statusStartingFrpc","statusRegistering","frpcDownload","statusPreparingFrpc","statusConnecting","statusOff","statusTone","toneClasses","tone","ReturnType","formatUptime","since","ms","Date","now","getTime","mins","Math","floor","hrs","rem","Props","isLoading","statusErr","starting","stopping","showConsentExpired","copyLabels","copy","copied","copyFailed","startDisabled","startDisabledReason","stepLabel","onStart","onStop","TunnelControlCard","t0","$","_c","st","t1","undefined","active","showProgress","t2","t3","t4","t5","enabled","Boolean","Symbol","for","t6","t7","t8","t9","t10","t11","t12","loading","t13","t14","connectedSince","uptime","t15","t16","t17","t18","Error","message","String","t19","consentExpiredBanner","t20","emptyStateTitle","emptyStateBody","riskBannerBody","start","publicUrl","publicUrlLabel","lastError","stop","t21","Check","CheckCircle2","Copy","ExternalLink","Eye","EyeOff","KeyRound","Loader2","useCallback","useId","useReducer","useRef","RefObject","uiPatchReducer","Button","SettingsFormSection","isMaskedKey","revealTunnelRegistrationSecret","cn","copyTextToClipboard","interaction","TunnelSettingsMessages","TUNNEL_CONSOLE_REGISTRATION_KEY_URL","BrokerSecretSetupProps","t","brokerSecretFromEnv","brokerSecretMissing","brokerSecretConfiguredInConfig","brokerSecretMaskedValue","brokerSecretDraft","savingBrokerSecret","brokerSecretNotice","copyFailedLabel","onDraftChange","value","onSave","onClear","sectionRef","HTMLDivElement","BrokerSecretUi","reconfiguring","showKey","revealed","revealLoading","revealErr","copied","initialBrokerSecretUi","undefined","BrokerSecretSetupSection","inputId","needsSetup","ready","ui","dispatch","showStoredKeyRow","trim","trackedConfiguredRef","current","type","patch","trackedNoticeRef","copyKey","text","ok","window","setTimeout","toggleEye","payload","registrationSecret","e","Error","message","brokerSecretRevealFailed","canSave","length","cancelReconfigure","brokerSecretReadyTitle","brokerSecretStepTitle","brokerSecretReadyHint","brokerSecretHint","brokerSecretMissingHint","brokerSecretConsoleLink","brokerSecretEnvHint","brokerSecretMaskedHelp","brokerSecretTitle","transition","press","focusRingPanel","hideKey","brokerSecretNotInConfigFile","brokerSecretReconfigure","brokerSecretClear","brokerSecretPlaceholder","target","brokerSecretSaveAndContinue","brokerSecretSave","brokerSecretCancelReconfigure","ExternalLink","cn","remoteAccessDocsUrl","RemoteAccessDocsSection","StoredLanguage","Props","language","label","section","className","RemoteAccessDocsLink","t0","$","_c","t1","t2","t3","Symbol","for","t4","QRCode","MOBILE_PAIR_QR_OPTIONS","width","margin","errorCorrectionLevel","const","color","dark","light","encodeMobilePairQr","payload","Promise","toDataURL","useCallback","useEffect","useMemo","useRef","useState","useSWR","useSWRConfig","createTunnelPair","fetchTunnelPairContext","fetchTunnelQr","fetchTunnelStatus","MobilePairContextResponse","TunnelQrResponse","TunnelStatusResponse","encodeMobilePairQr","buildMobileGatewayPairDeepLink","isLoopbackHttpOrigin","useAsyncResource","pickLanCandidateUrl","context","candidates","reachable","find","c","kind","anyLan","url","trim","isTunnelCandidateUrl","trimmed","some","resolveSuggestedPairBaseUrl","preferLan","recommended","MobilePairQrState","tunnelActive","tunnelStatus","tunnelQr","pairContext","pairBaseUrl","setPairBaseUrl","value","applySuggestedPairUrl","applyCandidateUrl","baseOk","localhostWarn","pairingBlocked","deepLink","qrPayload","qrDataUrl","qrGenFailed","encoding","refreshQr","payload","Promise","resetPairBaseFromContext","UseMobilePairQrOptions","useMobilePairQr","gatewayToken","options","hasToken","Boolean","mutate","globalMutate","userEditedBaseRef","data","refreshInterval","mutPairContext","onTunnelStatus","window","addEventListener","removeEventListener","state","publicUrl","useTunnelQr","mutTunnelQr","lanPair","mutLanPair","pairingReady","setPairBaseUrlState","manualPayload","setManualPayload","syncSource","setSyncSource","undefined","current","suggested","trimmedBase","u","URL","protocol","blockReason","lanPairReady","pairingSecret","lanBaseUrl","fromCandidates","tunnelCandidate","lanCandidate","baseUrl","lanUrl","qrImage","enabled","initial","errorData","error","loading","Globe","Loader2","useCallback","useEffect","useMemo","useReducer","useRef","uiPatchReducer","useSWR","Button","ConfirmDialog","useGatewayConfigSwr","revalidateGatewayConfig","isMaskedKey","SettingsCollapsibleSection","SettingsFormSection","MobilePairQrSection","TunnelConsentDialog","TunnelControlCard","BrokerSecretSetupSection","RemoteAccessDocsLink","fetchTunnelStatus","patchTunnelConfig","recordTunnelConsent","startTunnel","stopTunnel","useMobilePairQr","cn","messages","useGatewayStore","useLocaleStore","TunnelUi","actionError","starting","stopping","savingAutoStart","consentOpen","autoStartConfirmOpen","releaseConfirmOpen","releasing","brokerSecretDraft","savingBrokerSecret","brokerSecretNotice","initialTunnelUi","TunnelSettingsPanel","embedded","language","s","t","tunnelSettings","token","st","hasToken","Boolean","ui","dispatchUi","brokerSecretSectionRef","HTMLDivElement","pairQr","data","cfgData","status","error","statusErr","isLoading","mutate","mutStatus","refreshInterval","latest","frpcDownload","state","autoStartEnabled","c","payload","config","Array","isArray","tunnel","autoStart","brokerSecretFromConfig","secret","registrationSecret","brokerSecretConfiguredInConfig","brokerSecretFromEnv","source","brokerSecretMissing","brokerReady","configured","onTunnelStatus","window","addEventListener","removeEventListener","consentBullets","consentBullet1","consentBullet2","consentBullet3","const","runStart","type","patch","res","refreshQr","qrPayload","e","Error","message","String","handleStartClick","brokerSecretRequiredBeforeStart","current","scrollIntoView","behavior","block","consentRequired","handleConsentConfirm","Promise","all","handleStop","applyAutoStart","next","toggleAutoStart","consentExpiredBanner","canAutoStart","autoStartHint","saveBrokerSecret","trimmed","trim","brokerSecretSaved","clearBrokerSecret","brokerSecretCleared","handleRelease","release","copyLabels","copy","copyUrl","copied","copyFailed","clipboard","undefined","needToken","enabled","subdomain","publicUrl","connectedSince","frpcPid","lastHeartbeatAt","lastError","brokerUrl","showConsentExpired","consent","acceptedAt","brokerSecretBlock","value","dialogs","consentTitle","consentIntro","consentCheckbox","consentReconfirm","consentConfirm","consentCancel","autoStartConfirmTitle","autoStartConfirmBody","autoStartConfirmLabel","releaseConfirmTitle","releaseConfirmBody","releaseConfirmLabel","flowStepStart","showOptions","hideOptions","releaseHint","showAdvanced","hideAdvanced","brokerNote","brokerDocsLink","title","subtitle","optionsTitle","apiFetch","ExposureStatusResponse","bindMode","tailscale","mode","active","hostname","resetOnExit","cliAvailable","tunnel","Record","conflicts","Array","code","message","fetchExposureStatus","Promise","res","ok","Error","status","json","startTailscaleExposure","method","headers","body","JSON","stringify","catch","error","stopTailscaleExposure","Globe","Loader2","Power","useCallback","useMemo","useState","useSWR","Button","CopyTextRow","SettingsFormSection","SettingsFormSectionHeader","RemoteAccessDocsLink","fetchExposureStatus","startTailscaleExposure","stopTailscaleExposure","messages","useGatewayStore","useLocaleStore","TAILSCALE_DOWNLOAD_URL","TailscaleDownloadLink","t0","$","_c","label","t1","TailscaleServeSection","embedded","language","s","t","remoteAccess","tailscale","copyLabels","copy","copyUrl","copied","copyFailed","clipboard","hasToken","Boolean","token","busy","setBusy","error","setError","data","mutate","isLoading","refreshInterval","hostname","active","cliAvailable","publicUrl","onStart","err","Error","message","String","onStop","body","stepInstallBefore","stepInstallLink","stepInstallAfter","stepEnable","stepCopy","cliMissingIntro","cliMissingDownloadLink","cliMissingSuffix","loading","statusLabel","statusActive","statusOff","enableServe","disableServe","hint","docsLink","title","subtitle","ExternalLink","Server","Link","SettingsFormSection","SettingsFormSectionHeader","MobilePairQrSection","useMobilePairQr","messages","useGatewayStore","useLocaleStore","RemoteAccessLanTab","$","_c","language","_temp","token","_temp2","t0","lan","remoteAccess","t1","Symbol","for","preferLan","pairQr","t2","subtitle","title","t3","body","t4","t5","link","t6","t7","t8","t9","refreshQr","t10","t11","s_0","s","Copy","Terminal","useCallback","useState","Button","SettingsFormSection","SettingsFormSectionHeader","messages","copyTextToClipboard","useLocaleStore","SshCliSection","t0","$","_c","embedded","t1","undefined","language","_temp","t2","t","remoteAccess","ssh","copied","setCopied","command","t3","Symbol","for","ok","setTimeout","onCopy","t4","t5","t6","t7","copy","t8","t9","hint","t10","commandBlock","t11","subtitle","title","t12","t13","s","SshCliSection","RemoteAccessSshTab","$","_c","t0","Symbol","for","Globe","Network","Server","Terminal","useSWR","fetchExposureStatus","fetchTunnelStatus","messages","cn","useGatewayStore","useLocaleStore","RemoteAccessTabId","StatusKind","statusPillClass","kind","StatusPill","t0","$","_c","label","t1","t2","RemoteAccessStatusStrip","onOpenTab","language","_temp","g","remoteAccess","guide","hasToken","Boolean","_temp2","Symbol","for","refreshInterval","data","exposure","t3","tunnel","tailscaleActive","tailscale","active","tunnelState","state","tunnelActive","enabled","tunnelConnecting","startProgress","frpcDownload","t4","t5","statusActive","statusOff","t6","tailscaleCardTitle","tab","icon","title","statusLabel","t7","t8","statusConnecting","t9","publicCardTitle","t10","sshCardStatus","sshCardTitle","t11","lanCardStatus","lanCardTitle","t12","items","t13","map","item","Icon","s_0","s","token","ChevronRight","Globe","Network","Server","Terminal","useSWR","RemoteAccessDocsLink","fetchExposureStatus","messages","cn","useGatewayStore","useLocaleStore","RemoteAccessStatusStrip","RemoteAccessTabId","MethodCardProps","title","description","recommended","icon","onOpen","openLabel","recommendedLabel","MethodCard","t0","$","_c","Icon","t1","Symbol","for","t2","t3","t4","t5","t6","t7","t8","t9","t10","t11","RemoteAccessGuideTab","onOpenTab","language","_temp","ra","remoteAccess","g","guide","hasToken","Boolean","_temp2","refreshInterval","data","exposure","conflicts","needToken","conflictsHint","conflictsTitle","length","map","_temp3","pickMethod","configure","tailscaleCardDesc","tailscaleCardTitle","publicCardDesc","publicCardTitle","t12","sshCardDesc","sshCardTitle","t13","t14","lanCardDesc","lanCardTitle","t15","t16","t17","oneAtATimeHint","t18","advanced","proxyTitle","t19","proxyBody","t20","proxyDocs","t21","t22","docsLink","t23","c","code","message","s_0","s","token","REMOTE_ACCESS_TABS","const","RemoteAccessTabId","parseRemoteAccessTab","raw","includes","useCallback","useSearchParams","TunnelSettingsPanel","TailscaleServeSection","RemoteAccessLanTab","RemoteAccessSshTab","RemoteAccessGuideTab","RemoteAccessDocsLink","REMOTE_ACCESS_TABS","parseRemoteAccessTab","RemoteAccessTabId","RemoteAccessDocsSection","messages","cn","useGatewayStore","useLocaleStore","tabLabel","ra","ReturnType","tab","tabs","tabIntro","tabDocsSection","undefined","RemoteAccessTabPanel","t0","$","_c","onOpenTab","t1","Symbol","for","RemoteAccessHub","language","_temp","remoteAccess","hasToken","Boolean","_temp2","searchParams","setSearchParams","activeTab","get","prev","next","URLSearchParams","delete","set","replace","setActiveTab","intro","pageTitle","pageSubtitle","docsLink","guide","needToken","tabsAria","e","key","preventDefault","idx","indexOf","delta","next_0","length","map","tab_0","selected","s_0","s","token","revalidateGatewayConfig","fetchJson","apiUrl","SharePolicyState","enabled","defaultTtlHours","maxTtlDays","maxActiveShares","maxFileSizeMb","inlinePreviewMimes","DEFAULT_SHARE_POLICY","MS_PER_HOUR","MS_PER_DAY","BYTES_PER_MB","isRecord","v","Record","Array","isArray","normalizeStringList","raw","max","filter","x","trim","length","map","slice","normalizeSharePolicyFromConfig","config","c","gw","gateway","share","defaultTtlMs","Number","isFinite","Math","floor","maxTtlMs","maxFileSize","round","min","validateSharePolicy","state","patchSharePolicy","Promise","validationError","Error","method","body","JSON","stringify","Loader2","useCallback","useMemo","useRef","useState","Button","useGatewayConfigSwr","normalizeSharePolicyFromConfig","patchSharePolicy","SharePolicyState","SettingsFormSection","settingsInputFocusClass","cn","messages","SharesSettingsMessages","useLocaleStore","inputClassName","Props","hasToken","SharePolicySection","language","s","t","sharesSettings","data","isLoading","parsed","payload","config","undefined","structuredClone","dirtyRef","localDraft","setLocalDraft","saving","setSaving","error","setError","saveOk","setSaveOk","form","baseline","dirty","JSON","stringify","update","patch","Partial","current","prev","base","save","window","setTimeout","e","Error","message","policySaveError","discard","policyLoading","policyTitle","policyHint","policySaved","policyDiscard","policySaving","policySave","policyUnsaved","policyRestartHint","SharePolicyFields","t0","$","_c","onChange","t1","enabled","target","checked","t2","t3","policyEnabled","t4","t5","defaultTtlHours","t6","policyDefaultTtlHint","policyDefaultTtlHours","t7","t8","maxTtlDays","t9","policyMaxTtlDays","policyMaxTtlHint","t10","t11","maxActiveShares","t12","policyMaxActiveShares","policyMaxActiveSharesHint","t13","t14","maxFileSizeMb","t15","policyMaxFileSizeHint","policyMaxFileSizeMb","t16","t17","t18","inlinePreviewMimes","t19","t20","NumberField","id","label","hint","value","min","max","disabled","Symbol","for","n","Number","isFinite","Math","floor","MimeListField","values","raw","next","trim","includes","length","addValue","policyInlinePreviewMimes","policyInlinePreviewMimesHint","map","filter","x","key","preventDefault","HTMLInputElement","policyMimePlaceholder","Check","Clock","Copy","FileText","Loader2","Plus","RefreshCw","Trash2","useCallback","useMemo","useReducer","useState","uiPatchReducer","useSWR","Button","ConfirmDialog","SettingsFormSection","cleanExpiredShares","createShare","extendShare","fetchShares","revokeShare","CreateShareParams","ShareItem","ReachabilityHint","ShareLinkDialog","ShareUrlCopyRows","ShareLinkResult","SharePolicySection","cn","copyTextToClipboard","messages","useGatewayStore","useLocaleStore","formatFileSize","bytes","toFixed","formatRelativeTime","isoDate","language","diff","Date","getTime","now","absDiff","Math","abs","isPast","minutes","floor","label","hours","days","TTL_OPTIONS","value","key","const","SharesSettingsPanel","$","_c","_temp","t0","t","sharesSettings","token","_temp2","hasToken","Boolean","t1","Symbol","for","refreshInterval","data","error","isLoading","mutate","t2","payload","shares","showExpired","setShowExpired","t3","bb0","t4","filter","_temp3","filteredShares","_temp4","activeCount","length","t5","_temp5","expiredCount","t6","needToken","title","t7","subtitle","t8","t9","t10","t11","t12","allSharesTitle","listTitle","t13","t14","t15","t16","t17","t18","t19","t20","hideExpired","_temp6","t21","t22","t23","loading","retry","emptyState","map","share","id","t24","t25","t26","v","s_2","s","expired","revoked","s_1","s_0","st","CreateShareUi","expanded","path","ttlMs","maxViews","description","creating","result","errorMsg","resultDialogOpen","initialCreateShareUi","CreateShareSection","onCreated","ReturnType","ui","dispatch","handleCreate","trim","type","patch","params","undefined","res","err","Error","message","String","resetForm","createTitle","createHint","pathLabel","pathPlaceholder","e","target","ttlLabel","Number","opt","ttlOptions","maxViewsLabel","maxViewsUnlimited","descriptionLabel","descriptionPlaceholder","createButton","cancel","open","ShareRowUi","revokeOpen","revoking","linksOpen","urlCopied","copyFailed","extending","initialShareRowUi","ShareRow","onRevoked","onExtended","isActive","statusLabel","statusRevoked","statusExpired","statusActive","statusColor","handleRevoke","handleCopy","ok","shareUrl","window","setTimeout","handleExtend","fileName","workspaceRelativePath","fileSize","expiresAt","views","viewCount","viewsOf","copyUrl","extend","lanUrl","reachability","revokeConfirmTitle","revokeConfirmBody","revokeConfirmLabel","CleanExpiredButton","onCleaned","confirmOpen","setConfirmOpen","cleaning","setCleaning","handleClean","cleanExpired","cleanExpiredConfirmTitle","cleanExpiredConfirmBody","cleanExpiredConfirmLabel","Copy","FolderOpen","Package","useCallback","useEffect","useReducer","uiPatchReducer","Dialog","Button","SettingsFormSection","copyTextToClipboard","cn","interaction","SETTINGS_SHELL_CONTENT_Z","SETTINGS_SHELL_OVERLAY_Z","UninstallErrorCode","UninstallInfo","formatBytes","bytes","unknownLabel","toFixed","mapUninstallError","code","errors","Record","pendingUpdate","generic","uninstallerNotFound","notPackaged","resolveUninstallDescription","info","m","AppManagementMessages","platform","uninstallDescDarwin","uninstallDescWin","linuxPackageKind","uninstallDescLinuxAppImage","pkg","linuxDebPackageName","uninstallDescLinuxDeb","replace","uninstallDescLinuxUnknown","title","loading","devOnlyTitle","devOnlyBody","appPath","dataPath","dataSize","dataSizeUnknown","copyPath","copied","copyFailed","cliDataWarning","openCliData","pendingUpdateBlocked","clearData","clearDataDesc","clearDataConfirmTitle","clearDataConfirmDesc","clearDataConfirmCheckbox","clearDataConfirmPhrase","clearDataConfirmLabel","clearDataConfirmHint","uninstall","uninstallConfirmTitle","removeUserDataCheckbox","confirmClear","confirmUninstall","cancel","AppManagementSectionProps","api","NonNullable","Window","messages","embedded","AppManagementUi","loadError","actionError","copiedField","clearDialogOpen","clearConfirmChecked","clearConfirmText","uninstallDialogOpen","removeUserDataOnUninstall","busy","initialAppManagementUi","AppManagementSection","ui","dispatch","load","getUninstallInfo","type","patch","next","e","Error","message","String","value","field","ok","window","setTimeout","path","shell","electronAPI","r","openPath","error","handleClearData","clearUserData","result","handleUninstall","uninstallApp","removeUserData","isDevBuild","packaged","actionsDisabled","showUninstall","uninstallMode","uninstallDescription","clearConfirmReady","trim","openClearDialog","hasSeparateCliData","cliDataPath","press","userDataPath","userDataSizeBytes","open","preventDefault","target","checked","AppManagementSection","settingsFormSectionClassName","isElectron","messages","useLocaleStore","AppManagementSettingsPanel","$","_c","language","_temp","t0","m","t","systemSettings","app","appManagement","api","window","electronAPI","system","undefined","t1","title","t2","Symbol","for","t3","desktopOnlyTitle","t4","desktopOnlyBody","t5","t6","s","ExternalLink","RefreshCw","Shield","useCallback","useEffect","useReducer","uiPatchReducer","SettingsFormSection","settingsFormSectionClassName","dispatchShellPrefsChanged","enableDesktopNotificationsWithTest","isElectron","StoredLanguage","messages","useLocaleStore","cn","interaction","PrivacyPaneKind","PermissionRequestResult","ShellPermissionSnapshot","SystemSettingsBehavior","TccTriState","probeRendererMicrophone","Promise","navigator","mediaDevices","getUserMedia","stream","audio","track","getTracks","stop","microphoneFeedback","result","rendererOk","fb","granted","alreadyGranted","openedSettings","denied","rendererDenied","prompted","outcome","status","accessibilityFeedback","notificationFeedback","screenFeedback","REQUESTABLE_PERM_KEYS","Set","canRequestAccess","key","platform","has","canOpenSettings","PERM_ROWS","pane","platforms","Array","visiblePermRows","filter","row","includes","triStateFromMessages","lang","s","label","className","m","systemSettings","unknown","permUnknownHint","hints","permUnknown","darwin","win32","linux","SystemPanelUi","behavior","perms","loadError","permFeedback","permBusy","refreshing","initialSystemPanelUi","SystemSettingsPanel","language","t","ui","dispatch","api","window","electronAPI","system","undefined","load","options","showRefreshFeedback","type","patch","b","getBehavior","nextPerms","getPermissions","probe","refreshDone","e","Error","message","String","handleRefresh","autoClearMessages","openSettingsDone","openSettingsFailed","desktopNotify","testShown","timer","setTimeout","clearTimeout","title","desktopOnlyTitle","desktopOnlyBody","patchBehavior","openAtLogin","keepAwakePreferred","notifyEnabled","notifySoundEnabled","next","setBehavior","handleNotifyDesktopToggle","checked","testTitle","testBody","notificationsFeedback","unsupported","default","openPrivacy","kind","r","ok","requestMicrophone","requestAccessibility","requestNotifications","requestScreen","permissionsHint","permissionsHintWin","permissionsHintLinux","permissionsHintDarwin","behaviorGroup","toggles","openAtLoginDesc","Boolean","target","keepAwake","keepAwakeDesc","notifyDesktop","notifyDesktopDesc","notifySound","notifySoundDesc","permissionsTitle","packaged","permissionsHintDevDarwin","press","refresh","map","st","permLabel","perm","unknownHint","desc","requestAccess","openSettings","McpHeaderEntry","key","value","MCP_HEADER_LINE","parseHeadersPaste","text","trimmed","trim","parsed","JSON","parse","Array","isArray","Object","entries","Record","map","String","rows","line","split","row","match","exec","push","length","headersToRecord","headers","out","keys","undefined","recordToHeaders","record","revalidateGatewayConfig","headersToRecord","recordToHeaders","McpHeaderEntry","fetchJson","apiUrl","McpToolInfo","name","shortName","description","McpTransportKind","McpServerRow","clientKey","id","transport","command","argsText","envJson","cwd","url","headers","connectionTimeoutMs","McpSettingsState","sessionIdleTtlMinutes","servers","parseArgsText","text","trimmed","trim","undefined","split","filter","Boolean","parseJsonObject","Record","parsed","JSON","parse","Array","isArray","Error","rowToServerConfig","row","config","args","length","env","Number","isFinite","serverConfigToRow","raw","hasUrl","transportRaw","toLowerCase","headersRaw","map","String","join","stringify","workingDirectory","emptyMcpServerRow","crypto","randomUUID","key","value","normalizeMcpSettingsFromConfig","cfg","mcp","root","serversRaw","Object","entries","flatMap","v","sort","a","b","localeCompare","ttlMs","sessionIdleTtlMs","Math","round","buildMcpServerConfigFromRow","patchMcpSettings","state","Promise","method","body","McpServerTestResult","serverId","toolCount","tools","normalizeMcpTools","out","item","push","testMcpServer","server","res","ok","payload","error","encodeURIComponent","connectionTimeoutSeconds","parseConnectionTimeoutSeconds","seconds","parseInt","mcpServerCardKey","_index","ClipboardPaste","Trash2","Button","parseHeadersPaste","McpHeaderEntry","readTextFromClipboard","settingsInputFocusClass","cn","interaction","Props","label","optionalLabel","addLabel","removeHeaderAria","pasteLabel","pasteFailed","keyPlaceholder","valuePlaceholder","headers","onChange","headerRowKey","row","index","all","key","trim","value","emptySlot","slice","filter","r","length","inputClassName","McpHeadersEditor","updateRow","patch","Partial","map","i","addRow","removeRow","next","_","pasteFromClipboard","text","window","alert","parsed","e","target","press","ChevronDown","Loader2","Plug","Trash2","Wrench","Zap","ReactNode","Button","McpHeadersEditor","connectionTimeoutSeconds","parseConnectionTimeoutSeconds","McpServerRow","McpToolInfo","McpTransportKind","McpSettingsMessages","settingsInputFocusClass","cn","interaction","TRANSPORTS","ServerToolsState","status","tools","message","Field","t0","$","_c","label","description","required","children","t1","t2","t3","t4","inputClassName","serverEndpointSummary","row","transport","command","trim","args","argsText","url","Props","expanded","onToggle","t","testing","toolState","onUpdate","patch","Partial","onRemove","onTest","onViewTools","McpServerCard","id","cardUntitled","title","summary","transportLabel","transportLabels","Symbol","for","press","cardCollapseAria","cardExpandAria","t5","t6","t7","t8","t9","t10","t11","length","t12","t13","t14","t15","t16","t17","t18","e","stopPropagation","t19","t20","testConnection","t21","e_0","t22","t23","removeServer","t24","t25","t26","addHeader","argsHint","argsLabel","commandLabel","cwdLabel","envHint","envLabel","headerKeyPlaceholder","headerValuePlaceholder","headersLabel","optionalSuffix","pasteHeaders","pasteHeadersFailed","removeHeader","serverIdLabel","serverIdPlaceholder","timeoutHint","timeoutLabel","timeoutPlaceholder","toolsEmpty","toolsLoading","toolsTitle","urlLabel","viewAllTools","e_1","target","value","map","kind","e_2","e_3","e_4","cwd","e_5","envJson","e_6","e_7","headers","e_8","connectionTimeoutMs","replace","String","t27","McpToolInfo","displayToolName","fullName","stripPrefix","startsWith","slice","length","toolMatchesQuery","tool","query","q","trim","toLowerCase","shortName","name","haystack","description","filter","Boolean","join","includes","Search","Wrench","X","useMemo","useState","Dialog","Button","McpToolInfo","toolMatchesQuery","cn","settingsInputFocusClass","SETTINGS_SHELL_CONTENT_Z","SETTINGS_SHELL_OVERLAY_Z","Props","open","onOpenChange","serverId","title","subtitle","searchPlaceholder","searchEmptyLabel","emptyLabel","closeLabel","tools","stripPrefix","displayToolName","fullName","startsWith","slice","length","McpToolsListSearch","t0","$","_c","query","setQuery","t1","t2","tool","filter","filteredTools","trim","hasQuery","t3","Symbol","for","t4","t5","e","target","value","t6","t7","t8","t9","map","tool_0","index","shortName","name","toolKey","description","t10","McpToolsListDialog","replace","String","t11","t12","t13","t14","Cable","Loader2","Plus","Plug","useCallback","useEffect","useMemo","useReducer","useRef","Button","useGatewayConfigSwr","SettingsFormSection","SettingsFormSectionHeader","emptyMcpServerRow","buildMcpServerConfigFromRow","mcpServerCardKey","normalizeMcpSettingsFromConfig","patchMcpSettings","testMcpServer","McpSettingsState","McpToolInfo","McpServerCard","McpToolsListDialog","uiPatchReducer","settingsInputFocusClass","cn","messages","useGatewayStore","useLocaleStore","inputClassName","ServerToolsState","status","tools","message","McpFormDraft","form","baseline","expandedKeys","Set","McpFormAction","type","value","updater","prev","key","keys","mcpFormReducer","state","action","next","has","delete","add","McpUi","saving","error","saveOk","testingId","serverTools","Record","toolsDialog","serverId","initialMcpUi","McpSettingsPanel","language","s","m","t","mcpSettings","token","st","hasToken","Boolean","formDraft","dispatchForm","ui","dispatchUi","dirtyRef","data","swrError","isLoading","mutate","parsed","payload","config","undefined","current","loading","fetchError","Error","String","dirty","JSON","stringify","toggleExpanded","updateServer","index","patch","Partial","f","servers","id","addServer","nextIndex","length","newRow","removeServer","removed","nextExpanded","filter","_","i","save","structuredClone","e","runTest","row","trim","serverConfig","result","title","description","subtitle","saved","globalTitle","globalHint","idleTtlLabel","sessionIdleTtlMinutes","idleTtlPlaceholder","raw","target","Number","parseInt","idleTtlHint","serversTitle","serversHint","serversEmpty","map","cardKey","toolState","const","discard","disableHint","open","toolsDialogTitle","toolsDialogSubtitle","toolsDialogSearchPlaceholder","toolsDialogSearchEmpty","toolsEmpty","toolsDialogClose","Navigate","useParams","AgentBrowserSettingsPage","AgentDefaultsTabbedPage","SetupStatusPanel","ModelsHubPanel","AppearanceSettingsPanel","DreamingSettingsPanel","CronSettingsPanel","GoalsSettingsPanel","GatewaySettingsPanel","HeartbeatSettingsPanel","RemoteAccessHub","SharesSettingsPanel","AppManagementSettingsPanel","SystemSettingsPanel","McpSettingsPanel","messages","SettingsSectionId","useLocaleStore","SECTIONS","SettingsPage","$","_c","section","language","_temp","t0","t1","t2","t3","t4","Symbol","for","bb0","m","t5","includes","tab","t6","id","title","settingsSections","settingsPage","comingSoon","replace","s"],"sources":["../../../../../web/src/features/settings/setup-checklist/scenario-presets.ts","../../../../../web/src/features/settings/setup-checklist/setup-scenario-presets.tsx","../../../../../web/src/features/settings/setup-checklist/setup-checklist-state.ts","../../../../../web/src/features/settings/setup-checklist/use-setup-checklist.ts","../../../../../web/src/features/settings/setup-checklist/setup-status-panel.tsx","../../../../../web/src/features/settings/save-bar/save-bar-store.ts","../../../../../web/src/features/settings/save-bar/use-save-bar-registration.ts","../../../../../web/src/features/settings/settings-collapsible-section.tsx","../../../../../web/src/features/settings/agents/image-generation-model-input.tsx","../../../../../web/src/features/settings/agents/agent-defaults-panels/image-model-chains-section.tsx","../../../../../web/src/features/settings/image-models-settings.tsx","../../../../../web/src/features/settings/models-json-api.ts","../../../../../web/src/features/settings/models/models-settings-lib.ts","../../../../../web/src/features/settings/models/models-model-edit-dialog.tsx","../../../../../web/src/features/settings/models/models-provider-add-dialog.tsx","../../../../../web/src/features/settings/models/models-providers-list.tsx","../../../../../web/src/features/settings/models/models-settings-panel.tsx","../../../../../web/src/features/settings/oauth-api.ts","../../../../../web/src/features/settings/provider-info-popover.tsx","../../../../../web/src/features/settings/providers/providers-settings-lib.ts","../../../../../web/src/features/settings/providers/provider-credential-row.tsx","../../../../../web/src/features/settings/providers/providers-settings-panel.tsx","../../../../../web/src/features/settings/save-bar/save-bar-controls.tsx","../../../../../web/src/features/settings/voice-settings.tsx","../../../../../web/src/features/settings/web-search-config-api.ts","../../../../../web/src/features/settings/web-search-settings.tsx","../../../../../web/src/features/settings/models-hub/models-hub-tabs.ts","../../../../../web/src/features/settings/models-hub/models-hub-panel.tsx","../../../../../web/src/features/settings/appearance-settings.tsx","../../../../../web/src/features/settings/dreaming-api.ts","../../../../../web/src/features/settings/dreaming-config-api.ts","../../../../../web/src/features/scheduling/interval/interval-schedule-picker.tsx","../../../../../web/src/features/scheduling/window/active-hours-picker.tsx","../../../../../web/src/features/scheduling/schedule-field.tsx","../../../../../web/src/features/settings/dreaming-settings-shared.tsx","../../../../../web/src/features/settings/dreaming-settings-config-section.tsx","../../../../../web/src/features/settings/dreaming-settings-events-section.tsx","../../../../../web/src/features/settings/dreaming-settings-header.tsx","../../../../../web/src/features/settings/dreaming-settings-maintenance-section.tsx","../../../../../web/src/features/settings/dreaming-settings-preview-section.tsx","../../../../../web/src/features/settings/dreaming-settings-runtime-section.tsx","../../../../../web/src/features/settings/dreaming-settings.tsx","../../../../../web/src/features/cron/cron-globals-api.ts","../../../../../web/src/features/cron/cron-globals-section.tsx","../../../../../web/src/features/settings/cron-settings.tsx","../../../../../web/src/features/settings/goals-config-api.ts","../../../../../web/src/features/settings/goals-config-section.tsx","../../../../../web/src/features/settings/goals-settings.tsx","../../../../../web/src/features/settings/gateway-settings.types.ts","../../../../../web/src/features/settings/gateway-config-api.ts","../../../../../web/src/features/settings/gateway-security-audit-api.ts","../../../../../web/src/features/settings/gateway-security-audit-card.tsx","../../../../../web/src/features/settings/gateway-settings.tsx","../../../../../web/src/features/settings/heartbeat-settings.tsx","../../../../../web/src/features/tunnel/use-enable-lan-pairing.ts","../../../../../web/src/features/tunnel/mobile-pair-qr-section.tsx","../../../../../web/src/features/tunnel/tunnel-consent-dialog.tsx","../../../../../web/src/features/tunnel/tunnel-start-progress.tsx","../../../../../web/src/features/tunnel/tunnel-control-card.tsx","../../../../../web/src/features/tunnel/tunnel-broker-secret-section.tsx","../../../../../web/src/features/remote-access/remote-access-docs-link.tsx","../../../../../web/src/features/tunnel/mobile-pair-qr.ts","../../../../../web/src/features/tunnel/use-mobile-pair-qr.ts","../../../../../web/src/features/tunnel/tunnel-settings.tsx","../../../../../web/src/features/remote-access/remote-access-api.ts","../../../../../web/src/features/remote-access/tailscale-serve-section.tsx","../../../../../web/src/features/remote-access/remote-access-lan-tab.tsx","../../../../../web/src/features/remote-access/ssh-cli-section.tsx","../../../../../web/src/features/remote-access/remote-access-ssh-tab.tsx","../../../../../web/src/features/remote-access/remote-access-status-strip.tsx","../../../../../web/src/features/remote-access/remote-access-guide-tab.tsx","../../../../../web/src/features/remote-access/remote-access-tabs.ts","../../../../../web/src/features/remote-access/remote-access-hub.tsx","../../../../../web/src/features/shares/share-policy-api.ts","../../../../../web/src/features/shares/share-policy-section.tsx","../../../../../web/src/features/shares/shares-settings.tsx","../../../../../web/src/features/settings/app-management-section.tsx","../../../../../web/src/features/settings/app-management-settings-panel.tsx","../../../../../web/src/features/settings/system-settings-panel.tsx","../../../../../web/src/features/settings/mcp/mcp-headers-utils.ts","../../../../../web/src/features/settings/mcp/mcp-config-api.ts","../../../../../web/src/features/settings/mcp/mcp-headers-editor.tsx","../../../../../web/src/features/settings/mcp/mcp-server-card.tsx","../../../../../web/src/features/settings/mcp/mcp-tools-utils.ts","../../../../../web/src/features/settings/mcp/mcp-tools-list-dialog.tsx","../../../../../web/src/features/settings/mcp/mcp-settings.tsx","../../../../../web/src/pages/settings-page.tsx"],"sourcesContent":["export type ScenarioPresetId = 'lightChat' | 'multiChannel' | 'automation';\n\nexport type ScenarioPresetStep = {\n path: string;\n labelKey: 'stepProviders' | 'stepDefaultModel' | 'stepChannel' | 'stepPresets' | 'stepCron' | 'stepSkills';\n};\n\nexport type ScenarioPreset = {\n id: ScenarioPresetId;\n steps: ScenarioPresetStep[];\n};\n\nexport const SCENARIO_PRESETS: readonly ScenarioPreset[] = [\n {\n id: 'lightChat',\n steps: [\n { path: '/settings/credentials', labelKey: 'stepProviders' },\n { path: '/settings/agent-defaults?tab=chat', labelKey: 'stepDefaultModel' },\n ],\n },\n {\n id: 'multiChannel',\n steps: [\n { path: '/settings/credentials', labelKey: 'stepProviders' },\n { path: '/settings/agent-defaults?tab=chat', labelKey: 'stepDefaultModel' },\n { path: '/channels', labelKey: 'stepChannel' },\n { path: '/agents', labelKey: 'stepPresets' },\n ],\n },\n {\n id: 'automation',\n steps: [\n { path: '/settings/credentials', labelKey: 'stepProviders' },\n { path: '/skills', labelKey: 'stepSkills' },\n { path: '/cron', labelKey: 'stepCron' },\n ],\n },\n];\n\nconst SCENARIO_PRESETS_DISMISSED_KEY = 'xopc-scenario-presets-dismissed';\n\nexport function readScenarioPresetsDismissed(): boolean {\n try {\n return localStorage.getItem(SCENARIO_PRESETS_DISMISSED_KEY) === 'true';\n } catch {\n return false;\n }\n}\n\nexport function dismissScenarioPresets(): void {\n try {\n localStorage.setItem(SCENARIO_PRESETS_DISMISSED_KEY, 'true');\n } catch {\n /* ignore */\n }\n}\n","import { Sparkles, X } from 'lucide-react';\nimport { useState } from 'react';\nimport { Link } from 'react-router-dom';\n\nimport {\n SettingsFormSection,\n SettingsFormSectionHeader,\n} from '@/features/settings/settings-form-section';\nimport { messages } from '@/i18n/messages';\nimport { cn } from '@/lib/cn';\nimport { interaction } from '@/lib/interaction';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nimport {\n dismissScenarioPresets,\n readScenarioPresetsDismissed,\n SCENARIO_PRESETS,\n type ScenarioPresetStep,\n} from './scenario-presets';\n\nfunction stepLabel(\n step: ScenarioPresetStep,\n steps: Record<string, string>,\n): string {\n return steps[step.labelKey] ?? step.labelKey;\n}\n\nexport function SetupScenarioPresets() {\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const s = m.setupStatus.scenarios;\n const [dismissed, setDismissed] = useState(readScenarioPresetsDismissed);\n\n if (dismissed) return null;\n\n return (\n <SettingsFormSection>\n <div className=\"flex items-start justify-between gap-3\">\n <SettingsFormSectionHeader icon={Sparkles} title={s.title} subtitle={s.subtitle} />\n <button\n type=\"button\"\n className={cn(\n 'inline-flex shrink-0 items-center gap-1 rounded-lg px-2 py-1.5 text-xs font-medium text-fg-muted',\n 'hover:bg-surface-hover hover:text-fg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent',\n interaction.press,\n )}\n onClick={() => {\n dismissScenarioPresets();\n setDismissed(true);\n }}\n >\n <X className=\"size-3.5\" aria-hidden />\n {s.dismiss}\n </button>\n </div>\n <div className=\"mt-4 grid gap-3 sm:grid-cols-3\">\n {SCENARIO_PRESETS.map((preset) => {\n const copy = s.presets[preset.id];\n return (\n <article\n key={preset.id}\n className=\"flex flex-col rounded-xl border border-edge-subtle bg-surface-panel p-4\"\n >\n <h3 className=\"text-sm font-semibold text-fg\">{copy.title}</h3>\n <p className=\"mt-1 text-xs leading-relaxed text-fg-muted\">{copy.description}</p>\n <ol className=\"mt-3 flex flex-col gap-1\">\n {preset.steps.map((step, index) => (\n <li key={`${preset.id}-${step.labelKey}`}>\n <Link\n to={step.path}\n className={cn(\n 'text-xs font-medium text-accent-fg hover:underline',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent rounded',\n )}\n >\n {index + 1}. {stepLabel(step, s.steps)}\n </Link>\n </li>\n ))}\n </ol>\n </article>\n );\n })}\n </div>\n </SettingsFormSection>\n );\n}\n","import { normalizeChannelsFromConfig } from '@/features/settings/channels-config-api';\nimport {\n isFeishuConfigured,\n isTelegramConfigured,\n isWeixinConfigured,\n} from '@/features/settings/channels/utils';\n\nexport type SetupChecklistItemId =\n | 'gateway'\n | 'provider'\n | 'defaultModel'\n | 'channel'\n | 'skill'\n | 'presets';\n\nexport type SetupChecklistItemState = {\n id: SetupChecklistItemId;\n done: boolean;\n optional?: boolean;\n /** Short status line for the overview card (e.g. model ref, provider count). */\n detail?: string;\n};\n\nexport type SetupStatusSnapshot = {\n gatewayConnected: boolean;\n providerConfigured: boolean;\n providerCount: number;\n providerMetaConfigured: number;\n providerMetaTotal: number;\n defaultModel: string;\n defaultModelConfigured: boolean;\n channelConfigured: boolean;\n skillInstalled: boolean;\n skillCount: number;\n presetsDone: boolean;\n agentCount: number;\n checklist: SetupChecklistItemState[];\n requiredComplete: boolean;\n allComplete: boolean;\n};\n\nfunction countConfiguredProviders(config: unknown): number {\n if (!config || typeof config !== 'object') return 0;\n const providers = (config as Record<string, unknown>).providers;\n if (!providers || typeof providers !== 'object' || Array.isArray(providers)) return 0;\n return Object.values(providers as Record<string, unknown>).filter((v) => v === '***').length;\n}\n\nfunction readDefaultModel(config: unknown): string {\n if (!config || typeof config !== 'object') return '';\n const agents = (config as Record<string, unknown>).agents;\n if (!agents || typeof agents !== 'object' || Array.isArray(agents)) return '';\n const defaults = (agents as Record<string, unknown>).defaults;\n if (!defaults || typeof defaults !== 'object' || Array.isArray(defaults)) return '';\n const model = (defaults as Record<string, unknown>).model;\n return typeof model === 'string' ? model.trim() : '';\n}\n\nfunction isAnyChannelConfigured(config: unknown): boolean {\n const channels = normalizeChannelsFromConfig(config);\n return (\n (channels.telegram.enabled && isTelegramConfigured(channels.telegram)) ||\n (channels.weixin.enabled && isWeixinConfigured(channels.weixin)) ||\n (channels.feishu.enabled && isFeishuConfigured(channels.feishu)) ||\n isTelegramConfigured(channels.telegram) ||\n isWeixinConfigured(channels.weixin) ||\n isFeishuConfigured(channels.feishu)\n );\n}\n\nexport function buildSetupStatusSnapshot(input: {\n hasToken: boolean;\n sseConnected: boolean;\n config: unknown;\n skillCount: number;\n providerMeta?: { configured: number; total: number } | null;\n presetsDone: boolean;\n agentCount: number;\n labels: {\n gatewayOnline: string;\n gatewayOffline: string;\n providersConfigured: (count: number) => string;\n providersMetaReady: (configured: number, total: number) => string;\n providersMissing: string;\n modelConfigured: (model: string) => string;\n modelMissing: string;\n channelConfigured: string;\n channelMissing: string;\n skillsConfigured: (count: number) => string;\n skillsMissing: string;\n presetsConfigured: string;\n presetsMissing: string;\n };\n}): SetupStatusSnapshot {\n const providerCount = countConfiguredProviders(input.config);\n const providerMetaConfigured = input.providerMeta?.configured ?? providerCount;\n const providerMetaTotal = input.providerMeta?.total ?? 0;\n const providerConfigured =\n providerMetaConfigured > 0 || providerCount > 0;\n const defaultModel = readDefaultModel(input.config);\n const defaultModelConfigured = defaultModel.length > 0;\n const gatewayConnected = input.hasToken && input.sseConnected;\n const channelConfigured = isAnyChannelConfigured(input.config);\n const skillInstalled = input.skillCount > 0;\n\n const checklist: SetupChecklistItemState[] = [\n {\n id: 'gateway',\n done: gatewayConnected,\n detail: gatewayConnected ? input.labels.gatewayOnline : input.labels.gatewayOffline,\n },\n {\n id: 'provider',\n done: providerConfigured,\n detail: providerConfigured\n ? input.providerMeta && input.providerMeta.total > 0\n ? input.labels.providersMetaReady(providerMetaConfigured, providerMetaTotal)\n : input.labels.providersConfigured(providerCount)\n : input.labels.providersMissing,\n },\n {\n id: 'defaultModel',\n done: defaultModelConfigured,\n detail: defaultModelConfigured\n ? input.labels.modelConfigured(defaultModel)\n : input.labels.modelMissing,\n },\n {\n id: 'channel',\n done: channelConfigured,\n optional: true,\n detail: channelConfigured ? input.labels.channelConfigured : input.labels.channelMissing,\n },\n {\n id: 'skill',\n done: skillInstalled,\n optional: true,\n detail: skillInstalled\n ? input.labels.skillsConfigured(input.skillCount)\n : input.labels.skillsMissing,\n },\n {\n id: 'presets',\n done: input.presetsDone,\n optional: true,\n detail: input.presetsDone ? input.labels.presetsConfigured : input.labels.presetsMissing,\n },\n ];\n\n const requiredComplete = checklist.filter((item) => !item.optional).every((item) => item.done);\n const allComplete = checklist.every((item) => item.done);\n\n return {\n gatewayConnected,\n providerConfigured,\n providerCount,\n providerMetaConfigured,\n providerMetaTotal,\n defaultModel,\n defaultModelConfigured,\n channelConfigured,\n skillInstalled,\n skillCount: input.skillCount,\n presetsDone: input.presetsDone,\n agentCount: input.agentCount,\n checklist,\n requiredComplete,\n allComplete,\n };\n}\n","import { useMemo } from 'react';\nimport useSWR from 'swr';\n\nimport { CONFIGURED_MODELS_SWR_KEY, fetchConfiguredModelsCached } from '@/features/chat/api/registry-api';\nimport { fetchGatewayAgents } from '@/features/settings/agents-admin-api';\nimport { PRESET_AGENTS_SKIPPED_KEY } from '@/features/settings/agents/preset-agents';\nimport { useGatewayConfigSwr } from '@/features/gateway/gateway-config-swr';\nimport { fetchProviderMetaList } from '@/features/settings/providers-api';\nimport { getSkills } from '@/features/skills/skill-api';\nimport { messages } from '@/i18n/messages';\nimport { useGatewaySseStore } from '@/stores/gateway-sse-store';\nimport { useGatewayStore } from '@/stores/gateway-store';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nimport { buildSetupStatusSnapshot, type SetupStatusSnapshot } from './setup-checklist-state';\n\nfunction readPresetsSkipped(): boolean {\n try {\n return localStorage.getItem(PRESET_AGENTS_SKIPPED_KEY) === 'true';\n } catch {\n return false;\n }\n}\n\nfunction computePresetsDone(\n agents: { id: string }[] | undefined,\n defaultId: string | undefined,\n): boolean {\n if (readPresetsSkipped()) return true;\n if (!agents || agents.length === 0) return false;\n const onlyMain = agents.length <= 1 && agents.every((ag) => ag.id === defaultId);\n return !onlyMain;\n}\n\nexport function useSetupChecklist(): {\n ready: boolean;\n error: boolean;\n snapshot: SetupStatusSnapshot | null;\n refresh: () => Promise<void>;\n} {\n const token = useGatewayStore((s) => s.token);\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const l = m.setupStatus.labels;\n const sseConnected = useGatewaySseStore((s) => s.connectionState === 'connected');\n\n const {\n data: configData,\n error: configError,\n isLoading: configLoading,\n mutate: mutateConfig,\n } = useGatewayConfigSwr(Boolean(token));\n\n const {\n data: skillsData,\n error: skillsError,\n isLoading: skillsLoading,\n mutate: mutateSkills,\n } = useSWR(Boolean(token) ? ['setup-checklist-skills', language] : null, () => getSkills(language), {\n revalidateOnFocus: false,\n });\n\n const {\n data: providerMeta,\n error: providerMetaError,\n isLoading: providerMetaLoading,\n mutate: mutateProviderMeta,\n } = useSWR(Boolean(token) ? 'setup-checklist-provider-meta' : null, fetchProviderMetaList, {\n revalidateOnFocus: false,\n });\n\n const {\n data: agentsData,\n error: agentsError,\n isLoading: agentsLoading,\n mutate: mutateAgents,\n } = useSWR(Boolean(token) ? 'setup-checklist-agents' : null, fetchGatewayAgents, {\n revalidateOnFocus: false,\n });\n\n // Warm models cache for other panels; not required for checklist itself.\n useSWR(Boolean(token) ? CONFIGURED_MODELS_SWR_KEY : null, fetchConfiguredModelsCached, {\n revalidateOnFocus: false,\n });\n\n const ready = !token || (!configLoading && !skillsLoading && !providerMetaLoading && !agentsLoading);\n const error = Boolean(configError || skillsError || providerMetaError || agentsError);\n\n const snapshot = useMemo(() => {\n if (!token || !ready) return null;\n const skillCount = skillsData?.catalog?.length ?? 0;\n const metaConfigured = providerMeta?.filter((p) => p.configured).length ?? 0;\n const metaTotal = providerMeta?.length ?? 0;\n const agentCount = agentsData?.agents.length ?? 0;\n const presetsDone = computePresetsDone(agentsData?.agents, agentsData?.defaultId);\n\n return buildSetupStatusSnapshot({\n hasToken: Boolean(token),\n sseConnected,\n config: configData?.payload?.config,\n skillCount,\n providerMeta: metaTotal > 0 ? { configured: metaConfigured, total: metaTotal } : null,\n presetsDone,\n agentCount,\n labels: {\n gatewayOnline: l.gatewayOnline,\n gatewayOffline: l.gatewayOffline,\n providersConfigured: (count) => l.providersConfigured.replace('{{count}}', String(count)),\n providersMetaReady: (configured, total) =>\n l.providersMetaReady\n .replace('{{configured}}', String(configured))\n .replace('{{total}}', String(total)),\n providersMissing: l.providersMissing,\n modelConfigured: (model) => l.modelConfigured.replace('{{model}}', model),\n modelMissing: l.modelMissing,\n channelConfigured: l.channelConfigured,\n channelMissing: l.channelMissing,\n skillsConfigured: (count) => l.skillsConfigured.replace('{{count}}', String(count)),\n skillsMissing: l.skillsMissing,\n presetsConfigured: l.presetsConfigured.replace('{{count}}', String(agentCount)),\n presetsMissing: l.presetsMissing,\n },\n });\n }, [token, ready, sseConnected, configData, skillsData, providerMeta, agentsData, l]);\n\n const refresh = async () => {\n await Promise.all([mutateConfig(), mutateSkills(), mutateProviderMeta(), mutateAgents()]);\n };\n\n return { ready, error, snapshot, refresh };\n}\n","import { Check, ChevronRight, Circle, Loader2, RefreshCw } from 'lucide-react';\nimport { Link } from 'react-router-dom';\n\nimport {\n SettingsFormSection,\n SettingsFormSectionHeader,\n} from '@/features/settings/settings-form-section';\nimport { messages } from '@/i18n/messages';\nimport { cn } from '@/lib/cn';\nimport { interaction } from '@/lib/interaction';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nimport type { SetupChecklistItemId } from './setup-checklist-state';\nimport { SetupScenarioPresets } from './setup-scenario-presets';\nimport { useSetupChecklist } from './use-setup-checklist';\n\nconst CHECKLIST_PATHS: Record<SetupChecklistItemId, string> = {\n gateway: '/settings/gateway',\n provider: '/settings/credentials',\n defaultModel: '/settings/agent-defaults?tab=chat',\n channel: '/channels',\n skill: '/skills',\n presets: '/agents',\n};\n\nfunction StatusPill({ ok, label }: { ok: boolean; label: string }) {\n return (\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium',\n ok ? 'bg-success-soft text-success' : 'bg-surface-hover text-fg-muted',\n )}\n >\n {label}\n </span>\n );\n}\n\nexport function SetupStatusPanel() {\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const s = m.setupStatus;\n const { ready, error, snapshot, refresh } = useSetupChecklist();\n\n return (\n <div className=\"mx-auto flex w-full max-w-app-main flex-col gap-6 px-4 py-6\">\n <header className=\"flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"flex min-w-0 flex-col gap-1\">\n <h1 className=\"text-lg font-semibold tracking-tight text-fg\">{s.title}</h1>\n <p className=\"text-sm text-fg-muted\">{s.subtitle}</p>\n </div>\n <button\n type=\"button\"\n className={cn(\n 'inline-flex shrink-0 items-center gap-2 rounded-lg border border-edge px-3 py-2 text-sm font-medium text-fg',\n 'hover:bg-surface-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent',\n interaction.press,\n )}\n onClick={() => void refresh()}\n disabled={!ready}\n >\n <RefreshCw className={cn('size-4', !ready && 'animate-spin')} aria-hidden />\n {s.refresh}\n </button>\n </header>\n\n {error ? (\n <p className=\"rounded-xl border border-red-300/40 bg-red-50 px-4 py-3 text-sm text-red-700 dark:border-red-900/40 dark:bg-red-950/30 dark:text-red-300\">\n {s.loadError}\n </p>\n ) : null}\n\n {!ready || !snapshot ? (\n <div className=\"flex items-center gap-2 text-sm text-fg-muted\" aria-busy>\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n {s.loading}\n </div>\n ) : (\n <>\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Check} title={s.summaryTitle} subtitle={s.summarySubtitle} />\n <div className=\"mt-4 grid gap-3 sm:grid-cols-3\">\n <div className=\"rounded-xl border border-edge-subtle bg-surface-panel px-4 py-3\">\n <p className=\"text-xs font-medium uppercase tracking-wide text-fg-subtle\">{s.summaryGateway}</p>\n <div className=\"mt-2\">\n <StatusPill\n ok={snapshot.gatewayConnected}\n label={snapshot.gatewayConnected ? s.statusOnline : s.statusOffline}\n />\n </div>\n </div>\n <div className=\"rounded-xl border border-edge-subtle bg-surface-panel px-4 py-3\">\n <p className=\"text-xs font-medium uppercase tracking-wide text-fg-subtle\">{s.summaryProviders}</p>\n <p className=\"mt-2 truncate text-sm font-medium text-fg\">\n {snapshot.providerConfigured\n ? snapshot.providerMetaTotal > 0\n ? s.labels.providersMetaReady\n .replace('{{configured}}', String(snapshot.providerMetaConfigured))\n .replace('{{total}}', String(snapshot.providerMetaTotal))\n : s.labels.providersConfigured.replace('{{count}}', String(snapshot.providerCount))\n : s.labels.providersMissing}\n </p>\n </div>\n <div className=\"rounded-xl border border-edge-subtle bg-surface-panel px-4 py-3\">\n <p className=\"text-xs font-medium uppercase tracking-wide text-fg-subtle\">{s.summaryModel}</p>\n <p className=\"mt-2 truncate text-sm font-medium text-fg\">\n {snapshot.defaultModelConfigured\n ? snapshot.defaultModel\n : s.labels.modelMissing}\n </p>\n </div>\n </div>\n {snapshot.requiredComplete ? (\n <p className=\"mt-4 text-sm text-success\">{s.requiredCompleteMessage}</p>\n ) : (\n <p className=\"mt-4 text-sm text-fg-muted\">{s.requiredIncompleteMessage}</p>\n )}\n </SettingsFormSection>\n\n <SetupScenarioPresets />\n\n <SettingsFormSection>\n <SettingsFormSectionHeader\n icon={Circle}\n title={s.checklistTitle}\n subtitle={s.checklistSubtitle}\n />\n <ul className=\"mt-4 flex flex-col gap-1\">\n {snapshot.checklist.map((item) => {\n const itemCopy = s.items[item.id];\n return (\n <li key={item.id}>\n <Link\n to={CHECKLIST_PATHS[item.id]}\n className={cn(\n 'flex items-center gap-3 rounded-xl px-3 py-3 transition-colors',\n 'hover:bg-surface-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent',\n )}\n >\n <span\n className={cn(\n 'flex size-6 shrink-0 items-center justify-center rounded-full border',\n item.done\n ? 'border-success/40 bg-success-soft text-success'\n : 'border-edge bg-surface-panel text-fg-subtle',\n )}\n aria-hidden\n >\n {item.done ? <Check className=\"size-3.5\" strokeWidth={2.5} /> : null}\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-sm font-medium text-fg\">{itemCopy.title}</span>\n {item.optional ? (\n <span className=\"rounded-md bg-surface-hover px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide text-fg-subtle\">\n {s.optionalBadge}\n </span>\n ) : null}\n </span>\n <span className=\"mt-0.5 block text-xs text-fg-muted\">{itemCopy.description}</span>\n {item.detail ? (\n <span className=\"mt-1 block truncate text-xs text-fg-subtle\">{item.detail}</span>\n ) : null}\n </span>\n <ChevronRight className=\"size-4 shrink-0 text-fg-subtle\" aria-hidden />\n </Link>\n </li>\n );\n })}\n </ul>\n </SettingsFormSection>\n </>\n )}\n </div>\n );\n}\n","/**\n * Cross-panel \"save bar\" coordination for the Models & credentials hub.\n *\n * Each embedded settings panel (providers / models / image / voice / search)\n * registers itself here so the hub can render a single \"Save all\" / \"Discard\n * all\" bar on top of its accordion. Sections still own their own save logic\n * — this store is purely a coordination layer; it doesn't replicate or\n * replace any panel's local state machine.\n *\n * Save semantics: per-section saves run in registration order. A failure\n * in one section is reported but does not abort subsequent sections — those\n * sections are independent in production (separate config branches, often\n * separate stores), so partial-success surfaced to the user is the safest\n * default.\n *\n * Performance: the store pre-computes `anyDirty`, `dirtyCount`, and\n * `anySaving` as top-level fields so consumers can subscribe to scalar\n * values via zustand selectors without iterating the sections Map on every\n * render. Recomputation only runs inside `registerSection` /\n * `unregisterSection` — the same paths that already caused a `set()`.\n */\n\nimport { create } from 'zustand';\n\nexport interface SaveBarSection {\n /** Stable id (e.g. `providers`, `voice`). */\n id: string;\n dirty: boolean;\n saving: boolean;\n /** Resolves once the panel's local save completes; returns an outcome. */\n save: () => Promise<{ ok: boolean; error?: string }>;\n discard: () => void;\n}\n\nexport interface SaveAllFailure {\n id: string;\n error: string;\n}\n\nexport interface SaveAllOutcome {\n ok: boolean;\n saved: number;\n failures: SaveAllFailure[];\n}\n\ninterface State {\n /** Insertion-ordered map keeps save order deterministic and matches the hub's section layout. */\n sections: Map<string, SaveBarSection>;\n /** True while a `saveAll` invocation is in flight (separate from per-section `saving`). */\n saveAllInFlight: boolean;\n\n // Pre-computed aggregates — consumers subscribe to these scalars directly.\n anyDirty: boolean;\n dirtyCount: number;\n anySaving: boolean;\n\n registerSection: (section: SaveBarSection) => void;\n unregisterSection: (id: string) => void;\n saveAll: () => Promise<SaveAllOutcome>;\n discardAll: () => void;\n}\n\nfunction computeAggregates(sections: Map<string, SaveBarSection>, saveAllInFlight: boolean) {\n let anyDirty = false;\n let dirtyCount = 0;\n let anySaving = saveAllInFlight;\n for (const s of sections.values()) {\n if (s.dirty) {\n anyDirty = true;\n dirtyCount += 1;\n }\n if (s.saving) anySaving = true;\n }\n return { anyDirty, dirtyCount, anySaving };\n}\n\nexport const useSaveBarStore = create<State>((set, get) => ({\n sections: new Map(),\n saveAllInFlight: false,\n anyDirty: false,\n dirtyCount: 0,\n anySaving: false,\n\n registerSection: (section) => {\n set((state) => {\n const next = new Map(state.sections);\n next.set(section.id, section);\n return { sections: next, ...computeAggregates(next, state.saveAllInFlight) };\n });\n },\n\n unregisterSection: (id) => {\n set((state) => {\n if (!state.sections.has(id)) return state;\n const next = new Map(state.sections);\n next.delete(id);\n return { sections: next, ...computeAggregates(next, state.saveAllInFlight) };\n });\n },\n\n saveAll: async () => {\n const sections = Array.from(get().sections.values()).filter((s) => s.dirty);\n if (sections.length === 0) {\n return { ok: true, saved: 0, failures: [] };\n }\n set((state) => ({ saveAllInFlight: true, ...computeAggregates(state.sections, true) }));\n const failures: SaveAllFailure[] = [];\n let saved = 0;\n try {\n const outcomes = await Promise.all(\n sections.map(async (section) => {\n try {\n const result = await section.save();\n return { id: section.id, result };\n } catch (err) {\n return {\n id: section.id,\n result: {\n ok: false as const,\n error: err instanceof Error ? err.message : String(err),\n },\n };\n }\n }),\n );\n for (const { id, result } of outcomes) {\n if (result.ok) saved += 1;\n else failures.push({ id, error: result.error ?? 'Save failed' });\n }\n } finally {\n set((state) => ({ saveAllInFlight: false, ...computeAggregates(state.sections, false) }));\n }\n return { ok: failures.length === 0, saved, failures };\n },\n\n discardAll: () => {\n for (const section of get().sections.values()) {\n if (section.dirty) section.discard();\n }\n },\n}));\n","import { useEffect, useRef } from 'react';\n\nimport { useSaveBarStore } from './save-bar-store';\n\ninterface RegistrationArgs {\n /** Unique stable id (e.g. `providers`, `voice`). */\n id: string;\n dirty: boolean;\n saving: boolean;\n /** Per-section save. May throw or return void; the hook wraps it. */\n save: () => Promise<unknown>;\n discard: () => void;\n}\n\n/**\n * Registers a settings panel with the hub-level save bar. Each panel calls\n * this once with its current dirty/saving state and stable save/discard\n * callbacks. The hook keeps the panel's entry in the store fresh and\n * deregisters on unmount.\n *\n * `save` and `discard` are read through latest-refs, so they don't need to\n * be `useCallback`-stabilised at the call site — the registered handle\n * always invokes the most recent closure.\n */\nexport function useSaveBarRegistration({\n id,\n dirty,\n saving,\n save,\n discard,\n}: RegistrationArgs): void {\n const saveRef = useRef(save);\n const discardRef = useRef(discard);\n saveRef.current = save;\n discardRef.current = discard;\n\n const registerSection = useSaveBarStore((s) => s.registerSection);\n const unregisterSection = useSaveBarStore((s) => s.unregisterSection);\n\n useEffect(() => {\n registerSection({\n id,\n dirty,\n saving,\n save: async () => {\n try {\n await saveRef.current();\n return { ok: true };\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : String(err) };\n }\n },\n discard: () => discardRef.current(),\n });\n return () => unregisterSection(id);\n // `dirty` / `saving` change on every form keystroke; we re-register so\n // the hub sees fresh values. `save`/`discard` are pinned via refs and\n // intentionally excluded.\n }, [id, dirty, saving, registerSection, unregisterSection]);\n}\n","import { ChevronDown, type LucideIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\n\nimport { cn } from '@/lib/cn';\n\ntype Props = {\n showLabel: string;\n hideLabel: string;\n /** Optional decorative icon rendered between the chevron and the label. */\n icon?: LucideIcon;\n /** Optional muted hint shown under the summary while the section is open. */\n hint?: string;\n children: ReactNode;\n className?: string;\n defaultOpen?: boolean;\n};\n\nexport function SettingsCollapsibleSection({\n showLabel,\n hideLabel,\n icon: Icon,\n hint,\n children,\n className,\n defaultOpen,\n}: Props) {\n return (\n <details\n open={defaultOpen}\n className={cn(\n 'group rounded-2xl bg-surface-base open:pb-1',\n className,\n )}\n >\n <summary className=\"flex cursor-pointer list-none items-center gap-2 rounded-2xl px-4 py-3.5 text-sm font-medium text-fg transition-colors hover:text-fg group-open:rounded-b-none [&::-webkit-details-marker]:hidden\">\n <ChevronDown\n className=\"size-4 shrink-0 text-fg-muted transition-transform group-open:rotate-180\"\n aria-hidden\n />\n {Icon ? <Icon className=\"size-4 shrink-0 text-accent\" strokeWidth={1.75} aria-hidden /> : null}\n <span className=\"group-open:hidden\">{showLabel}</span>\n <span className=\"hidden group-open:inline\">{hideLabel}</span>\n </summary>\n <div className=\"flex flex-col gap-4 px-4 pb-4 pt-1\">\n {hint ? <p className=\"text-xs text-fg-subtle\">{hint}</p> : null}\n {children}\n </div>\n </details>\n );\n}\n","import * as Popover from '@radix-ui/react-popover';\nimport { Check, ChevronsUpDown } from 'lucide-react';\nimport { useCallback, useMemo, useState } from 'react';\nimport useSWR from 'swr';\n\nimport {\n comboboxTriggerLayoutClass,\n formControlBorderFocusClass,\n selectComboboxTriggerFocusClass,\n} from '@/lib/form-field-width';\nimport { cn } from '@/lib/cn';\nimport { apiFetch } from '@/lib/fetch';\nimport { SETTINGS_SHELL_POPOVER_Z } from '@/lib/settings-shell-dialog-layer';\nimport { interaction } from '@/lib/interaction';\nimport { apiUrl } from '@/lib/url';\n\nexport type ImageProviderSummary = {\n id: string;\n defaultModel?: string;\n models: string[];\n /** From gateway: provider has resolvable API credentials. */\n configured?: boolean;\n};\n\nasync function fetchImageGenerationProviders(): Promise<ImageProviderSummary[]> {\n const res = await apiFetch(apiUrl('/api/image/providers'));\n if (!res.ok) throw new Error(`Image providers: HTTP ${res.status}`);\n const data = (await res.json()) as { payload?: { providers?: ImageProviderSummary[] } };\n return data.payload?.providers ?? [];\n}\n\nfunction modelIdsForProviders(providerList: ImageProviderSummary[]): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const p of providerList) {\n const models = p.models.length > 0 ? p.models : p.defaultModel ? [p.defaultModel] : [];\n for (const m of models) {\n const id = `${p.id}/${m}`;\n if (!seen.has(id)) {\n seen.add(id);\n out.push(id);\n }\n }\n }\n return out;\n}\n\n/** Only image-generation providers the gateway marks as configured (credentials available). */\nfunction buildConfiguredModelIds(providers: ImageProviderSummary[], currentValueTrimmed: string): string[] {\n const configuredOnly = providers.filter((p) => p.configured === true);\n const fromRegistry = modelIdsForProviders(configuredOnly);\n if (!currentValueTrimmed || fromRegistry.includes(currentValueTrimmed)) {\n return fromRegistry;\n }\n return [currentValueTrimmed, ...fromRegistry];\n}\n\nfunction idsMatchingQuery(ids: string[], query: string): string[] {\n const raw = query.trim().toLowerCase();\n if (!raw) return ids;\n const tokens = raw.split(/[/\\s]+/).filter(Boolean);\n return ids.filter((h) => {\n const lower = h.toLowerCase();\n return tokens.every((t) => lower.includes(t));\n });\n}\n\nconst SWR_KEY = 'image-generation-providers';\n\n/**\n * Dropdown only: choose a registered `provider/model` from the gateway. Search runs inside\n * the popover; the trigger is not a text field (no free-text model strings).\n */\nexport function ImageGenerationModelInput({\n value,\n disabled,\n placeholder,\n searchPlaceholder,\n noMatches,\n registryEmptyHint,\n outOfFilterNote,\n className,\n onChange,\n}: {\n value: string;\n disabled?: boolean;\n placeholder: string;\n searchPlaceholder: string;\n noMatches: string;\n /** When every provider is unconfigured and there is no current value. */\n registryEmptyHint?: string;\n /** Current value uses a provider that is not configured (still listed so you can change it). */\n outOfFilterNote?: string;\n className?: string;\n onChange: (modelId: string) => void;\n}) {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n\n const { data: providers, isLoading, error } = useSWR(SWR_KEY, fetchImageGenerationProviders, {\n revalidateOnFocus: false,\n });\n\n const valueTrimmed = value.trim();\n const configuredOnlyIds = useMemo(\n () => modelIdsForProviders((providers ?? []).filter((p) => p.configured === true)),\n [providers],\n );\n const allIds = useMemo(\n () => buildConfiguredModelIds(providers ?? [], valueTrimmed),\n [providers, valueTrimmed],\n );\n const filtered = useMemo(() => idsMatchingQuery(allIds, query), [allIds, query]);\n const showOutOfFilterNote =\n Boolean(outOfFilterNote) &&\n Boolean(valueTrimmed) &&\n !configuredOnlyIds.includes(valueTrimmed);\n\n const label = value.trim() ? value : placeholder;\n const titleText = value.trim() || placeholder;\n\n const handleOpenChange = useCallback(\n (next: boolean) => {\n setOpen(next);\n if (!next) {\n setQuery('');\n }\n },\n [],\n );\n\n return (\n <div className=\"flex min-w-0 flex-col gap-1\">\n <Popover.Root open={open} onOpenChange={handleOpenChange} modal={false}>\n <Popover.Trigger asChild>\n <button\n type=\"button\"\n disabled={disabled || isLoading}\n title={isLoading ? '…' : titleText}\n className={cn(\n comboboxTriggerLayoutClass,\n 'items-center gap-2 rounded-lg border border-edge-subtle bg-surface-panel px-3 py-2 text-left text-sm font-normal text-fg',\n interaction.transition,\n interaction.press,\n 'hover:border-edge hover:bg-surface-hover/45',\n selectComboboxTriggerFocusClass,\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'dark:border-edge-subtle dark:hover:bg-surface-hover/55',\n className,\n )}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n >\n <span className=\"min-w-0 truncate\">{isLoading ? '…' : label}</span>\n <ChevronsUpDown className=\"size-4 shrink-0 text-fg-subtle opacity-70\" aria-hidden />\n </button>\n </Popover.Trigger>\n <Popover.Portal>\n <Popover.Content\n className={cn(\n 'w-[min(22rem,calc(100vw-2rem))] rounded-xl border border-edge-subtle bg-surface-panel p-1 shadow-elevated dark:border-edge-subtle',\n SETTINGS_SHELL_POPOVER_Z,\n )}\n side=\"bottom\"\n sideOffset={4}\n align=\"end\"\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n <input\n type=\"search\"\n className={cn(\n 'mb-1 w-full rounded-lg border border-edge-subtle bg-surface-base px-2.5 py-1.5 text-sm text-fg placeholder:text-fg-disabled dark:bg-surface-hover/40',\n formControlBorderFocusClass,\n )}\n placeholder={searchPlaceholder}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={(e) => e.stopPropagation()}\n />\n <div className=\"max-h-60 overflow-auto\" role=\"listbox\" aria-label={searchPlaceholder}>\n {error ? (\n <div className=\"p-2 text-xs text-red-600 dark:text-red-400\">\n {error instanceof Error ? error.message : 'Failed to load image providers'}\n </div>\n ) : null}\n {!error && allIds.length === 0 && !isLoading ? (\n <div className=\"px-2 py-3 text-center text-xs text-fg-muted\">\n {registryEmptyHint ?? noMatches}\n </div>\n ) : null}\n {!error && allIds.length > 0 && filtered.length === 0 ? (\n <div className=\"px-2 py-3 text-center text-xs text-fg-muted\">{noMatches}</div>\n ) : null}\n {filtered.map((id) => (\n <button\n key={id}\n type=\"button\"\n role=\"option\"\n aria-selected={id === value}\n className={cn(\n 'flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-sm text-fg hover:bg-surface-hover',\n interaction.press,\n id === value && 'bg-surface-hover/90 font-medium dark:bg-surface-hover/70',\n )}\n onClick={() => {\n onChange(id);\n setOpen(false);\n setQuery('');\n }}\n >\n <Check className={cn('size-4 shrink-0', id !== value && 'invisible')} aria-hidden />\n <span className=\"min-w-0 flex-1 truncate text-sm font-medium\">{id}</span>\n </button>\n ))}\n </div>\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n {showOutOfFilterNote ? (\n <p className=\"text-xs text-amber-700 dark:text-amber-400/90\">{outOfFilterNote}</p>\n ) : null}\n </div>\n );\n}\n","import { Image as ImageIcon, Plus, Trash2 } from 'lucide-react';\n\nimport { Button } from '@/components/ui/button';\nimport { ModelSelector } from '@/features/chat/model/model-selector';\nimport { SettingsFormSection, SettingsFormSectionHeader } from '@/features/settings/settings-form-section';\n\nimport { AgentDefaultsField } from '../agent-defaults-field';\nimport type { AgentDefaultsPanelProps } from '../agent-defaults-panel-props';\nimport { ImageGenerationModelInput } from '../image-generation-model-input';\n\nfunction modelFallbackRowKey(modelId: string, index: number, all: string[]): string {\n const trimmed = modelId.trim();\n if (trimmed) return `model:${trimmed}`;\n const emptySlot = all.slice(0, index).filter((id) => !id.trim()).length;\n return `empty:${emptySlot}`;\n}\n\n/** Top-level primary model selectors — vision + image generation. */\nexport function ImageModelPrimarySelectors(props: AgentDefaultsPanelProps) {\n const { a, chat, form, update } = props;\n\n return (\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={ImageIcon} title={a.cardModelsTitle} subtitle={a.cardModelsSubtitle} />\n <div className=\"mt-4 flex flex-col gap-5\">\n <AgentDefaultsField label={a.label.imageModel} description={a.desc.imageModel}>\n <ModelSelector\n value={form.imageModel}\n placeholder={chat.modelPlaceholder}\n searchPlaceholder={chat.modelSearchPlaceholder}\n noMatches={chat.modelNoMatches}\n capabilitiesFilter=\"vision\"\n registryEmptyHint={a.visionRegistryEmpty}\n outOfFilterNote={a.visionOutOfFilterNote}\n onChange={(modelId) => update({ imageModel: modelId })}\n />\n </AgentDefaultsField>\n <AgentDefaultsField label={a.label.imageGenerationModel} description={a.desc.imageGenerationModel}>\n <ImageGenerationModelInput\n value={form.imageGenerationModel}\n placeholder={chat.modelPlaceholder}\n searchPlaceholder={chat.modelSearchPlaceholder}\n noMatches={chat.modelNoMatches}\n registryEmptyHint={a.imageGenRegistryEmpty}\n outOfFilterNote={a.imageGenOutOfFilterNote}\n onChange={(modelId) => update({ imageGenerationModel: modelId })}\n />\n </AgentDefaultsField>\n </div>\n </SettingsFormSection>\n );\n}\n\n/** Fallback chain lists for vision + image generation — lives inside a collapsible section. */\nexport function ImageModelFallbackChains(props: AgentDefaultsPanelProps) {\n const { a, chat, form, update } = props;\n\n return (\n <div className=\"flex flex-col gap-5\">\n <AgentDefaultsField label={a.label.imageModelFallbacks} description={a.desc.imageModelFallbacks}>\n <div className=\"flex flex-col gap-2\">\n {form.imageModelFallbacks.map((fb, idx) => (\n <div key={modelFallbackRowKey(fb, idx, form.imageModelFallbacks)} className=\"flex items-start gap-2\">\n <div className=\"min-w-0 flex-1\">\n <ModelSelector\n value={fb}\n placeholder={chat.modelPlaceholder}\n searchPlaceholder={chat.modelSearchPlaceholder}\n noMatches={chat.modelNoMatches}\n capabilitiesFilter=\"vision\"\n registryEmptyHint={a.visionRegistryEmpty}\n outOfFilterNote={a.visionOutOfFilterNote}\n onChange={(modelId) => {\n const next = [...form.imageModelFallbacks];\n next[idx] = modelId;\n update({ imageModelFallbacks: next });\n }}\n />\n </div>\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"shrink-0\"\n aria-label={a.removeModelFallback}\n onClick={() =>\n update({\n imageModelFallbacks: form.imageModelFallbacks.filter((_, j) => j !== idx),\n })\n }\n >\n <Trash2 className=\"size-4\" strokeWidth={1.75} />\n </Button>\n </div>\n ))}\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"w-fit gap-1.5\"\n onClick={() => update({ imageModelFallbacks: [...form.imageModelFallbacks, ''] })}\n >\n <Plus className=\"size-4 shrink-0\" strokeWidth={1.75} />\n {a.addModelFallback}\n </Button>\n </div>\n </AgentDefaultsField>\n <AgentDefaultsField\n label={a.label.imageGenerationModelFallbacks}\n description={a.desc.imageGenerationModelFallbacks}\n >\n <div className=\"flex flex-col gap-2\">\n {form.imageGenerationModelFallbacks.map((fb, idx) => (\n <div\n key={modelFallbackRowKey(fb, idx, form.imageGenerationModelFallbacks)}\n className=\"flex items-start gap-2\"\n >\n <div className=\"min-w-0 flex-1\">\n <ImageGenerationModelInput\n value={fb}\n placeholder={chat.modelPlaceholder}\n searchPlaceholder={chat.modelSearchPlaceholder}\n noMatches={chat.modelNoMatches}\n registryEmptyHint={a.imageGenRegistryEmpty}\n outOfFilterNote={a.imageGenOutOfFilterNote}\n onChange={(modelId) => {\n const next = [...form.imageGenerationModelFallbacks];\n next[idx] = modelId;\n update({ imageGenerationModelFallbacks: next });\n }}\n />\n </div>\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"shrink-0\"\n aria-label={a.removeModelFallback}\n onClick={() =>\n update({\n imageGenerationModelFallbacks: form.imageGenerationModelFallbacks.filter(\n (_, j) => j !== idx,\n ),\n })\n }\n >\n <Trash2 className=\"size-4\" strokeWidth={1.75} />\n </Button>\n </div>\n ))}\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"w-fit gap-1.5\"\n onClick={() =>\n update({ imageGenerationModelFallbacks: [...form.imageGenerationModelFallbacks, ''] })\n }\n >\n <Plus className=\"size-4 shrink-0\" strokeWidth={1.75} />\n {a.addModelFallback}\n </Button>\n </div>\n </AgentDefaultsField>\n </div>\n );\n}\n","import { Loader2, Save, Server } from 'lucide-react';\nimport { useCallback, useEffect, useMemo, useReducer } from 'react';\n\nimport { createFormDraftReducer, uiPatchReducer } from '@/lib/settings-form-draft';\nimport useSWR from 'swr';\n\nimport { Button } from '@/components/ui/button';\nimport { useExtensions } from '@/features/extensions/extension-provider';\nimport { useGatewayConfigSwr } from '@/features/gateway/gateway-config-swr';\nimport { useSaveBarRegistration } from '@/features/settings/save-bar/use-save-bar-registration';\nimport { SettingsCollapsibleSection } from '@/features/settings/settings-collapsible-section';\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 {\n ImageModelPrimarySelectors,\n ImageModelFallbackChains,\n} from '@/features/settings/agents/agent-defaults-panels/image-model-chains-section';\nimport {\n fetchAgentDefaults,\n parseParamsJsonForSave,\n patchAgentDefaults,\n type AgentDefaultsState,\n} from '@/features/settings/config-api';\nimport { useImageProviderCredentials } from '@/features/settings/use-image-provider-credentials';\nimport { settingsInputFocusClass } from '@/lib/form-field-width';\nimport { apiUrl } from '@/lib/url';\nimport { cn } from '@/lib/cn';\nimport { messages, type MessageBundle } from '@/i18n/messages';\nimport { useGatewayStore } from '@/stores/gateway-store';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nfunction inputClass(): 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 );\n}\n\nconst imageProvidersSwrKey = () => apiUrl(IMAGE_PROVIDERS_SWR_KEY);\n\nfunction pickImageDefaultsSlice(s: AgentDefaultsState) {\n return {\n imageModel: s.imageModel,\n imageModelFallbacks: s.imageModelFallbacks,\n imageGenerationModel: s.imageGenerationModel,\n imageGenerationModelFallbacks: s.imageGenerationModelFallbacks,\n imageGenerationModelTimeoutMs: s.imageGenerationModelTimeoutMs,\n imageGenerationModelAutoProviderFallback: s.imageGenerationModelAutoProviderFallback,\n };\n}\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\nconst agentDefaultsFormReducer = createFormDraftReducer<AgentDefaultsState>();\n\ntype ImageModelsUi = {\n loading: boolean;\n saving: boolean;\n savedFlash: boolean;\n error: string | undefined;\n};\n\nconst initialImageModelsUi: ImageModelsUi = {\n loading: true,\n saving: false,\n savedFlash: false,\n error: undefined,\n};\n\n/** See `WebSearchSettingsPanel` for the embedded-mode contract. */\nexport function ImageModelsSettingsPanel({ embedded = false }: { embedded?: boolean } = {}) {\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const t = m.imageModelsSettings;\n const token = useGatewayStore((st) => st.token);\n const hasToken = Boolean(token);\n\n const [formDraft, dispatchForm] = useReducer(agentDefaultsFormReducer, { form: null, baseline: null });\n const state = formDraft.form;\n const baseline = formDraft.baseline;\n const [ui, dispatchUi] = useReducer(uiPatchReducer<ImageModelsUi>, initialImageModelsUi);\n const { loading, saving, savedFlash, error } = ui;\n\n const extensions = useExtensions();\n const extensionIds = useMemo(() => new Set(extensions.map((e) => e.id)), [extensions]);\n\n const reload = useCallback(async () => {\n if (!hasToken) return;\n dispatchUi({ type: 'patch', patch: { loading: true, error: undefined } });\n try {\n const fresh = await fetchAgentDefaults();\n const snapshot = structuredClone(fresh);\n dispatchForm({ type: 'sync', value: snapshot });\n } catch (err) {\n dispatchUi({\n type: 'patch',\n patch: { error: err instanceof Error ? err.message : String(err) },\n });\n } finally {\n dispatchUi({ type: 'patch', patch: { loading: false } });\n }\n }, [hasToken]);\n\n useEffect(() => {\n void reload();\n }, [reload]);\n\n const patchAgentDefaultsLocal = useCallback((patch: Partial<AgentDefaultsState>) => {\n dispatchForm({ type: 'patch', patch });\n }, []);\n\n const { data: providers = [] } = useSWR(\n hasToken ? imageProvidersSwrKey() : null,\n fetchImageProvidersList,\n { revalidateOnFocus: false },\n );\n\n // Drives the default-open state of the credentials collapsible below —\n // expand if the user already has at least one image provider with a key,\n // otherwise stay collapsed to keep the page short for new users.\n const hasConfiguredProvider = providers.some((p) => p.configured);\n\n const gwSwr = useGatewayConfigSwr(hasToken);\n\n const cred = useImageProviderCredentials(providers);\n\n const dirty = useMemo(() => {\n if (!state || !baseline) return false;\n return (\n JSON.stringify(pickImageDefaultsSlice(state)) !== JSON.stringify(pickImageDefaultsSlice(baseline))\n );\n }, [state, baseline]);\n\n const anyDirty = dirty || cred.credDirty;\n\n useEffect(() => {\n if (!anyDirty) return;\n const onBeforeUnload = (e: BeforeUnloadEvent) => {\n e.preventDefault();\n e.returnValue = '';\n };\n window.addEventListener('beforeunload', onBeforeUnload);\n return () => window.removeEventListener('beforeunload', onBeforeUnload);\n }, [anyDirty]);\n\n const onSave = useCallback(async () => {\n if (!state) return;\n dispatchUi({ type: 'patch', patch: { saving: true, error: undefined } });\n try {\n try {\n void parseParamsJsonForSave(state.paramsJson);\n } catch (e) {\n dispatchUi({\n type: 'patch',\n patch: {\n error:\n e instanceof SyntaxError\n ? m.agentSettings.advanced.paramsInvalidJson\n : e instanceof Error\n ? e.message\n : m.agentSettings.advanced.paramsInvalidJson,\n },\n });\n return;\n }\n // Save agent defaults + credentials in parallel\n const savePromises: Promise<void>[] = [];\n if (dirty) {\n savePromises.push(\n patchAgentDefaults(state).then(() => {\n dispatchForm({ type: 'saved', value: structuredClone(state) });\n void gwSwr.mutate?.();\n }),\n );\n }\n if (cred.credDirty) {\n savePromises.push(cred.saveCredentials(t.credentialsSaveError));\n }\n await Promise.all(savePromises);\n dispatchUi({ type: 'patch', patch: { savedFlash: true } });\n window.setTimeout(() => dispatchUi({ type: 'patch', patch: { savedFlash: false } }), 1500);\n } catch (err) {\n dispatchUi({\n type: 'patch',\n patch: { error: err instanceof Error ? err.message : String(err) },\n });\n } finally {\n dispatchUi({ type: 'patch', patch: { saving: false } });\n }\n }, [state, dirty, gwSwr, m.agentSettings, cred, t.credentialsSaveError]);\n\n const onDiscard = useCallback(() => {\n if (!baseline) return;\n dispatchForm({ type: 'discard' });\n if (cred.credDirty) cred.onDiscardCredentials();\n dispatchUi({ type: 'patch', patch: { error: undefined, savedFlash: false } });\n }, [baseline, cred]);\n\n useSaveBarRegistration({\n id: 'image-models',\n dirty: anyDirty,\n saving,\n save: onSave,\n discard: onDiscard,\n });\n\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 const outerClass = embedded\n ? 'flex flex-col gap-4'\n : 'mx-auto flex w-full max-w-app-main flex-col gap-6 px-4 py-8';\n const stubClass = embedded\n ? 'w-full text-sm text-fg-muted'\n : 'mx-auto w-full max-w-app-main px-4 py-8 text-sm text-fg-muted';\n const stubFlexClass = embedded\n ? 'flex w-full items-center gap-2 text-sm text-fg-muted'\n : 'mx-auto flex w-full max-w-app-main items-center gap-2 px-4 py-8 text-sm text-fg-muted';\n\n if (!hasToken) {\n return (\n <div className={stubClass}>\n {language === 'zh' ? '请先登录网关。' : 'Connect to a gateway to continue.'}\n </div>\n );\n }\n\n if (loading || !state) {\n return (\n <div className={stubFlexClass}>\n <Loader2 className=\"size-4 animate-spin\" /> Loading…\n </div>\n );\n }\n\n return (\n <div className={outerClass}>\n {embedded ? null : (\n <header className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0 flex-1\">\n <h1 className=\"text-lg font-semibold tracking-tight text-fg\">{t.title}</h1>\n <p className=\"mt-1 text-sm text-fg-muted\">{t.subtitle}</p>\n </div>\n <div className=\"flex shrink-0 flex-wrap items-center justify-end gap-2\">\n {savedFlash ? <span className=\"text-sm text-fg-muted\">{t.saved}</span> : null}\n <Button type=\"button\" variant=\"secondary\" onClick={onDiscard} disabled={!anyDirty || saving}>\n {t.discard}\n </Button>\n <Button type=\"button\" variant=\"primary\" onClick={() => void onSave()} disabled={!anyDirty || saving}>\n {saving ? <Loader2 className=\"size-3.5 animate-spin\" /> : <Save className=\"size-3.5\" />}\n <span className=\"ml-1.5\">{saving ? t.saving : t.save}</span>\n </Button>\n </div>\n </header>\n )}\n\n {error ? (\n <div className=\"rounded-lg border border-red-500/30 bg-red-500/10 px-3 py-2 text-sm text-red-700 dark:text-red-300\">\n {error}\n </div>\n ) : null}\n\n {/* Primary model selectors — always visible */}\n <ImageModelPrimarySelectors\n form={state}\n update={patchAgentDefaultsLocal}\n a={m.agentSettings}\n chat={m.chat}\n />\n\n {/* Fallback chains — collapsed by default */}\n <SettingsCollapsibleSection\n showLabel={t.fallbackChainsTitle}\n hideLabel={t.fallbackChainsTitle}\n >\n <ImageModelFallbackChains\n form={state}\n update={patchAgentDefaultsLocal}\n a={m.agentSettings}\n chat={m.chat}\n />\n </SettingsCollapsibleSection>\n\n {/* Runtime tuning — collapsed by default */}\n <SettingsCollapsibleSection\n showLabel={t.runtimeTuningTitle}\n hideLabel={t.runtimeTuningTitle}\n >\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex flex-col gap-1.5\">\n <label className=\"text-sm font-medium text-fg\">{t.timeoutLabel}</label>\n <input\n type=\"number\"\n min={0}\n step={1000}\n className={cn(inputClass(), 'max-w-48')}\n value={state.imageGenerationModelTimeoutMs ?? ''}\n placeholder=\"120000\"\n onChange={(e) => {\n const raw = e.target.value.trim();\n const next = raw === '' ? null : Math.max(0, Math.floor(Number(raw)));\n patchAgentDefaultsLocal({\n imageGenerationModelTimeoutMs: next && next > 0 ? next : null,\n });\n }}\n />\n <p className=\"text-xs text-fg-subtle\">{t.timeoutHint}</p>\n </div>\n <label className=\"flex items-start gap-3 text-sm\">\n <input\n type=\"checkbox\"\n className=\"mt-0.5\"\n checked={state.imageGenerationModelAutoProviderFallback}\n onChange={(e) =>\n patchAgentDefaultsLocal({\n imageGenerationModelAutoProviderFallback: e.target.checked,\n })\n }\n aria-label={t.autoFallbackLabel}\n />\n <span className=\"flex flex-col gap-0.5\">\n <span className=\"font-medium text-fg\">{t.autoFallbackLabel}</span>\n <span className=\"text-xs text-fg-subtle\">{t.autoFallbackHint}</span>\n </span>\n </label>\n </div>\n </SettingsCollapsibleSection>\n\n {/* Provider credentials — collapsed; expands if user already has configured providers */}\n <SettingsCollapsibleSection\n icon={Server}\n showLabel={t.providersTitle}\n hideLabel={t.providersTitle}\n defaultOpen={hasConfiguredProvider}\n >\n {providers.length === 0 ? (\n <p className=\"text-sm text-fg-muted\">{t.providersEmpty}</p>\n ) : (\n <ImageProviderCredentialsPanel\n summaries={providers}\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={extensionIds}\n showExtensionLinks\n showImageModelsLink={false}\n hideActions\n language={language}\n apiKeyLinkLabels={apiKeyLinkLabels}\n messages={panelMsg}\n />\n )}\n </SettingsCollapsibleSection>\n </div>\n );\n}\n","import { apiFetch } from '@/lib/fetch';\nimport { apiUrl } from '@/lib/url';\n\nimport type {\n ApiType,\n CustomModel,\n ModelsJsonConfig,\n ValidationResult,\n} from './models-json.types';\n\nexport type {\n ApiType,\n CustomModel,\n ModelsJsonConfig,\n ProviderConfig,\n ValidationResult,\n} from './models-json.types';\n\nexport interface ModelsJsonStatus {\n config: ModelsJsonConfig;\n path: string;\n exists: boolean;\n loadError?: string;\n}\n\nexport interface ApiKeyTestResult {\n type: 'literal' | 'env' | 'command';\n resolved?: string;\n error?: string;\n}\n\nexport const API_TYPE_OPTIONS: { value: ApiType; label: string }[] = [\n { value: 'openai-completions', label: 'OpenAI Completions' },\n { value: 'openai-responses', label: 'OpenAI Responses' },\n { value: 'anthropic-messages', label: 'Anthropic Messages' },\n { value: 'google-generative-ai', label: 'Google Generative AI' },\n { value: 'azure-openai-responses', label: 'Azure OpenAI' },\n { value: 'bedrock-converse-stream', label: 'AWS Bedrock' },\n { value: 'openai-codex-responses', label: 'OpenAI Codex' },\n { value: 'google-gemini-cli', label: 'Google Gemini CLI' },\n { value: 'google-vertex', label: 'Google Vertex AI' },\n];\n\nfunction gatewayErrorMessage(body: unknown): string | undefined {\n if (!body || typeof body !== 'object') return undefined;\n const o = body as { error?: unknown };\n if (typeof o.error === 'string') return o.error;\n if (o.error && typeof o.error === 'object' && 'message' in o.error) {\n const m = (o.error as { message?: unknown }).message;\n return typeof m === 'string' ? m : undefined;\n }\n return undefined;\n}\n\n/** Ensures `providers` exists when the gateway returns a partial object. */\nexport function normalizeModelsJsonConfig(input: unknown): ModelsJsonConfig {\n if (!input || typeof input !== 'object') {\n return { providers: {} };\n }\n const o = input as Record<string, unknown>;\n const raw = o.providers;\n if (raw && typeof raw === 'object' && !Array.isArray(raw)) {\n return input as ModelsJsonConfig;\n }\n return { ...o, providers: {} };\n}\n\nexport async function fetchModelsJson(): Promise<ModelsJsonStatus> {\n const res = await apiFetch(apiUrl('/api/models-json'));\n const data = await res.json().catch(() => ({})) as {\n ok?: boolean;\n payload?: ModelsJsonStatus;\n error?: unknown;\n };\n if (!res.ok || !data.ok || !data.payload) {\n throw new Error(gatewayErrorMessage(data) || `HTTP ${res.status}`);\n }\n return {\n ...data.payload,\n config: normalizeModelsJsonConfig(data.payload.config),\n };\n}\n\nexport async function validateModelsJson(config: ModelsJsonConfig): Promise<ValidationResult> {\n const res = await apiFetch(apiUrl('/api/models-json/validate'), {\n method: 'POST',\n body: JSON.stringify({ config }),\n });\n const data = await res.json().catch(() => ({})) as {\n ok?: boolean;\n payload?: ValidationResult;\n error?: unknown;\n };\n if (!res.ok || !data.ok || !data.payload) {\n throw new Error(gatewayErrorMessage(data) || `HTTP ${res.status}`);\n }\n return data.payload;\n}\n\nexport async function saveModelsJson(\n config: ModelsJsonConfig,\n): Promise<{ saved: boolean; modelCount: number }> {\n const res = await apiFetch(apiUrl('/api/models-json'), {\n method: 'PATCH',\n body: JSON.stringify({ config }),\n });\n const data = await res.json().catch(() => ({})) as {\n ok?: boolean;\n payload?: { saved: boolean; modelCount: number };\n error?: unknown;\n };\n if (!res.ok || !data.ok || !data.payload) {\n throw new Error(gatewayErrorMessage(data) || `HTTP ${res.status}`);\n }\n return data.payload;\n}\n\nexport async function reloadModelsJson(): Promise<{ modelCount: number; error?: string }> {\n const res = await apiFetch(apiUrl('/api/models-json/reload'), { method: 'POST' });\n const data = await res.json().catch(() => ({})) as {\n ok?: boolean;\n payload?: { modelCount: number; error?: string };\n error?: unknown;\n };\n if (!res.ok || !data.ok || !data.payload) {\n throw new Error(gatewayErrorMessage(data) || `HTTP ${res.status}`);\n }\n return data.payload;\n}\n\nexport async function testApiKey(value: string): Promise<ApiKeyTestResult> {\n const res = await apiFetch(apiUrl('/api/models-json/test-api-key'), {\n method: 'POST',\n body: JSON.stringify({ value }),\n });\n const data = await res.json().catch(() => ({})) as {\n ok?: boolean;\n payload?: ApiKeyTestResult;\n error?: unknown;\n };\n if (!res.ok || !data.ok || !data.payload) {\n throw new Error(gatewayErrorMessage(data) || `HTTP ${res.status}`);\n }\n return data.payload;\n}\n\nexport function createCustomModel(id: string, name?: string, overrides?: Partial<CustomModel>): CustomModel {\n return {\n id,\n name: name || id,\n input: ['text'],\n contextWindow: 128000,\n maxTokens: 16384,\n cost: {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n },\n ...overrides,\n };\n}\n\nfunction isShellCommand(value: string): boolean {\n return value.startsWith('!');\n}\n\nfunction isEnvVar(value: string): boolean {\n return /^[A-Z][A-Z0-9_]*$/.test(value);\n}\n\nexport function getApiKeyType(value: string): 'shell' | 'env' | 'literal' {\n if (isShellCommand(value)) return 'shell';\n if (isEnvVar(value)) return 'env';\n return 'literal';\n}\n\nexport function maskApiKey(value: string): string {\n if (!value) return '';\n if (value.length <= 8) return '••••';\n return `${value.slice(0, 4)}••••${value.slice(-4)}`;\n}\n","import { nativeSelectMaxWidthClass, selectControlBaseClass, settingsInputFocusClass } from '@/lib/form-field-width';\nimport { cn } from '@/lib/cn';\n\nimport type { CustomModel, ModelsJsonConfig, ProviderConfig } from '../models-json-api';\n\nexport const PROVIDER_PRESETS: Record<string, Partial<ProviderConfig>> = {\n ollama: {\n baseUrl: 'http://localhost:11434/v1',\n api: 'openai-completions',\n apiKey: 'ollama',\n },\n lmstudio: {\n baseUrl: 'http://localhost:1234/v1',\n api: 'openai-completions',\n apiKey: 'lmstudio',\n },\n openrouter: {\n baseUrl: 'https://openrouter.ai/api/v1',\n api: 'openai-completions',\n apiKey: '',\n },\n zhipuCn: {\n baseUrl: 'https://open.bigmodel.cn/api/coding/paas/v4',\n api: 'openai-completions',\n apiKey: 'ZHIPU_API_KEY',\n },\n zaiGeneral: {\n baseUrl: 'https://api.z.ai/api/paas/v4',\n api: 'openai-completions',\n apiKey: 'ZAI_API_KEY',\n },\n};\n\nexport function providerIdForPreset(presetKey: string): string {\n if (presetKey === 'openrouter') return 'openrouter';\n if (presetKey === 'zhipuCn') return 'zhipu-cn';\n if (presetKey === 'zaiGeneral') return 'zai';\n return presetKey;\n}\n\nexport const INPUT_OPTIONS = [\n { value: 'text', labelKey: 'inputTextOnly' as const },\n { value: 'text,image', labelKey: 'inputTextVision' as const },\n];\n\nexport function 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\nexport function selectClassName(): string {\n return cn(selectControlBaseClass, nativeSelectMaxWidthClass);\n}\n\nexport function parseInputSelect(model: CustomModel): string {\n const i = model.input || ['text'];\n if (i.includes('image')) return 'text,image';\n return 'text';\n}\n\nexport function inputFromSelect(sel: string): ('text' | 'image')[] {\n if (sel === 'text,image') return ['text', 'image'];\n return ['text'];\n}\n\nexport function updateProvider(\n config: ModelsJsonConfig,\n providerId: string,\n updates: Partial<ProviderConfig>,\n): ModelsJsonConfig {\n return {\n ...config,\n providers: {\n ...config.providers,\n [providerId]: {\n ...config.providers[providerId],\n ...updates,\n },\n },\n };\n}\n\nexport function removeProvider(config: ModelsJsonConfig, providerId: string): ModelsJsonConfig {\n const providers = { ...config.providers };\n delete providers[providerId];\n return { ...config, providers };\n}\n\nexport function addProviderEntry(\n config: ModelsJsonConfig,\n providerId: string,\n prov: ProviderConfig,\n): ModelsJsonConfig {\n return {\n ...config,\n providers: {\n ...config.providers,\n [providerId]: prov,\n },\n };\n}\n","import * as Dialog from '@radix-ui/react-dialog';\nimport { X } from 'lucide-react';\nimport { useState } from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport { cn } from '@/lib/cn';\nimport { ghostIconButton } from '@/lib/interaction';\nimport { SETTINGS_SHELL_CONTENT_Z, SETTINGS_SHELL_OVERLAY_Z } from '@/lib/settings-shell-dialog-layer';\nimport { type ModelsSettingsMessages } from '@/i18n/messages';\n\nimport { createCustomModel, type CustomModel } from '../models-json-api';\n\nimport {\n inputClassName,\n INPUT_OPTIONS,\n inputFromSelect,\n parseInputSelect,\n selectClassName,\n} from './models-settings-lib';\n\ntype ModelDialogProps = {\n open: boolean;\n onOpenChange: (o: boolean) => void;\n providerId: string | null;\n model: CustomModel | null;\n isNew: boolean;\n onSave: (model: CustomModel) => void;\n m: ModelsSettingsMessages;\n};\n\nfunction ModelEditForm({\n model,\n isNew,\n providerId,\n onSave,\n onClose,\n m,\n}: {\n model: CustomModel | null;\n isNew: boolean;\n providerId: string | null;\n onSave: (model: CustomModel) => void;\n onClose: () => void;\n m: ModelsSettingsMessages;\n}) {\n const [form, setForm] = useState<Partial<CustomModel>>(() =>\n model ? { ...model } : createCustomModel(''),\n );\n const [errors, setErrors] = useState<Map<string, string>>(() => new Map());\n\n const update = <K extends keyof CustomModel>(field: K, value: CustomModel[K]) => {\n setForm((f) => ({ ...f, [field]: value }));\n setErrors((prev) => {\n const next = new Map(prev);\n next.delete(field);\n return next;\n });\n };\n\n const validate = (): boolean => {\n const next = new Map<string, string>();\n const id = (form.id || '').trim();\n if (!id) next.set('id', m.modelIdRequired);\n if (form.contextWindow !== undefined && form.contextWindow <= 0) {\n next.set('contextWindow', m.mustBePositive);\n }\n if (form.maxTokens !== undefined && form.maxTokens <= 0) {\n next.set('maxTokens', m.mustBePositive);\n }\n setErrors(next);\n return next.size === 0;\n };\n\n const handleSave = () => {\n if (!validate()) return;\n const id = (form.id || '').trim();\n const result: CustomModel = {\n ...form,\n id,\n name: form.name?.trim() || id,\n reasoning: form.reasoning || false,\n input: form.input || ['text'],\n contextWindow: form.contextWindow ?? 128000,\n maxTokens: form.maxTokens ?? 16384,\n cost: {\n input: form.cost?.input ?? 0,\n output: form.cost?.output ?? 0,\n cacheRead: form.cost?.cacheRead ?? 0,\n cacheWrite: form.cost?.cacheWrite ?? 0,\n },\n };\n onSave(result);\n onClose();\n };\n\n const inputSel = parseInputSelect(form as CustomModel);\n\n return (\n <>\n <div className=\"mb-3 flex items-start justify-between gap-2\">\n <div>\n <Dialog.Title className=\"text-base font-semibold text-fg\">\n {isNew ? m.addModelTitle : m.editModelTitle}\n </Dialog.Title>\n {providerId ? (\n <p className=\"mt-0.5 text-xs text-fg-muted\">\n {m.modelProviderLabel}: {providerId}\n </p>\n ) : null}\n </div>\n <Dialog.Close asChild>\n <button\n type=\"button\"\n className={cn(ghostIconButton, 'p-1.5 hover:bg-surface-base')}\n aria-label={m.close}\n >\n <X className=\"size-4\" />\n </button>\n </Dialog.Close>\n </div>\n\n <div className=\"flex flex-col gap-3\">\n <div>\n <label className=\"mb-1 block text-xs font-medium text-fg\">\n {m.modelId}\n <span className=\"text-red-600 dark:text-red-400\"> *</span>\n </label>\n <input\n className={cn(inputClassName(), errors.has('id') && 'border-red-500')}\n value={form.id || ''}\n onChange={(e) => update('id', e.target.value)}\n placeholder=\"e.g. llama3.1:8b\"\n disabled={!isNew}\n />\n {errors.has('id') ? (\n <p className=\"mt-1 text-xs text-red-600 dark:text-red-400\">{errors.get('id')}</p>\n ) : null}\n </div>\n <div>\n <label className=\"mb-1 block text-xs font-medium text-fg-muted\">{m.displayName}</label>\n <input\n className={inputClassName()}\n value={form.name || ''}\n onChange={(e) => update('name', e.target.value)}\n />\n </div>\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <div>\n <label className=\"mb-1 block text-xs font-medium text-fg-muted\">{m.inputTypes}</label>\n <select\n className={selectClassName()}\n value={inputSel}\n onChange={(e) => update('input', inputFromSelect(e.target.value))}\n >\n {INPUT_OPTIONS.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {m[opt.labelKey]}\n </option>\n ))}\n </select>\n </div>\n <label className=\"mt-6 flex cursor-pointer items-center gap-2 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"ui-checkbox\"\n checked={form.reasoning || false}\n onChange={(e) => update('reasoning', e.target.checked)}\n />\n {m.reasoning}\n </label>\n </div>\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <div>\n <label className=\"mb-1 block text-xs font-medium text-fg-muted\">{m.contextWindow}</label>\n <input\n type=\"number\"\n min={1}\n className={cn(inputClassName(), errors.has('contextWindow') && 'border-red-500')}\n value={form.contextWindow ?? 128000}\n onChange={(e) => update('contextWindow', parseInt(e.target.value, 10) || 0)}\n />\n {errors.has('contextWindow') ? (\n <p className=\"mt-1 text-xs text-red-600 dark:text-red-400\">{errors.get('contextWindow')}</p>\n ) : null}\n </div>\n <div>\n <label className=\"mb-1 block text-xs font-medium text-fg-muted\">{m.maxOutputTokens}</label>\n <input\n type=\"number\"\n min={1}\n className={cn(inputClassName(), errors.has('maxTokens') && 'border-red-500')}\n value={form.maxTokens ?? 16384}\n onChange={(e) => update('maxTokens', parseInt(e.target.value, 10) || 0)}\n />\n {errors.has('maxTokens') ? (\n <p className=\"mt-1 text-xs text-red-600 dark:text-red-400\">{errors.get('maxTokens')}</p>\n ) : null}\n </div>\n </div>\n <div className=\"border-t border-edge-subtle pt-2 dark:border-edge\">\n <p className=\"mb-2 text-xs font-semibold text-fg\">{m.costSection}</p>\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <label className=\"mb-1 block text-xs text-fg-muted\">{m.costInput}</label>\n <input\n type=\"number\"\n step=\"any\"\n min={0}\n className={inputClassName()}\n value={form.cost?.input ?? 0}\n onChange={(e) =>\n update('cost', {\n ...form.cost,\n input: parseFloat(e.target.value) || 0,\n output: form.cost?.output ?? 0,\n cacheRead: form.cost?.cacheRead ?? 0,\n cacheWrite: form.cost?.cacheWrite ?? 0,\n })\n }\n />\n </div>\n <div>\n <label className=\"mb-1 block text-xs text-fg-muted\">{m.costOutput}</label>\n <input\n type=\"number\"\n step=\"any\"\n min={0}\n className={inputClassName()}\n value={form.cost?.output ?? 0}\n onChange={(e) =>\n update('cost', {\n ...form.cost,\n input: form.cost?.input ?? 0,\n output: parseFloat(e.target.value) || 0,\n cacheRead: form.cost?.cacheRead ?? 0,\n cacheWrite: form.cost?.cacheWrite ?? 0,\n })\n }\n />\n </div>\n </div>\n </div>\n </div>\n\n <div className=\"mt-4 flex justify-end gap-2 border-t border-edge-subtle pt-3 dark:border-edge\">\n <Dialog.Close asChild>\n <Button type=\"button\" variant=\"secondary\">\n {m.cancel}\n </Button>\n </Dialog.Close>\n <Button type=\"button\" className=\"bg-accent text-white hover:bg-accent/90\" onClick={handleSave}>\n {isNew ? m.addModelConfirm : m.saveModelConfirm}\n </Button>\n </div>\n </>\n );\n}\n\nexport function ModelEditDialogContent({\n open,\n onOpenChange,\n providerId,\n model,\n isNew,\n onSave,\n m,\n}: ModelDialogProps) {\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <Dialog.Portal>\n <Dialog.Overlay\n className={cn('xopc-dialog-overlay fixed inset-0 bg-scrim', SETTINGS_SHELL_OVERLAY_Z)}\n />\n <Dialog.Content\n className={cn(\n 'xopc-dialog-content fixed left-1/2 top-1/2 max-h-[min(90vh,720px)] w-[min(100%-2rem,28rem)] -translate-x-1/2 -translate-y-1/2',\n SETTINGS_SHELL_CONTENT_Z,\n 'overflow-y-auto rounded-xl border border-edge bg-surface-panel p-4 shadow-popover dark:border-edge',\n )}\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n {open ? (\n <ModelEditForm\n key={`${providerId ?? 'none'}-${model?.id ?? 'new'}`}\n model={model}\n isNew={isNew}\n providerId={providerId}\n onSave={onSave}\n onClose={() => onOpenChange(false)}\n m={m}\n />\n ) : null}\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n","import * as Dialog from '@radix-ui/react-dialog';\nimport { AlertCircle, X } from 'lucide-react';\nimport { useReducer, useRef } from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport { cn } from '@/lib/cn';\nimport { ghostIconButton } from '@/lib/interaction';\nimport { SETTINGS_SHELL_CONTENT_Z, SETTINGS_SHELL_OVERLAY_Z } from '@/lib/settings-shell-dialog-layer';\nimport { type ModelsSettingsMessages } from '@/i18n/messages';\n\nimport {\n API_TYPE_OPTIONS,\n type ApiType,\n type ProviderConfig,\n} from '../models-json-api';\n\nimport {\n inputClassName,\n PROVIDER_PRESETS,\n providerIdForPreset,\n selectClassName,\n} from './models-settings-lib';\n\ntype ProviderDialogProps = {\n open: boolean;\n onOpenChange: (o: boolean) => void;\n presetKey?: string | null;\n onConfirm: (providerId: string, prov: ProviderConfig) => void;\n m: ModelsSettingsMessages;\n};\n\ntype FormState = {\n providerId: string;\n preset: string;\n baseUrl: string;\n api: ApiType;\n apiKey: string;\n error: string | null;\n};\n\nfunction formStateFromPreset(presetKey?: string | null): FormState {\n const pk = presetKey || null;\n if (pk && PROVIDER_PRESETS[pk]) {\n const p = PROVIDER_PRESETS[pk];\n return {\n preset: pk,\n baseUrl: p.baseUrl || '',\n api: (p.api as ApiType) || 'openai-completions',\n apiKey: p.apiKey ?? '',\n providerId: providerIdForPreset(pk),\n error: null,\n };\n }\n return {\n preset: 'custom',\n providerId: '',\n baseUrl: '',\n api: 'openai-completions',\n apiKey: '',\n error: null,\n };\n}\n\ntype FormAction =\n | { type: 'reset'; presetKey?: string | null }\n | { type: 'applyPreset'; key: string }\n | { type: 'setProviderId'; value: string }\n | { type: 'setBaseUrl'; value: string }\n | { type: 'setApi'; value: ApiType }\n | { type: 'setApiKey'; value: string }\n | { type: 'setError'; value: string | null };\n\nfunction formReducer(state: FormState, action: FormAction): FormState {\n switch (action.type) {\n case 'reset':\n return formStateFromPreset(action.presetKey);\n case 'applyPreset': {\n if (action.key === 'custom') {\n return { ...state, preset: 'custom', error: null };\n }\n const p = PROVIDER_PRESETS[action.key];\n if (!p) return state;\n return {\n ...state,\n preset: action.key,\n baseUrl: p.baseUrl || '',\n api: (p.api as ApiType) || 'openai-completions',\n apiKey: p.apiKey ?? '',\n providerId: providerIdForPreset(action.key),\n error: null,\n };\n }\n case 'setProviderId':\n return { ...state, providerId: action.value };\n case 'setBaseUrl':\n return { ...state, baseUrl: action.value };\n case 'setApi':\n return { ...state, api: action.value };\n case 'setApiKey':\n return { ...state, apiKey: action.value };\n case 'setError':\n return { ...state, error: action.value };\n }\n}\n\nexport function ProviderAddDialog({ open, onOpenChange, presetKey, onConfirm, m }: ProviderDialogProps) {\n const [form, dispatch] = useReducer(formReducer, undefined as never, () => formStateFromPreset(presetKey));\n\n const dialogResetKey = open ? (presetKey ?? 'custom') : '';\n const trackedDialogResetKeyRef = useRef('');\n if (open && trackedDialogResetKeyRef.current !== dialogResetKey) {\n trackedDialogResetKeyRef.current = dialogResetKey;\n dispatch({ type: 'reset', presetKey });\n }\n if (!open && trackedDialogResetKeyRef.current !== '') {\n trackedDialogResetKeyRef.current = '';\n }\n\n const { providerId, preset, baseUrl, api, apiKey, error } = form;\n\n const handleSubmit = () => {\n const id = providerId.trim();\n if (!id) {\n dispatch({ type: 'setError', value: m.providerIdRequired });\n return;\n }\n dispatch({ type: 'setError', value: null });\n onConfirm(id, {\n baseUrl: baseUrl.trim() || undefined,\n api,\n apiKey: apiKey.trim() || undefined,\n models: [],\n });\n onOpenChange(false);\n };\n\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <Dialog.Portal>\n <Dialog.Overlay\n className={cn('xopc-dialog-overlay fixed inset-0 bg-scrim', SETTINGS_SHELL_OVERLAY_Z)}\n />\n <Dialog.Content\n className={cn(\n 'xopc-dialog-content fixed left-1/2 top-1/2 max-h-[min(90vh,640px)] w-[min(100%-2rem,32rem)] -translate-x-1/2 -translate-y-1/2',\n SETTINGS_SHELL_CONTENT_Z,\n 'overflow-y-auto rounded-xl border border-edge bg-surface-panel p-4 shadow-popover dark:border-edge',\n )}\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n <div className=\"mb-3 flex items-start justify-between gap-2\">\n <div>\n <Dialog.Title className=\"text-base font-semibold text-fg\">{m.addProviderTitle}</Dialog.Title>\n <p className=\"mt-0.5 text-xs text-fg-muted\">{m.addProviderSubtitle}</p>\n </div>\n <Dialog.Close asChild>\n <button\n type=\"button\"\n className={cn(ghostIconButton, 'p-1.5 hover:bg-surface-base')}\n aria-label={m.close}\n >\n <X className=\"size-4\" />\n </button>\n </Dialog.Close>\n </div>\n\n <div className=\"flex flex-col gap-3\">\n <div>\n <label className=\"mb-1 block text-xs font-medium text-fg-muted\">{m.presetLabel}</label>\n <select\n className={selectClassName()}\n value={preset}\n onChange={(e) => dispatch({ type: 'applyPreset', key: e.target.value })}\n >\n <option value=\"custom\">{m.presetCustom}</option>\n <option value=\"ollama\">{m.presetOllama}</option>\n <option value=\"lmstudio\">{m.presetLmStudio}</option>\n <option value=\"openrouter\">{m.presetOpenRouter}</option>\n <option value=\"zhipuCn\">{m.presetZhipuCn}</option>\n <option value=\"zaiGeneral\">{m.presetZaiGeneral}</option>\n </select>\n </div>\n <div>\n <label className=\"mb-1 block text-xs font-medium text-fg\">\n {m.providerIdLabel}\n <span className=\"text-red-600 dark:text-red-400\"> *</span>\n </label>\n <input\n className={inputClassName()}\n value={providerId}\n onChange={(e) => dispatch({ type: 'setProviderId', value: e.target.value })}\n placeholder={m.providerIdPlaceholder}\n />\n </div>\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <div>\n <label className=\"mb-1 block text-xs font-medium text-fg-muted\">{m.baseUrl}</label>\n <input\n className={inputClassName()}\n value={baseUrl}\n onChange={(e) => dispatch({ type: 'setBaseUrl', value: e.target.value })}\n placeholder=\"https://…\"\n />\n </div>\n <div>\n <label className=\"mb-1 block text-xs font-medium text-fg-muted\">{m.apiType}</label>\n <select\n className={selectClassName()}\n value={api}\n onChange={(e) => dispatch({ type: 'setApi', value: e.target.value as ApiType })}\n >\n {API_TYPE_OPTIONS.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </div>\n </div>\n <div>\n <label className=\"mb-1 block text-xs font-medium text-fg-muted\">{m.apiKey}</label>\n <input\n className={inputClassName()}\n value={apiKey}\n onChange={(e) => dispatch({ type: 'setApiKey', value: e.target.value })}\n placeholder={m.apiKeyPlaceholder}\n />\n </div>\n {error ? (\n <p className=\"flex items-center gap-1 text-xs text-red-600 dark:text-red-400\">\n <AlertCircle className=\"size-3.5 shrink-0\" />\n {error}\n </p>\n ) : null}\n </div>\n\n <div className=\"mt-4 flex justify-end gap-2 border-t border-edge-subtle pt-3 dark:border-edge\">\n <Dialog.Close asChild>\n <Button type=\"button\" variant=\"secondary\">\n {m.cancel}\n </Button>\n </Dialog.Close>\n <Button type=\"button\" className=\"bg-accent text-white hover:bg-accent/90\" onClick={handleSubmit}>\n {m.addProviderConfirm}\n </Button>\n </div>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n","import {\n Box,\n ChevronDown,\n ChevronRight,\n Cpu,\n Eye,\n EyeOff,\n Pencil,\n Plus,\n Trash2,\n Zap,\n} from 'lucide-react';\nimport type { Dispatch, SetStateAction } from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport { cn } from '@/lib/cn';\nimport { interaction } from '@/lib/interaction';\nimport { type ModelsSettingsMessages } from '@/i18n/messages';\n\nimport {\n API_TYPE_OPTIONS,\n getApiKeyType,\n maskApiKey,\n type ApiType,\n type CustomModel,\n type ModelsJsonConfig,\n} from '../models-json-api';\n\nimport { inputClassName, selectClassName, updateProvider } from './models-settings-lib';\n\nexport type ModelsTestResult = { type: string; resolved?: string; error?: string };\n\ntype ModelsProvidersListProps = {\n config: ModelsJsonConfig;\n setConfig: Dispatch<SetStateAction<ModelsJsonConfig>>;\n expanded: Set<string>;\n toggleExpand: (id: string) => void;\n showPw: Set<string>;\n toggleShowPw: (id: string) => void;\n testResults: Map<string, ModelsTestResult>;\n runTestKey: (providerId: string, value: string) => void;\n ms: ModelsSettingsMessages;\n removeProv: (providerId: string) => void;\n openModelDialog: (providerId: string, model: CustomModel | null, isNew: boolean) => void;\n setTestResults: Dispatch<SetStateAction<Map<string, ModelsTestResult>>>;\n};\n\nexport function ModelsProvidersList({\n config,\n setConfig,\n expanded,\n toggleExpand,\n showPw,\n toggleShowPw,\n testResults,\n runTestKey,\n ms,\n removeProv,\n openModelDialog,\n setTestResults,\n}: ModelsProvidersListProps) {\n return (\n <div className=\"flex flex-col gap-3\">\n {Object.entries(config.providers)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([id, prov]) => {\n const isEx = expanded.has(id);\n const nModels = prov.models?.length ?? 0;\n const keyType = prov.apiKey ? getApiKeyType(prov.apiKey) : null;\n const testResult = testResults.get(id);\n const pwVisible = showPw.has(id);\n\n return (\n <section\n key={id}\n className=\"overflow-hidden rounded-2xl bg-surface-base\"\n >\n <div className=\"flex items-center justify-between gap-2 border-b border-edge-subtle bg-surface-hover/35 px-3 py-2 dark:border-edge-subtle\">\n <button\n type=\"button\"\n className=\"flex min-w-0 flex-1 items-center gap-2 text-left text-sm font-semibold text-fg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/40 transition-transform duration-150 ease-out active:scale-[0.99] motion-reduce:transition-none motion-reduce:active:scale-100\"\n onClick={() => toggleExpand(id)}\n >\n {isEx ? (\n <ChevronDown className=\"size-4 shrink-0 text-fg-muted\" />\n ) : (\n <ChevronRight className=\"size-4 shrink-0 text-fg-muted\" />\n )}\n <span className=\"truncate\">{id}</span>\n {nModels > 0 ? (\n <span className=\"shrink-0 rounded-full bg-accent px-2 py-0.5 text-[10px] font-medium text-white\">\n {nModels}\n </span>\n ) : null}\n {keyType ? (\n <span\n className={cn(\n 'shrink-0 rounded-full px-2 py-0.5 text-[10px] font-medium',\n keyType === 'shell' && 'bg-blue-100 text-blue-800 dark:bg-blue-950 dark:text-blue-200',\n keyType === 'env' && 'bg-emerald-100 text-emerald-800 dark:bg-emerald-950 dark:text-emerald-200',\n keyType === 'literal' && 'bg-surface-hover text-fg-muted dark:bg-surface-active',\n )}\n >\n {keyType === 'shell' ? ms.badgeShell : keyType === 'env' ? ms.badgeEnv : ms.badgeLiteral}\n </span>\n ) : null}\n </button>\n <button\n type=\"button\"\n className={cn(\n 'rounded-lg p-1.5 text-fg-muted hover:bg-surface-base hover:text-red-600 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/40 dark:hover:text-red-400',\n interaction.press,\n )}\n onClick={() => removeProv(id)}\n aria-label={ms.removeProvider}\n >\n <Trash2 className=\"size-4\" />\n </button>\n </div>\n\n {isEx ? (\n <div className=\"space-y-4 p-3\">\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <div>\n <label className=\"mb-1 block text-xs font-medium text-fg-muted\">{ms.baseUrl}</label>\n <input\n className={inputClassName()}\n value={prov.baseUrl || ''}\n onChange={(e) =>\n setConfig((c) => updateProvider(c, id, { baseUrl: e.target.value }))\n }\n />\n </div>\n <div>\n <label className=\"mb-1 block text-xs font-medium text-fg-muted\">{ms.apiType}</label>\n <select\n className={selectClassName()}\n value={prov.api || 'openai-completions'}\n onChange={(e) =>\n setConfig((c) =>\n updateProvider(c, id, { api: e.target.value as ApiType }),\n )\n }\n >\n {API_TYPE_OPTIONS.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </div>\n </div>\n\n <div>\n <label className=\"mb-1 block text-xs font-medium text-fg-muted\">{ms.apiKey}</label>\n <div className=\"flex flex-wrap gap-2\">\n <input\n className={cn(inputClassName(), 'min-w-0 flex-1')}\n type={pwVisible ? 'text' : 'password'}\n autoComplete=\"off\"\n value={prov.apiKey || ''}\n onChange={(e) => {\n const v = e.target.value;\n setConfig((c) => updateProvider(c, id, { apiKey: v }));\n setTestResults((prev) => {\n const next = new Map(prev);\n next.delete(id);\n return next;\n });\n }}\n placeholder={ms.apiKeyPlaceholder}\n />\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"px-2 py-1 text-xs\"\n onClick={() => toggleShowPw(id)}\n >\n {pwVisible ? (\n <>\n <EyeOff className=\"mr-1 size-3.5\" />\n {ms.hide}\n </>\n ) : (\n <>\n <Eye className=\"mr-1 size-3.5\" />\n {ms.show}\n </>\n )}\n </Button>\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"px-2 py-1 text-xs\"\n onClick={() => runTestKey(id, prov.apiKey || '')}\n >\n {ms.testKey}\n </Button>\n </div>\n {testResult ? (\n <p\n className={cn(\n 'mt-1 text-xs',\n testResult.error ? 'text-red-600 dark:text-red-400' : 'text-emerald-700 dark:text-emerald-400',\n )}\n >\n {testResult.error\n ? `${ms.testError}: ${testResult.error}`\n : `${ms.testOk} (${testResult.type}): ${maskApiKey(testResult.resolved || '')}`}\n </p>\n ) : null}\n <p className=\"mt-1 text-xs text-fg-subtle\">{ms.apiKeyHint}</p>\n </div>\n\n <label className=\"flex cursor-pointer items-center gap-2 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"ui-checkbox\"\n checked={prov.authHeader || false}\n onChange={(e) =>\n setConfig((c) => updateProvider(c, id, { authHeader: e.target.checked }))\n }\n />\n {ms.authHeader}\n </label>\n\n <div className=\"border-t border-edge-subtle pt-3 dark:border-edge\">\n <div className=\"mb-2 flex items-center justify-between gap-2\">\n <span className=\"text-sm font-semibold text-fg\">{ms.modelsSection}</span>\n <Button\n type=\"button\"\n variant=\"primary\"\n className=\"px-2 py-1 text-xs\"\n onClick={() => openModelDialog(id, null, true)}\n >\n <Plus className=\"mr-1 size-3.5\" />\n {ms.addModel}\n </Button>\n </div>\n {(prov.models || []).length === 0 ? (\n <p className=\"text-xs text-fg-muted\">{ms.modelsEmpty}</p>\n ) : (\n <ul className=\"space-y-2\">\n {(prov.models || []).map((mod) => (\n <li\n key={mod.id}\n className=\"flex items-center justify-between gap-2 rounded-lg border border-edge-subtle bg-surface-base px-3 py-2 dark:border-edge\"\n >\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-medium text-fg\">{mod.id}</div>\n {mod.name && mod.name !== mod.id ? (\n <div className=\"truncate text-xs text-fg-muted\">{mod.name}</div>\n ) : null}\n </div>\n <div className=\"flex shrink-0 gap-1\">\n <button\n type=\"button\"\n className={cn(\n 'rounded-lg p-1.5 text-fg-muted hover:bg-surface-panel hover:text-fg',\n interaction.press,\n )}\n onClick={() => openModelDialog(id, mod, false)}\n aria-label={ms.editModel}\n >\n <Pencil className=\"size-4\" />\n </button>\n <button\n type=\"button\"\n className={cn(\n 'rounded-lg p-1.5 text-fg-muted hover:bg-surface-panel hover:text-red-600 dark:hover:text-red-400',\n interaction.press,\n )}\n onClick={() => {\n if (!window.confirm(ms.removeModelConfirm.replace('{{id}}', mod.id))) return;\n setConfig((c) => {\n const p = c.providers[id];\n if (!p) return c;\n return updateProvider(c, id, {\n models: (p.models || []).filter((mm) => mm.id !== mod.id),\n });\n });\n }}\n aria-label={ms.removeModel}\n >\n <Trash2 className=\"size-4\" />\n </button>\n </div>\n </li>\n ))}\n </ul>\n )}\n </div>\n </div>\n ) : null}\n </section>\n );\n })}\n </div>\n );\n}\n\ntype ModelsSettingsEmptyStateProps = {\n ms: ModelsSettingsMessages;\n openAddProvider: (preset: string | null) => void;\n};\n\nexport function ModelsSettingsEmptyState({ ms, openAddProvider }: ModelsSettingsEmptyStateProps) {\n return (\n <div className=\"flex flex-col items-center rounded-xl border-2 border-dashed border-edge-subtle bg-surface-panel px-6 py-12 text-center dark:border-edge\">\n <div className=\"mb-4 flex size-14 items-center justify-center rounded-full border border-edge bg-surface-base dark:border-edge\">\n <Cpu className=\"size-7 text-accent\" strokeWidth={1.5} />\n </div>\n <h2 className=\"mb-1 text-base font-semibold text-fg\">{ms.emptyTitle}</h2>\n <p className=\"mb-6 max-w-md text-sm text-fg-muted\">{ms.emptyDesc}</p>\n <Button\n type=\"button\"\n className=\"mb-6 bg-accent text-white hover:bg-accent/90\"\n onClick={() => openAddProvider(null)}\n >\n <Plus className=\"mr-1 size-4\" />\n {ms.emptyCta}\n </Button>\n <div className=\"flex flex-wrap justify-center gap-2\">\n <button\n type=\"button\"\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-full border border-edge bg-surface-base px-3 py-1.5 text-xs text-fg hover:border-accent hover:text-accent dark:border-edge',\n interaction.transition,\n interaction.focusRingBase,\n interaction.press,\n )}\n onClick={() => openAddProvider('ollama')}\n >\n <Zap className=\"size-3.5\" aria-hidden />\n {ms.presetOllama}\n </button>\n <button\n type=\"button\"\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-full border border-edge bg-surface-base px-3 py-1.5 text-xs text-fg hover:border-accent hover:text-accent dark:border-edge',\n interaction.transition,\n interaction.focusRingBase,\n interaction.press,\n )}\n onClick={() => openAddProvider('openrouter')}\n >\n <Box className=\"size-3.5\" aria-hidden />\n {ms.presetOpenRouter}\n </button>\n <button\n type=\"button\"\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-full border border-edge bg-surface-base px-3 py-1.5 text-xs text-fg hover:border-accent hover:text-accent dark:border-edge',\n interaction.transition,\n interaction.focusRingBase,\n interaction.press,\n )}\n onClick={() => openAddProvider('lmstudio')}\n >\n <Cpu className=\"size-3.5\" aria-hidden />\n {ms.presetLmStudio}\n </button>\n <button\n type=\"button\"\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-full border border-edge bg-surface-base px-3 py-1.5 text-xs text-fg hover:border-accent hover:text-accent dark:border-edge',\n interaction.transition,\n interaction.focusRingBase,\n interaction.press,\n )}\n onClick={() => openAddProvider('zhipuCn')}\n >\n <Zap className=\"size-3.5\" aria-hidden />\n {ms.presetZhipuCn}\n </button>\n <button\n type=\"button\"\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-full border border-edge bg-surface-base px-3 py-1.5 text-xs text-fg hover:border-accent hover:text-accent dark:border-edge',\n interaction.transition,\n interaction.focusRingBase,\n interaction.press,\n )}\n onClick={() => openAddProvider('zaiGeneral')}\n >\n <Box className=\"size-3.5\" aria-hidden />\n {ms.presetZaiGeneral}\n </button>\n </div>\n </div>\n );\n}\n","import {\n AlertCircle,\n ExternalLink,\n Loader2,\n Plus,\n RefreshCw,\n} from 'lucide-react';\nimport { useCallback, useEffect, useMemo, useReducer, type Dispatch, type SetStateAction } from 'react';\n\nimport { createFormDraftReducer, uiPatchReducer } from '@/lib/settings-form-draft';\n\nimport { Button } from '@/components/ui/button';\nimport { useSaveBarRegistration } from '@/features/settings/save-bar/use-save-bar-registration';\nimport { cn } from '@/lib/cn';\nimport { interaction } from '@/lib/interaction';\nimport { messages } from '@/i18n/messages';\nimport { docsGuidePageUrl } from '@/navigation';\nimport { useGatewayStore } from '@/stores/gateway-store';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nimport {\n fetchModelsJson,\n normalizeModelsJsonConfig,\n reloadModelsJson,\n saveModelsJson,\n testApiKey,\n validateModelsJson,\n type CustomModel,\n type ModelsJsonConfig,\n type ProviderConfig,\n type ValidationResult,\n} from '../models-json-api';\nimport { useAgentDefaultsForm } from '../agents/use-agent-defaults-form';\n\nimport { ModelEditDialogContent } from './models-model-edit-dialog';\nimport { ProviderAddDialog } from './models-provider-add-dialog';\nimport {\n ModelsProvidersList,\n ModelsSettingsEmptyState,\n type ModelsTestResult,\n} from './models-providers-list';\nimport { addProviderEntry, inputClassName, removeProvider, updateProvider } from './models-settings-lib';\n\nconst modelsFormReducer = createFormDraftReducer<ModelsJsonConfig>();\n\ntype ModelsUi = {\n path: string;\n loadMetaError: string | undefined;\n loading: boolean;\n saving: boolean;\n validating: boolean;\n reloading: boolean;\n error: string | null;\n saveOk: boolean;\n validation: ValidationResult | null;\n expanded: Set<string>;\n editorMode: 'guided' | 'expert';\n rawText: string;\n rawError: string | null;\n showPw: Set<string>;\n testResults: Map<string, ModelsTestResult>;\n providerDialogOpen: boolean;\n providerPreset: string | null;\n modelDialogOpen: boolean;\n modelDialogCtx: { providerId: string; model: CustomModel | null; isNew: boolean } | null;\n};\n\nconst initialModelsUi: ModelsUi = {\n path: '',\n loadMetaError: undefined,\n loading: true,\n saving: false,\n validating: false,\n reloading: false,\n error: null,\n saveOk: false,\n validation: null,\n expanded: new Set(),\n editorMode: 'guided',\n rawText: '',\n rawError: null,\n showPw: new Set(),\n testResults: new Map(),\n providerDialogOpen: false,\n providerPreset: null,\n modelDialogOpen: false,\n modelDialogCtx: null,\n};\n\n/** See `WebSearchSettingsPanel` for the embedded-mode contract. */\nexport function ModelsSettingsPanel({ embedded = false }: { embedded?: boolean } = {}) {\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const ms = m.modelsSettings;\n const agentVm = useAgentDefaultsForm(m.agentSettings);\n const token = useGatewayStore((st) => st.token);\n const hasToken = Boolean(token);\n\n const [formDraft, dispatchForm] = useReducer(modelsFormReducer, {\n form: { providers: {} },\n baseline: { providers: {} },\n });\n const config = formDraft.form ?? { providers: {} };\n const baseline = formDraft.baseline ?? { providers: {} };\n const [ui, dispatchUi] = useReducer(uiPatchReducer<ModelsUi>, initialModelsUi);\n const {\n path,\n loadMetaError,\n loading,\n saving,\n validating,\n reloading,\n error,\n saveOk,\n validation,\n expanded,\n editorMode,\n rawText,\n rawError,\n showPw,\n testResults,\n providerDialogOpen,\n providerPreset,\n modelDialogOpen,\n modelDialogCtx,\n } = ui;\n\n const setConfig = useCallback(\n (updater: ModelsJsonConfig | ((prev: ModelsJsonConfig) => ModelsJsonConfig)) => {\n dispatchForm({\n type: 'set-form',\n updater: (prev) => (typeof updater === 'function' ? updater(prev) : updater),\n });\n },\n [],\n );\n\n const load = useCallback(async (opts?: { skipFullPageLoading?: boolean }) => {\n const showFullPageLoading = !opts?.skipFullPageLoading;\n if (showFullPageLoading) {\n dispatchUi({ type: 'patch', patch: { loading: true } });\n }\n dispatchUi({ type: 'patch', patch: { error: null } });\n try {\n const st = await fetchModelsJson();\n const norm = normalizeModelsJsonConfig(st.config);\n dispatchForm({ type: 'sync', value: norm });\n dispatchUi({\n type: 'patch',\n patch: {\n path: st.path,\n loadMetaError: st.loadError,\n validation: null,\n saveOk: false,\n },\n });\n } catch (e) {\n dispatchUi({ type: 'patch', patch: { error: e instanceof Error ? e.message : ms.loadError } });\n dispatchForm({ type: 'sync', value: { providers: {} } });\n } finally {\n if (showFullPageLoading) {\n dispatchUi({ type: 'patch', patch: { loading: false } });\n }\n }\n }, [ms.loadError]);\n\n useEffect(() => {\n if (!hasToken) {\n dispatchUi({ type: 'patch', patch: { loading: false } });\n return;\n }\n void load();\n }, [hasToken, load]);\n\n const dirty = useMemo(\n () => JSON.stringify(config) !== JSON.stringify(baseline),\n [config, baseline],\n );\n\n // M3.4 follow-up: the chat-model fallback chain moved to\n // /settings/agent-defaults?tab=chat, so this panel no longer renders or\n // saves agent defaults. We still load `useAgentDefaultsForm` above\n // because the agent-defaults page may not be mounted yet — invoking the\n // hook here keeps the form's SWR cache warm for fast cross-tab load —\n // but the dirty/save coordination below is intentionally left in place\n // and degrades to no-op (`agentVm.dirty` stays false).\n const combinedDirty = dirty || agentVm.dirty;\n\n const stats = useMemo(() => {\n const ids = Object.keys(config.providers);\n let models = 0;\n for (const p of Object.values(config.providers)) {\n models += p.models?.length ?? 0;\n }\n return { providers: ids.length, models };\n }, [config.providers]);\n\n const toggleExpand = (id: string) => {\n const next = new Set(expanded);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n dispatchUi({ type: 'patch', patch: { expanded: next } });\n };\n\n const toggleShowPw = (id: string) => {\n const next = new Set(showPw);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n dispatchUi({ type: 'patch', patch: { showPw: next } });\n };\n\n const syncRawFromConfig = useCallback(() => {\n dispatchUi({\n type: 'patch',\n patch: { rawText: JSON.stringify(config, null, 2), rawError: null },\n });\n }, [config]);\n\n const selectEditorMode = useCallback(\n (mode: 'guided' | 'expert') => {\n dispatchUi({\n type: 'patch',\n patch:\n mode === 'expert'\n ? { editorMode: mode, rawText: JSON.stringify(config, null, 2), rawError: null }\n : { editorMode: mode },\n });\n },\n [config],\n );\n\n const applyRawJson = () => {\n try {\n const parsed = JSON.parse(rawText) as unknown;\n const norm = normalizeModelsJsonConfig(parsed);\n setConfig(norm);\n dispatchUi({ type: 'patch', patch: { rawError: null } });\n } catch {\n dispatchUi({ type: 'patch', patch: { rawError: ms.jsonParseError } });\n }\n };\n\n const runValidate = async () => {\n dispatchUi({ type: 'patch', patch: { validating: true, error: null } });\n try {\n const r = await validateModelsJson(config);\n dispatchUi({ type: 'patch', patch: { validation: r } });\n } catch (e) {\n dispatchUi({\n type: 'patch',\n patch: { error: e instanceof Error ? e.message : ms.validateError },\n });\n } finally {\n dispatchUi({ type: 'patch', patch: { validating: false } });\n }\n };\n\n const runSave = async () => {\n if (saving || agentVm.saving) return;\n const hadJsonDirty = dirty;\n const hadAgentDirty = agentVm.dirty;\n if (!hadJsonDirty && !hadAgentDirty) return;\n\n dispatchUi({ type: 'patch', patch: { error: null, saveOk: false } });\n try {\n if (hadJsonDirty) {\n dispatchUi({ type: 'patch', patch: { saving: true } });\n try {\n await saveModelsJson(config);\n dispatchForm({ type: 'saved', value: structuredClone(config) });\n dispatchUi({ type: 'patch', patch: { validation: null } });\n } finally {\n dispatchUi({ type: 'patch', patch: { saving: false } });\n }\n }\n if (hadAgentDirty && agentVm.form) {\n const agentOk = await agentVm.save();\n if (!agentOk) {\n throw new Error(m.agentSettings.saveError);\n }\n }\n dispatchUi({ type: 'patch', patch: { saveOk: true } });\n } catch (e) {\n dispatchUi({ type: 'patch', patch: { error: e instanceof Error ? e.message : ms.saveError } });\n }\n };\n\n const runDiscard = useCallback(() => {\n dispatchForm({ type: 'discard' });\n dispatchUi({\n type: 'patch',\n patch: {\n validation: null,\n saveOk: false,\n error: null,\n ...(editorMode === 'expert'\n ? { rawText: JSON.stringify(baseline, null, 2), rawError: null }\n : {}),\n },\n });\n agentVm.discard();\n }, [baseline, editorMode, agentVm]);\n\n useSaveBarRegistration({\n id: 'models',\n dirty: combinedDirty,\n saving: saving || agentVm.saving,\n save: runSave,\n discard: runDiscard,\n });\n\n const runReload = async () => {\n dispatchUi({ type: 'patch', patch: { reloading: true, error: null } });\n try {\n await reloadModelsJson();\n await load({ skipFullPageLoading: true });\n } catch (e) {\n dispatchUi({\n type: 'patch',\n patch: { error: e instanceof Error ? e.message : ms.reloadError },\n });\n } finally {\n dispatchUi({ type: 'patch', patch: { reloading: false } });\n }\n };\n\n const runTestKey = async (providerId: string, value: string) => {\n try {\n const r = await testApiKey(value);\n const next = new Map(testResults);\n next.set(providerId, r);\n dispatchUi({ type: 'patch', patch: { testResults: next } });\n } catch (e) {\n const next = new Map(testResults);\n next.set(providerId, {\n type: 'error',\n error: e instanceof Error ? e.message : 'Error',\n });\n dispatchUi({ type: 'patch', patch: { testResults: next } });\n }\n };\n\n const openAddProvider = (preset: string | null = null) => {\n dispatchUi({ type: 'patch', patch: { providerPreset: preset, providerDialogOpen: true } });\n };\n\n const onProviderAdded = (providerId: string, prov: ProviderConfig) => {\n setConfig((c) => addProviderEntry(c, providerId, prov));\n dispatchUi({ type: 'patch', patch: { expanded: new Set(expanded).add(providerId) } });\n };\n\n const removeProv = (providerId: string) => {\n if (!window.confirm(ms.removeProviderConfirm.replace('{{id}}', providerId))) return;\n setConfig((c) => removeProvider(c, providerId));\n const next = new Map(testResults);\n next.delete(providerId);\n dispatchUi({ type: 'patch', patch: { testResults: next } });\n };\n\n const openModelDialog = (providerId: string, model: CustomModel | null, isNew: boolean) => {\n dispatchUi({\n type: 'patch',\n patch: { modelDialogCtx: { providerId, model, isNew }, modelDialogOpen: true },\n });\n };\n\n const patchTestResults = useCallback<Dispatch<SetStateAction<Map<string, ModelsTestResult>>>>(\n (value) => {\n const next = typeof value === 'function' ? value(testResults) : value;\n dispatchUi({ type: 'patch', patch: { testResults: next } });\n },\n [testResults],\n );\n\n const onModelSaved = (updated: CustomModel) => {\n if (!modelDialogCtx) return;\n const { providerId, isNew } = modelDialogCtx;\n setConfig((c) => {\n const p = c.providers[providerId];\n if (!p) return c;\n const models = p.models || [];\n if (isNew) {\n return updateProvider(c, providerId, { models: [...models, updated] });\n }\n return updateProvider(c, providerId, {\n models: models.map((mm) => (mm.id === updated.id ? updated : mm)),\n });\n });\n };\n\n const outerClass = embedded\n ? 'flex flex-col gap-4'\n : 'mx-auto flex w-full max-w-app-main flex-col gap-4 px-4 py-8';\n const compactClass = embedded\n ? 'flex flex-col gap-3'\n : 'mx-auto flex w-full max-w-app-main flex-col gap-3 px-4 py-8';\n\n if (!hasToken) {\n return (\n <div className={compactClass}>\n {embedded ? null : <h1 className=\"text-lg font-semibold text-fg\">{m.settingsSections.models}</h1>}\n <p className=\"text-sm text-fg-muted\">{ms.needToken}</p>\n </div>\n );\n }\n\n return (\n <div className={outerClass}>\n {embedded ? null : (\n <div className=\"flex flex-col gap-1\">\n <h1 className=\"text-lg font-semibold text-fg\">{m.settingsSections.models}</h1>\n <p className=\"text-sm text-fg-muted\">{ms.subtitle}</p>\n <a\n href={docsGuidePageUrl(language, 'models')}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"inline-flex items-center gap-1 text-sm text-accent hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/40\"\n >\n {ms.docsLink}\n <ExternalLink className=\"size-3.5\" />\n </a>\n </div>\n )}\n\n {loadMetaError ? (\n <div\n className=\"flex items-start gap-2 rounded-lg border border-amber-200 bg-amber-50 px-3 py-2 text-sm text-amber-900 dark:border-amber-800 dark:bg-amber-950/40 dark:text-amber-100\"\n role=\"status\"\n >\n <AlertCircle className=\"mt-0.5 size-4 shrink-0\" />\n <span>{ms.loadFileWarning}: {loadMetaError}</span>\n </div>\n ) : null}\n\n {path ? (\n <p className=\"text-xs text-fg-subtle\">\n {ms.filePath}: <code className=\"rounded bg-surface-base px-1 py-0.5 font-mono text-fg-muted\">{path}</code>\n </p>\n ) : null}\n\n <div className=\"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between\">\n <div\n className=\"inline-flex rounded-lg border border-edge-subtle bg-surface-panel p-0.5\"\n role=\"tablist\"\n aria-label={ms.modeGuided}\n >\n {(['guided', 'expert'] as const).map((mode) => (\n <button\n key={mode}\n type=\"button\"\n role=\"tab\"\n aria-selected={editorMode === mode}\n className={cn(\n 'rounded-md px-3 py-1.5 text-sm font-medium transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent',\n interaction.press,\n editorMode === mode\n ? 'bg-accent-soft text-accent-fg'\n : 'text-fg-muted hover:bg-surface-hover hover:text-fg',\n )}\n onClick={() => {\n selectEditorMode(mode);\n dispatchUi({ type: 'patch', patch: { rawError: null } });\n }}\n >\n {mode === 'guided' ? ms.modeGuided : ms.modeExpert}\n </button>\n ))}\n </div>\n <p className=\"text-xs text-fg-muted\">\n {editorMode === 'guided' ? ms.modeGuidedHint : ms.modeExpertHint}\n </p>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button\n type=\"button\"\n className=\"bg-accent text-white hover:bg-accent/90\"\n onClick={() => openAddProvider(null)}\n disabled={loading}\n >\n <Plus className=\"mr-1 size-4\" />\n {ms.addProvider}\n </Button>\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"inline-flex min-h-9 min-w-[7.5rem] justify-center\"\n onClick={runValidate}\n disabled={loading || validating}\n >\n {validating ? (\n <>\n <Loader2 className=\"mr-1 size-4 animate-spin\" />\n {ms.validating}\n </>\n ) : (\n ms.validate\n )}\n </Button>\n {/* Hide Discard / Save in embedded mode — global Save bar handles them. */}\n {embedded ? null : (\n <>\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"inline-flex min-h-9 min-w-[7.5rem] justify-center\"\n onClick={runDiscard}\n disabled={loading || saving || agentVm.saving || !combinedDirty}\n >\n {ms.discard}\n </Button>\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"inline-flex min-h-9 min-w-[7.5rem] justify-center\"\n onClick={() => void runSave()}\n disabled={loading || saving || agentVm.saving || !combinedDirty}\n >\n {saving || agentVm.saving ? (\n <>\n <Loader2 className=\"mr-1 size-4 animate-spin\" />\n {ms.saving}\n </>\n ) : (\n ms.save\n )}\n </Button>\n </>\n )}\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"inline-flex min-h-9 min-w-[8.5rem] justify-center\"\n onClick={runReload}\n disabled={loading || reloading}\n >\n {reloading ? (\n <>\n <Loader2 className=\"mr-1 size-4 animate-spin\" />\n {ms.reloading}\n </>\n ) : (\n <>\n <RefreshCw className=\"mr-1 size-4\" />\n {ms.reload}\n </>\n )}\n </Button>\n <div className=\"ml-auto flex items-center gap-2 rounded-lg border border-edge-subtle bg-surface-panel px-3 py-1.5 text-sm dark:border-edge\">\n <span className=\"text-fg-muted\">\n {ms.statsProviders.replace('{{count}}', String(stats.providers))}\n </span>\n <span className=\"text-fg-subtle\">|</span>\n <span className=\"text-fg-muted\">\n {ms.statsModels.replace('{{count}}', String(stats.models))}\n </span>\n </div>\n </div>\n\n {combinedDirty && !embedded ? <p className=\"text-xs text-amber-800 dark:text-amber-200\">{ms.unsavedHint}</p> : null}\n {saveOk || agentVm.saveOk ? (\n <p className=\"text-xs text-emerald-700 dark:text-emerald-400\" role=\"status\">\n {ms.saved}\n </p>\n ) : null}\n {error ? (\n <p className=\"flex items-center gap-1 text-sm text-red-600 dark:text-red-400\" role=\"alert\">\n <AlertCircle className=\"size-4 shrink-0\" />\n {error}\n </p>\n ) : null}\n {agentVm.error ? (\n <p className=\"flex items-center gap-1 text-sm text-red-600 dark:text-red-400\" role=\"alert\">\n <AlertCircle className=\"size-4 shrink-0\" />\n {agentVm.error}\n </p>\n ) : null}\n\n {validation && validation.errors.length > 0 ? (\n <div\n className=\"rounded-lg border border-amber-200 bg-amber-50/80 px-3 py-2 dark:border-amber-800 dark:bg-amber-950/30\"\n role=\"status\"\n >\n <p className=\"mb-1 text-sm font-medium text-amber-950 dark:text-amber-100\">\n {validation.valid ? ms.validationWarnings : ms.validationErrors}\n </p>\n <ul className=\"list-inside list-disc space-y-0.5 text-xs text-amber-900 dark:text-amber-200\">\n {validation.errors.map((err) => (\n <li key={`${err.path}-${err.severity}-${err.message}`}>\n {err.path}: {err.message} ({err.severity})\n </li>\n ))}\n </ul>\n </div>\n ) : null}\n\n {loading ? (\n <div className=\"flex items-center gap-2 text-sm text-fg-muted\">\n <Loader2 className=\"size-4 animate-spin\" />\n {ms.loading}\n </div>\n ) : editorMode === 'expert' ? (\n <div className=\"flex flex-col gap-2\">\n <textarea\n className={cn(\n inputClassName(),\n 'min-h-[320px] resize-y font-mono text-xs leading-relaxed',\n )}\n value={rawText}\n onChange={(e) => dispatchUi({ type: 'patch', patch: { rawText: e.target.value } })}\n spellCheck={false}\n />\n {rawError ? <p className=\"text-xs text-red-600 dark:text-red-400\">{rawError}</p> : null}\n <div className=\"flex gap-2\">\n <Button type=\"button\" variant=\"secondary\" onClick={syncRawFromConfig}>\n {ms.jsonReset}\n </Button>\n <Button type=\"button\" className=\"bg-accent text-white hover:bg-accent/90\" onClick={applyRawJson}>\n {ms.jsonApply}\n </Button>\n </div>\n </div>\n ) : Object.keys(config.providers).length === 0 ? (\n <ModelsSettingsEmptyState ms={ms} openAddProvider={openAddProvider} />\n ) : (\n <ModelsProvidersList\n config={config}\n setConfig={setConfig}\n expanded={expanded}\n toggleExpand={toggleExpand}\n showPw={showPw}\n toggleShowPw={toggleShowPw}\n testResults={testResults}\n runTestKey={runTestKey}\n ms={ms}\n removeProv={removeProv}\n openModelDialog={openModelDialog}\n setTestResults={patchTestResults}\n />\n )}\n\n <ProviderAddDialog\n open={providerDialogOpen}\n onOpenChange={(open) => dispatchUi({ type: 'patch', patch: { providerDialogOpen: open } })}\n presetKey={providerPreset}\n onConfirm={onProviderAdded}\n m={ms}\n />\n\n <ModelEditDialogContent\n open={modelDialogOpen}\n onOpenChange={(o) => {\n dispatchUi({\n type: 'patch',\n patch: { modelDialogOpen: o, ...(o ? {} : { modelDialogCtx: null }) },\n });\n }}\n providerId={modelDialogCtx?.providerId ?? null}\n model={modelDialogCtx?.model ?? null}\n isNew={modelDialogCtx?.isNew ?? false}\n onSave={onModelSaved}\n m={ms}\n />\n </div>\n );\n}\n","import { apiFetch } from '@/lib/fetch';\nimport { apiUrl } from '@/lib/url';\n\nexport interface OAuthStartResult {\n sessionId: string;\n provider: string;\n status: string;\n}\n\nexport interface OAuthSessionStatus {\n sessionId: string;\n provider: string;\n status: 'pending' | 'waiting_auth' | 'waiting_code' | 'completed' | 'failed' | 'cancelled';\n authUrl?: string;\n instructions?: string;\n message?: string;\n error?: string;\n expiresAt: number;\n}\n\nexport async function startAsyncOAuthLogin(provider: string): Promise<OAuthStartResult> {\n const res = await apiFetch(apiUrl('/api/auth/oauth-async/start'), {\n method: 'POST',\n body: JSON.stringify({ provider }),\n });\n if (!res.ok) {\n const err = (await res.json().catch(() => ({}))) as { error?: string };\n throw new Error(err.error || `OAuth start failed: ${res.status}`);\n }\n const data = (await res.json()) as { payload: OAuthStartResult };\n return data.payload;\n}\n\nexport async function fetchOAuthSessionStatus(sessionId: string): Promise<OAuthSessionStatus> {\n const res = await apiFetch(apiUrl(`/api/auth/oauth-async/${encodeURIComponent(sessionId)}/status`));\n if (!res.ok) {\n throw new Error(`OAuth status: ${res.status}`);\n }\n const data = (await res.json()) as { payload: OAuthSessionStatus };\n return data.payload;\n}\n\nexport async function submitOAuthCode(sessionId: string, code: string): Promise<void> {\n const res = await apiFetch(apiUrl(`/api/auth/oauth-async/${encodeURIComponent(sessionId)}/code`), {\n method: 'POST',\n body: JSON.stringify({ code }),\n });\n if (!res.ok) {\n const err = (await res.json().catch(() => ({}))) as { error?: string };\n throw new Error(err.error || `Submit code failed: ${res.status}`);\n }\n}\n\nexport async function cancelOAuth(sessionId: string): Promise<void> {\n const res = await apiFetch(apiUrl(`/api/auth/oauth-async/${encodeURIComponent(sessionId)}/cancel`), {\n method: 'POST',\n });\n if (!res.ok) {\n throw new Error(`Cancel OAuth failed: ${res.status}`);\n }\n}\n\nexport async function cleanupOAuthSession(sessionId: string): Promise<void> {\n const res = await apiFetch(apiUrl(`/api/auth/oauth-async/${encodeURIComponent(sessionId)}`), {\n method: 'DELETE',\n });\n if (!res.ok) {\n throw new Error(`Cleanup session failed: ${res.status}`);\n }\n}\n\nexport async function revokeOAuth(provider: string): Promise<void> {\n const res = await apiFetch(apiUrl(`/api/auth/oauth/${encodeURIComponent(provider)}`), {\n method: 'DELETE',\n });\n if (!res.ok) {\n throw new Error(`Revoke OAuth failed: ${res.status}`);\n }\n}\n","import * as Popover from '@radix-ui/react-popover';\nimport { ExternalLink, Info, X } from 'lucide-react';\n\nimport { cn } from '@/lib/cn';\nimport { ghostIconButton } from '@/lib/interaction';\nimport { SETTINGS_SHELL_POPOVER_Z } from '@/lib/settings-shell-dialog-layer';\nimport type { StoredLanguage } from '@/lib/storage';\n\nimport { PROVIDER_ENRICHMENT } from './provider-enrichment';\n\ninterface ProviderInfoPopoverProps {\n providerId: string;\n language: StoredLanguage;\n}\n\nexport function ProviderInfoPopover({ providerId, language }: ProviderInfoPopoverProps) {\n const enrichment = PROVIDER_ENRICHMENT[providerId];\n if (!enrichment) return null;\n\n const isZh = language === 'zh';\n const description = isZh && enrichment.descriptionZh ? enrichment.descriptionZh : enrichment.description;\n if (!description) return null;\n\n return (\n <Popover.Root>\n <Popover.Trigger asChild>\n <button\n type=\"button\"\n className={cn(ghostIconButton, 'rounded p-0.5')}\n aria-label={isZh ? `${providerId} 详情` : `${providerId} info`}\n >\n <Info className=\"size-3.5\" aria-hidden />\n </button>\n </Popover.Trigger>\n\n <Popover.Portal>\n <Popover.Content\n side=\"right\"\n align=\"start\"\n sideOffset={6}\n className={cn(\n 'w-64 rounded-xl border border-edge bg-surface-panel p-3 shadow-md',\n SETTINGS_SHELL_POPOVER_Z,\n 'data-[state=open]:animate-in data-[state=closed]:animate-out',\n 'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n 'data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',\n )}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <p className=\"text-xs font-semibold text-fg\">{providerId}</p>\n <Popover.Close asChild>\n <button\n type=\"button\"\n className={cn(ghostIconButton, 'shrink-0 rounded p-0.5')}\n aria-label={isZh ? '关闭' : 'Close'}\n >\n <X className=\"size-3.5\" aria-hidden />\n </button>\n </Popover.Close>\n </div>\n\n <p className=\"mt-1.5 text-xs leading-relaxed text-fg-muted\">{description}</p>\n\n {enrichment.bestFor && enrichment.bestFor.length > 0 ? (\n <div className=\"mt-2\">\n <p className=\"text-[10px] font-medium uppercase tracking-wide text-fg-subtle\">\n {isZh ? '适合场景' : 'Best for'}\n </p>\n <div className=\"mt-1 flex flex-wrap gap-1\">\n {enrichment.bestFor.map((tag) => (\n <span\n key={tag}\n className=\"rounded bg-surface-hover px-1.5 py-0.5 text-[10px] font-medium text-fg-muted\"\n >\n {tag}\n </span>\n ))}\n </div>\n </div>\n ) : null}\n\n {enrichment.freeTier !== undefined ? (\n <div className=\"mt-2\">\n <p className=\"text-[10px] font-medium uppercase tracking-wide text-fg-subtle\">\n {isZh ? '免费额度' : 'Free tier'}\n </p>\n <p className=\"mt-0.5 text-xs text-fg-muted\">\n {enrichment.freeTier\n ? enrichment.freeTierNote ?? (isZh ? '有免费额度' : 'Available')\n : isZh\n ? '无免费额度(按量付费)'\n : 'None (pay-as-you-go)'}\n </p>\n </div>\n ) : null}\n\n {enrichment.pricingUrl || enrichment.docsUrl ? (\n <div className=\"mt-2.5 flex gap-3\">\n {enrichment.pricingUrl ? (\n <a\n href={enrichment.pricingUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-0.5 text-xs text-accent-fg hover:underline\"\n >\n {isZh ? '定价' : 'Pricing'}\n <ExternalLink className=\"size-3\" aria-hidden />\n </a>\n ) : null}\n {enrichment.docsUrl ? (\n <a\n href={enrichment.docsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-0.5 text-xs text-accent-fg hover:underline\"\n >\n {isZh ? '文档' : 'Docs'}\n <ExternalLink className=\"size-3\" aria-hidden />\n </a>\n ) : null}\n </div>\n ) : null}\n\n <Popover.Arrow className=\"fill-edge\" />\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n );\n}\n","import type { ProviderActiveKeySource, ProviderCategory, ProviderRowModel } from '@/features/settings/providers-api';\nimport type { ProvidersSettingsMessages } from '@/i18n/messages';\n\nexport const CATEGORY_ORDER: ProviderCategory[] = [\n 'common',\n 'specialty',\n 'enterprise',\n 'oauth',\n 'extension',\n];\n\nexport function groupByCategory(rows: ProviderRowModel[]): Map<ProviderCategory, ProviderRowModel[]> {\n const map = new Map<ProviderCategory, ProviderRowModel[]>();\n for (const c of CATEGORY_ORDER) map.set(c, []);\n for (const r of rows) {\n const cat = r.category || 'specialty';\n const list = map.get(cat) ?? [];\n list.push(r);\n map.set(cat, list);\n }\n return map;\n}\n\nexport function interpolate(template: string, params: Record<string, string>): string {\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key) => String(params[key] ?? ''));\n}\n\nexport function activeSourceLabel(\n labels: ProvidersSettingsMessages,\n src: ProviderActiveKeySource | undefined,\n): string {\n switch (src) {\n case 'agent':\n return labels.sourceAgent;\n case 'gateway':\n return labels.sourceGateway;\n case 'oauth':\n return labels.sourceOauth;\n case 'env':\n return labels.sourceEnv;\n case 'models_json':\n return labels.sourceModelsJson;\n case 'extension':\n return labels.sourceExtension;\n default:\n return labels.sourceNone;\n }\n}\n","import {\n AlertCircle,\n CheckCircle2,\n ChevronDown,\n Copy,\n ExternalLink,\n Eye,\n EyeOff,\n Info,\n KeyRound,\n Loader2,\n LogIn,\n LogOut,\n Trash2,\n X,\n} from 'lucide-react';\nimport { useCallback, useEffect, useEffectEvent, useMemo, useReducer, useRef, useState } from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport { ConfirmDialog } from '@/components/ui/confirm-dialog';\nimport type { ConfiguredModel } from '@/features/chat/api/registry-api';\nimport {\n cancelOAuth,\n cleanupOAuthSession,\n fetchOAuthSessionStatus,\n revokeOAuth,\n startAsyncOAuthLogin,\n submitOAuthCode,\n} from '@/features/settings/oauth-api';\nimport {\n deleteProviderApiKey,\n isMaskedKey,\n testProviderKeyResolution,\n type ProviderRowModel,\n} from '@/features/settings/providers-api';\nimport {\n getOrderedApiKeyLinks,\n PROVIDER_ENRICHMENT,\n providerApiKeyLinkLabel,\n} from '@/features/settings/provider-enrichment';\nimport { ProviderInfoPopover } from '@/features/settings/provider-info-popover';\nimport { activeSourceLabel, interpolate } from './providers-settings-lib';\nimport { settingsInputFocusClass } from '@/lib/form-field-width';\nimport { copyTextToClipboard } from '@/lib/copy-to-clipboard';\nimport { cn } from '@/lib/cn';\nimport { interaction } from '@/lib/interaction';\nimport type { StoredLanguage } from '@/lib/storage';\nimport type { ProvidersSettingsMessages } from '@/i18n/messages';\n\nfunction EnvVarCopyRow({\n envVar,\n labels,\n}: {\n envVar: string;\n labels: ProvidersSettingsMessages;\n}) {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = async () => {\n const ok = await copyTextToClipboard(envVar);\n if (!ok) return;\n setCopied(true);\n window.setTimeout(() => setCopied(false), 2000);\n };\n\n return (\n <div className=\"flex items-center gap-2\">\n <code className=\"rounded bg-surface-hover px-1.5 py-0.5 font-mono text-[11px] text-fg-muted\">{envVar}</code>\n <button\n type=\"button\"\n onClick={() => void handleCopy()}\n className={cn(\n 'rounded p-0.5 text-fg-subtle hover:bg-surface-hover hover:text-fg',\n interaction.press,\n )}\n title={copied ? labels.copied : labels.copy}\n aria-label={copied ? labels.copied : labels.copy}\n >\n {copied ? (\n <CheckCircle2 className=\"size-3.5 text-emerald-600 dark:text-emerald-400\" aria-hidden />\n ) : (\n <Copy className=\"size-3.5\" aria-hidden />\n )}\n </button>\n </div>\n );\n}\n\n/**\n * Accessible collapsible section replacing the native `<details>` element.\n * Uses controlled state + CSS transitions so keyboard focus, screen readers,\n * and animation all work consistently within the Radix-oriented component set.\n */\ntype OAuthState = {\n loading: boolean;\n sessionId?: string;\n status?: 'idle' | 'waiting' | 'waiting_code' | 'success' | 'error';\n message?: string;\n authUrl?: string;\n instructions?: string;\n codeInput: string;\n};\n\ntype OAuthAction =\n | { type: 'start'; message: string }\n | { type: 'session'; sessionId: string }\n | { type: 'poll'; message?: string; authUrl?: string; instructions?: string; status: 'waiting' | 'waiting_code' }\n | { type: 'complete'; message?: string }\n | { type: 'fail'; message: string }\n | { type: 'cancel' }\n | { type: 'setCode'; value: string }\n | { type: 'clearCode' };\n\nconst initialOAuthState: OAuthState = { loading: false, codeInput: '' };\n\nfunction oauthReducer(state: OAuthState, action: OAuthAction): OAuthState {\n switch (action.type) {\n case 'start':\n return {\n loading: true,\n status: 'waiting',\n message: action.message,\n codeInput: '',\n sessionId: undefined,\n authUrl: undefined,\n instructions: undefined,\n };\n case 'session':\n return { ...state, sessionId: action.sessionId };\n case 'poll':\n return {\n ...state,\n message: action.message ?? state.message,\n authUrl: action.authUrl,\n instructions: action.instructions,\n status: action.status,\n };\n case 'complete':\n return {\n ...state,\n loading: false,\n status: 'success',\n message: action.message ?? state.message,\n };\n case 'fail':\n return { ...state, loading: false, status: 'error', message: action.message };\n case 'cancel':\n return initialOAuthState;\n case 'setCode':\n return { ...state, codeInput: action.value };\n case 'clearCode':\n return { ...state, codeInput: '' };\n }\n}\n\ntype RowUiState = {\n showKey: boolean;\n copied: boolean;\n revokeError: string | null;\n removeLoading: boolean;\n removeMessage: string | null;\n removeConfirmOpen: boolean;\n testLoading: boolean;\n testMessage: string | null;\n testOk: boolean | null;\n};\n\ntype RowUiAction =\n | { type: 'toggleShowKey' }\n | { type: 'copied' }\n | { type: 'clearCopied' }\n | { type: 'revokeError'; message: string | null }\n | { type: 'removeStart' }\n | { type: 'removeDone'; message: string | null }\n | { type: 'removeConfirm'; open: boolean }\n | { type: 'testStart' }\n | { type: 'testDone'; ok: boolean | null; message: string | null };\n\nconst initialRowUi: RowUiState = {\n showKey: false,\n copied: false,\n revokeError: null,\n removeLoading: false,\n removeMessage: null,\n removeConfirmOpen: false,\n testLoading: false,\n testMessage: null,\n testOk: null,\n};\n\nfunction rowUiReducer(state: RowUiState, action: RowUiAction): RowUiState {\n switch (action.type) {\n case 'toggleShowKey':\n return { ...state, showKey: !state.showKey };\n case 'copied':\n return { ...state, copied: true };\n case 'clearCopied':\n return { ...state, copied: false };\n case 'revokeError':\n return { ...state, revokeError: action.message };\n case 'removeStart':\n return { ...state, removeLoading: true, removeMessage: null, removeConfirmOpen: false };\n case 'removeDone':\n return { ...state, removeLoading: false, removeMessage: action.message };\n case 'removeConfirm':\n return { ...state, removeConfirmOpen: action.open };\n case 'testStart':\n return { ...state, testLoading: true, testMessage: null, testOk: null };\n case 'testDone':\n return { ...state, testLoading: false, testOk: action.ok, testMessage: action.message };\n }\n}\n\nfunction MoreOptionsSection({\n label,\n children,\n}: {\n label: string;\n children: React.ReactNode;\n}) {\n const [open, setOpen] = useState(false);\n const toggle = useCallback(() => setOpen((v) => !v), []);\n\n return (\n <div className=\"rounded-md\">\n <button\n type=\"button\"\n onClick={toggle}\n aria-expanded={open}\n className=\"cursor-pointer select-none text-xs text-fg-subtle hover:text-fg-muted\"\n >\n <span className=\"inline-flex items-center gap-1\">\n <ChevronDown\n className={cn('size-3 transition-transform', open && 'rotate-180')}\n aria-hidden\n />\n {label}\n </span>\n </button>\n {open ? (\n <div className=\"mt-2 flex flex-col gap-2 pl-4\">\n {children}\n </div>\n ) : null}\n </div>\n );\n}\n\nexport function ProviderCredentialRow({\n row,\n value,\n rowDirty,\n labels,\n language,\n onChange,\n onReload,\n justSaved,\n availableModels,\n autoExpand = false,\n autoFocusInput = false,\n}: {\n row: ProviderRowModel;\n value: string;\n rowDirty: boolean;\n labels: ProvidersSettingsMessages;\n language: StoredLanguage;\n onChange: (id: string, v: string) => void;\n onReload: () => void;\n justSaved: boolean;\n availableModels: ConfiguredModel[];\n /** When true, the row opens automatically on mount. */\n autoExpand?: boolean;\n /** When true, the key input receives focus after expanding. */\n autoFocusInput?: boolean;\n}) {\n const [expanded, setExpanded] = useState(false);\n const keyInputRef = useRef<HTMLInputElement>(null);\n const trackedAutoExpandRef = useRef(autoExpand);\n if (autoExpand && !trackedAutoExpandRef.current && !expanded) {\n trackedAutoExpandRef.current = autoExpand;\n setExpanded(true);\n } else if (autoExpand !== trackedAutoExpandRef.current) {\n trackedAutoExpandRef.current = autoExpand;\n }\n\n const bindKeyInputRef = useCallback(\n (el: HTMLInputElement | null) => {\n keyInputRef.current = el;\n if (autoFocusInput && expanded && el) {\n el.focus();\n }\n },\n [autoFocusInput, expanded],\n );\n\n const [ui, dispatchUi] = useReducer(rowUiReducer, initialRowUi);\n const {\n showKey,\n copied,\n revokeError,\n removeLoading,\n removeMessage,\n removeConfirmOpen,\n testLoading,\n testMessage,\n testOk,\n } = ui;\n\n const [oauth, dispatchOAuth] = useReducer(oauthReducer, initialOAuthState);\n const {\n loading: oauthLoading,\n sessionId: oauthSessionId,\n status: oauthStatus,\n message: oauthMessage,\n authUrl,\n instructions,\n codeInput,\n } = oauth;\n\n const oauthSessionIdRef = useRef<string | undefined>(undefined);\n oauthSessionIdRef.current = oauthSessionId;\n\n const masked = isMaskedKey(value);\n const inputValue = masked && !showKey ? '' : value;\n const isOAuthConfigured = row.configured && !masked && Boolean(value);\n\n const activeSrc = row.activeKeySource ?? 'none';\n\n const apiKeyLinks = useMemo(() => getOrderedApiKeyLinks(row.id, language), [row.id, language]);\n\n useEffect(() => {\n return () => {\n const sessionId = oauthSessionIdRef.current;\n if (sessionId) {\n void cleanupOAuthSession(sessionId).catch(() => {});\n }\n };\n }, []);\n\n const reloadProviders = useEffectEvent(() => {\n onReload();\n });\n\n useEffect(() => {\n if (!oauthSessionId || !oauthLoading) return;\n const id = window.setInterval(() => {\n void (async () => {\n try {\n const st = await fetchOAuthSessionStatus(oauthSessionId);\n if (st.status === 'waiting_auth' || st.status === 'waiting_code') {\n dispatchOAuth({\n type: 'poll',\n message: st.message,\n authUrl: st.authUrl,\n instructions: st.instructions,\n status: st.status === 'waiting_code' ? 'waiting_code' : 'waiting',\n });\n } else if (st.status === 'completed') {\n window.clearInterval(id);\n dispatchOAuth({ type: 'complete', message: st.message });\n window.setTimeout(() => reloadProviders(), 800);\n } else if (st.status === 'failed' || st.status === 'cancelled') {\n window.clearInterval(id);\n dispatchOAuth({\n type: 'fail',\n message: st.error || st.message || 'OAuth failed',\n });\n }\n } catch {\n /* ignore poll errors */\n }\n })();\n }, 1000);\n return () => window.clearInterval(id);\n }, [oauthSessionId, oauthLoading]);\n\n const startOAuth = async () => {\n dispatchOAuth({ type: 'start', message: labels.oauthStarting });\n try {\n const res = await startAsyncOAuthLogin(row.id);\n dispatchOAuth({ type: 'session', sessionId: res.sessionId });\n } catch (e) {\n dispatchOAuth({\n type: 'fail',\n message: e instanceof Error ? e.message : 'OAuth failed',\n });\n }\n };\n\n const cancelFlow = async () => {\n const sessionId = oauthSessionId;\n if (!sessionId) return;\n try {\n await cancelOAuth(sessionId);\n } catch {\n /* ignore */\n }\n dispatchOAuth({ type: 'cancel' });\n };\n\n const submitCode = async () => {\n const sessionId = oauthSessionId;\n if (!sessionId || !codeInput.trim()) return;\n try {\n await submitOAuthCode(sessionId, codeInput.trim());\n dispatchOAuth({ type: 'clearCode' });\n dispatchOAuth({\n type: 'poll',\n message: labels.oauthProcessingCode,\n status: oauthStatus === 'waiting_code' ? 'waiting_code' : 'waiting',\n });\n } catch (e) {\n dispatchOAuth({\n type: 'fail',\n message: e instanceof Error ? e.message : 'Failed',\n });\n }\n };\n\n const doRevoke = () => {\n if (!window.confirm(interpolate(labels.revokeConfirm, { name: row.name }))) return;\n dispatchUi({ type: 'revokeError', message: null });\n void revokeOAuth(row.id)\n .then(() => onReload())\n .catch((e) =>\n dispatchUi({\n type: 'revokeError',\n message: e instanceof Error ? e.message : labels.revokeFailed,\n }),\n );\n };\n\n const doRemoveKey = async () => {\n dispatchUi({ type: 'removeStart' });\n try {\n await deleteProviderApiKey(row.id);\n dispatchUi({ type: 'removeDone', message: labels.removeKeySuccess });\n onChange(row.id, '');\n window.setTimeout(() => onReload(), 600);\n } catch (error) {\n dispatchUi({\n type: 'removeDone',\n message: error instanceof Error ? error.message : labels.removeKeyFailed,\n });\n }\n };\n\n const canRemoveKey =\n row.configured && masked && activeSrc !== 'env' && activeSrc !== 'extension' && activeSrc !== 'models_json';\n\n const copyKey = async () => {\n if (!value || masked) return;\n const ok = await copyTextToClipboard(value);\n if (!ok) return;\n dispatchUi({ type: 'copied' });\n window.setTimeout(() => dispatchUi({ type: 'clearCopied' }), 2000);\n };\n\n const runTest = async () => {\n const v = value.trim();\n if (!v || isMaskedKey(v)) return;\n dispatchUi({ type: 'testStart' });\n try {\n const res = await testProviderKeyResolution(v);\n if (res.error) {\n dispatchUi({ type: 'testDone', ok: false, message: `${labels.testFailed} ${res.error}` });\n return;\n }\n const message =\n res.type === 'env'\n ? labels.testOkEnv\n : res.type === 'command'\n ? labels.testOkCommand\n : labels.testOkLiteral;\n dispatchUi({ type: 'testDone', ok: true, message });\n } catch (e) {\n dispatchUi({\n type: 'testDone',\n ok: false,\n message: e instanceof Error ? e.message : labels.testFailed,\n });\n }\n };\n\n const secondaryLine = rowDirty\n ? labels.metaWillSave\n : row.configured\n ? masked\n ? `${labels.metaMasked} · ${labels.runtimeLabelPrefix} ${activeSourceLabel(labels, activeSrc)}`\n : `${labels.runtimeLabelPrefix} ${activeSourceLabel(labels, activeSrc)}`\n : labels.metaNotConfigured;\n\n const detailsId = `provider-details-${row.id}`;\n\n return (\n <div className=\"bg-surface-panel\">\n <div className=\"flex items-center gap-3 p-3 sm:px-4\">\n <div\n className=\"flex size-8 shrink-0 items-center justify-center rounded-md bg-surface-hover/80 dark:bg-surface-hover/50\"\n aria-hidden\n >\n {row.configured ? (\n <CheckCircle2 className=\"size-4 text-emerald-600 dark:text-emerald-400\" />\n ) : (\n <KeyRound className=\"size-4 text-fg-subtle\" strokeWidth={1.75} />\n )}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-sm font-semibold text-fg\">{row.name}</span>\n <ProviderInfoPopover providerId={row.id} language={language} />\n <span className=\"rounded bg-surface-hover px-1.5 py-0.5 font-mono text-[10px] font-medium uppercase tracking-wide text-fg-subtle\">\n {row.id}\n </span>\n </div>\n <p className=\"mt-0.5 text-xs text-fg-muted\">{secondaryLine}</p>\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"size-9 shrink-0 p-0\"\n aria-expanded={expanded}\n aria-controls={detailsId}\n aria-label={labels.expandRowDetails}\n onClick={() => setExpanded((e) => !e)}\n >\n <ChevronDown className={cn('size-4 transition-transform', expanded && 'rotate-180')} aria-hidden />\n </Button>\n </div>\n\n {expanded ? (\n <div\n id={detailsId}\n role=\"region\"\n className=\"space-y-3 border-t border-edge-subtle bg-surface-base/40 p-3 dark:bg-surface-base/20 sm:px-4\"\n >\n {row.supportsApiKey !== false ? (\n <div className=\"flex flex-col gap-2\">\n <div className=\"relative flex flex-col gap-2 sm:flex-row sm:gap-2\">\n <div className=\"relative min-w-0 flex-1\">\n <input\n ref={bindKeyInputRef}\n type={showKey || !masked ? 'text' : 'password'}\n className={cn(\n 'w-full rounded-lg border border-edge bg-surface-panel py-2 pl-3 pr-20 font-mono text-sm text-fg',\n 'placeholder:text-fg-subtle',\n settingsInputFocusClass,\n 'dark:border-edge',\n )}\n value={inputValue}\n placeholder={\n masked ? labels.placeholderOverride : row.configured ? labels.placeholderKeep : labels.placeholderKey\n }\n disabled={oauthLoading}\n onChange={(e) => onChange(row.id, e.target.value)}\n autoComplete=\"off\"\n spellCheck={false}\n />\n <div className=\"absolute right-1 top-1/2 flex -translate-y-1/2 gap-0.5\">\n {value && !masked ? (\n <button\n type=\"button\"\n className={cn(\n 'rounded p-1.5 text-fg-subtle hover:bg-surface-hover hover:text-fg',\n interaction.transition,\n interaction.press,\n interaction.focusRingPanel,\n )}\n title={copied ? labels.copied : labels.copy}\n aria-label={copied ? labels.copied : labels.copy}\n onClick={() => void copyKey()}\n >\n {copied ? <CheckCircle2 className=\"size-4\" /> : <Copy className=\"size-4\" />}\n </button>\n ) : null}\n <button\n type=\"button\"\n className={cn(\n 'rounded p-1.5 text-fg-subtle hover:bg-surface-hover hover:text-fg disabled:opacity-40',\n interaction.transition,\n interaction.press,\n interaction.focusRingPanel,\n )}\n title={showKey ? labels.hide : labels.show}\n aria-label={showKey ? labels.hide : labels.show}\n disabled={masked}\n onClick={() => dispatchUi({ type: 'toggleShowKey' })}\n >\n {showKey ? <EyeOff className=\"size-4\" /> : <Eye className=\"size-4\" />}\n </button>\n </div>\n </div>\n <div className=\"flex flex-wrap gap-2 sm:shrink-0\">\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"gap-1\"\n disabled={oauthLoading || testLoading || !value.trim() || isMaskedKey(value)}\n onClick={() => void runTest()}\n >\n {testLoading ? <Loader2 className=\"size-4 animate-spin\" aria-hidden /> : null}\n {testLoading ? labels.testingKey : labels.testKey}\n </Button>\n {row.supportsOAuth ? (\n isOAuthConfigured ? (\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"gap-1 text-red-600 dark:text-red-400\"\n onClick={doRevoke}\n >\n <LogOut className=\"size-4\" aria-hidden />\n {labels.revoke}\n </Button>\n ) : (\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"gap-1\"\n disabled={oauthLoading}\n data-oauth-session={oauthSessionId ?? ''}\n onClick={() => void startOAuth()}\n >\n {oauthLoading ? <Loader2 className=\"size-4 animate-spin\" aria-hidden /> : <LogIn className=\"size-4\" aria-hidden />}\n {labels.oauth}\n </Button>\n )\n ) : null}\n {/* Remove key moves into the \"More\" details block below — it's destructive and rarely-used. */}\n </div>\n </div>\n {testMessage ? (\n <p\n className={cn(\n 'text-xs',\n testOk === false ? 'text-red-600 dark:text-red-400' : 'text-fg-muted',\n )}\n role=\"status\"\n >\n {testMessage}\n </p>\n ) : null}\n </div>\n ) : null}\n\n {oauthMessage ? (\n <div\n className={cn(\n 'flex gap-2 rounded-md px-3 py-2 text-xs',\n oauthStatus === 'error'\n ? 'border border-red-200 bg-red-50 text-red-700 dark:border-red-900/50 dark:bg-red-950/50 dark:text-red-400'\n : 'bg-surface-base text-fg-muted',\n )}\n >\n {oauthStatus === 'error' ? (\n <AlertCircle className=\"mt-0.5 size-4 shrink-0\" aria-hidden />\n ) : oauthStatus === 'success' ? (\n <CheckCircle2 className=\"mt-0.5 size-4 shrink-0 text-emerald-600\" aria-hidden />\n ) : (\n <Info className=\"mt-0.5 size-4 shrink-0\" aria-hidden />\n )}\n <span>{oauthMessage}</span>\n </div>\n ) : null}\n\n {revokeError ? (\n <div\n className=\"flex gap-2 rounded-md border border-red-200 bg-red-50 px-3 py-2 text-xs text-red-700 dark:border-red-900/50 dark:bg-red-950/50 dark:text-red-400\"\n role=\"alert\"\n >\n <AlertCircle className=\"mt-0.5 size-4 shrink-0\" aria-hidden />\n <span>{revokeError}</span>\n </div>\n ) : null}\n\n {removeMessage ? (\n <div\n className={cn(\n 'flex gap-2 rounded-md px-3 py-2 text-xs',\n removeMessage === labels.removeKeySuccess\n ? 'bg-surface-hover/60 text-fg-muted dark:bg-surface-hover/40'\n : 'border border-red-200 bg-red-50 text-red-700 dark:border-red-900/50 dark:bg-red-950/50 dark:text-red-400',\n )}\n role=\"status\"\n >\n {removeMessage === labels.removeKeySuccess ? (\n <CheckCircle2 className=\"mt-0.5 size-4 shrink-0 text-emerald-600 dark:text-emerald-400\" aria-hidden />\n ) : (\n <AlertCircle className=\"mt-0.5 size-4 shrink-0\" aria-hidden />\n )}\n <span>{removeMessage}</span>\n </div>\n ) : null}\n\n {(oauthStatus === 'waiting' || oauthStatus === 'waiting_code') && (\n <div className=\"flex flex-wrap gap-2\">\n {authUrl ? (\n <a\n href={authUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-1.5 rounded-md bg-accent px-3 py-2 text-sm font-medium text-white hover:bg-accent-hover\"\n >\n <ExternalLink className=\"size-4\" aria-hidden />\n {labels.openAuthPage}\n </a>\n ) : null}\n <Button type=\"button\" variant=\"secondary\" className=\"gap-1\" onClick={() => void cancelFlow()}>\n <X className=\"size-4\" aria-hidden />\n {labels.cancelOAuth}\n </Button>\n </div>\n )}\n\n {instructions ? (\n <div className=\"flex gap-2 rounded-md bg-surface-hover/60 px-3 py-2 text-xs text-fg-muted dark:bg-surface-hover/40\">\n <Info className=\"mt-0.5 size-4 shrink-0\" aria-hidden />\n <span>{instructions}</span>\n </div>\n ) : null}\n\n {oauthStatus === 'waiting_code' ? (\n <div className=\"flex flex-col gap-2 sm:flex-row\">\n <input\n type=\"text\"\n className={cn(\n 'min-w-0 flex-1 rounded-lg border border-edge bg-surface-panel px-3 py-2 text-sm text-fg',\n settingsInputFocusClass,\n 'dark:border-edge',\n )}\n value={codeInput}\n placeholder={labels.pasteRedirectUrl}\n onChange={(e) => dispatchOAuth({ type: 'setCode', value: e.target.value })}\n onKeyDown={(e) => e.key === 'Enter' && void submitCode()}\n />\n <Button type=\"button\" variant=\"primary\" className=\"shrink-0\" onClick={() => void submitCode()}>\n {labels.submitCode}\n </Button>\n </div>\n ) : null}\n\n {masked ? (\n <div className=\"flex gap-2 rounded-md bg-surface-hover/60 px-3 py-2 text-xs text-fg-muted dark:bg-surface-hover/40\">\n <Info className=\"mt-0.5 size-4 shrink-0\" aria-hidden />\n <span>{activeSrc === 'env' ? labels.envHint : labels.maskedStoredHint}</span>\n </div>\n ) : null}\n\n {/* `oauthHint` removed — the OAuth button right above conveys the same affordance. */}\n\n {justSaved ? (\n <div className=\"flex items-start gap-2 rounded-md bg-surface-hover/60 px-3 py-2 text-xs text-fg-muted dark:bg-surface-hover/40\">\n <CheckCircle2 className=\"mt-0.5 size-3.5 shrink-0 text-emerald-600 dark:text-emerald-400\" aria-hidden />\n <span>\n {(() => {\n const providerModels = availableModels.filter((m) => m.provider === row.id);\n if (providerModels.length === 0) return labels.savedNoModels;\n const preview = providerModels\n .slice(0, 3)\n .map((m) => m.name || m.id)\n .join(', ');\n const suffix = providerModels.length > 3 ? `… (+${providerModels.length - 3})` : '';\n return `${providerModels.length} ${labels.savedModelsAvailable}: ${preview}${suffix}`;\n })()}\n </span>\n </div>\n ) : null}\n\n {(() => {\n // \"More\" section consolidates the rarely-used or destructive\n // controls so the primary key + Test + OAuth flow stays clean:\n // • API key console links — most users open these once to grab\n // a key and never again\n // • Environment variable alternatives — for users who'd rather\n // export `OPENAI_API_KEY` than paste it here\n // • Remove key — destructive, lives behind a confirm dialog\n const envVars = PROVIDER_ENRICHMENT[row.id]?.envVars ?? [];\n const hasMore = apiKeyLinks.length > 0 || envVars.length > 0 || canRemoveKey;\n if (!hasMore) return null;\n return (\n <MoreOptionsSection label={labels.moreOptions ?? labels.envVarAlt}>\n {apiKeyLinks.length > 0 ? (\n <div className=\"flex flex-col gap-1\">\n {apiKeyLinks.map((link) => (\n <a\n key={`${link.kind}-${link.href}`}\n href={link.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex w-fit items-center gap-1 text-xs font-medium text-accent-fg hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n >\n {providerApiKeyLinkLabel(link.kind, labels)}\n <ExternalLink className=\"size-3\" aria-hidden />\n </a>\n ))}\n </div>\n ) : null}\n {envVars.length > 0 ? (\n <div className=\"flex flex-col gap-1\">\n <p className=\"text-[10px] font-medium uppercase tracking-wide text-fg-subtle\">\n {labels.envVarAlt}\n </p>\n {envVars.map((envVar) => (\n <EnvVarCopyRow key={envVar} envVar={envVar} labels={labels} />\n ))}\n </div>\n ) : null}\n {canRemoveKey ? (\n <>\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"gap-1 self-start text-red-600 dark:text-red-400\"\n disabled={removeLoading}\n onClick={() => dispatchUi({ type: 'removeConfirm', open: true })}\n >\n {removeLoading ? <Loader2 className=\"size-4 animate-spin\" aria-hidden /> : <Trash2 className=\"size-4\" aria-hidden />}\n {labels.removeKey}\n </Button>\n <ConfirmDialog\n open={removeConfirmOpen}\n title={labels.removeKey}\n description={interpolate(labels.removeKeyConfirm, { name: row.name })}\n confirmLabel={labels.removeKey}\n cancelLabel={labels.cancelOAuth}\n destructive\n onConfirm={() => void doRemoveKey()}\n onCancel={() => dispatchUi({ type: 'removeConfirm', open: false })}\n />\n </>\n ) : null}\n </MoreOptionsSection>\n );\n })()}\n </div>\n ) : null}\n </div>\n );\n}\n","import {\n CheckCircle2,\n ChevronDown,\n KeyRound,\n Search,\n} from 'lucide-react';\nimport { useCallback, useEffect, useMemo, useReducer, useRef } from 'react';\n\nimport { uiPatchReducer } from '@/lib/settings-form-draft';\nimport useSWR from 'swr';\n\nimport { Button } from '@/components/ui/button';\nimport { CONFIGURED_MODELS_SWR_KEY, fetchConfiguredModelsCached } from '@/features/chat/api/registry-api';\nimport { useSaveBarRegistration } from '@/features/settings/save-bar/use-save-bar-registration';\nimport { useGatewayConfigSwr } from '@/features/gateway/gateway-config-swr';\nimport {\n isMaskedKey,\n mergeProviderRows,\n patchProviderApiKeys,\n providersKeysFromConfigRoot,\n type ProviderMeta,\n type ProviderRowModel,\n} from '@/features/settings/providers-api';\nimport { PROVIDER_ENRICHMENT } from '@/features/settings/provider-enrichment';\nimport { ProviderCredentialRow } from './provider-credential-row';\nimport { CATEGORY_ORDER, groupByCategory, interpolate } from './providers-settings-lib';\nimport { fetchJson } from '@/lib/fetch';\nimport { apiUrl } from '@/lib/url';\nimport { settingsInputFocusClass } from '@/lib/form-field-width';\nimport { cn } from '@/lib/cn';\nimport { interaction } from '@/lib/interaction';\nimport { messages } from '@/i18n/messages';\nimport { useGatewayStore } from '@/stores/gateway-store';\nimport { useLocaleStore } from '@/stores/locale-store';\n\ntype ProvidersDraft = {\n draft: Record<string, string>;\n baseline: Record<string, string>;\n};\n\ntype ProvidersDraftAction =\n | { type: 'reset' }\n | { type: 'sync'; rows: ProviderRowModel[] }\n | { type: 'patch'; id: string; value: string }\n | { type: 'discard' }\n | { type: 'commitDraft' }\n | { type: 'saved'; rows: ProviderRowModel[] };\n\nfunction providersDraftReducer(state: ProvidersDraft, action: ProvidersDraftAction): ProvidersDraft {\n switch (action.type) {\n case 'reset':\n return { draft: {}, baseline: {} };\n case 'sync': {\n const d: Record<string, string> = {};\n for (const r of action.rows) d[r.id] = r.apiKey;\n return { draft: d, baseline: { ...d } };\n }\n case 'patch':\n return { ...state, draft: { ...state.draft, [action.id]: action.value } };\n case 'discard':\n return { ...state, draft: { ...state.baseline } };\n case 'commitDraft':\n return { ...state, baseline: { ...state.draft } };\n case 'saved': {\n const d: Record<string, string> = {};\n for (const r of action.rows) d[r.id] = r.apiKey;\n return { draft: d, baseline: { ...d } };\n }\n }\n}\n\ntype ProvidersUi = {\n saving: boolean;\n error: string | null;\n saveNotice: null | 'saved' | 'noChanges';\n expandedCats: Set<string>;\n searchQuery: string;\n unconfiguredOnly: boolean;\n savedProviderIds: Set<string>;\n quickStartProviderId: string | null;\n};\n\nconst initialProvidersUi: ProvidersUi = {\n saving: false,\n error: null,\n saveNotice: null,\n expandedCats: new Set(['common']),\n searchQuery: '',\n unconfiguredOnly: false,\n savedProviderIds: new Set(),\n quickStartProviderId: null,\n};\n\n/** See `WebSearchSettingsPanel` for the embedded-mode contract. */\nexport function ProvidersSettingsPanel({ embedded = false }: { embedded?: boolean } = {}) {\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const p = m.providersSettings;\n const token = useGatewayStore((st) => st.token);\n const hasToken = Boolean(token);\n\n const [draftState, dispatchDraft] = useReducer(providersDraftReducer, { draft: {}, baseline: {} });\n const draft = draftState.draft;\n const baseline = draftState.baseline;\n const [ui, dispatchUi] = useReducer(uiPatchReducer<ProvidersUi>, initialProvidersUi);\n const {\n saving,\n error,\n saveNotice,\n expandedCats,\n searchQuery,\n unconfiguredOnly,\n savedProviderIds,\n quickStartProviderId,\n } = ui;\n const dirtyRef = useRef(false);\n\n const metaUrl = apiUrl('/api/providers/meta');\n const fetchMetaList = useCallback(async (url: string) => {\n const data = await fetchJson<{ ok?: boolean; payload?: { providers?: ProviderMeta[] } }>(url);\n return data.payload?.providers ?? [];\n }, []);\n\n const {\n data: cfgData,\n error: cfgErr,\n isLoading: cfgLoading,\n mutate: mutCfg,\n } = useGatewayConfigSwr(hasToken);\n const {\n data: metaList,\n error: metaErr,\n isLoading: metaLoading,\n mutate: mutMeta,\n } = useSWR(hasToken ? metaUrl : null, fetchMetaList, { revalidateOnFocus: false });\n const { data: models, mutate: mutModels } = useSWR(\n hasToken ? CONFIGURED_MODELS_SWR_KEY : null,\n () => fetchConfiguredModelsCached(),\n { revalidateOnFocus: false },\n );\n\n const mergedRows = useMemo((): ProviderRowModel[] | null => {\n if (!metaList || cfgData === undefined) return null;\n const keys = providersKeysFromConfigRoot(cfgData.payload?.config);\n return mergeProviderRows(metaList, keys, models ?? []);\n }, [metaList, cfgData, models]);\n\n const fetchError =\n cfgErr instanceof Error\n ? cfgErr.message\n : cfgErr\n ? String(cfgErr)\n : metaErr instanceof Error\n ? metaErr.message\n : metaErr\n ? String(metaErr)\n : null;\n\n const loading = Boolean(\n hasToken && mergedRows === null && (cfgLoading || metaLoading) && !fetchError,\n );\n\n const dirty = useMemo(\n () => JSON.stringify(draft) !== JSON.stringify(baseline),\n [draft, baseline],\n );\n\n useEffect(() => {\n if (!dirty) return;\n const onBeforeUnload = (e: BeforeUnloadEvent) => {\n e.preventDefault();\n e.returnValue = '';\n };\n window.addEventListener('beforeunload', onBeforeUnload);\n return () => window.removeEventListener('beforeunload', onBeforeUnload);\n }, [dirty]);\n\n useEffect(() => {\n if (!hasToken || mergedRows === null) return;\n if (!dirtyRef.current) {\n dispatchDraft({ type: 'sync', rows: mergedRows });\n }\n }, [hasToken, mergedRows]);\n\n const metaRows = mergedRows ?? [];\n\n const filteredRows = useMemo(() => {\n let rows = metaRows;\n const q = searchQuery.trim().toLowerCase();\n if (q) {\n rows = rows.filter((r) => {\n const enrichment = PROVIDER_ENRICHMENT[r.id];\n const aliases = enrichment?.aliases ?? [];\n return (\n r.id.toLowerCase().includes(q) ||\n r.name.toLowerCase().includes(q) ||\n aliases.some((alias) => alias.toLowerCase().includes(q))\n );\n });\n }\n if (unconfiguredOnly) {\n rows = rows.filter((r) => !r.configured);\n }\n return rows;\n }, [metaRows, searchQuery, unconfiguredOnly]);\n\n const groups = useMemo(() => groupByCategory(filteredRows), [filteredRows]);\n\n const searchTrim = searchQuery.trim();\n const effectiveExpandedCats = useMemo(() => {\n if (searchTrim) {\n const next = new Set<string>();\n for (const c of CATEGORY_ORDER) {\n if ((groups.get(c) ?? []).length > 0) next.add(c);\n }\n return next;\n }\n return expandedCats;\n }, [searchTrim, groups, expandedCats]);\n\n const save = useCallback(async () => {\n if (saving) return;\n const toPatch: Record<string, string> = {};\n for (const id of Object.keys(draft)) {\n const v = draft[id]?.trim() ?? '';\n if (!v || isMaskedKey(v)) continue;\n toPatch[id] = v;\n }\n if (Object.keys(toPatch).length === 0) {\n dispatchDraft({ type: 'commitDraft' });\n dirtyRef.current = false;\n dispatchUi({ type: 'patch', patch: { saveNotice: 'noChanges' } });\n window.setTimeout(() => dispatchUi({ type: 'patch', patch: { saveNotice: null } }), 2500);\n return;\n }\n dispatchUi({ type: 'patch', patch: { saving: true, error: null, saveNotice: null } });\n try {\n await patchProviderApiKeys(toPatch);\n dispatchUi({ type: 'patch', patch: { savedProviderIds: new Set(Object.keys(toPatch)) } });\n const freshModels = (await mutModels(fetchConfiguredModelsCached(true))) ?? models ?? [];\n const [nextCfg, nextMeta] = await Promise.all([mutCfg(), mutMeta()]);\n const list = Array.isArray(nextMeta) ? nextMeta : metaList ?? [];\n const cfg = nextCfg ?? cfgData;\n if (cfg?.payload) {\n const keys = providersKeysFromConfigRoot(cfg.payload.config);\n const rows = mergeProviderRows(list, keys, freshModels);\n dispatchDraft({ type: 'saved', rows });\n dirtyRef.current = false;\n }\n dispatchUi({ type: 'patch', patch: { saveNotice: 'saved' } });\n window.setTimeout(() => dispatchUi({ type: 'patch', patch: { saveNotice: null } }), 2500);\n } catch (e) {\n dispatchUi({ type: 'patch', patch: { error: e instanceof Error ? e.message : p.saveError } });\n } finally {\n dispatchUi({ type: 'patch', patch: { saving: false } });\n }\n }, [cfgData, draft, metaList, models, mutCfg, mutMeta, mutModels, p.saveError, saving]);\n\n const discard = useCallback(() => {\n dirtyRef.current = false;\n dispatchDraft({ type: 'discard' });\n dispatchUi({ type: 'patch', patch: { error: null, saveNotice: null, savedProviderIds: new Set() } });\n }, [baseline]);\n\n useSaveBarRegistration({ id: 'providers', dirty, saving, save, discard });\n\n const toggleCat = (cat: string) => {\n const next = new Set(expandedCats);\n if (next.has(cat)) next.delete(cat);\n else next.add(cat);\n dispatchUi({ type: 'patch', patch: { expandedCats: next } });\n };\n\n const refreshProviders = useCallback(() => {\n void mutCfg();\n void mutMeta();\n }, [mutCfg, mutMeta]);\n\n const filtersActive = Boolean(searchQuery.trim() || unconfiguredOnly);\n\n const outerClass = embedded\n ? 'flex flex-col gap-4'\n : 'mx-auto flex w-full max-w-app-main flex-col gap-6 px-4 py-6';\n const compactClass = embedded\n ? 'flex flex-col gap-3'\n : 'mx-auto flex w-full max-w-app-main flex-col gap-3 px-4 py-10';\n const skeletonClass = embedded\n ? 'w-full'\n : 'mx-auto w-full max-w-app-main px-4 py-8';\n\n if (!hasToken) {\n return (\n <div className={compactClass}>\n <div className=\"flex items-start gap-3 rounded-2xl bg-surface-base p-6\">\n <KeyRound className=\"mt-0.5 size-5 shrink-0 text-fg-subtle\" strokeWidth={1.75} />\n <div>\n {embedded ? null : (\n <h1 className=\"text-base font-semibold text-fg\">{m.settingsSections.providers}</h1>\n )}\n <p className={cn('text-sm text-fg-muted', !embedded && 'mt-1')}>{p.needToken}</p>\n </div>\n </div>\n </div>\n );\n }\n\n if (loading) {\n return (\n <div className={skeletonClass}>\n <div className=\"h-8 w-48 animate-pulse rounded bg-surface-hover\" />\n <div className=\"mt-6 h-32 animate-pulse rounded-xl bg-surface-hover\" />\n <p className=\"mt-4 text-sm text-fg-muted\">{m.logs.loading}</p>\n </div>\n );\n }\n\n if (metaRows.length === 0) {\n return (\n <div className={compactClass}>\n <div className=\"rounded-xl border border-edge-subtle bg-surface-base px-4 py-3\">\n <p className=\"text-sm font-medium text-fg\">{p.loadError}</p>\n <p className=\"mt-1 text-sm text-fg-muted\">{error ?? fetchError ?? p.empty}</p>\n </div>\n <Button\n type=\"button\"\n variant=\"secondary\"\n onClick={() => {\n void mutCfg();\n void mutMeta();\n }}\n >\n {m.logs.refresh}\n </Button>\n </div>\n );\n }\n\n return (\n <div className={outerClass}>\n <header className=\"flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n {embedded ? (\n <div className=\"min-w-0\" aria-hidden />\n ) : (\n <div className=\"min-w-0\">\n <h1 className=\"text-lg font-semibold tracking-tight text-fg\">{m.settingsSections.providers}</h1>\n <p className=\"mt-1 text-sm text-fg-muted\">{p.subtitle}</p>\n <p className=\"mt-2 text-xs text-fg-subtle\">{p.rotateHint}</p>\n </div>\n )}\n {/* See WebSearchSettingsPanel — global Save bar replaces these in embedded mode. */}\n {embedded ? null : (\n <div className=\"flex shrink-0 flex-wrap items-center gap-2\">\n {saveNotice === 'saved' ? <span className=\"text-sm text-fg-muted\">{p.saved}</span> : null}\n {saveNotice === 'noChanges' ? <span className=\"text-sm text-fg-muted\">{p.noChangesSaved}</span> : null}\n <Button type=\"button\" variant=\"secondary\" disabled={!dirty || saving} onClick={discard}>\n {p.discard}\n </Button>\n <Button type=\"button\" variant=\"primary\" disabled={!dirty || saving} onClick={() => void save()}>\n {saving ? p.saving : p.save}\n </Button>\n </div>\n )}\n </header>\n\n {dirty && !embedded ? <p className=\"text-xs text-amber-800 dark:text-amber-200\">{p.unsavedHint}</p> : null}\n\n {/*\n * Empty-state shortcut: when nothing is configured, surface 4 popular\n * providers as big quick-start buttons so users don't have to scan\n * 30 rows to find OpenAI / DeepSeek / Anthropic / Google. Clicking a\n * button just filters the list to that provider; the existing row\n * machinery (key input + Save) takes over from there.\n */}\n {metaRows.length > 0 && metaRows.every((r) => !r.configured) ? (\n <ProviderQuickStart\n intro={p.quickStartIntro ?? p.intro}\n recommended={['deepseek', 'openai', 'anthropic', 'google']}\n metaRows={metaRows}\n onPick={(id) => {\n dispatchUi({ type: 'patch', patch: { searchQuery: id, quickStartProviderId: id } });\n // Expand the category containing this provider\n const row = metaRows.find((r) => r.id === id);\n if (row) {\n const cat = row.category || 'specialty';\n dispatchUi({ type: 'patch', patch: { expandedCats: new Set([...expandedCats, cat]) } });\n }\n }}\n />\n ) : null}\n\n <div className=\"flex flex-col gap-3 sm:flex-row sm:flex-wrap sm:items-center\">\n <div className=\"relative min-w-0 flex-1 sm:max-w-md\">\n <Search\n className=\"pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-fg-subtle\"\n strokeWidth={1.75}\n aria-hidden\n />\n <input\n type=\"search\"\n value={searchQuery}\n onChange={(e) => dispatchUi({ type: 'patch', patch: { searchQuery: e.target.value } })}\n placeholder={p.searchPlaceholder}\n autoComplete=\"off\"\n className={cn(\n 'w-full rounded-lg border border-edge bg-surface-panel py-2 pl-10 pr-3 text-sm text-fg placeholder:text-fg-subtle',\n settingsInputFocusClass,\n 'dark:border-edge',\n )}\n aria-label={p.searchPlaceholder}\n />\n </div>\n <label className=\"flex cursor-pointer items-center gap-2 text-sm text-fg-muted\">\n <input\n type=\"checkbox\"\n checked={unconfiguredOnly}\n onChange={(e) => dispatchUi({ type: 'patch', patch: { unconfiguredOnly: e.target.checked } })}\n className=\"size-4 rounded border-edge text-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n />\n {p.unconfiguredOnly}\n </label>\n {filtersActive ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"h-9 w-fit self-start text-fg-muted\"\n onClick={() => {\n dispatchUi({ type: 'patch', patch: { searchQuery: '', unconfiguredOnly: false } });\n }}\n >\n {p.clearFilters}\n </Button>\n ) : null}\n </div>\n\n {error ? (\n <div\n className=\"rounded-md border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-700 dark:border-red-900/50 dark:bg-red-950/50 dark:text-red-400\"\n role=\"alert\"\n >\n {error}\n </div>\n ) : null}\n\n {filteredRows.length === 0 ? (\n <div className=\"rounded-xl border border-dashed border-edge-subtle bg-surface-base px-4 py-8 text-center text-sm text-fg-muted\">\n <p>{p.noMatches}</p>\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"mt-4\"\n onClick={() => {\n dispatchUi({ type: 'patch', patch: { searchQuery: '', unconfiguredOnly: false } });\n }}\n >\n {p.clearFilters}\n </Button>\n </div>\n ) : (\n <div className=\"flex flex-col gap-3\">\n {CATEGORY_ORDER.map((cat) => {\n const list = groups.get(cat) ?? [];\n if (list.length === 0) return null;\n const expanded = effectiveExpandedCats.has(cat);\n const configuredCount = list.filter((r) => r.configured).length;\n const panelId = `providers-cat-${cat}`;\n return (\n <section key={cat} className=\"overflow-hidden rounded-2xl bg-surface-base\">\n <button\n type=\"button\"\n id={`${panelId}-trigger`}\n aria-expanded={expanded}\n aria-controls={panelId}\n className={cn(\n 'flex w-full items-center justify-between gap-2 border-b border-edge-subtle px-4 py-3 text-left transition-colors hover:bg-surface-hover/60 dark:border-edge-subtle',\n interaction.pressCard,\n )}\n onClick={() => toggleCat(cat)}\n >\n <span className=\"flex min-w-0 items-center gap-2 text-sm font-semibold text-fg\">\n <span className=\"truncate\">{p.categories[cat]}</span>\n <span className=\"shrink-0 rounded bg-surface-hover px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide text-fg-subtle\">\n {list.length}\n </span>\n </span>\n <span className=\"flex shrink-0 items-center gap-2\">\n {configuredCount > 0 ? (\n <span className=\"flex items-center gap-1 text-xs text-fg-subtle\">\n <CheckCircle2 className=\"size-3.5 text-emerald-600 dark:text-emerald-400\" aria-hidden />\n {interpolate(p.configuredCount, { count: String(configuredCount) })}\n </span>\n ) : null}\n <ChevronDown\n className={cn('size-4 text-fg-subtle transition-transform', expanded && 'rotate-180')}\n aria-hidden\n />\n </span>\n </button>\n {expanded ? (\n <div id={panelId} role=\"region\" aria-labelledby={`${panelId}-trigger`} className=\"divide-y divide-edge-subtle\">\n {list.map((row) => {\n const isQuickTarget = quickStartProviderId === row.id;\n return (\n <div id={`provider-row-${row.id}`} key={row.id}>\n <ProviderCredentialRow\n row={row}\n value={draft[row.id] ?? ''}\n rowDirty={(draft[row.id] ?? '') !== (baseline[row.id] ?? '')}\n labels={p}\n language={language}\n onChange={(id, v) => {\n dirtyRef.current = true;\n dispatchDraft({ type: 'patch', id, value: v });\n }}\n onReload={refreshProviders}\n justSaved={savedProviderIds.has(row.id)}\n availableModels={models ?? []}\n autoExpand={isQuickTarget}\n autoFocusInput={isQuickTarget}\n />\n </div>\n );\n })}\n </div>\n ) : null}\n </section>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n\n/**\n * Empty-state shortcut for the Providers panel — 4 prominent buttons that\n * filter the list down to the picked provider so users don't have to scan\n * 30 categorised rows to find the one they want.\n */\nfunction ProviderQuickStart({\n intro,\n recommended,\n metaRows,\n onPick,\n}: {\n intro: string;\n recommended: readonly string[];\n metaRows: ProviderRowModel[];\n onPick: (providerId: string) => void;\n}) {\n const available = recommended.filter((id) => metaRows.some((r) => r.id === id));\n if (available.length === 0) return null;\n const lookup = new Map(metaRows.map((r) => [r.id, r]));\n return (\n <div className=\"rounded-2xl border border-edge-subtle bg-surface-panel/40 p-4\">\n <p className=\"mb-3 text-sm text-fg-muted\">{intro}</p>\n <div className=\"grid gap-2 sm:grid-cols-2 lg:grid-cols-4\">\n {available.map((id) => {\n const meta = lookup.get(id);\n const label = meta?.name ?? id;\n return (\n <Button\n key={id}\n type=\"button\"\n variant=\"secondary\"\n className=\"justify-start\"\n onClick={() => onPick(id)}\n >\n <span className=\"truncate\">{label}</span>\n </Button>\n );\n })}\n </div>\n </div>\n );\n}\n","/**\n * Hub-level save bar — renders nothing while every registered section is\n * clean, and a sticky \"Save all / Discard all\" strip whenever at least one\n * section reports dirty state.\n *\n * Each panel still owns its local Save / Discard buttons; this is an\n * additive aggregator rather than a replacement, so power users keep\n * granular control.\n */\n\nimport { Loader2 } from 'lucide-react';\nimport { useState } from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport { messages } from '@/i18n/messages';\nimport { cn } from '@/lib/cn';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nimport { useSaveBarStore, type SaveAllFailure } from './save-bar-store';\n\nexport function SaveBarControls() {\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const t = m.modelsHub.saveBar;\n\n const anyDirty = useSaveBarStore((s) => s.anyDirty);\n const anySaving = useSaveBarStore((s) => s.anySaving);\n const dirtyCount = useSaveBarStore((s) => s.dirtyCount);\n const saveAll = useSaveBarStore((s) => s.saveAll);\n const discardAll = useSaveBarStore((s) => s.discardAll);\n\n const [failures, setFailures] = useState<SaveAllFailure[]>([]);\n const [savedFlash, setSavedFlash] = useState(false);\n\n if (!anyDirty && failures.length === 0 && !savedFlash) {\n return null;\n }\n\n const onSaveAll = async () => {\n setFailures([]);\n setSavedFlash(false);\n const result = await saveAll();\n if (result.ok && result.saved > 0) {\n setSavedFlash(true);\n window.setTimeout(() => setSavedFlash(false), 2500);\n } else if (!result.ok) {\n setFailures(result.failures);\n }\n };\n\n return (\n <div\n className={cn(\n 'sticky top-0 z-10 -mx-4 flex flex-col gap-2 border-b border-edge-subtle bg-surface-base/85 px-4 py-2 backdrop-blur',\n 'sm:flex-row sm:items-center sm:justify-between',\n )}\n role=\"region\"\n aria-label={t.title}\n >\n <p className=\"text-xs text-fg-muted\">\n {anyDirty\n ? t.dirtySummary.replace('{{count}}', String(dirtyCount))\n : savedFlash\n ? t.savedSummary\n : t.cleanSummary}\n </p>\n <div className=\"flex shrink-0 flex-wrap items-center gap-2\">\n {failures.length > 0 ? (\n <span className=\"text-xs text-red-600 dark:text-red-400\" role=\"alert\">\n {t.failuresSummary.replace('{{count}}', String(failures.length))}\n </span>\n ) : null}\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"px-2.5 py-1.5 text-xs\"\n disabled={!anyDirty || anySaving}\n onClick={() => discardAll()}\n >\n {t.discardAll}\n </Button>\n <Button\n type=\"button\"\n variant=\"primary\"\n className=\"px-2.5 py-1.5 text-xs\"\n disabled={!anyDirty || anySaving}\n onClick={() => void onSaveAll()}\n >\n {anySaving ? <Loader2 className=\"size-3.5 animate-spin\" aria-hidden /> : null}\n <span className={anySaving ? 'ml-1.5' : undefined}>{t.saveAll}</span>\n </Button>\n </div>\n </div>\n );\n}\n","import { ExternalLink, Loader2, Mic, Volume2 } from 'lucide-react';\nimport { useCallback, useMemo, useReducer, useRef, useState, type ReactNode } from 'react';\nimport useSWR from 'swr';\n\nimport { Button } from '@/components/ui/button';\nimport { useSaveBarRegistration } from '@/features/settings/save-bar/use-save-bar-registration';\nimport { useGatewayConfigSwr } from '@/features/gateway/gateway-config-swr';\nimport {\n fetchVoiceModels,\n fetchVoiceProviders,\n fetchVoiceSttProviders,\n normalizeVoiceSettings,\n patchVoiceSettings,\n type SttProviderListEntry,\n type TtsProviderListEntry,\n type VoiceModelsPayload,\n type VoiceSettingsState,\n} from '@/features/settings/voice-config-api';\nimport {\n VoiceApiKeyField,\n type VoiceApiKeyFieldLabels,\n} from '@/features/settings/voice-api-key-field';\nimport { apiUrl } from '@/lib/url';\nimport { nativeSelectMaxWidthClass, selectControlBaseClass, settingsInputFocusClass } from '@/lib/form-field-width';\nimport { cn } from '@/lib/cn';\nimport { messages, type VoiceSettingsMessages } from '@/i18n/messages';\nimport { docsGuidePageUrl } from '@/navigation';\nimport { useGatewayStore } from '@/stores/gateway-store';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nconst credentialFieldWidthClass = nativeSelectMaxWidthClass;\n\nfunction sttEnvHint(provider: string): string {\n switch (provider) {\n case 'alibaba':\n return '(DASHSCOPE_API_KEY)';\n case 'openai':\n return '(OPENAI_API_KEY)';\n case 'groq':\n return '(GROQ_API_KEY)';\n default:\n return '';\n }\n}\n\nfunction ttsEnvHint(provider: string): string {\n switch (provider) {\n case 'alibaba':\n return '(DASHSCOPE_API_KEY)';\n case 'openai':\n return '(OPENAI_API_KEY)';\n case 'minimax':\n return '(MINIMAX_API_KEY)';\n default:\n return '';\n }\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\nfunction selectClassName(): string {\n return cn(selectControlBaseClass, nativeSelectMaxWidthClass);\n}\n\nconst STT_ALIBABA_FALLBACK = [\n { id: 'paraformer-v2', name: 'Paraformer v2' },\n { id: 'paraformer-v1', name: 'Paraformer v1' },\n];\nconst STT_OPENAI_FALLBACK = [{ id: 'whisper-1', name: 'Whisper-1' }];\nconst STT_GROQ_MODELS_FALLBACK = [\n { id: 'whisper-large-v3-turbo', name: 'Whisper Large v3 Turbo' },\n { id: 'whisper-large-v3', name: 'Whisper Large v3' },\n];\nconst TTS_OPENAI_MODELS_FALLBACK = [\n { id: 'tts-1', name: 'TTS-1' },\n { id: 'tts-1-hd', name: 'TTS-1 HD' },\n];\nconst TTS_OPENAI_VOICES_FALLBACK = [\n { id: 'alloy', name: 'Alloy' },\n { id: 'echo', name: 'Echo' },\n];\nconst TTS_ALIBABA_MODELS_FALLBACK = [\n { id: 'qwen-tts', name: 'Qwen TTS' },\n { id: 'qwen3-tts-flash', name: 'Qwen3 TTS Flash' },\n];\nconst TTS_ALIBABA_VOICES_FALLBACK = [\n { id: 'Cherry', name: 'Cherry' },\n { id: 'longxiaochun', name: 'Long Xiao Chun' },\n];\nconst TTS_EDGE_VOICES_FALLBACK = [\n { id: 'en-US-MichelleNeural', name: 'Michelle (US English)' },\n { id: 'zh-CN-XiaoxiaoNeural', name: 'Xiaoxiao (Chinese)' },\n];\nconst TTS_MINIMAX_MODELS_FALLBACK = [\n { id: 'speech-2.8-hd', name: 'Speech 2.8 HD (Recommended)' },\n { id: 'speech-2.8-turbo', name: 'Speech 2.8 Turbo (Fast)' },\n];\nconst TTS_MINIMAX_VOICES_FALLBACK = [\n { id: 'male-qn-qingse', name: 'Male Qingse (青涩男声)' },\n { id: 'female-shaonv', name: 'Female Shaonv (少女音)' },\n];\n\nconst FALLBACK_TTS_PROVIDERS: TtsProviderListEntry[] = [\n { id: 'openai', aliases: [], configured: false },\n { id: 'alibaba', aliases: [], configured: false },\n { id: 'minimax', aliases: [], configured: false },\n { id: 'edge', aliases: [], configured: false },\n { id: 'tts-local-cli', aliases: ['cli', 'local-cli'], configured: false },\n];\n\nconst FALLBACK_STT_PROVIDERS: SttProviderListEntry[] = [\n { id: 'alibaba', aliases: ['dashscope', 'paraformer'], configured: false },\n { id: 'openai', aliases: [], configured: false },\n];\n\nfunction sttProviderLabel(id: string, v: VoiceSettingsMessages): string {\n switch (id) {\n case 'openai':\n return v.stt.openai;\n case 'alibaba':\n return v.stt.alibaba;\n case 'groq':\n return 'Groq';\n default:\n return id;\n }\n}\n\nfunction ttsProviderLabel(id: string, v: VoiceSettingsMessages): string {\n switch (id) {\n case 'openai':\n return v.tts.providerOpenai;\n case 'alibaba':\n return v.stt.alibaba;\n case 'edge':\n return v.tts.providerEdge;\n case 'tts-local-cli':\n return v.tts.providerLocalCli;\n case 'minimax':\n return 'MiniMax';\n default:\n return id;\n }\n}\n\nfunction voiceApiKeyLabels(v: VoiceSettingsMessages): VoiceApiKeyFieldLabels {\n return {\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\ntype VoiceFormDraft = {\n form: VoiceSettingsState | null;\n baseline: VoiceSettingsState | null;\n};\n\ntype VoiceFormAction =\n | { type: 'reset' }\n | { type: 'sync'; value: VoiceSettingsState }\n | { type: 'update'; updater: (prev: VoiceSettingsState | null) => VoiceSettingsState | null }\n | { type: 'discard' }\n | { type: 'saved'; value: VoiceSettingsState };\n\nfunction voiceFormReducer(state: VoiceFormDraft, action: VoiceFormAction): VoiceFormDraft {\n switch (action.type) {\n case 'reset':\n return { form: null, baseline: null };\n case 'sync': {\n const snapshot = structuredClone(action.value);\n return { form: snapshot, baseline: structuredClone(snapshot) };\n }\n case 'update':\n return { ...state, form: action.updater(state.form) };\n case 'discard':\n return state.baseline\n ? { form: structuredClone(state.baseline), baseline: state.baseline }\n : state;\n case 'saved': {\n const snapshot = structuredClone(action.value);\n return { form: snapshot, baseline: structuredClone(snapshot) };\n }\n }\n}\n\n/** See `WebSearchSettingsPanel` for the embedded-mode contract. */\nexport function VoiceSettingsPanel({ embedded = false }: { embedded?: boolean } = {}) {\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const v = m.voiceSettings;\n const token = useGatewayStore((st) => st.token);\n const hasToken = Boolean(token);\n\n const [formDraft, dispatchForm] = useReducer(voiceFormReducer, { form: null, baseline: null });\n const form = formDraft.form;\n const baseline = formDraft.baseline;\n const [models, setModels] = useState<VoiceModelsPayload | null>(null);\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [saveOk, setSaveOk] = useState(false);\n const dirtyRef = useRef(false);\n const trackedVoiceSyncRef = useRef<{\n parsed: VoiceSettingsState | null;\n models: VoiceModelsPayload | null | undefined;\n }>({ parsed: null, models: undefined });\n\n const {\n data: cfgData,\n error: cfgErr,\n isLoading: cfgLoading,\n mutate: mutCfg,\n } = useGatewayConfigSwr(hasToken);\n const {\n data: voiceModels,\n error: vmErr,\n isLoading: vmLoading,\n mutate: mutVm,\n } = useSWR(hasToken ? apiUrl('/api/voice/models') : null, fetchVoiceModels, { revalidateOnFocus: false });\n const {\n data: voiceProviders,\n error: vpErr,\n isLoading: vpLoading,\n } = useSWR(hasToken ? apiUrl('/api/voice/providers') : null, fetchVoiceProviders, {\n revalidateOnFocus: false,\n });\n const {\n data: voiceSttProviders,\n error: vspErr,\n isLoading: vspLoading,\n } = useSWR(hasToken ? apiUrl('/api/voice/stt-providers') : null, fetchVoiceSttProviders, {\n revalidateOnFocus: false,\n });\n\n const ttsProviders = useMemo(\n () => voiceProviders?.providers ?? FALLBACK_TTS_PROVIDERS,\n [voiceProviders],\n );\n\n const sttProviders = useMemo(\n () => voiceSttProviders?.providers ?? FALLBACK_STT_PROVIDERS,\n [voiceSttProviders],\n );\n\n const voiceParsed = useMemo(\n () =>\n cfgData?.payload?.config !== undefined\n ? normalizeVoiceSettings(cfgData.payload.config)\n : null,\n [cfgData],\n );\n\n const dirty = useMemo(() => {\n if (!form || !baseline) return false;\n return JSON.stringify(form) !== JSON.stringify(baseline);\n }, [form, baseline]);\n\n if (!hasToken) {\n if (trackedVoiceSyncRef.current.parsed !== null || trackedVoiceSyncRef.current.models !== undefined) {\n trackedVoiceSyncRef.current = { parsed: null, models: undefined };\n dispatchForm({ type: 'reset' });\n setModels(null);\n dirtyRef.current = false;\n }\n } else if (voiceParsed !== null && voiceModels !== undefined && !dirtyRef.current) {\n if (\n trackedVoiceSyncRef.current.parsed !== voiceParsed ||\n trackedVoiceSyncRef.current.models !== voiceModels\n ) {\n trackedVoiceSyncRef.current = { parsed: voiceParsed, models: voiceModels };\n dispatchForm({ type: 'sync', value: voiceParsed });\n setModels(voiceModels);\n setSaveOk(false);\n }\n }\n\n const loading = Boolean(\n hasToken &&\n (voiceParsed === null ||\n voiceModels === undefined ||\n voiceProviders === undefined ||\n voiceSttProviders === undefined) &&\n (cfgLoading || vmLoading || vpLoading || vspLoading),\n );\n const fetchError =\n cfgErr instanceof Error\n ? cfgErr.message\n : cfgErr\n ? String(cfgErr)\n : vmErr instanceof Error\n ? vmErr.message\n : vmErr\n ? String(vmErr)\n : vpErr instanceof Error\n ? vpErr.message\n : vpErr\n ? String(vpErr)\n : vspErr instanceof Error\n ? vspErr.message\n : vspErr\n ? String(vspErr)\n : null;\n\n const updateStt = useCallback((patch: Partial<VoiceSettingsState['stt']>) => {\n dirtyRef.current = true;\n dispatchForm({\n type: 'update',\n updater: (f) => (f ? { ...f, stt: { ...f.stt, ...patch } } : null),\n });\n }, []);\n\n const updateSttAlibaba = useCallback((patch: Partial<NonNullable<VoiceSettingsState['stt']['alibaba']>>) => {\n dirtyRef.current = true;\n dispatchForm({\n type: 'update',\n updater: (f) =>\n f\n ? {\n ...f,\n stt: { ...f.stt, alibaba: { ...f.stt.alibaba, ...patch } },\n }\n : null,\n });\n }, []);\n\n const updateSttOpenai = useCallback((patch: Partial<NonNullable<VoiceSettingsState['stt']['openai']>>) => {\n dirtyRef.current = true;\n dispatchForm({\n type: 'update',\n updater: (f) =>\n f\n ? {\n ...f,\n stt: { ...f.stt, openai: { ...f.stt.openai, ...patch } },\n }\n : null,\n });\n }, []);\n\n const updateSttFallback = useCallback((patch: Partial<NonNullable<VoiceSettingsState['stt']['fallback']>>) => {\n dirtyRef.current = true;\n dispatchForm({\n type: 'update',\n updater: (f) => {\n if (!f) return null;\n const cur = f.stt.fallback ?? { enabled: true, order: ['alibaba', 'openai'] };\n return {\n ...f,\n stt: {\n ...f.stt,\n fallback: { ...cur, ...patch },\n },\n };\n },\n });\n }, []);\n\n const updateTts = useCallback((patch: Partial<VoiceSettingsState['tts']>) => {\n dirtyRef.current = true;\n dispatchForm({\n type: 'update',\n updater: (f) => (f ? { ...f, tts: { ...f.tts, ...patch } } : null),\n });\n }, []);\n\n const updateTtsAlibaba = useCallback((patch: Partial<NonNullable<VoiceSettingsState['tts']['alibaba']>>) => {\n dirtyRef.current = true;\n dispatchForm({\n type: 'update',\n updater: (f) =>\n f\n ? {\n ...f,\n tts: { ...f.tts, alibaba: { ...f.tts.alibaba, ...patch } },\n }\n : null,\n });\n }, []);\n\n const updateTtsOpenai = useCallback((patch: Partial<NonNullable<VoiceSettingsState['tts']['openai']>>) => {\n dirtyRef.current = true;\n dispatchForm({\n type: 'update',\n updater: (f) =>\n f\n ? {\n ...f,\n tts: { ...f.tts, openai: { ...f.tts.openai, ...patch } },\n }\n : null,\n });\n }, []);\n\n const updateTtsEdge = useCallback((patch: Partial<NonNullable<VoiceSettingsState['tts']['edge']>>) => {\n dirtyRef.current = true;\n dispatchForm({\n type: 'update',\n updater: (f) =>\n f\n ? {\n ...f,\n tts: { ...f.tts, edge: { ...f.tts.edge, ...patch } },\n }\n : null,\n });\n }, []);\n\n const updateTtsMinimax = useCallback(\n (patch: Partial<NonNullable<VoiceSettingsState['tts']['minimax']>>) => {\n dirtyRef.current = true;\n dispatchForm({\n type: 'update',\n updater: (f) => (f ? { ...f, tts: { ...f.tts, minimax: { ...f.tts.minimax, ...patch } } } : null),\n });\n },\n [],\n );\n\n const updateTtsLocalCli = useCallback(\n (patch: Partial<NonNullable<VoiceSettingsState['tts']['tts-local-cli']>>) => {\n dirtyRef.current = true;\n dispatchForm({\n type: 'update',\n updater: (f) =>\n f\n ? {\n ...f,\n tts: {\n ...f.tts,\n 'tts-local-cli': { ...f.tts['tts-local-cli'], ...patch },\n },\n }\n : null,\n });\n },\n [],\n );\n\n const save = useCallback(async () => {\n if (!form || saving) return;\n setSaving(true);\n setError(null);\n setSaveOk(false);\n try {\n await patchVoiceSettings(form);\n dispatchForm({ type: 'saved', value: form });\n dirtyRef.current = false;\n setSaveOk(true);\n window.setTimeout(() => setSaveOk(false), 2500);\n } catch (e) {\n setError(e instanceof Error ? e.message : v.saveError);\n } finally {\n setSaving(false);\n }\n }, [form, saving, v.saveError]);\n\n const discard = useCallback(() => {\n if (!baseline) return;\n dirtyRef.current = false;\n dispatchForm({ type: 'discard' });\n setError(null);\n setSaveOk(false);\n }, [baseline]);\n\n useSaveBarRegistration({ id: 'voice', dirty, saving, save, discard });\n\n const outerClass = embedded\n ? 'flex flex-col gap-4'\n : 'mx-auto flex w-full max-w-app-main flex-col gap-6 px-4 py-6';\n const compactClass = embedded\n ? 'flex flex-col gap-3'\n : 'mx-auto flex w-full max-w-app-main flex-col gap-3 px-4 py-8';\n\n if (!hasToken) {\n return (\n <div className={compactClass}>\n {embedded ? null : <h1 className=\"text-lg font-semibold text-fg\">{m.settingsSections.voice}</h1>}\n <p className=\"text-sm text-fg-muted\">{v.needToken}</p>\n </div>\n );\n }\n\n if (loading) {\n return (\n <div className={compactClass}>\n <div className=\"flex items-center gap-2 text-sm text-fg-muted\">\n <Loader2 className=\"size-4 animate-spin\" />\n {v.loading}\n </div>\n </div>\n );\n }\n\n if (!form || models === null) {\n return (\n <div className={compactClass}>\n <p className=\"text-sm text-fg-muted\">{error ?? fetchError ?? v.loadError}</p>\n <Button\n type=\"button\"\n variant=\"secondary\"\n onClick={() => {\n void mutCfg();\n void mutVm();\n }}\n >\n {v.retry}\n </Button>\n </div>\n );\n }\n\n const stt = form.stt;\n const tts = form.tts;\n const apiKeyLabels = voiceApiKeyLabels(v);\n\n return (\n <div className={outerClass}>\n <header className=\"flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between\">\n {embedded ? (\n <div className=\"min-w-0\" aria-hidden />\n ) : (\n <div>\n <h1 className=\"text-lg font-semibold tracking-tight text-fg\">{m.settingsSections.voice}</h1>\n <p className=\"mt-1 text-sm text-fg-muted\">{v.subtitle}</p>\n <a\n href={docsGuidePageUrl(language, 'voice')}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"mt-1 inline-flex items-center gap-1 text-sm text-accent hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/40\"\n >\n {v.docsLink}\n <ExternalLink className=\"size-3.5\" />\n </a>\n </div>\n )}\n {/* See WebSearchSettingsPanel — global Save bar replaces these in embedded mode. */}\n {embedded ? null : (\n <div className=\"flex shrink-0 flex-wrap items-center justify-end gap-2\">\n {saveOk ? <span className=\"text-sm text-fg-muted\">{v.saved}</span> : null}\n <Button type=\"button\" variant=\"secondary\" disabled={!dirty || saving} onClick={discard}>\n {v.discard}\n </Button>\n <Button type=\"button\" variant=\"primary\" disabled={!dirty || saving} onClick={() => void save()}>\n {saving ? v.saving : v.save}\n </Button>\n </div>\n )}\n </header>\n\n {dirty && !embedded ? <p className=\"text-xs text-amber-800 dark:text-amber-200\">{v.unsavedHint}</p> : null}\n {error ? <p className=\"text-sm text-red-600 dark:text-red-400\">{error}</p> : null}\n\n <div className=\"flex flex-col gap-4\">\n <SttSection\n v={v}\n apiKeyLabels={apiKeyLabels}\n stt={stt}\n models={models}\n sttProviders={sttProviders}\n updateStt={updateStt}\n updateSttAlibaba={updateSttAlibaba}\n updateSttOpenai={updateSttOpenai}\n updateSttFallback={updateSttFallback}\n />\n\n <TtsSection\n v={v}\n apiKeyLabels={apiKeyLabels}\n tts={tts}\n models={models}\n ttsProviders={ttsProviders}\n updateTts={updateTts}\n updateTtsAlibaba={updateTtsAlibaba}\n updateTtsOpenai={updateTtsOpenai}\n updateTtsEdge={updateTtsEdge}\n updateTtsMinimax={updateTtsMinimax}\n updateTtsLocalCli={updateTtsLocalCli}\n />\n </div>\n\n <div className=\"rounded-xl border border-accent/25 bg-accent/5 px-4 py-3 dark:border-accent/30 dark:bg-accent/10\">\n <p className=\"text-sm text-fg\">\n <strong className=\"text-accent\">{v.notes.title}</strong> {v.notes.duration}\n </p>\n <p className=\"mt-2 text-xs text-fg-muted\">{v.notes.envVars}</p>\n </div>\n </div>\n );\n}\n\nfunction SttSection({\n v,\n apiKeyLabels,\n stt,\n models,\n sttProviders,\n updateStt,\n updateSttAlibaba,\n updateSttOpenai,\n updateSttFallback,\n}: {\n v: VoiceSettingsMessages;\n apiKeyLabels: VoiceApiKeyFieldLabels;\n stt: VoiceSettingsState['stt'];\n models: VoiceModelsPayload | null;\n sttProviders: SttProviderListEntry[];\n updateStt: (p: Partial<VoiceSettingsState['stt']>) => void;\n updateSttAlibaba: (p: Partial<NonNullable<VoiceSettingsState['stt']['alibaba']>>) => void;\n updateSttOpenai: (p: Partial<NonNullable<VoiceSettingsState['stt']['openai']>>) => void;\n updateSttFallback: (p: Partial<NonNullable<VoiceSettingsState['stt']['fallback']>>) => void;\n}) {\n const alibabaModels = models?.stt?.alibaba?.length ? models.stt.alibaba : STT_ALIBABA_FALLBACK;\n const openaiModels = models?.stt?.openai?.length ? models.stt.openai : STT_OPENAI_FALLBACK;\n\n const providerOptions = useMemo(() => {\n const seen = new Set<string>();\n const options: SttProviderListEntry[] = [];\n for (const entry of sttProviders) {\n if (seen.has(entry.id)) continue;\n seen.add(entry.id);\n options.push(entry);\n }\n if (stt.provider && !seen.has(stt.provider)) {\n options.push({ id: stt.provider, aliases: [], configured: false });\n }\n return options;\n }, [sttProviders, stt.provider]);\n\n const extensionProviderSlice = stt.providers?.[stt.provider];\n const extensionApiKey =\n typeof extensionProviderSlice?.apiKey === 'string' ? extensionProviderSlice.apiKey : '';\n const extensionModel =\n typeof extensionProviderSlice?.model === 'string' ? extensionProviderSlice.model : '';\n\n const updateExtensionProvider = useCallback(\n (patch: Record<string, unknown>) => {\n updateStt({\n providers: {\n ...(stt.providers ?? {}),\n [stt.provider]: {\n ...(stt.providers?.[stt.provider] ?? {}),\n ...patch,\n },\n },\n });\n },\n [stt.provider, stt.providers, updateStt],\n );\n\n return (\n <section className=\"rounded-2xl bg-surface-base px-4 py-5 sm:px-5\">\n <div className=\"mb-4\">\n <div className=\"flex items-center gap-2 text-sm font-semibold text-fg\">\n <Mic className=\"size-4 text-accent\" strokeWidth={1.75} />\n {v.stt.title}\n </div>\n <p className=\"mt-1 text-xs text-fg-muted\">{v.stt.description}</p>\n </div>\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between gap-2 rounded-xl bg-surface-hover/50 px-3 py-2.5 dark:bg-surface-hover/35\">\n <div>\n <div className=\"text-sm font-medium text-fg\">{v.stt.enable}</div>\n <p className=\"text-xs text-fg-muted\">{v.stt.enableDesc}</p>\n </div>\n <input\n type=\"checkbox\"\n className=\"ui-checkbox\"\n checked={stt.enabled}\n onChange={(e) => updateStt({ enabled: e.target.checked })}\n />\n </div>\n\n {stt.enabled ? (\n <>\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <div className={cn('flex flex-col gap-1.5', credentialFieldWidthClass)}>\n <FieldLabel>{v.stt.provider}</FieldLabel>\n <select\n className={selectClassName()}\n value={stt.provider}\n onChange={(e) => updateStt({ provider: e.target.value })}\n >\n {providerOptions.map((entry) => (\n <option key={entry.id} value={entry.id}>\n {sttProviderLabel(entry.id, v)}\n {entry.configured ? '' : ' *'}\n </option>\n ))}\n </select>\n </div>\n\n <div className={cn('flex flex-col gap-1.5', credentialFieldWidthClass)}>\n <FieldLabel>{v.stt.model}</FieldLabel>\n {stt.provider === 'alibaba' ? (\n <select\n className={selectClassName()}\n value={stt.alibaba?.model ?? ''}\n onChange={(e) => updateSttAlibaba({ model: e.target.value })}\n >\n {alibabaModels.map((m) => (\n <option key={m.id} value={m.id}>\n {m.name}\n </option>\n ))}\n </select>\n ) : stt.provider === 'openai' ? (\n <select\n className={selectClassName()}\n value={stt.openai?.model ?? ''}\n onChange={(e) => updateSttOpenai({ model: e.target.value })}\n >\n {openaiModels.map((m) => (\n <option key={m.id} value={m.id}>\n {m.name}\n </option>\n ))}\n </select>\n ) : stt.provider === 'groq' ? (\n <select\n className={selectClassName()}\n value={extensionModel || STT_GROQ_MODELS_FALLBACK[0].id}\n onChange={(e) => updateExtensionProvider({ model: e.target.value })}\n >\n {STT_GROQ_MODELS_FALLBACK.map((m) => (\n <option key={m.id} value={m.id}>\n {m.name}\n </option>\n ))}\n </select>\n ) : (\n <input\n className={inputClassName()}\n value={extensionModel}\n onChange={(e) => updateExtensionProvider({ model: e.target.value })}\n placeholder={stt.provider}\n />\n )}\n </div>\n\n <div className={cn('flex flex-col gap-1.5', credentialFieldWidthClass)}>\n <FieldLabel>{v.stt.apiKey}</FieldLabel>\n <VoiceApiKeyField\n kind=\"stt\"\n providerId={stt.provider}\n fieldId={`voice-stt-${stt.provider}-api-key`}\n value={\n stt.provider === 'alibaba'\n ? (stt.alibaba?.apiKey ?? '')\n : stt.provider === 'openai'\n ? (stt.openai?.apiKey ?? '')\n : extensionApiKey\n }\n onChange={(next) => {\n if (stt.provider === 'alibaba') updateSttAlibaba({ apiKey: next });\n else if (stt.provider === 'openai') updateSttOpenai({ apiKey: next });\n else updateExtensionProvider({ apiKey: next });\n }}\n labels={apiKeyLabels}\n placeholder={stt.provider === 'groq' ? 'gsk_...' : 'sk-...'}\n />\n <p className=\"text-xs text-fg-subtle\">\n {v.stt.apiKeyDesc}\n {sttEnvHint(stt.provider) ? ` ${sttEnvHint(stt.provider)}` : ''}\n </p>\n </div>\n </div>\n\n <div className=\"flex items-center justify-between gap-2 rounded-xl bg-surface-hover/50 px-3 py-2.5 dark:bg-surface-hover/35\">\n <div>\n <div className=\"text-sm font-medium text-fg\">{v.stt.fallback}</div>\n <p className=\"text-xs text-fg-muted\">{v.stt.fallbackDesc}</p>\n </div>\n <input\n type=\"checkbox\"\n className=\"ui-checkbox\"\n checked={stt.fallback?.enabled ?? true}\n onChange={(e) => updateSttFallback({ enabled: e.target.checked })}\n />\n </div>\n </>\n ) : null}\n </div>\n </section>\n );\n}\n\nfunction TtsSection({\n v,\n apiKeyLabels,\n tts,\n models,\n ttsProviders,\n updateTts,\n updateTtsAlibaba,\n updateTtsOpenai,\n updateTtsEdge,\n updateTtsMinimax,\n updateTtsLocalCli,\n}: {\n v: VoiceSettingsMessages;\n apiKeyLabels: VoiceApiKeyFieldLabels;\n tts: VoiceSettingsState['tts'];\n models: VoiceModelsPayload | null;\n ttsProviders: TtsProviderListEntry[];\n updateTts: (p: Partial<VoiceSettingsState['tts']>) => void;\n updateTtsAlibaba: (p: Partial<NonNullable<VoiceSettingsState['tts']['alibaba']>>) => void;\n updateTtsOpenai: (p: Partial<NonNullable<VoiceSettingsState['tts']['openai']>>) => void;\n updateTtsEdge: (p: Partial<NonNullable<VoiceSettingsState['tts']['edge']>>) => void;\n updateTtsMinimax: (p: Partial<NonNullable<VoiceSettingsState['tts']['minimax']>>) => void;\n updateTtsLocalCli: (p: Partial<NonNullable<VoiceSettingsState['tts']['tts-local-cli']>>) => void;\n}) {\n const triggerDesc = (t: string) => {\n if (t === 'off') return v.tts.triggerDescOff;\n if (t === 'always') return v.tts.triggerDescAlways;\n if (t === 'inbound') return v.tts.triggerDescInbound;\n if (t === 'tagged') return v.tts.triggerDescTagged;\n return '';\n };\n\n const ttsOpenai = models?.tts?.openai?.length ? models.tts.openai : TTS_OPENAI_MODELS_FALLBACK;\n const ttsVoicesOpenai = models?.ttsVoices?.openai?.length ? models.ttsVoices.openai : TTS_OPENAI_VOICES_FALLBACK;\n const ttsAlibaba = models?.tts?.alibaba?.length ? models.tts.alibaba : TTS_ALIBABA_MODELS_FALLBACK;\n const ttsVoicesAlibaba = models?.ttsVoices?.alibaba?.length ? models.ttsVoices.alibaba : TTS_ALIBABA_VOICES_FALLBACK;\n const ttsVoicesEdge = models?.ttsVoices?.edge?.length ? models.ttsVoices.edge : TTS_EDGE_VOICES_FALLBACK;\n const ttsMinimax = models?.tts?.minimax?.length ? models.tts.minimax : TTS_MINIMAX_MODELS_FALLBACK;\n const ttsVoicesMinimax = models?.ttsVoices?.minimax?.length\n ? models.ttsVoices.minimax\n : TTS_MINIMAX_VOICES_FALLBACK;\n\n const providerOptions = useMemo(() => {\n const seen = new Set<string>();\n const options: TtsProviderListEntry[] = [];\n for (const entry of ttsProviders) {\n if (seen.has(entry.id)) continue;\n seen.add(entry.id);\n options.push(entry);\n }\n if (tts.provider && !seen.has(tts.provider)) {\n options.push({ id: tts.provider, aliases: [], configured: false });\n }\n return options;\n }, [ttsProviders, tts.provider]);\n\n return (\n <section className=\"rounded-2xl bg-surface-base px-4 py-5 sm:px-5\">\n <div className=\"mb-4\">\n <div className=\"flex items-center gap-2 text-sm font-semibold text-fg\">\n <Volume2 className=\"size-4 text-accent\" strokeWidth={1.75} />\n {v.tts.title}\n </div>\n <p className=\"mt-1 text-xs text-fg-muted\">{v.tts.description}</p>\n </div>\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between gap-2 rounded-xl bg-surface-hover/50 px-3 py-2.5 dark:bg-surface-hover/35\">\n <div>\n <div className=\"text-sm font-medium text-fg\">{v.tts.enable}</div>\n <p className=\"text-xs text-fg-muted\">{v.tts.enableDesc}</p>\n </div>\n <input\n type=\"checkbox\"\n className=\"ui-checkbox\"\n checked={tts.enabled}\n onChange={(e) => updateTts({ enabled: e.target.checked })}\n />\n </div>\n\n {tts.enabled ? (\n <>\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <div className={cn('flex flex-col gap-1.5', credentialFieldWidthClass)}>\n <FieldLabel>{v.tts.trigger}</FieldLabel>\n <select\n className={selectClassName()}\n value={tts.trigger}\n onChange={(e) =>\n updateTts({ trigger: e.target.value as VoiceSettingsState['tts']['trigger'] })\n }\n >\n <option value=\"off\">{v.tts.triggerOff}</option>\n <option value=\"always\">{v.tts.triggerAlways}</option>\n <option value=\"inbound\">{v.tts.triggerInbound}</option>\n <option value=\"tagged\">{v.tts.triggerTagged}</option>\n </select>\n <p className=\"text-xs text-fg-subtle\">{triggerDesc(tts.trigger)}</p>\n </div>\n <div className={cn('flex flex-col gap-1.5', credentialFieldWidthClass)}>\n <FieldLabel>{v.tts.provider}</FieldLabel>\n <select\n className={selectClassName()}\n value={tts.provider}\n onChange={(e) => updateTts({ provider: e.target.value })}\n >\n {providerOptions.map((entry) => (\n <option key={entry.id} value={entry.id}>\n {ttsProviderLabel(entry.id, v)}\n </option>\n ))}\n </select>\n </div>\n </div>\n\n {tts.provider === 'openai' ||\n tts.provider === 'alibaba' ||\n tts.provider === 'minimax' ? (\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <div className={cn('flex flex-col gap-1.5', credentialFieldWidthClass)}>\n <FieldLabel>{v.stt.apiKey}</FieldLabel>\n <VoiceApiKeyField\n kind=\"tts\"\n providerId={tts.provider}\n fieldId={`voice-tts-${tts.provider}-api-key`}\n value={\n tts.provider === 'openai'\n ? (tts.openai?.apiKey ?? '')\n : tts.provider === 'alibaba'\n ? (tts.alibaba?.apiKey ?? '')\n : (tts.minimax?.apiKey ?? '')\n }\n onChange={(next) => {\n if (tts.provider === 'openai') updateTtsOpenai({ apiKey: next });\n else if (tts.provider === 'alibaba') updateTtsAlibaba({ apiKey: next });\n else updateTtsMinimax({ apiKey: next });\n }}\n labels={apiKeyLabels}\n placeholder={tts.provider === 'minimax' ? 'eyJ...' : 'sk-...'}\n />\n <p className=\"text-xs text-fg-subtle\">\n {v.stt.apiKeyDesc}\n {ttsEnvHint(tts.provider) ? ` ${ttsEnvHint(tts.provider)}` : ''}\n </p>\n </div>\n\n <div className={cn('flex flex-col gap-1.5', credentialFieldWidthClass)}>\n <FieldLabel>{v.stt.model}</FieldLabel>\n <select\n className={selectClassName()}\n value={\n tts.provider === 'openai'\n ? (tts.openai?.model ?? '')\n : tts.provider === 'alibaba'\n ? (tts.alibaba?.model ?? '')\n : (tts.minimax?.model ?? '')\n }\n onChange={(e) => {\n if (tts.provider === 'openai') updateTtsOpenai({ model: e.target.value });\n else if (tts.provider === 'alibaba') updateTtsAlibaba({ model: e.target.value });\n else updateTtsMinimax({ model: e.target.value });\n }}\n >\n {(tts.provider === 'openai'\n ? ttsOpenai\n : tts.provider === 'alibaba'\n ? ttsAlibaba\n : ttsMinimax\n ).map((m) => (\n <option key={m.id} value={m.id}>\n {m.name}\n </option>\n ))}\n </select>\n </div>\n\n <div className={cn('flex flex-col gap-1.5', credentialFieldWidthClass)}>\n <FieldLabel>{v.tts.voice}</FieldLabel>\n <select\n className={selectClassName()}\n value={\n tts.provider === 'openai'\n ? (tts.openai?.voice ?? '')\n : tts.provider === 'alibaba'\n ? (tts.alibaba?.voice ?? '')\n : (tts.minimax?.voice ?? '')\n }\n onChange={(e) => {\n if (tts.provider === 'openai') updateTtsOpenai({ voice: e.target.value });\n else if (tts.provider === 'alibaba') updateTtsAlibaba({ voice: e.target.value });\n else updateTtsMinimax({ voice: e.target.value });\n }}\n >\n {(tts.provider === 'openai'\n ? ttsVoicesOpenai\n : tts.provider === 'alibaba'\n ? ttsVoicesAlibaba\n : ttsVoicesMinimax\n ).map((m) => (\n <option key={m.id} value={m.id}>\n {m.name}\n </option>\n ))}\n </select>\n </div>\n </div>\n ) : null}\n\n {tts.provider === 'edge' ? (\n <div className={cn('flex flex-col gap-1.5', credentialFieldWidthClass)}>\n <FieldLabel>{v.tts.voice}</FieldLabel>\n <select\n className={selectClassName()}\n value={tts.edge?.voice ?? ''}\n onChange={(e) => updateTtsEdge({ voice: e.target.value })}\n >\n {ttsVoicesEdge.map((m) => (\n <option key={m.id} value={m.id}>\n {m.name}\n </option>\n ))}\n </select>\n <p className=\"text-xs text-fg-subtle\">{v.tts.edgeHint}</p>\n </div>\n ) : null}\n\n {tts.provider === 'tts-local-cli' ? (\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <div className=\"flex flex-col gap-1.5 sm:col-span-2\">\n <FieldLabel>{v.tts.localCli.command}</FieldLabel>\n <input\n className={cn(inputClassName(), 'font-mono text-xs')}\n type=\"text\"\n autoComplete=\"off\"\n spellCheck={false}\n value={tts['tts-local-cli']?.command ?? ''}\n onChange={(e) => updateTtsLocalCli({ command: e.target.value })}\n placeholder={v.tts.localCli.commandPlaceholder}\n />\n <p className=\"text-xs text-fg-subtle\">{v.tts.localCli.commandDesc}</p>\n </div>\n <div className=\"flex flex-col gap-1.5\">\n <FieldLabel>{v.tts.localCli.cwd}</FieldLabel>\n <input\n className={cn(inputClassName(), 'font-mono text-xs')}\n type=\"text\"\n autoComplete=\"off\"\n spellCheck={false}\n value={tts['tts-local-cli']?.cwd ?? ''}\n onChange={(e) => updateTtsLocalCli({ cwd: e.target.value })}\n placeholder=\"/path/to/cwd\"\n />\n <p className=\"text-xs text-fg-subtle\">{v.tts.localCli.cwdDesc}</p>\n </div>\n <div className=\"flex flex-col gap-1.5\">\n <FieldLabel>{v.tts.localCli.outputFormat}</FieldLabel>\n <select\n className={selectClassName()}\n value={tts['tts-local-cli']?.outputFormat ?? 'wav'}\n onChange={(e) =>\n updateTtsLocalCli({\n outputFormat: e.target.value as 'mp3' | 'opus' | 'wav',\n })\n }\n >\n <option value=\"wav\">wav</option>\n <option value=\"mp3\">mp3</option>\n <option value=\"opus\">opus</option>\n </select>\n <p className=\"text-xs text-fg-subtle\">{v.tts.localCli.outputFormatDesc}</p>\n </div>\n <div className=\"flex flex-col gap-1.5 sm:col-span-2\">\n <FieldLabel>{v.tts.localCli.timeoutMs}</FieldLabel>\n <input\n className={inputClassName()}\n type=\"number\"\n min={0}\n step={1000}\n value={\n typeof tts['tts-local-cli']?.timeoutMs === 'number'\n ? String(tts['tts-local-cli'].timeoutMs)\n : ''\n }\n onChange={(e) => {\n const raw = e.target.value.trim();\n if (raw === '') {\n updateTtsLocalCli({ timeoutMs: undefined });\n return;\n }\n const num = Number(raw);\n if (Number.isFinite(num) && num >= 0) {\n updateTtsLocalCli({ timeoutMs: num });\n }\n }}\n placeholder=\"30000\"\n />\n <p className=\"text-xs text-fg-subtle\">{v.tts.localCli.timeoutMsDesc}</p>\n </div>\n <p className=\"text-xs text-fg-subtle sm:col-span-2\">{v.tts.localCli.hint}</p>\n </div>\n ) : null}\n </>\n ) : null}\n </div>\n </section>\n );\n}\n\nfunction FieldLabel({ children }: { children: ReactNode }) {\n return <div className=\"text-sm font-medium text-fg\">{children}</div>;\n}\n","import { revalidateGatewayConfig } from '@/features/gateway/gateway-config-swr';\nimport { fetchJson } from '@/lib/fetch';\nimport { apiUrl } from '@/lib/url';\n\nexport type SearchProviderRow = {\n type: 'brave' | 'tavily' | 'bing' | 'searxng';\n apiKey: string;\n url: string;\n disabled: boolean;\n};\n\nexport type WebSearchSettingsState = {\n regionMode: 'auto' | 'cn' | 'global';\n maxResults: number;\n providers: SearchProviderRow[];\n blocklistEnabled: boolean;\n blocklistDomains: string[];\n};\n\nexport function normalizeWebSearchSettingsFromConfig(cfg: unknown): WebSearchSettingsState {\n const tools = cfg && typeof cfg === 'object' && 'tools' in cfg ? (cfg as { tools?: unknown }).tools : undefined;\n const web = tools && typeof tools === 'object' && 'web' in tools ? (tools as { web?: unknown }).web : undefined;\n const region =\n web && typeof web === 'object' && 'region' in web\n ? (web as { region?: unknown }).region\n : undefined;\n const regionMode =\n region === 'cn' || region === 'global' ? region : 'auto';\n\n const search =\n web && typeof web === 'object' && 'search' in web ? (web as { search?: unknown }).search : undefined;\n const s = search && typeof search === 'object' ? (search as Record<string, unknown>) : {};\n\n const maxResults =\n typeof s.maxResults === 'number' && Number.isFinite(s.maxResults) ? Math.floor(s.maxResults) : 5;\n\n const blocklist =\n web && typeof web === 'object' && 'blocklist' in web ? (web as { blocklist?: unknown }).blocklist : undefined;\n const bl = blocklist && typeof blocklist === 'object' ? (blocklist as Record<string, unknown>) : {};\n const blocklistDomains = Array.isArray(bl.domains)\n ? bl.domains.filter((d): d is string => typeof d === 'string' && d.trim().length > 0)\n : [];\n\n const rawProviders = s.providers;\n const rows: SearchProviderRow[] = Array.isArray(rawProviders)\n ? rawProviders.map((p) => {\n const o = p && typeof p === 'object' ? (p as Record<string, unknown>) : {};\n const type = o.type;\n const t =\n type === 'brave' || type === 'tavily' || type === 'bing' || type === 'searxng' ? type : 'brave';\n return {\n type: t,\n apiKey: typeof o.apiKey === 'string' ? o.apiKey : '',\n url: typeof o.url === 'string' ? o.url : '',\n disabled: o.disabled === true,\n };\n })\n : [];\n\n return {\n regionMode,\n maxResults,\n providers: rows,\n blocklistEnabled: bl.enabled === true,\n blocklistDomains,\n };\n}\n\nexport async function patchWebSearchSettings(state: WebSearchSettingsState): Promise<void> {\n const region =\n state.regionMode === 'auto' ? 'auto' : state.regionMode === 'cn' ? 'cn' : 'global';\n\n const search: Record<string, unknown> = {\n maxResults: state.maxResults,\n providers: state.providers.map((p) => {\n const row: Record<string, unknown> = {\n type: p.type,\n apiKey: p.apiKey,\n };\n if (p.type === 'searxng' && p.url.trim()) {\n row.url = p.url.trim().replace(/\\/+$/, '');\n }\n if (p.disabled) row.disabled = true;\n return row;\n }),\n };\n\n await fetchJson(apiUrl('/api/config'), {\n method: 'PATCH',\n body: JSON.stringify({\n tools: {\n web: {\n region,\n search,\n blocklist: {\n enabled: state.blocklistEnabled,\n domains: state.blocklistDomains,\n },\n },\n },\n }),\n });\n void revalidateGatewayConfig();\n}\n","import { Ban, ExternalLink, Loader2, Plus, Search, Trash2 } from 'lucide-react';\nimport { useCallback, useMemo, useReducer, useRef, useState, type ReactNode } from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport { useGatewayConfigSwr } from '@/features/gateway/gateway-config-swr';\nimport {\n normalizeWebSearchSettingsFromConfig,\n patchWebSearchSettings,\n type SearchProviderRow,\n type WebSearchSettingsState,\n} from '@/features/settings/web-search-config-api';\nimport { useSaveBarRegistration } from '@/features/settings/save-bar/use-save-bar-registration';\nimport { SettingsFormSection, SettingsFormSectionHeader } from '@/features/settings/settings-form-section';\nimport { isMaskedKey } from '@/features/settings/providers-api';\nimport { nativeSelectMaxWidthClass, selectControlBaseClass, settingsInputFocusClass } from '@/lib/form-field-width';\nimport { cn } from '@/lib/cn';\nimport { messages, type WebSearchSettingsMessages } from '@/i18n/messages';\nimport { docsGuidePageUrl } from '@/navigation';\nimport { createFormDraftReducer, syncFormDraftFromParsed } from '@/lib/settings-form-draft';\nimport { useGatewayStore } from '@/stores/gateway-store';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nfunction Field({\n label,\n description,\n children,\n}: {\n label: string;\n description: string;\n children: ReactNode;\n}) {\n return (\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"text-sm font-medium text-fg\">{label}</div>\n {children}\n <p className=\"text-xs leading-relaxed text-fg-subtle\">{description}</p>\n </div>\n );\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\nfunction selectClassName(): string {\n return cn(selectControlBaseClass, nativeSelectMaxWidthClass);\n}\n\nconst PROVIDER_TYPES: SearchProviderRow['type'][] = ['brave', 'tavily', 'bing', 'searxng'];\n\nfunction emptyProviderRow(): SearchProviderRow {\n return { type: 'brave', apiKey: '', url: '', disabled: false };\n}\n\nconst webSearchFormReducer = createFormDraftReducer<WebSearchSettingsState>();\n\n/**\n * `embedded` strips the outer `mx-auto max-w-app-main` page wrapper, the\n * page title/subtitle/docs block, and the duplicate vertical padding so the\n * panel slots cleanly into the M3.4 hub. Save / Discard / Configure-with-AI\n * stay because each section saves independently.\n */\nexport function WebSearchSettingsPanel({ embedded = false }: { embedded?: boolean } = {}) {\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const w = m.webSearchSettings;\n const logs = m.logs;\n const token = useGatewayStore((st) => st.token);\n const hasToken = Boolean(token);\n\n const [formDraft, dispatchForm] = useReducer(webSearchFormReducer, { form: null, baseline: null });\n const form = formDraft.form;\n const baseline = formDraft.baseline;\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [saveOk, setSaveOk] = useState(false);\n const dirtyRef = useRef(false);\n const trackedParsedRef = useRef<WebSearchSettingsState | null>(null);\n\n const { data, error: swrError, isLoading, mutate } = useGatewayConfigSwr(hasToken);\n\n const parsed = useMemo(\n () =>\n data?.payload?.config !== undefined\n ? normalizeWebSearchSettingsFromConfig(data.payload.config)\n : null,\n [data],\n );\n\n syncFormDraftFromParsed({\n enabled: hasToken,\n parsed,\n dirty: dirtyRef.current,\n trackedParsedRef,\n dispatch: dispatchForm,\n onResetDirty: () => {\n dirtyRef.current = false;\n },\n });\n\n const loading = Boolean(hasToken && isLoading && data === undefined && !swrError);\n const fetchError =\n swrError instanceof Error ? swrError.message : swrError ? String(swrError) : null;\n\n const dirty = useMemo(() => {\n if (!form || !baseline) return false;\n return JSON.stringify(form) !== JSON.stringify(baseline);\n }, [form, baseline]);\n\n const update = useCallback((patch: Partial<WebSearchSettingsState>) => {\n dirtyRef.current = true;\n dispatchForm({ type: 'patch', patch });\n }, []);\n\n const save = useCallback(async () => {\n if (!form || saving) return;\n setSaving(true);\n setError(null);\n setSaveOk(false);\n try {\n await patchWebSearchSettings(form);\n dirtyRef.current = false;\n dispatchForm({ type: 'saved', value: form });\n setSaveOk(true);\n window.setTimeout(() => setSaveOk(false), 2500);\n } catch (e) {\n setError(e instanceof Error ? e.message : w.saveError);\n } finally {\n setSaving(false);\n }\n }, [form, saving, w.saveError]);\n\n const discard = useCallback(() => {\n if (!baseline) return;\n dirtyRef.current = false;\n dispatchForm({ type: 'discard' });\n setError(null);\n setSaveOk(false);\n }, [baseline]);\n\n // Coordinate with the hub-level Save bar (no-op when this panel is opened\n // standalone since no provider wraps it).\n useSaveBarRegistration({ id: 'search', dirty, saving, save, discard });\n\n const outerClass = embedded\n ? 'flex flex-col gap-4'\n : 'mx-auto flex w-full max-w-app-main flex-col gap-6 px-4 py-6';\n const compactClass = embedded\n ? 'flex flex-col gap-3'\n : 'mx-auto flex w-full max-w-app-main flex-col gap-3 px-4 py-8';\n\n if (!hasToken) {\n return (\n <div className={compactClass}>\n {embedded ? null : <h1 className=\"text-lg font-semibold text-fg\">{w.title}</h1>}\n <p className=\"text-sm text-fg-muted\">{w.needToken}</p>\n </div>\n );\n }\n\n if (loading) {\n return (\n <div className={cn(compactClass, 'items-center')}>\n <Loader2 className=\"size-8 animate-spin text-fg-muted\" aria-hidden />\n <p className=\"text-sm text-fg-muted\">{w.loading}</p>\n </div>\n );\n }\n\n if (!form) {\n return (\n <div className={compactClass}>\n <p className=\"text-sm text-fg-muted\">{error ?? fetchError ?? w.loadError}</p>\n <Button type=\"button\" variant=\"secondary\" onClick={() => void mutate()}>\n {logs.refresh}\n </Button>\n </div>\n );\n }\n\n return (\n <div className={outerClass}>\n <header className=\"flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between\">\n {embedded ? (\n <div className=\"min-w-0\" aria-hidden />\n ) : (\n <div>\n <h1 className=\"text-lg font-semibold tracking-tight text-fg\">{w.title}</h1>\n <p className=\"mt-1 text-sm text-fg-muted\">{w.subtitle}</p>\n <a\n href={docsGuidePageUrl(language, 'gateway')}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"mt-1 inline-flex items-center gap-1 text-sm text-accent hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/40\"\n >\n {w.docsLink}\n <ExternalLink className=\"size-3.5\" />\n </a>\n </div>\n )}\n {/*\n * In `embedded` mode the hub's `<SaveBarControls />` aggregates\n * save/discard across every section, so rendering them here too\n * would give users two competing buttons. Keep the in-panel\n * controls only when this panel is opened standalone.\n */}\n {embedded ? null : (\n <div className=\"flex shrink-0 flex-wrap items-center justify-end gap-2\">\n {saveOk ? <span className=\"text-sm text-fg-muted\">{w.saved}</span> : null}\n <Button type=\"button\" variant=\"secondary\" disabled={!dirty || saving} onClick={discard}>\n {w.discard}\n </Button>\n <Button type=\"button\" variant=\"primary\" disabled={!dirty || saving} onClick={() => void save()}>\n {saving ? w.saving : w.save}\n </Button>\n </div>\n )}\n </header>\n\n {dirty && !embedded ? <p className=\"text-xs text-amber-800 dark:text-amber-200\">{w.unsavedHint}</p> : null}\n {error ? <p className=\"text-sm text-red-600 dark:text-red-400\">{error}</p> : null}\n\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Search} title={w.sectionRegion} subtitle={w.sectionRegionHint} />\n <div className=\"flex max-w-md flex-col gap-4\">\n <Field label={w.regionLabel} description={w.regionDesc}>\n <select\n className={selectClassName()}\n value={form.regionMode}\n onChange={(e) =>\n update({\n regionMode: e.target.value as WebSearchSettingsState['regionMode'],\n })\n }\n >\n <option value=\"auto\">{w.regionAuto}</option>\n <option value=\"cn\">{w.regionCn}</option>\n <option value=\"global\">{w.regionGlobal}</option>\n </select>\n </Field>\n </div>\n </SettingsFormSection>\n\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Ban} title={w.sectionBlocklist} subtitle={w.sectionBlocklistHint} />\n <div className=\"flex max-w-xl flex-col gap-4\">\n <label className=\"flex cursor-pointer items-start gap-2 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"ui-checkbox mt-0.5\"\n checked={form.blocklistEnabled}\n onChange={(e) => update({ blocklistEnabled: e.target.checked })}\n />\n <span>\n <span className=\"font-medium\">{w.blocklistEnabled}</span>\n <span className=\"mt-0.5 block text-xs text-fg-subtle\">{w.blocklistEnabledDesc}</span>\n </span>\n </label>\n <Field label={w.blocklistDomains} description={w.blocklistDomainsDesc}>\n <textarea\n className={cn(inputClassName(), 'min-h-[6rem] font-mono text-xs')}\n value={form.blocklistDomains.join('\\n')}\n placeholder={w.blocklistDomainsPlaceholder}\n disabled={!form.blocklistEnabled}\n onChange={(e) => {\n const domains = e.target.value.split(/\\r?\\n/).flatMap((line) => {\n const v = line.trim().toLowerCase();\n return v ? [v] : [];\n });\n update({ blocklistDomains: domains });\n }}\n />\n </Field>\n </div>\n </SettingsFormSection>\n\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Search} title={w.sectionSearch} subtitle={w.sectionSearchHint} />\n <div className=\"flex max-w-xl flex-col gap-6\">\n <Field label={w.maxResultsLabel} description={w.maxResultsDesc}>\n <input\n type=\"number\"\n min={1}\n max={50}\n className={inputClassName()}\n value={form.maxResults}\n onChange={(e) => update({ maxResults: Math.max(1, Math.min(50, Number(e.target.value) || 5)) })}\n />\n </Field>\n\n <div className=\"flex flex-col gap-3\">\n <div className=\"text-sm font-medium text-fg\">{w.providersTitle}</div>\n {form.providers.map((row, index) => (\n <ProviderRowEditor\n key={`${row.type}:${row.url}:${row.apiKey}:${row.disabled}`}\n row={row}\n labels={w}\n onChange={(next) => {\n const nextRows = [...form.providers];\n nextRows[index] = next;\n update({ providers: nextRows });\n }}\n onRemove={() => {\n update({ providers: form.providers.filter((_, i) => i !== index) });\n }}\n />\n ))}\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"w-fit gap-1.5 text-sm\"\n onClick={() => update({ providers: [...form.providers, emptyProviderRow()] })}\n >\n <Plus className=\"size-4\" />\n {w.addProvider}\n </Button>\n </div>\n </div>\n </SettingsFormSection>\n\n <p className=\"text-xs leading-relaxed text-fg-subtle\">{w.footerHint}</p>\n </div>\n );\n}\n\nfunction ProviderRowEditor({\n row,\n labels,\n onChange,\n onRemove,\n}: {\n row: SearchProviderRow;\n labels: WebSearchSettingsMessages;\n onChange: (r: SearchProviderRow) => void;\n onRemove: () => void;\n}) {\n return (\n <div className=\"flex flex-col gap-3 rounded-xl border border-edge-subtle bg-surface-panel/60 p-4 dark:border-edge-subtle\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <select\n className={cn(selectClassName(), 'min-w-[8rem]')}\n value={row.type}\n onChange={(e) =>\n onChange({\n ...row,\n type: e.target.value as SearchProviderRow['type'],\n url: e.target.value === 'searxng' ? row.url : '',\n })\n }\n >\n {PROVIDER_TYPES.map((t) => (\n <option key={t} value={t}>\n {labels.providerTypes[t]}\n </option>\n ))}\n </select>\n <div className=\"flex items-center gap-2\">\n <label className=\"flex cursor-pointer items-center gap-1.5 text-xs text-fg-muted\">\n <input\n type=\"checkbox\"\n className=\"size-3.5 rounded border-edge\"\n checked={row.disabled}\n onChange={(e) => onChange({ ...row, disabled: e.target.checked })}\n />\n {labels.disabled}\n </label>\n <Button type=\"button\" variant=\"ghost\" className=\"h-8 px-2 text-fg-muted\" onClick={onRemove}>\n <Trash2 className=\"size-4\" />\n </Button>\n </div>\n </div>\n {row.type === 'searxng' ? (\n <Field label={labels.urlLabel} description={labels.urlDesc}>\n <input\n type=\"url\"\n className={inputClassName()}\n value={row.url}\n placeholder=\"http://localhost:8080\"\n onChange={(e) => onChange({ ...row, url: e.target.value })}\n />\n </Field>\n ) : null}\n <Field label={labels.apiKeyLabel} description={labels.apiKeyDesc}>\n <input\n type=\"password\"\n autoComplete=\"off\"\n className={inputClassName()}\n value={isMaskedKey(row.apiKey) ? '' : row.apiKey}\n placeholder={isMaskedKey(row.apiKey) ? labels.keyPlaceholderMasked : labels.keyPlaceholder}\n onChange={(e) => onChange({ ...row, apiKey: e.target.value })}\n />\n </Field>\n </div>\n );\n}\n","/**\n * Tab definitions for the Models & credentials hub. Mirrors the tabbed\n * pattern in `/settings/agent-defaults` — a flat horizontal strip drives\n * a single visible panel below it, with `?tab=<id>` deep-linkable.\n *\n * Each tab id matches an old top-level settings route id so the redirect\n * map in `pages/settings-page.tsx` can land users on the right tab when\n * they hit a legacy URL.\n */\n\nexport type ModelsHubTabId =\n | 'providers'\n | 'models'\n | 'image-models'\n | 'voice'\n | 'search';\n\nexport const MODELS_HUB_TABS: readonly ModelsHubTabId[] = [\n 'providers',\n 'models',\n 'image-models',\n 'voice',\n 'search',\n] as const;\n\nexport function parseModelsHubTab(raw: string | null | undefined): ModelsHubTabId {\n const id = (raw ?? '').trim();\n if ((MODELS_HUB_TABS as readonly string[]).includes(id)) {\n return id as ModelsHubTabId;\n }\n return 'providers';\n}\n","/**\n * Models & credentials hub (M3.4 Shape C, tabbed layout).\n *\n * Five settings concerns share one route at `/settings/credentials`:\n * • providers — LLM credentials\n * • models — model registry\n * • image-models— image understanding + generation\n * • voice — TTS / STT\n * • search — web-search providers\n *\n * Layout matches `/settings/agent-defaults`: a horizontal tab strip drives a\n * single visible panel below it. `?tab=<id>` deep-links the active tab so\n * existing `/settings/<x>` URLs (redirected here in `pages/settings-page.tsx`)\n * land users on the right pane.\n *\n * All panels stay mounted via the `hidden` attribute — switching tabs while\n * a panel has unsaved changes keeps its in-memory form state, and the\n * hub-level Save bar still aggregates dirty state across every section\n * regardless of which is currently visible.\n */\n\nimport { Bot, ExternalLink, ImageIcon, KeyRound, Mic, Search, type LucideIcon } from 'lucide-react';\nimport { useCallback, useRef } from 'react';\nimport { useSearchParams } from 'react-router-dom';\n\nimport { ImageModelsSettingsPanel } from '@/features/settings/image-models-settings';\nimport { ModelsSettingsPanel } from '@/features/settings/models-settings';\nimport { ProvidersSettingsPanel } from '@/features/settings/providers-settings';\nimport { SaveBarControls } from '@/features/settings/save-bar/save-bar-controls';\nimport { VoiceSettingsPanel } from '@/features/settings/voice-settings';\nimport { WebSearchSettingsPanel } from '@/features/settings/web-search-settings';\nimport { messages } from '@/i18n/messages';\nimport { cn } from '@/lib/cn';\nimport { interaction } from '@/lib/interaction';\nimport { docsGuidePageUrl } from '@/navigation';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nimport {\n MODELS_HUB_TABS,\n parseModelsHubTab,\n type ModelsHubTabId,\n} from './models-hub-tabs';\n\ninterface TabDef {\n id: ModelsHubTabId;\n icon: LucideIcon;\n /** Key in `messages.settingsSections` for the label. */\n labelKey: ModelsHubTabId | 'image-models';\n /** Key in `messages.modelsHub` for the section hint. */\n hintKey: 'providersHint' | 'modelsHint' | 'imageHint' | 'voiceHint' | 'searchHint';\n}\n\nconst TAB_DEFS: readonly TabDef[] = [\n { id: 'providers', icon: KeyRound, labelKey: 'providers', hintKey: 'providersHint' },\n { id: 'models', icon: Bot, labelKey: 'models', hintKey: 'modelsHint' },\n { id: 'image-models', icon: ImageIcon, labelKey: 'image-models', hintKey: 'imageHint' },\n { id: 'voice', icon: Mic, labelKey: 'voice', hintKey: 'voiceHint' },\n { id: 'search', icon: Search, labelKey: 'search', hintKey: 'searchHint' },\n];\n\nexport function ModelsHubPanel() {\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const sections = m.settingsSections;\n const c = m.modelsHub;\n\n const [searchParams, setSearchParams] = useSearchParams();\n const activeTab = parseModelsHubTab(searchParams.get('tab'));\n\n const setActiveTab = useCallback(\n (tab: ModelsHubTabId) => {\n setSearchParams(\n (prev) => {\n const next = new URLSearchParams(prev);\n if (tab === 'providers') next.delete('tab');\n else next.set('tab', tab);\n return next;\n },\n { replace: true },\n );\n },\n [setSearchParams],\n );\n\n return (\n <div className=\"mx-auto flex w-full max-w-app-main flex-col gap-4 px-4 py-6\">\n <header className=\"flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"min-w-0\">\n <h1 className=\"text-lg font-semibold tracking-tight text-fg\">{sections.credentials}</h1>\n <p className=\"mt-1 text-sm text-fg-muted\">{c.subtitle}</p>\n <a\n href={docsGuidePageUrl(language, 'configuration')}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"mt-1 inline-flex items-center gap-1 text-sm text-accent hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/40\"\n >\n {c.docsLink}\n <ExternalLink className=\"size-3.5\" />\n </a>\n </div>\n </header>\n\n <SaveBarControls />\n\n <div\n className=\"-mx-1 flex gap-1 overflow-x-auto px-1 pb-1\"\n role=\"tablist\"\n aria-label={c.tabsAria}\n onKeyDown={(e) => {\n if (e.key !== 'ArrowLeft' && e.key !== 'ArrowRight') return;\n e.preventDefault();\n const idx = MODELS_HUB_TABS.indexOf(activeTab);\n const delta = e.key === 'ArrowRight' ? 1 : -1;\n const len = MODELS_HUB_TABS.length;\n setActiveTab(MODELS_HUB_TABS[(idx + delta + len) % len]);\n }}\n >\n {TAB_DEFS.map(({ id, icon: Icon, labelKey }) => {\n const selected = id === activeTab;\n return (\n <button\n key={id}\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n id={`hub-tab-${id}`}\n aria-controls={`hub-panel-${id}`}\n className={cn(\n 'inline-flex shrink-0 items-center gap-1.5 rounded-lg px-3 py-2 text-sm font-medium transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent',\n interaction.press,\n selected\n ? 'bg-accent-soft text-accent-fg'\n : 'text-fg-muted hover:bg-surface-hover hover:text-fg',\n )}\n onClick={() => setActiveTab(id)}\n >\n <Icon className=\"size-3.5 shrink-0\" strokeWidth={1.75} aria-hidden />\n <span>{sections[labelKey]}</span>\n </button>\n );\n })}\n </div>\n\n {/*\n * Lazy-mount: each panel is rendered on first activation and stays\n * mounted (hidden) thereafter. This avoids rendering all five panels\n * on first paint while preserving in-memory form state once a tab has\n * been visited. `useSaveBarRegistration` in each panel keeps the\n * global Save bar accurate even when the panel isn't on screen.\n */}\n <LazyPanelHost id=\"providers\" activeTab={activeTab} hint={c.providersHint}>\n <ProvidersSettingsPanel embedded />\n </LazyPanelHost>\n <LazyPanelHost id=\"models\" activeTab={activeTab} hint={c.modelsHint}>\n <ModelsSettingsPanel embedded />\n </LazyPanelHost>\n <LazyPanelHost id=\"image-models\" activeTab={activeTab} hint={c.imageHint}>\n <ImageModelsSettingsPanel embedded />\n </LazyPanelHost>\n <LazyPanelHost id=\"voice\" activeTab={activeTab} hint={c.voiceHint}>\n <VoiceSettingsPanel embedded />\n </LazyPanelHost>\n <LazyPanelHost id=\"search\" activeTab={activeTab} hint={c.searchHint}>\n <WebSearchSettingsPanel embedded />\n </LazyPanelHost>\n </div>\n );\n}\n\n/**\n * Lazy-mounting panel host: defers first render until the tab is activated,\n * then keeps it mounted (hidden) so form state survives subsequent switches.\n */\nfunction LazyPanelHost({\n id,\n activeTab,\n hint,\n children,\n}: {\n id: ModelsHubTabId;\n activeTab: ModelsHubTabId;\n hint: string;\n children: React.ReactNode;\n}) {\n const visible = id === activeTab;\n const mountedRef = useRef(visible);\n if (visible) mountedRef.current = true;\n\n if (!mountedRef.current) return null;\n\n return (\n <div\n role=\"tabpanel\"\n id={`hub-panel-${id}`}\n aria-labelledby={`hub-tab-${id}`}\n hidden={!visible}\n className={cn(visible ? 'flex min-w-0 flex-col gap-3' : undefined)}\n >\n {visible ? <p className=\"text-sm leading-relaxed text-fg-muted\">{hint}</p> : null}\n {children}\n </div>\n );\n}\n","import { PreferenceSelectFields } from '@/components/shell/preference-select-fields';\nimport { messages } from '@/i18n/messages';\nimport { cn } from '@/lib/cn';\nimport { interaction } from '@/lib/interaction';\nimport { useLocaleStore } from '@/stores/locale-store';\nimport { type ColorScheme, useThemeStore } from '@/stores/theme-store';\n\nfunction preferenceCardClassName() {\n return cn('rounded-xl border border-edge-subtle bg-surface-base px-4 py-1 sm:px-5');\n}\n\n/**\n * Mini chrome preview per globals.css tokens — left: light, right: dark for the same palette.\n */\nconst SCHEME_PREVIEW: Record<\n ColorScheme,\n { light: { canvas: string; panel: string; accent: string; fg: string; muted: string }; dark: { canvas: string; panel: string; accent: string; fg: string; muted: string } }\n> = {\n default: {\n light: {\n canvas: '#f5f5f7',\n panel: '#ffffff',\n accent: '#2563eb',\n fg: '#1d1d1f',\n muted: '#d2d2d7',\n },\n dark: {\n canvas: '#1c1c1e',\n panel: '#2c2c2e',\n accent: '#3b82f6',\n fg: '#f5f5f7',\n muted: '#48484a',\n },\n },\n emerald: {\n light: {\n canvas: '#f0fdf4',\n panel: '#ffffff',\n accent: '#059669',\n fg: '#052e16',\n muted: '#86efac',\n },\n dark: {\n canvas: '#000000',\n panel: '#0a0a0a',\n accent: '#10b981',\n fg: '#d1fae5',\n muted: '#134e2a',\n },\n },\n mono: {\n light: {\n canvas: '#ffffff',\n panel: '#f5f5f5',\n accent: '#111111',\n fg: '#111111',\n muted: '#e5e7eb',\n },\n dark: {\n canvas: '#101010',\n panel: '#1a1a1a',\n accent: '#737373',\n fg: '#fafafa',\n muted: '#333333',\n },\n },\n clay: {\n light: {\n canvas: '#fffaf0',\n panel: '#ffffff',\n accent: '#1a3a3a',\n fg: '#0a0a0a',\n muted: '#e5e5e5',\n },\n dark: {\n canvas: '#0a1a1a',\n panel: '#1a2a2a',\n accent: '#ffb084',\n fg: '#fffaf0',\n muted: '#2a3a3a',\n },\n },\n};\n\nfunction SchemePreviewHalf({\n canvas,\n panel,\n accent,\n fg,\n muted,\n}: {\n canvas: string;\n panel: string;\n accent: string;\n fg: string;\n muted: string;\n}) {\n return (\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col justify-center gap-1 p-1.5\" style={{ backgroundColor: canvas }}>\n <div\n className=\"flex flex-col gap-0.5 rounded-sm border p-1\"\n style={{ backgroundColor: panel, borderColor: muted }}\n >\n <div className=\"flex items-center gap-1\">\n <div className=\"size-1 shrink-0 rounded-full\" style={{ backgroundColor: accent }} />\n <div className=\"h-1 min-w-0 flex-1 rounded-full\" style={{ backgroundColor: fg, opacity: 0.85 }} />\n </div>\n <div className=\"h-1 w-2/3 max-w-[70%] rounded-full\" style={{ backgroundColor: muted }} />\n <div className=\"size-1/2 max-w-[55%] rounded-full\" style={{ backgroundColor: muted }} />\n </div>\n </div>\n );\n}\n\n/** Side-by-side light (left) and dark (right) samples for one color scheme. */\nfunction SchemePreviewSwatch({ scheme }: { scheme: ColorScheme }) {\n const { light, dark } = SCHEME_PREVIEW[scheme];\n return (\n <div className=\"flex h-11 w-full overflow-hidden rounded-md border border-edge-subtle\">\n <SchemePreviewHalf {...light} />\n <div className=\"w-px shrink-0 bg-black/12 dark:bg-white/12\" aria-hidden />\n <SchemePreviewHalf {...dark} />\n </div>\n );\n}\n\nconst COLOR_SCHEME_OPTIONS: {\n value: ColorScheme;\n labelKey:\n | 'colorSchemeDefault'\n | 'colorSchemeLightGreen'\n | 'colorSchemeModernMono'\n | 'colorSchemeClay';\n}[] = [\n { value: 'default', labelKey: 'colorSchemeDefault' },\n { value: 'emerald', labelKey: 'colorSchemeLightGreen' },\n { value: 'mono', labelKey: 'colorSchemeModernMono' },\n { value: 'clay', labelKey: 'colorSchemeClay' },\n];\n\nfunction ColorSchemeSelector() {\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const a = m.appearanceSettings;\n const colorScheme = useThemeStore((s) => s.colorScheme);\n const setColorScheme = useThemeStore((s) => s.setColorScheme);\n\n return (\n <div className=\"flex flex-col gap-2 border-b border-edge-subtle py-3.5 last:border-b-0 sm:py-4\">\n <div className=\"min-w-0\">\n <div className=\"text-sm font-semibold text-fg\">{a.colorSchemeTitle}</div>\n <p className=\"mt-0.5 text-xs text-fg-muted\">{a.colorSchemeDescription}</p>\n </div>\n <div className=\"grid grid-cols-2 gap-3 lg:grid-cols-4\">\n {COLOR_SCHEME_OPTIONS.map(({ value, labelKey }) => {\n const isSelected = colorScheme === value;\n return (\n <button\n key={value}\n type=\"button\"\n aria-pressed={isSelected}\n onClick={() => setColorScheme(value)}\n className={cn(\n 'flex flex-col gap-2 rounded-xl border-2 p-2.5 text-left transition-[border-color,box-shadow,transform] duration-150',\n interaction.pressCard,\n isSelected\n ? 'border-accent shadow-[0_0_0_1px_var(--color-accent)]'\n : 'border-edge-subtle hover:border-edge',\n )}\n >\n <SchemePreviewSwatch scheme={value} />\n <span\n className={cn(\n 'text-xs font-medium leading-none',\n isSelected ? 'text-accent-fg' : 'text-fg-muted',\n )}\n >\n {a[labelKey]}\n </span>\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n\nexport function AppearanceSettingsPanel() {\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const a = m.appearanceSettings;\n\n return (\n <div className=\"mx-auto flex w-full max-w-app-main flex-col gap-6 px-4 py-6\">\n <header className=\"flex flex-col gap-1\">\n <h1 className=\"text-xl font-semibold tracking-tight text-fg\">{a.pageTitle}</h1>\n <p className=\"text-sm text-fg-muted\">{a.subtitle}</p>\n </header>\n\n <section className={preferenceCardClassName()} aria-labelledby=\"pref-language-heading\">\n <h2 id=\"pref-language-heading\" className=\"sr-only\">\n {a.languageTitle}\n </h2>\n <PreferenceSelectFields variant=\"page\" sections={['language']} />\n </section>\n\n <section className={preferenceCardClassName()} aria-labelledby=\"pref-appearance-heading\">\n <h2 id=\"pref-appearance-heading\" className=\"sr-only\">\n {a.themeTitle}\n </h2>\n <PreferenceSelectFields variant=\"page\" sections={['theme', 'font']} />\n <ColorSchemeSelector />\n </section>\n </div>\n );\n}\n","import { fetchJson } from '@/lib/fetch';\nimport { apiUrl } from '@/lib/url';\n\nexport type DreamingPhaseId = 'light' | 'deep' | 'rem';\n\n/** Gateway payload shape for memory/.dreams/last-run.json (deep sweep). */\nexport type DreamingLastRunRecord = {\n version: 2;\n phase: 'deep';\n runId: string;\n startedAt: string;\n finishedAt: string;\n durationMs: number;\n ok: boolean;\n reason: string;\n errorMessage?: string;\n config: {\n enabled: boolean;\n minScore: number;\n minRecallCount: number;\n limit: number;\n };\n memoryPath: string;\n deep: {\n candidatesRanked: number;\n applied: number;\n skipped: {\n alreadyPromotedKey: number;\n rehydrateFailed: number;\n contaminated: number;\n hashDuplicate: number;\n };\n };\n};\n\n/** Lightweight last-run payload for light / rem phases. */\nexport type PhaseLastRun =\n | { exists: false }\n | { exists: true; path: string; raw: unknown };\n\nexport type DreamingGatewayStatus = {\n workspaceDir: string;\n config: {\n enabled: boolean;\n frequency: string;\n timezone: string;\n phases: {\n light: { enabled: boolean; cron: string; lookbackDays: number; limit: number; dedupeSimilarity: number };\n deep: { enabled: boolean; cron: string; minScore: number; minRecallCount: number; minUniqueQueries: number; limit: number; recencyHalfLifeDays: number; maxAgeDays: number };\n rem: { enabled: boolean; cron: string; lookbackDays: number; limit: number; minPatternStrength: number };\n };\n deep: { minScore: number; minRecallCount: number; limit: number };\n };\n storePath: string;\n store: {\n version: number;\n updatedAt: string;\n entryCount: number;\n promotedCount: number;\n lastPromotedAt: string | null;\n };\n lock: | { locked: false } | { locked: true; path: string; content: string; mtimeMs?: number };\n lastRun:\n | { exists: false }\n | { exists: true; path: string; raw: unknown; record: DreamingLastRunRecord | null; parseError: string | null };\n lightLastRun: PhaseLastRun;\n remLastRun: PhaseLastRun;\n};\n\nexport function dreamingSwrKey(): string {\n return apiUrl('/api/dreaming');\n}\n\nexport async function fetchDreamingStatus(): Promise<DreamingGatewayStatus> {\n const res = await fetchJson<{ ok?: boolean; payload?: DreamingGatewayStatus }>(dreamingSwrKey());\n if (!res.payload) throw new Error('Missing payload');\n return res.payload;\n}\n\nexport async function postDreamingAction(action: 'reset_store' | 'clear_lock'): Promise<void> {\n await fetchJson(apiUrl('/api/dreaming/action'), { method: 'POST', body: JSON.stringify({ action }) });\n}\n\nexport async function postDreamingRunNow(phase: DreamingPhaseId = 'deep'): Promise<{ triggered: boolean; jobId: string; phase: DreamingPhaseId }> {\n const res = await fetchJson<{ ok?: boolean; payload?: { triggered?: boolean; jobId?: string; phase?: string } }>(\n apiUrl('/api/dreaming/run'),\n { method: 'POST', body: JSON.stringify({ phase }) },\n );\n const triggered = Boolean(res.payload?.triggered);\n const jobId = typeof res.payload?.jobId === 'string' ? res.payload.jobId : '';\n if (!triggered || !jobId) throw new Error('Failed to trigger');\n return { triggered, jobId, phase };\n}\n\nexport type DreamingPreviewItem = {\n key: string;\n hash: string;\n snippet: string;\n path: string;\n startLine: number;\n endLine: number;\n score: number;\n avgScore: number;\n recallCount: number;\n recencyDecay: number;\n alreadyPromotedByKey: boolean;\n alreadyPromotedByHash: boolean;\n skippedReason: string | null;\n};\n\nexport type DreamingPreviewResponse = {\n ok: boolean;\n reason: string;\n items: DreamingPreviewItem[];\n memoryPath: string;\n};\n\nexport async function fetchDreamingPreview(limit?: number): Promise<DreamingPreviewResponse> {\n const q = typeof limit === 'number' && Number.isFinite(limit) ? `?limit=${encodeURIComponent(String(limit))}` : '';\n const res = await fetchJson<{ ok?: boolean; payload?: DreamingPreviewResponse }>(apiUrl(`/api/dreaming/preview${q}`));\n if (!res.payload) throw new Error('Missing payload');\n return res.payload;\n}\n\n// ── Event audit log ────────────────────────────────────────────────────\n\nexport type DreamingEvent = {\n timestamp: string;\n phase: DreamingPhaseId;\n ok: boolean;\n reason: string;\n durationMs: number;\n // Light-specific\n scannedEntries?: number;\n newSignals?: number;\n deduped?: number;\n // Deep-specific\n candidates?: number;\n applied?: number;\n // REM-specific\n patternsDiscovered?: number;\n entriesAnalyzed?: number;\n};\n\nexport async function fetchDreamingEvents(limit = 50): Promise<DreamingEvent[]> {\n const q = `?limit=${encodeURIComponent(String(limit))}`;\n const res = await fetchJson<{ ok?: boolean; payload?: { events: DreamingEvent[] } }>(apiUrl(`/api/dreaming/events${q}`));\n return res.payload?.events ?? [];\n}\n\n","import { revalidateGatewayConfig } from '@/features/gateway/gateway-config-swr';\nimport { fetchJson } from '@/lib/fetch';\nimport { apiUrl } from '@/lib/url';\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return v !== null && typeof v === 'object' && !Array.isArray(v);\n}\n\nexport type DreamingLightConfigState = {\n enabled: boolean;\n cron: string;\n lookbackDays: number;\n limit: number;\n dedupeSimilarity: number;\n};\n\nexport type DreamingDeepConfigState = {\n enabled: boolean;\n cron: string;\n minScore: number;\n minRecallCount: number;\n limit: number;\n recencyHalfLifeDays: number;\n maxAgeDays: number;\n};\n\nexport type DreamingRemConfigState = {\n enabled: boolean;\n cron: string;\n lookbackDays: number;\n limit: number;\n minPatternStrength: number;\n};\n\nexport type DreamingConfigState = {\n enabled: boolean;\n frequency: string;\n timezone: string;\n /** @deprecated Use phases.deep.enabled */\n deepEnabled: boolean;\n /** @deprecated Use phases.deep.minScore */\n minScore: number;\n /** @deprecated Use phases.deep.minRecallCount */\n minRecallCount: number;\n /** @deprecated Use phases.deep.limit */\n limit: number;\n light: DreamingLightConfigState;\n deep: DreamingDeepConfigState;\n rem: DreamingRemConfigState;\n};\n\nconst LIGHT_DEFAULTS: DreamingLightConfigState = {\n enabled: true,\n cron: '0 */6 * * *',\n lookbackDays: 1,\n limit: 50,\n dedupeSimilarity: 0.85,\n};\n\nconst DEEP_DEFAULTS: DreamingDeepConfigState = {\n enabled: true,\n cron: '0 3 * * *',\n minScore: 0.8,\n minRecallCount: 3,\n limit: 10,\n recencyHalfLifeDays: 14,\n maxAgeDays: 30,\n};\n\nconst REM_DEFAULTS: DreamingRemConfigState = {\n enabled: true,\n cron: '0 5 * * 0',\n lookbackDays: 7,\n limit: 20,\n minPatternStrength: 0.6,\n};\n\nconst DEFAULTS: DreamingConfigState = {\n enabled: false,\n frequency: '0 3 * * *',\n timezone: '',\n deepEnabled: true,\n minScore: 0.8,\n minRecallCount: 3,\n limit: 10,\n light: LIGHT_DEFAULTS,\n deep: DEEP_DEFAULTS,\n rem: REM_DEFAULTS,\n};\n\nfunction clamp01(n: number, fallback: number): number {\n if (!Number.isFinite(n)) return fallback;\n return Math.max(0, Math.min(1, n));\n}\n\nfunction toInt(n: unknown, fallback: number): number {\n const x = typeof n === 'string' ? Number(n) : (n as number);\n if (!Number.isFinite(x)) return fallback;\n return Math.max(0, Math.floor(x));\n}\n\nfunction toNum(value: unknown, fallback: number): number {\n const num = typeof value === 'string' ? Number(value) : (value as number);\n return Number.isFinite(num) ? num : fallback;\n}\n\nexport function normalizeDreamingFromConfig(config: unknown): DreamingConfigState {\n const c = isRecord(config) ? config : {};\n const agents = isRecord(c.agents) ? c.agents : {};\n const defaults = isRecord(agents.defaults) ? agents.defaults : {};\n const memory = isRecord(defaults.memory) ? defaults.memory : {};\n const dreaming = isRecord(memory.dreaming) ? memory.dreaming : {};\n const phases = isRecord(dreaming.phases) ? dreaming.phases : {};\n const lightRaw = isRecord(phases.light) ? phases.light : {};\n const deepRaw = isRecord(phases.deep) ? phases.deep : {};\n const remRaw = isRecord(phases.rem) ? phases.rem : {};\n\n return {\n enabled: dreaming.enabled === true,\n frequency: typeof dreaming.frequency === 'string' && dreaming.frequency.trim() ? dreaming.frequency.trim() : DEFAULTS.frequency,\n timezone: typeof dreaming.timezone === 'string' ? dreaming.timezone : '',\n deepEnabled: deepRaw.enabled !== false,\n minScore: clamp01(typeof deepRaw.minScore === 'number' ? deepRaw.minScore : Number(deepRaw.minScore), DEFAULTS.minScore),\n minRecallCount: Math.max(1, toInt(deepRaw.minRecallCount, DEFAULTS.minRecallCount)),\n limit: toInt(deepRaw.limit, DEFAULTS.limit),\n light: {\n enabled: lightRaw.enabled !== false,\n cron: typeof lightRaw.cron === 'string' && lightRaw.cron.trim() ? lightRaw.cron.trim() : LIGHT_DEFAULTS.cron,\n lookbackDays: Math.max(1, toInt(lightRaw.lookbackDays, LIGHT_DEFAULTS.lookbackDays)),\n limit: toInt(lightRaw.limit, LIGHT_DEFAULTS.limit),\n dedupeSimilarity: clamp01(toNum(lightRaw.dedupeSimilarity, LIGHT_DEFAULTS.dedupeSimilarity), LIGHT_DEFAULTS.dedupeSimilarity),\n },\n deep: {\n enabled: deepRaw.enabled !== false,\n cron: typeof deepRaw.cron === 'string' && deepRaw.cron.trim() ? deepRaw.cron.trim() : DEEP_DEFAULTS.cron,\n minScore: clamp01(toNum(deepRaw.minScore, DEEP_DEFAULTS.minScore), DEEP_DEFAULTS.minScore),\n minRecallCount: Math.max(1, toInt(deepRaw.minRecallCount, DEEP_DEFAULTS.minRecallCount)),\n limit: toInt(deepRaw.limit, DEEP_DEFAULTS.limit),\n recencyHalfLifeDays: Math.max(1, toNum(deepRaw.recencyHalfLifeDays, DEEP_DEFAULTS.recencyHalfLifeDays)),\n maxAgeDays: Math.max(1, toNum(deepRaw.maxAgeDays, DEEP_DEFAULTS.maxAgeDays)),\n },\n rem: {\n enabled: remRaw.enabled !== false,\n cron: typeof remRaw.cron === 'string' && remRaw.cron.trim() ? remRaw.cron.trim() : REM_DEFAULTS.cron,\n lookbackDays: Math.max(1, toInt(remRaw.lookbackDays, REM_DEFAULTS.lookbackDays)),\n limit: toInt(remRaw.limit, REM_DEFAULTS.limit),\n minPatternStrength: clamp01(toNum(remRaw.minPatternStrength, REM_DEFAULTS.minPatternStrength), REM_DEFAULTS.minPatternStrength),\n },\n };\n}\n\nexport async function patchDreamingConfig(state: DreamingConfigState): Promise<void> {\n const freq = state.frequency.trim();\n const tz = state.timezone.trim();\n\n await fetchJson(apiUrl('/api/config'), {\n method: 'PATCH',\n body: JSON.stringify({\n agents: {\n defaults: {\n memory: {\n dreaming: {\n enabled: Boolean(state.enabled),\n frequency: freq || null,\n timezone: tz || null,\n phases: {\n light: {\n enabled: Boolean(state.light.enabled),\n cron: state.light.cron.trim() || null,\n lookbackDays: Math.max(1, Math.floor(state.light.lookbackDays)),\n limit: Math.max(0, Math.floor(state.light.limit)),\n dedupeSimilarity: clamp01(state.light.dedupeSimilarity, LIGHT_DEFAULTS.dedupeSimilarity),\n },\n deep: {\n enabled: Boolean(state.deep.enabled),\n cron: state.deep.cron.trim() || null,\n minScore: clamp01(state.deep.minScore, DEEP_DEFAULTS.minScore),\n minRecallCount: Math.max(1, Math.floor(state.deep.minRecallCount)),\n limit: Math.max(0, Math.floor(state.deep.limit)),\n recencyHalfLifeDays: Math.max(1, state.deep.recencyHalfLifeDays),\n maxAgeDays: Math.max(1, state.deep.maxAgeDays),\n },\n rem: {\n enabled: Boolean(state.rem.enabled),\n cron: state.rem.cron.trim() || null,\n lookbackDays: Math.max(1, Math.floor(state.rem.lookbackDays)),\n limit: Math.max(0, Math.floor(state.rem.limit)),\n minPatternStrength: clamp01(state.rem.minPatternStrength, REM_DEFAULTS.minPatternStrength),\n },\n },\n },\n },\n },\n },\n }),\n });\n\n void revalidateGatewayConfig();\n}\n\n","import { useMemo, useRef, useState } from 'react';\n\nimport { HEARTBEAT_INTERVAL_PRESET_MS_ORDER } from '@/features/scheduling/interval/interval-presets';\nimport type { IntervalPresetLabels } from '@/features/scheduling/interval/format-interval-label';\nimport { cn } from '@/lib/cn';\nimport { formControlBorderFocusClass, selectControlBaseClass } from '@/lib/form-field-width';\n\nexport type IntervalSchedulePickerLabels = {\n secondsLabel: string;\n presets: IntervalPresetLabels;\n};\n\nconst numberInputClass = cn(\n 'h-9 min-w-0 flex-1 rounded-lg border border-edge-subtle bg-surface-panel px-2.5 py-1.5 text-sm tabular-nums text-fg',\n formControlBorderFocusClass,\n);\n\nconst presetSelectClass = cn(\n selectControlBaseClass,\n 'h-9 max-w-[11rem] shrink-0 text-xs sm:max-w-[12rem]',\n);\n\nfunction presetOptionLabel(ms: number, presets: IntervalPresetLabels): string {\n switch (ms) {\n case 30_000:\n return presets.every30s;\n case 60_000:\n return presets.every1min;\n case 300_000:\n return presets.every5min;\n case 600_000:\n return presets.every10min;\n case 900_000:\n return presets.every15min;\n case 1_800_000:\n return presets.every30min;\n case 3_600_000:\n return presets.every1h;\n case 7_200_000:\n return presets.every2h;\n default:\n return String(ms);\n }\n}\n\ntype IntervalSchedulePickerProps = {\n valueMs: number;\n onChangeMs: (ms: number) => void;\n labels: IntervalSchedulePickerLabels;\n disabled?: boolean;\n presets?: readonly number[];\n minSeconds?: number;\n};\n\nexport function IntervalSchedulePicker({\n valueMs,\n onChangeMs,\n labels,\n disabled,\n presets = HEARTBEAT_INTERVAL_PRESET_MS_ORDER,\n minSeconds = 1,\n}: IntervalSchedulePickerProps) {\n const presetSet = useMemo(() => new Set(presets), [presets]);\n\n const intervalPresetSelectValue = useMemo(\n () => (presetSet.has(valueMs) ? String(valueMs) : ''),\n [presetSet, valueMs],\n );\n\n const [secondsDraft, setSecondsDraft] = useState<string | null>(null);\n const trackedValueMsRef = useRef(valueMs);\n if (trackedValueMsRef.current !== valueMs) {\n trackedValueMsRef.current = valueMs;\n setSecondsDraft(null);\n }\n const secondsCommitted = Math.max(minSeconds, Math.round(valueMs / 1000));\n const secondsInputValue = secondsDraft !== null ? secondsDraft : String(secondsCommitted);\n\n return (\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-xs font-medium text-fg-muted\">{labels.secondsLabel}</span>\n <div className=\"flex gap-2\">\n <input\n type=\"number\"\n min={minSeconds}\n step={1}\n disabled={disabled}\n className={numberInputClass}\n value={secondsInputValue}\n onChange={(e) => {\n const next = e.target.value;\n setSecondsDraft(next);\n const raw = parseInt(next, 10);\n if (Number.isFinite(raw) && raw >= minSeconds) {\n onChangeMs(raw * 1000);\n }\n }}\n onBlur={() => {\n if (secondsDraft === null) return;\n const raw = parseInt(secondsDraft, 10);\n if (!Number.isFinite(raw) || raw < minSeconds) {\n onChangeMs(minSeconds * 1000);\n } else {\n onChangeMs(raw * 1000);\n }\n setSecondsDraft(null);\n }}\n />\n <select\n className={presetSelectClass}\n disabled={disabled}\n value={intervalPresetSelectValue}\n onChange={(e) => {\n const v = e.target.value;\n if (v) {\n onChangeMs(parseInt(v, 10));\n setSecondsDraft(null);\n }\n }}\n >\n <option value=\"\">{labels.presets.custom}</option>\n {presets.map((ms) => (\n <option key={ms} value={String(ms)}>\n {presetOptionLabel(ms, labels.presets)}\n </option>\n ))}\n </select>\n </div>\n </div>\n );\n}\n","import { Button } from '@/components/ui/button';\nimport { cn } from '@/lib/cn';\nimport { formControlBorderFocusClass } from '@/lib/form-field-width';\n\nexport type ActiveHoursValue = {\n start: string;\n end: string;\n timezone: string;\n};\n\nexport type ActiveHoursPickerLabels = {\n start: string;\n end: string;\n timezone: string;\n add: string;\n clear: string;\n};\n\nconst timeInputClass = cn(\n 'mt-1 w-full rounded-lg border border-edge-subtle bg-surface-panel px-2.5 py-1.5 text-sm text-fg',\n formControlBorderFocusClass,\n);\n\nconst defaultActiveHours = (): ActiveHoursValue => ({\n start: '09:00',\n end: '22:00',\n timezone: '',\n});\n\ntype ActiveHoursPickerProps = {\n value: ActiveHoursValue | null;\n onChange: (value: ActiveHoursValue | null) => void;\n labels: ActiveHoursPickerLabels;\n disabled?: boolean;\n};\n\nexport function ActiveHoursPicker({ value, onChange, labels, disabled }: ActiveHoursPickerProps) {\n if (!value) {\n return (\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"text-sm\"\n disabled={disabled}\n onClick={() => onChange(defaultActiveHours())}\n >\n {labels.add}\n </Button>\n );\n }\n\n return (\n <div className=\"space-y-2\">\n <div className=\"grid gap-2 sm:grid-cols-3\">\n <label className=\"block min-w-0\">\n <span className=\"text-xs font-medium text-fg-muted\">{labels.start}</span>\n <input\n type=\"time\"\n step={60}\n disabled={disabled}\n className={timeInputClass}\n value={value.start}\n onChange={(e) => onChange({ ...value, start: e.target.value })}\n />\n </label>\n <label className=\"block min-w-0\">\n <span className=\"text-xs font-medium text-fg-muted\">{labels.end}</span>\n <input\n type=\"time\"\n step={60}\n disabled={disabled}\n className={timeInputClass}\n value={value.end}\n onChange={(e) => onChange({ ...value, end: e.target.value })}\n />\n </label>\n <label className=\"block min-w-0\">\n <span className=\"text-xs font-medium text-fg-muted\">{labels.timezone}</span>\n <input\n type=\"text\"\n disabled={disabled}\n className={timeInputClass}\n value={value.timezone}\n onChange={(e) => onChange({ ...value, timezone: e.target.value })}\n placeholder=\"Asia/Shanghai\"\n autoComplete=\"off\"\n />\n </label>\n </div>\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"text-xs\"\n disabled={disabled}\n onClick={() => onChange(null)}\n >\n {labels.clear}\n </Button>\n </div>\n );\n}\n","import type { CronSchedulePickerLabels } from '@/features/scheduling/cron/cron-schedule-picker';\nimport { CronSchedulePicker } from '@/features/scheduling/cron/cron-schedule-picker';\nimport { IntervalSchedulePicker, type IntervalSchedulePickerLabels } from '@/features/scheduling/interval/interval-schedule-picker';\nimport { HEARTBEAT_INTERVAL_PRESET_MS_ORDER } from '@/features/scheduling/interval/interval-presets';\nimport {\n ActiveHoursPicker,\n type ActiveHoursPickerLabels,\n type ActiveHoursValue,\n} from '@/features/scheduling/window/active-hours-picker';\nimport { cn } from '@/lib/cn';\n\ntype ScheduleFieldShellProps = {\n disabled?: boolean;\n label?: string;\n hint?: string;\n className?: string;\n};\n\nexport type CronScheduleFieldProps = ScheduleFieldShellProps & {\n kind: 'cron';\n value: string;\n onChange: (cron: string) => void;\n labels: CronSchedulePickerLabels;\n};\n\nexport type IntervalScheduleFieldProps = ScheduleFieldShellProps & {\n kind: 'interval';\n valueMs: number;\n onChangeMs: (ms: number) => void;\n labels: IntervalSchedulePickerLabels;\n presets?: readonly number[];\n minSeconds?: number;\n};\n\nexport type ActiveHoursScheduleFieldProps = ScheduleFieldShellProps & {\n kind: 'active-hours';\n value: ActiveHoursValue | null;\n onChange: (value: ActiveHoursValue | null) => void;\n labels: ActiveHoursPickerLabels;\n};\n\nexport type ScheduleFieldProps =\n | CronScheduleFieldProps\n | IntervalScheduleFieldProps\n | ActiveHoursScheduleFieldProps;\n\nexport type { ActiveHoursValue };\n\nexport function ScheduleField(props: ScheduleFieldProps) {\n const { disabled, label, hint, className } = props;\n\n return (\n <div className={cn('flex flex-col gap-2', className)}>\n {label ? <span className=\"text-xs font-medium text-fg-muted\">{label}</span> : null}\n {props.kind === 'cron' ? (\n <CronSchedulePicker\n value={props.value}\n onChange={props.onChange}\n labels={props.labels}\n disabled={disabled}\n showHeading={!label}\n />\n ) : null}\n {props.kind === 'interval' ? (\n <IntervalSchedulePicker\n valueMs={props.valueMs}\n onChangeMs={props.onChangeMs}\n labels={props.labels}\n disabled={disabled}\n presets={props.presets ?? HEARTBEAT_INTERVAL_PRESET_MS_ORDER}\n minSeconds={props.minSeconds}\n />\n ) : null}\n {props.kind === 'active-hours' ? (\n <ActiveHoursPicker\n value={props.value}\n onChange={props.onChange}\n labels={props.labels}\n disabled={disabled}\n />\n ) : null}\n {hint ? <p className=\"text-xs text-fg-subtle\">{hint}</p> : null}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\n\nimport {\n type DreamingGatewayStatus,\n type DreamingLastRunRecord,\n type PhaseLastRun,\n} from '@/features/settings/dreaming-api';\nimport type { CronSchedulePickerLabels } from '@/features/scheduling/cron/cron-schedule-picker';\nimport { ScheduleField } from '@/features/scheduling/schedule-field';\nimport type { MessageBundle } from '@/i18n/messages';\nimport { cn } from '@/lib/cn';\nimport { formControlBorderFocusClass } from '@/lib/form-field-width';\n\nexport const sectionTightClass = 'p-4 sm:px-5';\nexport const sectionHeaderTightClass = 'mb-3';\nexport const phasePanelClass = 'rounded-xl border border-edge-subtle bg-surface-panel/30 p-3 sm:p-4';\nexport const numInputClass = cn(\n 'mt-1 w-full rounded-lg border border-edge-subtle bg-surface-panel px-2.5 py-1.5 text-sm text-fg',\n formControlBorderFocusClass,\n);\n\nexport type DreamingSettingsI18n = MessageBundle['dreamingSettings'];\n\nconst rowLabelClass = 'text-xs font-medium text-fg-muted';\nconst rowValueClass = 'text-sm font-medium text-fg';\n\nexport function FieldCell({\n label,\n children,\n className,\n}: {\n label: string;\n children: ReactNode;\n className?: string;\n}) {\n return (\n <div className={className}>\n <span className={rowLabelClass}>{label}</span>\n {children}\n </div>\n );\n}\n\nexport function StatCell({\n label,\n children,\n className,\n}: {\n label: string;\n children: ReactNode;\n className?: string;\n}) {\n return (\n <div className={cn('min-w-0', className)}>\n <dt className={rowLabelClass}>{label}</dt>\n <dd className={cn(rowValueClass, 'mt-0.5')}>{children}</dd>\n </div>\n );\n}\n\nexport function PanelHeading({ label, className }: { label: string; className?: string }) {\n return (\n <h3 className={cn('text-[0.7rem] font-semibold uppercase tracking-wider text-fg-muted', className)}>{label}</h3>\n );\n}\n\nexport function isoShort(v: string | null | undefined): string {\n if (!v) return '—';\n return v.replace('T', ' ').replace('Z', '');\n}\n\nexport function formatDurationMs(ms: number | undefined): string {\n if (ms === undefined || !Number.isFinite(ms) || ms < 0) return '—';\n if (ms < 1000) return `${Math.round(ms)} ms`;\n return `${(ms / 1000).toFixed(2)} s`;\n}\n\nexport function lockStatusLabel(\n s: DreamingGatewayStatus['lock'],\n labels: Pick<DreamingSettingsI18n, 'lockValueLocked' | 'lockValueUnlocked'>,\n): { text: string; className: string } {\n if (s.locked) {\n return { text: labels.lockValueLocked, className: 'text-amber-600 dark:text-amber-400' };\n }\n return { text: labels.lockValueUnlocked, className: 'text-emerald-600 dark:text-emerald-400' };\n}\n\nexport function PhaseConfigPanel({\n icon,\n title,\n hint,\n enabled,\n onEnabledChange,\n cron,\n onCronChange,\n scheduleLabels,\n disabled,\n onLabel,\n offLabel,\n cronLabel,\n children,\n}: {\n icon: ReactNode;\n title: string;\n hint: string;\n enabled: boolean;\n onEnabledChange: (enabled: boolean) => void;\n cron: string;\n onCronChange: (cron: string) => void;\n scheduleLabels: CronSchedulePickerLabels;\n disabled?: boolean;\n onLabel: string;\n offLabel: string;\n cronLabel: string;\n children: ReactNode;\n}) {\n return (\n <div className={phasePanelClass}>\n <div className=\"mb-2.5 flex flex-wrap items-start justify-between gap-2 border-b border-edge-subtle/80 pb-2.5\">\n <div className=\"flex min-w-0 items-start gap-2\">\n <span className=\"mt-0.5 shrink-0\">{icon}</span>\n <div className=\"min-w-0\">\n <div className=\"text-sm font-semibold text-fg\">{title}</div>\n <p className=\"mt-0.5 text-xs leading-snug text-fg-muted\">{hint}</p>\n </div>\n </div>\n <label className=\"inline-flex shrink-0 items-center gap-2 text-xs text-fg\">\n <input\n type=\"checkbox\"\n className=\"ui-checkbox\"\n checked={enabled}\n disabled={disabled}\n onChange={(e) => onEnabledChange(e.target.checked)}\n />\n <span>{enabled ? onLabel : offLabel}</span>\n </label>\n </div>\n <ScheduleField\n kind=\"cron\"\n className=\"mb-2.5\"\n label={cronLabel}\n value={cron}\n onChange={onCronChange}\n labels={scheduleLabels}\n disabled={disabled}\n />\n <div className=\"grid grid-cols-2 gap-2 sm:grid-cols-3 lg:grid-cols-4\">{children}</div>\n </div>\n );\n}\n\nexport function PhaseStatusCard({\n icon,\n label,\n enabled,\n cron,\n scheduleSummary,\n details,\n t,\n}: {\n icon: ReactNode;\n label: string;\n enabled: boolean;\n cron: string;\n scheduleSummary: string;\n details: string;\n t: DreamingSettingsI18n;\n}) {\n return (\n <div className={cn(phasePanelClass, 'space-y-1')}>\n <div className=\"flex items-center gap-2\">\n {icon}\n <span className=\"text-sm font-medium text-fg\">{label}</span>\n <span className={cn('ml-auto text-xs font-medium', enabled ? 'text-emerald-600 dark:text-emerald-400' : 'text-fg-muted')}>\n {enabled ? t.on : t.off}\n </span>\n </div>\n <div className=\"text-sm font-medium text-fg\">{scheduleSummary}</div>\n <p className=\"truncate font-mono text-[0.65rem] text-fg-subtle\" title={cron}>\n {cron}\n </p>\n <p className=\"text-[0.65rem] leading-snug text-fg-muted\">{details}</p>\n </div>\n );\n}\n\nexport function PhaseLastRunBlock({\n label,\n lastRun,\n t,\n}: {\n label: string;\n lastRun: PhaseLastRun | undefined;\n t: DreamingSettingsI18n;\n}) {\n return (\n <div className=\"border-t border-edge-subtle/80 pt-3\">\n <PanelHeading label={label} className=\"mb-2\" />\n {lastRun?.exists ? (\n <details className=\"group rounded-lg border border-edge-subtle\">\n <summary className=\"cursor-pointer list-none px-2.5 py-1.5 text-xs font-medium text-fg-muted marker:hidden [&::-webkit-details-marker]:hidden\">\n <span className=\"underline decoration-edge underline-offset-2 group-open:text-fg\">{t.lastRunRaw}</span>\n </summary>\n <pre className=\"max-h-40 overflow-auto border-t border-edge-subtle p-2.5 text-xs text-fg-muted\">\n {JSON.stringify(lastRun.raw, null, 2)}\n </pre>\n </details>\n ) : (\n <p className=\"text-xs text-fg-muted\">{t.phaseLastRunEmpty}</p>\n )}\n </div>\n );\n}\n\nexport function LastRunStructuredView({ t, r }: { t: DreamingSettingsI18n; r: DreamingLastRunRecord }) {\n const s = r.deep?.skipped;\n return (\n <dl className=\"grid grid-cols-2 gap-x-3 gap-y-2 sm:grid-cols-3 lg:grid-cols-4\">\n <StatCell label={t.lastRunStatus}>\n <span className={r.ok ? 'text-emerald-600 dark:text-emerald-400' : 'text-amber-600 dark:text-amber-400'}>\n {r.ok ? t.lastRunSuccess : t.lastRunFailure}\n </span>\n </StatCell>\n <StatCell label={t.lastRunDuration}>{formatDurationMs(r.durationMs)}</StatCell>\n <StatCell label={t.lastRunRanked}>{String(r.deep?.candidatesRanked ?? '—')}</StatCell>\n <StatCell label={t.lastRunApplied}>{String(r.deep?.applied ?? '—')}</StatCell>\n <StatCell label={t.lastRunReason} className=\"col-span-2 sm:col-span-3 lg:col-span-4\">\n <span className=\"block text-pretty\">{r.reason}</span>\n {r.errorMessage ? (\n <span className=\"mt-1 block text-xs text-amber-600 dark:text-amber-400\">\n {`${t.lastRunError}: ${r.errorMessage}`}\n </span>\n ) : null}\n </StatCell>\n {s ? (\n <>\n <StatCell label={t.lastRunSkipKey}>{String(s.alreadyPromotedKey)}</StatCell>\n <StatCell label={t.lastRunSkipRehydrate}>{String(s.rehydrateFailed)}</StatCell>\n <StatCell label={t.lastRunSkipContaminated}>{String(s.contaminated)}</StatCell>\n <StatCell label={t.lastRunSkipHash}>{String(s.hashDuplicate)}</StatCell>\n </>\n ) : null}\n </dl>\n );\n}\n","import { Loader2, Moon, Settings2, Sparkles, Sun } from 'lucide-react';\n\nimport { Button } from '@/components/ui/button';\nimport type { DreamingConfigState } from '@/features/settings/dreaming-config-api';\nimport {\n FieldCell,\n PhaseConfigPanel,\n numInputClass,\n phasePanelClass,\n sectionHeaderTightClass,\n sectionTightClass,\n type DreamingSettingsI18n,\n} from '@/features/settings/dreaming-settings-shared';\nimport { SettingsFormSection, SettingsFormSectionHeader } from '@/features/settings/settings-form-section';\nimport type { CronSchedulePickerLabels } from '@/features/scheduling/cron/cron-schedule-picker';\nimport { ScheduleField } from '@/features/scheduling/schedule-field';\nimport { cn } from '@/lib/cn';\n\ntype Props = {\n t: DreamingSettingsI18n;\n schedulePickerLabels: CronSchedulePickerLabels;\n hasToken: boolean;\n cfgForm: DreamingConfigState | null;\n cfgBaseline: DreamingConfigState | null;\n cfgSaving: boolean;\n cfgDirty: boolean;\n setCfgForm: (next: DreamingConfigState | null | ((prev: DreamingConfigState | null) => DreamingConfigState | null)) => void;\n setCfgOk: (v: boolean) => void;\n setCfgError: (v: string | null) => void;\n saveConfig: () => void | Promise<void>;\n};\n\nexport function DreamingConfigSection({\n t,\n schedulePickerLabels,\n hasToken,\n cfgForm,\n cfgBaseline,\n cfgSaving,\n cfgDirty,\n setCfgForm,\n setCfgOk,\n setCfgError,\n saveConfig,\n}: Props) {\n return (\n <SettingsFormSection className={cn('min-w-0', sectionTightClass)}>\n <SettingsFormSectionHeader\n className={sectionHeaderTightClass}\n icon={Settings2}\n title={t.configTitle}\n subtitle={t.configHint}\n trailing={\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"secondary\"\n className=\"px-2.5 py-1.5 text-xs\"\n disabled={!hasToken || !cfgForm || cfgSaving || !cfgDirty}\n onClick={() => void saveConfig()}\n >\n {cfgSaving ? <Loader2 className=\"mr-2 size-4 animate-spin\" aria-hidden /> : null}\n {t.saveConfig}\n </Button>\n <Button\n variant=\"secondary\"\n className=\"px-2.5 py-1.5 text-xs\"\n disabled={!hasToken || !cfgForm || cfgSaving || !cfgDirty}\n onClick={() => {\n setCfgOk(false);\n setCfgError(null);\n setCfgForm(cfgBaseline);\n }}\n >\n {t.resetConfig}\n </Button>\n </div>\n }\n />\n\n {cfgForm ? (\n <div className=\"space-y-3\">\n <div className={phasePanelClass}>\n <div className=\"grid grid-cols-1 gap-2 lg:grid-cols-12\">\n <div className=\"lg:col-span-9\">\n <ScheduleField\n kind=\"cron\"\n label={t.configFrequency}\n value={cfgForm.frequency}\n onChange={(frequency) => setCfgForm((prev) => (prev ? { ...prev, frequency } : prev))}\n labels={schedulePickerLabels}\n disabled={!hasToken || cfgSaving}\n />\n </div>\n <FieldCell label={t.configTimezone} className=\"lg:col-span-3\">\n <input\n className={numInputClass}\n value={cfgForm.timezone}\n disabled={!hasToken || cfgSaving}\n onChange={(e) => setCfgForm((prev) => (prev ? { ...prev, timezone: e.target.value } : prev))}\n placeholder=\"Asia/Shanghai\"\n />\n </FieldCell>\n </div>\n </div>\n\n <PhaseConfigPanel\n icon={<Sun className=\"size-4 text-amber-500\" />}\n title={t.configPhaseLight}\n hint={t.configPhaseLightHint}\n enabled={cfgForm.light.enabled}\n onEnabledChange={(enabled) =>\n setCfgForm((prev) => (prev ? { ...prev, light: { ...prev.light, enabled } } : prev))\n }\n cron={cfgForm.light.cron}\n onCronChange={(cron) => setCfgForm((prev) => (prev ? { ...prev, light: { ...prev.light, cron } } : prev))}\n scheduleLabels={schedulePickerLabels}\n disabled={!hasToken || cfgSaving}\n onLabel={t.on}\n offLabel={t.off}\n cronLabel={t.configPhaseCron}\n >\n <FieldCell label={t.configLightLookbackDays}>\n <input\n type=\"number\"\n step=\"1\"\n min={1}\n className={numInputClass}\n value={cfgForm.light.lookbackDays}\n disabled={!hasToken || cfgSaving}\n onChange={(e) =>\n setCfgForm((prev) =>\n prev ? { ...prev, light: { ...prev.light, lookbackDays: Number(e.target.value) } } : prev,\n )\n }\n />\n </FieldCell>\n <FieldCell label={t.configLightLimit}>\n <input\n type=\"number\"\n step=\"1\"\n min={0}\n className={numInputClass}\n value={cfgForm.light.limit}\n disabled={!hasToken || cfgSaving}\n onChange={(e) =>\n setCfgForm((prev) =>\n prev ? { ...prev, light: { ...prev.light, limit: Number(e.target.value) } } : prev,\n )\n }\n />\n </FieldCell>\n <FieldCell label={t.configLightDedupe}>\n <input\n type=\"number\"\n step=\"0.01\"\n min={0}\n max={1}\n className={numInputClass}\n value={cfgForm.light.dedupeSimilarity}\n disabled={!hasToken || cfgSaving}\n onChange={(e) =>\n setCfgForm((prev) =>\n prev ? { ...prev, light: { ...prev.light, dedupeSimilarity: Number(e.target.value) } } : prev,\n )\n }\n />\n </FieldCell>\n </PhaseConfigPanel>\n\n <PhaseConfigPanel\n icon={<Moon className=\"size-4 text-indigo-500\" />}\n title={t.configPhaseDeep}\n hint={t.configPhaseDeepHint}\n enabled={cfgForm.deep.enabled}\n onEnabledChange={(enabled) =>\n setCfgForm((prev) => (prev ? { ...prev, deep: { ...prev.deep, enabled } } : prev))\n }\n cron={cfgForm.deep.cron}\n onCronChange={(cron) => setCfgForm((prev) => (prev ? { ...prev, deep: { ...prev.deep, cron } } : prev))}\n scheduleLabels={schedulePickerLabels}\n disabled={!hasToken || cfgSaving}\n onLabel={t.on}\n offLabel={t.off}\n cronLabel={t.configPhaseCron}\n >\n <FieldCell label={t.configDeepMinScore}>\n <input\n type=\"number\"\n step=\"0.01\"\n min={0}\n max={1}\n className={numInputClass}\n value={cfgForm.deep.minScore}\n disabled={!hasToken || cfgSaving}\n onChange={(e) =>\n setCfgForm((prev) =>\n prev ? { ...prev, deep: { ...prev.deep, minScore: Number(e.target.value) } } : prev,\n )\n }\n />\n </FieldCell>\n <FieldCell label={t.configDeepMinRecallCount}>\n <input\n type=\"number\"\n step=\"1\"\n min={1}\n className={numInputClass}\n value={cfgForm.deep.minRecallCount}\n disabled={!hasToken || cfgSaving}\n onChange={(e) =>\n setCfgForm((prev) =>\n prev ? { ...prev, deep: { ...prev.deep, minRecallCount: Number(e.target.value) } } : prev,\n )\n }\n />\n </FieldCell>\n <FieldCell label={t.configDeepLimit}>\n <input\n type=\"number\"\n step=\"1\"\n min={0}\n className={numInputClass}\n value={cfgForm.deep.limit}\n disabled={!hasToken || cfgSaving}\n onChange={(e) =>\n setCfgForm((prev) =>\n prev ? { ...prev, deep: { ...prev.deep, limit: Number(e.target.value) } } : prev,\n )\n }\n />\n </FieldCell>\n <FieldCell label={t.configDeepHalfLife}>\n <input\n type=\"number\"\n step=\"1\"\n min={1}\n className={numInputClass}\n value={cfgForm.deep.recencyHalfLifeDays}\n disabled={!hasToken || cfgSaving}\n onChange={(e) =>\n setCfgForm((prev) =>\n prev\n ? { ...prev, deep: { ...prev.deep, recencyHalfLifeDays: Number(e.target.value) } }\n : prev,\n )\n }\n />\n </FieldCell>\n <FieldCell label={t.configDeepMaxAge}>\n <input\n type=\"number\"\n step=\"1\"\n min={1}\n className={numInputClass}\n value={cfgForm.deep.maxAgeDays}\n disabled={!hasToken || cfgSaving}\n onChange={(e) =>\n setCfgForm((prev) =>\n prev ? { ...prev, deep: { ...prev.deep, maxAgeDays: Number(e.target.value) } } : prev,\n )\n }\n />\n </FieldCell>\n </PhaseConfigPanel>\n\n <PhaseConfigPanel\n icon={<Sparkles className=\"size-4 text-purple-500\" />}\n title={t.configPhaseRem}\n hint={t.configPhaseRemHint}\n enabled={cfgForm.rem.enabled}\n onEnabledChange={(enabled) =>\n setCfgForm((prev) => (prev ? { ...prev, rem: { ...prev.rem, enabled } } : prev))\n }\n cron={cfgForm.rem.cron}\n onCronChange={(cron) => setCfgForm((prev) => (prev ? { ...prev, rem: { ...prev.rem, cron } } : prev))}\n scheduleLabels={schedulePickerLabels}\n disabled={!hasToken || cfgSaving}\n onLabel={t.on}\n offLabel={t.off}\n cronLabel={t.configPhaseCron}\n >\n <FieldCell label={t.configRemLookbackDays}>\n <input\n type=\"number\"\n step=\"1\"\n min={1}\n className={numInputClass}\n value={cfgForm.rem.lookbackDays}\n disabled={!hasToken || cfgSaving}\n onChange={(e) =>\n setCfgForm((prev) =>\n prev ? { ...prev, rem: { ...prev.rem, lookbackDays: Number(e.target.value) } } : prev,\n )\n }\n />\n </FieldCell>\n <FieldCell label={t.configRemLimit}>\n <input\n type=\"number\"\n step=\"1\"\n min={0}\n className={numInputClass}\n value={cfgForm.rem.limit}\n disabled={!hasToken || cfgSaving}\n onChange={(e) =>\n setCfgForm((prev) =>\n prev ? { ...prev, rem: { ...prev.rem, limit: Number(e.target.value) } } : prev,\n )\n }\n />\n </FieldCell>\n <FieldCell label={t.configRemMinStrength}>\n <input\n type=\"number\"\n step=\"0.01\"\n min={0}\n max={1}\n className={numInputClass}\n value={cfgForm.rem.minPatternStrength}\n disabled={!hasToken || cfgSaving}\n onChange={(e) =>\n setCfgForm((prev) =>\n prev\n ? { ...prev, rem: { ...prev.rem, minPatternStrength: Number(e.target.value) } }\n : prev,\n )\n }\n />\n </FieldCell>\n </PhaseConfigPanel>\n </div>\n ) : (\n <p className=\"text-sm text-fg-muted\">{t.configLoading}</p>\n )}\n </SettingsFormSection>\n );\n}\n","import { Activity, Loader2 } from 'lucide-react';\n\nimport { Button } from '@/components/ui/button';\nimport type { DreamingEvent } from '@/features/settings/dreaming-api';\nimport {\n formatDurationMs,\n isoShort,\n sectionHeaderTightClass,\n sectionTightClass,\n type DreamingSettingsI18n,\n} from '@/features/settings/dreaming-settings-shared';\nimport { SettingsFormSection, SettingsFormSectionHeader } from '@/features/settings/settings-form-section';\nimport { cn } from '@/lib/cn';\n\ntype Props = {\n t: DreamingSettingsI18n;\n hasToken: boolean;\n eventsLoading: boolean;\n events: DreamingEvent[] | null;\n loadEvents: () => void | Promise<void>;\n};\n\nexport function DreamingEventsSection({ t, hasToken, eventsLoading, events, loadEvents }: Props) {\n return (\n <SettingsFormSection className={sectionTightClass}>\n <SettingsFormSectionHeader\n className={sectionHeaderTightClass}\n icon={Activity}\n title={t.eventsTitle}\n subtitle={t.eventsHint}\n trailing={\n <Button\n variant=\"secondary\"\n className=\"px-2.5 py-1.5 text-xs\"\n disabled={!hasToken || eventsLoading}\n onClick={() => void loadEvents()}\n >\n {eventsLoading ? <Loader2 className=\"mr-2 size-4 animate-spin\" aria-hidden /> : null}\n {t.eventsLoad}\n </Button>\n }\n />\n {events ? (\n events.length > 0 ? (\n <div className=\"space-y-1.5\">\n {events.map((ev) => {\n const phaseIcon = ev.phase === 'light' ? '☀️' : ev.phase === 'rem' ? '✨' : '🌙';\n const metrics =\n ev.phase === 'light'\n ? `scanned=${ev.scannedEntries ?? 0} new=${ev.newSignals ?? 0} deduped=${ev.deduped ?? 0}`\n : ev.phase === 'rem'\n ? `patterns=${ev.patternsDiscovered ?? 0} analyzed=${ev.entriesAnalyzed ?? 0}`\n : `candidates=${ev.candidates ?? 0} applied=${ev.applied ?? 0}`;\n return (\n <div\n key={`${ev.timestamp}:${ev.phase}`}\n className=\"flex flex-wrap items-center gap-x-3 gap-y-1 rounded-lg border border-edge-subtle bg-surface-panel/60 px-3 py-2 text-xs\"\n >\n <span>{phaseIcon}</span>\n <span className=\"font-medium text-fg\">{ev.phase}</span>\n <span\n className={cn(\n 'font-medium',\n ev.ok ? 'text-emerald-600 dark:text-emerald-400' : 'text-amber-600 dark:text-amber-400',\n )}\n >\n {ev.ok ? 'OK' : 'FAIL'}\n </span>\n <span className=\"text-fg-muted\">{metrics}</span>\n <span className=\"text-fg-muted\">{formatDurationMs(ev.durationMs)}</span>\n <span className=\"ml-auto text-fg-subtle\">{isoShort(ev.timestamp)}</span>\n </div>\n );\n })}\n </div>\n ) : (\n <p className=\"text-sm text-fg-muted\">{t.eventsEmpty}</p>\n )\n ) : (\n <p className=\"text-sm text-fg-muted\">{t.eventsNotLoaded}</p>\n )}\n </SettingsFormSection>\n );\n}\n","import { Loader2, Play, RefreshCw } from 'lucide-react';\n\nimport { Button } from '@/components/ui/button';\nimport type { DreamingPhaseId } from '@/features/settings/dreaming-api';\nimport type { DreamingConfigState } from '@/features/settings/dreaming-config-api';\nimport { type DreamingSettingsI18n } from '@/features/settings/dreaming-settings-shared';\nimport { cn } from '@/lib/cn';\n\ntype Props = {\n t: DreamingSettingsI18n;\n cfgForm: DreamingConfigState | null;\n dreamingEnabled: boolean;\n hasToken: boolean;\n cfgSaving: boolean;\n enableSaving: boolean;\n runPhase: DreamingPhaseId;\n setRunPhase: (p: DreamingPhaseId) => void;\n runBusy: boolean;\n doRunNow: (phase: DreamingPhaseId) => void | Promise<void>;\n doRefresh: () => void | Promise<void>;\n setDreamingEnabled: (enabled: boolean) => void | Promise<void>;\n};\n\nexport function DreamingHeader({\n t,\n cfgForm,\n dreamingEnabled,\n hasToken,\n cfgSaving,\n enableSaving,\n runPhase,\n setRunPhase,\n runBusy,\n doRunNow,\n doRefresh,\n setDreamingEnabled,\n}: Props) {\n return (\n <header className=\"flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"min-w-0\">\n <h1 className=\"text-lg font-semibold text-fg\">{t.title}</h1>\n <p className=\"mt-1 text-sm text-fg-muted\">{t.subtitle}</p>\n </div>\n <div className=\"flex shrink-0 flex-wrap items-center justify-end gap-2\">\n {cfgForm ? (\n <label\n className={cn(\n 'inline-flex cursor-pointer items-center gap-2 rounded-xl border px-3 py-1.5 text-sm transition-colors',\n dreamingEnabled\n ? 'border-emerald-500/30 bg-emerald-500/5 text-fg'\n : 'border-edge-subtle bg-surface-panel/50 text-fg-muted',\n )}\n >\n <span className=\"text-xs font-medium\">{t.configEnabled}</span>\n <input\n type=\"checkbox\"\n className=\"ui-checkbox\"\n checked={cfgForm.enabled}\n disabled={!hasToken || cfgSaving || enableSaving}\n onChange={(e) => void setDreamingEnabled(e.target.checked)}\n />\n {enableSaving ? (\n <Loader2 className=\"size-3.5 animate-spin text-fg-muted\" aria-hidden />\n ) : (\n <span\n className={cn(\n 'text-xs font-semibold',\n dreamingEnabled ? 'text-emerald-600 dark:text-emerald-400' : '',\n )}\n >\n {cfgForm.enabled ? t.on : t.off}\n </span>\n )}\n </label>\n ) : null}\n {dreamingEnabled ? (\n <>\n <select\n className=\"rounded-lg border border-edge bg-surface-panel px-2 py-1.5 text-xs text-fg\"\n value={runPhase}\n onChange={(e) => setRunPhase(e.target.value as DreamingPhaseId)}\n disabled={!hasToken || runBusy}\n >\n <option value=\"light\">Light</option>\n <option value=\"deep\">Deep</option>\n <option value=\"rem\">REM</option>\n </select>\n <Button\n variant=\"secondary\"\n className=\"px-2.5 py-1.5 text-xs\"\n disabled={!hasToken || runBusy}\n onClick={() => void doRunNow(runPhase)}\n title={t.runNowHint}\n >\n {runBusy ? (\n <Loader2 className=\"mr-2 size-4 animate-spin\" aria-hidden />\n ) : (\n <Play className=\"mr-2 size-4\" aria-hidden />\n )}\n {t.runNow}\n </Button>\n </>\n ) : null}\n <Button\n variant=\"secondary\"\n className=\"px-2.5 py-1.5 text-xs\"\n disabled={!hasToken}\n onClick={() => void doRefresh()}\n >\n <RefreshCw className=\"mr-2 size-4\" aria-hidden />\n {t.refresh}\n </Button>\n </div>\n </header>\n );\n}\n","import { Loader2, Trash2, Unlock, Wrench } from 'lucide-react';\n\nimport { Button } from '@/components/ui/button';\nimport {\n sectionHeaderTightClass,\n sectionTightClass,\n type DreamingSettingsI18n,\n} from '@/features/settings/dreaming-settings-shared';\nimport { SettingsFormSection, SettingsFormSectionHeader } from '@/features/settings/settings-form-section';\nimport { cn } from '@/lib/cn';\n\ntype Props = {\n t: DreamingSettingsI18n;\n disabled: boolean;\n actionBusy: 'reset_store' | 'clear_lock' | null;\n doAction: (action: 'reset_store' | 'clear_lock') => void | Promise<void>;\n};\n\nexport function DreamingMaintenanceSection({ t, disabled, actionBusy, doAction }: Props) {\n return (\n <SettingsFormSection className={cn('max-w-2xl', sectionTightClass)}>\n <SettingsFormSectionHeader\n className={sectionHeaderTightClass}\n icon={Wrench}\n title={t.maintenanceTitle}\n subtitle={t.maintenanceHint}\n />\n <div className=\"flex flex-col gap-2 sm:flex-row\">\n <Button\n variant=\"secondary\"\n disabled={disabled}\n onClick={() => {\n if (!confirm(t.confirmResetStore)) return;\n void doAction('reset_store');\n }}\n >\n {actionBusy === 'reset_store' ? (\n <Loader2 className=\"mr-2 size-4 animate-spin\" aria-hidden />\n ) : (\n <Trash2 className=\"mr-2 size-4\" aria-hidden />\n )}\n {t.resetStore}\n </Button>\n <Button\n variant=\"secondary\"\n disabled={disabled}\n onClick={() => {\n if (!confirm(t.confirmClearLock)) return;\n void doAction('clear_lock');\n }}\n >\n {actionBusy === 'clear_lock' ? (\n <Loader2 className=\"mr-2 size-4 animate-spin\" aria-hidden />\n ) : (\n <Unlock className=\"mr-2 size-4\" aria-hidden />\n )}\n {t.clearLock}\n </Button>\n </div>\n </SettingsFormSection>\n );\n}\n","import { Loader2, ScanLine } from 'lucide-react';\n\nimport { Button } from '@/components/ui/button';\nimport type { DreamingPreviewItem } from '@/features/settings/dreaming-api';\nimport {\n sectionHeaderTightClass,\n sectionTightClass,\n type DreamingSettingsI18n,\n} from '@/features/settings/dreaming-settings-shared';\nimport { SettingsFormSection, SettingsFormSectionHeader } from '@/features/settings/settings-form-section';\n\ntype Props = {\n t: DreamingSettingsI18n;\n hasToken: boolean;\n previewLoading: boolean;\n previewItems: DreamingPreviewItem[] | null;\n loadPreview: () => void | Promise<void>;\n};\n\nexport function DreamingPreviewSection({ t, hasToken, previewLoading, previewItems, loadPreview }: Props) {\n return (\n <SettingsFormSection className={sectionTightClass}>\n <SettingsFormSectionHeader\n className={sectionHeaderTightClass}\n icon={ScanLine}\n title={t.previewTitle}\n subtitle={t.previewHint}\n trailing={\n <Button\n variant=\"secondary\"\n className=\"px-2.5 py-1.5 text-xs\"\n disabled={!hasToken || previewLoading}\n onClick={() => void loadPreview()}\n >\n {previewLoading ? <Loader2 className=\"mr-2 size-4 animate-spin\" aria-hidden /> : null}\n {t.previewLoad}\n </Button>\n }\n />\n {previewItems ? (\n previewItems.length > 0 ? (\n <div className=\"space-y-2\">\n {previewItems.map((it) => {\n const src = `${it.path}:${it.startLine}-${it.endLine}`;\n const skipped = it.skippedReason;\n return (\n <div\n key={`${it.key}:${it.hash}:${src}`}\n className=\"rounded-lg border border-edge-subtle bg-surface-panel/60 px-2.5 py-2\"\n >\n <div className=\"flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-fg-muted\">\n <span className=\"font-medium text-fg\">{src}</span>\n <span>score={it.score.toFixed(3)}</span>\n <span>recalls={it.recallCount}</span>\n <span>avg={it.avgScore.toFixed(3)}</span>\n <span>decay={it.recencyDecay?.toFixed(3) ?? '—'}</span>\n {skipped ? (\n <span className=\"text-amber-600 dark:text-amber-400\">{skipped}</span>\n ) : (\n <span className=\"text-emerald-600 dark:text-emerald-400\">{t.previewEligible}</span>\n )}\n </div>\n {it.snippet ? <div className=\"mt-2 text-sm text-fg\">{it.snippet}</div> : null}\n </div>\n );\n })}\n </div>\n ) : (\n <p className=\"text-sm text-fg-muted\">{t.previewEmpty}</p>\n )\n ) : (\n <p className=\"text-sm text-fg-muted\">{t.previewNotLoaded}</p>\n )}\n </SettingsFormSection>\n );\n}\n","import { Activity, Loader2, Moon, Sparkles, Sun } from 'lucide-react';\n\nimport { type DreamingGatewayStatus } from '@/features/settings/dreaming-api';\nimport {\n PanelHeading,\n PhaseLastRunBlock,\n PhaseStatusCard,\n StatCell,\n isoShort,\n lockStatusLabel,\n phasePanelClass,\n sectionHeaderTightClass,\n sectionTightClass,\n type DreamingSettingsI18n,\n} from '@/features/settings/dreaming-settings-shared';\nimport { LastRunStructuredView } from '@/features/settings/dreaming-settings-shared';\nimport { SettingsFormSection, SettingsFormSectionHeader } from '@/features/settings/settings-form-section';\nimport { formatCronExpressionLabel, type ScheduleBadgeLabels } from '@/features/scheduling/cron/format-cron-label';\nimport { ScheduleSummary } from '@/features/scheduling/schedule-summary';\nimport { cn } from '@/lib/cn';\n\ntype Props = {\n t: DreamingSettingsI18n;\n data: DreamingGatewayStatus | undefined;\n isLoading: boolean;\n localeTag: string;\n scheduleBadgeLabels: ScheduleBadgeLabels;\n};\n\nexport function DreamingRuntimeSection({ t, data, isLoading, localeTag, scheduleBadgeLabels }: Props) {\n const lockLabel = data ? lockStatusLabel(data.lock, t) : null;\n\n return (\n <SettingsFormSection className={cn('min-w-0', sectionTightClass)}>\n <SettingsFormSectionHeader\n className={sectionHeaderTightClass}\n icon={Activity}\n title={t.runtimeTitle}\n subtitle={t.runtimeHint}\n trailing={isLoading ? <Loader2 className=\"size-4 shrink-0 animate-spin text-fg-muted\" aria-hidden /> : null}\n />\n\n <div className=\"space-y-3\">\n <div className={phasePanelClass}>\n <PanelHeading label={t.subsectionSchedule} className=\"mb-2\" />\n <dl className=\"grid grid-cols-2 gap-x-3 gap-y-2 sm:grid-cols-4\">\n <StatCell label={t.enabled}>{data ? (data.config.enabled ? t.on : t.off) : '—'}</StatCell>\n <StatCell label={t.lock}>\n <span className={lockLabel?.className}>{lockLabel ? lockLabel.text : '—'}</span>\n </StatCell>\n <StatCell label={t.timezone}>{data ? data.config.timezone || '—' : '—'}</StatCell>\n <StatCell label={t.schedule} className=\"col-span-2 sm:col-span-2\">\n {data ? (\n <ScheduleSummary\n kind=\"cron\"\n expression={data.config.frequency}\n locale={localeTag}\n labels={scheduleBadgeLabels}\n timezone={data.config.timezone || undefined}\n />\n ) : (\n '—'\n )}\n {data?.config.frequency ? (\n <p className=\"mt-0.5 truncate font-mono text-[0.65rem] text-fg-subtle\" title={data.config.frequency}>\n {data.config.frequency}\n </p>\n ) : null}\n </StatCell>\n </dl>\n </div>\n\n <div className={phasePanelClass}>\n <PanelHeading label={t.subsectionStore} className=\"mb-2\" />\n <dl className=\"grid grid-cols-2 gap-x-3 gap-y-2 sm:grid-cols-4\">\n <StatCell label={t.storeEntries}>{data ? String(data.store.entryCount) : '—'}</StatCell>\n <StatCell label={t.storePromoted}>{data ? String(data.store.promotedCount) : '—'}</StatCell>\n <StatCell label={t.storeUpdatedAt}>{data ? isoShort(data.store.updatedAt) : '—'}</StatCell>\n <StatCell label={t.storeLastPromotedAt}>{data ? isoShort(data.store.lastPromotedAt) : '—'}</StatCell>\n </dl>\n </div>\n\n {data?.config?.phases ? (\n <div>\n <PanelHeading label={t.subsectionPhases} className=\"mb-2\" />\n <div className=\"grid gap-2 sm:grid-cols-3\">\n <PhaseStatusCard\n icon={<Sun className=\"size-4 text-amber-500\" />}\n label=\"Light\"\n enabled={data.config.phases.light.enabled}\n cron={data.config.phases.light.cron}\n scheduleSummary={formatCronExpressionLabel(\n data.config.phases.light.cron,\n localeTag,\n scheduleBadgeLabels,\n { timezone: data.config.timezone || undefined },\n )}\n details={`lookback=${data.config.phases.light.lookbackDays}d, limit=${data.config.phases.light.limit}, dedupe=${data.config.phases.light.dedupeSimilarity}`}\n t={t}\n />\n <PhaseStatusCard\n icon={<Moon className=\"size-4 text-indigo-500\" />}\n label=\"Deep\"\n enabled={data.config.phases.deep.enabled}\n cron={data.config.phases.deep.cron}\n scheduleSummary={formatCronExpressionLabel(\n data.config.phases.deep.cron,\n localeTag,\n scheduleBadgeLabels,\n { timezone: data.config.timezone || undefined },\n )}\n details={`minScore=${data.config.phases.deep.minScore}, recalls≥${data.config.phases.deep.minRecallCount}, limit=${data.config.phases.deep.limit}, halfLife=${data.config.phases.deep.recencyHalfLifeDays}d`}\n t={t}\n />\n <PhaseStatusCard\n icon={<Sparkles className=\"size-4 text-purple-500\" />}\n label=\"REM\"\n enabled={data.config.phases.rem.enabled}\n cron={data.config.phases.rem.cron}\n scheduleSummary={formatCronExpressionLabel(\n data.config.phases.rem.cron,\n localeTag,\n scheduleBadgeLabels,\n { timezone: data.config.timezone || undefined },\n )}\n details={`lookback=${data.config.phases.rem.lookbackDays}d, limit=${data.config.phases.rem.limit}, strength≥${data.config.phases.rem.minPatternStrength}`}\n t={t}\n />\n </div>\n </div>\n ) : null}\n\n <div className={phasePanelClass}>\n <PanelHeading label={t.subsectionLastRun} className=\"mb-2\" />\n <p className=\"mb-2 text-xs text-fg-muted\">{t.lastRunBlockHint}</p>\n {data?.lastRun?.exists ? (\n <div className=\"space-y-2\">\n {data.lastRun.parseError ? (\n <p className=\"text-sm text-amber-600 dark:text-amber-400\" role=\"alert\">\n {t.lastRunParseError}\n {': '}\n {data.lastRun.parseError}\n </p>\n ) : null}\n {data.lastRun.record ? (\n <div className=\"rounded-lg border border-edge-subtle/80 bg-surface-panel/50 p-2.5\">\n <LastRunStructuredView t={t} r={data.lastRun.record} />\n </div>\n ) : null}\n {data.lastRun.raw !== undefined && data.lastRun.raw !== null ? (\n <details className=\"group rounded-lg border border-edge-subtle\">\n <summary className=\"cursor-pointer list-none px-2.5 py-1.5 text-xs font-medium text-fg-muted marker:hidden [&::-webkit-details-marker]:hidden\">\n <span className=\"underline decoration-edge underline-offset-2 group-open:text-fg\">{t.lastRunRaw}</span>\n </summary>\n <pre className=\"max-h-40 overflow-auto border-t border-edge-subtle p-2.5 text-xs text-fg-muted\">\n {JSON.stringify(data.lastRun.raw, null, 2)}\n </pre>\n </details>\n ) : null}\n </div>\n ) : (\n <p className=\"text-xs text-fg-muted\">{t.lastRunEmpty}</p>\n )}\n </div>\n\n <PhaseLastRunBlock label={t.subsectionLightLastRun} lastRun={data?.lightLastRun} t={t} />\n <PhaseLastRunBlock label={t.subsectionRemLastRun} lastRun={data?.remLastRun} t={t} />\n </div>\n </SettingsFormSection>\n );\n}\n","import { Activity, ScanLine, Settings2, Wrench, type LucideIcon } from 'lucide-react';\nimport { useCallback, useEffect, useMemo, useReducer, useRef, type ReactNode } from 'react';\n\nimport { uiPatchReducer } from '@/lib/settings-form-draft';\nimport { useSearchParams } from 'react-router-dom';\nimport useSWR from 'swr';\n\nimport { useGatewayConfigSwr } from '@/features/gateway/gateway-config-swr';\nimport {\n dreamingSwrKey,\n fetchDreamingEvents,\n fetchDreamingPreview,\n fetchDreamingStatus,\n postDreamingAction,\n postDreamingRunNow,\n type DreamingEvent,\n type DreamingPhaseId,\n type DreamingPreviewItem,\n} from '@/features/settings/dreaming-api';\nimport {\n normalizeDreamingFromConfig,\n patchDreamingConfig,\n type DreamingConfigState,\n} from '@/features/settings/dreaming-config-api';\nimport { DreamingConfigSection } from '@/features/settings/dreaming-settings-config-section';\nimport { DreamingEventsSection } from '@/features/settings/dreaming-settings-events-section';\nimport { DreamingHeader } from '@/features/settings/dreaming-settings-header';\nimport { DreamingMaintenanceSection } from '@/features/settings/dreaming-settings-maintenance-section';\nimport { DreamingPreviewSection } from '@/features/settings/dreaming-settings-preview-section';\nimport { DreamingRuntimeSection } from '@/features/settings/dreaming-settings-runtime-section';\nimport { cn } from '@/lib/cn';\nimport { interaction } from '@/lib/interaction';\nimport { messages, type MessageBundle } from '@/i18n/messages';\nimport { useGatewayStore } from '@/stores/gateway-store';\nimport { useLocaleStore } from '@/stores/locale-store';\n\ntype DreamingSettingsI18n = MessageBundle['dreamingSettings'];\ntype DreamingSettingsTabId = 'config' | 'runtime' | 'insights' | 'maintenance';\n\nconst DREAMING_SETTINGS_TABS: readonly DreamingSettingsTabId[] = ['config', 'runtime', 'insights', 'maintenance'];\n\nconst DREAMING_SETTINGS_TAB_ICONS: Record<DreamingSettingsTabId, LucideIcon> = {\n config: Settings2,\n runtime: Activity,\n insights: ScanLine,\n maintenance: Wrench,\n};\n\nfunction parseDreamingSettingsTab(raw: string | null): DreamingSettingsTabId {\n if (raw && DREAMING_SETTINGS_TABS.includes(raw as DreamingSettingsTabId)) {\n return raw as DreamingSettingsTabId;\n }\n return 'config';\n}\n\nfunction dreamingSettingsTabLabel(t: DreamingSettingsI18n, tab: DreamingSettingsTabId): string {\n if (tab === 'config') return t.tabConfig;\n if (tab === 'runtime') return t.tabRuntime;\n if (tab === 'insights') return t.tabInsights;\n return t.tabMaintenance;\n}\n\nfunction dreamingSettingsTabHint(t: DreamingSettingsI18n, tab: DreamingSettingsTabId): string {\n if (tab === 'config') return t.configTabHint;\n if (tab === 'runtime') return t.runtimeTabHint;\n if (tab === 'insights') return t.insightsTabHint;\n return t.maintenanceTabHint;\n}\n\ntype DreamingFormDraft = {\n form: DreamingConfigState | null;\n baseline: DreamingConfigState | null;\n};\n\ntype DreamingFormAction =\n | { type: 'reset' }\n | { type: 'sync'; value: DreamingConfigState }\n | { type: 'set'; value: DreamingConfigState }\n | { type: 'saved'; value: DreamingConfigState };\n\nfunction dreamingFormReducer(state: DreamingFormDraft, action: DreamingFormAction): DreamingFormDraft {\n switch (action.type) {\n case 'reset':\n return { form: null, baseline: null };\n case 'sync':\n return { form: action.value, baseline: action.value };\n case 'set':\n return { ...state, form: action.value };\n case 'saved':\n return { form: action.value, baseline: action.value };\n }\n}\n\ntype DreamingUi = {\n actionBusy: null | 'reset_store' | 'clear_lock';\n actionError: string | null;\n actionOk: boolean;\n runBusy: boolean;\n runOk: boolean;\n runError: string | null;\n runPhase: DreamingPhaseId;\n cfgSaving: boolean;\n enableSaving: boolean;\n cfgOk: boolean;\n cfgError: string | null;\n previewLoading: boolean;\n previewError: string | null;\n previewItems: DreamingPreviewItem[] | null;\n eventsLoading: boolean;\n eventsError: string | null;\n events: DreamingEvent[] | null;\n};\n\nconst initialDreamingUi: DreamingUi = {\n actionBusy: null,\n actionError: null,\n actionOk: false,\n runBusy: false,\n runOk: false,\n runError: null,\n runPhase: 'deep',\n cfgSaving: false,\n enableSaving: false,\n cfgOk: false,\n cfgError: null,\n previewLoading: false,\n previewError: null,\n previewItems: null,\n eventsLoading: false,\n eventsError: null,\n events: null,\n};\n\nexport function DreamingSettingsPanel() {\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const t = m.dreamingSettings;\n const schedulePickerLabels = m.cron.schedulePicker;\n const scheduleBadgeLabels = m.cron.scheduleBadge;\n const localeTag = language === 'zh' ? 'zh-CN' : 'en-US';\n\n const token = useGatewayStore((st) => st.token);\n const hasToken = Boolean(token);\n const [searchParams, setSearchParams] = useSearchParams();\n const activeTab = parseDreamingSettingsTab(searchParams.get('tab'));\n const setActiveTab = useCallback(\n (tab: DreamingSettingsTabId) => {\n setSearchParams(\n (prev) => {\n const next = new URLSearchParams(prev);\n if (tab === 'config') next.delete('tab');\n else next.set('tab', tab);\n return next;\n },\n { replace: true },\n );\n },\n [setSearchParams],\n );\n\n const { data: cfgData } = useGatewayConfigSwr(hasToken);\n\n const [ui, dispatchUi] = useReducer(uiPatchReducer<DreamingUi>, initialDreamingUi);\n const {\n actionBusy,\n actionError,\n actionOk,\n runBusy,\n runOk,\n runError,\n runPhase,\n cfgSaving,\n enableSaving,\n cfgOk,\n cfgError,\n previewLoading,\n previewError,\n previewItems,\n eventsLoading,\n eventsError,\n events,\n } = ui;\n const [cfgDraft, dispatchCfg] = useReducer(dreamingFormReducer, { form: null, baseline: null });\n const cfgForm = cfgDraft.form;\n const cfgBaseline = cfgDraft.baseline;\n const cfgDirtyRef = useRef(false);\n\n const { data, error, isLoading, mutate } = useSWR(hasToken ? dreamingSwrKey() : null, fetchDreamingStatus, {\n revalidateOnFocus: false,\n });\n\n const errorMessages = useMemo(() => {\n const list: string[] = [];\n if (error) list.push(error instanceof Error ? error.message : String(error));\n if (actionError) list.push(actionError);\n if (runError) list.push(runError);\n if (previewError) list.push(previewError);\n if (eventsError) list.push(eventsError);\n if (cfgError) list.push(cfgError);\n return list;\n }, [error, actionError, runError, previewError, eventsError, cfgError]);\n\n const successMessages = useMemo(() => {\n const list: string[] = [];\n if (cfgOk) list.push(t.configSaved);\n if (runOk) list.push(t.runQueued);\n if (actionOk) list.push(t.actionOk);\n return list;\n }, [cfgOk, runOk, actionOk, t]);\n\n const doRefresh = useCallback(async () => {\n dispatchUi({\n type: 'patch',\n patch: {\n actionOk: false,\n actionError: null,\n runOk: false,\n runError: null,\n cfgOk: false,\n cfgError: null,\n previewError: null,\n },\n });\n await mutate();\n }, [mutate]);\n\n const loadPreview = useCallback(async () => {\n dispatchUi({ type: 'patch', patch: { previewLoading: true, previewError: null } });\n try {\n const res = await fetchDreamingPreview(20);\n dispatchUi({ type: 'patch', patch: { previewItems: res.items ?? [] } });\n } catch (e) {\n dispatchUi({\n type: 'patch',\n patch: { previewError: e instanceof Error ? e.message : String(e) },\n });\n } finally {\n dispatchUi({ type: 'patch', patch: { previewLoading: false } });\n }\n }, []);\n\n const loadEvents = useCallback(async () => {\n dispatchUi({ type: 'patch', patch: { eventsLoading: true, eventsError: null } });\n try {\n const result = await fetchDreamingEvents(50);\n dispatchUi({ type: 'patch', patch: { events: result } });\n } catch (e) {\n dispatchUi({\n type: 'patch',\n patch: { eventsError: e instanceof Error ? e.message : String(e) },\n });\n } finally {\n dispatchUi({ type: 'patch', patch: { eventsLoading: false } });\n }\n }, []);\n\n const doRunNow = useCallback(\n async (phase: DreamingPhaseId = 'deep') => {\n dispatchUi({ type: 'patch', patch: { runBusy: true, runOk: false, runError: null } });\n try {\n await postDreamingRunNow(phase);\n dispatchUi({ type: 'patch', patch: { runOk: true } });\n await mutate();\n } catch (e) {\n dispatchUi({\n type: 'patch',\n patch: { runError: e instanceof Error ? e.message : String(e) },\n });\n } finally {\n dispatchUi({ type: 'patch', patch: { runBusy: false } });\n }\n },\n [mutate],\n );\n\n const doAction = useCallback(\n async (action: 'reset_store' | 'clear_lock') => {\n dispatchUi({ type: 'patch', patch: { actionBusy: action, actionError: null, actionOk: false } });\n try {\n await postDreamingAction(action);\n dispatchUi({ type: 'patch', patch: { actionOk: true } });\n await mutate();\n } catch (e) {\n dispatchUi({\n type: 'patch',\n patch: { actionError: e instanceof Error ? e.message : String(e) },\n });\n } finally {\n dispatchUi({ type: 'patch', patch: { actionBusy: null } });\n }\n },\n [mutate],\n );\n\n const disabled = !hasToken || isLoading || Boolean(actionBusy);\n\n const cfgFromGateway = useMemo(() => {\n const rawCfg = cfgData?.payload?.config;\n return normalizeDreamingFromConfig(rawCfg ?? {});\n }, [cfgData]);\n\n useEffect(() => {\n if (!hasToken) {\n dispatchCfg({ type: 'reset' });\n cfgDirtyRef.current = false;\n return;\n }\n if (!cfgDirtyRef.current) {\n dispatchCfg({ type: 'sync', value: cfgFromGateway });\n }\n }, [cfgFromGateway, hasToken]);\n\n const cfgDirty = useMemo(() => {\n if (!cfgForm || !cfgBaseline) return false;\n return JSON.stringify(cfgForm) !== JSON.stringify(cfgBaseline);\n }, [cfgForm, cfgBaseline]);\n\n const saveConfig = useCallback(async () => {\n if (!cfgForm) return;\n dispatchUi({ type: 'patch', patch: { cfgSaving: true, cfgOk: false, cfgError: null } });\n try {\n await patchDreamingConfig(cfgForm);\n dispatchCfg({ type: 'saved', value: cfgForm });\n cfgDirtyRef.current = false;\n dispatchUi({ type: 'patch', patch: { cfgOk: true } });\n await mutate();\n } catch (e) {\n dispatchUi({\n type: 'patch',\n patch: { cfgError: e instanceof Error ? e.message : String(e) },\n });\n } finally {\n dispatchUi({ type: 'patch', patch: { cfgSaving: false } });\n }\n }, [cfgForm, mutate]);\n\n const setDreamingEnabled = useCallback(\n async (enabled: boolean) => {\n if (!cfgForm || !hasToken) return;\n const next = { ...cfgForm, enabled };\n const prev = cfgForm;\n cfgDirtyRef.current = true;\n dispatchCfg({ type: 'set', value: next });\n dispatchUi({ type: 'patch', patch: { enableSaving: true, cfgOk: false, cfgError: null } });\n try {\n await patchDreamingConfig(next);\n dispatchCfg({ type: 'saved', value: next });\n cfgDirtyRef.current = false;\n dispatchUi({ type: 'patch', patch: { cfgOk: true } });\n await mutate();\n } catch (e) {\n dispatchCfg({ type: 'set', value: prev });\n dispatchUi({\n type: 'patch',\n patch: { cfgError: e instanceof Error ? e.message : String(e) },\n });\n } finally {\n dispatchUi({ type: 'patch', patch: { enableSaving: false } });\n }\n },\n [cfgForm, hasToken, mutate],\n );\n\n const dreamingEnabled = cfgForm?.enabled ?? cfgFromGateway.enabled;\n\n return (\n <div className=\"mx-auto flex w-full max-w-app-main flex-col gap-4 px-4 py-6\">\n <DreamingHeader\n t={t}\n cfgForm={cfgForm}\n dreamingEnabled={dreamingEnabled}\n hasToken={hasToken}\n cfgSaving={cfgSaving}\n enableSaving={enableSaving}\n runPhase={runPhase}\n setRunPhase={(phase) => dispatchUi({ type: 'patch', patch: { runPhase: phase } })}\n runBusy={runBusy}\n doRunNow={doRunNow}\n doRefresh={doRefresh}\n setDreamingEnabled={setDreamingEnabled}\n />\n\n {errorMessages.length > 0 ? (\n <div\n className=\"space-y-1.5 rounded-2xl border border-amber-500/20 bg-amber-500/5 px-4 py-3\"\n role=\"alert\"\n >\n {errorMessages.map((line) => (\n <p key={line} className=\"text-sm text-amber-800 dark:text-amber-200/90\">\n {line}\n </p>\n ))}\n </div>\n ) : null}\n {successMessages.length > 0 ? (\n <div\n className=\"space-y-1.5 rounded-2xl border border-emerald-500/20 bg-emerald-500/5 px-4 py-3\"\n role=\"status\"\n >\n {successMessages.map((line) => (\n <p key={line} className=\"text-sm text-emerald-800 dark:text-emerald-200/90\">\n {line}\n </p>\n ))}\n </div>\n ) : null}\n\n <DreamingSettingsTabs t={t} activeTab={activeTab} onChange={setActiveTab} />\n\n <DreamingTabPanel t={t} id=\"config\" activeTab={activeTab}>\n <DreamingConfigSection\n t={t}\n schedulePickerLabels={schedulePickerLabels}\n hasToken={hasToken}\n cfgForm={cfgForm}\n cfgBaseline={cfgBaseline}\n cfgSaving={cfgSaving}\n cfgDirty={cfgDirty}\n setCfgForm={(next) => {\n cfgDirtyRef.current = true;\n const resolved =\n typeof next === 'function' ? next(cfgForm) : next;\n if (resolved) {\n dispatchCfg({ type: 'set', value: resolved });\n }\n }}\n setCfgOk={(ok) => dispatchUi({ type: 'patch', patch: { cfgOk: ok } })}\n setCfgError={(err) => dispatchUi({ type: 'patch', patch: { cfgError: err } })}\n saveConfig={saveConfig}\n />\n </DreamingTabPanel>\n\n <DreamingTabPanel t={t} id=\"runtime\" activeTab={activeTab}>\n <DreamingRuntimeSection\n t={t}\n data={data}\n isLoading={isLoading}\n localeTag={localeTag}\n scheduleBadgeLabels={scheduleBadgeLabels}\n />\n </DreamingTabPanel>\n\n <DreamingTabPanel t={t} id=\"insights\" activeTab={activeTab}>\n <div className=\"grid gap-4 xl:grid-cols-2\">\n <DreamingPreviewSection\n t={t}\n hasToken={hasToken}\n previewLoading={previewLoading}\n previewItems={previewItems}\n loadPreview={loadPreview}\n />\n <DreamingEventsSection\n t={t}\n hasToken={hasToken}\n eventsLoading={eventsLoading}\n events={events}\n loadEvents={loadEvents}\n />\n </div>\n </DreamingTabPanel>\n\n <DreamingTabPanel t={t} id=\"maintenance\" activeTab={activeTab}>\n <DreamingMaintenanceSection t={t} disabled={disabled} actionBusy={actionBusy} doAction={doAction} />\n </DreamingTabPanel>\n </div>\n );\n}\n\nfunction DreamingSettingsTabs({\n t,\n activeTab,\n onChange,\n}: {\n t: DreamingSettingsI18n;\n activeTab: DreamingSettingsTabId;\n onChange: (tab: DreamingSettingsTabId) => void;\n}) {\n return (\n <nav\n aria-label={t.tabsAriaLabel}\n className=\"-mx-1 flex gap-1 overflow-x-auto px-1 pb-1\"\n role=\"tablist\"\n onKeyDown={(event) => {\n if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight') return;\n event.preventDefault();\n const currentIndex = DREAMING_SETTINGS_TABS.indexOf(activeTab);\n const delta = event.key === 'ArrowRight' ? 1 : -1;\n const nextIndex = (currentIndex + delta + DREAMING_SETTINGS_TABS.length) % DREAMING_SETTINGS_TABS.length;\n onChange(DREAMING_SETTINGS_TABS[nextIndex]);\n }}\n >\n {DREAMING_SETTINGS_TABS.map((tab) => {\n const Icon = DREAMING_SETTINGS_TAB_ICONS[tab];\n const selected = tab === activeTab;\n return (\n <button\n key={tab}\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n id={`dreaming-settings-tab-${tab}`}\n aria-controls={`dreaming-settings-panel-${tab}`}\n className={cn(\n 'inline-flex shrink-0 items-center gap-1.5 rounded-lg px-3 py-2 text-sm font-medium transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent',\n interaction.press,\n selected ? 'bg-accent-soft text-accent-fg' : 'text-fg-muted hover:bg-surface-hover hover:text-fg',\n )}\n onClick={() => onChange(tab)}\n >\n <Icon className=\"size-3.5 shrink-0\" strokeWidth={1.75} aria-hidden />\n <span>{dreamingSettingsTabLabel(t, tab)}</span>\n </button>\n );\n })}\n </nav>\n );\n}\n\nfunction DreamingTabPanel({\n t,\n id,\n activeTab,\n children,\n}: {\n t: DreamingSettingsI18n;\n id: DreamingSettingsTabId;\n activeTab: DreamingSettingsTabId;\n children: ReactNode;\n}) {\n if (activeTab !== id) return null;\n\n return (\n <section\n id={`dreaming-settings-panel-${id}`}\n role=\"tabpanel\"\n aria-labelledby={`dreaming-settings-tab-${id}`}\n className=\"rounded-2xl border border-edge bg-surface-base px-4 py-5 sm:px-5\"\n >\n <div className=\"mb-5\">\n <div className=\"text-sm font-semibold text-fg\">{dreamingSettingsTabLabel(t, id)}</div>\n <p className=\"mt-1 text-xs text-fg-subtle\">{dreamingSettingsTabHint(t, id)}</p>\n </div>\n {children}\n </section>\n );\n}\n","import { revalidateGatewayConfig } from '@/features/gateway/gateway-config-swr';\nimport { fetchJson } from '@/lib/fetch';\nimport { apiUrl } from '@/lib/url';\n\nexport type CronGlobalsState = {\n enabled: boolean;\n maxConcurrentJobs: number;\n defaultTimezone: string;\n historyRetentionDays: number;\n enableMetrics: boolean;\n};\n\nconst DEFAULT_CRON_GLOBALS: CronGlobalsState = {\n enabled: true,\n maxConcurrentJobs: 5,\n defaultTimezone: 'UTC',\n historyRetentionDays: 7,\n enableMetrics: true,\n};\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return v !== null && typeof v === 'object' && !Array.isArray(v);\n}\n\nexport function normalizeCronGlobalsFromConfig(config: unknown): CronGlobalsState {\n const c = isRecord(config) ? config : {};\n const cron = isRecord(c.cron) ? c.cron : {};\n return {\n enabled: cron.enabled !== false,\n maxConcurrentJobs:\n typeof cron.maxConcurrentJobs === 'number' && Number.isFinite(cron.maxConcurrentJobs)\n ? Math.max(1, Math.min(100, Math.floor(cron.maxConcurrentJobs)))\n : DEFAULT_CRON_GLOBALS.maxConcurrentJobs,\n defaultTimezone:\n typeof cron.defaultTimezone === 'string' && cron.defaultTimezone.trim()\n ? cron.defaultTimezone.trim()\n : DEFAULT_CRON_GLOBALS.defaultTimezone,\n historyRetentionDays:\n typeof cron.historyRetentionDays === 'number' && Number.isFinite(cron.historyRetentionDays)\n ? Math.max(1, Math.min(365, Math.floor(cron.historyRetentionDays)))\n : DEFAULT_CRON_GLOBALS.historyRetentionDays,\n enableMetrics: cron.enableMetrics !== false,\n };\n}\n\nexport async function patchCronGlobals(state: CronGlobalsState): Promise<void> {\n await fetchJson(apiUrl('/api/config'), {\n method: 'PATCH',\n body: JSON.stringify({ cron: state }),\n });\n void revalidateGatewayConfig();\n}\n","import { Clock, Loader2 } from 'lucide-react';\nimport { useCallback, useMemo, useReducer, useRef } from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport { useGatewayConfigSwr } from '@/features/gateway/gateway-config-swr';\nimport {\n normalizeCronGlobalsFromConfig,\n patchCronGlobals,\n type CronGlobalsState,\n} from '@/features/cron/cron-globals-api';\nimport { SettingsFormSection, SettingsFormSectionHeader } from '@/features/settings/settings-form-section';\nimport { settingsInputFocusClass } from '@/lib/form-field-width';\nimport { cn } from '@/lib/cn';\nimport { messages } from '@/i18n/messages';\nimport { useLocaleStore } from '@/stores/locale-store';\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 settingsInputFocusClass,\n 'dark:border-edge',\n );\n}\n\ntype GlobalsUiState = {\n form: CronGlobalsState | null;\n baseline: CronGlobalsState | null;\n saving: boolean;\n error: string | null;\n saveOk: boolean;\n dirty: boolean;\n};\n\ntype GlobalsAction =\n | { type: 'sync'; parsed: CronGlobalsState }\n | { type: 'patch'; patch: Partial<CronGlobalsState> }\n | { type: 'discard' }\n | { type: 'saveStart' }\n | { type: 'saveSuccess' }\n | { type: 'saveError'; error: string }\n | { type: 'clearSaveOk' };\n\nfunction initialGlobalsUiState(): GlobalsUiState {\n return {\n form: null,\n baseline: null,\n saving: false,\n error: null,\n saveOk: false,\n dirty: false,\n };\n}\n\nfunction globalsReducer(state: GlobalsUiState, action: GlobalsAction): GlobalsUiState {\n switch (action.type) {\n case 'sync':\n return {\n ...state,\n form: structuredClone(action.parsed),\n baseline: structuredClone(action.parsed),\n saveOk: false,\n dirty: false,\n };\n case 'patch':\n return state.form\n ? { ...state, form: { ...state.form, ...action.patch }, dirty: true, saveOk: false }\n : state;\n case 'discard':\n return state.baseline\n ? { ...state, form: structuredClone(state.baseline), dirty: false }\n : state;\n case 'saveStart':\n return { ...state, saving: true, error: null };\n case 'saveSuccess':\n return state.form\n ? {\n ...state,\n saving: false,\n baseline: structuredClone(state.form),\n dirty: false,\n saveOk: true,\n }\n : { ...state, saving: false };\n case 'saveError':\n return { ...state, saving: false, error: action.error };\n case 'clearSaveOk':\n return { ...state, saveOk: false };\n }\n}\n\nexport function CronGlobalsSection({ hasToken }: { hasToken: boolean }) {\n const language = useLocaleStore((s) => s.language);\n const t = messages(language).cron.globals;\n const { data, isLoading } = useGatewayConfigSwr(hasToken);\n const parsed = useMemo(\n () =>\n data?.payload?.config !== undefined\n ? structuredClone(normalizeCronGlobalsFromConfig(data.payload.config))\n : null,\n [data],\n );\n\n const [ui, dispatch] = useReducer(globalsReducer, undefined as never, initialGlobalsUiState);\n const trackedParsedRef = useRef(parsed);\n if (hasToken && parsed !== null && !ui.dirty && trackedParsedRef.current !== parsed) {\n trackedParsedRef.current = parsed;\n dispatch({ type: 'sync', parsed });\n }\n\n const dirty = useMemo(\n () => Boolean(ui.form && ui.baseline && JSON.stringify(ui.form) !== JSON.stringify(ui.baseline)),\n [ui.form, ui.baseline],\n );\n\n const update = useCallback((patch: Partial<CronGlobalsState>) => {\n dispatch({ type: 'patch', patch });\n }, []);\n\n const save = useCallback(async () => {\n if (!ui.form || ui.saving) return;\n dispatch({ type: 'saveStart' });\n try {\n await patchCronGlobals(ui.form);\n dispatch({ type: 'saveSuccess' });\n window.setTimeout(() => dispatch({ type: 'clearSaveOk' }), 2500);\n } catch (e) {\n dispatch({ type: 'saveError', error: e instanceof Error ? e.message : t.saveError });\n }\n }, [t.saveError, ui.form, ui.saving]);\n\n if (!hasToken || !ui.form) {\n if (isLoading) {\n return (\n <SettingsFormSection>\n <p className=\"flex items-center gap-2 text-sm text-fg-muted\">\n <Loader2 className=\"size-4 animate-spin\" />\n {t.loading}\n </p>\n </SettingsFormSection>\n );\n }\n return null;\n }\n\n return (\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Clock} title={t.title} subtitle={t.hint} />\n <div className=\"mb-4 flex flex-wrap items-center justify-end gap-2\">\n {ui.saveOk ? <span className=\"text-sm text-fg-muted\">{t.saved}</span> : null}\n <Button type=\"button\" variant=\"secondary\" disabled={!dirty || ui.saving} onClick={() => dispatch({ type: 'discard' })}>\n {t.discard}\n </Button>\n <Button type=\"button\" variant=\"primary\" disabled={!dirty || ui.saving} onClick={() => void save()}>\n {ui.saving ? t.saving : t.save}\n </Button>\n </div>\n {ui.error ? <p className=\"mb-3 text-sm text-red-600 dark:text-red-400\">{ui.error}</p> : null}\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <label className=\"flex items-center gap-2 text-sm text-fg sm:col-span-2\">\n <input type=\"checkbox\" className=\"ui-checkbox\" checked={ui.form.enabled} onChange={(e) => update({ enabled: e.target.checked })} />\n {t.enabled}\n </label>\n <Field label={t.maxConcurrent} value={ui.form.maxConcurrentJobs} min={1} max={100} disabled={!ui.form.enabled} onChange={(maxConcurrentJobs) => update({ maxConcurrentJobs })} />\n <Field label={t.timezone} text value={ui.form.defaultTimezone} disabled={!ui.form.enabled} onTextChange={(defaultTimezone) => update({ defaultTimezone })} />\n <Field label={t.retentionDays} value={ui.form.historyRetentionDays} min={1} max={365} disabled={!ui.form.enabled} onChange={(historyRetentionDays) => update({ historyRetentionDays })} />\n <label className=\"flex items-center gap-2 text-sm text-fg\">\n <input type=\"checkbox\" className=\"ui-checkbox\" checked={ui.form.enableMetrics} disabled={!ui.form.enabled} onChange={(e) => update({ enableMetrics: e.target.checked })} />\n {t.metrics}\n </label>\n </div>\n </SettingsFormSection>\n );\n}\n\nfunction Field({\n label,\n value,\n min,\n max,\n disabled,\n text,\n onChange,\n onTextChange,\n}: {\n label: string;\n value: number | string;\n min?: number;\n max?: number;\n disabled?: boolean;\n text?: boolean;\n onChange?: (n: number) => void;\n onTextChange?: (s: string) => void;\n}) {\n return (\n <div>\n <label className=\"mb-1 block text-sm font-medium text-fg\">{label}</label>\n {text ? (\n <input\n className={cn(inputClassName(), 'font-mono text-xs')}\n value={String(value)}\n disabled={disabled}\n onChange={(e) => onTextChange?.(e.target.value)}\n />\n ) : (\n <input\n type=\"number\"\n min={min}\n max={max}\n disabled={disabled}\n className={cn(inputClassName(), 'max-w-xs font-mono text-xs')}\n value={typeof value === 'number' ? value : 0}\n onChange={(e) => {\n const n = Number(e.target.value);\n if (Number.isFinite(n) && onChange && min !== undefined && max !== undefined) {\n onChange(Math.max(min, Math.min(max, Math.floor(n))));\n }\n }}\n />\n )}\n </div>\n );\n}\n","import { Link } from 'react-router-dom';\n\nimport { CronGlobalsSection } from '@/features/cron/cron-globals-section';\nimport { messages } from '@/i18n/messages';\nimport { pathForTab } from '@/navigation';\nimport { useGatewayStore } from '@/stores/gateway-store';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nexport function CronSettingsPanel() {\n const language = useLocaleStore((s) => s.language);\n const t = messages(language).cronSettingsPage;\n const token = useGatewayStore((st) => st.token);\n const hasToken = Boolean(token);\n\n return (\n <div className=\"mx-auto flex w-full max-w-app-main flex-col gap-6 px-4 py-6 sm:px-8\">\n <header className=\"flex flex-col gap-2\">\n <h1 className=\"text-xl font-semibold tracking-tight text-fg\">{t.title}</h1>\n <p className=\"max-w-2xl text-sm text-fg-muted\">{t.subtitle}</p>\n <p className=\"text-sm text-fg-muted\">\n <Link to={pathForTab('cron')} className=\"font-medium text-accent-fg hover:underline\">\n {t.tasksLink}\n </Link>\n </p>\n </header>\n <CronGlobalsSection hasToken={hasToken} />\n </div>\n );\n}\n","import { revalidateGatewayConfig } from '@/features/gateway/gateway-config-swr';\nimport { fetchJson } from '@/lib/fetch';\nimport { apiUrl } from '@/lib/url';\n\nexport type GoalsConfigState = {\n maxTurns: number;\n judgeModelRef: string;\n checklistMode: boolean;\n maxConsecutiveParseFailures: number;\n judgeTimeoutSec: number;\n checklistHistoryChars: number;\n};\n\nconst DEFAULT_GOALS_CONFIG: GoalsConfigState = {\n maxTurns: 20,\n judgeModelRef: '',\n checklistMode: true,\n maxConsecutiveParseFailures: 3,\n judgeTimeoutSec: 60,\n checklistHistoryChars: 24_000,\n};\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return v !== null && typeof v === 'object' && !Array.isArray(v);\n}\n\nexport function normalizeGoalsConfigFromConfig(config: unknown): GoalsConfigState {\n const c = isRecord(config) ? config : {};\n const goals = isRecord(c.goals) ? c.goals : {};\n return {\n maxTurns:\n typeof goals.maxTurns === 'number' && Number.isFinite(goals.maxTurns)\n ? Math.max(1, Math.min(500, Math.floor(goals.maxTurns)))\n : DEFAULT_GOALS_CONFIG.maxTurns,\n judgeModelRef: typeof goals.judgeModelRef === 'string' ? goals.judgeModelRef : '',\n checklistMode: goals.checklistMode !== false,\n maxConsecutiveParseFailures:\n typeof goals.maxConsecutiveParseFailures === 'number' &&\n Number.isFinite(goals.maxConsecutiveParseFailures)\n ? Math.max(1, Math.min(20, Math.floor(goals.maxConsecutiveParseFailures)))\n : DEFAULT_GOALS_CONFIG.maxConsecutiveParseFailures,\n judgeTimeoutSec:\n typeof goals.judgeTimeoutMs === 'number' && Number.isFinite(goals.judgeTimeoutMs)\n ? Math.max(5, Math.min(120, Math.round(goals.judgeTimeoutMs / 1000)))\n : DEFAULT_GOALS_CONFIG.judgeTimeoutSec,\n checklistHistoryChars:\n typeof goals.checklistHistoryChars === 'number' && Number.isFinite(goals.checklistHistoryChars)\n ? Math.max(0, Math.min(100_000, Math.floor(goals.checklistHistoryChars)))\n : DEFAULT_GOALS_CONFIG.checklistHistoryChars,\n };\n}\n\nexport async function patchGoalsConfig(state: GoalsConfigState): Promise<void> {\n await fetchJson(apiUrl('/api/config'), {\n method: 'PATCH',\n body: JSON.stringify({\n goals: {\n maxTurns: state.maxTurns,\n ...(state.judgeModelRef.trim() ? { judgeModelRef: state.judgeModelRef.trim() } : { judgeModelRef: null }),\n checklistMode: state.checklistMode,\n maxConsecutiveParseFailures: state.maxConsecutiveParseFailures,\n judgeTimeoutMs: state.judgeTimeoutSec * 1000,\n checklistHistoryChars: state.checklistHistoryChars,\n },\n }),\n });\n void revalidateGatewayConfig();\n}\n","import { Target, Loader2 } from 'lucide-react';\nimport { useCallback, useMemo, useReducer, useRef, useState } from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport { ModelSelector } from '@/features/chat/model/model-selector';\nimport { useGatewayConfigSwr } from '@/features/gateway/gateway-config-swr';\nimport {\n normalizeGoalsConfigFromConfig,\n patchGoalsConfig,\n type GoalsConfigState,\n} from '@/features/settings/goals-config-api';\nimport { SettingsFormSection, SettingsFormSectionHeader } from '@/features/settings/settings-form-section';\nimport { settingsInputFocusClass } from '@/lib/form-field-width';\nimport { cn } from '@/lib/cn';\nimport { messages } from '@/i18n/messages';\nimport { useLocaleStore } from '@/stores/locale-store';\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 settingsInputFocusClass,\n 'dark:border-edge',\n );\n}\n\ntype GoalsFormDraft = {\n form: GoalsConfigState | null;\n baseline: GoalsConfigState | null;\n};\n\ntype GoalsFormAction =\n | { type: 'reset' }\n | { type: 'sync'; value: GoalsConfigState }\n | { type: 'patch'; patch: Partial<GoalsConfigState> }\n | { type: 'discard' }\n | { type: 'saved'; value: GoalsConfigState };\n\nfunction goalsFormReducer(state: GoalsFormDraft, action: GoalsFormAction): GoalsFormDraft {\n switch (action.type) {\n case 'reset':\n return { form: null, baseline: null };\n case 'sync': {\n const snapshot = structuredClone(action.value);\n return { form: snapshot, baseline: structuredClone(snapshot) };\n }\n case 'patch':\n return { ...state, form: state.form ? { ...state.form, ...action.patch } : null };\n case 'discard':\n return state.baseline\n ? { form: structuredClone(state.baseline), baseline: state.baseline }\n : state;\n case 'saved': {\n const snapshot = structuredClone(action.value);\n return { form: snapshot, baseline: structuredClone(snapshot) };\n }\n }\n}\n\nexport function GoalsConfigSection({ hasToken }: { hasToken: boolean }) {\n const language = useLocaleStore((s) => s.language);\n const t = messages(language).goalsSettings;\n const chatM = messages(language).chat;\n const { data, isLoading } = useGatewayConfigSwr(hasToken);\n const parsed = useMemo(\n () => (data?.payload?.config !== undefined ? normalizeGoalsConfigFromConfig(data.payload.config) : null),\n [data],\n );\n const [formDraft, dispatchForm] = useReducer(goalsFormReducer, { form: null, baseline: null });\n const form = formDraft.form;\n const baseline = formDraft.baseline;\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const dirtyRef = useRef(false);\n const trackedParsedRef = useRef<GoalsConfigState | null>(null);\n\n if (!hasToken) {\n if (trackedParsedRef.current !== null) {\n trackedParsedRef.current = null;\n dispatchForm({ type: 'reset' });\n dirtyRef.current = false;\n }\n } else if (parsed !== null && !dirtyRef.current && trackedParsedRef.current !== parsed) {\n trackedParsedRef.current = parsed;\n dispatchForm({ type: 'sync', value: parsed });\n }\n\n const dirty = form && baseline && JSON.stringify(form) !== JSON.stringify(baseline);\n\n const update = useCallback((patch: Partial<GoalsConfigState>) => {\n dirtyRef.current = true;\n dispatchForm({ type: 'patch', patch });\n }, []);\n\n if (!hasToken || !form) {\n return isLoading ? (\n <SettingsFormSection>\n <Loader2 className=\"size-4 animate-spin text-fg-muted\" />\n </SettingsFormSection>\n ) : null;\n }\n\n return (\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Target} title={t.title} subtitle={t.hint} />\n <div className=\"mb-4 flex justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"secondary\"\n disabled={!dirty || saving}\n onClick={() => dispatchForm({ type: 'discard' })}\n >\n {t.discard}\n </Button>\n <Button\n type=\"button\"\n variant=\"primary\"\n disabled={!dirty || saving}\n onClick={() => {\n void (async () => {\n setSaving(true);\n setError(null);\n try {\n await patchGoalsConfig(form);\n dirtyRef.current = false;\n dispatchForm({ type: 'saved', value: form });\n } catch (e) {\n setError(e instanceof Error ? e.message : t.saveError);\n } finally {\n setSaving(false);\n }\n })();\n }}\n >\n {saving ? t.saving : t.save}\n </Button>\n </div>\n {error ? <p className=\"mb-3 text-sm text-red-600 dark:text-red-400\">{error}</p> : null}\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div>\n <label className=\"mb-1 block text-sm font-medium text-fg\">{t.maxTurns}</label>\n <input type=\"number\" min={1} max={500} className={inputClassName()} value={form.maxTurns} onChange={(e) => update({ maxTurns: Number(e.target.value) || 20 })} />\n </div>\n <div>\n <label className=\"mb-1 block text-sm font-medium text-fg\">{t.judgeModelRef}</label>\n <ModelSelector\n value={form.judgeModelRef}\n placeholder={t.judgeModelRefPlaceholder}\n searchPlaceholder={chatM.modelSearchPlaceholder}\n noMatches={chatM.modelNoMatches}\n className=\"w-full max-w-none min-w-0\"\n onChange={(modelId) => update({ judgeModelRef: modelId })}\n />\n {form.judgeModelRef.trim() ? (\n <button\n type=\"button\"\n className=\"mt-1 text-xs text-accent hover:underline\"\n onClick={() => update({ judgeModelRef: '' })}\n >\n {t.judgeModelRefUseDefault}\n </button>\n ) : (\n <p className=\"mt-1 text-xs text-fg-subtle\">{t.judgeModelRefHint}</p>\n )}\n </div>\n <label className=\"flex items-center gap-2 text-sm text-fg sm:col-span-2\">\n <input type=\"checkbox\" className=\"ui-checkbox\" checked={form.checklistMode} onChange={(e) => update({ checklistMode: e.target.checked })} />\n {t.checklistMode}\n </label>\n <div>\n <label className=\"mb-1 block text-sm font-medium text-fg\">{t.parseFailures}</label>\n <input type=\"number\" min={1} max={20} className={inputClassName()} value={form.maxConsecutiveParseFailures} onChange={(e) => update({ maxConsecutiveParseFailures: Number(e.target.value) || 3 })} />\n </div>\n <div>\n <label className=\"mb-1 block text-sm font-medium text-fg\">{t.judgeTimeoutSec}</label>\n <input type=\"number\" min={5} max={120} className={inputClassName()} value={form.judgeTimeoutSec} onChange={(e) => update({ judgeTimeoutSec: Number(e.target.value) || 60 })} />\n </div>\n <div className=\"sm:col-span-2\">\n <label className=\"mb-1 block text-sm font-medium text-fg\">{t.checklistHistoryChars}</label>\n <input type=\"number\" min={0} max={100000} className={inputClassName()} value={form.checklistHistoryChars} onChange={(e) => update({ checklistHistoryChars: Math.max(0, Math.min(100_000, Math.floor(Number(e.target.value) || 0))) })} />\n <p className=\"mt-1 text-xs text-fg-subtle\">{t.checklistHistoryCharsHint}</p>\n </div>\n </div>\n </SettingsFormSection>\n );\n}\n","import { GoalsConfigSection } from '@/features/settings/goals-config-section';\nimport { messages } from '@/i18n/messages';\nimport { useGatewayStore } from '@/stores/gateway-store';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nexport function GoalsSettingsPanel() {\n const language = useLocaleStore((s) => s.language);\n const t = messages(language).goalsSettingsPage;\n const token = useGatewayStore((st) => st.token);\n const hasToken = Boolean(token);\n\n return (\n <div className=\"mx-auto flex w-full max-w-app-main flex-col gap-6 px-4 py-6 sm:px-8\">\n <header className=\"flex flex-col gap-2\">\n <h1 className=\"text-xl font-semibold tracking-tight text-fg\">{t.title}</h1>\n <p className=\"max-w-2xl text-sm text-fg-muted\">{t.subtitle}</p>\n </header>\n <GoalsConfigSection hasToken={hasToken} />\n </div>\n );\n}\n","export type GatewayBindMode = 'auto' | 'loopback' | 'lan' | 'tailnet' | 'custom';\n\nexport type GatewayAuthMode = 'none' | 'token' | 'password' | 'trusted-proxy';\n\nexport type UpdatePackageChannel = 'stable' | 'beta' | 'dev';\n\nexport interface GatewayAuthRateLimitState {\n enabled: boolean;\n maxAttempts: number;\n windowMs: number;\n blockDurationMs: number;\n exemptLoopback: boolean;\n}\n\nexport interface GatewayTrustedProxyState {\n userHeader: string;\n requiredHeaders: string[];\n allowUsers: string[];\n allowLoopback: boolean;\n}\n\nexport type GatewayChannelConnectDeferMode = 'auto' | 'off' | 'explicit';\n\nexport interface GatewaySettingsState {\n bind: GatewayBindMode;\n customBindHost: string;\n port: number;\n auth: {\n mode: GatewayAuthMode;\n token: string;\n password: string;\n rateLimit: GatewayAuthRateLimitState;\n trustedProxy: GatewayTrustedProxyState;\n };\n /** Browser origin allowlist (`gateway.corsOrigins`). Empty uses gateway localhost defaults. */\n corsOrigins: string[];\n /** Reverse-proxy CIDRs allowed to terminate trusted-proxy auth. */\n trustedProxies: string[];\n /** Fall back to X-Real-IP when X-Forwarded-For parsing fails (default false). */\n allowRealIpFallback: boolean;\n /** Dangerous: allow browser Origin to match HTTP Host when not in corsOrigins. */\n dangerouslyAllowHostHeaderOriginFallback: boolean;\n /** When true, non-loopback binds require explicit gateway.auth.rateLimit. */\n securityStrict: boolean;\n maxSseConnections: number;\n channelConnectDeferMode: GatewayChannelConnectDeferMode;\n channelConnectDeferIds: string[];\n channelConnectDeferSkipIds: string[];\n /** npm / CLI update channel (config `update.channel`). */\n updateChannel: UpdatePackageChannel;\n updateCheckOnStart: boolean;\n updateAutoEnabled: boolean;\n updateAutoStableDelayHours: number;\n updateAutoStableJitterHours: number;\n updateAutoBetaCheckIntervalHours: number;\n}\n\nexport const DEFAULT_GATEWAY_PORT = 18790;\nexport const DEFAULT_MAX_SSE_CONNECTIONS = 100;\nexport const MAX_CHANNEL_DEFER_LIST_SIZE = 24;\n\nexport const DEFAULT_AUTH_RATE_LIMIT: GatewayAuthRateLimitState = {\n enabled: true,\n maxAttempts: 5,\n windowMs: 900_000,\n blockDurationMs: 300_000,\n exemptLoopback: true,\n};\n\nexport const DEFAULT_TRUSTED_PROXY: GatewayTrustedProxyState = {\n userHeader: '',\n requiredHeaders: [],\n allowUsers: [],\n allowLoopback: false,\n};\n","import { revalidateGatewayConfig } from '@/features/gateway/gateway-config-swr';\nimport { fetchJson } from '@/lib/fetch';\nimport { apiUrl } from '@/lib/url';\n\nimport {\n DEFAULT_AUTH_RATE_LIMIT,\n DEFAULT_GATEWAY_PORT,\n DEFAULT_MAX_SSE_CONNECTIONS,\n MAX_CHANNEL_DEFER_LIST_SIZE,\n type GatewayAuthMode,\n type GatewayAuthRateLimitState,\n type GatewayBindMode,\n type GatewayChannelConnectDeferMode,\n type GatewaySettingsState,\n type GatewayTrustedProxyState,\n type UpdatePackageChannel,\n} from './gateway-settings.types';\n\nexport type {\n GatewayAuthMode,\n GatewayAuthRateLimitState,\n GatewayChannelConnectDeferMode,\n GatewaySettingsState,\n GatewayTrustedProxyState,\n UpdatePackageChannel,\n} from './gateway-settings.types';\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return v !== null && typeof v === 'object' && !Array.isArray(v);\n}\n\nexport function isMaskedGatewaySecret(value: string): boolean {\n return value === '***' || value === '••••••••••••';\n}\n\nfunction normalizeSecretForRestartCompare(value: string): string {\n return isMaskedGatewaySecret(value) ? '' : value.trim();\n}\n\nfunction sortedStringList(values: string[]): string[] {\n return [...values].map((value) => value.trim()).sort();\n}\n\n/** Snapshot of gateway settings that require a process restart (listen, auth, CORS). */\nfunction snapshotGatewayRestartSettings(state: GatewaySettingsState): string {\n return JSON.stringify({\n bind: state.bind,\n customBindHost: state.customBindHost.trim(),\n port: state.port,\n auth: {\n mode: state.auth.mode,\n token: normalizeSecretForRestartCompare(state.auth.token),\n password: normalizeSecretForRestartCompare(state.auth.password),\n rateLimit: state.auth.rateLimit,\n trustedProxy: {\n userHeader: state.auth.trustedProxy.userHeader.trim(),\n requiredHeaders: sortedStringList(state.auth.trustedProxy.requiredHeaders),\n allowUsers: sortedStringList(state.auth.trustedProxy.allowUsers),\n allowLoopback: state.auth.trustedProxy.allowLoopback,\n },\n },\n corsOrigins: sortedStringList(state.corsOrigins),\n trustedProxies: sortedStringList(state.trustedProxies),\n allowRealIpFallback: state.allowRealIpFallback,\n dangerouslyAllowHostHeaderOriginFallback: state.dangerouslyAllowHostHeaderOriginFallback,\n });\n}\n\n/** True when listen address, authentication, or CORS settings differ between two states. */\nexport function gatewaySettingsRequireRestart(\n from: GatewaySettingsState,\n to: GatewaySettingsState,\n): boolean {\n return snapshotGatewayRestartSettings(from) !== snapshotGatewayRestartSettings(to);\n}\n\nfunction normalizeAuthMode(raw: unknown): GatewayAuthMode {\n if (raw === 'none' || raw === 'token' || raw === 'password' || raw === 'trusted-proxy') return raw;\n return 'token';\n}\n\nfunction normalizeRateLimit(raw: unknown): GatewayAuthRateLimitState {\n const rl = isRecord(raw) ? raw : {};\n return {\n enabled: rl.enabled !== false,\n maxAttempts:\n typeof rl.maxAttempts === 'number' && Number.isFinite(rl.maxAttempts)\n ? Math.max(1, Math.floor(rl.maxAttempts))\n : DEFAULT_AUTH_RATE_LIMIT.maxAttempts,\n windowMs:\n typeof rl.windowMs === 'number' && Number.isFinite(rl.windowMs) && rl.windowMs > 0\n ? Math.floor(rl.windowMs)\n : DEFAULT_AUTH_RATE_LIMIT.windowMs,\n blockDurationMs:\n typeof rl.blockDurationMs === 'number' &&\n Number.isFinite(rl.blockDurationMs) &&\n rl.blockDurationMs > 0\n ? Math.floor(rl.blockDurationMs)\n : typeof rl.lockoutMs === 'number' &&\n Number.isFinite(rl.lockoutMs) &&\n rl.lockoutMs > 0\n ? Math.floor(rl.lockoutMs)\n : DEFAULT_AUTH_RATE_LIMIT.blockDurationMs,\n exemptLoopback: rl.exemptLoopback !== false,\n };\n}\n\nfunction normalizeTrustedProxy(raw: unknown): GatewayTrustedProxyState {\n const tp = isRecord(raw) ? raw : {};\n return {\n userHeader: typeof tp.userHeader === 'string' ? tp.userHeader : '',\n requiredHeaders: normalizeStringIdList(tp.requiredHeaders, 32),\n allowUsers: normalizeStringIdList(tp.allowUsers, 128),\n allowLoopback: tp.allowLoopback === true,\n };\n}\n\nfunction normalizeDeferMode(raw: unknown): GatewayChannelConnectDeferMode {\n if (raw === 'auto' || raw === 'off' || raw === 'explicit') return raw;\n return 'auto';\n}\n\nfunction normalizeStringIdList(raw: unknown, max = MAX_CHANNEL_DEFER_LIST_SIZE): string[] {\n if (!Array.isArray(raw)) return [];\n return raw\n .filter((x): x is string => typeof x === 'string' && x.trim().length > 0)\n .map((x) => x.trim())\n .slice(0, max);\n}\n\nfunction normalizeBindMode(raw: unknown): GatewayBindMode {\n if (raw === 'auto' || raw === 'loopback' || raw === 'lan' || raw === 'tailnet' || raw === 'custom') {\n return raw;\n }\n return 'loopback';\n}\n\n/** True when the bind mode likely exposes the gateway beyond loopback. */\nexport function isNonLoopbackGatewayBind(state: GatewaySettingsState): boolean {\n if (state.bind === 'loopback') return false;\n if (state.bind === 'lan') return true;\n if (state.bind === 'custom') {\n const host = state.customBindHost.trim().toLowerCase();\n if (!host) return true;\n return host !== '127.0.0.1' && host !== 'localhost' && host !== '::1';\n }\n return true;\n}\n\nexport function validateGatewaySettings(state: GatewaySettingsState): string | null {\n const nonLoopback = isNonLoopbackGatewayBind(state);\n\n if (nonLoopback && state.auth.mode === 'none') {\n return 'Network-accessible gateway requires authentication (token, password, or trusted-proxy).';\n }\n\n if (nonLoopback && state.auth.mode === 'trusted-proxy' && state.trustedProxies.length === 0) {\n return 'Trusted-proxy auth on a network bind requires at least one gateway.trustedProxies entry.';\n }\n\n if (state.auth.mode === 'trusted-proxy' && !state.auth.trustedProxy.userHeader.trim()) {\n return 'Trusted-proxy auth requires gateway.auth.trustedProxy.userHeader.';\n }\n\n if (nonLoopback && state.corsOrigins.includes('*')) {\n return 'CORS wildcard \"*\" is not allowed on network-accessible binds.';\n }\n\n if (state.bind === 'custom' && !state.customBindHost.trim()) {\n return 'Custom bind mode requires a bind address.';\n }\n\n return null;\n}\n\nexport function normalizeGatewayFromConfig(config: unknown): GatewaySettingsState {\n const c = isRecord(config) ? config : {};\n const gw = isRecord(c.gateway) ? c.gateway : {};\n const auth = isRecord(gw.auth) ? gw.auth : {};\n const security = isRecord(gw.security) ? gw.security : {};\n const upd = isRecord(c.update) ? c.update : {};\n const auto = isRecord(upd.auto) ? upd.auto : {};\n const ch = upd.channel;\n const updateChannel: UpdatePackageChannel =\n ch === 'beta' || ch === 'dev' || ch === 'stable' ? ch : 'stable';\n const corsOrigins = Array.isArray(gw.corsOrigins)\n ? gw.corsOrigins.filter((x): x is string => typeof x === 'string' && x.trim().length > 0)\n : [];\n const bind = normalizeBindMode(gw.bind);\n const customBindHost =\n typeof gw.customBindHost === 'string' && gw.customBindHost.trim()\n ? gw.customBindHost.trim()\n : '';\n return {\n bind,\n customBindHost,\n port:\n typeof gw.port === 'number' && Number.isFinite(gw.port) ? Math.floor(gw.port) : DEFAULT_GATEWAY_PORT,\n auth: {\n mode: normalizeAuthMode(auth.mode),\n token: typeof auth.token === 'string' ? auth.token : '',\n password: typeof auth.password === 'string' ? auth.password : '',\n rateLimit: normalizeRateLimit(auth.rateLimit),\n trustedProxy: normalizeTrustedProxy(auth.trustedProxy),\n },\n corsOrigins,\n trustedProxies: normalizeStringIdList(gw.trustedProxies, 64),\n allowRealIpFallback: gw.allowRealIpFallback === true,\n dangerouslyAllowHostHeaderOriginFallback: gw.dangerouslyAllowHostHeaderOriginFallback === true,\n securityStrict: security.strict === true,\n maxSseConnections:\n typeof gw.maxSseConnections === 'number' && Number.isFinite(gw.maxSseConnections)\n ? Math.max(1, Math.floor(gw.maxSseConnections))\n : DEFAULT_MAX_SSE_CONNECTIONS,\n channelConnectDeferMode: normalizeDeferMode(gw.channelConnectDeferMode),\n channelConnectDeferIds: normalizeStringIdList(gw.channelConnectDeferIds),\n channelConnectDeferSkipIds: normalizeStringIdList(gw.channelConnectDeferSkipIds),\n updateChannel,\n updateCheckOnStart: upd.checkOnStart !== false,\n updateAutoEnabled: auto.enabled === true,\n updateAutoStableDelayHours:\n typeof auto.stableDelayHours === 'number' && Number.isFinite(auto.stableDelayHours)\n ? Math.max(0, Math.floor(auto.stableDelayHours))\n : 6,\n updateAutoStableJitterHours:\n typeof auto.stableJitterHours === 'number' && Number.isFinite(auto.stableJitterHours)\n ? Math.max(0, Math.floor(auto.stableJitterHours))\n : 12,\n updateAutoBetaCheckIntervalHours:\n typeof auto.betaCheckIntervalHours === 'number' && Number.isFinite(auto.betaCheckIntervalHours)\n ? Math.max(0.25, auto.betaCheckIntervalHours)\n : 1,\n };\n}\n\nfunction buildAuthPatch(state: GatewaySettingsState): Record<string, unknown> {\n const auth: Record<string, unknown> = {\n mode: state.auth.mode,\n rateLimit: state.auth.rateLimit,\n };\n\n if (state.auth.mode === 'token') {\n const token = state.auth.token.trim();\n if (token.length > 0 && !isMaskedGatewaySecret(token)) {\n auth.token = state.auth.token;\n }\n auth.password = null;\n auth.trustedProxy = null;\n } else if (state.auth.mode === 'password') {\n const password = state.auth.password.trim();\n if (password.length > 0 && !isMaskedGatewaySecret(password)) {\n auth.password = state.auth.password;\n }\n auth.token = null;\n auth.trustedProxy = null;\n } else if (state.auth.mode === 'trusted-proxy') {\n auth.token = null;\n auth.password = null;\n const tp = state.auth.trustedProxy;\n auth.trustedProxy = {\n userHeader: tp.userHeader.trim(),\n ...(tp.requiredHeaders.length > 0 ? { requiredHeaders: tp.requiredHeaders } : {}),\n ...(tp.allowUsers.length > 0 ? { allowUsers: tp.allowUsers } : {}),\n ...(tp.allowLoopback ? { allowLoopback: true } : {}),\n };\n } else {\n auth.token = null;\n auth.password = null;\n auth.trustedProxy = null;\n }\n\n return auth;\n}\n\nexport async function patchGatewaySettings(state: GatewaySettingsState): Promise<void> {\n const validationError = validateGatewaySettings(state);\n if (validationError) {\n throw new Error(validationError);\n }\n\n await fetchJson(apiUrl('/api/config'), {\n method: 'PATCH',\n body: JSON.stringify({\n gateway: {\n bind: state.bind,\n ...(state.bind === 'custom' ? { customBindHost: state.customBindHost.trim() } : {}),\n port: state.port,\n auth: buildAuthPatch(state),\n corsOrigins: state.corsOrigins,\n trustedProxies: state.trustedProxies,\n allowRealIpFallback: state.allowRealIpFallback,\n dangerouslyAllowHostHeaderOriginFallback: state.dangerouslyAllowHostHeaderOriginFallback,\n security: { strict: state.securityStrict },\n maxSseConnections: state.maxSseConnections,\n channelConnectDeferMode: state.channelConnectDeferMode,\n channelConnectDeferIds: state.channelConnectDeferIds,\n channelConnectDeferSkipIds: state.channelConnectDeferSkipIds,\n },\n update: {\n channel: state.updateChannel,\n checkOnStart: state.updateCheckOnStart,\n auto: {\n enabled: state.updateAutoEnabled,\n stableDelayHours: state.updateAutoStableDelayHours,\n stableJitterHours: state.updateAutoStableJitterHours,\n betaCheckIntervalHours: state.updateAutoBetaCheckIntervalHours,\n },\n },\n }),\n });\n void revalidateGatewayConfig();\n}\n","import { fetchJson } from '@/lib/fetch';\nimport { apiUrl } from '@/lib/url';\n\nexport type GatewaySecurityAuditSeverity = 'critical' | 'warn' | 'info';\n\nexport type GatewaySecurityAuditFinding = {\n checkId: string;\n severity: GatewaySecurityAuditSeverity;\n title: string;\n detail: string;\n remediation?: string;\n};\n\nexport type GatewaySecurityAuditStatus = 'pass' | 'warn' | 'fail' | 'skip';\n\nexport type GatewaySecurityAuditResult = {\n status: GatewaySecurityAuditStatus;\n message: string;\n hints: string[];\n findings: GatewaySecurityAuditFinding[];\n};\n\ntype DoctorCheckResponse = {\n id: string;\n label: string;\n status: GatewaySecurityAuditStatus;\n message: string;\n hints?: string[];\n findings?: GatewaySecurityAuditFinding[];\n};\n\ntype DoctorApiResponse = {\n ok?: boolean;\n checks?: DoctorCheckResponse[];\n};\n\nconst SEVERITY_RANK: Record<GatewaySecurityAuditSeverity, number> = {\n critical: 3,\n warn: 2,\n info: 1,\n};\n\nexport function gatewaySecurityAuditSwrKey(): string {\n return apiUrl('/api/doctor?security=true');\n}\n\nexport function sortSecurityAuditFindings(\n findings: GatewaySecurityAuditFinding[],\n): GatewaySecurityAuditFinding[] {\n return findings.toSorted(\n (a, b) => SEVERITY_RANK[b.severity] - SEVERITY_RANK[a.severity] || a.checkId.localeCompare(b.checkId),\n );\n}\n\nexport function parseGatewaySecurityAuditResponse(data: DoctorApiResponse | undefined): GatewaySecurityAuditResult {\n const check = data?.checks?.find((c) => c.id === 'security-audit');\n if (!check) {\n return {\n status: 'skip',\n message: 'Security audit unavailable.',\n hints: [],\n findings: [],\n };\n }\n\n const findings = sortSecurityAuditFindings(\n (check.findings ?? []).filter(\n (f): f is GatewaySecurityAuditFinding =>\n typeof f.checkId === 'string' &&\n (f.severity === 'critical' || f.severity === 'warn' || f.severity === 'info') &&\n typeof f.title === 'string' &&\n typeof f.detail === 'string',\n ),\n );\n\n return {\n status: check.status,\n message: check.message,\n hints: Array.isArray(check.hints) ? check.hints.filter((h): h is string => typeof h === 'string') : [],\n findings,\n };\n}\n\nexport async function fetchGatewaySecurityAudit(): Promise<GatewaySecurityAuditResult> {\n const res = await fetchJson<DoctorApiResponse>(gatewaySecurityAuditSwrKey());\n return parseGatewaySecurityAuditResponse(res);\n}\n","import { AlertCircle, AlertTriangle, Info, Loader2, RefreshCw, ShieldCheck } from 'lucide-react';\nimport useSWR, { mutate } from 'swr';\n\nimport { SettingsFormSection, SettingsFormSectionHeader } from '@/features/settings/settings-form-section';\nimport {\n fetchGatewaySecurityAudit,\n gatewaySecurityAuditSwrKey,\n type GatewaySecurityAuditFinding,\n type GatewaySecurityAuditResult,\n type GatewaySecurityAuditSeverity,\n type GatewaySecurityAuditStatus,\n} from '@/features/settings/gateway-security-audit-api';\nimport { Button } from '@/components/ui/button';\nimport { cn } from '@/lib/cn';\nimport { messages, type GatewaySettingsMessages } from '@/i18n/messages';\nimport { useLocaleStore } from '@/stores/locale-store';\n\ntype Props = {\n enabled: boolean;\n /** Bump to re-fetch after config save. */\n refreshToken?: number;\n};\n\nexport function GatewaySecurityAuditCard({ enabled, refreshToken = 0 }: Props) {\n const language = useLocaleStore((s) => s.language);\n const g = messages(language).gatewaySettings;\n\n const { data, error, isLoading, isValidating, mutate: localMutate } = useSWR(\n enabled ? [gatewaySecurityAuditSwrKey(), refreshToken] : null,\n () => fetchGatewaySecurityAudit(),\n { revalidateOnFocus: false },\n );\n\n const audit = data ?? null;\n const fetchError = error instanceof Error ? error.message : error ? String(error) : null;\n const refreshing = isLoading || isValidating;\n\n const refresh = () => {\n void localMutate();\n void mutate(gatewaySecurityAuditSwrKey());\n };\n\n return (\n <SettingsFormSection>\n <SettingsFormSectionHeader\n icon={ShieldCheck}\n title={g.securityAuditTitle}\n subtitle={g.securityAuditSubtitle}\n trailing={\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"px-2.5 py-1.5 text-xs\"\n disabled={!enabled || refreshing}\n onClick={refresh}\n >\n {refreshing ? (\n <Loader2 className=\"size-3.5 animate-spin\" aria-hidden />\n ) : (\n <RefreshCw className=\"size-3.5\" aria-hidden />\n )}\n <span className=\"ml-1.5\">{g.securityAuditRefresh}</span>\n </Button>\n }\n />\n\n <p className=\"mb-4 text-xs text-fg-subtle\">{g.securityAuditSavedConfigHint}</p>\n\n {fetchError ? (\n <p className=\"text-sm text-red-600 dark:text-red-400\" role=\"alert\">\n {g.securityAuditLoadError}: {fetchError}\n </p>\n ) : null}\n\n {!fetchError && refreshing && !audit ? (\n <div className=\"flex items-center gap-2 text-sm text-fg-muted\">\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n {g.securityAuditLoading}\n </div>\n ) : null}\n\n {audit ? <SecurityAuditBody g={g} audit={audit} /> : null}\n </SettingsFormSection>\n );\n}\n\nfunction SecurityAuditBody({ g, audit }: { g: GatewaySettingsMessages; audit: GatewaySecurityAuditResult }) {\n const summary = statusSummary(g, audit.status, audit.findings);\n\n return (\n <div className=\"space-y-4\">\n <div\n className={cn(\n 'rounded-lg border px-3 py-2.5 text-sm',\n summary.bannerClass,\n )}\n role=\"status\"\n >\n <div className=\"flex items-start gap-2\">\n <summary.icon className={cn('mt-0.5 size-4 shrink-0', summary.iconClass)} aria-hidden />\n <div>\n <p className=\"font-medium\">{summary.title}</p>\n <p className=\"mt-0.5 text-xs opacity-90\">{audit.message}</p>\n </div>\n </div>\n </div>\n\n {audit.findings.length > 0 ? (\n <ul className=\"space-y-2\">\n {audit.findings.map((finding) => (\n <FindingRow key={finding.checkId} g={g} finding={finding} />\n ))}\n </ul>\n ) : audit.status === 'pass' || audit.status === 'skip' ? (\n <p className=\"text-xs text-fg-muted\">{g.securityAuditNoFindings}</p>\n ) : null}\n\n {audit.hints.length > 0 ? (\n <div className=\"space-y-1 border-t border-edge pt-3\">\n <p className=\"text-xs font-medium text-fg-muted\">{g.securityAuditHintsTitle}</p>\n <ul className=\"space-y-1 text-xs text-fg-subtle\">\n {audit.hints.map((hint) => (\n <li key={hint} className=\"font-mono\">\n {hint}\n </li>\n ))}\n </ul>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction FindingRow({ g, finding }: { g: GatewaySettingsMessages; finding: GatewaySecurityAuditFinding }) {\n const meta = severityMeta(finding.severity);\n\n return (\n <li className=\"rounded-lg border border-edge bg-surface-panel/50 px-3 py-2.5\">\n <div className=\"flex items-start gap-2\">\n <meta.icon className={cn('mt-0.5 size-4 shrink-0', meta.iconClass)} aria-hidden />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-x-2 gap-y-0.5\">\n <span className=\"text-sm font-medium text-fg\">{finding.title}</span>\n <span className=\"font-mono text-[0.65rem] text-fg-subtle\">{finding.checkId}</span>\n </div>\n <p className=\"mt-1 text-xs text-fg-muted\">{finding.detail}</p>\n {finding.remediation ? (\n <p className=\"mt-1.5 text-xs text-fg-subtle\">\n <span className=\"text-fg-muted\">{g.securityAuditRemediation}</span> {finding.remediation}\n </p>\n ) : null}\n </div>\n </div>\n </li>\n );\n}\n\nfunction severityMeta(severity: GatewaySecurityAuditSeverity) {\n switch (severity) {\n case 'critical':\n return {\n icon: AlertCircle,\n iconClass: 'text-red-600 dark:text-red-400',\n };\n case 'warn':\n return {\n icon: AlertTriangle,\n iconClass: 'text-amber-600 dark:text-amber-400',\n };\n default:\n return {\n icon: Info,\n iconClass: 'text-fg-muted',\n };\n }\n}\n\nfunction statusSummary(\n g: GatewaySettingsMessages,\n status: GatewaySecurityAuditStatus,\n findings: GatewaySecurityAuditFinding[],\n) {\n const criticalCount = findings.filter((f) => f.severity === 'critical').length;\n const warnCount = findings.filter((f) => f.severity === 'warn').length;\n\n if (status === 'fail' || criticalCount > 0) {\n return {\n icon: AlertCircle,\n iconClass: 'text-red-600 dark:text-red-400',\n title: g.securityAuditStatusFail,\n bannerClass:\n 'border-red-200 bg-red-50 text-red-950 dark:border-red-900/50 dark:bg-red-950/40 dark:text-red-100',\n };\n }\n\n if (status === 'warn' || warnCount > 0) {\n return {\n icon: AlertTriangle,\n iconClass: 'text-amber-600 dark:text-amber-400',\n title: g.securityAuditStatusWarn,\n bannerClass:\n 'border-amber-200 bg-amber-50 text-amber-950 dark:border-amber-800 dark:bg-amber-950/40 dark:text-amber-100',\n };\n }\n\n if (status === 'skip') {\n return {\n icon: Info,\n iconClass: 'text-fg-muted',\n title: g.securityAuditStatusSkip,\n bannerClass: 'border-edge bg-surface-panel/60 text-fg',\n };\n }\n\n return {\n icon: ShieldCheck,\n iconClass: 'text-emerald-600 dark:text-emerald-400',\n title: g.securityAuditStatusPass,\n bannerClass:\n 'border-emerald-200 bg-emerald-50 text-emerald-950 dark:border-emerald-900/50 dark:bg-emerald-950/40 dark:text-emerald-100',\n };\n}\n","import {\n AlertCircle,\n Check,\n Copy,\n ExternalLink,\n Eye,\n EyeOff,\n KeyRound,\n Loader2,\n Network,\n RefreshCw,\n RotateCw,\n Shield,\n SlidersHorizontal,\n type LucideIcon,\n} from 'lucide-react';\nimport { useCallback, useMemo, useReducer, useRef, type ReactNode } from 'react';\n\nimport { uiPatchReducer } from '@/lib/settings-form-draft';\nimport { useSearchParams } from 'react-router-dom';\n\nimport { Button } from '@/components/ui/button';\nimport { ConfirmDialog } from '@/components/ui/confirm-dialog';\nimport { useGatewayConfigSwr } from '@/features/gateway/gateway-config-swr';\nimport {\n gatewaySettingsRequireRestart,\n normalizeGatewayFromConfig,\n patchGatewaySettings,\n validateGatewaySettings,\n type GatewaySettingsState,\n} from '@/features/settings/gateway-config-api';\nimport { GatewaySecurityAuditCard } from '@/features/settings/gateway-security-audit-card';\nimport { MAX_CHANNEL_DEFER_LIST_SIZE } from '@/features/settings/gateway-settings.types';\nimport { restartGatewayAfterConfigChange } from '@/features/tunnel/gateway-restart';\nimport { settingsInputFocusClass } from '@/lib/form-field-width';\nimport { cn } from '@/lib/cn';\nimport { copyTextToClipboard } from '@/lib/copy-to-clipboard';\nimport { interaction } from '@/lib/interaction';\nimport { messages, type GatewaySettingsMessages } from '@/i18n/messages';\nimport { docsGuidePageUrl } from '@/navigation';\nimport { useGatewayStore } from '@/stores/gateway-store';\nimport { useLocaleStore } from '@/stores/locale-store';\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 GatewaySettingsTabId = 'network' | 'access' | 'updates' | 'security' | 'advanced';\n\nconst GATEWAY_SETTINGS_TABS: readonly GatewaySettingsTabId[] = [\n 'network',\n 'access',\n 'updates',\n 'security',\n 'advanced',\n];\n\nconst GATEWAY_SETTINGS_TAB_ICONS: Record<GatewaySettingsTabId, LucideIcon> = {\n network: Network,\n access: KeyRound,\n updates: RefreshCw,\n security: Shield,\n advanced: SlidersHorizontal,\n};\n\nfunction parseGatewaySettingsTab(raw: string | null): GatewaySettingsTabId {\n if (raw && GATEWAY_SETTINGS_TABS.includes(raw as GatewaySettingsTabId)) {\n return raw as GatewaySettingsTabId;\n }\n return 'network';\n}\n\nfunction gatewaySettingsTabLabel(g: GatewaySettingsMessages, tab: GatewaySettingsTabId): string {\n if (tab === 'network') return g.tabNetwork;\n if (tab === 'access') return g.tabAccess;\n if (tab === 'updates') return g.tabUpdates;\n if (tab === 'security') return g.tabSecurity;\n return g.tabAdvanced;\n}\n\nfunction gatewaySettingsTabHint(g: GatewaySettingsMessages, tab: GatewaySettingsTabId): string {\n if (tab === 'network') return g.networkTabHint;\n if (tab === 'access') return g.accessTabHint;\n if (tab === 'updates') return g.updatesTabHint;\n if (tab === 'security') return g.securitySectionHint;\n return g.advancedSectionHint;\n}\n\ntype GatewayFormDraft = {\n form: GatewaySettingsState | null;\n baseline: GatewaySettingsState | null;\n appliedBaseline: GatewaySettingsState | null;\n};\n\ntype GatewayFormAction =\n | { type: 'reset' }\n | { type: 'init-applied'; value: GatewaySettingsState }\n | { type: 'sync'; value: GatewaySettingsState }\n | { type: 'set-form'; updater: (prev: GatewaySettingsState) => GatewaySettingsState }\n | { type: 'discard' }\n | { type: 'saved'; value: GatewaySettingsState };\n\nfunction gatewayFormReducer(state: GatewayFormDraft, action: GatewayFormAction): GatewayFormDraft {\n switch (action.type) {\n case 'reset':\n return { form: null, baseline: null, appliedBaseline: null };\n case 'init-applied':\n return { ...state, appliedBaseline: structuredClone(action.value) };\n case 'sync': {\n const snapshot = structuredClone(action.value);\n return { form: snapshot, baseline: structuredClone(snapshot), appliedBaseline: state.appliedBaseline };\n }\n case 'set-form':\n return state.form ? { ...state, form: action.updater(state.form) } : state;\n case 'discard':\n return state.baseline ? { ...state, form: structuredClone(state.baseline) } : state;\n case 'saved': {\n const snapshot = structuredClone(action.value);\n return { form: snapshot, baseline: structuredClone(snapshot), appliedBaseline: state.appliedBaseline };\n }\n }\n}\n\ntype GatewayUi = {\n saving: boolean;\n error: string | null;\n saveOk: boolean;\n showAccessToken: boolean;\n showPassword: boolean;\n copied: boolean;\n auditRefreshToken: number;\n restarting: boolean;\n restartConfirmOpen: boolean;\n};\n\nconst initialGatewayUi: GatewayUi = {\n saving: false,\n error: null,\n saveOk: false,\n showAccessToken: false,\n showPassword: false,\n copied: false,\n auditRefreshToken: 0,\n restarting: false,\n restartConfirmOpen: false,\n};\n\nexport function GatewaySettingsPanel() {\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const g = m.gatewaySettings;\n const [searchParams, setSearchParams] = useSearchParams();\n const activeTab = parseGatewaySettingsTab(searchParams.get('tab'));\n\n const setActiveTab = useCallback(\n (tab: GatewaySettingsTabId) => {\n setSearchParams(\n (prev) => {\n const next = new URLSearchParams(prev);\n if (tab === 'network') next.delete('tab');\n else next.set('tab', tab);\n return next;\n },\n { replace: true },\n );\n },\n [setSearchParams],\n );\n const token = useGatewayStore((st) => st.token);\n const tokenExpired = useGatewayStore((st) => st.tokenExpired);\n const openTokenDialog = useGatewayStore((st) => st.openTokenDialog);\n const hasToken = Boolean(token);\n\n const [formDraft, dispatchForm] = useReducer(gatewayFormReducer, {\n form: null,\n baseline: null,\n appliedBaseline: null,\n });\n const form = formDraft.form;\n const baseline = formDraft.baseline;\n const appliedBaseline = formDraft.appliedBaseline;\n const [ui, dispatchUi] = useReducer(uiPatchReducer<GatewayUi>, initialGatewayUi);\n const {\n saving,\n error,\n saveOk,\n showAccessToken,\n showPassword,\n copied,\n auditRefreshToken,\n restarting,\n restartConfirmOpen,\n } = ui;\n const dirtyRef = useRef(false);\n const trackedParsedRef = useRef<GatewaySettingsState | null>(null);\n const appliedBaselineInitializedRef = useRef(false);\n\n const { data, error: swrError, isLoading, mutate } = useGatewayConfigSwr(hasToken);\n\n const parsed = useMemo(\n () =>\n data?.payload?.config !== undefined\n ? structuredClone(normalizeGatewayFromConfig(data.payload.config))\n : null,\n [data],\n );\n\n if (!hasToken) {\n if (trackedParsedRef.current !== null || appliedBaselineInitializedRef.current) {\n trackedParsedRef.current = null;\n appliedBaselineInitializedRef.current = false;\n dispatchForm({ type: 'reset' });\n dirtyRef.current = false;\n }\n } else if (parsed !== null) {\n if (!appliedBaselineInitializedRef.current) {\n appliedBaselineInitializedRef.current = true;\n dispatchForm({ type: 'init-applied', value: parsed });\n }\n if (!dirtyRef.current && trackedParsedRef.current !== parsed) {\n trackedParsedRef.current = parsed;\n dispatchForm({ type: 'sync', value: parsed });\n dispatchUi({ type: 'patch', patch: { saveOk: false } });\n }\n }\n\n const loading = Boolean(hasToken && isLoading && data === undefined && !swrError);\n const fetchError =\n swrError instanceof Error ? swrError.message : swrError ? String(swrError) : null;\n\n const dirty = useMemo(() => {\n if (!form || !baseline) return false;\n return JSON.stringify(form) !== JSON.stringify(baseline);\n }, [form, baseline]);\n\n const showRestartPrompt = useMemo(() => {\n if (!baseline || !appliedBaseline) return false;\n return gatewaySettingsRequireRestart(appliedBaseline, baseline);\n }, [appliedBaseline, baseline]);\n\n const updateAuth = useCallback((patch: Partial<GatewaySettingsState['auth']>) => {\n dirtyRef.current = true;\n dispatchForm({ type: 'set-form', updater: (f) => ({ ...f, auth: { ...f.auth, ...patch } }) });\n }, []);\n\n const updateChannel = useCallback((channel: GatewaySettingsState['updateChannel']) => {\n dirtyRef.current = true;\n dispatchForm({ type: 'set-form', updater: (f) => ({ ...f, updateChannel: channel }) });\n }, []);\n\n const updateCorsOrigins = useCallback((corsOrigins: string[]) => {\n dirtyRef.current = true;\n dispatchForm({ type: 'set-form', updater: (f) => ({ ...f, corsOrigins }) });\n }, []);\n\n const updateBind = useCallback((bind: GatewaySettingsState['bind']) => {\n dirtyRef.current = true;\n dispatchForm({ type: 'set-form', updater: (f) => ({ ...f, bind }) });\n }, []);\n\n const updateCustomBindHost = useCallback((customBindHost: string) => {\n dirtyRef.current = true;\n dispatchForm({\n type: 'set-form',\n updater: (f) => ({ ...f, customBindHost, bind: 'custom' }),\n });\n }, []);\n\n const updatePort = useCallback((port: number) => {\n dirtyRef.current = true;\n dispatchForm({ type: 'set-form', updater: (f) => ({ ...f, port }) });\n }, []);\n\n const updateRateLimit = useCallback((patch: Partial<GatewaySettingsState['auth']['rateLimit']>) => {\n dirtyRef.current = true;\n dispatchForm({\n type: 'set-form',\n updater: (f) => ({ ...f, auth: { ...f.auth, rateLimit: { ...f.auth.rateLimit, ...patch } } }),\n });\n }, []);\n\n const updateMaxSseConnections = useCallback((maxSseConnections: number) => {\n dirtyRef.current = true;\n dispatchForm({ type: 'set-form', updater: (f) => ({ ...f, maxSseConnections }) });\n }, []);\n\n const updateChannelConnectDeferMode = useCallback(\n (channelConnectDeferMode: GatewaySettingsState['channelConnectDeferMode']) => {\n dirtyRef.current = true;\n dispatchForm({ type: 'set-form', updater: (f) => ({ ...f, channelConnectDeferMode }) });\n },\n [],\n );\n\n const updateChannelConnectDeferIds = useCallback((channelConnectDeferIds: string[]) => {\n dirtyRef.current = true;\n dispatchForm({ type: 'set-form', updater: (f) => ({ ...f, channelConnectDeferIds }) });\n }, []);\n\n const updateChannelConnectDeferSkipIds = useCallback((channelConnectDeferSkipIds: string[]) => {\n dirtyRef.current = true;\n dispatchForm({ type: 'set-form', updater: (f) => ({ ...f, channelConnectDeferSkipIds }) });\n }, []);\n\n const updateTrustedProxies = useCallback((trustedProxies: string[]) => {\n dirtyRef.current = true;\n dispatchForm({ type: 'set-form', updater: (f) => ({ ...f, trustedProxies }) });\n }, []);\n\n const updateTrustedProxy = useCallback((patch: Partial<GatewaySettingsState['auth']['trustedProxy']>) => {\n dirtyRef.current = true;\n dispatchForm({\n type: 'set-form',\n updater: (f) => ({ ...f, auth: { ...f.auth, trustedProxy: { ...f.auth.trustedProxy, ...patch } } }),\n });\n }, []);\n\n const updateSecurityStrict = useCallback((securityStrict: boolean) => {\n dirtyRef.current = true;\n dispatchForm({ type: 'set-form', updater: (f) => ({ ...f, securityStrict }) });\n }, []);\n\n const updateAllowRealIpFallback = useCallback((allowRealIpFallback: boolean) => {\n dirtyRef.current = true;\n dispatchForm({ type: 'set-form', updater: (f) => ({ ...f, allowRealIpFallback }) });\n }, []);\n\n const updateDangerouslyAllowHostHeaderOriginFallback = useCallback(\n (dangerouslyAllowHostHeaderOriginFallback: boolean) => {\n dirtyRef.current = true;\n dispatchForm({ type: 'set-form', updater: (f) => ({ ...f, dangerouslyAllowHostHeaderOriginFallback }) });\n },\n [],\n );\n\n const save = useCallback(async () => {\n if (!form || saving) return;\n const validationError = validateGatewaySettings(form);\n if (validationError) {\n dispatchUi({ type: 'patch', patch: { error: validationError } });\n return;\n }\n dispatchUi({ type: 'patch', patch: { saving: true, error: null, saveOk: false } });\n try {\n await patchGatewaySettings(form);\n dirtyRef.current = false;\n dispatchForm({ type: 'saved', value: form });\n dispatchUi({\n type: 'patch',\n patch: { saveOk: true, auditRefreshToken: auditRefreshToken + 1 },\n });\n window.setTimeout(() => dispatchUi({ type: 'patch', patch: { saveOk: false } }), 2500);\n } catch (e) {\n dispatchUi({ type: 'patch', patch: { error: e instanceof Error ? e.message : g.saveError } });\n } finally {\n dispatchUi({ type: 'patch', patch: { saving: false } });\n }\n }, [form, saving, g.saveError]);\n\n const discard = useCallback(() => {\n if (!baseline) return;\n dirtyRef.current = false;\n dispatchForm({ type: 'discard' });\n dispatchUi({ type: 'patch', patch: { error: null, saveOk: false } });\n }, [baseline]);\n\n const copyAccessToken = useCallback(async () => {\n const t = form?.auth.token;\n if (!t) return;\n const ok = await copyTextToClipboard(t);\n if (!ok) return;\n dispatchUi({ type: 'patch', patch: { copied: true } });\n window.setTimeout(() => dispatchUi({ type: 'patch', patch: { copied: false } }), 2000);\n }, [form?.auth.token]);\n\n const executeRestart = useCallback(async () => {\n if (restarting) return;\n dispatchUi({ type: 'patch', patch: { restarting: true, restartConfirmOpen: false } });\n try {\n const res = await restartGatewayAfterConfigChange();\n if (res.ok) {\n window.dispatchEvent(new Event('gateway-restart-initiated'));\n } else {\n window.dispatchEvent(\n new CustomEvent('extension-notification', {\n detail: { type: 'error', title: g.restartGatewayFailed, message: res.message ?? '' },\n }),\n );\n }\n } catch (e) {\n window.dispatchEvent(\n new CustomEvent('extension-notification', {\n detail: {\n type: 'error',\n title: g.restartGatewayFailed,\n message: e instanceof Error ? e.message : String(e),\n },\n }),\n );\n } finally {\n dispatchUi({ type: 'patch', patch: { restarting: false } });\n }\n }, [restarting, g.restartGatewayFailed]);\n\n if (!hasToken) {\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\">{m.settingsSections.gateway}</h1>\n <p className=\"text-sm text-fg-muted\">{g.needToken}</p>\n </div>\n );\n }\n\n if (loading) {\n return (\n <div className=\"mx-auto flex w-full max-w-app-main flex-col gap-3 px-4 py-8\">\n <div className=\"flex items-center gap-2 text-sm text-fg-muted\">\n <Loader2 className=\"size-4 animate-spin\" />\n {g.loading}\n </div>\n </div>\n );\n }\n\n if (!form) {\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\">{error ?? fetchError ?? g.loadError}</p>\n <Button type=\"button\" variant=\"secondary\" onClick={() => void mutate()}>\n {g.retry}\n </Button>\n </div>\n );\n }\n\n return (\n <div className=\"mx-auto flex w-full max-w-app-main flex-col gap-6 px-4 py-6\">\n <header className=\"flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between\">\n <div>\n <h1 className=\"text-lg font-semibold tracking-tight text-fg\">{m.settingsSections.gateway}</h1>\n <p className=\"mt-1 text-sm text-fg-muted\">{g.subtitle}</p>\n <a\n href={docsGuidePageUrl(language, 'gateway')}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"mt-1 inline-flex items-center gap-1 text-sm text-accent hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/40\"\n >\n {g.docsLink}\n <ExternalLink className=\"size-3.5\" />\n </a>\n </div>\n <div className=\"flex shrink-0 flex-wrap items-center justify-end gap-2\">\n {saveOk ? <span className=\"text-sm text-fg-muted\">{g.saved}</span> : null}\n <Button type=\"button\" variant=\"secondary\" disabled={!dirty || saving} onClick={discard}>\n {g.discard}\n </Button>\n <Button type=\"button\" variant=\"primary\" disabled={!dirty || saving} onClick={() => void save()}>\n {saving ? g.saving : g.save}\n </Button>\n </div>\n </header>\n\n {tokenExpired ? (\n <div\n className=\"flex flex-col gap-3 rounded-lg border border-red-200 bg-red-50 px-4 py-3 dark:border-red-900/50 dark:bg-red-950/40\"\n role=\"alert\"\n >\n <div className=\"flex items-start gap-2\">\n <AlertCircle className=\"mt-0.5 size-4 shrink-0 text-red-600 dark:text-red-400\" />\n <p className=\"text-sm text-red-900 dark:text-red-100\">{g.tokenExpired}</p>\n </div>\n <div>\n <Button type=\"button\" variant=\"secondary\" className=\"text-sm\" onClick={() => openTokenDialog()}>\n {g.updateToken}\n </Button>\n </div>\n </div>\n ) : null}\n\n {dirty ? <p className=\"text-xs text-amber-800 dark:text-amber-200\">{g.unsavedHint}</p> : null}\n {error ? <p className=\"text-sm text-red-600 dark:text-red-400\">{error}</p> : null}\n\n {showRestartPrompt ? (\n <div className=\"flex items-center justify-between gap-3 rounded-lg border border-amber-200 bg-amber-50 px-3 py-2 dark:border-amber-800 dark:bg-amber-950/40\">\n <p className=\"text-xs text-amber-950 dark:text-amber-100\">{g.restartHint}</p>\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"shrink-0 gap-1.5 border-red-300 bg-red-50 text-xs text-red-700 hover:bg-red-100 dark:border-red-800 dark:bg-red-950/50 dark:text-red-300 dark:hover:bg-red-900/60\"\n disabled={restarting}\n onClick={() => dispatchUi({ type: 'patch', patch: { restartConfirmOpen: true } })}\n >\n {restarting ? (\n <Loader2 className=\"size-3.5 animate-spin\" />\n ) : (\n <RotateCw className=\"size-3.5\" />\n )}\n {g.restartGatewayButton}\n </Button>\n </div>\n ) : null}\n\n <ConfirmDialog\n open={restartConfirmOpen}\n title={g.restartGatewayButton}\n description={g.restartGatewayConfirm}\n confirmLabel={g.restartGatewayButton}\n cancelLabel={g.discard}\n destructive\n onConfirm={() => void executeRestart()}\n onCancel={() => dispatchUi({ type: 'patch', patch: { restartConfirmOpen: false } })}\n />\n\n <GatewaySettingsTabs g={g} activeTab={activeTab} onChange={setActiveTab} />\n\n <GatewayTabPanel g={g} id=\"network\" activeTab={activeTab}>\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <div>\n <label className=\"mb-1 block text-sm font-medium text-fg\" htmlFor=\"gateway-bind-mode\">\n {g.bindMode}\n </label>\n <select\n id=\"gateway-bind-mode\"\n className={inputClassName()}\n value={form.bind}\n onChange={(event) => updateBind(event.target.value as GatewaySettingsState['bind'])}\n >\n <option value=\"loopback\">{g.bindLoopback}</option>\n <option value=\"lan\">{g.bindLan}</option>\n <option value=\"auto\">{g.bindAuto}</option>\n <option value=\"custom\">{g.bindCustom}</option>\n <option value=\"tailnet\">{g.bindTailnet}</option>\n </select>\n </div>\n {form.bind === 'custom' ? (\n <div>\n <label className=\"mb-1 block text-sm font-medium text-fg\" htmlFor=\"gateway-custom-bind-host\">\n {g.customBindHost}\n </label>\n <input\n id=\"gateway-custom-bind-host\"\n className={cn(inputClassName(), 'font-mono text-xs')}\n value={form.customBindHost}\n onChange={(event) => updateCustomBindHost(event.target.value)}\n placeholder={g.customBindHostPlaceholder}\n autoComplete=\"off\"\n />\n </div>\n ) : null}\n <div>\n <label className=\"mb-1 block text-sm font-medium text-fg\" htmlFor=\"gateway-listen-port\">\n {g.listenPort}\n </label>\n <input\n id=\"gateway-listen-port\"\n type=\"number\"\n min={1}\n max={65535}\n className={cn(inputClassName(), 'font-mono text-xs')}\n value={form.port}\n onChange={(event) => {\n const nextPort = Number(event.target.value);\n updatePort(\n Number.isFinite(nextPort)\n ? Math.max(1, Math.min(65535, Math.floor(nextPort)))\n : form.port,\n );\n }}\n />\n </div>\n <p className=\"text-xs text-fg-subtle sm:col-span-2\">{g.listenHint}</p>\n </div>\n\n <CorsOriginsField g={g} origins={form.corsOrigins} onChange={updateCorsOrigins} />\n </GatewayTabPanel>\n\n <GatewayTabPanel g={g} id=\"access\" activeTab={activeTab}>\n {form.auth.mode === 'none' ? (\n <p className=\"rounded-lg border border-amber-200 bg-amber-50 px-3 py-2 text-xs text-amber-950 dark:border-amber-800 dark:bg-amber-950/40 dark:text-amber-100\">\n {g.authModeNone}\n </p>\n ) : null}\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium text-fg\" htmlFor=\"gateway-auth-mode\">\n {g.authMode}\n </label>\n <select\n id=\"gateway-auth-mode\"\n value={form.auth.mode}\n onChange={(event) => updateAuth({ mode: event.target.value as GatewaySettingsState['auth']['mode'] })}\n className={inputClassName()}\n >\n <option value=\"token\">{g.authModeToken}</option>\n <option value=\"password\">{g.authModePassword}</option>\n <option value=\"trusted-proxy\">{g.authModeTrustedProxy}</option>\n <option value=\"none\">{g.authModeNoneLabel}</option>\n </select>\n </div>\n\n {form.auth.mode === 'trusted-proxy' ? (\n <TrustedProxyAuthFields\n g={g}\n form={form}\n onTrustedProxyChange={updateTrustedProxy}\n onTrustedProxiesChange={updateTrustedProxies}\n onAllowRealIpFallbackChange={updateAllowRealIpFallback}\n />\n ) : null}\n\n {form.auth.mode === 'token' ? (\n <>\n <SecretCredentialField\n g={g}\n id=\"gateway-access-token\"\n label={g.accessToken}\n help={g.tokenHelp}\n placeholder={g.tokenPlaceholder}\n value={form.auth.token}\n show={showAccessToken}\n copied={copied}\n onToggleShow={() =>\n dispatchUi({ type: 'patch', patch: { showAccessToken: !showAccessToken } })\n }\n onCopy={() => void copyAccessToken()}\n onChange={(tokenValue) => updateAuth({ token: tokenValue })}\n />\n <Button type=\"button\" variant=\"secondary\" className=\"w-full sm:w-auto\" onClick={() => openTokenDialog()}>\n {g.changeToken}\n </Button>\n </>\n ) : null}\n\n {form.auth.mode === 'password' ? (\n <SecretCredentialField\n g={g}\n id=\"gateway-auth-password\"\n label={g.authPassword}\n help={g.authPasswordHelp}\n placeholder={g.authPasswordPlaceholder}\n value={form.auth.password}\n show={showPassword}\n onToggleShow={() => dispatchUi({ type: 'patch', patch: { showPassword: !showPassword } })}\n onChange={(passwordValue) => updateAuth({ password: passwordValue })}\n />\n ) : null}\n\n {form.auth.mode !== 'none' ? (\n <AuthRateLimitFields g={g} rateLimit={form.auth.rateLimit} onChange={updateRateLimit} />\n ) : null}\n </GatewayTabPanel>\n\n <GatewayTabPanel g={g} id=\"updates\" activeTab={activeTab}>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium text-fg\" htmlFor=\"gateway-update-channel\">\n {g.updateChannel}\n </label>\n <select\n id=\"gateway-update-channel\"\n value={form.updateChannel}\n onChange={(event) => updateChannel(event.target.value as GatewaySettingsState['updateChannel'])}\n className={inputClassName()}\n >\n <option value=\"stable\">{g.channelStable}</option>\n <option value=\"beta\">{g.channelBeta}</option>\n <option value=\"dev\">{g.channelDev}</option>\n </select>\n <p className=\"text-xs text-fg-subtle\">{g.updateChannelHint}</p>\n </div>\n\n <div className=\"space-y-4 border-t border-edge pt-4\">\n <div className=\"text-sm font-medium text-fg\">{g.updateAutoSection}</div>\n <p className=\"text-xs text-fg-subtle\">{g.updateAutoSectionHint}</p>\n <label className=\"flex cursor-pointer items-start gap-2 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"ui-checkbox mt-0.5\"\n checked={form.updateCheckOnStart}\n onChange={(event) => {\n dirtyRef.current = true;\n dispatchForm({\n type: 'set-form',\n updater: (currentForm) => ({ ...currentForm, updateCheckOnStart: event.target.checked }),\n });\n }}\n />\n <span>\n <span className=\"font-medium\">{g.updateCheckOnStart}</span>\n <span className=\"mt-0.5 block text-xs text-fg-subtle\">{g.updateCheckOnStartHint}</span>\n </span>\n </label>\n <label className=\"flex cursor-pointer items-start gap-2 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"ui-checkbox mt-0.5\"\n checked={form.updateAutoEnabled}\n onChange={(event) => {\n dirtyRef.current = true;\n dispatchForm({\n type: 'set-form',\n updater: (currentForm) => ({ ...currentForm, updateAutoEnabled: event.target.checked }),\n });\n }}\n />\n <span>\n <span className=\"font-medium\">{g.updateAutoEnabled}</span>\n <span className=\"mt-0.5 block text-xs text-fg-subtle\">{g.updateAutoEnabledHint}</span>\n </span>\n </label>\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div>\n <label className=\"mb-1 block text-sm font-medium text-fg\" htmlFor=\"update-auto-stable-delay\">\n {g.updateAutoStableDelayHours}\n </label>\n <input\n id=\"update-auto-stable-delay\"\n type=\"number\"\n min={0}\n disabled={!form.updateAutoEnabled}\n className={inputClassName()}\n value={form.updateAutoStableDelayHours}\n onChange={(event) => {\n dirtyRef.current = true;\n dispatchForm({ type: 'set-form', updater: (currentForm) => ({\n ...currentForm,\n updateAutoStableDelayHours: Math.max(0, Math.floor(Number(event.target.value) || 0)),\n }) });\n }}\n />\n <p className=\"mt-1 text-xs text-fg-subtle\">{g.updateAutoStableDelayHoursHint}</p>\n </div>\n <div>\n <label className=\"mb-1 block text-sm font-medium text-fg\" htmlFor=\"update-auto-stable-jitter\">\n {g.updateAutoStableJitterHours}\n </label>\n <input\n id=\"update-auto-stable-jitter\"\n type=\"number\"\n min={0}\n disabled={!form.updateAutoEnabled}\n className={inputClassName()}\n value={form.updateAutoStableJitterHours}\n onChange={(event) => {\n dirtyRef.current = true;\n dispatchForm({ type: 'set-form', updater: (currentForm) => ({\n ...currentForm,\n updateAutoStableJitterHours: Math.max(0, Math.floor(Number(event.target.value) || 0)),\n }) });\n }}\n />\n <p className=\"mt-1 text-xs text-fg-subtle\">{g.updateAutoStableJitterHoursHint}</p>\n </div>\n <div>\n <label className=\"mb-1 block text-sm font-medium text-fg\" htmlFor=\"update-auto-beta-interval\">\n {g.updateAutoBetaCheckIntervalHours}\n </label>\n <input\n id=\"update-auto-beta-interval\"\n type=\"number\"\n min={0.25}\n step={0.25}\n disabled={!form.updateAutoEnabled}\n className={inputClassName()}\n value={form.updateAutoBetaCheckIntervalHours}\n onChange={(event) => {\n dirtyRef.current = true;\n dispatchForm({ type: 'set-form', updater: (currentForm) => ({\n ...currentForm,\n updateAutoBetaCheckIntervalHours: Math.max(0.25, Number(event.target.value) || 1),\n }) });\n }}\n />\n <p className=\"mt-1 text-xs text-fg-subtle\">{g.updateAutoBetaCheckIntervalHoursHint}</p>\n </div>\n </div>\n </div>\n </GatewayTabPanel>\n\n <GatewayTabPanel g={g} id=\"security\" activeTab={activeTab}>\n <GatewaySecurityAuditCard enabled={hasToken} refreshToken={auditRefreshToken} />\n <GatewaySecurityFields\n g={g}\n form={form}\n onSecurityStrictChange={updateSecurityStrict}\n onDangerouslyAllowHostHeaderOriginFallbackChange={updateDangerouslyAllowHostHeaderOriginFallback}\n />\n </GatewayTabPanel>\n\n <GatewayTabPanel g={g} id=\"advanced\" activeTab={activeTab}>\n <GatewayAdvancedFields\n g={g}\n form={form}\n onMaxSseConnectionsChange={updateMaxSseConnections}\n onDeferModeChange={updateChannelConnectDeferMode}\n onDeferIdsChange={updateChannelConnectDeferIds}\n onSkipIdsChange={updateChannelConnectDeferSkipIds}\n />\n </GatewayTabPanel>\n </div>\n );\n}\n\nfunction GatewaySettingsTabs({\n g,\n activeTab,\n onChange,\n}: {\n g: GatewaySettingsMessages;\n activeTab: GatewaySettingsTabId;\n onChange: (tab: GatewaySettingsTabId) => void;\n}) {\n return (\n <nav\n aria-label={g.tabsAriaLabel}\n className=\"-mx-1 flex gap-1 overflow-x-auto px-1 pb-1\"\n role=\"tablist\"\n onKeyDown={(event) => {\n if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight') return;\n event.preventDefault();\n const currentIndex = GATEWAY_SETTINGS_TABS.indexOf(activeTab);\n const delta = event.key === 'ArrowRight' ? 1 : -1;\n const nextIndex =\n (currentIndex + delta + GATEWAY_SETTINGS_TABS.length) % GATEWAY_SETTINGS_TABS.length;\n onChange(GATEWAY_SETTINGS_TABS[nextIndex]);\n }}\n >\n {GATEWAY_SETTINGS_TABS.map((tab) => {\n const Icon = GATEWAY_SETTINGS_TAB_ICONS[tab];\n const selected = tab === activeTab;\n return (\n <button\n key={tab}\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n aria-controls={`gateway-settings-panel-${tab}`}\n id={`gateway-settings-tab-${tab}`}\n className={cn(\n 'inline-flex shrink-0 items-center gap-1.5 rounded-lg px-3 py-2 text-sm font-medium transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent',\n interaction.press,\n selected ? 'bg-accent-soft text-accent-fg' : 'text-fg-muted hover:bg-surface-hover hover:text-fg',\n )}\n onClick={() => onChange(tab)}\n >\n <Icon className=\"size-3.5 shrink-0\" strokeWidth={1.75} aria-hidden />\n <span>{gatewaySettingsTabLabel(g, tab)}</span>\n </button>\n );\n })}\n </nav>\n );\n}\n\nfunction GatewayTabPanel({\n g,\n id,\n activeTab,\n children,\n}: {\n g: GatewaySettingsMessages;\n id: GatewaySettingsTabId;\n activeTab: GatewaySettingsTabId;\n children: ReactNode;\n}) {\n if (activeTab !== id) return null;\n\n return (\n <section\n id={`gateway-settings-panel-${id}`}\n role=\"tabpanel\"\n aria-labelledby={`gateway-settings-tab-${id}`}\n className=\"rounded-2xl border border-edge bg-surface-base px-4 py-5 sm:px-5\"\n >\n <div className=\"mb-5\">\n <div className=\"text-sm font-semibold text-fg\">{gatewaySettingsTabLabel(g, id)}</div>\n <p className=\"mt-1 text-xs text-fg-subtle\">{gatewaySettingsTabHint(g, id)}</p>\n </div>\n <div className=\"space-y-4\">{children}</div>\n </section>\n );\n}\n\n\nfunction GatewaySecurityFields({\n g,\n form,\n onSecurityStrictChange,\n onDangerouslyAllowHostHeaderOriginFallbackChange,\n}: {\n g: GatewaySettingsMessages;\n form: GatewaySettingsState;\n onSecurityStrictChange: (value: boolean) => void;\n onDangerouslyAllowHostHeaderOriginFallbackChange: (value: boolean) => void;\n}) {\n return (\n <div className=\"space-y-4\">\n <label className=\"flex cursor-pointer items-start gap-2 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"ui-checkbox mt-0.5\"\n checked={form.securityStrict}\n onChange={(e) => onSecurityStrictChange(e.target.checked)}\n />\n <span>\n <span className=\"font-medium\">{g.securityStrict}</span>\n <span className=\"mt-0.5 block text-xs text-fg-subtle\">{g.securityStrictHint}</span>\n </span>\n </label>\n\n <label className=\"flex cursor-pointer items-start gap-2 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"ui-checkbox mt-0.5\"\n checked={form.dangerouslyAllowHostHeaderOriginFallback}\n onChange={(e) => onDangerouslyAllowHostHeaderOriginFallbackChange(e.target.checked)}\n />\n <span>\n <span className=\"font-medium\">{g.dangerouslyAllowHostHeaderOriginFallback}</span>\n <span className=\"mt-0.5 block text-xs text-fg-subtle\">\n {g.dangerouslyAllowHostHeaderOriginFallbackHint}\n </span>\n </span>\n </label>\n\n {form.dangerouslyAllowHostHeaderOriginFallback ? (\n <p className=\"rounded-lg border border-amber-200 bg-amber-50 px-3 py-2 text-xs text-amber-950 dark:border-amber-800 dark:bg-amber-950/40 dark:text-amber-100\">\n {g.dangerouslyAllowHostHeaderOriginFallbackWarning}\n </p>\n ) : null}\n </div>\n );\n}\n\nfunction TrustedProxyAuthFields({\n g,\n form,\n onTrustedProxyChange,\n onTrustedProxiesChange,\n onAllowRealIpFallbackChange,\n}: {\n g: GatewaySettingsMessages;\n form: GatewaySettingsState;\n onTrustedProxyChange: (patch: Partial<GatewaySettingsState['auth']['trustedProxy']>) => void;\n onTrustedProxiesChange: (values: string[]) => void;\n onAllowRealIpFallbackChange: (value: boolean) => void;\n}) {\n const tp = form.auth.trustedProxy;\n\n return (\n <div className=\"space-y-4 border-t border-edge pt-4\">\n <p className=\"text-xs text-fg-subtle\">{g.authModeTrustedProxyHint}</p>\n\n <div>\n <label className=\"mb-1 block text-sm font-medium text-fg\" htmlFor=\"gateway-trusted-proxy-user-header\">\n {g.trustedProxyUserHeader}\n </label>\n <input\n id=\"gateway-trusted-proxy-user-header\"\n className={cn(inputClassName(), 'font-mono text-xs')}\n value={tp.userHeader}\n onChange={(e) => onTrustedProxyChange({ userHeader: e.target.value })}\n placeholder={g.trustedProxyUserHeaderPlaceholder}\n autoComplete=\"off\"\n />\n <p className=\"mt-1 text-xs text-fg-subtle\">{g.trustedProxyUserHeaderHint}</p>\n </div>\n\n <GatewayStringListField\n title={g.trustedProxyRequiredHeaders}\n hint={g.trustedProxyRequiredHeadersHint}\n emptyText={g.channelIdListEmpty}\n placeholder={g.trustedProxyUserHeaderPlaceholder}\n values={tp.requiredHeaders}\n maxItems={32}\n onChange={(requiredHeaders) => onTrustedProxyChange({ requiredHeaders })}\n />\n\n <GatewayStringListField\n title={g.trustedProxyAllowUsers}\n hint={g.trustedProxyAllowUsersHint}\n emptyText={g.channelIdListEmpty}\n placeholder={g.trustedProxyUserHeaderPlaceholder}\n values={tp.allowUsers}\n maxItems={128}\n onChange={(allowUsers) => onTrustedProxyChange({ allowUsers })}\n />\n\n <label className=\"flex cursor-pointer items-start gap-2 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"ui-checkbox mt-0.5\"\n checked={tp.allowLoopback}\n onChange={(e) => onTrustedProxyChange({ allowLoopback: e.target.checked })}\n />\n <span>\n <span className=\"font-medium\">{g.trustedProxyAllowLoopback}</span>\n <span className=\"mt-0.5 block text-xs text-fg-subtle\">{g.trustedProxyAllowLoopbackHint}</span>\n </span>\n </label>\n\n <GatewayStringListField\n title={g.trustedProxies}\n hint={g.trustedProxiesHint}\n emptyText={g.trustedProxiesEmpty}\n placeholder={g.trustedProxiesPlaceholder}\n values={form.trustedProxies}\n maxItems={64}\n onChange={onTrustedProxiesChange}\n />\n\n <label className=\"flex cursor-pointer items-start gap-2 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"ui-checkbox mt-0.5\"\n checked={form.allowRealIpFallback}\n onChange={(e) => onAllowRealIpFallbackChange(e.target.checked)}\n />\n <span>\n <span className=\"font-medium\">{g.allowRealIpFallback}</span>\n <span className=\"mt-0.5 block text-xs text-fg-subtle\">{g.allowRealIpFallbackHint}</span>\n </span>\n </label>\n </div>\n );\n}\n\nfunction GatewayAdvancedFields({\n g,\n form,\n onMaxSseConnectionsChange,\n onDeferModeChange,\n onDeferIdsChange,\n onSkipIdsChange,\n}: {\n g: GatewaySettingsMessages;\n form: GatewaySettingsState;\n onMaxSseConnectionsChange: (value: number) => void;\n onDeferModeChange: (mode: GatewaySettingsState['channelConnectDeferMode']) => void;\n onDeferIdsChange: (ids: string[]) => void;\n onSkipIdsChange: (ids: string[]) => void;\n}) {\n return (\n <div className=\"space-y-4\">\n <div>\n <label className=\"mb-1 block text-sm font-medium text-fg\" htmlFor=\"gateway-max-sse\">\n {g.maxSseConnections}\n </label>\n <input\n id=\"gateway-max-sse\"\n type=\"number\"\n min={1}\n className={cn(inputClassName(), 'max-w-xs font-mono text-xs')}\n value={form.maxSseConnections}\n onChange={(e) => {\n const n = Number(e.target.value);\n if (Number.isFinite(n)) onMaxSseConnectionsChange(Math.max(1, Math.floor(n)));\n }}\n />\n <p className=\"mt-1 text-xs text-fg-subtle\">{g.maxSseConnectionsHint}</p>\n </div>\n\n <div className=\"space-y-2 border-t border-edge pt-4\">\n <label className=\"text-sm font-medium text-fg\" htmlFor=\"gateway-channel-defer-mode\">\n {g.channelConnectDeferMode}\n </label>\n <select\n id=\"gateway-channel-defer-mode\"\n value={form.channelConnectDeferMode}\n onChange={(e) =>\n onDeferModeChange(e.target.value as GatewaySettingsState['channelConnectDeferMode'])\n }\n className={inputClassName()}\n >\n <option value=\"auto\">{g.channelConnectDeferModeAuto}</option>\n <option value=\"off\">{g.channelConnectDeferModeOff}</option>\n <option value=\"explicit\">{g.channelConnectDeferModeExplicit}</option>\n </select>\n <p className=\"text-xs text-fg-subtle\">{g.channelConnectDeferModeHint}</p>\n </div>\n\n {form.channelConnectDeferMode === 'explicit' ? (\n <GatewayStringListField\n title={g.channelConnectDeferIds}\n hint={g.channelConnectDeferIdsHint}\n emptyText={g.channelIdListEmpty}\n placeholder={g.channelIdListPlaceholder}\n values={form.channelConnectDeferIds}\n maxItems={MAX_CHANNEL_DEFER_LIST_SIZE}\n onChange={onDeferIdsChange}\n />\n ) : null}\n\n {form.channelConnectDeferMode !== 'off' ? (\n <GatewayStringListField\n title={g.channelConnectDeferSkipIds}\n hint={g.channelConnectDeferSkipIdsHint}\n emptyText={g.channelIdListEmpty}\n placeholder={g.channelIdListPlaceholder}\n values={form.channelConnectDeferSkipIds}\n maxItems={MAX_CHANNEL_DEFER_LIST_SIZE}\n onChange={onSkipIdsChange}\n />\n ) : null}\n </div>\n );\n}\n\nfunction GatewayStringListField({\n title,\n hint,\n emptyText,\n placeholder,\n values,\n maxItems,\n onChange,\n children,\n}: {\n title: string;\n hint: string;\n emptyText: string;\n placeholder: string;\n values: string[];\n maxItems: number;\n onChange: (values: string[]) => void;\n children?: ReactNode;\n}) {\n const addValue = useCallback(\n (raw: string) => {\n const next = raw.trim();\n if (!next || values.includes(next) || values.length >= maxItems) return;\n onChange([...values, next]);\n },\n [maxItems, onChange, values],\n );\n\n return (\n <div className=\"space-y-2 border-t border-edge pt-4\">\n <div className=\"text-sm font-medium text-fg\">{title}</div>\n <p className=\"text-xs text-fg-subtle\">{hint}</p>\n {values.length === 0 ? (\n <p className=\"text-xs text-fg-muted\">{emptyText}</p>\n ) : (\n <div className=\"flex flex-wrap gap-1.5\">\n {values.map((value) => (\n <span\n key={value}\n className=\"inline-flex items-center gap-1 rounded-md border border-edge bg-surface-panel px-2 py-0.5 font-mono text-xs text-fg\"\n >\n {value}\n <button\n type=\"button\"\n className={cn('text-fg-muted hover:text-fg', interaction.press)}\n aria-label={`Remove ${value}`}\n onClick={() => onChange(values.filter((x) => x !== value))}\n >\n ×\n </button>\n </span>\n ))}\n </div>\n )}\n <input\n className={cn(inputClassName(), 'font-mono text-xs')}\n placeholder={placeholder}\n disabled={values.length >= maxItems}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n addValue((e.target as HTMLInputElement).value);\n (e.target as HTMLInputElement).value = '';\n }\n }}\n />\n {children}\n </div>\n );\n}\n\nfunction CorsOriginsField({\n g,\n origins,\n onChange,\n}: {\n g: GatewaySettingsMessages;\n origins: string[];\n onChange: (origins: string[]) => void;\n}) {\n const hasWildcard = origins.includes('*');\n\n return (\n <GatewayStringListField\n title={g.corsOrigins}\n hint={g.corsOriginsHint}\n emptyText={g.corsOriginsEmpty}\n placeholder={g.corsOriginsPlaceholder}\n values={origins}\n maxItems={128}\n onChange={onChange}\n >\n {hasWildcard ? (\n <p className=\"rounded-lg border border-amber-200 bg-amber-50 px-3 py-2 text-xs text-amber-950 dark:border-amber-800 dark:bg-amber-950/40 dark:text-amber-100\">\n {g.corsOriginsWildcardWarning}\n </p>\n ) : null}\n </GatewayStringListField>\n );\n}\n\nfunction AuthRateLimitFields({\n g,\n rateLimit,\n onChange,\n}: {\n g: GatewaySettingsMessages;\n rateLimit: GatewaySettingsState['auth']['rateLimit'];\n onChange: (patch: Partial<GatewaySettingsState['auth']['rateLimit']>) => void;\n}) {\n return (\n <div className=\"space-y-3 border-t border-edge pt-4\">\n <div>\n <div className=\"text-sm font-medium text-fg\">{g.rateLimitTitle}</div>\n <p className=\"mt-1 text-xs text-fg-subtle\">{g.rateLimitHint}</p>\n </div>\n <label className=\"flex cursor-pointer items-center gap-2 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"ui-checkbox\"\n checked={rateLimit.enabled}\n onChange={(e) => onChange({ enabled: e.target.checked })}\n />\n {g.rateLimitEnabled}\n </label>\n <label className=\"flex cursor-pointer items-center gap-2 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"ui-checkbox\"\n checked={rateLimit.exemptLoopback}\n disabled={!rateLimit.enabled}\n onChange={(e) => onChange({ exemptLoopback: e.target.checked })}\n />\n {g.rateLimitExemptLoopback}\n </label>\n <div className=\"grid gap-3 sm:grid-cols-3\">\n <div>\n <label className=\"mb-1 block text-xs font-medium text-fg-muted\" htmlFor=\"gateway-rate-max\">\n {g.rateLimitMaxAttempts}\n </label>\n <input\n id=\"gateway-rate-max\"\n type=\"number\"\n min={1}\n className={inputClassName()}\n value={rateLimit.maxAttempts}\n disabled={!rateLimit.enabled}\n onChange={(e) => {\n const n = Number(e.target.value);\n if (Number.isFinite(n)) onChange({ maxAttempts: Math.max(1, Math.floor(n)) });\n }}\n />\n </div>\n <div>\n <label className=\"mb-1 block text-xs font-medium text-fg-muted\" htmlFor=\"gateway-rate-window\">\n {g.rateLimitWindowMinutes}\n </label>\n <input\n id=\"gateway-rate-window\"\n type=\"number\"\n min={1}\n className={inputClassName()}\n value={Math.round(rateLimit.windowMs / 60_000)}\n disabled={!rateLimit.enabled}\n onChange={(e) => {\n const n = Number(e.target.value);\n if (Number.isFinite(n) && n > 0) onChange({ windowMs: Math.floor(n) * 60_000 });\n }}\n />\n </div>\n <div>\n <label className=\"mb-1 block text-xs font-medium text-fg-muted\" htmlFor=\"gateway-rate-block\">\n {g.rateLimitBlockMinutes}\n </label>\n <input\n id=\"gateway-rate-block\"\n type=\"number\"\n min={1}\n className={inputClassName()}\n value={Math.round(rateLimit.blockDurationMs / 60_000)}\n disabled={!rateLimit.enabled}\n onChange={(e) => {\n const n = Number(e.target.value);\n if (Number.isFinite(n) && n > 0) onChange({ blockDurationMs: Math.floor(n) * 60_000 });\n }}\n />\n </div>\n </div>\n </div>\n );\n}\n\nfunction SecretCredentialField({\n g,\n id,\n label,\n help,\n placeholder,\n value,\n show,\n copied,\n onToggleShow,\n onCopy,\n onChange,\n}: {\n g: GatewaySettingsMessages;\n id: string;\n label: string;\n help: string;\n placeholder: string;\n value: string;\n show: boolean;\n copied?: boolean;\n onToggleShow: () => void;\n onCopy?: () => void;\n onChange: (v: string) => void;\n}) {\n return (\n <div className=\"flex flex-col gap-1.5\">\n <label className=\"text-sm font-medium text-fg\" htmlFor={id}>\n {label}\n </label>\n <div className=\"flex flex-wrap gap-2\">\n <input\n id={id}\n className={cn(inputClassName(), 'min-w-0 flex-1 font-mono text-xs')}\n type={show ? 'text' : 'password'}\n autoComplete=\"off\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n />\n {value && onCopy ? (\n <Button type=\"button\" variant=\"secondary\" className=\"px-2 py-1 text-xs\" onClick={onCopy}>\n {copied ? <Check className=\"size-3.5\" /> : <Copy className=\"size-3.5\" />}\n {copied ? g.copied : g.copy}\n </Button>\n ) : null}\n <Button type=\"button\" variant=\"secondary\" className=\"px-2 py-1 text-xs\" onClick={onToggleShow}>\n {show ? <EyeOff className=\"size-3.5\" /> : <Eye className=\"size-3.5\" />}\n {show ? g.hide : g.show}\n </Button>\n </div>\n <p className=\"text-xs text-fg-subtle\">{help}</p>\n </div>\n );\n}\n","import { Clock, ExternalLink, FileText, Heart, Loader2, MessageSquare, Play, RefreshCw, type LucideIcon } from 'lucide-react';\nimport { useCallback, useEffect, useMemo, useReducer, useRef, type ReactNode } from 'react';\n\nimport { uiPatchReducer } from '@/lib/settings-form-draft';\nimport { useSearchParams } from 'react-router-dom';\nimport useSWR from 'swr';\n\nimport { Button } from '@/components/ui/button';\nimport { getSessionChatIds, type ChannelStatus, type SessionChatId } from '@/features/cron/cron-api';\nimport { formatRecipientOptionLabel } from '@/features/cron/cron-utils';\nimport { useGatewayConfigSwr } from '@/features/gateway/gateway-config-swr';\nimport { channelsStatusSwrKey, fetchChannelsStatusSwr } from '@/features/settings/channels-status-swr';\nimport {\n normalizeHeartbeatFromConfig,\n patchHeartbeatSettings,\n putHeartbeatMd,\n triggerHeartbeat,\n} from '@/features/settings/heartbeat-config-api';\nimport { fetchHeartbeatMdSwr, heartbeatMdSwrKey } from '@/features/settings/heartbeat-md-swr';\nimport type { HeartbeatSettingsState } from '@/features/settings/heartbeat-settings.types';\nimport { SaveBarControls } from '@/features/settings/save-bar/save-bar-controls';\nimport { useSaveBarRegistration } from '@/features/settings/save-bar/use-save-bar-registration';\nimport { nativeSelectMaxWidthClass, selectControlBaseClass, settingsInputFocusClass } from '@/lib/form-field-width';\nimport { cn } from '@/lib/cn';\nimport { interaction } from '@/lib/interaction';\nimport { messages, type HeartbeatSettingsMessages } from '@/i18n/messages';\nimport { ScheduleField } from '@/features/scheduling/schedule-field';\nimport { docsGuidePageUrl } from '@/navigation';\nimport { useGatewayStore } from '@/stores/gateway-store';\nimport { useLocaleStore } from '@/stores/locale-store';\nimport { useAsyncResource } from '@/lib/use-async-resource';\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\nfunction selectClassName(): string {\n return cn(selectControlBaseClass, nativeSelectMaxWidthClass);\n}\n\ntype CronMessages = ReturnType<typeof messages>['cron'];\ntype HeartbeatSettingsTabId = 'schedule' | 'delivery' | 'prompt' | 'document';\n\nconst HEARTBEAT_SETTINGS_TABS: readonly HeartbeatSettingsTabId[] = [\n 'schedule',\n 'delivery',\n 'prompt',\n 'document',\n];\n\nconst HEARTBEAT_SETTINGS_TAB_ICONS: Record<HeartbeatSettingsTabId, LucideIcon> = {\n schedule: Clock,\n delivery: MessageSquare,\n prompt: Heart,\n document: FileText,\n};\n\nfunction parseHeartbeatSettingsTab(raw: string | null): HeartbeatSettingsTabId {\n if (raw && HEARTBEAT_SETTINGS_TABS.includes(raw as HeartbeatSettingsTabId)) {\n return raw as HeartbeatSettingsTabId;\n }\n return 'schedule';\n}\n\nfunction heartbeatSettingsTabLabel(h: HeartbeatSettingsMessages, tab: HeartbeatSettingsTabId): string {\n if (tab === 'schedule') return h.tabSchedule;\n if (tab === 'delivery') return h.tabDelivery;\n if (tab === 'prompt') return h.tabPrompt;\n return h.tabDocument;\n}\n\nfunction heartbeatSettingsTabHint(h: HeartbeatSettingsMessages, tab: HeartbeatSettingsTabId): string {\n if (tab === 'schedule') return h.scheduleTabHint;\n if (tab === 'delivery') return h.deliveryTabHint;\n if (tab === 'prompt') return h.promptTabHint;\n return h.documentTabHint;\n}\n\ntype HeartbeatFormDraft = {\n form: HeartbeatSettingsState | null;\n baseline: HeartbeatSettingsState | null;\n};\n\ntype HeartbeatFormAction =\n | { type: 'reset' }\n | { type: 'sync'; value: HeartbeatSettingsState }\n | { type: 'patch'; patch: Partial<HeartbeatSettingsState> }\n | { type: 'discard' }\n | { type: 'saved'; value: HeartbeatSettingsState };\n\nfunction heartbeatFormReducer(state: HeartbeatFormDraft, action: HeartbeatFormAction): HeartbeatFormDraft {\n switch (action.type) {\n case 'reset':\n return { form: null, baseline: null };\n case 'sync': {\n const snapshot = structuredClone(action.value);\n return { form: snapshot, baseline: structuredClone(snapshot) };\n }\n case 'patch':\n return { ...state, form: state.form ? { ...state.form, ...action.patch } : null };\n case 'discard':\n return state.baseline\n ? { form: structuredClone(state.baseline), baseline: state.baseline }\n : state;\n case 'saved': {\n const snapshot = structuredClone(action.value);\n return { form: snapshot, baseline: structuredClone(snapshot) };\n }\n }\n}\n\ntype HeartbeatDocDraft = { doc: string; baseline: string };\n\ntype HeartbeatDocAction =\n | { type: 'reset' }\n | { type: 'sync'; value: string }\n | { type: 'set'; value: string }\n | { type: 'discard' }\n | { type: 'saved'; value: string };\n\nfunction heartbeatDocReducer(state: HeartbeatDocDraft, action: HeartbeatDocAction): HeartbeatDocDraft {\n switch (action.type) {\n case 'reset':\n return { doc: '', baseline: '' };\n case 'sync':\n return { doc: action.value, baseline: action.value };\n case 'set':\n return { ...state, doc: action.value };\n case 'discard':\n return { ...state, doc: state.baseline };\n case 'saved':\n return { doc: action.value, baseline: action.value };\n }\n}\n\nfunction workspacePathFromConfig(cfg: unknown): string {\n if (!cfg || typeof cfg !== 'object' || Array.isArray(cfg)) return '';\n const agents = (cfg as { agents?: unknown }).agents;\n if (!agents || typeof agents !== 'object' || Array.isArray(agents)) return '';\n const defaults = (agents as { defaults?: unknown }).defaults;\n if (!defaults || typeof defaults !== 'object' || Array.isArray(defaults)) return '';\n const w = (defaults as { workspace?: unknown }).workspace;\n return typeof w === 'string' ? w : '';\n}\n\ntype HeartbeatUi = {\n saving: boolean;\n error: string | null;\n triggerLoading: boolean;\n triggerOk: boolean;\n triggerError: string | null;\n};\n\nconst initialHeartbeatUi: HeartbeatUi = {\n saving: false,\n error: null,\n triggerLoading: false,\n triggerOk: false,\n triggerError: null,\n};\n\nexport function HeartbeatSettingsPanel() {\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const h = m.heartbeatSettings;\n const token = useGatewayStore((st) => st.token);\n const hasToken = Boolean(token);\n const [searchParams, setSearchParams] = useSearchParams();\n const activeTab = parseHeartbeatSettingsTab(searchParams.get('tab'));\n const setActiveTab = useCallback(\n (tab: HeartbeatSettingsTabId) => {\n setSearchParams(\n (prev) => {\n const next = new URLSearchParams(prev);\n if (tab === 'schedule') next.delete('tab');\n else next.set('tab', tab);\n return next;\n },\n { replace: true },\n );\n },\n [setSearchParams],\n );\n\n const [formDraft, dispatchForm] = useReducer(heartbeatFormReducer, { form: null, baseline: null });\n const form = formDraft.form;\n const baseline = formDraft.baseline;\n const [docDraft, dispatchDoc] = useReducer(heartbeatDocReducer, { doc: '', baseline: '' });\n const doc = docDraft.doc;\n const docBaseline = docDraft.baseline;\n const [ui, dispatchUi] = useReducer(uiPatchReducer<HeartbeatUi>, initialHeartbeatUi);\n const { saving, error, triggerLoading, triggerOk, triggerError } = ui;\n const configDirtyRef = useRef(false);\n const docDirtyRef = useRef(false);\n\n const {\n data: cfgData,\n error: cfgErr,\n isLoading: cfgLoading,\n mutate: mutCfg,\n } = useGatewayConfigSwr(hasToken);\n const {\n data: mdContent,\n error: mdErr,\n isLoading: mdLoading,\n mutate: mutMd,\n } = useSWR(hasToken ? heartbeatMdSwrKey() : null, fetchHeartbeatMdSwr, { revalidateOnFocus: false });\n const { data: channels = [] } = useSWR(hasToken ? channelsStatusSwrKey() : null, fetchChannelsStatusSwr, {\n revalidateOnFocus: false,\n });\n\n const workspacePath = useMemo(\n () => workspacePathFromConfig(cfgData?.payload?.config),\n [cfgData],\n );\n\n const heartbeatParsed = useMemo(\n () => normalizeHeartbeatFromConfig(cfgData?.payload?.config ?? {}),\n [cfgData],\n );\n\n const dirtyConfig = useMemo(() => {\n if (!form || !baseline) return false;\n return JSON.stringify(form) !== JSON.stringify(baseline);\n }, [form, baseline]);\n\n const dirtyDoc = doc !== docBaseline;\n\n useEffect(() => {\n if (!hasToken) {\n dispatchForm({ type: 'reset' });\n configDirtyRef.current = false;\n return;\n }\n if (cfgData === undefined) return;\n if (!configDirtyRef.current) {\n dispatchForm({ type: 'sync', value: heartbeatParsed });\n }\n }, [hasToken, cfgData, heartbeatParsed]);\n\n useEffect(() => {\n if (!hasToken) {\n dispatchDoc({ type: 'reset' });\n docDirtyRef.current = false;\n return;\n }\n if (mdContent === undefined) return;\n if (!docDirtyRef.current) {\n dispatchDoc({ type: 'sync', value: mdContent });\n }\n }, [hasToken, mdContent]);\n\n const fetchError =\n cfgErr instanceof Error\n ? cfgErr.message\n : cfgErr\n ? String(cfgErr)\n : mdErr instanceof Error\n ? mdErr.message\n : mdErr\n ? String(mdErr)\n : null;\n\n const loading = Boolean(\n hasToken &&\n (cfgData === undefined || mdContent === undefined) &&\n !fetchError &&\n (cfgLoading || mdLoading),\n );\n\n const deliveryTarget = form?.target.trim() ?? '';\n const { data: sessionChatIds, setData: setSessionChatIds } = useAsyncResource(\n () => getSessionChatIds(deliveryTarget),\n [hasToken, deliveryTarget],\n { enabled: hasToken && deliveryTarget.length > 0, initial: [] as SessionChatId[], errorData: [] },\n );\n\n const refreshSessionChatIds = useCallback(() => {\n if (!deliveryTarget) return;\n void getSessionChatIds(deliveryTarget).then(setSessionChatIds);\n }, [deliveryTarget, setSessionChatIds]);\n\n const runHeartbeatNow = useCallback(async () => {\n dispatchUi({ type: 'patch', patch: { triggerLoading: true, triggerOk: false, triggerError: null } });\n try {\n await triggerHeartbeat();\n dispatchUi({ type: 'patch', patch: { triggerOk: true } });\n window.setTimeout(() => dispatchUi({ type: 'patch', patch: { triggerOk: false } }), 3000);\n } catch (e) {\n dispatchUi({\n type: 'patch',\n patch: { triggerError: e instanceof Error ? e.message : h.triggerError },\n });\n } finally {\n dispatchUi({ type: 'patch', patch: { triggerLoading: false } });\n }\n }, [h.triggerError]);\n\n const update = useCallback((patch: Partial<HeartbeatSettingsState>) => {\n configDirtyRef.current = true;\n dispatchForm({ type: 'patch', patch });\n }, []);\n\n const dirty = dirtyConfig || dirtyDoc;\n\n const discard = useCallback(() => {\n dispatchForm({ type: 'discard' });\n dispatchDoc({ type: 'discard' });\n configDirtyRef.current = false;\n docDirtyRef.current = false;\n dispatchUi({ type: 'patch', patch: { error: null } });\n }, []);\n\n const save = useCallback(async () => {\n if (!form || saving) return;\n dispatchUi({ type: 'patch', patch: { saving: true, error: null } });\n try {\n if (dirtyConfig) {\n await patchHeartbeatSettings(form);\n dispatchForm({ type: 'saved', value: form });\n configDirtyRef.current = false;\n }\n if (dirtyDoc) {\n await putHeartbeatMd(doc);\n dispatchDoc({ type: 'saved', value: doc });\n docDirtyRef.current = false;\n }\n } catch (e) {\n const fallback = dirtyConfig ? h.saveConfigError : h.saveDocError;\n const message = e instanceof Error ? e.message : fallback;\n dispatchUi({ type: 'patch', patch: { error: message } });\n throw new Error(message);\n } finally {\n dispatchUi({ type: 'patch', patch: { saving: false } });\n }\n }, [dirtyConfig, dirtyDoc, doc, form, h.saveConfigError, h.saveDocError, saving]);\n\n useSaveBarRegistration({ id: 'heartbeat', dirty, saving, save, discard });\n\n if (!hasToken) {\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\">{m.settingsSections.heartbeat}</h1>\n <p className=\"text-sm text-fg-muted\">{h.needToken}</p>\n </div>\n );\n }\n\n if (loading) {\n return (\n <div className=\"mx-auto flex w-full max-w-app-main flex-col gap-3 px-4 py-8\">\n <div className=\"flex items-center gap-2 text-sm text-fg-muted\">\n <Loader2 className=\"size-4 animate-spin\" />\n {h.loading}\n </div>\n </div>\n );\n }\n\n if (!form) {\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\">{error ?? fetchError ?? h.loadError}</p>\n <Button\n type=\"button\"\n variant=\"secondary\"\n onClick={() => {\n void mutCfg();\n void mutMd();\n }}\n >\n {h.retry}\n </Button>\n </div>\n );\n }\n\n return (\n <div\n className=\"mx-auto flex w-full max-w-app-main flex-col gap-4 px-4 py-6\"\n aria-busy={saving}\n data-has-baseline={baseline ? '1' : '0'}\n >\n <header className=\"flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"min-w-0\">\n <h1 className=\"text-lg font-semibold tracking-tight text-fg\">{m.settingsSections.heartbeat}</h1>\n <p className=\"mt-1 text-sm text-fg-muted\">{h.subtitle}</p>\n <a\n href={docsGuidePageUrl(language, 'heartbeat')}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"mt-1 inline-flex items-center gap-1 text-sm text-accent hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/40\"\n >\n {h.docsLink}\n <ExternalLink className=\"size-3.5\" />\n </a>\n </div>\n <div className=\"flex shrink-0 flex-wrap items-center gap-2\">\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"inline-flex items-center gap-2\"\n disabled={triggerLoading}\n onClick={() => void runHeartbeatNow()}\n >\n {triggerLoading ? (\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n ) : (\n <Play className=\"size-4\" strokeWidth={1.75} aria-hidden />\n )}\n {triggerLoading ? h.triggering : h.triggerNow}\n </Button>\n {triggerOk ? <span className=\"text-sm text-fg-muted\">{h.triggered}</span> : null}\n </div>\n </header>\n\n <SaveBarControls />\n\n {workspacePath ? (\n <p className=\"text-xs text-fg-subtle\">\n {h.workspaceLabel}: <span className=\"font-mono text-fg-muted\">{workspacePath}</span>\n </p>\n ) : null}\n\n {error ? <p className=\"text-sm text-red-600 dark:text-red-400\">{error}</p> : null}\n {triggerError ? <p className=\"text-sm text-red-600 dark:text-red-400\">{triggerError}</p> : null}\n\n <HeartbeatSettingsTabs h={h} activeTab={activeTab} onChange={setActiveTab} />\n\n <HeartbeatTabPanel h={h} id=\"schedule\" activeTab={activeTab}>\n <HeartbeatScheduleFields h={h} form={form} update={update} />\n </HeartbeatTabPanel>\n\n <HeartbeatTabPanel h={h} id=\"delivery\" activeTab={activeTab}>\n <HeartbeatDeliveryFields\n h={h}\n cron={m.cron}\n form={form}\n channels={channels}\n sessionChatIds={sessionChatIds}\n onRefreshChatIds={refreshSessionChatIds}\n update={update}\n inputClassName={inputClassName}\n selectClassName={selectClassName}\n />\n </HeartbeatTabPanel>\n\n <HeartbeatTabPanel h={h} id=\"prompt\" activeTab={activeTab}>\n <HeartbeatPromptFields h={h} form={form} update={update} inputClassName={inputClassName} />\n </HeartbeatTabPanel>\n\n <HeartbeatTabPanel h={h} id=\"document\" activeTab={activeTab}>\n <p className=\"mb-3 text-xs text-fg-subtle\">{h.docHint}</p>\n <textarea\n className={cn(inputClassName(), 'min-h-72 resize-y font-mono text-xs leading-relaxed')}\n value={doc}\n onChange={(e) => {\n docDirtyRef.current = true;\n dispatchDoc({ type: 'set', value: e.target.value });\n }}\n spellCheck={false}\n aria-label={h.docSection}\n data-doc-in-sync={doc === docBaseline ? 'true' : 'false'}\n />\n </HeartbeatTabPanel>\n </div>\n );\n}\n\nfunction HeartbeatSettingsTabs({\n h,\n activeTab,\n onChange,\n}: {\n h: HeartbeatSettingsMessages;\n activeTab: HeartbeatSettingsTabId;\n onChange: (tab: HeartbeatSettingsTabId) => void;\n}) {\n return (\n <nav\n aria-label={h.tabsAriaLabel}\n className=\"-mx-1 flex gap-1 overflow-x-auto px-1 pb-1\"\n role=\"tablist\"\n onKeyDown={(event) => {\n if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight') return;\n event.preventDefault();\n const currentIndex = HEARTBEAT_SETTINGS_TABS.indexOf(activeTab);\n const delta = event.key === 'ArrowRight' ? 1 : -1;\n const nextIndex = (currentIndex + delta + HEARTBEAT_SETTINGS_TABS.length) % HEARTBEAT_SETTINGS_TABS.length;\n onChange(HEARTBEAT_SETTINGS_TABS[nextIndex]);\n }}\n >\n {HEARTBEAT_SETTINGS_TABS.map((tab) => {\n const Icon = HEARTBEAT_SETTINGS_TAB_ICONS[tab];\n const selected = tab === activeTab;\n return (\n <button\n key={tab}\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n id={`heartbeat-settings-tab-${tab}`}\n aria-controls={`heartbeat-settings-panel-${tab}`}\n className={cn(\n 'inline-flex shrink-0 items-center gap-1.5 rounded-lg px-3 py-2 text-sm font-medium transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent',\n interaction.press,\n selected ? 'bg-accent-soft text-accent-fg' : 'text-fg-muted hover:bg-surface-hover hover:text-fg',\n )}\n onClick={() => onChange(tab)}\n >\n <Icon className=\"size-3.5 shrink-0\" strokeWidth={1.75} aria-hidden />\n <span>{heartbeatSettingsTabLabel(h, tab)}</span>\n </button>\n );\n })}\n </nav>\n );\n}\n\nfunction HeartbeatTabPanel({\n h,\n id,\n activeTab,\n children,\n}: {\n h: HeartbeatSettingsMessages;\n id: HeartbeatSettingsTabId;\n activeTab: HeartbeatSettingsTabId;\n children: ReactNode;\n}) {\n if (activeTab !== id) return null;\n\n return (\n <section\n id={`heartbeat-settings-panel-${id}`}\n role=\"tabpanel\"\n aria-labelledby={`heartbeat-settings-tab-${id}`}\n className=\"rounded-2xl border border-edge bg-surface-base px-4 py-5 sm:px-5\"\n >\n <div className=\"mb-5\">\n <div className=\"text-sm font-semibold text-fg\">{heartbeatSettingsTabLabel(h, id)}</div>\n <p className=\"mt-1 text-xs text-fg-subtle\">{heartbeatSettingsTabHint(h, id)}</p>\n </div>\n <div className=\"space-y-4\">{children}</div>\n </section>\n );\n}\n\nfunction HeartbeatScheduleFields({\n h,\n form,\n update,\n}: {\n h: HeartbeatSettingsMessages;\n form: HeartbeatSettingsState;\n update: (patch: Partial<HeartbeatSettingsState>) => void;\n}) {\n return (\n <>\n <label className=\"flex cursor-pointer items-center gap-2 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"ui-checkbox\"\n checked={form.enabled}\n onChange={(event) => update({ enabled: event.target.checked })}\n />\n {h.enable}\n </label>\n\n <ScheduleField\n kind=\"interval\"\n label={h.interval}\n valueMs={form.intervalMs}\n onChangeMs={(intervalMs) => update({ intervalMs })}\n labels={{ secondsLabel: h.intervalSecondsLabel, presets: h.intervalPresets }}\n hint={`${h.intervalHintPreset} ${h.intervalHint}`}\n />\n\n <ScheduleField\n kind=\"active-hours\"\n label={h.activeHoursTitle}\n value={form.activeHours}\n onChange={(activeHours) => update({ activeHours })}\n labels={{\n start: h.activeStart,\n end: h.activeEnd,\n timezone: h.activeTimezone,\n add: h.addActiveHours,\n clear: h.clearActiveHours,\n }}\n hint={h.activeHoursHint}\n />\n </>\n );\n}\n\nfunction HeartbeatDeliveryFields({\n h,\n cron: c,\n form,\n channels,\n sessionChatIds,\n onRefreshChatIds,\n update,\n inputClassName: inputCn,\n selectClassName: selectCn,\n}: {\n h: HeartbeatSettingsMessages;\n cron: CronMessages;\n form: HeartbeatSettingsState;\n channels: ChannelStatus[];\n sessionChatIds: SessionChatId[];\n onRefreshChatIds: () => void;\n update: (patch: Partial<HeartbeatSettingsState>) => void;\n inputClassName: typeof inputClassName;\n selectClassName: typeof selectClassName;\n}) {\n const channelNames = useMemo(() => new Set(channels.map((channel) => channel.name)), [channels]);\n const targetTrim = form.target.trim();\n const showCustomChannel = Boolean(targetTrim && !channelNames.has(targetTrim));\n\n return (\n <>\n <p className=\"text-xs text-fg-subtle\">{h.deliveryHint}</p>\n\n <label className=\"flex flex-col gap-1\">\n <span className=\"text-xs font-medium text-fg-muted\">{c.channel}</span>\n <select\n className={selectCn()}\n value={targetTrim}\n onChange={(event) => {\n const value = event.target.value.trim();\n update({ target: value, targetChatId: '' });\n }}\n >\n <option value=\"\">{h.channelNone}</option>\n {showCustomChannel ? (\n <option value={targetTrim}>\n {targetTrim} ({h.customChannelSuffix})\n </option>\n ) : null}\n {channels.map((channel) => (\n <option key={channel.name} value={channel.name} disabled={!channel.enabled}>\n {channel.name} {!channel.enabled ? '(disabled)' : ''}\n </option>\n ))}\n </select>\n </label>\n\n {targetTrim ? (\n <div className=\"flex flex-col gap-1\">\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"text-xs font-medium text-fg-muted\">{c.recipient}</span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"h-7 gap-1 px-2 text-xs\"\n title={c.refreshRecipientHint}\n onClick={onRefreshChatIds}\n >\n <RefreshCw className=\"size-3.5\" strokeWidth={1.75} aria-hidden />\n {c.refreshList}\n </Button>\n </div>\n <div className=\"flex gap-2\">\n <input\n type=\"text\"\n className={cn(inputCn(), 'min-w-0 flex-1')}\n value={form.targetChatId}\n onChange={(event) => update({ targetChatId: event.target.value })}\n placeholder={c.recipientPlaceholder}\n autoComplete=\"off\"\n />\n <select\n className={cn(selectCn(), 'max-w-40 shrink-0 text-xs')}\n value={form.targetChatId}\n onChange={(event) => {\n const value = event.target.value;\n if (value) update({ targetChatId: value });\n }}\n >\n <option value=\"\">{c.selectRecipient}</option>\n {sessionChatIds.length > 0 ? (\n sessionChatIds.map((item) => (\n <option key={`${item.channel}-${item.chatId}`} value={item.chatId}>\n {formatRecipientOptionLabel(item, c.lastActiveLabels)}\n </option>\n ))\n ) : (\n <option value=\"\" disabled>\n {c.noRecentChatsOption}\n </option>\n )}\n </select>\n </div>\n <p className=\"text-xs text-fg-muted\">\n {sessionChatIds.length > 0 ? c.enterManuallyOrSelect : c.noRecentChats}\n </p>\n </div>\n ) : null}\n </>\n );\n}\n\nfunction HeartbeatPromptFields({\n h,\n form,\n update,\n inputClassName: inputCn,\n}: {\n h: HeartbeatSettingsMessages;\n form: HeartbeatSettingsState;\n update: (patch: Partial<HeartbeatSettingsState>) => void;\n inputClassName: typeof inputClassName;\n}) {\n return (\n <>\n <label className=\"flex cursor-pointer items-start gap-2 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"ui-checkbox mt-0.5\"\n checked={form.includeSystemPromptSection}\n onChange={(event) => update({ includeSystemPromptSection: event.target.checked })}\n />\n <span>\n {h.includeSystemPromptSection}\n <span className=\"mt-1 block text-xs text-fg-subtle\">{h.includeSystemPromptSectionHint}</span>\n </span>\n </label>\n\n <div>\n <div className=\"mb-1 text-sm font-medium text-fg\">{h.prompt}</div>\n <textarea\n className={cn(inputCn(), 'min-h-36 resize-y font-mono text-xs')}\n value={form.prompt}\n onChange={(event) => update({ prompt: event.target.value })}\n placeholder={h.promptPlaceholder}\n />\n <p className=\"mt-1 text-xs text-fg-subtle\">{h.promptHint}</p>\n </div>\n\n <div>\n <div className=\"mb-1 text-sm font-medium text-fg\">{h.ackMaxChars}</div>\n <input\n type=\"number\"\n min={1}\n className={inputCn()}\n value={form.ackMaxChars === '' ? '' : form.ackMaxChars}\n onChange={(event) => {\n const value = event.target.value;\n if (value === '') {\n update({ ackMaxChars: '' });\n return;\n }\n const parsedValue = parseInt(value, 10);\n update({ ackMaxChars: Number.isFinite(parsedValue) ? parsedValue : '' });\n }}\n placeholder={h.ackDefaultPlaceholder}\n />\n <p className=\"mt-1 text-xs text-fg-subtle\">{h.ackMaxCharsHint}</p>\n </div>\n\n <label className=\"flex cursor-pointer items-start gap-2 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"ui-checkbox mt-0.5\"\n checked={form.isolatedSession}\n onChange={(event) => update({ isolatedSession: event.target.checked })}\n />\n <span>\n {h.isolatedSession}\n <span className=\"mt-1 block text-xs text-fg-subtle\">{h.isolatedSessionHint}</span>\n </span>\n </label>\n </>\n );\n}\n","import { useCallback, useState } from 'react';\nimport { useSWRConfig } from 'swr';\n\nimport { revalidateGatewayConfig } from '@/features/gateway/gateway-config-swr';\nimport {\n restartGatewayAfterConfigChange,\n waitForGatewayApiReady,\n waitForPairingReadyAfterRestart,\n} from '@/features/tunnel/gateway-restart';\nimport { enableLanMobilePairing, type MobilePairContextResponse } from '@/features/tunnel/tunnel-api';\n\nexport function useEnableLanPairing(\n gatewayToken: string,\n onSuccess?: (context: MobilePairContextResponse) => void,\n) {\n const { mutate: globalMutate } = useSWRConfig();\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [confirmOpen, setConfirmOpen] = useState(false);\n\n const refreshPairingState = useCallback(async () => {\n await Promise.all([\n globalMutate('tunnel-pair-context'),\n globalMutate('tunnel-pair'),\n globalMutate('tunnel-status'),\n revalidateGatewayConfig(),\n ]);\n }, [globalMutate]);\n\n const runEnableLanPairing = useCallback(async () => {\n if (!gatewayToken || busy) return;\n setBusy(true);\n setError(null);\n try {\n const result = await enableLanMobilePairing();\n if (!result.ok) {\n throw new Error('Failed to enable LAN pairing');\n }\n\n if (result.requiresRestart) {\n const restart = await restartGatewayAfterConfigChange();\n if (!restart.ok) {\n throw new Error(restart.message ?? 'Gateway restart failed');\n }\n const apiReady = await waitForGatewayApiReady(gatewayToken);\n if (!apiReady) {\n throw new Error('Gateway did not come back online in time');\n }\n }\n\n const context = result.requiresRestart\n ? await waitForPairingReadyAfterRestart()\n : result.context;\n if (!context?.pairingReady) {\n throw new Error('LAN pairing is still not ready after restart');\n }\n\n await refreshPairingState();\n onSuccess?.(context);\n setConfirmOpen(false);\n return context;\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Enable LAN pairing failed');\n return null;\n } finally {\n setBusy(false);\n }\n }, [busy, gatewayToken, onSuccess, refreshPairingState]);\n\n return {\n busy,\n error,\n confirmOpen,\n setConfirmOpen,\n runEnableLanPairing,\n clearError: () => setError(null),\n };\n}\n","import { Loader2, RefreshCw, Smartphone } from 'lucide-react';\nimport { Link } from 'react-router-dom';\n\nimport { Button } from '@/components/ui/button';\nimport { CopyTextRow } from '@/components/ui/copy-text-row';\nimport { ConfirmDialog } from '@/components/ui/confirm-dialog';\nimport { SettingsFormSection } from '@/features/settings/settings-form-section';\nimport type { MobilePairQrState } from '@/features/tunnel/use-mobile-pair-qr';\nimport { useEnableLanPairing } from '@/features/tunnel/use-enable-lan-pairing';\nimport { settingsInputFocusClass } from '@/lib/form-field-width';\nimport { cn } from '@/lib/cn';\nimport { messages } from '@/i18n/messages';\nimport { useLocaleStore } from '@/stores/locale-store';\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\nexport function MobilePairQrSection({\n pairQr,\n gatewayToken,\n streamlined = false,\n lanOnly = false,\n onRefreshQr,\n}: {\n pairQr: MobilePairQrState;\n gatewayToken: string;\n streamlined?: boolean;\n /** LAN remote-access tab: always show LAN pairing UI, never wait for public tunnel. */\n lanOnly?: boolean;\n onRefreshQr?: () => void;\n}) {\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const t = m.tunnelSettings;\n const lanCopy = lanOnly ? m.remoteAccess.lan : null;\n const copyLabels = {\n copy: t.pairCopyLink,\n copied: t.pairCopied,\n copyFailed: m.clipboard.copyFailed,\n };\n const {\n tunnelActive,\n tunnelStatus,\n tunnelQr,\n pairContext,\n pairBaseUrl,\n setPairBaseUrl,\n applySuggestedPairUrl,\n applyCandidateUrl,\n resetPairBaseFromContext,\n baseOk,\n localhostWarn,\n pairingBlocked,\n deepLink,\n qrPayload,\n qrDataUrl,\n qrGenFailed,\n encoding,\n } = pairQr;\n\n const enableLan = useEnableLanPairing(gatewayToken, (context) => {\n resetPairBaseFromContext(context.recommended.url);\n });\n\n const lanCandidates = pairContext?.candidates.filter((c) => c.kind === 'lan') ?? [];\n const suggestedUrl = lanOnly\n ? (lanCandidates.find((c) => c.reachable)?.url ?? lanCandidates[0]?.url ?? '').trim()\n : (pairContext?.recommended.url?.trim() ?? '');\n const showLanCandidatePicker = (lanOnly || !tunnelActive) && lanCandidates.length > 1;\n\n function renderLanCandidateList(tone: 'amber' | 'neutral') {\n if (lanCandidates.length === 0) return null;\n const itemClass =\n tone === 'amber'\n ? 'text-amber-950 dark:text-amber-100'\n : 'text-fg';\n const labelClass =\n tone === 'amber'\n ? 'text-amber-950/80 dark:text-amber-200/90'\n : 'text-fg-muted';\n return (\n <div>\n <div className={cn('text-xs font-medium', labelClass)}>\n {showLanCandidatePicker ? t.pairSelectCandidateTitle : t.pairCandidatesTitle}\n </div>\n <ul className=\"mt-1 space-y-1\">\n {lanCandidates.map((candidate) => (\n <li key={candidate.url}>\n <button\n type=\"button\"\n className={cn(\n 'w-full rounded-md border px-2 py-1.5 text-left font-mono text-[11px] transition-colors',\n tone === 'amber'\n ? 'border-amber-300/70 hover:bg-amber-100/80 dark:border-amber-800 dark:hover:bg-amber-950/50'\n : 'border-edge hover:bg-surface-panel',\n pairBaseUrl.trim() === candidate.url && 'border-accent bg-accent/5',\n itemClass,\n )}\n onClick={() => applyCandidateUrl(candidate.url)}\n >\n {candidate.label ? `${candidate.label}: ` : ''}\n {candidate.url}\n </button>\n </li>\n ))}\n </ul>\n {showLanCandidatePicker ? (\n <p className={cn('mt-1 text-[11px] leading-relaxed', labelClass)}>{t.pairSelectCandidateHint}</p>\n ) : null}\n </div>\n );\n }\n\n const effectiveStreamlined = streamlined && !lanOnly;\n\n if (effectiveStreamlined && !tunnelActive) {\n return (\n <SettingsFormSection>\n <div className=\"flex items-center gap-2 text-sm font-semibold text-fg\">\n <Smartphone className=\"size-4 text-accent\" strokeWidth={1.75} />\n {t.pairTitle}\n </div>\n <p className=\"mt-2 text-sm text-fg-muted\">{t.pairWaitingForTunnel}</p>\n </SettingsFormSection>\n );\n }\n\n const pairTitle = lanCopy?.pairTitle ?? t.pairTitle;\n const pairSubtitle = lanOnly\n ? (lanCopy?.pairSubtitle ?? t.pairSubtitle)\n : tunnelActive\n ? t.pairTunnelActive\n : t.pairSubtitle;\n const showRefreshButton = Boolean(onRefreshQr && (lanOnly || (streamlined && tunnelActive)));\n\n const sectionBody = (\n <>\n <div className={cn('flex flex-wrap items-start justify-between gap-2', effectiveStreamlined ? 'mb-2' : 'mb-3')}>\n <div>\n <div className=\"flex items-center gap-2 text-sm font-semibold text-fg\">\n <Smartphone className=\"size-4 text-accent\" strokeWidth={1.75} />\n {pairTitle}\n </div>\n {!effectiveStreamlined ? (\n <p className=\"mt-1 text-xs text-fg-subtle\">{pairSubtitle}</p>\n ) : (\n <p className=\"mt-1 text-xs text-fg-subtle\">{t.pairSubtitle}</p>\n )}\n </div>\n {showRefreshButton ? (\n <Button type=\"button\" variant=\"ghost\" className=\"shrink-0\" onClick={() => void onRefreshQr!()}>\n <RefreshCw className=\"size-4\" />\n {t.refreshQr}\n </Button>\n ) : null}\n </div>\n\n {pairingBlocked ? (\n <div className=\"mb-3 space-y-3 rounded-lg border border-amber-200 bg-amber-50 px-3 py-3 dark:border-amber-900/50 dark:bg-amber-950/30\">\n <div>\n <div className=\"text-sm font-medium text-amber-950 dark:text-amber-100\">{t.pairBlockedTitle}</div>\n <p className=\"mt-1 text-xs leading-relaxed text-amber-900 dark:text-amber-200\">{t.pairBlockedLoopbackBody}</p>\n </div>\n {suggestedUrl ? (\n <div className=\"space-y-2\">\n <div>\n <div className=\"text-xs font-medium text-amber-950/80 dark:text-amber-200/90\">{t.pairSuggestedLanLabel}</div>\n <div className=\"mt-0.5 break-all font-mono text-xs text-amber-950 dark:text-amber-100\">{suggestedUrl}</div>\n </div>\n <Button type=\"button\" variant=\"secondary\" className=\"w-full sm:w-auto\" onClick={applySuggestedPairUrl}>\n {t.pairUseSuggestedUrl}\n </Button>\n </div>\n ) : null}\n {lanCandidates.length > 0 ? renderLanCandidateList('amber') : null}\n <div className=\"flex flex-col gap-2 sm:flex-row sm:flex-wrap\">\n <Button\n type=\"button\"\n className=\"w-full sm:w-auto\"\n disabled={enableLan.busy || !gatewayToken}\n onClick={() => enableLan.setConfirmOpen(true)}\n >\n {enableLan.busy ? <Loader2 className=\"size-3.5 animate-spin\" /> : null}\n {enableLan.busy ? t.pairEnableLanEnabling : t.pairEnableLanButton}\n </Button>\n </div>\n {enableLan.error ? (\n <p className=\"text-xs text-red-800 dark:text-red-200\">{enableLan.error}</p>\n ) : null}\n <p className=\"text-xs leading-relaxed text-amber-900 dark:text-amber-200\">\n {lanOnly ? (lanCopy?.pairBlockedNextSteps ?? t.pairBlockedNextSteps) : t.pairBlockedNextSteps}\n </p>\n <div className=\"flex flex-col gap-1\">\n <Link\n to=\"/settings/gateway\"\n className=\"inline-block text-xs font-medium text-accent hover:underline\"\n >\n {t.pairEnableLanSecurityAuditLink}\n </Link>\n {lanOnly && lanCopy?.pairPublicTabLink ? (\n <Link\n to=\"/settings/remote-access?tab=public\"\n className=\"inline-block text-xs font-medium text-accent hover:underline\"\n >\n {lanCopy.pairPublicTabLink}\n </Link>\n ) : null}\n </div>\n </div>\n ) : null}\n\n {tunnelActive && !lanOnly ? (\n !effectiveStreamlined ? (\n <div className=\"mb-3 space-y-2 rounded-lg border border-edge bg-surface-panel px-3 py-3\">\n <div>\n <div className=\"text-xs font-medium text-fg-muted\">{t.pairTunnelPublicUrl}</div>\n <div className=\"mt-0.5 break-all font-mono text-xs text-fg\">{tunnelStatus?.publicUrl}</div>\n </div>\n {tunnelQr?.lanUrl ? (\n <div>\n <div className=\"text-xs font-medium text-fg-muted\">{t.pairTunnelLanUrl}</div>\n <div className=\"mt-0.5 break-all font-mono text-xs text-fg\">{tunnelQr.lanUrl}</div>\n </div>\n ) : null}\n </div>\n ) : null\n ) : (\n <div className=\"mb-3 space-y-1.5\">\n <label className=\"text-sm font-medium text-fg\" htmlFor=\"tunnel-mobile-pair-base\">\n {t.pairBaseUrlLabel}\n </label>\n <input\n id=\"tunnel-mobile-pair-base\"\n className={cn(inputClassName(), 'font-mono text-xs')}\n type=\"text\"\n autoComplete=\"off\"\n spellCheck={false}\n placeholder={suggestedUrl || t.pairBaseUrlPlaceholder}\n value={pairBaseUrl}\n onChange={(e) => setPairBaseUrl(e.target.value)}\n />\n <p className=\"text-xs text-fg-subtle\">{t.pairBaseUrlHint}</p>\n {!baseOk && pairBaseUrl.trim() ? (\n <p className=\"text-xs text-amber-800 dark:text-amber-200\">{t.pairInvalidBaseUrl}</p>\n ) : null}\n {localhostWarn ? (\n <p className=\"rounded-lg border border-amber-200 bg-amber-50 px-3 py-2 text-xs text-amber-950 dark:border-amber-800 dark:bg-amber-950/40 dark:text-amber-100\">\n {t.pairLocalhostWarning}\n </p>\n ) : null}\n {showLanCandidatePicker ? renderLanCandidateList('neutral') : null}\n </div>\n )}\n\n <p className=\"mb-3 text-xs text-fg-subtle\">{t.pairSecurityNote}</p>\n\n {deepLink ? (\n <div className=\"flex flex-col items-center gap-3 sm:items-start\">\n {qrDataUrl && !qrGenFailed ? (\n <img\n src={qrDataUrl}\n alt=\"\"\n className=\"size-56 rounded-lg border border-edge-subtle bg-white object-contain p-3 dark:border-edge\"\n />\n ) : null}\n {encoding ? <p className=\"text-sm text-fg-muted\">{t.pairEncoding}</p> : null}\n {qrGenFailed ? (\n <p className=\"text-center text-sm text-fg-muted sm:text-left\">{t.pairImageError}</p>\n ) : null}\n <CopyTextRow text={deepLink} labels={copyLabels} />\n </div>\n ) : pairingBlocked ? (\n <p className=\"text-sm text-fg-muted\">{t.pairQrDisabled}</p>\n ) : null}\n\n {qrPayload && !effectiveStreamlined ? (\n <details className=\"mt-3 rounded-lg border border-edge bg-surface-panel px-3 py-2\">\n <summary className=\"cursor-pointer text-xs font-medium text-fg-muted\">{t.deeplinkTitle}</summary>\n <p className=\"mt-2 break-all font-mono text-[10px] leading-relaxed text-fg-subtle\">{qrPayload}</p>\n </details>\n ) : null}\n\n {!effectiveStreamlined ? (\n <>\n <p className=\"mt-3 break-all font-mono text-[10px] leading-relaxed text-fg-subtle\">{t.pairSchemeHint}</p>\n <p className=\"mt-1 text-[10px] leading-relaxed text-fg-subtle\">{t.pairMobileProbeHint}</p>\n </>\n ) : null}\n\n <ConfirmDialog\n open={enableLan.confirmOpen}\n title={t.pairEnableLanConfirmTitle}\n description={t.pairEnableLanConfirmBody}\n confirmLabel={t.pairEnableLanButton}\n cancelLabel={t.consentCancel}\n onConfirm={() => void enableLan.runEnableLanPairing()}\n onCancel={() => {\n if (!enableLan.busy) enableLan.setConfirmOpen(false);\n }}\n />\n </>\n );\n\n return <SettingsFormSection>{sectionBody}</SettingsFormSection>;\n}\n","import * as Dialog from '@radix-ui/react-dialog';\nimport { useState } from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport { cn } from '@/lib/cn';\nimport { SETTINGS_SHELL_CONTENT_Z, SETTINGS_SHELL_OVERLAY_Z } from '@/lib/settings-shell-dialog-layer';\n\nexport type TunnelConsentDialogProps = {\n open: boolean;\n title: string;\n intro: string;\n bullets: readonly string[];\n checkboxLabel: string;\n confirmLabel: string;\n cancelLabel: string;\n onConfirm: () => void;\n onCancel: () => void;\n};\n\nexport function TunnelConsentDialog({\n open,\n title,\n intro,\n bullets,\n checkboxLabel,\n confirmLabel,\n cancelLabel,\n onConfirm,\n onCancel,\n}: TunnelConsentDialogProps) {\n const [checked, setChecked] = useState(false);\n\n return (\n <Dialog.Root\n open={open}\n onOpenChange={(next) => {\n if (!next) {\n setChecked(false);\n onCancel();\n }\n }}\n >\n <Dialog.Portal>\n <Dialog.Overlay\n className={cn(\n 'xopc-dialog-overlay fixed inset-0 bg-scrim backdrop-blur-[1px]',\n SETTINGS_SHELL_OVERLAY_Z,\n )}\n />\n <Dialog.Content\n className={cn(\n 'fixed left-1/2 top-1/2 max-h-[min(90vh,40rem)] w-[min(100%-2rem,32rem)] -translate-x-1/2 -translate-y-1/2',\n 'overflow-y-auto rounded-2xl border border-edge bg-surface-panel p-6 shadow-popover outline-none dark:border-edge',\n SETTINGS_SHELL_CONTENT_Z,\n )}\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n <Dialog.Title className=\"text-base font-semibold text-fg\">{title}</Dialog.Title>\n <Dialog.Description className=\"mt-2 text-sm text-fg-muted\">{intro}</Dialog.Description>\n <ul className=\"mt-4 list-disc space-y-2 pl-5 text-sm text-fg-muted\">\n {bullets.map((line) => (\n <li key={line}>{line}</li>\n ))}\n </ul>\n <label className=\"mt-5 flex cursor-pointer items-start gap-3 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"mt-0.5 size-4 shrink-0 rounded border-edge accent-accent\"\n checked={checked}\n onChange={(e) => setChecked(e.target.checked)}\n />\n <span>{checkboxLabel}</span>\n </label>\n <div className=\"mt-6 flex justify-end gap-2\">\n <Button type=\"button\" variant=\"secondary\" onClick={onCancel}>\n {cancelLabel}\n </Button>\n <Button type=\"button\" disabled={!checked} onClick={onConfirm}>\n {confirmLabel}\n </Button>\n </div>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n","import { Check, Circle, Loader2 } from 'lucide-react';\nimport { useEffect, useState } from 'react';\n\nimport type { TunnelStatusResponse } from '@/features/tunnel/tunnel-api';\nimport type { TunnelSettingsMessages } from '@/i18n/messages';\nimport { cn } from '@/lib/cn';\n\ntype StepId = 'preparing_frpc' | 'registering' | 'starting_frpc';\n\nfunction formatByteCount(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nconst STEP_ORDER: StepId[] = ['preparing_frpc', 'registering', 'starting_frpc'];\n\nfunction phaseIndex(phase: StepId | 'reconnecting_frpc' | undefined): number {\n if (!phase) return -1;\n if (phase === 'reconnecting_frpc') return STEP_ORDER.indexOf('starting_frpc');\n return STEP_ORDER.indexOf(phase);\n}\n\nfunction stepState(\n stepId: StepId,\n status: TunnelStatusResponse,\n): 'done' | 'active' | 'pending' {\n if (status.state === 'connected') return 'done';\n const current = status.startProgress?.phase;\n const idx = STEP_ORDER.indexOf(stepId);\n const currentIdx = phaseIndex(current);\n if (currentIdx < 0) {\n return status.state === 'connecting' || status.state === 'reconnecting' ? 'active' : 'pending';\n }\n if (idx < currentIdx) return 'done';\n if (idx === currentIdx) return 'active';\n return 'pending';\n}\n\nfunction stepDetail(\n t: TunnelSettingsMessages,\n stepId: StepId,\n status: TunnelStatusResponse,\n): string | null {\n const progress = status.startProgress;\n if (stepState(stepId, status) !== 'active') return null;\n\n if (stepId === 'preparing_frpc' && status.frpcDownload) {\n if (status.frpcDownload.phase === 'extracting') return t.frpcExtracting;\n if (status.frpcDownload.percent != null) {\n return t.frpcDownloadingPercent.replace('{{percent}}', String(status.frpcDownload.percent));\n }\n return t.frpcDownloading;\n }\n if (stepId === 'registering' && progress?.publicUrl) {\n return t.stepRegisterDetail;\n }\n\n if (stepId === 'starting_frpc') {\n return progress?.phase === 'reconnecting_frpc' ? t.stepReconnectDetail : t.stepFrpcDetail;\n }\n\n return null;\n}\n\nfunction stepLabel(t: TunnelSettingsMessages, stepId: StepId): string {\n switch (stepId) {\n case 'preparing_frpc':\n return t.stepPrepareFrpc;\n case 'registering':\n return t.stepRegister;\n case 'starting_frpc':\n return t.stepFrpcLogin;\n }\n}\n\nfunction formatPhaseElapsed(startedAt: string | undefined): string | null {\n if (!startedAt) return null;\n const sec = Math.max(0, Math.floor((Date.now() - new Date(startedAt).getTime()) / 1000));\n if (sec < 60) return `${sec}s`;\n return `${Math.floor(sec / 60)}m ${sec % 60}s`;\n}\n\nexport function TunnelStartProgressPanel({\n status,\n t,\n}: {\n status: TunnelStatusResponse;\n t: TunnelSettingsMessages;\n}) {\n const [, setTick] = useState(0);\n useEffect(() => {\n if (status.state !== 'connecting' && status.state !== 'reconnecting') return;\n const id = window.setInterval(() => setTick((n) => n + 1), 1000);\n return () => window.clearInterval(id);\n }, [status.state, status.startProgress?.startedAt]);\n\n const showSteps =\n status.state === 'connecting' ||\n status.state === 'reconnecting' ||\n (status.state === 'connected' && Boolean(status.startProgress));\n\n if (!showSteps) return null;\n\n const elapsed = formatPhaseElapsed(status.startProgress?.startedAt);\n const showPendingUrlNotice =\n Boolean(status.publicUrl) &&\n status.state !== 'connected' &&\n status.startProgress?.phase !== 'registering';\n\n return (\n <div className=\"mt-3 space-y-3 rounded-lg border border-edge-subtle bg-surface-panel px-3 py-3\">\n <div>\n <p className=\"text-xs font-medium text-fg\">{t.startProgressTitle}</p>\n <p className=\"mt-1 text-xs text-fg-muted\">{t.startProgressHint}</p>\n </div>\n\n <ol className=\"space-y-2\">\n {STEP_ORDER.map((stepId) => {\n const state = stepState(stepId, status);\n const detail = stepDetail(t, stepId, status);\n return (\n <li key={stepId} className=\"flex gap-2 text-xs\">\n <span className=\"mt-0.5 shrink-0 text-fg-subtle\" aria-hidden>\n {state === 'done' ? (\n <Check className=\"size-3.5 text-emerald-600 dark:text-emerald-400\" />\n ) : state === 'active' ? (\n <Loader2 className=\"size-3.5 animate-spin text-accent\" />\n ) : (\n <Circle className=\"size-3.5\" />\n )}\n </span>\n <div className=\"min-w-0\">\n <div\n className={cn(\n 'font-medium',\n state === 'active' ? 'text-fg' : state === 'done' ? 'text-fg-muted' : 'text-fg-subtle',\n )}\n >\n {stepLabel(t, stepId)}\n </div>\n {detail ? <div className=\"mt-0.5 text-fg-muted\">{detail}</div> : null}\n {stepId === 'preparing_frpc' &&\n state === 'active' &&\n status.frpcDownload &&\n status.frpcDownload.phase === 'downloading' ? (\n <div className=\"mt-2 space-y-1\">\n <div className=\"h-1.5 w-full overflow-hidden rounded-full bg-surface-panel\">\n <div\n className={cn(\n 'h-full rounded-full bg-accent transition-[width] duration-300',\n status.frpcDownload.percent == null && 'w-1/3 animate-pulse',\n )}\n style={\n status.frpcDownload.percent != null\n ? { width: `${status.frpcDownload.percent}%` }\n : undefined\n }\n />\n </div>\n {status.frpcDownload.bytesReceived != null && status.frpcDownload.totalBytes ? (\n <p className=\"text-fg-subtle\">\n {formatByteCount(status.frpcDownload.bytesReceived)} /{' '}\n {formatByteCount(status.frpcDownload.totalBytes)}\n </p>\n ) : null}\n </div>\n ) : null}\n {stepId === 'preparing_frpc' && state === 'active' && status.frpcDownload?.url ? (\n <p className=\"mt-2 text-fg-subtle\">\n <span className=\"font-sans\">{t.frpcDownloadingUrlLabel}: </span>\n <a\n href={status.frpcDownload.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"break-all font-mono text-[11px] text-accent hover:underline\"\n >\n {status.frpcDownload.url}\n </a>\n </p>\n ) : null}\n </div>\n </li>\n );\n })}\n </ol>\n\n {elapsed && status.startProgress ? (\n <p className=\"text-xs text-fg-subtle\">\n {t.startProgressElapsed.replace('{{elapsed}}', elapsed)}\n </p>\n ) : null}\n\n {showPendingUrlNotice ? (\n <p className=\"text-xs text-fg-muted\">{t.publicUrlPendingNotice}</p>\n ) : null}\n </div>\n );\n}\n","import { AlertTriangle, Globe, Loader2, Power } from 'lucide-react';\n\nimport { CopyTextRow } from '@/components/ui/copy-text-row';\nimport { Button } from '@/components/ui/button';\nimport { settingsFormSectionClassName } from '@/features/settings/settings-form-section';\nimport type { TunnelStatusResponse } from '@/features/tunnel/tunnel-api';\nimport { TunnelStartProgressPanel } from '@/features/tunnel/tunnel-start-progress';\nimport { cn } from '@/lib/cn';\nimport type { TunnelSettingsMessages } from '@/i18n/messages';\n\nfunction statusLabel(t: TunnelSettingsMessages, status: TunnelStatusResponse): string {\n if (status.state === 'connected') return t.statusConnected;\n if (status.state === 'error') return t.statusError;\n if (status.startProgress?.phase === 'reconnecting_frpc') return t.statusReconnecting;\n if (status.startProgress?.phase === 'starting_frpc') return t.statusStartingFrpc;\n if (status.startProgress?.phase === 'registering') return t.statusRegistering;\n if (status.startProgress?.phase === 'preparing_frpc' || status.frpcDownload) return t.statusPreparingFrpc;\n if (status.state === 'connecting' || status.state === 'reconnecting') return t.statusConnecting;\n return t.statusOff;\n}\n\nfunction statusTone(status: TunnelStatusResponse): 'connected' | 'progress' | 'error' | 'off' {\n if (status.state === 'connected') return 'connected';\n if (status.state === 'error') return 'error';\n if (\n status.state === 'connecting' ||\n status.state === 'reconnecting' ||\n status.startProgress ||\n status.frpcDownload\n ) {\n return 'progress';\n }\n return 'off';\n}\n\nfunction toneClasses(tone: ReturnType<typeof statusTone>): string {\n switch (tone) {\n case 'connected':\n return 'bg-emerald-500/15 text-emerald-700 dark:text-emerald-400';\n case 'progress':\n return 'bg-amber-500/15 text-amber-700 dark:text-amber-400';\n case 'error':\n return 'bg-red-500/15 text-red-700 dark:text-red-400';\n default:\n return 'bg-surface-hover text-fg-muted';\n }\n}\n\nfunction formatUptime(since: string | null): string {\n if (!since) return '—';\n const ms = Date.now() - new Date(since).getTime();\n if (ms < 0) return '—';\n const mins = Math.floor(ms / 60_000);\n if (mins < 60) return `${mins}m`;\n const hrs = Math.floor(mins / 60);\n const rem = mins % 60;\n return `${hrs}h ${rem}m`;\n}\n\ntype Props = {\n t: TunnelSettingsMessages;\n status: TunnelStatusResponse;\n isLoading: boolean;\n statusErr: unknown;\n starting: boolean;\n stopping: boolean;\n showConsentExpired: boolean;\n copyLabels: { copy: string; copied: string; copyFailed: string };\n startDisabled?: boolean;\n startDisabledReason?: string;\n stepLabel?: string;\n onStart: () => void;\n onStop: () => void;\n};\n\nexport function TunnelControlCard({\n t,\n status: st,\n isLoading,\n statusErr,\n starting,\n stopping,\n showConsentExpired,\n copyLabels,\n startDisabled = false,\n startDisabledReason,\n stepLabel,\n onStart,\n onStop,\n}: Props) {\n const tone = statusTone(st);\n const active = st.enabled || starting;\n const showProgress =\n starting ||\n st.state === 'connecting' ||\n st.state === 'reconnecting' ||\n Boolean(st.startProgress) ||\n Boolean(st.frpcDownload);\n\n return (\n <section className={cn(settingsFormSectionClassName(), 'space-y-4')}>\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"flex items-center gap-2\">\n <span\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-xs font-medium',\n toneClasses(tone),\n )}\n >\n <span\n className={cn(\n 'size-1.5 rounded-full',\n tone === 'connected' && 'bg-emerald-500',\n tone === 'progress' && 'bg-amber-500 animate-pulse',\n tone === 'error' && 'bg-red-500',\n tone === 'off' && 'bg-fg-subtle',\n )}\n aria-hidden\n />\n {isLoading && !st.enabled ? t.loading : statusLabel(t, st)}\n </span>\n {st.connectedSince && st.state === 'connected' ? (\n <span className=\"text-xs text-fg-subtle\">\n {t.uptime} {formatUptime(st.connectedSince)}\n </span>\n ) : null}\n </div>\n <Globe className=\"size-4 text-fg-subtle\" strokeWidth={1.75} aria-hidden />\n </div>\n\n {statusErr ? (\n <p className=\"text-sm text-red-600 dark:text-red-400\">\n {statusErr instanceof Error ? statusErr.message : String(statusErr)}\n </p>\n ) : null}\n\n {showConsentExpired ? (\n <p className=\"rounded-lg border border-amber-500/25 bg-amber-500/5 px-3 py-2 text-xs text-fg-muted\">\n {t.consentExpiredBanner}\n </p>\n ) : null}\n\n {!active ? (\n <div className=\"space-y-4\">\n {stepLabel ? <p className=\"text-xs font-medium uppercase tracking-wide text-fg-subtle\">{stepLabel}</p> : null}\n <div>\n <h2 className=\"text-base font-semibold text-fg\">{t.emptyStateTitle}</h2>\n <p className=\"mt-1 text-sm leading-relaxed text-fg-muted\">{t.emptyStateBody}</p>\n </div>\n <div className=\"flex items-start gap-2 rounded-lg border border-amber-500/25 bg-amber-500/5 px-3 py-2.5 text-xs text-fg-muted\">\n <AlertTriangle className=\"mt-0.5 size-4 shrink-0 text-amber-600 dark:text-amber-400\" />\n <p>{t.riskBannerBody}</p>\n </div>\n {startDisabled && startDisabledReason ? (\n <p className=\"text-sm text-amber-800 dark:text-amber-200\">{startDisabledReason}</p>\n ) : null}\n <Button\n type=\"button\"\n disabled={starting || startDisabled}\n onClick={onStart}\n className=\"w-full sm:w-auto\"\n >\n {starting ? <Loader2 className=\"size-4 animate-spin\" /> : <Power className=\"size-4\" />}\n {t.start}\n </Button>\n </div>\n ) : (\n <div className=\"space-y-4\">\n {st.publicUrl ? (\n <div className=\"rounded-xl border border-edge-subtle bg-surface-panel px-3 py-3\">\n <CopyTextRow label={t.publicUrlLabel} text={st.publicUrl} labels={copyLabels} />\n </div>\n ) : null}\n\n {showProgress ? <TunnelStartProgressPanel status={st} t={t} /> : null}\n\n {st.lastError && st.state === 'error' ? (\n <p className=\"text-sm text-red-600 dark:text-red-400\">{st.lastError}</p>\n ) : null}\n\n <div className=\"flex flex-wrap gap-2\">\n {st.enabled ? (\n <Button type=\"button\" variant=\"secondary\" disabled={stopping} onClick={onStop}>\n {stopping ? <Loader2 className=\"size-4 animate-spin\" /> : null}\n {t.stop}\n </Button>\n ) : (\n <Button type=\"button\" disabled={starting} onClick={onStart}>\n {starting ? <Loader2 className=\"size-4 animate-spin\" /> : <Power className=\"size-4\" />}\n {t.start}\n </Button>\n )}\n </div>\n </div>\n )}\n </section>\n );\n}\n","import { Check, CheckCircle2, Copy, ExternalLink, Eye, EyeOff, KeyRound, Loader2 } from 'lucide-react';\nimport { useCallback, useId, useReducer, useRef, type RefObject } from 'react';\n\nimport { uiPatchReducer } from '@/lib/settings-form-draft';\n\nimport { Button } from '@/components/ui/button';\nimport { SettingsFormSection } from '@/features/settings/settings-form-section';\nimport { isMaskedKey } from '@/features/settings/providers-api';\nimport { revealTunnelRegistrationSecret } from '@/features/tunnel/tunnel-api';\nimport { cn } from '@/lib/cn';\nimport { copyTextToClipboard } from '@/lib/copy-to-clipboard';\nimport { interaction } from '@/lib/interaction';\nimport type { TunnelSettingsMessages } from '@/i18n/messages';\n\nconst TUNNEL_CONSOLE_REGISTRATION_KEY_URL = 'https://console.xopc.ai/keys/tunnel';\n\nexport type BrokerSecretSetupProps = {\n t: TunnelSettingsMessages;\n brokerSecretFromEnv: boolean;\n brokerSecretMissing: boolean;\n brokerSecretConfiguredInConfig: boolean;\n brokerSecretMaskedValue: string;\n brokerSecretDraft: string;\n savingBrokerSecret: boolean;\n brokerSecretNotice: string | null;\n copyFailedLabel: string;\n onDraftChange: (value: string) => void;\n onSave: () => void;\n onClear: () => void;\n sectionRef?: RefObject<HTMLDivElement | null>;\n};\n\ntype BrokerSecretUi = {\n reconfiguring: boolean;\n showKey: boolean;\n revealed: string | null | undefined;\n revealLoading: boolean;\n revealErr: string | null;\n copied: boolean;\n};\n\nconst initialBrokerSecretUi: BrokerSecretUi = {\n reconfiguring: false,\n showKey: false,\n revealed: undefined,\n revealLoading: false,\n revealErr: null,\n copied: false,\n};\n\nexport function BrokerSecretSetupSection({\n t,\n brokerSecretFromEnv,\n brokerSecretMissing,\n brokerSecretConfiguredInConfig,\n brokerSecretMaskedValue,\n brokerSecretDraft,\n savingBrokerSecret,\n brokerSecretNotice,\n copyFailedLabel,\n onDraftChange,\n onSave,\n onClear,\n sectionRef,\n}: BrokerSecretSetupProps) {\n const inputId = useId();\n const needsSetup = brokerSecretMissing && !brokerSecretFromEnv;\n const ready = !needsSetup;\n\n const [ui, dispatch] = useReducer(uiPatchReducer<BrokerSecretUi>, initialBrokerSecretUi);\n const { reconfiguring, showKey, revealed, revealLoading, revealErr, copied } = ui;\n\n const showStoredKeyRow =\n brokerSecretConfiguredInConfig && !brokerSecretFromEnv && !reconfiguring && !brokerSecretDraft.trim();\n\n const trackedConfiguredRef = useRef(brokerSecretConfiguredInConfig);\n if (!brokerSecretConfiguredInConfig && trackedConfiguredRef.current) {\n dispatch({\n type: 'patch',\n patch: { reconfiguring: false, revealed: undefined, revealErr: null, showKey: false },\n });\n }\n trackedConfiguredRef.current = brokerSecretConfiguredInConfig;\n\n const trackedNoticeRef = useRef(brokerSecretNotice);\n if (brokerSecretNotice && brokerSecretNotice !== trackedNoticeRef.current) {\n dispatch({ type: 'patch', patch: { reconfiguring: false } });\n }\n trackedNoticeRef.current = brokerSecretNotice;\n\n const copyKey = useCallback(async () => {\n const text = typeof revealed === 'string' ? revealed : '';\n if (!text) return;\n const ok = await copyTextToClipboard(text);\n if (!ok) {\n dispatch({ type: 'patch', patch: { revealErr: copyFailedLabel } });\n return;\n }\n dispatch({ type: 'patch', patch: { copied: true } });\n window.setTimeout(() => dispatch({ type: 'patch', patch: { copied: false } }), 2000);\n }, [copyFailedLabel, revealed]);\n\n const toggleEye = useCallback(async () => {\n dispatch({ type: 'patch', patch: { revealErr: null } });\n if (revealed !== undefined) {\n dispatch({ type: 'patch', patch: { showKey: !showKey } });\n return;\n }\n dispatch({ type: 'patch', patch: { revealLoading: true } });\n try {\n const payload = await revealTunnelRegistrationSecret();\n dispatch({ type: 'patch', patch: { revealed: payload.registrationSecret ?? null, showKey: true } });\n } catch (e) {\n dispatch({\n type: 'patch',\n patch: {\n revealErr: e instanceof Error ? e.message : t.brokerSecretRevealFailed,\n revealed: null,\n },\n });\n } finally {\n dispatch({ type: 'patch', patch: { revealLoading: false } });\n }\n }, [revealed, t.brokerSecretRevealFailed]);\n\n const canSave = brokerSecretDraft.trim().length > 0 && !isMaskedKey(brokerSecretDraft.trim());\n\n const cancelReconfigure = () => {\n dispatch({ type: 'patch', patch: { reconfiguring: false, revealErr: null } });\n onDraftChange('');\n };\n\n return (\n <div ref={sectionRef} id=\"tunnel-broker-secret-setup\">\n <SettingsFormSection className={cn(needsSetup && 'ring-1 ring-amber-500/30')}>\n <div className=\"flex items-start gap-3\">\n <span\n className={cn(\n 'flex size-9 shrink-0 items-center justify-center rounded-lg',\n ready\n ? 'bg-emerald-500/10 text-emerald-600 dark:text-emerald-400'\n : needsSetup\n ? 'bg-amber-500/10 text-amber-700 dark:text-amber-400'\n : 'bg-surface-hover text-fg-muted',\n )}\n >\n {ready ? (\n <Check className=\"size-4\" strokeWidth={2} aria-hidden />\n ) : (\n <KeyRound className=\"size-4\" strokeWidth={1.75} aria-hidden />\n )}\n </span>\n <div className=\"min-w-0 flex-1 space-y-3\">\n <div>\n <p className=\"text-sm font-semibold text-fg\">\n {ready ? t.brokerSecretReadyTitle : t.brokerSecretStepTitle}\n </p>\n <p className=\"mt-1 text-sm leading-relaxed text-fg-muted\">\n {ready ? t.brokerSecretReadyHint : t.brokerSecretHint}\n </p>\n {needsSetup ? (\n <p className=\"mt-2 text-xs text-amber-800 dark:text-amber-200\">{t.brokerSecretMissingHint}</p>\n ) : null}\n </div>\n\n <a\n href={TUNNEL_CONSOLE_REGISTRATION_KEY_URL}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex w-fit items-center gap-1 text-xs font-medium text-accent-fg hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n >\n {t.brokerSecretConsoleLink}\n <ExternalLink className=\"size-3\" aria-hidden />\n </a>\n\n {brokerSecretFromEnv ? (\n <p className=\"rounded-lg border border-edge-subtle bg-surface-panel px-3 py-2 text-xs text-fg-muted\">\n {t.brokerSecretEnvHint}\n </p>\n ) : null}\n\n {showStoredKeyRow ? (\n <>\n <p className=\"text-[11px] text-fg-subtle\">{t.brokerSecretMaskedHelp}</p>\n <label className=\"sr-only\" htmlFor={inputId}>\n {t.brokerSecretTitle}\n </label>\n <div className=\"relative min-w-0\">\n <input\n id={inputId}\n type={showKey && typeof revealed === 'string' ? 'text' : 'password'}\n readOnly\n autoComplete=\"off\"\n spellCheck={false}\n className=\"w-full rounded-lg border border-edge bg-surface-panel py-2 pl-3 pr-24 font-mono text-sm text-fg\"\n value={\n showKey && typeof revealed === 'string' ? revealed : brokerSecretMaskedValue\n }\n />\n <div className=\"absolute right-1 top-1/2 flex -translate-y-1/2 gap-0.5\">\n {showKey && typeof revealed === 'string' && revealed.length > 0 ? (\n <button\n type=\"button\"\n className={cn(\n 'rounded p-1.5 text-fg-subtle hover:bg-surface-hover hover:text-fg',\n interaction.transition,\n interaction.press,\n interaction.focusRingPanel,\n )}\n title={copied ? t.copied : t.copyKey}\n aria-label={copied ? t.copied : t.copyKey}\n onClick={() => void copyKey()}\n >\n {copied ? <CheckCircle2 className=\"size-4\" /> : <Copy className=\"size-4\" />}\n </button>\n ) : null}\n <button\n type=\"button\"\n className={cn(\n 'rounded p-1.5 text-fg-subtle hover:bg-surface-hover hover:text-fg disabled:opacity-40',\n interaction.transition,\n interaction.press,\n interaction.focusRingPanel,\n )}\n title={showKey ? t.hideKey : t.showKey}\n aria-label={showKey ? t.hideKey : t.showKey}\n disabled={revealLoading}\n onClick={() => void toggleEye()}\n >\n {revealLoading ? (\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n ) : showKey ? (\n <EyeOff className=\"size-4\" aria-hidden />\n ) : (\n <Eye className=\"size-4\" aria-hidden />\n )}\n </button>\n </div>\n </div>\n {showKey && revealed === null && !revealErr ? (\n <p className=\"text-xs text-amber-700 dark:text-amber-400/90\">{t.brokerSecretNotInConfigFile}</p>\n ) : null}\n {revealErr ? <p className=\"text-xs text-red-600 dark:text-red-400\">{revealErr}</p> : null}\n <div className=\"flex flex-wrap gap-2\">\n <Button\n type=\"button\"\n variant=\"secondary\"\n disabled={savingBrokerSecret}\n onClick={() => {\n dispatch({ type: 'patch', patch: { revealErr: null, reconfiguring: true } });\n }}\n >\n {t.brokerSecretReconfigure}\n </Button>\n <Button type=\"button\" variant=\"ghost\" disabled={savingBrokerSecret} onClick={onClear}>\n {t.brokerSecretClear}\n </Button>\n </div>\n </>\n ) : (\n <>\n <label className=\"sr-only\" htmlFor={inputId}>\n {t.brokerSecretTitle}\n </label>\n <input\n id={inputId}\n type=\"password\"\n autoComplete=\"off\"\n spellCheck={false}\n className=\"w-full rounded-lg border border-edge bg-surface-panel px-3 py-2 font-mono text-sm text-fg placeholder:text-fg-subtle\"\n placeholder={\n reconfiguring ? t.brokerSecretPlaceholder : t.brokerSecretPlaceholder\n }\n value={brokerSecretDraft}\n disabled={savingBrokerSecret}\n onChange={(e) => onDraftChange(e.target.value)}\n />\n <div className=\"flex flex-wrap gap-2\">\n <Button type=\"button\" disabled={savingBrokerSecret || !canSave} onClick={onSave}>\n {savingBrokerSecret ? <Loader2 className=\"size-4 animate-spin\" /> : null}\n {needsSetup ? t.brokerSecretSaveAndContinue : t.brokerSecretSave}\n </Button>\n {brokerSecretConfiguredInConfig || brokerSecretFromEnv ? (\n <Button type=\"button\" variant=\"ghost\" disabled={savingBrokerSecret} onClick={onClear}>\n {t.brokerSecretClear}\n </Button>\n ) : null}\n {reconfiguring ? (\n <Button type=\"button\" variant=\"ghost\" disabled={savingBrokerSecret} onClick={cancelReconfigure}>\n {t.brokerSecretCancelReconfigure}\n </Button>\n ) : null}\n </div>\n </>\n )}\n\n {brokerSecretNotice ? (\n <p className=\"text-xs text-emerald-700 dark:text-emerald-400\">{brokerSecretNotice}</p>\n ) : null}\n </div>\n </div>\n </SettingsFormSection>\n </div>\n );\n}\n","import { ExternalLink } from 'lucide-react';\n\nimport { cn } from '@/lib/cn';\nimport { remoteAccessDocsUrl, type RemoteAccessDocsSection } from '@/navigation';\nimport type { StoredLanguage } from '@/lib/storage';\n\ntype Props = {\n language: StoredLanguage;\n label: string;\n section?: RemoteAccessDocsSection;\n className?: string;\n};\n\nexport function RemoteAccessDocsLink({ language, label, section, className }: Props) {\n return (\n <a\n href={remoteAccessDocsUrl(language, section)}\n target=\"_blank\"\n rel=\"noreferrer\"\n className={cn(\n 'inline-flex items-center gap-1 text-sm font-medium text-accent hover:underline',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/40',\n className,\n )}\n >\n {label}\n <ExternalLink className=\"size-3.5 shrink-0\" aria-hidden />\n </a>\n );\n}\n","import QRCode from 'qrcode';\n\nconst MOBILE_PAIR_QR_OPTIONS = {\n width: 216,\n margin: 2,\n errorCorrectionLevel: 'M' as const,\n color: { dark: '#000000ff', light: '#ffffffff' },\n};\n\nexport async function encodeMobilePairQr(payload: string): Promise<string> {\n return QRCode.toDataURL(payload, MOBILE_PAIR_QR_OPTIONS);\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport useSWR, { useSWRConfig } from 'swr';\n\nimport {\n createTunnelPair,\n fetchTunnelPairContext,\n fetchTunnelQr,\n fetchTunnelStatus,\n type MobilePairContextResponse,\n type TunnelQrResponse,\n type TunnelStatusResponse,\n} from '@/features/tunnel/tunnel-api';\nimport { encodeMobilePairQr } from '@/features/tunnel/mobile-pair-qr';\nimport { buildMobileGatewayPairDeepLink, isLoopbackHttpOrigin } from '@/lib/url';\nimport { useAsyncResource } from '@/lib/use-async-resource';\n\nfunction pickLanCandidateUrl(context?: MobilePairContextResponse): string {\n const candidates = context?.candidates ?? [];\n const reachable = candidates.find((c) => c.kind === 'lan' && c.reachable);\n const anyLan = candidates.find((c) => c.kind === 'lan');\n return (reachable ?? anyLan)?.url?.trim() ?? '';\n}\n\nfunction isTunnelCandidateUrl(context: MobilePairContextResponse | undefined, url: string): boolean {\n const trimmed = url.trim();\n if (!trimmed || !context) return false;\n return context.candidates.some((c) => c.kind === 'tunnel' && c.url.trim() === trimmed);\n}\n\nfunction resolveSuggestedPairBaseUrl(\n context: MobilePairContextResponse | undefined,\n preferLan: boolean,\n): string {\n if (!context) return '';\n if (preferLan) {\n return pickLanCandidateUrl(context) || context.recommended.url?.trim() || '';\n }\n return context.recommended.url?.trim() || '';\n}\n\nexport type MobilePairQrState = {\n tunnelActive: boolean;\n tunnelStatus: TunnelStatusResponse | undefined;\n tunnelQr: TunnelQrResponse | undefined;\n pairContext: MobilePairContextResponse | undefined;\n pairBaseUrl: string;\n setPairBaseUrl: (value: string) => void;\n applySuggestedPairUrl: () => void;\n applyCandidateUrl: (url: string) => void;\n baseOk: boolean;\n localhostWarn: boolean;\n pairingBlocked: boolean;\n deepLink: string;\n qrPayload: string;\n qrDataUrl: string | null;\n qrGenFailed: boolean;\n encoding: boolean;\n refreshQr: (payload?: string) => Promise<void>;\n resetPairBaseFromContext: (url?: string | null) => void;\n};\n\nexport type UseMobilePairQrOptions = {\n /** Prefer LAN pairing QR even when a public tunnel is connected. */\n preferLan?: boolean;\n};\n\nexport function useMobilePairQr(\n gatewayToken: string,\n options?: UseMobilePairQrOptions,\n): MobilePairQrState {\n const preferLan = options?.preferLan === true;\n const hasToken = Boolean(gatewayToken);\n const { mutate: globalMutate } = useSWRConfig();\n const userEditedBaseRef = useRef(false);\n\n const { data: tunnelStatus } = useSWR(hasToken ? 'tunnel-status' : null, fetchTunnelStatus, {\n refreshInterval: 60_000,\n });\n\n const { data: pairContext, mutate: mutPairContext } = useSWR(\n hasToken ? 'tunnel-pair-context' : null,\n fetchTunnelPairContext,\n { refreshInterval: 60_000 },\n );\n\n useEffect(() => {\n const onTunnelStatus = () => {\n void globalMutate('tunnel-status');\n void globalMutate('tunnel-qr');\n void globalMutate('tunnel-pair');\n void globalMutate('tunnel-pair-context');\n };\n window.addEventListener('tunnel-status', onTunnelStatus);\n return () => window.removeEventListener('tunnel-status', onTunnelStatus);\n }, [globalMutate]);\n\n const tunnelActive =\n tunnelStatus?.state === 'connected' && Boolean(tunnelStatus.publicUrl?.trim());\n const useTunnelQr = tunnelActive && !preferLan;\n\n const { data: tunnelQr, mutate: mutTunnelQr } = useSWR(\n useTunnelQr && hasToken ? 'tunnel-qr' : null,\n fetchTunnelQr,\n { refreshInterval: 4 * 60_000 },\n );\n\n const { data: lanPair, mutate: mutLanPair } = useSWR(\n !useTunnelQr && hasToken && pairContext?.pairingReady ? 'tunnel-pair' : null,\n createTunnelPair,\n { refreshInterval: 4 * 60_000 },\n );\n\n const [pairBaseUrl, setPairBaseUrlState] = useState('');\n const [manualPayload, setManualPayload] = useState('');\n const [syncSource, setSyncSource] = useState({\n pairContext: undefined as MobilePairContextResponse | undefined,\n preferLan,\n });\n\n if (\n !userEditedBaseRef.current &&\n (pairContext !== syncSource.pairContext || preferLan !== syncSource.preferLan)\n ) {\n setSyncSource({ pairContext, preferLan });\n const suggested = resolveSuggestedPairBaseUrl(pairContext, preferLan);\n if (pairBaseUrl !== suggested) {\n setPairBaseUrlState(suggested);\n }\n }\n\n const setPairBaseUrl = useCallback((value: string) => {\n userEditedBaseRef.current = true;\n setPairBaseUrlState(value);\n }, []);\n\n const applySuggestedPairUrl = useCallback(() => {\n const suggested = resolveSuggestedPairBaseUrl(pairContext, preferLan);\n if (!suggested) return;\n userEditedBaseRef.current = true;\n setPairBaseUrlState(suggested);\n }, [pairContext, preferLan]);\n\n const applyCandidateUrl = useCallback((url: string) => {\n const trimmed = url.trim();\n if (!trimmed) return;\n userEditedBaseRef.current = true;\n setPairBaseUrlState(trimmed);\n }, []);\n\n const resetPairBaseFromContext = useCallback(\n (url?: string | null) => {\n userEditedBaseRef.current = false;\n const suggested =\n url?.trim() || resolveSuggestedPairBaseUrl(pairContext, preferLan);\n setPairBaseUrlState(suggested);\n },\n [pairContext, preferLan],\n );\n\n const trimmedBase = pairBaseUrl.trim();\n const baseOk = useMemo(() => {\n try {\n const u = new URL(trimmedBase);\n return u.protocol === 'http:' || u.protocol === 'https:';\n } catch {\n return false;\n }\n }, [trimmedBase]);\n\n const localhostWarn = baseOk && isLoopbackHttpOrigin(trimmedBase);\n const pairingBlocked =\n !useTunnelQr &&\n Boolean(pairContext && !pairContext.pairingReady && pairContext.blockReason === 'GATEWAY_LOOPBACK_ONLY');\n\n const lanPairReady =\n !useTunnelQr &&\n baseOk &&\n !localhostWarn &&\n Boolean(lanPair?.pairingSecret) &&\n (pairContext?.pairingReady === true || !pairingBlocked);\n\n const lanBaseUrl = useMemo(() => {\n const fromCandidates = pickLanCandidateUrl(pairContext);\n if (preferLan) {\n if (fromCandidates) return fromCandidates;\n if (trimmedBase && !isTunnelCandidateUrl(pairContext, trimmedBase)) return trimmedBase;\n return '';\n }\n return trimmedBase;\n }, [pairContext, preferLan, trimmedBase]);\n\n const deepLink = useMemo(() => {\n if (!gatewayToken) return '';\n if (manualPayload.trim()) return manualPayload.trim();\n if (useTunnelQr && tunnelQr?.qrPayload?.trim()) {\n return tunnelQr.qrPayload.trim();\n }\n if (!lanPairReady || !lanPair?.pairingSecret) return '';\n const tunnelCandidate = pairContext?.candidates.find((c) => c.kind === 'tunnel' && c.reachable);\n const lanCandidate = pairContext?.candidates.find((c) => c.kind === 'lan' && c.reachable);\n const baseUrl = preferLan\n ? lanBaseUrl\n : (tunnelCandidate?.url ?? trimmedBase);\n if (!baseUrl) return '';\n return buildMobileGatewayPairDeepLink({\n baseUrl,\n pairingSecret: lanPair.pairingSecret,\n lanUrl: preferLan ? null : (tunnelCandidate && lanCandidate ? lanCandidate.url : null),\n });\n }, [\n gatewayToken,\n lanBaseUrl,\n lanPair?.pairingSecret,\n lanPairReady,\n manualPayload,\n preferLan,\n trimmedBase,\n useTunnelQr,\n tunnelQr?.qrPayload,\n pairContext?.candidates,\n ]);\n\n const qrImage = useAsyncResource(\n () => encodeMobilePairQr(deepLink),\n [deepLink],\n { enabled: Boolean(deepLink), initial: null as string | null, errorData: null },\n );\n\n const qrDataUrl = deepLink ? qrImage.data : null;\n const qrGenFailed = Boolean(deepLink && qrImage.error !== null && !qrImage.loading);\n const encoding = Boolean(deepLink && !qrDataUrl && !qrGenFailed);\n\n const refreshQr = useCallback(\n async (payload?: string) => {\n if (payload?.trim()) {\n setManualPayload(payload.trim());\n void mutTunnelQr(\n { qrPayload: payload.trim(), publicUrl: tunnelStatus?.publicUrl ?? '', lanUrl: tunnelQr?.lanUrl ?? null },\n false,\n );\n return;\n }\n setManualPayload('');\n await mutPairContext();\n if (useTunnelQr) {\n await mutTunnelQr();\n } else if (pairContext?.pairingReady) {\n await mutLanPair();\n }\n },\n [mutLanPair, mutPairContext, mutTunnelQr, pairContext?.pairingReady, tunnelQr?.lanUrl, tunnelStatus?.publicUrl, useTunnelQr],\n );\n\n return {\n tunnelActive,\n tunnelStatus,\n tunnelQr,\n pairContext,\n pairBaseUrl,\n setPairBaseUrl,\n applySuggestedPairUrl,\n applyCandidateUrl,\n baseOk,\n localhostWarn,\n pairingBlocked,\n deepLink,\n qrPayload: deepLink,\n qrDataUrl,\n qrGenFailed,\n encoding,\n refreshQr,\n resetPairBaseFromContext,\n };\n}\n","import { Globe, Loader2 } from 'lucide-react';\nimport { useCallback, useEffect, useMemo, useReducer, useRef } from 'react';\n\nimport { uiPatchReducer } from '@/lib/settings-form-draft';\nimport useSWR from 'swr';\n\nimport { Button } from '@/components/ui/button';\nimport { ConfirmDialog } from '@/components/ui/confirm-dialog';\nimport { useGatewayConfigSwr } from '@/features/gateway/gateway-config-swr';\nimport { revalidateGatewayConfig } from '@/features/gateway/gateway-config-swr';\nimport { isMaskedKey } from '@/features/settings/providers-api';\nimport { SettingsCollapsibleSection } from '@/features/settings/settings-collapsible-section';\nimport { SettingsFormSection } from '@/features/settings/settings-form-section';\nimport { MobilePairQrSection } from '@/features/tunnel/mobile-pair-qr-section';\nimport { TunnelConsentDialog } from '@/features/tunnel/tunnel-consent-dialog';\nimport { TunnelControlCard } from '@/features/tunnel/tunnel-control-card';\nimport { BrokerSecretSetupSection } from '@/features/tunnel/tunnel-broker-secret-section';\nimport { RemoteAccessDocsLink } from '@/features/remote-access/remote-access-docs-link';\nimport {\n fetchTunnelStatus,\n patchTunnelConfig,\n recordTunnelConsent,\n startTunnel,\n stopTunnel,\n} from '@/features/tunnel/tunnel-api';\nimport { useMobilePairQr } from '@/features/tunnel/use-mobile-pair-qr';\nimport { cn } from '@/lib/cn';\nimport { messages } from '@/i18n/messages';\nimport { useGatewayStore } from '@/stores/gateway-store';\nimport { useLocaleStore } from '@/stores/locale-store';\n\ntype TunnelUi = {\n actionError: string | null;\n starting: boolean;\n stopping: boolean;\n savingAutoStart: boolean;\n consentOpen: boolean;\n autoStartConfirmOpen: boolean;\n releaseConfirmOpen: boolean;\n releasing: boolean;\n brokerSecretDraft: string;\n savingBrokerSecret: boolean;\n brokerSecretNotice: string | null;\n};\n\nconst initialTunnelUi: TunnelUi = {\n actionError: null,\n starting: false,\n stopping: false,\n savingAutoStart: false,\n consentOpen: false,\n autoStartConfirmOpen: false,\n releaseConfirmOpen: false,\n releasing: false,\n brokerSecretDraft: '',\n savingBrokerSecret: false,\n brokerSecretNotice: null,\n};\n\nexport function TunnelSettingsPanel({ embedded = false }: { embedded?: boolean }) {\n const language = useLocaleStore((s) => s.language);\n const t = messages(language).tunnelSettings;\n const token = useGatewayStore((st) => st.token);\n const hasToken = Boolean(token);\n\n const [ui, dispatchUi] = useReducer(uiPatchReducer<TunnelUi>, initialTunnelUi);\n const {\n actionError,\n starting,\n stopping,\n savingAutoStart,\n consentOpen,\n autoStartConfirmOpen,\n releaseConfirmOpen,\n releasing,\n brokerSecretDraft,\n savingBrokerSecret,\n brokerSecretNotice,\n } = ui;\n const brokerSecretSectionRef = useRef<HTMLDivElement>(null);\n\n const pairQr = useMobilePairQr(token ?? '');\n\n const { data: cfgData } = useGatewayConfigSwr(hasToken);\n\n const {\n data: status,\n error: statusErr,\n isLoading,\n mutate: mutStatus,\n } = useSWR(hasToken ? 'tunnel-status' : null, fetchTunnelStatus, {\n refreshInterval: (latest) => {\n if (starting) return 1000;\n if (latest?.frpcDownload || latest?.state === 'connecting' || latest?.state === 'reconnecting') {\n return 2000;\n }\n return 60_000;\n },\n });\n\n const autoStartEnabled = useMemo(() => {\n const c = cfgData?.payload?.config;\n if (c && typeof c === 'object' && !Array.isArray(c)) {\n const tunnel = (c as { tunnel?: unknown }).tunnel;\n if (tunnel && typeof tunnel === 'object' && !Array.isArray(tunnel)) {\n if ((tunnel as { autoStart?: unknown }).autoStart === true) return true;\n }\n }\n return status?.config?.autoStart === true;\n }, [cfgData, status?.config?.autoStart]);\n\n const brokerSecretFromConfig = useMemo(() => {\n const c = cfgData?.payload?.config;\n if (c && typeof c === 'object' && !Array.isArray(c)) {\n const tunnel = (c as { tunnel?: unknown }).tunnel;\n if (tunnel && typeof tunnel === 'object' && !Array.isArray(tunnel)) {\n const secret = (tunnel as { registrationSecret?: unknown }).registrationSecret;\n if (typeof secret === 'string') return secret;\n }\n }\n return '';\n }, [cfgData]);\n\n const brokerSecretConfiguredInConfig = isMaskedKey(brokerSecretFromConfig);\n const brokerSecretFromEnv = status?.registrationSecret?.source === 'env';\n const brokerSecretMissing = status?.registrationSecret?.source === 'missing';\n const brokerReady = status?.registrationSecret?.configured === true;\n\n useEffect(() => {\n const onTunnelStatus = () => {\n void mutStatus();\n };\n window.addEventListener('tunnel-status', onTunnelStatus);\n return () => window.removeEventListener('tunnel-status', onTunnelStatus);\n }, [mutStatus]);\n\n const consentBullets = useMemo(\n () => [t.consentBullet1, t.consentBullet2, t.consentBullet3] as const,\n [t.consentBullet1, t.consentBullet2, t.consentBullet3],\n );\n\n const runStart = useCallback(async () => {\n dispatchUi({ type: 'patch', patch: { actionError: null } });\n dispatchUi({ type: 'patch', patch: { starting: true } });\n try {\n const res = await startTunnel();\n await mutStatus();\n void revalidateGatewayConfig();\n await pairQr.refreshQr(res.qrPayload);\n } catch (e) {\n dispatchUi({\n type: 'patch',\n patch: { actionError: e instanceof Error ? e.message : String(e) },\n });\n } finally {\n dispatchUi({ type: 'patch', patch: { starting: false } });\n }\n }, [mutStatus, pairQr.refreshQr]);\n\n const handleStartClick = useCallback(() => {\n if (!brokerReady) {\n dispatchUi({ type: 'patch', patch: { actionError: t.brokerSecretRequiredBeforeStart } });\n brokerSecretSectionRef.current?.scrollIntoView({ behavior: 'smooth', block: 'start' });\n return;\n }\n if (status?.consentRequired) {\n dispatchUi({ type: 'patch', patch: { consentOpen: true } });\n return;\n }\n void runStart();\n }, [brokerReady, status?.consentRequired, runStart, t.brokerSecretRequiredBeforeStart]);\n\n const handleConsentConfirm = useCallback(async () => {\n dispatchUi({ type: 'patch', patch: { consentOpen: false } });\n dispatchUi({ type: 'patch', patch: { actionError: null } });\n try {\n await recordTunnelConsent();\n await Promise.all([mutStatus(), runStart()]);\n } catch (e) {\n dispatchUi({\n type: 'patch',\n patch: { actionError: e instanceof Error ? e.message : String(e) },\n });\n }\n }, [mutStatus, runStart]);\n\n const handleStop = useCallback(async () => {\n dispatchUi({ type: 'patch', patch: { actionError: null } });\n dispatchUi({ type: 'patch', patch: { stopping: true } });\n try {\n await stopTunnel();\n await Promise.all([pairQr.refreshQr(), mutStatus()]);\n void revalidateGatewayConfig();\n } catch (e) {\n dispatchUi({\n type: 'patch',\n patch: { actionError: e instanceof Error ? e.message : String(e) },\n });\n } finally {\n dispatchUi({ type: 'patch', patch: { stopping: false } });\n }\n }, [mutStatus, pairQr.refreshQr]);\n\n const applyAutoStart = useCallback(\n async (next: boolean) => {\n dispatchUi({ type: 'patch', patch: { savingAutoStart: true } });\n dispatchUi({ type: 'patch', patch: { actionError: null } });\n try {\n await patchTunnelConfig({ autoStart: next });\n void revalidateGatewayConfig();\n } catch (e) {\n dispatchUi({\n type: 'patch',\n patch: { actionError: e instanceof Error ? e.message : String(e) },\n });\n } finally {\n dispatchUi({ type: 'patch', patch: { savingAutoStart: false } });\n }\n },\n [],\n );\n\n const toggleAutoStart = useCallback(() => {\n if (autoStartEnabled) {\n void applyAutoStart(false);\n return;\n }\n if (status?.consentRequired) {\n dispatchUi({ type: 'patch', patch: { actionError: t.consentExpiredBanner } });\n return;\n }\n if (!status?.canAutoStart) {\n dispatchUi({ type: 'patch', patch: { actionError: t.autoStartHint } });\n return;\n }\n dispatchUi({ type: 'patch', patch: { autoStartConfirmOpen: true } });\n }, [applyAutoStart, status?.canAutoStart, status?.consentRequired, t, autoStartEnabled]);\n\n const saveBrokerSecret = useCallback(async () => {\n const trimmed = brokerSecretDraft.trim();\n if (!trimmed) return;\n dispatchUi({\n type: 'patch',\n patch: { savingBrokerSecret: true, actionError: null, brokerSecretNotice: null },\n });\n try {\n await patchTunnelConfig({ registrationSecret: trimmed });\n dispatchUi({\n type: 'patch',\n patch: { brokerSecretDraft: '', brokerSecretNotice: t.brokerSecretSaved },\n });\n void revalidateGatewayConfig();\n await mutStatus();\n dispatchUi({ type: 'patch', patch: { actionError: null } });\n } catch (e) {\n dispatchUi({\n type: 'patch',\n patch: { actionError: e instanceof Error ? e.message : String(e) },\n });\n } finally {\n dispatchUi({ type: 'patch', patch: { savingBrokerSecret: false } });\n }\n }, [brokerSecretDraft, mutStatus, t.brokerSecretSaved]);\n\n const clearBrokerSecret = useCallback(async () => {\n dispatchUi({\n type: 'patch',\n patch: { savingBrokerSecret: true, actionError: null, brokerSecretNotice: null },\n });\n try {\n await patchTunnelConfig({ registrationSecret: null });\n dispatchUi({\n type: 'patch',\n patch: { brokerSecretDraft: '', brokerSecretNotice: t.brokerSecretCleared },\n });\n void revalidateGatewayConfig();\n await mutStatus();\n } catch (e) {\n dispatchUi({\n type: 'patch',\n patch: { actionError: e instanceof Error ? e.message : String(e) },\n });\n } finally {\n dispatchUi({ type: 'patch', patch: { savingBrokerSecret: false } });\n }\n }, [mutStatus, t.brokerSecretCleared]);\n\n const handleRelease = useCallback(async () => {\n dispatchUi({ type: 'patch', patch: { releaseConfirmOpen: false, actionError: null, releasing: true } });\n try {\n await stopTunnel({ release: true });\n await Promise.all([pairQr.refreshQr(), mutStatus()]);\n void revalidateGatewayConfig();\n } catch (e) {\n dispatchUi({\n type: 'patch',\n patch: { actionError: e instanceof Error ? e.message : String(e) },\n });\n } finally {\n dispatchUi({ type: 'patch', patch: { releasing: false } });\n }\n }, [mutStatus, pairQr.refreshQr]);\n\n const copyLabels = useMemo(\n () => ({\n copy: t.copyUrl,\n copied: t.copied,\n copyFailed: messages(language).clipboard.copyFailed,\n }),\n [language, t.copyUrl, t.copied],\n );\n\n if (!hasToken) {\n return (\n <div className={embedded ? undefined : 'mx-auto w-full max-w-app-main px-4 py-8'}>\n <p className=\"text-sm text-fg-muted\">{t.needToken}</p>\n </div>\n );\n }\n\n const st = status ?? {\n enabled: false,\n state: 'disconnected' as const,\n subdomain: null,\n publicUrl: null,\n connectedSince: null,\n frpcPid: null,\n lastHeartbeatAt: null,\n lastError: null,\n consentRequired: true,\n config: { autoStart: autoStartEnabled, brokerUrl: 'https://frp.xopc.ai/api' },\n };\n\n const showConsentExpired =\n status?.consentRequired && (st.enabled || autoStartEnabled || status?.consent?.acceptedAt);\n\n const brokerSecretBlock = (\n <BrokerSecretSetupSection\n t={t}\n brokerSecretFromEnv={brokerSecretFromEnv}\n brokerSecretMissing={brokerSecretMissing}\n brokerSecretConfiguredInConfig={brokerSecretConfiguredInConfig}\n brokerSecretMaskedValue={brokerSecretConfiguredInConfig ? brokerSecretFromConfig : ''}\n brokerSecretDraft={brokerSecretDraft}\n savingBrokerSecret={savingBrokerSecret}\n brokerSecretNotice={brokerSecretNotice}\n copyFailedLabel={messages(language).clipboard.copyFailed}\n onDraftChange={(value) => dispatchUi({ type: 'patch', patch: { brokerSecretDraft: value } })}\n onSave={() => void saveBrokerSecret()}\n onClear={() => void clearBrokerSecret()}\n sectionRef={brokerSecretSectionRef}\n />\n );\n\n const dialogs = (\n <>\n <TunnelConsentDialog\n key={consentOpen ? 'consent-open' : 'consent-closed'}\n open={consentOpen}\n title={t.consentTitle}\n intro={t.consentIntro}\n bullets={consentBullets}\n checkboxLabel={t.consentCheckbox}\n confirmLabel={showConsentExpired ? t.consentReconfirm : t.consentConfirm}\n cancelLabel={t.consentCancel}\n onConfirm={() => void handleConsentConfirm()}\n onCancel={() => dispatchUi({ type: 'patch', patch: { consentOpen: false } })}\n />\n\n <ConfirmDialog\n open={autoStartConfirmOpen}\n title={t.autoStartConfirmTitle}\n description={t.autoStartConfirmBody}\n confirmLabel={t.autoStartConfirmLabel}\n cancelLabel={t.consentCancel}\n onConfirm={() => {\n dispatchUi({ type: 'patch', patch: { autoStartConfirmOpen: false } });\n void applyAutoStart(true);\n }}\n onCancel={() => dispatchUi({ type: 'patch', patch: { autoStartConfirmOpen: false } })}\n />\n\n <ConfirmDialog\n open={releaseConfirmOpen}\n title={t.releaseConfirmTitle}\n description={t.releaseConfirmBody}\n confirmLabel={t.releaseConfirmLabel}\n cancelLabel={t.consentCancel}\n destructive\n onConfirm={() => void handleRelease()}\n onCancel={() => dispatchUi({ type: 'patch', patch: { releaseConfirmOpen: false } })}\n />\n </>\n );\n\n if (embedded) {\n return (\n <div className=\"flex w-full flex-col gap-4\">\n {actionError ? <p className=\"text-sm text-red-600 dark:text-red-400\">{actionError}</p> : null}\n\n {brokerSecretBlock}\n\n <TunnelControlCard\n t={t}\n status={st}\n isLoading={isLoading}\n statusErr={statusErr}\n starting={starting}\n stopping={stopping}\n showConsentExpired={Boolean(showConsentExpired)}\n copyLabels={copyLabels}\n startDisabled={!brokerReady}\n startDisabledReason={!brokerReady ? t.brokerSecretRequiredBeforeStart : undefined}\n stepLabel={t.flowStepStart}\n onStart={handleStartClick}\n onStop={() => void handleStop()}\n />\n\n <MobilePairQrSection\n pairQr={pairQr}\n gatewayToken={token ?? ''}\n streamlined\n onRefreshQr={() => void pairQr.refreshQr()}\n />\n\n <SettingsCollapsibleSection showLabel={t.showOptions} hideLabel={t.hideOptions}>\n <label\n className={cn(\n 'flex items-center gap-3 text-sm text-fg',\n !autoStartEnabled && !status?.canAutoStart ? 'cursor-not-allowed opacity-60' : 'cursor-pointer',\n )}\n >\n <input\n type=\"checkbox\"\n className=\"size-4 rounded border-edge accent-accent\"\n checked={autoStartEnabled}\n disabled={savingAutoStart || (!autoStartEnabled && !status?.canAutoStart)}\n onChange={toggleAutoStart}\n />\n {t.autoStart}\n </label>\n {!status?.canAutoStart && !autoStartEnabled ? (\n <p className=\"text-xs text-fg-subtle\">{t.autoStartHint}</p>\n ) : null}\n\n {st.subdomain || st.publicUrl ? (\n <div className=\"space-y-2 border-t border-edge-subtle pt-4\">\n <Button\n type=\"button\"\n variant=\"secondary\"\n disabled={releasing || stopping}\n className=\"border-danger/40 text-danger hover:bg-danger/10\"\n onClick={() => dispatchUi({ type: 'patch', patch: { releaseConfirmOpen: true } })}\n >\n {releasing ? <Loader2 className=\"size-4 animate-spin\" /> : null}\n {t.release}\n </Button>\n <p className=\"text-xs text-fg-subtle\">{t.releaseHint}</p>\n </div>\n ) : null}\n </SettingsCollapsibleSection>\n\n <SettingsCollapsibleSection showLabel={t.showAdvanced} hideLabel={t.hideAdvanced}>\n <div className=\"flex flex-col gap-2 border-t border-edge-subtle pt-4 text-xs text-fg-subtle\">\n <p className=\"flex items-start gap-2\">\n <Globe className=\"mt-0.5 size-4 shrink-0 text-accent\" />\n <span>{t.brokerNote}</span>\n </p>\n <RemoteAccessDocsLink\n language={language}\n label={t.brokerDocsLink}\n section=\"public-tunnel\"\n className=\"text-xs\"\n />\n </div>\n </SettingsCollapsibleSection>\n\n {dialogs}\n </div>\n );\n }\n\n return (\n <div\n className={\n embedded\n ? 'flex w-full flex-col gap-6'\n : 'mx-auto flex w-full max-w-app-main flex-col gap-6 px-4 py-8'\n }\n >\n {!embedded ? (\n <div>\n <h1 className=\"text-lg font-semibold text-fg\">{t.title}</h1>\n <p className=\"mt-1 text-sm text-fg-muted\">{t.subtitle}</p>\n </div>\n ) : null}\n\n {actionError ? <p className=\"text-sm text-red-600 dark:text-red-400\">{actionError}</p> : null}\n\n {brokerSecretBlock}\n\n <TunnelControlCard\n t={t}\n status={st}\n isLoading={isLoading}\n statusErr={statusErr}\n starting={starting}\n stopping={stopping}\n showConsentExpired={Boolean(showConsentExpired)}\n copyLabels={copyLabels}\n startDisabled={!brokerReady}\n startDisabledReason={!brokerReady ? t.brokerSecretRequiredBeforeStart : undefined}\n onStart={handleStartClick}\n onStop={() => void handleStop()}\n />\n\n <MobilePairQrSection pairQr={pairQr} gatewayToken={token ?? ''} />\n\n {st.subdomain || st.publicUrl ? (\n <div className=\"flex flex-wrap gap-2\">\n <Button\n type=\"button\"\n variant=\"secondary\"\n disabled={releasing || stopping}\n className=\"border-danger/40 text-danger hover:bg-danger/10\"\n onClick={() => dispatchUi({ type: 'patch', patch: { releaseConfirmOpen: true } })}\n >\n {releasing ? <Loader2 className=\"size-4 animate-spin\" /> : null}\n {t.release}\n </Button>\n </div>\n ) : null}\n\n {st.subdomain || st.publicUrl ? (\n <p className=\"text-xs text-fg-subtle\">{t.releaseHint}</p>\n ) : null}\n\n <SettingsFormSection>\n <h2 className=\"mb-3 text-sm font-semibold text-fg\">{t.optionsTitle}</h2>\n <label\n className={cn(\n 'flex items-center gap-3 text-sm text-fg',\n !autoStartEnabled && !status?.canAutoStart ? 'cursor-not-allowed opacity-60' : 'cursor-pointer',\n )}\n >\n <input\n type=\"checkbox\"\n className=\"size-4 rounded border-edge accent-accent\"\n checked={autoStartEnabled}\n disabled={savingAutoStart || (!autoStartEnabled && !status?.canAutoStart)}\n onChange={toggleAutoStart}\n />\n {t.autoStart}\n </label>\n {!status?.canAutoStart && !autoStartEnabled ? (\n <p className=\"mt-2 text-xs text-fg-subtle\">{t.autoStartHint}</p>\n ) : null}\n </SettingsFormSection>\n\n <div className=\"flex flex-col gap-2 rounded-lg border border-edge-subtle bg-surface-panel px-3 py-2 text-xs text-fg-subtle\">\n <p className=\"flex items-start gap-2\">\n <Globe className=\"mt-0.5 size-4 shrink-0 text-accent\" />\n <span>{t.brokerNote}</span>\n </p>\n <RemoteAccessDocsLink\n language={language}\n label={t.brokerDocsLink}\n section=\"public-tunnel\"\n className=\"text-xs\"\n />\n </div>\n\n {dialogs}\n </div>\n );\n}\n","import { apiFetch } from '@/lib/fetch';\n\nexport type ExposureStatusResponse = {\n bindMode: string;\n tailscale: {\n mode: 'off' | 'serve' | 'funnel';\n active: boolean;\n hostname: string | null;\n resetOnExit: boolean;\n cliAvailable?: boolean;\n };\n tunnel: Record<string, unknown>;\n conflicts: Array<{ code: string; message: string }>;\n};\n\nexport async function fetchExposureStatus(): Promise<ExposureStatusResponse> {\n const res = await apiFetch('/api/exposure/status');\n if (!res.ok) {\n throw new Error(`Failed to load exposure status (${res.status})`);\n }\n return (await res.json()) as ExposureStatusResponse;\n}\n\nexport async function startTailscaleExposure(mode: 'serve' | 'funnel' = 'serve'): Promise<ExposureStatusResponse> {\n const res = await apiFetch('/api/exposure/tailscale/start', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ mode }),\n });\n if (!res.ok) {\n const body = (await res.json().catch(() => ({}))) as { error?: string };\n throw new Error(body.error ?? `Start failed (${res.status})`);\n }\n return (await res.json()) as ExposureStatusResponse;\n}\n\nexport async function stopTailscaleExposure(): Promise<ExposureStatusResponse> {\n const res = await apiFetch('/api/exposure/tailscale/stop', { method: 'POST' });\n if (!res.ok) {\n const body = (await res.json().catch(() => ({}))) as { error?: string };\n throw new Error(body.error ?? `Stop failed (${res.status})`);\n }\n return (await res.json()) as ExposureStatusResponse;\n}\n","import { Globe, Loader2, Power } from 'lucide-react';\nimport { useCallback, useMemo, useState } from 'react';\nimport useSWR from 'swr';\n\nimport { Button } from '@/components/ui/button';\nimport { CopyTextRow } from '@/components/ui/copy-text-row';\nimport {\n SettingsFormSection,\n SettingsFormSectionHeader,\n} from '@/features/settings/settings-form-section';\nimport { RemoteAccessDocsLink } from '@/features/remote-access/remote-access-docs-link';\nimport {\n fetchExposureStatus,\n startTailscaleExposure,\n stopTailscaleExposure,\n} from '@/features/remote-access/remote-access-api';\nimport { messages } from '@/i18n/messages';\nimport { useGatewayStore } from '@/stores/gateway-store';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nconst TAILSCALE_DOWNLOAD_URL = 'https://tailscale.com/download';\n\nfunction TailscaleDownloadLink({ label }: { label: string }) {\n return (\n <a\n href={TAILSCALE_DOWNLOAD_URL}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"font-medium text-accent hover:underline\"\n >\n {label}\n </a>\n );\n}\n\nexport function TailscaleServeSection({ embedded = false }: { embedded?: boolean }) {\n const language = useLocaleStore((s) => s.language);\n const t = messages(language).remoteAccess.tailscale;\n const copyLabels = useMemo(\n () => ({\n copy: t.copyUrl,\n copied: t.copied,\n copyFailed: messages(language).clipboard.copyFailed,\n }),\n [language, t.copyUrl, t.copied],\n );\n const hasToken = Boolean(useGatewayStore((s) => s.token));\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const { data, mutate, isLoading } = useSWR(\n hasToken ? 'exposure-status' : null,\n fetchExposureStatus,\n { refreshInterval: 30_000 },\n );\n\n const hostname = data?.tailscale.hostname;\n const active = data?.tailscale.active === true;\n const cliAvailable = data?.tailscale.cliAvailable !== false;\n const publicUrl = hostname ? `https://${hostname}/` : null;\n\n const onStart = useCallback(async () => {\n setBusy(true);\n setError(null);\n try {\n await startTailscaleExposure('serve');\n await mutate();\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setBusy(false);\n }\n }, [mutate]);\n\n const onStop = useCallback(async () => {\n setBusy(true);\n setError(null);\n try {\n await stopTailscaleExposure();\n await mutate();\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setBusy(false);\n }\n }, [mutate]);\n\n if (!hasToken) {\n return null;\n }\n\n const body = (\n <div className={embedded ? 'space-y-4' : 'mt-4 space-y-3'}>\n {embedded ? (\n <ol className=\"space-y-3 text-sm text-fg-muted\">\n <li className=\"flex gap-2\">\n <span className=\"flex size-5 shrink-0 items-center justify-center rounded-full bg-surface-hover text-xs font-semibold text-fg\">\n 1\n </span>\n <span>\n {t.stepInstallBefore}\n <TailscaleDownloadLink label={t.stepInstallLink} />\n {t.stepInstallAfter}\n </span>\n </li>\n <li className=\"flex gap-2\">\n <span className=\"flex size-5 shrink-0 items-center justify-center rounded-full bg-surface-hover text-xs font-semibold text-fg\">\n 2\n </span>\n <span>{t.stepEnable}</span>\n </li>\n <li className=\"flex gap-2\">\n <span className=\"flex size-5 shrink-0 items-center justify-center rounded-full bg-surface-hover text-xs font-semibold text-fg\">\n 3\n </span>\n <span>{t.stepCopy}</span>\n </li>\n </ol>\n ) : null}\n\n {embedded && data?.tailscale.cliAvailable === false ? (\n <p className=\"rounded-lg border border-amber-500/25 bg-amber-500/5 px-3 py-2 text-sm text-fg-muted\">\n {t.cliMissingIntro}{' '}\n <TailscaleDownloadLink label={t.cliMissingDownloadLink} />\n {t.cliMissingSuffix}\n </p>\n ) : null}\n\n {isLoading && !data ? (\n <p className=\"text-sm text-fg-muted\">{t.loading}</p>\n ) : (\n <>\n <SettingsFormSection>\n <p className=\"text-sm font-medium text-fg\">{t.statusLabel}</p>\n <p className=\"mt-1 text-sm text-fg-muted\">{active ? t.statusActive : t.statusOff}</p>\n {publicUrl ? (\n <div className=\"mt-3\">\n <CopyTextRow text={publicUrl} labels={copyLabels} />\n </div>\n ) : null}\n {error ? <p className=\"mt-2 text-sm text-red-600 dark:text-red-400\">{error}</p> : null}\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {!active ? (\n <Button type=\"button\" disabled={busy || !cliAvailable} onClick={() => void onStart()}>\n {busy ? <Loader2 className=\"mr-1 h-4 w-4 animate-spin\" /> : <Power className=\"mr-1 h-4 w-4\" />}\n {t.enableServe}\n </Button>\n ) : (\n <Button type=\"button\" variant=\"secondary\" disabled={busy} onClick={() => void onStop()}>\n {busy ? <Loader2 className=\"mr-1 h-4 w-4 animate-spin\" /> : null}\n {t.disableServe}\n </Button>\n )}\n </div>\n </SettingsFormSection>\n <p className=\"text-xs text-fg-subtle\">{t.hint}</p>\n <RemoteAccessDocsLink language={language} label={t.docsLink} section=\"tailscale-serve\" className=\"mt-2\" />\n </>\n )}\n </div>\n );\n\n if (embedded) {\n return body;\n }\n\n return (\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Globe} title={t.title} subtitle={t.subtitle} />\n {body}\n </SettingsFormSection>\n );\n}\n","import { ExternalLink, Server } from 'lucide-react';\nimport { Link } from 'react-router-dom';\n\nimport {\n SettingsFormSection,\n SettingsFormSectionHeader,\n} from '@/features/settings/settings-form-section';\nimport { MobilePairQrSection } from '@/features/tunnel/mobile-pair-qr-section';\nimport { useMobilePairQr } from '@/features/tunnel/use-mobile-pair-qr';\nimport { messages } from '@/i18n/messages';\nimport { useGatewayStore } from '@/stores/gateway-store';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nexport function RemoteAccessLanTab() {\n const language = useLocaleStore((s) => s.language);\n const token = useGatewayStore((s) => s.token);\n const lan = messages(language).remoteAccess.lan;\n const pairQr = useMobilePairQr(token ?? '', { preferLan: true });\n\n return (\n <div className=\"flex flex-col gap-4\">\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Server} title={lan.title} subtitle={lan.subtitle} />\n <div className=\"mt-4 space-y-3\">\n <p className=\"text-sm text-fg-muted\">{lan.body}</p>\n <Link\n to=\"/settings/gateway\"\n className=\"inline-flex items-center gap-1.5 text-sm font-medium text-accent hover:underline\"\n >\n {lan.link}\n <ExternalLink className=\"size-3.5\" aria-hidden />\n </Link>\n </div>\n </SettingsFormSection>\n\n <MobilePairQrSection\n pairQr={pairQr}\n gatewayToken={token ?? ''}\n lanOnly\n onRefreshQr={() => void pairQr.refreshQr()}\n />\n </div>\n );\n}\n","import { Copy, Terminal } from 'lucide-react';\nimport { useCallback, useState } from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport {\n SettingsFormSection,\n SettingsFormSectionHeader,\n} from '@/features/settings/settings-form-section';\nimport { messages } from '@/i18n/messages';\nimport { copyTextToClipboard } from '@/lib/copy-to-clipboard';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nexport function SshCliSection({ embedded = false }: { embedded?: boolean }) {\n const language = useLocaleStore((s) => s.language);\n const t = messages(language).remoteAccess.ssh;\n const [copied, setCopied] = useState(false);\n\n const command =\n 'xopc gateway ssh-tunnel --target user@your-host --local-port 18790 --remote-port 18790';\n\n const onCopy = useCallback(async () => {\n const ok = await copyTextToClipboard(command);\n if (!ok) return;\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }, [command]);\n\n const commandBlock = (\n <>\n <pre className=\"overflow-x-auto rounded-lg border border-edge bg-surface px-3 py-2 text-xs text-fg-muted\">\n {command}\n </pre>\n <div className=\"mt-2\">\n <Button type=\"button\" variant=\"ghost\" onClick={() => void onCopy()}>\n <Copy className=\"mr-1 h-4 w-4\" />\n {copied ? t.copied : t.copy}\n </Button>\n </div>\n {embedded ? <p className=\"mt-2 text-xs text-fg-subtle\">{t.hint}</p> : null}\n </>\n );\n\n if (embedded) {\n return (\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Terminal} title={t.title} subtitle={t.subtitle} />\n <div className=\"mt-4 space-y-2\">{commandBlock}</div>\n </SettingsFormSection>\n );\n }\n\n return (\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Terminal} title={t.title} subtitle={t.subtitle} />\n <div className=\"mt-4\">{commandBlock}</div>\n </SettingsFormSection>\n );\n}\n","import { SshCliSection } from '@/features/remote-access/ssh-cli-section';\n\nexport function RemoteAccessSshTab() {\n return <SshCliSection embedded />;\n}\n","import { Globe, Network, Server, Terminal } from 'lucide-react';\nimport useSWR from 'swr';\n\nimport { fetchExposureStatus } from '@/features/remote-access/remote-access-api';\nimport { fetchTunnelStatus } from '@/features/tunnel/tunnel-api';\nimport { messages } from '@/i18n/messages';\nimport { cn } from '@/lib/cn';\nimport { useGatewayStore } from '@/stores/gateway-store';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nimport type { RemoteAccessTabId } from './remote-access-tabs';\n\ntype StatusKind = 'active' | 'connecting' | 'off';\n\nfunction statusPillClass(kind: StatusKind): string {\n switch (kind) {\n case 'active':\n return 'bg-emerald-500/15 text-emerald-700 dark:text-emerald-400';\n case 'connecting':\n return 'bg-amber-500/15 text-amber-700 dark:text-amber-400';\n default:\n return 'bg-surface-hover text-fg-muted';\n }\n}\n\nfunction StatusPill({ label, kind }: { label: string; kind: StatusKind }) {\n return (\n <span className={cn('rounded-full px-2 py-0.5 text-[11px] font-medium', statusPillClass(kind))}>\n {label}\n </span>\n );\n}\n\nexport function RemoteAccessStatusStrip({ onOpenTab }: { onOpenTab: (tab: RemoteAccessTabId) => void }) {\n const language = useLocaleStore((s) => s.language);\n const g = messages(language).remoteAccess.guide;\n const hasToken = Boolean(useGatewayStore((s) => s.token));\n\n const { data: exposure } = useSWR(hasToken ? 'exposure-status' : null, fetchExposureStatus, {\n refreshInterval: 30_000,\n });\n const { data: tunnel } = useSWR(hasToken ? 'tunnel-status' : null, fetchTunnelStatus, {\n refreshInterval: 15_000,\n });\n\n if (!hasToken) return null;\n\n const tailscaleActive = exposure?.tailscale.active === true;\n const tunnelState = tunnel?.state;\n const tunnelActive = tunnel?.enabled && tunnelState === 'connected';\n const tunnelConnecting =\n tunnel?.enabled &&\n (tunnelState === 'connecting' ||\n tunnelState === 'reconnecting' ||\n Boolean(tunnel?.startProgress) ||\n Boolean(tunnel?.frpcDownload));\n\n const items: Array<{\n tab: RemoteAccessTabId;\n icon: typeof Globe;\n title: string;\n kind: StatusKind;\n statusLabel: string;\n }> = [\n {\n tab: 'tailscale',\n icon: Globe,\n title: g.tailscaleCardTitle,\n kind: tailscaleActive ? 'active' : 'off',\n statusLabel: tailscaleActive ? g.statusActive : g.statusOff,\n },\n {\n tab: 'public',\n icon: Network,\n title: g.publicCardTitle,\n kind: tunnelActive ? 'active' : tunnelConnecting ? 'connecting' : 'off',\n statusLabel: tunnelActive ? g.statusActive : tunnelConnecting ? g.statusConnecting : g.statusOff,\n },\n {\n tab: 'ssh',\n icon: Terminal,\n title: g.sshCardTitle,\n kind: 'off',\n statusLabel: g.sshCardStatus,\n },\n {\n tab: 'lan',\n icon: Server,\n title: g.lanCardTitle,\n kind: 'off',\n statusLabel: g.lanCardStatus,\n },\n ];\n\n return (\n <div className=\"grid gap-2 sm:grid-cols-2 lg:grid-cols-4\">\n {items.map((item) => {\n const Icon = item.icon;\n return (\n <button\n key={`${item.tab}-${item.title}`}\n type=\"button\"\n onClick={() => onOpenTab(item.tab)}\n className={cn(\n 'flex items-start gap-3 rounded-xl border border-edge-subtle bg-surface-base px-3 py-2.5 text-left transition-colors',\n 'hover:border-edge hover:bg-surface-hover/50',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent',\n )}\n >\n <span className=\"flex size-8 shrink-0 items-center justify-center rounded-lg bg-surface-hover/90 text-fg-muted\">\n <Icon className=\"size-4\" strokeWidth={1.75} aria-hidden />\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm font-medium text-fg\">{item.title}</span>\n <StatusPill label={item.statusLabel} kind={item.kind} />\n </span>\n </button>\n );\n })}\n </div>\n );\n}\n","import { ChevronRight, Globe, Network, Server, Terminal } from 'lucide-react';\nimport useSWR from 'swr';\n\nimport { RemoteAccessDocsLink } from '@/features/remote-access/remote-access-docs-link';\nimport { fetchExposureStatus } from '@/features/remote-access/remote-access-api';\nimport { messages } from '@/i18n/messages';\nimport { cn } from '@/lib/cn';\nimport { useGatewayStore } from '@/stores/gateway-store';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nimport { RemoteAccessStatusStrip } from './remote-access-status-strip';\nimport type { RemoteAccessTabId } from './remote-access-tabs';\n\ntype MethodCardProps = {\n title: string;\n description: string;\n recommended?: boolean;\n icon: typeof Globe;\n onOpen: () => void;\n openLabel: string;\n recommendedLabel?: string;\n};\n\nfunction MethodCard({\n title,\n description,\n recommended,\n icon: Icon,\n onOpen,\n openLabel,\n recommendedLabel,\n}: MethodCardProps) {\n return (\n <button\n type=\"button\"\n onClick={onOpen}\n className={cn(\n 'group flex w-full flex-col rounded-2xl bg-surface-base px-4 py-4 text-left transition-colors',\n 'hover:bg-surface-hover/40',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent',\n )}\n >\n <div className=\"flex items-start gap-3\">\n <span className=\"flex size-9 shrink-0 items-center justify-center rounded-lg bg-surface-hover/90 text-fg-muted\">\n <Icon className=\"size-4\" strokeWidth={1.75} aria-hidden />\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <h3 className=\"text-sm font-semibold text-fg\">{title}</h3>\n {recommended && recommendedLabel ? (\n <span className=\"rounded-full bg-accent-soft px-2 py-0.5 text-[11px] font-medium text-accent-fg\">\n {recommendedLabel}\n </span>\n ) : null}\n </div>\n <p className=\"mt-1 text-sm leading-relaxed text-fg-muted\">{description}</p>\n </div>\n <ChevronRight\n className=\"mt-0.5 size-4 shrink-0 text-fg-subtle transition-transform group-hover:translate-x-0.5\"\n aria-hidden\n />\n </div>\n <span className=\"mt-3 text-xs font-medium text-accent\">{openLabel}</span>\n </button>\n );\n}\n\nexport function RemoteAccessGuideTab({ onOpenTab }: { onOpenTab: (tab: RemoteAccessTabId) => void }) {\n const language = useLocaleStore((s) => s.language);\n const ra = messages(language).remoteAccess;\n const g = ra.guide;\n const hasToken = Boolean(useGatewayStore((s) => s.token));\n\n const { data: exposure } = useSWR(hasToken ? 'exposure-status' : null, fetchExposureStatus, {\n refreshInterval: 30_000,\n });\n\n const conflicts = exposure?.conflicts ?? [];\n\n if (!hasToken) {\n return <p className=\"text-sm text-fg-muted\">{g.needToken}</p>;\n }\n\n return (\n <div className=\"flex flex-col gap-6\">\n <RemoteAccessStatusStrip onOpenTab={onOpenTab} />\n\n {conflicts.length > 0 ? (\n <div className=\"rounded-xl border border-amber-500/30 bg-amber-500/5 px-4 py-3 text-sm text-fg-muted\">\n <p className=\"font-medium text-fg\">{g.conflictsTitle}</p>\n <p className=\"mt-1\">{g.conflictsHint}</p>\n <ul className=\"mt-2 list-inside list-disc text-xs\">\n {conflicts.map((c) => (\n <li key={c.code}>{c.message}</li>\n ))}\n </ul>\n </div>\n ) : null}\n\n <div>\n <h2 className=\"text-sm font-semibold text-fg\">{g.pickMethod}</h2>\n <div className=\"mt-3 grid gap-3 lg:grid-cols-2\">\n <MethodCard\n icon={Globe}\n title={g.tailscaleCardTitle}\n description={g.tailscaleCardDesc}\n recommended\n recommendedLabel={g.recommended}\n openLabel={g.configure}\n onOpen={() => onOpenTab('tailscale')}\n />\n <MethodCard\n icon={Network}\n title={g.publicCardTitle}\n description={g.publicCardDesc}\n openLabel={g.configure}\n onOpen={() => onOpenTab('public')}\n />\n <MethodCard\n icon={Terminal}\n title={g.sshCardTitle}\n description={g.sshCardDesc}\n openLabel={g.configure}\n onOpen={() => onOpenTab('ssh')}\n />\n <MethodCard\n icon={Server}\n title={g.lanCardTitle}\n description={g.lanCardDesc}\n openLabel={g.configure}\n onOpen={() => onOpenTab('lan')}\n />\n </div>\n </div>\n\n <p className=\"text-xs leading-relaxed text-fg-subtle\">{g.oneAtATimeHint}</p>\n\n <div className=\"rounded-xl border border-edge-subtle bg-surface-base px-4 py-3\">\n <h3 className=\"text-sm font-semibold text-fg\">{ra.advanced.proxyTitle}</h3>\n <p className=\"mt-1 text-sm text-fg-muted\">{ra.advanced.proxyBody}</p>\n <RemoteAccessDocsLink language={language} label={ra.advanced.proxyDocs} section=\"advanced\" className=\"mt-2\" />\n </div>\n\n <RemoteAccessDocsLink language={language} label={g.docsLink} />\n </div>\n );\n}\n","export const REMOTE_ACCESS_TABS = ['guide', 'tailscale', 'public', 'ssh', 'lan'] as const;\n\nexport type RemoteAccessTabId = (typeof REMOTE_ACCESS_TABS)[number];\n\nexport function parseRemoteAccessTab(raw: string | null): RemoteAccessTabId {\n if (raw && (REMOTE_ACCESS_TABS as readonly string[]).includes(raw)) {\n return raw as RemoteAccessTabId;\n }\n return 'guide';\n}\n","import { useCallback } from 'react';\nimport { useSearchParams } from 'react-router-dom';\n\nimport { TunnelSettingsPanel } from '@/features/tunnel/tunnel-settings';\nimport { TailscaleServeSection } from '@/features/remote-access/tailscale-serve-section';\nimport { RemoteAccessLanTab } from '@/features/remote-access/remote-access-lan-tab';\nimport { RemoteAccessSshTab } from '@/features/remote-access/remote-access-ssh-tab';\nimport { RemoteAccessGuideTab } from '@/features/remote-access/remote-access-guide-tab';\nimport { RemoteAccessDocsLink } from '@/features/remote-access/remote-access-docs-link';\nimport {\n REMOTE_ACCESS_TABS,\n parseRemoteAccessTab,\n type RemoteAccessTabId,\n} from '@/features/remote-access/remote-access-tabs';\nimport type { RemoteAccessDocsSection } from '@/navigation';\nimport { messages } from '@/i18n/messages';\nimport { cn } from '@/lib/cn';\nimport { useGatewayStore } from '@/stores/gateway-store';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nfunction tabLabel(ra: ReturnType<typeof messages>['remoteAccess'], tab: RemoteAccessTabId): string {\n return ra.tabs[tab];\n}\n\nfunction tabIntro(ra: ReturnType<typeof messages>['remoteAccess'], tab: RemoteAccessTabId): string {\n return ra.tabIntro[tab];\n}\n\nfunction tabDocsSection(tab: RemoteAccessTabId): RemoteAccessDocsSection | undefined {\n switch (tab) {\n case 'tailscale':\n return 'tailscale-serve';\n case 'public':\n return 'public-tunnel';\n case 'ssh':\n return 'ssh-tunnel';\n case 'lan':\n return 'lan';\n default:\n return undefined;\n }\n}\n\nfunction RemoteAccessTabPanel({\n tab,\n onOpenTab,\n}: {\n tab: RemoteAccessTabId;\n onOpenTab: (tab: RemoteAccessTabId) => void;\n}) {\n switch (tab) {\n case 'guide':\n return <RemoteAccessGuideTab onOpenTab={onOpenTab} />;\n case 'tailscale':\n return <TailscaleServeSection embedded />;\n case 'public':\n return <TunnelSettingsPanel embedded />;\n case 'ssh':\n return <RemoteAccessSshTab />;\n case 'lan':\n return <RemoteAccessLanTab />;\n }\n}\n\nexport function RemoteAccessHub() {\n const language = useLocaleStore((s) => s.language);\n const ra = messages(language).remoteAccess;\n const hasToken = Boolean(useGatewayStore((s) => s.token));\n const [searchParams, setSearchParams] = useSearchParams();\n\n const activeTab = parseRemoteAccessTab(searchParams.get('tab'));\n\n const setActiveTab = useCallback(\n (tab: RemoteAccessTabId) => {\n setSearchParams(\n (prev) => {\n const next = new URLSearchParams(prev);\n if (tab === 'guide') next.delete('tab');\n else next.set('tab', tab);\n return next;\n },\n { replace: true },\n );\n },\n [setSearchParams],\n );\n\n const intro = tabIntro(ra, activeTab);\n\n return (\n <div className=\"mx-auto flex w-full max-w-app-main flex-col gap-5 px-4 py-8\">\n <div>\n <h1 className=\"text-lg font-semibold text-fg\">{ra.pageTitle}</h1>\n <p className=\"mt-1 text-sm text-fg-muted\">{ra.pageSubtitle}</p>\n <RemoteAccessDocsLink\n language={language}\n label={ra.docsLink}\n section={tabDocsSection(activeTab)}\n className=\"mt-1\"\n />\n </div>\n\n {!hasToken ? (\n <p className=\"text-sm text-fg-muted\">{ra.guide.needToken}</p>\n ) : (\n <div\n className=\"flex flex-col gap-5\"\n role=\"tablist\"\n aria-label={ra.tabsAria}\n onKeyDown={(e) => {\n if (e.key !== 'ArrowLeft' && e.key !== 'ArrowRight') return;\n e.preventDefault();\n const idx = REMOTE_ACCESS_TABS.indexOf(activeTab);\n const delta = e.key === 'ArrowRight' ? 1 : -1;\n const next =\n REMOTE_ACCESS_TABS[(idx + delta + REMOTE_ACCESS_TABS.length) % REMOTE_ACCESS_TABS.length];\n setActiveTab(next);\n }}\n >\n <div className=\"-mx-1 flex gap-1 overflow-x-auto px-1 pb-1\">\n {REMOTE_ACCESS_TABS.map((tab) => {\n const selected = tab === activeTab;\n return (\n <button\n key={tab}\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n id={`remote-access-tab-${tab}`}\n aria-controls={`remote-access-panel-${tab}`}\n className={cn(\n 'shrink-0 rounded-lg px-3 py-2 text-sm font-medium transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent',\n selected\n ? 'bg-accent-soft text-accent-fg'\n : 'text-fg-muted hover:bg-surface-hover hover:text-fg',\n )}\n onClick={() => setActiveTab(tab)}\n >\n {tabLabel(ra, tab)}\n </button>\n );\n })}\n </div>\n\n {activeTab !== 'public' ? (\n <p className=\"text-sm leading-relaxed text-fg-muted\">{intro}</p>\n ) : null}\n\n <div\n role=\"tabpanel\"\n id={`remote-access-panel-${activeTab}`}\n aria-labelledby={`remote-access-tab-${activeTab}`}\n className=\"min-w-0\"\n >\n <RemoteAccessTabPanel tab={activeTab} onOpenTab={setActiveTab} />\n </div>\n </div>\n )}\n </div>\n );\n}\n","import { revalidateGatewayConfig } from '@/features/gateway/gateway-config-swr';\nimport { fetchJson } from '@/lib/fetch';\nimport { apiUrl } from '@/lib/url';\n\nexport type SharePolicyState = {\n enabled: boolean;\n defaultTtlHours: number;\n maxTtlDays: number;\n maxActiveShares: number;\n maxFileSizeMb: number;\n inlinePreviewMimes: string[];\n};\n\nconst DEFAULT_SHARE_POLICY: SharePolicyState = {\n enabled: true,\n defaultTtlHours: 24,\n maxTtlDays: 7,\n maxActiveShares: 100,\n maxFileSizeMb: 100,\n inlinePreviewMimes: [\n 'image/png',\n 'image/jpeg',\n 'image/gif',\n 'image/webp',\n 'image/svg+xml',\n 'application/pdf',\n 'text/html',\n 'text/markdown',\n 'text/plain',\n 'application/json',\n ],\n};\n\nconst MS_PER_HOUR = 3_600_000;\nconst MS_PER_DAY = 86_400_000;\nconst BYTES_PER_MB = 1_048_576;\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return v !== null && typeof v === 'object' && !Array.isArray(v);\n}\n\nfunction normalizeStringList(raw: unknown, max = 32): string[] {\n if (!Array.isArray(raw)) return [];\n return raw\n .filter((x): x is string => typeof x === 'string' && x.trim().length > 0)\n .map((x) => x.trim())\n .slice(0, max);\n}\n\nexport function normalizeSharePolicyFromConfig(config: unknown): SharePolicyState {\n const c = isRecord(config) ? config : {};\n const gw = isRecord(c.gateway) ? c.gateway : {};\n const share = isRecord(gw.share) ? gw.share : {};\n\n const defaultTtlMs =\n typeof share.defaultTtlMs === 'number' && Number.isFinite(share.defaultTtlMs)\n ? Math.floor(share.defaultTtlMs)\n : DEFAULT_SHARE_POLICY.defaultTtlHours * MS_PER_HOUR;\n const maxTtlMs =\n typeof share.maxTtlMs === 'number' && Number.isFinite(share.maxTtlMs)\n ? Math.floor(share.maxTtlMs)\n : DEFAULT_SHARE_POLICY.maxTtlDays * MS_PER_DAY;\n const maxFileSize =\n typeof share.maxFileSize === 'number' && Number.isFinite(share.maxFileSize)\n ? Math.floor(share.maxFileSize)\n : DEFAULT_SHARE_POLICY.maxFileSizeMb * BYTES_PER_MB;\n\n return {\n enabled: share.enabled !== false,\n defaultTtlHours: Math.max(1, Math.round(defaultTtlMs / MS_PER_HOUR)),\n maxTtlDays: Math.max(1, Math.round(maxTtlMs / MS_PER_DAY)),\n maxActiveShares:\n typeof share.maxActiveShares === 'number' && Number.isFinite(share.maxActiveShares)\n ? Math.max(1, Math.min(10_000, Math.floor(share.maxActiveShares)))\n : DEFAULT_SHARE_POLICY.maxActiveShares,\n maxFileSizeMb: Math.max(1, Math.round(maxFileSize / BYTES_PER_MB)),\n inlinePreviewMimes: normalizeStringList(share.inlinePreviewMimes, 32).length\n ? normalizeStringList(share.inlinePreviewMimes, 32)\n : [...DEFAULT_SHARE_POLICY.inlinePreviewMimes],\n };\n}\n\nexport function validateSharePolicy(state: SharePolicyState): string | null {\n const defaultTtlMs = state.defaultTtlHours * MS_PER_HOUR;\n const maxTtlMs = state.maxTtlDays * MS_PER_DAY;\n\n if (defaultTtlMs < 60_000 || defaultTtlMs > 604_800_000) {\n return 'Default share TTL must be between 1 minute and 7 days.';\n }\n if (maxTtlMs < 60_000 || maxTtlMs > 2_592_000_000) {\n return 'Maximum share TTL must be between 1 minute and 30 days.';\n }\n if (defaultTtlMs > maxTtlMs) {\n return 'Default TTL cannot exceed maximum TTL.';\n }\n if (state.maxFileSizeMb < 1 || state.maxFileSizeMb > 10_240) {\n return 'Maximum file size must be between 1 MB and 10 GB.';\n }\n return null;\n}\n\nexport async function patchSharePolicy(state: SharePolicyState): Promise<void> {\n const validationError = validateSharePolicy(state);\n if (validationError) {\n throw new Error(validationError);\n }\n\n await fetchJson(apiUrl('/api/config'), {\n method: 'PATCH',\n body: JSON.stringify({\n gateway: {\n share: {\n enabled: state.enabled,\n defaultTtlMs: state.defaultTtlHours * MS_PER_HOUR,\n maxTtlMs: state.maxTtlDays * MS_PER_DAY,\n maxActiveShares: state.maxActiveShares,\n maxFileSize: state.maxFileSizeMb * BYTES_PER_MB,\n inlinePreviewMimes: state.inlinePreviewMimes,\n },\n },\n }),\n });\n void revalidateGatewayConfig();\n}\n","import { Loader2 } from 'lucide-react';\nimport { useCallback, useMemo, useRef, useState } from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport { useGatewayConfigSwr } from '@/features/gateway/gateway-config-swr';\nimport {\n normalizeSharePolicyFromConfig,\n patchSharePolicy,\n type SharePolicyState,\n} from '@/features/shares/share-policy-api';\nimport { SettingsFormSection } from '@/features/settings/settings-form-section';\nimport { settingsInputFocusClass } from '@/lib/form-field-width';\nimport { cn } from '@/lib/cn';\nimport { messages, type SharesSettingsMessages } from '@/i18n/messages';\nimport { useLocaleStore } from '@/stores/locale-store';\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 Props = {\n hasToken: boolean;\n};\n\nexport function SharePolicySection({ hasToken }: Props) {\n const language = useLocaleStore((s) => s.language);\n const t = messages(language).sharesSettings;\n const { data, isLoading } = useGatewayConfigSwr(hasToken);\n\n const parsed = useMemo(\n () =>\n data?.payload?.config !== undefined\n ? structuredClone(normalizeSharePolicyFromConfig(data.payload.config))\n : null,\n [data],\n );\n\n const dirtyRef = useRef(false);\n const [localDraft, setLocalDraft] = useState<SharePolicyState | null>(null);\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [saveOk, setSaveOk] = useState(false);\n\n const form = localDraft ?? parsed;\n const baseline = parsed;\n\n const dirty = useMemo(() => {\n if (!form || !baseline) return false;\n return JSON.stringify(form) !== JSON.stringify(baseline);\n }, [form, baseline]);\n\n const update = useCallback((patch: Partial<SharePolicyState>) => {\n dirtyRef.current = true;\n setLocalDraft((prev) => {\n const base = prev ?? baseline;\n return base ? { ...base, ...patch } : null;\n });\n }, [baseline]);\n\n const save = useCallback(async () => {\n if (!form || saving) return;\n setSaving(true);\n setError(null);\n setSaveOk(false);\n try {\n await patchSharePolicy(form);\n dirtyRef.current = false;\n setLocalDraft(null);\n setSaveOk(true);\n window.setTimeout(() => setSaveOk(false), 2500);\n } catch (e) {\n setError(e instanceof Error ? e.message : t.policySaveError);\n } finally {\n setSaving(false);\n }\n }, [form, saving, t.policySaveError]);\n\n const discard = useCallback(() => {\n dirtyRef.current = false;\n setLocalDraft(null);\n setError(null);\n setSaveOk(false);\n }, []);\n\n if (!hasToken || !form) {\n if (isLoading) {\n return (\n <SettingsFormSection>\n <p className=\"flex items-center gap-2 text-sm text-fg-muted\">\n <Loader2 className=\"size-4 animate-spin\" />\n {t.policyLoading}\n </p>\n </SettingsFormSection>\n );\n }\n return null;\n }\n\n return (\n <SettingsFormSection>\n <div className=\"mb-4 flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between\">\n <div>\n <h2 className=\"text-sm font-semibold text-fg\">{t.policyTitle}</h2>\n <p className=\"mt-0.5 text-xs text-fg-muted\">{t.policyHint}</p>\n </div>\n <div className=\"flex shrink-0 flex-wrap items-center gap-2\">\n {saveOk ? <span className=\"text-sm text-fg-muted\">{t.policySaved}</span> : null}\n <Button type=\"button\" variant=\"secondary\" disabled={!dirty || saving} onClick={discard}>\n {t.policyDiscard}\n </Button>\n <Button type=\"button\" variant=\"primary\" disabled={!dirty || saving} onClick={() => void save()}>\n {saving ? t.policySaving : t.policySave}\n </Button>\n </div>\n </div>\n\n {dirty ? <p className=\"mb-3 text-xs text-amber-800 dark:text-amber-200\">{t.policyUnsaved}</p> : null}\n {error ? <p className=\"mb-3 text-sm text-red-600 dark:text-red-400\">{error}</p> : null}\n <p className=\"mb-4 text-xs text-fg-subtle\">{t.policyRestartHint}</p>\n\n <SharePolicyFields t={t} form={form} onChange={update} />\n </SettingsFormSection>\n );\n}\n\nfunction SharePolicyFields({\n t,\n form,\n onChange,\n}: {\n t: SharesSettingsMessages;\n form: SharePolicyState;\n onChange: (patch: Partial<SharePolicyState>) => void;\n}) {\n return (\n <div className=\"space-y-4\">\n <label className=\"flex cursor-pointer items-center gap-2 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"ui-checkbox\"\n checked={form.enabled}\n onChange={(e) => onChange({ enabled: e.target.checked })}\n />\n {t.policyEnabled}\n </label>\n\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <NumberField\n id=\"share-default-ttl-hours\"\n label={t.policyDefaultTtlHours}\n hint={t.policyDefaultTtlHint}\n value={form.defaultTtlHours}\n min={1}\n max={168}\n disabled={!form.enabled}\n onChange={(defaultTtlHours) => onChange({ defaultTtlHours })}\n />\n <NumberField\n id=\"share-max-ttl-days\"\n label={t.policyMaxTtlDays}\n hint={t.policyMaxTtlHint}\n value={form.maxTtlDays}\n min={1}\n max={30}\n disabled={!form.enabled}\n onChange={(maxTtlDays) => onChange({ maxTtlDays })}\n />\n <NumberField\n id=\"share-max-active\"\n label={t.policyMaxActiveShares}\n hint={t.policyMaxActiveSharesHint}\n value={form.maxActiveShares}\n min={1}\n max={10_000}\n disabled={!form.enabled}\n onChange={(maxActiveShares) => onChange({ maxActiveShares })}\n />\n <NumberField\n id=\"share-max-file-mb\"\n label={t.policyMaxFileSizeMb}\n hint={t.policyMaxFileSizeHint}\n value={form.maxFileSizeMb}\n min={1}\n max={10_240}\n disabled={!form.enabled}\n onChange={(maxFileSizeMb) => onChange({ maxFileSizeMb })}\n />\n </div>\n\n <MimeListField\n t={t}\n values={form.inlinePreviewMimes}\n disabled={!form.enabled}\n onChange={(inlinePreviewMimes) => onChange({ inlinePreviewMimes })}\n />\n </div>\n );\n}\n\nfunction NumberField({\n id,\n label,\n hint,\n value,\n min,\n max,\n disabled,\n onChange,\n}: {\n id: string;\n label: string;\n hint: string;\n value: number;\n min: number;\n max: number;\n disabled?: boolean;\n onChange: (value: number) => void;\n}) {\n return (\n <div>\n <label className=\"mb-1 block text-sm font-medium text-fg\" htmlFor={id}>\n {label}\n </label>\n <input\n id={id}\n type=\"number\"\n min={min}\n max={max}\n disabled={disabled}\n className={cn(inputClassName(), 'max-w-xs font-mono text-xs')}\n value={value}\n onChange={(e) => {\n const n = Number(e.target.value);\n if (Number.isFinite(n)) onChange(Math.max(min, Math.min(max, Math.floor(n))));\n }}\n />\n <p className=\"mt-1 text-xs text-fg-subtle\">{hint}</p>\n </div>\n );\n}\n\nfunction MimeListField({\n t,\n values,\n disabled,\n onChange,\n}: {\n t: SharesSettingsMessages;\n values: string[];\n disabled?: boolean;\n onChange: (values: string[]) => void;\n}) {\n const addValue = (raw: string) => {\n const next = raw.trim();\n if (!next || values.includes(next) || values.length >= 32) return;\n onChange([...values, next]);\n };\n\n return (\n <div className=\"space-y-2 border-t border-edge pt-4\">\n <div className=\"text-sm font-medium text-fg\">{t.policyInlinePreviewMimes}</div>\n <p className=\"text-xs text-fg-subtle\">{t.policyInlinePreviewMimesHint}</p>\n <div className=\"flex flex-wrap gap-1.5\">\n {values.map((value) => (\n <span\n key={value}\n className=\"inline-flex items-center gap-1 rounded-md border border-edge bg-surface-panel px-2 py-0.5 font-mono text-xs text-fg\"\n >\n {value}\n {!disabled ? (\n <button\n type=\"button\"\n className=\"text-fg-muted hover:text-fg\"\n aria-label={`Remove ${value}`}\n onClick={() => onChange(values.filter((x) => x !== value))}\n >\n ×\n </button>\n ) : null}\n </span>\n ))}\n </div>\n <input\n className={cn(inputClassName(), 'font-mono text-xs')}\n placeholder={t.policyMimePlaceholder}\n disabled={disabled || values.length >= 32}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n addValue((e.target as HTMLInputElement).value);\n (e.target as HTMLInputElement).value = '';\n }\n }}\n />\n </div>\n );\n}\n","import {\n Check,\n Clock,\n Copy,\n FileText,\n Loader2,\n Plus,\n RefreshCw,\n Trash2,\n} from 'lucide-react';\nimport { useCallback, useMemo, useReducer, useState } from 'react';\n\nimport { uiPatchReducer } from '@/lib/settings-form-draft';\nimport useSWR from 'swr';\n\nimport { Button } from '@/components/ui/button';\nimport { ConfirmDialog } from '@/components/ui/confirm-dialog';\nimport { SettingsFormSection } from '@/features/settings/settings-form-section';\nimport {\n cleanExpiredShares,\n createShare,\n extendShare,\n fetchShares,\n revokeShare,\n type CreateShareParams,\n type ShareItem,\n} from '@/features/shares/shares-api';\nimport {\n ReachabilityHint,\n ShareLinkDialog,\n ShareUrlCopyRows,\n type ShareLinkResult,\n} from '@/features/shares/share-link-dialog';\nimport { SharePolicySection } from '@/features/shares/share-policy-section';\nimport { cn } from '@/lib/cn';\nimport { copyTextToClipboard } from '@/lib/copy-to-clipboard';\nimport { messages } from '@/i18n/messages';\nimport { useGatewayStore } from '@/stores/gateway-store';\nimport { useLocaleStore } from '@/stores/locale-store';\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;\n}\n\nfunction formatRelativeTime(isoDate: string, language: string): string {\n const diff = new Date(isoDate).getTime() - Date.now();\n const absDiff = Math.abs(diff);\n const isPast = diff < 0;\n\n if (absDiff < 60_000) return language === 'zh' ? '刚刚' : 'just now';\n const minutes = Math.floor(absDiff / 60_000);\n if (minutes < 60) {\n const label = language === 'zh' ? `${minutes} 分钟` : `${minutes}m`;\n return isPast ? (language === 'zh' ? `${label}前` : `${label} ago`) : label;\n }\n const hours = Math.floor(minutes / 60);\n if (hours < 24) {\n const label = language === 'zh' ? `${hours} 小时` : `${hours}h`;\n return isPast ? (language === 'zh' ? `${label}前` : `${label} ago`) : label;\n }\n const days = Math.floor(hours / 24);\n const label = language === 'zh' ? `${days} 天` : `${days}d`;\n return isPast ? (language === 'zh' ? `${label}前` : `${label} ago`) : label;\n}\n\nconst TTL_OPTIONS = [\n { value: 3_600_000, key: '1h' },\n { value: 21_600_000, key: '6h' },\n { value: 86_400_000, key: '24h' },\n { value: 259_200_000, key: '3d' },\n { value: 604_800_000, key: '7d' },\n] as const;\n\n// ── Main Panel ────────────────────────────────────────────────────────────────\n\nexport function SharesSettingsPanel() {\n const language = useLocaleStore((s) => s.language);\n const t = messages(language).sharesSettings;\n const token = useGatewayStore((st) => st.token);\n const hasToken = Boolean(token);\n\n const {\n data,\n error,\n isLoading,\n mutate,\n } = useSWR(hasToken ? 'shares-list' : null, fetchShares, { refreshInterval: 30_000 });\n\n const shares = data?.payload?.shares ?? [];\n const [showExpired, setShowExpired] = useState(false);\n\n const filteredShares = useMemo(() => {\n if (showExpired) return shares;\n return shares.filter((s) => !s.expired && !s.revoked);\n }, [shares, showExpired]);\n\n const activeCount = useMemo(() => shares.filter((s) => !s.expired && !s.revoked).length, [shares]);\n const expiredCount = useMemo(() => shares.filter((s) => s.expired || s.revoked).length, [shares]);\n\n if (!hasToken) {\n return (\n <div className=\"mx-auto w-full max-w-app-main px-4 py-8\">\n <p className=\"text-sm text-fg-muted\">{t.needToken}</p>\n </div>\n );\n }\n\n return (\n <div className=\"mx-auto flex w-full max-w-app-main flex-col gap-6 px-4 py-8\">\n <div>\n <h1 className=\"text-lg font-semibold text-fg\">{t.title}</h1>\n <p className=\"mt-1 text-sm text-fg-muted\">{t.subtitle}</p>\n </div>\n\n <SharePolicySection hasToken={hasToken} />\n\n <CreateShareSection t={t} onCreated={() => void mutate()} />\n\n <SettingsFormSection>\n <div className=\"mb-3 flex items-center justify-between\">\n <h2 className=\"text-sm font-semibold text-fg\">\n {showExpired ? t.allSharesTitle : t.listTitle}\n {activeCount > 0 && (\n <span className=\"ml-2 text-xs font-normal text-fg-muted\">({activeCount})</span>\n )}\n </h2>\n <div className=\"flex items-center gap-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"px-2 py-1\"\n onClick={() => void mutate()}\n disabled={isLoading}\n >\n <RefreshCw className={cn('size-3.5', isLoading && 'animate-spin')} />\n </Button>\n {expiredCount > 0 && (\n <button\n type=\"button\"\n className=\"text-xs text-accent hover:underline\"\n onClick={() => setShowExpired((v) => !v)}\n >\n {showExpired ? t.hideExpired : t.showExpired}\n </button>\n )}\n </div>\n </div>\n\n {isLoading && !data ? (\n <p className=\"flex items-center gap-2 text-sm text-fg-muted\">\n <Loader2 className=\"size-4 animate-spin\" />\n {t.loading}\n </p>\n ) : error ? (\n <div className=\"flex items-center gap-2 text-sm text-red-600 dark:text-red-400\">\n <span>{t.error}</span>\n <Button type=\"button\" variant=\"ghost\" className=\"px-2 py-1 text-xs\" onClick={() => void mutate()}>\n {t.retry}\n </Button>\n </div>\n ) : filteredShares.length === 0 ? (\n <p className=\"text-sm text-fg-muted\">{t.emptyState}</p>\n ) : (\n <div className=\"flex flex-col gap-2\">\n {filteredShares.map((share) => (\n <ShareRow\n key={share.id}\n share={share}\n t={t}\n language={language}\n onRevoked={() => void mutate()}\n onExtended={() => void mutate()}\n />\n ))}\n </div>\n )}\n\n {expiredCount > 0 && showExpired && (\n <CleanExpiredButton t={t} onCleaned={() => void mutate()} />\n )}\n </SettingsFormSection>\n </div>\n );\n}\n\n// ── Create Section ────────────────────────────────────────────────────────────\n\ntype CreateShareUi = {\n expanded: boolean;\n path: string;\n ttlMs: number;\n maxViews: number | null;\n description: string;\n creating: boolean;\n result: ShareLinkResult | null;\n errorMsg: string | null;\n resultDialogOpen: boolean;\n};\n\nconst initialCreateShareUi: CreateShareUi = {\n expanded: false,\n path: '',\n ttlMs: 86_400_000,\n maxViews: null,\n description: '',\n creating: false,\n result: null,\n errorMsg: null,\n resultDialogOpen: false,\n};\n\nfunction CreateShareSection({\n t,\n onCreated,\n}: {\n t: ReturnType<typeof messages>['sharesSettings'];\n onCreated: () => void;\n}) {\n const [ui, dispatch] = useReducer(uiPatchReducer<CreateShareUi>, initialCreateShareUi);\n const {\n expanded,\n path,\n ttlMs,\n maxViews,\n description,\n creating,\n result,\n errorMsg,\n resultDialogOpen,\n } = ui;\n\n const handleCreate = useCallback(async () => {\n if (!path.trim()) return;\n dispatch({ type: 'patch', patch: { creating: true, errorMsg: null, result: null } });\n try {\n const params: CreateShareParams = {\n path: path.trim(),\n ttlMs,\n maxViews,\n description: description.trim() || undefined,\n };\n const res = await createShare(params);\n dispatch({ type: 'patch', patch: { result: res.payload, resultDialogOpen: true } });\n onCreated();\n } catch (err) {\n dispatch({\n type: 'patch',\n patch: { errorMsg: err instanceof Error ? err.message : String(err) },\n });\n } finally {\n dispatch({ type: 'patch', patch: { creating: false } });\n }\n }, [path, ttlMs, maxViews, description, onCreated]);\n\n const resetForm = useCallback(() => {\n dispatch({\n type: 'patch',\n patch: {\n path: '',\n description: '',\n maxViews: null,\n ttlMs: 86_400_000,\n result: null,\n errorMsg: null,\n },\n });\n }, []);\n\n if (!expanded) {\n return (\n <Button type=\"button\" onClick={() => dispatch({ type: 'patch', patch: { expanded: true } })} className=\"self-start\">\n <Plus className=\"size-4\" />\n {t.createTitle}\n </Button>\n );\n }\n\n return (\n <SettingsFormSection>\n <h2 className=\"mb-1 text-sm font-semibold text-fg\">{t.createTitle}</h2>\n <p className=\"mb-4 text-xs text-fg-muted\">{t.createHint}</p>\n\n <div className=\"flex flex-col gap-3\">\n <label className=\"flex flex-col gap-1\">\n <span className=\"text-xs font-medium text-fg\">{t.pathLabel}</span>\n <input\n type=\"text\"\n className=\"rounded-lg border border-edge bg-surface-panel px-3 py-2 text-sm text-fg placeholder:text-fg-subtle focus:outline-none focus:ring-2 focus:ring-accent\"\n placeholder={t.pathPlaceholder}\n value={path}\n onChange={(e) => dispatch({ type: 'patch', patch: { path: e.target.value } })}\n />\n </label>\n\n <div className=\"flex flex-wrap gap-3\">\n <label className=\"flex flex-col gap-1\">\n <span className=\"text-xs font-medium text-fg\">{t.ttlLabel}</span>\n <select\n className=\"rounded-lg border border-edge bg-surface-panel px-3 py-2 text-sm text-fg focus:outline-none focus:ring-2 focus:ring-accent\"\n value={ttlMs}\n onChange={(e) => dispatch({ type: 'patch', patch: { ttlMs: Number(e.target.value) } })}\n >\n {TTL_OPTIONS.map((opt) => (\n <option key={opt.key} value={opt.value}>\n {t.ttlOptions[opt.key]}\n </option>\n ))}\n </select>\n </label>\n\n <label className=\"flex flex-col gap-1\">\n <span className=\"text-xs font-medium text-fg\">{t.maxViewsLabel}</span>\n <select\n className=\"rounded-lg border border-edge bg-surface-panel px-3 py-2 text-sm text-fg focus:outline-none focus:ring-2 focus:ring-accent\"\n value={maxViews ?? 'unlimited'}\n onChange={(e) =>\n dispatch({\n type: 'patch',\n patch: {\n maxViews: e.target.value === 'unlimited' ? null : Number(e.target.value),\n },\n })\n }\n >\n <option value=\"unlimited\">{t.maxViewsUnlimited}</option>\n <option value=\"1\">1</option>\n <option value=\"5\">5</option>\n <option value=\"10\">10</option>\n <option value=\"50\">50</option>\n <option value=\"100\">100</option>\n </select>\n </label>\n </div>\n\n <label className=\"flex flex-col gap-1\">\n <span className=\"text-xs font-medium text-fg\">{t.descriptionLabel}</span>\n <input\n type=\"text\"\n className=\"rounded-lg border border-edge bg-surface-panel px-3 py-2 text-sm text-fg placeholder:text-fg-subtle focus:outline-none focus:ring-2 focus:ring-accent\"\n placeholder={t.descriptionPlaceholder}\n value={description}\n onChange={(e) => dispatch({ type: 'patch', patch: { description: e.target.value } })}\n />\n </label>\n\n <div className=\"flex items-center gap-2 pt-1\">\n <Button type=\"button\" disabled={creating || !path.trim()} onClick={() => void handleCreate()}>\n {creating ? <Loader2 className=\"size-4 animate-spin\" /> : <Plus className=\"size-4\" />}\n {creating ? t.creating : t.createButton}\n </Button>\n <Button type=\"button\" variant=\"ghost\" onClick={() => { resetForm(); dispatch({ type: 'patch', patch: { expanded: false } }); }}>\n {t.cancel}\n </Button>\n </div>\n\n {errorMsg && <p className=\"text-sm text-red-600 dark:text-red-400\">{errorMsg}</p>}\n </div>\n\n <ShareLinkDialog\n open={resultDialogOpen}\n onOpenChange={(open) => {\n dispatch({ type: 'patch', patch: { resultDialogOpen: open, ...(open ? {} : { result: null }) } });\n }}\n result={result}\n />\n </SettingsFormSection>\n );\n}\n\n// ── Share Row ─────────────────────────────────────────────────────────────────\n\ntype ShareRowUi = {\n revokeOpen: boolean;\n revoking: boolean;\n linksOpen: boolean;\n urlCopied: boolean;\n copyFailed: boolean;\n extending: boolean;\n};\n\nconst initialShareRowUi: ShareRowUi = {\n revokeOpen: false,\n revoking: false,\n linksOpen: false,\n urlCopied: false,\n copyFailed: false,\n extending: false,\n};\n\nfunction ShareRow({\n share,\n t,\n language,\n onRevoked,\n onExtended,\n}: {\n share: ShareItem;\n t: ReturnType<typeof messages>['sharesSettings'];\n language: string;\n onRevoked: () => void;\n onExtended: () => void;\n}) {\n const [ui, dispatch] = useReducer(uiPatchReducer<ShareRowUi>, initialShareRowUi);\n const { revokeOpen, revoking, linksOpen, urlCopied, copyFailed, extending } = ui;\n\n const isActive = !share.expired && !share.revoked;\n const statusLabel = share.revoked ? t.statusRevoked : share.expired ? t.statusExpired : t.statusActive;\n const statusColor = share.revoked\n ? 'text-red-600 dark:text-red-400'\n : share.expired\n ? 'text-fg-subtle'\n : 'text-emerald-600 dark:text-emerald-400';\n\n const handleRevoke = useCallback(async () => {\n dispatch({ type: 'patch', patch: { revokeOpen: false, revoking: true } });\n try {\n await revokeShare(share.id);\n onRevoked();\n } catch {\n /* silent */\n } finally {\n dispatch({ type: 'patch', patch: { revoking: false } });\n }\n }, [share.id, onRevoked]);\n\n const handleCopy = useCallback(async () => {\n dispatch({ type: 'patch', patch: { linksOpen: true, copyFailed: false } });\n const ok = await copyTextToClipboard(share.shareUrl);\n if (!ok) {\n dispatch({ type: 'patch', patch: { copyFailed: true } });\n window.setTimeout(() => dispatch({ type: 'patch', patch: { copyFailed: false } }), 2500);\n return;\n }\n dispatch({ type: 'patch', patch: { urlCopied: true } });\n window.setTimeout(() => dispatch({ type: 'patch', patch: { urlCopied: false } }), 2000);\n }, [share.shareUrl]);\n\n const handleExtend = useCallback(async () => {\n dispatch({ type: 'patch', patch: { extending: true } });\n try {\n await extendShare(share.id, 86_400_000);\n onExtended();\n } catch {\n /* silent */\n } finally {\n dispatch({ type: 'patch', patch: { extending: false } });\n }\n }, [share.id, onExtended]);\n\n return (\n <>\n <div className=\"rounded-lg border border-edge-subtle bg-surface-panel px-3 py-2.5\">\n <div className=\"flex items-start gap-3\">\n <FileText className=\"mt-0.5 size-4 shrink-0 text-fg-muted\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"truncate text-sm font-medium text-fg\">{share.fileName}</span>\n <span className={cn('text-xs font-medium', statusColor)}>{statusLabel}</span>\n </div>\n <p className=\"truncate text-xs text-fg-subtle\">{share.workspaceRelativePath}</p>\n <div className=\"mt-1 flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-fg-muted\">\n <span>{formatFileSize(share.fileSize)}</span>\n <span className=\"flex items-center gap-1\">\n <Clock className=\"size-3\" />\n {share.expired\n ? (language === 'zh' ? '已过期' : 'expired')\n : formatRelativeTime(share.expiresAt, language)}\n </span>\n <span>\n {t.views}: {share.viewCount}\n {share.maxViews !== null && ` ${t.viewsOf} ${share.maxViews}`}\n </span>\n {share.description && (\n <span className=\"italic text-fg-subtle\">{share.description}</span>\n )}\n </div>\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {isActive && (\n <>\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"px-2 py-1\"\n title={t.copyUrl}\n onClick={() => void handleCopy()}\n >\n {urlCopied ? <Check className=\"size-3.5 text-emerald-500\" /> : <Copy className=\"size-3.5\" />}\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"px-2 py-1\"\n onClick={() => void handleExtend()}\n disabled={extending}\n title={t.extend}\n >\n {extending ? <Loader2 className=\"size-3.5 animate-spin\" /> : <Clock className=\"size-3.5\" />}\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"px-2 py-1 text-red-600 hover:text-red-700 dark:text-red-400\"\n onClick={() => dispatch({ type: 'patch', patch: { revokeOpen: true } })}\n disabled={revoking}\n >\n {revoking ? <Loader2 className=\"size-3.5 animate-spin\" /> : <Trash2 className=\"size-3.5\" />}\n </Button>\n </>\n )}\n </div>\n </div>\n {isActive && linksOpen ? (\n <div className=\"mt-3 border-t border-edge-subtle pt-3 pl-7\">\n <ShareUrlCopyRows\n shareUrl={share.shareUrl}\n lanUrl={share.lanUrl}\n reachability={share.reachability}\n compact\n />\n {copyFailed ? (\n <p className=\"mt-2 text-xs text-red-600 dark:text-red-400\">{t.copyFailed}</p>\n ) : null}\n <div className=\"mt-2\">\n <ReachabilityHint reachability={share.reachability} />\n </div>\n </div>\n ) : null}\n </div>\n\n <ConfirmDialog\n open={revokeOpen}\n title={t.revokeConfirmTitle}\n description={t.revokeConfirmBody}\n confirmLabel={t.revokeConfirmLabel}\n cancelLabel={t.cancel}\n destructive\n onConfirm={() => void handleRevoke()}\n onCancel={() => dispatch({ type: 'patch', patch: { revokeOpen: false } })}\n />\n </>\n );\n}\n\n// ── Clean Expired Button ──────────────────────────────────────────────────────\n\nfunction CleanExpiredButton({\n t,\n onCleaned,\n}: {\n t: ReturnType<typeof messages>['sharesSettings'];\n onCleaned: () => void;\n}) {\n const [confirmOpen, setConfirmOpen] = useState(false);\n const [cleaning, setCleaning] = useState(false);\n\n const handleClean = useCallback(async () => {\n setConfirmOpen(false);\n setCleaning(true);\n try {\n await cleanExpiredShares();\n onCleaned();\n } catch {\n /* silent */\n } finally {\n setCleaning(false);\n }\n }, [onCleaned]);\n\n return (\n <>\n <div className=\"mt-3 flex justify-end\">\n <Button\n type=\"button\"\n variant=\"secondary\"\n disabled={cleaning}\n onClick={() => setConfirmOpen(true)}\n className=\"border-danger/40 px-2 py-1 text-xs text-danger hover:bg-danger/10\"\n >\n {cleaning ? <Loader2 className=\"size-3.5 animate-spin\" /> : <Trash2 className=\"size-3.5\" />}\n {t.cleanExpired}\n </Button>\n </div>\n\n <ConfirmDialog\n open={confirmOpen}\n title={t.cleanExpiredConfirmTitle}\n description={t.cleanExpiredConfirmBody}\n confirmLabel={t.cleanExpiredConfirmLabel}\n cancelLabel={t.cancel}\n destructive\n onConfirm={() => void handleClean()}\n onCancel={() => setConfirmOpen(false)}\n />\n </>\n );\n}\n","import { Copy, FolderOpen, Package } from 'lucide-react';\nimport { useCallback, useEffect, useReducer } from 'react';\n\nimport { uiPatchReducer } from '@/lib/settings-form-draft';\nimport * as Dialog from '@radix-ui/react-dialog';\n\nimport { Button } from '@/components/ui/button';\nimport { SettingsFormSection } from '@/features/settings/settings-form-section';\nimport { copyTextToClipboard } from '@/lib/copy-to-clipboard';\nimport { cn } from '@/lib/cn';\nimport { interaction } from '@/lib/interaction';\nimport { SETTINGS_SHELL_CONTENT_Z, SETTINGS_SHELL_OVERLAY_Z } from '@/lib/settings-shell-dialog-layer';\nimport type { UninstallErrorCode, UninstallInfo } from '@/types/electron';\n\nfunction formatBytes(bytes: number | null, unknownLabel: string): string {\n if (bytes == null) {\n return unknownLabel;\n }\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n if (bytes < 1024 * 1024) {\n return `${(bytes / 1024).toFixed(1)} KB`;\n }\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction mapUninstallError(\n code: UninstallErrorCode,\n errors: Record<string, string>,\n): string {\n if (code === 'PENDING_UPDATE') {\n return errors.pendingUpdate ?? errors.generic;\n }\n if (code === 'UNINSTALLER_NOT_FOUND') {\n return errors.uninstallerNotFound ?? errors.generic;\n }\n if (code === 'NOT_PACKAGED') {\n return errors.notPackaged ?? errors.generic;\n }\n return errors.generic;\n}\n\nfunction resolveUninstallDescription(\n info: UninstallInfo,\n m: AppManagementMessages,\n): string {\n if (info.platform === 'darwin') {\n return m.uninstallDescDarwin;\n }\n if (info.platform === 'win32') {\n return m.uninstallDescWin;\n }\n if (info.platform === 'linux') {\n if (info.linuxPackageKind === 'appimage') {\n return m.uninstallDescLinuxAppImage;\n }\n if (info.linuxPackageKind === 'deb') {\n const pkg = info.linuxDebPackageName ?? 'xopc';\n return m.uninstallDescLinuxDeb.replace(/\\{\\{package\\}\\}/g, pkg);\n }\n return m.uninstallDescLinuxUnknown;\n }\n return m.uninstallDescLinuxUnknown;\n}\n\ntype AppManagementMessages = {\n title: string;\n loading: string;\n devOnlyTitle: string;\n devOnlyBody: string;\n appPath: string;\n dataPath: string;\n dataSize: string;\n dataSizeUnknown: string;\n copyPath: string;\n copied: string;\n copyFailed: string;\n cliDataWarning: string;\n openCliData: string;\n pendingUpdateBlocked: string;\n clearData: string;\n clearDataDesc: string;\n clearDataConfirmTitle: string;\n clearDataConfirmDesc: string;\n clearDataConfirmCheckbox: string;\n clearDataConfirmPhrase: string;\n clearDataConfirmLabel: string;\n clearDataConfirmHint: string;\n uninstall: string;\n uninstallDescDarwin: string;\n uninstallDescWin: string;\n uninstallDescLinuxAppImage: string;\n uninstallDescLinuxDeb: string;\n uninstallDescLinuxUnknown: string;\n uninstallConfirmTitle: string;\n removeUserDataCheckbox: string;\n confirmClear: string;\n confirmUninstall: string;\n cancel: string;\n errors: {\n pendingUpdate: string;\n uninstallerNotFound: string;\n notPackaged: string;\n generic: string;\n };\n};\n\ntype AppManagementSectionProps = {\n api: NonNullable<Window['electronAPI']>['system'];\n messages: AppManagementMessages;\n /** When false, page title is rendered by the parent panel. */\n embedded?: boolean;\n};\n\ntype AppManagementUi = {\n info: UninstallInfo | null;\n loadError: string | null;\n actionError: string | null;\n copiedField: 'app' | 'data' | null;\n clearDialogOpen: boolean;\n clearConfirmChecked: boolean;\n clearConfirmText: string;\n uninstallDialogOpen: boolean;\n removeUserDataOnUninstall: boolean;\n busy: boolean;\n};\n\nconst initialAppManagementUi: AppManagementUi = {\n info: null,\n loadError: null,\n actionError: null,\n copiedField: null,\n clearDialogOpen: false,\n clearConfirmChecked: false,\n clearConfirmText: '',\n uninstallDialogOpen: false,\n removeUserDataOnUninstall: false,\n busy: false,\n};\n\nexport function AppManagementSection({\n api,\n messages: m,\n embedded = true,\n}: AppManagementSectionProps) {\n const [ui, dispatch] = useReducer(uiPatchReducer<AppManagementUi>, initialAppManagementUi);\n const {\n info,\n loadError,\n actionError,\n copiedField,\n clearDialogOpen,\n clearConfirmChecked,\n clearConfirmText,\n uninstallDialogOpen,\n removeUserDataOnUninstall,\n busy,\n } = ui;\n\n const load = useCallback(async () => {\n if (!api?.getUninstallInfo) {\n return;\n }\n dispatch({ type: 'patch', patch: { loadError: null } });\n try {\n const next = await api.getUninstallInfo();\n dispatch({ type: 'patch', patch: { info: next } });\n } catch (e) {\n dispatch({ type: 'patch', patch: { loadError: e instanceof Error ? e.message : String(e) } });\n }\n }, [api]);\n\n useEffect(() => {\n void load();\n }, [load]);\n\n const copyPath = async (value: string, field: 'app' | 'data') => {\n const ok = await copyTextToClipboard(value);\n if (ok) {\n dispatch({ type: 'patch', patch: { actionError: null, copiedField: field } });\n window.setTimeout(() => dispatch({ type: 'patch', patch: { copiedField: null } }), 2000);\n return;\n }\n dispatch({ type: 'patch', patch: { actionError: m.copyFailed } });\n };\n\n const openCliData = async (path: string) => {\n const shell = window.electronAPI?.shell;\n if (!shell) {\n return;\n }\n const r = await shell.openPath(path);\n if (r.error) {\n dispatch({ type: 'patch', patch: { actionError: r.error } });\n }\n };\n\n const handleClearData = async () => {\n if (!api?.clearUserData) {\n return;\n }\n dispatch({ type: 'patch', patch: { busy: true, actionError: null } });\n try {\n const result = await api.clearUserData();\n if (!result.ok) {\n dispatch({ type: 'patch', patch: { actionError: mapUninstallError(result.error, m.errors) } });\n }\n } catch (e) {\n dispatch({ type: 'patch', patch: { actionError: e instanceof Error ? e.message : m.errors.generic } });\n } finally {\n dispatch({\n type: 'patch',\n patch: { busy: false, clearDialogOpen: false, clearConfirmChecked: false, clearConfirmText: '' },\n });\n }\n };\n\n const handleUninstall = async () => {\n if (!api?.uninstallApp) {\n return;\n }\n dispatch({ type: 'patch', patch: { busy: true, actionError: null } });\n try {\n const result = await api.uninstallApp({ removeUserData: removeUserDataOnUninstall });\n if (!result.ok) {\n dispatch({ type: 'patch', patch: { actionError: mapUninstallError(result.error, m.errors) } });\n }\n } catch (e) {\n dispatch({ type: 'patch', patch: { actionError: e instanceof Error ? e.message : m.errors.generic } });\n } finally {\n dispatch({ type: 'patch', patch: { busy: false, uninstallDialogOpen: false } });\n }\n };\n\n if (loadError) {\n return (\n <p className=\"text-sm text-amber-600 dark:text-amber-400\" role=\"alert\">\n {loadError}\n </p>\n );\n }\n\n if (!info) {\n return <p className=\"text-sm text-fg-muted\">{m.loading}</p>;\n }\n\n const isDevBuild = !info.packaged;\n const actionsDisabled = busy || info.pendingUpdate || isDevBuild;\n const showUninstall = !isDevBuild && info.uninstallMode !== 'unsupported';\n const uninstallDescription = resolveUninstallDescription(info, m);\n const clearConfirmReady =\n clearConfirmChecked && clearConfirmText.trim() === m.clearDataConfirmPhrase;\n\n const openClearDialog = () => {\n dispatch({\n type: 'patch',\n patch: { clearConfirmChecked: false, clearConfirmText: '', clearDialogOpen: true },\n });\n };\n\n return (\n <>\n <SettingsFormSection>\n {embedded ? (\n <div className=\"mb-4 flex items-center gap-2 text-sm font-semibold text-fg\">\n <Package className=\"size-4 text-accent\" strokeWidth={1.75} />\n {m.title}\n </div>\n ) : null}\n\n {actionError ? (\n <p className=\"mb-3 text-sm text-amber-600 dark:text-amber-400\" role=\"alert\">\n {actionError}\n </p>\n ) : null}\n\n {isDevBuild ? (\n <div className=\"mb-4 rounded-xl border border-edge-subtle bg-surface-panel/60 px-3 py-2.5\">\n <p className=\"text-sm font-medium text-fg\">{m.devOnlyTitle}</p>\n <p className=\"mt-1 text-xs text-fg-muted\">{m.devOnlyBody}</p>\n </div>\n ) : null}\n\n {info.pendingUpdate ? (\n <p className=\"mb-3 rounded-xl border border-amber-500/30 bg-amber-500/10 px-3 py-2 text-xs text-amber-800 dark:text-amber-200\">\n {m.pendingUpdateBlocked}\n </p>\n ) : null}\n\n {info.hasSeparateCliData && info.cliDataPath ? (\n <div className=\"mb-4 rounded-xl border border-amber-500/30 bg-amber-500/10 px-3 py-2.5\">\n <p className=\"text-xs text-amber-800 dark:text-amber-200\">{m.cliDataWarning}</p>\n <button\n type=\"button\"\n className={cn(\n 'mt-2 inline-flex items-center gap-1.5 rounded-lg border border-edge bg-surface-base px-2.5 py-1.5 text-xs font-medium text-fg hover:bg-surface-hover',\n interaction.press,\n )}\n onClick={() => void openCliData(info.cliDataPath!)}\n >\n <FolderOpen className=\"size-3.5\" strokeWidth={1.75} aria-hidden />\n {m.openCliData}\n </button>\n </div>\n ) : null}\n\n <dl className=\"space-y-3 text-sm\">\n <div className=\"rounded-xl border border-edge-subtle bg-surface-panel/60 p-3\">\n <dt className=\"text-xs font-medium text-fg-muted\">{m.appPath}</dt>\n <dd className=\"mt-1 flex items-start justify-between gap-2\">\n <code className=\"break-all text-xs text-fg\">{info.appPath}</code>\n <button\n type=\"button\"\n className={cn(\n 'inline-flex shrink-0 items-center gap-1 rounded-lg border border-edge px-2 py-1 text-xs text-fg hover:bg-surface-hover',\n interaction.press,\n )}\n onClick={() => void copyPath(info.appPath, 'app')}\n >\n <Copy className=\"size-3\" aria-hidden />\n {copiedField === 'app' ? m.copied : m.copyPath}\n </button>\n </dd>\n </div>\n <div className=\"rounded-xl border border-edge-subtle bg-surface-panel/60 p-3\">\n <dt className=\"text-xs font-medium text-fg-muted\">{m.dataPath}</dt>\n <dd className=\"mt-1 flex items-start justify-between gap-2\">\n <code className=\"break-all text-xs text-fg\">{info.userDataPath}</code>\n <button\n type=\"button\"\n className={cn(\n 'inline-flex shrink-0 items-center gap-1 rounded-lg border border-edge px-2 py-1 text-xs text-fg hover:bg-surface-hover',\n interaction.press,\n )}\n onClick={() => void copyPath(info.userDataPath, 'data')}\n >\n <Copy className=\"size-3\" aria-hidden />\n {copiedField === 'data' ? m.copied : m.copyPath}\n </button>\n </dd>\n <p className=\"mt-2 text-xs text-fg-muted\">\n {m.dataSize}: {formatBytes(info.userDataSizeBytes, m.dataSizeUnknown)}\n </p>\n </div>\n </dl>\n\n <div className=\"mt-4 space-y-3\">\n <div className=\"flex flex-col gap-2 rounded-xl border border-edge-subtle bg-surface-panel/60 p-3 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <div className=\"text-sm font-medium text-fg\">{m.clearData}</div>\n <p className=\"mt-0.5 text-xs text-fg-muted\">{m.clearDataDesc}</p>\n </div>\n <button\n type=\"button\"\n disabled={actionsDisabled}\n className={cn(\n 'inline-flex shrink-0 items-center justify-center rounded-lg border border-danger/40 bg-danger px-3 py-1.5 text-sm font-medium text-white hover:bg-danger/90 disabled:opacity-50',\n interaction.press,\n )}\n onClick={openClearDialog}\n >\n {m.clearData}\n </button>\n </div>\n\n {showUninstall ? (\n <div className=\"flex flex-col gap-2 rounded-xl border border-edge-subtle bg-surface-panel/60 p-3 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <div className=\"text-sm font-medium text-fg\">{m.uninstall}</div>\n <p className=\"mt-0.5 text-xs text-fg-muted\">{uninstallDescription}</p>\n </div>\n <button\n type=\"button\"\n disabled={actionsDisabled}\n className={cn(\n 'inline-flex shrink-0 items-center justify-center rounded-lg border border-edge bg-surface-base px-3 py-1.5 text-sm font-medium text-fg hover:bg-surface-hover disabled:opacity-50',\n interaction.press,\n )}\n onClick={() => {\n dispatch({\n type: 'patch',\n patch: { removeUserDataOnUninstall: false, uninstallDialogOpen: true },\n });\n }}\n >\n {m.uninstall}\n </button>\n </div>\n ) : null}\n </div>\n </SettingsFormSection>\n\n <Dialog.Root\n open={clearDialogOpen}\n onOpenChange={(open) => {\n if (!open) {\n dispatch({\n type: 'patch',\n patch: { clearDialogOpen: false, clearConfirmChecked: false, clearConfirmText: '' },\n });\n }\n }}\n >\n <Dialog.Portal>\n <Dialog.Overlay\n className={cn(\n 'xopc-dialog-overlay fixed inset-0 bg-scrim backdrop-blur-[1px]',\n SETTINGS_SHELL_OVERLAY_Z,\n )}\n />\n <Dialog.Content\n className={cn(\n 'fixed left-1/2 top-1/2 w-[min(100%-2rem,28rem)] -translate-x-1/2 -translate-y-1/2',\n SETTINGS_SHELL_CONTENT_Z,\n 'rounded-2xl border border-edge bg-surface-panel p-6 shadow-popover outline-none dark:border-edge',\n )}\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n <Dialog.Title className=\"text-base font-semibold text-fg\">\n {m.clearDataConfirmTitle}\n </Dialog.Title>\n <Dialog.Description className=\"mt-2 text-sm text-fg-muted\">\n {m.clearDataConfirmDesc}\n </Dialog.Description>\n <label className=\"mt-4 flex cursor-pointer items-start gap-2 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"ui-checkbox mt-0.5\"\n checked={clearConfirmChecked}\n onChange={(e) => dispatch({ type: 'patch', patch: { clearConfirmChecked: e.target.checked } })}\n />\n <span>{m.clearDataConfirmCheckbox}</span>\n </label>\n <div className=\"mt-4 space-y-2\">\n <label className=\"block text-sm font-medium text-fg\" htmlFor=\"clear-data-confirm\">\n {m.clearDataConfirmLabel}\n </label>\n <input\n id=\"clear-data-confirm\"\n type=\"text\"\n autoComplete=\"off\"\n spellCheck={false}\n className={cn(\n 'w-full rounded-md border border-edge bg-surface-panel px-3 py-1.5 font-mono text-xs text-fg',\n 'placeholder:text-fg-subtle',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-surface-panel',\n 'dark:border-edge',\n )}\n placeholder={m.clearDataConfirmPhrase}\n value={clearConfirmText}\n onChange={(e) => dispatch({ type: 'patch', patch: { clearConfirmText: e.target.value } })}\n />\n <p className=\"text-xs text-fg-muted\">{m.clearDataConfirmHint}</p>\n </div>\n <div className=\"mt-6 flex justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"secondary\"\n disabled={busy}\n onClick={() => {\n dispatch({\n type: 'patch',\n patch: { clearDialogOpen: false, clearConfirmChecked: false, clearConfirmText: '' },\n });\n }}\n >\n {m.cancel}\n </Button>\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"border-danger/40 bg-danger text-white hover:bg-danger/90 dark:border-danger/40\"\n disabled={busy || !clearConfirmReady}\n onClick={() => void handleClearData()}\n >\n {m.confirmClear}\n </Button>\n </div>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n\n {showUninstall ? (\n <Dialog.Root\n open={uninstallDialogOpen}\n onOpenChange={(open) => {\n if (!open) {\n dispatch({ type: 'patch', patch: { uninstallDialogOpen: false } });\n }\n }}\n >\n <Dialog.Portal>\n <Dialog.Overlay\n className={cn(\n 'xopc-dialog-overlay fixed inset-0 bg-scrim backdrop-blur-[1px]',\n SETTINGS_SHELL_OVERLAY_Z,\n )}\n />\n <Dialog.Content\n className={cn(\n 'fixed left-1/2 top-1/2 w-[min(100%-2rem,28rem)] -translate-x-1/2 -translate-y-1/2',\n SETTINGS_SHELL_CONTENT_Z,\n 'rounded-2xl border border-edge bg-surface-panel p-6 shadow-popover outline-none dark:border-edge',\n )}\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n <Dialog.Title className=\"text-base font-semibold text-fg\">\n {m.uninstallConfirmTitle}\n </Dialog.Title>\n <Dialog.Description className=\"mt-2 text-sm text-fg-muted\">\n {uninstallDescription}\n </Dialog.Description>\n <label className=\"mt-4 flex cursor-pointer items-start gap-2 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"ui-checkbox mt-0.5\"\n checked={removeUserDataOnUninstall}\n onChange={(e) =>\n dispatch({ type: 'patch', patch: { removeUserDataOnUninstall: e.target.checked } })\n }\n />\n <span>{m.removeUserDataCheckbox}</span>\n </label>\n {removeUserDataOnUninstall ? (\n <p className=\"mt-2 text-xs text-fg-muted\">{m.clearDataConfirmDesc}</p>\n ) : null}\n <div className=\"mt-6 flex justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"secondary\"\n disabled={busy}\n onClick={() => dispatch({ type: 'patch', patch: { uninstallDialogOpen: false } })}\n >\n {m.cancel}\n </Button>\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"border-danger/40 bg-danger text-white hover:bg-danger/90 dark:border-danger/40\"\n disabled={busy}\n onClick={() => void handleUninstall()}\n >\n {m.confirmUninstall}\n </Button>\n </div>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n ) : null}\n </>\n );\n}\n","import { AppManagementSection } from '@/features/settings/app-management-section';\nimport { settingsFormSectionClassName } from '@/features/settings/settings-form-section';\nimport { isElectron } from '@/lib/electron-env';\nimport { messages } from '@/i18n/messages';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nexport function AppManagementSettingsPanel() {\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const t = m.systemSettings;\n const app = t.appManagement;\n\n const api = typeof window !== 'undefined' ? window.electronAPI?.system : undefined;\n\n if (!isElectron() || !api) {\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\">{app.title}</h1>\n <div className={settingsFormSectionClassName()}>\n <p className=\"text-sm font-medium text-fg\">{t.desktopOnlyTitle}</p>\n <p className=\"mt-1 text-sm text-fg-muted\">{t.desktopOnlyBody}</p>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"mx-auto flex w-full max-w-app-main flex-col gap-6 px-4 py-8\">\n <div>\n <h1 className=\"text-lg font-semibold text-fg\">{app.title}</h1>\n </div>\n <AppManagementSection api={api} messages={app} embedded={false} />\n </div>\n );\n}\n","import { ExternalLink, RefreshCw, Shield } from 'lucide-react';\nimport { useCallback, useEffect, useReducer } from 'react';\n\nimport { uiPatchReducer } from '@/lib/settings-form-draft';\n\nimport { SettingsFormSection, settingsFormSectionClassName } from '@/features/settings/settings-form-section';\nimport {\n dispatchShellPrefsChanged,\n enableDesktopNotificationsWithTest,\n} from '@/features/electron/desktop-notifications';\nimport { isElectron } from '@/lib/electron-env';\nimport type { StoredLanguage } from '@/lib/storage';\nimport { messages } from '@/i18n/messages';\nimport { useLocaleStore } from '@/stores/locale-store';\nimport { cn } from '@/lib/cn';\nimport { interaction } from '@/lib/interaction';\nimport type { PrivacyPaneKind, PermissionRequestResult, ShellPermissionSnapshot, SystemSettingsBehavior, TccTriState } from '@/types/electron';\n\nasync function probeRendererMicrophone(): Promise<boolean> {\n if (typeof navigator === 'undefined' || !navigator.mediaDevices?.getUserMedia) {\n return false;\n }\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n for (const track of stream.getTracks()) {\n track.stop();\n }\n return true;\n } catch {\n return false;\n }\n}\n\nfunction microphoneFeedback(\n result: PermissionRequestResult,\n rendererOk: boolean,\n fb: {\n granted: string;\n alreadyGranted: string;\n openedSettings: string;\n denied: string;\n rendererDenied: string;\n prompted: string;\n },\n): string {\n if (result.outcome === 'opened-settings') {\n return fb.openedSettings;\n }\n if (result.status === 'granted' && rendererOk) {\n return result.outcome === 'already-granted' ? fb.alreadyGranted : fb.granted;\n }\n if (!rendererOk) {\n return fb.rendererDenied;\n }\n if (result.status === 'denied') {\n return fb.denied;\n }\n return fb.prompted;\n}\n\nfunction accessibilityFeedback(\n result: PermissionRequestResult,\n fb: {\n granted: string;\n alreadyGranted: string;\n openedSettings: string;\n denied: string;\n },\n): string {\n if (result.outcome === 'opened-settings') {\n return fb.openedSettings;\n }\n if (result.status === 'granted') {\n return result.outcome === 'already-granted' ? fb.alreadyGranted : fb.granted;\n }\n return fb.denied;\n}\n\nfunction notificationFeedback(\n result: PermissionRequestResult,\n fb: {\n granted: string;\n alreadyGranted: string;\n openedSettings: string;\n denied: string;\n prompted: string;\n },\n): string {\n if (result.outcome === 'opened-settings') {\n return fb.openedSettings;\n }\n if (result.status === 'granted') {\n return result.outcome === 'already-granted' ? fb.alreadyGranted : fb.granted;\n }\n if (result.status === 'denied') {\n return fb.denied;\n }\n return fb.prompted;\n}\n\nfunction screenFeedback(\n result: PermissionRequestResult,\n fb: {\n granted: string;\n alreadyGranted: string;\n openedSettings: string;\n denied: string;\n prompted: string;\n },\n): string {\n if (result.outcome === 'opened-settings') {\n return fb.openedSettings;\n }\n if (result.status === 'granted') {\n return result.outcome === 'already-granted' ? fb.alreadyGranted : fb.granted;\n }\n if (result.status === 'denied') {\n return fb.denied;\n }\n return fb.prompted;\n}\n\nconst REQUESTABLE_PERM_KEYS = new Set<keyof ShellPermissionSnapshot>([\n 'microphone',\n 'accessibility',\n 'notifications',\n 'screen',\n]);\n\nfunction canRequestAccess(\n key: keyof ShellPermissionSnapshot,\n status: TccTriState,\n platform: SystemSettingsBehavior['platform'],\n): boolean {\n if (status === 'granted') {\n return false;\n }\n if (key === 'accessibility' && (platform === 'darwin' || platform === 'win32' || platform === 'linux')) {\n return status === 'unknown';\n }\n if (key === 'screen' && (platform === 'darwin' || platform === 'win32')) {\n return status === 'unknown';\n }\n if (REQUESTABLE_PERM_KEYS.has(key)) {\n return status === 'unknown';\n }\n return false;\n}\n\nfunction canOpenSettings(\n key: keyof ShellPermissionSnapshot,\n status: TccTriState,\n platform: SystemSettingsBehavior['platform'],\n): boolean {\n if (key === 'accessibility') {\n return false;\n }\n if (key === 'screen' && platform === 'linux') {\n return true;\n }\n if (REQUESTABLE_PERM_KEYS.has(key)) {\n return status === 'denied';\n }\n return true;\n}\n\nconst PERM_ROWS: { key: keyof ShellPermissionSnapshot; pane: PrivacyPaneKind; platforms?: Array<'darwin' | 'win32'> }[] = [\n { key: 'fullDisk', pane: 'fullDisk', platforms: ['darwin'] },\n { key: 'screen', pane: 'screen' },\n { key: 'microphone', pane: 'microphone' },\n { key: 'accessibility', pane: 'accessibility' },\n { key: 'automation', pane: 'automation' },\n { key: 'notifications', pane: 'notifications' },\n { key: 'location', pane: 'location' },\n];\n\nfunction visiblePermRows(platform: SystemSettingsBehavior['platform']) {\n if (platform === 'linux') {\n return PERM_ROWS;\n }\n return PERM_ROWS.filter((row) => !row.platforms || row.platforms.includes(platform));\n}\n\nfunction triStateFromMessages(\n lang: StoredLanguage,\n s: TccTriState,\n): { label: string; className: string } {\n const m = messages(lang).systemSettings.status;\n if (s === 'granted') {\n return { label: m.granted, className: 'text-emerald-600 dark:text-emerald-400' };\n }\n if (s === 'denied') {\n return { label: m.denied, className: 'text-amber-600 dark:text-amber-400' };\n }\n return { label: m.unknown, className: 'text-fg-muted' };\n}\n\nfunction permUnknownHint(\n lang: StoredLanguage,\n key: keyof ShellPermissionSnapshot,\n platform: SystemSettingsBehavior['platform'],\n): string | null {\n const hints = messages(lang).systemSettings.permUnknown?.[key];\n if (!hints) {\n return null;\n }\n if (platform === 'darwin' && hints.darwin) {\n return hints.darwin;\n }\n if (platform === 'win32' && hints.win32) {\n return hints.win32;\n }\n if (platform === 'linux' && hints.linux) {\n return hints.linux;\n }\n return null;\n}\n\ntype SystemPanelUi = {\n behavior: SystemSettingsBehavior | null;\n perms: ShellPermissionSnapshot | null;\n loadError: string | null;\n permFeedback: string | null;\n permBusy: boolean;\n refreshing: boolean;\n};\n\nconst initialSystemPanelUi: SystemPanelUi = {\n behavior: null,\n perms: null,\n loadError: null,\n permFeedback: null,\n permBusy: false,\n refreshing: false,\n};\n\nexport function SystemSettingsPanel() {\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const t = m.systemSettings;\n\n const [ui, dispatch] = useReducer(uiPatchReducer<SystemPanelUi>, initialSystemPanelUi);\n const { behavior, perms, loadError, permFeedback, permBusy, refreshing } = ui;\n\n const api = typeof window !== 'undefined' ? window.electronAPI?.system : undefined;\n\n const load = useCallback(\n async (options?: { showRefreshFeedback?: boolean }) => {\n if (!api) {\n return;\n }\n dispatch({ type: 'patch', patch: { loadError: null } });\n try {\n const b = await api.getBehavior();\n const nextPerms = await api.getPermissions({ probe: options?.showRefreshFeedback });\n dispatch({\n type: 'patch',\n patch: {\n behavior: b,\n perms: nextPerms,\n ...(options?.showRefreshFeedback ? { permFeedback: t.refreshDone } : {}),\n },\n });\n } catch (e) {\n dispatch({\n type: 'patch',\n patch: {\n loadError: e instanceof Error ? e.message : String(e),\n ...(options?.showRefreshFeedback ? { permFeedback: null } : {}),\n },\n });\n }\n },\n [api, t.refreshDone],\n );\n\n const handleRefresh = useCallback(async () => {\n if (refreshing || permBusy) {\n return;\n }\n dispatch({ type: 'patch', patch: { refreshing: true } });\n try {\n await load({ showRefreshFeedback: true });\n } finally {\n dispatch({ type: 'patch', patch: { refreshing: false } });\n }\n }, [load, permBusy, refreshing]);\n\n useEffect(() => {\n const autoClearMessages = new Set([\n t.refreshDone,\n t.openSettingsDone,\n t.openSettingsFailed,\n t.desktopNotify.testShown,\n ]);\n if (!permFeedback || !autoClearMessages.has(permFeedback)) {\n return;\n }\n const timer = window.setTimeout(() => {\n dispatch({ type: 'patch', patch: { permFeedback: null } });\n }, 3000);\n return () => window.clearTimeout(timer);\n }, [permFeedback, t.openSettingsDone, t.openSettingsFailed, t.refreshDone, t.desktopNotify.testShown]);\n\n useEffect(() => {\n if (isElectron() && api) {\n void load();\n }\n }, [api, load]);\n\n if (!isElectron() || !api) {\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\">{t.title}</h1>\n <div className={settingsFormSectionClassName()}>\n <p className=\"text-sm font-medium text-fg\">{t.desktopOnlyTitle}</p>\n <p className=\"mt-1 text-sm text-fg-muted\">{t.desktopOnlyBody}</p>\n </div>\n </div>\n );\n }\n\n const patchBehavior = async (patch: {\n openAtLogin?: boolean;\n keepAwakePreferred?: boolean;\n notifyEnabled?: boolean;\n notifySoundEnabled?: boolean;\n }) => {\n try {\n const { behavior: next } = await api.setBehavior(patch);\n dispatch({ type: 'patch', patch: { behavior: next } });\n if (patch.notifyEnabled !== undefined || patch.notifySoundEnabled !== undefined) {\n dispatchShellPrefsChanged();\n }\n } catch (e) {\n dispatch({ type: 'patch', patch: { loadError: e instanceof Error ? e.message : String(e) } });\n }\n };\n\n const handleNotifyDesktopToggle = async (checked: boolean) => {\n if (!checked) {\n await patchBehavior({ notifyEnabled: false });\n return;\n }\n dispatch({ type: 'patch', patch: { permBusy: true, permFeedback: null } });\n try {\n const result = await enableDesktopNotificationsWithTest(\n t.desktopNotify.testTitle,\n t.desktopNotify.testBody,\n );\n if (result === 'unsupported') {\n dispatch({ type: 'patch', patch: { permFeedback: t.notificationsFeedback.unsupported } });\n return;\n }\n if (result === 'denied') {\n dispatch({ type: 'patch', patch: { permFeedback: t.desktopNotify.denied } });\n return;\n }\n if (result === 'default') {\n dispatch({ type: 'patch', patch: { permFeedback: t.notificationsFeedback.default } });\n return;\n }\n await patchBehavior({ notifyEnabled: true });\n dispatch({ type: 'patch', patch: { perms: await api.getPermissions() } });\n dispatch({ type: 'patch', patch: { permFeedback: t.desktopNotify.testShown } });\n } catch (e) {\n dispatch({ type: 'patch', patch: { loadError: e instanceof Error ? e.message : String(e) } });\n } finally {\n dispatch({ type: 'patch', patch: { permBusy: false } });\n }\n };\n\n const openPrivacy = async (kind: PrivacyPaneKind) => {\n dispatch({ type: 'patch', patch: { permFeedback: null } });\n dispatch({ type: 'patch', patch: { loadError: null } });\n try {\n const r = await api.openPrivacy(kind);\n if (!r.ok) {\n dispatch({ type: 'patch', patch: { permFeedback: t.openSettingsFailed } });\n } else {\n dispatch({ type: 'patch', patch: { permFeedback: t.openSettingsDone } });\n }\n } catch (e) {\n dispatch({ type: 'patch', patch: { loadError: e instanceof Error ? e.message : String(e) } });\n }\n };\n\n const requestMicrophone = async () => {\n dispatch({ type: 'patch', patch: { permBusy: true, permFeedback: null } });\n dispatch({ type: 'patch', patch: { loadError: null } });\n try {\n const result = await api.requestMicrophone();\n const rendererOk = await probeRendererMicrophone();\n dispatch({ type: 'patch', patch: { perms: await api.getPermissions() } });\n dispatch({ type: 'patch', patch: { permFeedback: microphoneFeedback(result, rendererOk, t.permFeedback) } });\n } catch (e) {\n dispatch({ type: 'patch', patch: { loadError: e instanceof Error ? e.message : String(e) } });\n } finally {\n dispatch({ type: 'patch', patch: { permBusy: false } });\n }\n };\n\n const requestAccessibility = async () => {\n if (!api.requestAccessibility) {\n return;\n }\n dispatch({ type: 'patch', patch: { permBusy: true, permFeedback: null } });\n dispatch({ type: 'patch', patch: { loadError: null } });\n try {\n const result = await api.requestAccessibility();\n dispatch({ type: 'patch', patch: { perms: await api.getPermissions() } });\n dispatch({ type: 'patch', patch: { permFeedback: accessibilityFeedback(result, t.accessibilityFeedback) } });\n } catch (e) {\n dispatch({ type: 'patch', patch: { loadError: e instanceof Error ? e.message : String(e) } });\n } finally {\n dispatch({ type: 'patch', patch: { permBusy: false } });\n }\n };\n\n const requestNotifications = async () => {\n if (!api.requestNotifications) {\n return;\n }\n dispatch({ type: 'patch', patch: { permBusy: true, permFeedback: null } });\n dispatch({ type: 'patch', patch: { loadError: null } });\n try {\n const result = await api.requestNotifications();\n dispatch({ type: 'patch', patch: { perms: await api.getPermissions() } });\n dispatch({ type: 'patch', patch: { permFeedback: notificationFeedback(result, t.notificationsFeedback) } });\n } catch (e) {\n dispatch({ type: 'patch', patch: { loadError: e instanceof Error ? e.message : String(e) } });\n } finally {\n dispatch({ type: 'patch', patch: { permBusy: false } });\n }\n };\n\n const requestScreen = async () => {\n if (!api.requestScreen) {\n return;\n }\n dispatch({ type: 'patch', patch: { permBusy: true, permFeedback: null } });\n dispatch({ type: 'patch', patch: { loadError: null } });\n try {\n const result = await api.requestScreen();\n dispatch({ type: 'patch', patch: { perms: await api.getPermissions() } });\n dispatch({ type: 'patch', patch: { permFeedback: screenFeedback(result, t.screenFeedback) } });\n } catch (e) {\n dispatch({ type: 'patch', patch: { loadError: e instanceof Error ? e.message : String(e) } });\n } finally {\n dispatch({ type: 'patch', patch: { permBusy: false } });\n }\n };\n\n const permissionsHint = (() => {\n if (!behavior) {\n return t.permissionsHint;\n }\n if (behavior.platform === 'win32') {\n return t.permissionsHintWin;\n }\n if (behavior.platform === 'linux') {\n return t.permissionsHintLinux;\n }\n if (behavior.platform === 'darwin') {\n return t.permissionsHintDarwin;\n }\n return t.permissionsHint;\n })();\n\n return (\n <div className=\"mx-auto flex w-full max-w-app-main flex-col gap-6 px-4 py-8\">\n <div>\n <h1 className=\"text-lg font-semibold text-fg\">{t.title}</h1>\n </div>\n\n {loadError ? (\n <p className=\"text-sm text-amber-600 dark:text-amber-400\" role=\"alert\">\n {loadError}\n </p>\n ) : null}\n\n {permFeedback ? (\n <p\n className={cn(\n 'text-sm',\n permFeedback === t.refreshDone\n ? 'text-emerald-600 dark:text-emerald-400'\n : permFeedback === t.openSettingsDone ||\n permFeedback === t.permFeedback.granted ||\n permFeedback === t.permFeedback.alreadyGranted ||\n permFeedback === t.accessibilityFeedback.granted ||\n permFeedback === t.accessibilityFeedback.alreadyGranted ||\n permFeedback === t.notificationsFeedback.granted ||\n permFeedback === t.notificationsFeedback.alreadyGranted ||\n permFeedback === t.screenFeedback.granted ||\n permFeedback === t.screenFeedback.alreadyGranted ||\n permFeedback === t.desktopNotify.testShown\n ? 'text-emerald-600 dark:text-emerald-400'\n : 'text-fg-muted',\n )}\n role=\"status\"\n aria-live=\"polite\"\n >\n {permFeedback}\n </p>\n ) : null}\n\n <SettingsFormSection>\n <div className=\"mb-4 flex items-center gap-2 text-sm font-semibold text-fg\">\n <Shield className=\"size-4 text-accent\" strokeWidth={1.75} />\n {t.behaviorGroup}\n </div>\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between gap-3 rounded-xl bg-surface-hover/50 px-3 py-2.5 dark:bg-surface-hover/35\">\n <div>\n <div className=\"text-sm font-medium text-fg\">{t.toggles.openAtLogin}</div>\n <p className=\"text-xs text-fg-muted\">{t.toggles.openAtLoginDesc}</p>\n </div>\n <input\n type=\"checkbox\"\n className=\"ui-checkbox\"\n disabled={!behavior}\n checked={Boolean(behavior?.openAtLogin)}\n onChange={(e) => {\n void patchBehavior({ openAtLogin: e.target.checked });\n }}\n />\n </div>\n <div className=\"flex items-center justify-between gap-3 rounded-xl bg-surface-hover/50 px-3 py-2.5 dark:bg-surface-hover/35\">\n <div>\n <div className=\"text-sm font-medium text-fg\">{t.toggles.keepAwake}</div>\n <p className=\"text-xs text-fg-muted\">{t.toggles.keepAwakeDesc}</p>\n </div>\n <input\n type=\"checkbox\"\n className=\"ui-checkbox\"\n disabled={!behavior}\n checked={Boolean(behavior?.keepAwakePreferred)}\n onChange={(e) => {\n void patchBehavior({ keepAwakePreferred: e.target.checked });\n }}\n />\n </div>\n <div className=\"flex items-center justify-between gap-3 rounded-xl bg-surface-hover/50 px-3 py-2.5 dark:bg-surface-hover/35\">\n <div>\n <div className=\"text-sm font-medium text-fg\">{t.toggles.notifyDesktop}</div>\n <p className=\"text-xs text-fg-muted\">{t.toggles.notifyDesktopDesc}</p>\n </div>\n <input\n type=\"checkbox\"\n className=\"ui-checkbox\"\n disabled={!behavior || permBusy}\n checked={Boolean(behavior?.notifyEnabled)}\n onChange={(e) => {\n void handleNotifyDesktopToggle(e.target.checked);\n }}\n />\n </div>\n <div className=\"flex items-center justify-between gap-3 rounded-xl bg-surface-hover/50 px-3 py-2.5 dark:bg-surface-hover/35\">\n <div>\n <div className=\"text-sm font-medium text-fg\">{t.toggles.notifySound}</div>\n <p className=\"text-xs text-fg-muted\">{t.toggles.notifySoundDesc}</p>\n </div>\n <input\n type=\"checkbox\"\n className=\"ui-checkbox\"\n disabled={!behavior}\n checked={Boolean(behavior?.notifySoundEnabled)}\n onChange={(e) => {\n void patchBehavior({ notifySoundEnabled: e.target.checked });\n }}\n />\n </div>\n </div>\n </SettingsFormSection>\n\n {behavior && perms ? (\n <section className={settingsFormSectionClassName()}>\n <div className=\"mb-4 flex flex-col gap-1 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <h2 className=\"text-sm font-semibold text-fg\">{t.permissionsTitle}</h2>\n <p className=\"mt-0.5 text-xs text-fg-muted\">{permissionsHint}</p>\n {behavior.platform === 'darwin' && !behavior.packaged ? (\n <p className=\"mt-1 text-xs text-amber-600 dark:text-amber-400\">{t.permissionsHintDevDarwin}</p>\n ) : null}\n </div>\n <button\n type=\"button\"\n disabled={refreshing || permBusy}\n aria-busy={refreshing}\n className={cn(\n 'mt-2 inline-flex max-w-full items-center justify-center gap-1.5 rounded-lg border border-edge bg-surface-panel px-3 py-1.5 text-sm font-medium text-fg transition-colors hover:bg-surface-hover disabled:opacity-50 sm:mt-0',\n interaction.press,\n )}\n onClick={() => void handleRefresh()}\n >\n <RefreshCw\n className={cn('size-3.5', refreshing && 'animate-spin')}\n strokeWidth={1.75}\n aria-hidden\n />\n {refreshing ? t.refreshing : t.refresh}\n </button>\n </div>\n <ul className=\"space-y-3\">\n {visiblePermRows(behavior.platform).map(({ key, pane }) => {\n const st = triStateFromMessages(language, perms[key]);\n const permLabel = t.perm[key];\n const unknownHint =\n perms[key] === 'unknown' ? permUnknownHint(language, key, behavior.platform) : null;\n if (!permLabel) {\n return null;\n }\n return (\n <li\n key={key}\n className=\"flex flex-col gap-2 rounded-xl border border-edge-subtle bg-surface-panel/60 p-3 sm:flex-row sm:items-center sm:justify-between\"\n >\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-medium text-fg\">{permLabel.title}</div>\n <p className=\"mt-0.5 text-xs text-fg-muted\">{permLabel.desc}</p>\n <p className={`mt-1 text-xs font-medium ${st.className}`}>{st.label}</p>\n {unknownHint ? (\n <p className=\"mt-1 text-xs text-fg-muted\">{unknownHint}</p>\n ) : null}\n </div>\n <div className=\"flex shrink-0 flex-wrap items-center gap-2\">\n {key === 'notifications' && canRequestAccess(key, perms[key], behavior.platform) ? (\n <button\n type=\"button\"\n disabled={permBusy}\n className={cn(\n 'inline-flex items-center gap-1 rounded-lg border border-edge bg-surface-base px-2.5 py-1.5 text-xs font-medium text-fg hover:bg-surface-hover disabled:opacity-50',\n interaction.press,\n )}\n onClick={() => void requestNotifications()}\n >\n {t.requestAccess}\n </button>\n ) : null}\n {key === 'microphone' && canRequestAccess(key, perms[key], behavior.platform) ? (\n <button\n type=\"button\"\n disabled={permBusy}\n className={cn(\n 'inline-flex items-center gap-1 rounded-lg border border-edge bg-surface-base px-2.5 py-1.5 text-xs font-medium text-fg hover:bg-surface-hover disabled:opacity-50',\n interaction.press,\n )}\n onClick={() => void requestMicrophone()}\n >\n {t.requestAccess}\n </button>\n ) : null}\n {key === 'accessibility' &&\n canRequestAccess(key, perms[key], behavior.platform) ? (\n <button\n type=\"button\"\n disabled={permBusy}\n className={cn(\n 'inline-flex items-center gap-1 rounded-lg border border-edge bg-surface-base px-2.5 py-1.5 text-xs font-medium text-fg hover:bg-surface-hover disabled:opacity-50',\n interaction.press,\n )}\n onClick={() => void requestAccessibility()}\n >\n {t.requestAccess}\n </button>\n ) : null}\n {key === 'screen' && canRequestAccess(key, perms[key], behavior.platform) ? (\n <button\n type=\"button\"\n disabled={permBusy}\n className={cn(\n 'inline-flex items-center gap-1 rounded-lg border border-edge bg-surface-base px-2.5 py-1.5 text-xs font-medium text-fg hover:bg-surface-hover disabled:opacity-50',\n interaction.press,\n )}\n onClick={() => void requestScreen()}\n >\n {t.requestAccess}\n </button>\n ) : null}\n {canOpenSettings(key, perms[key], behavior.platform) ? (\n <button\n type=\"button\"\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-lg border border-edge bg-surface-base px-2.5 py-1.5 text-xs font-medium text-fg hover:bg-surface-hover',\n interaction.press,\n )}\n onClick={() => void openPrivacy(pane)}\n >\n {t.openSettings}\n <ExternalLink className=\"size-3.5\" strokeWidth={1.75} aria-hidden />\n </button>\n ) : null}\n </div>\n </li>\n );\n })}\n </ul>\n </section>\n ) : null}\n </div>\n );\n}\n","export type McpHeaderEntry = {\n key: string;\n value: string;\n};\n\nconst MCP_HEADER_LINE = /^([^:=]+)[:=](.*)$/;\n\nexport function parseHeadersPaste(text: string): McpHeaderEntry[] | null {\n const trimmed = text.trim();\n if (!trimmed) return null;\n\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return Object.entries(parsed as Record<string, unknown>).map(([key, value]) => ({\n key,\n value: value == null ? '' : String(value),\n }));\n }\n } catch {\n // fall through to line parsing\n }\n\n const rows: McpHeaderEntry[] = [];\n for (const line of trimmed.split(/\\r?\\n/)) {\n const row = line.trim();\n if (!row) continue;\n const match = MCP_HEADER_LINE.exec(row);\n if (!match) continue;\n rows.push({\n key: match[1].trim(),\n value: match[2].trim(),\n });\n }\n return rows.length > 0 ? rows : null;\n}\n\nexport function headersToRecord(headers: McpHeaderEntry[]): Record<string, string> | undefined {\n const out: Record<string, string> = {};\n for (const row of headers) {\n const key = row.key.trim();\n if (!key) continue;\n out[key] = row.value;\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nexport function recordToHeaders(record: Record<string, unknown> | undefined): McpHeaderEntry[] {\n if (!record || typeof record !== 'object') {\n return [{ key: '', value: '' }];\n }\n const rows = Object.entries(record).map(([key, value]) => ({\n key,\n value: value == null ? '' : String(value),\n }));\n return rows.length > 0 ? rows : [{ key: '', value: '' }];\n}\n","import { revalidateGatewayConfig } from '@/features/gateway/gateway-config-swr';\nimport {\n headersToRecord,\n recordToHeaders,\n type McpHeaderEntry,\n} from '@/features/settings/mcp/mcp-headers-utils';\nimport { fetchJson } from '@/lib/fetch';\nimport { apiUrl } from '@/lib/url';\n\nexport type McpToolInfo = {\n name: string;\n shortName?: string;\n description?: string;\n};\n\nexport type McpTransportKind = 'stdio' | 'sse' | 'streamable-http';\n\nexport type McpServerRow = {\n /** Stable React list key; not persisted to config. */\n clientKey: string;\n id: string;\n transport: McpTransportKind;\n command: string;\n argsText: string;\n envJson: string;\n cwd: string;\n url: string;\n headers: McpHeaderEntry[];\n connectionTimeoutMs: number | undefined;\n};\n\nexport type McpSettingsState = {\n sessionIdleTtlMinutes: number | undefined;\n servers: McpServerRow[];\n};\n\nfunction parseArgsText(text: string): string[] | undefined {\n const trimmed = text.trim();\n if (!trimmed) return undefined;\n return trimmed.split(/\\s+/).filter(Boolean);\n}\n\nfunction parseJsonObject(text: string): Record<string, unknown> | undefined {\n const trimmed = text.trim();\n if (!trimmed) return undefined;\n const parsed = JSON.parse(trimmed) as unknown;\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new Error('Expected a JSON object');\n }\n return parsed as Record<string, unknown>;\n}\n\nfunction rowToServerConfig(row: McpServerRow): Record<string, unknown> {\n if (row.transport === 'stdio') {\n const config: Record<string, unknown> = {\n command: row.command.trim(),\n };\n const args = parseArgsText(row.argsText);\n if (args?.length) config.args = args;\n if (row.cwd.trim()) config.cwd = row.cwd.trim();\n if (row.envJson.trim()) config.env = parseJsonObject(row.envJson);\n if (row.connectionTimeoutMs != null && Number.isFinite(row.connectionTimeoutMs)) {\n config.connectionTimeoutMs = row.connectionTimeoutMs;\n }\n return config;\n }\n\n const config: Record<string, unknown> = {\n url: row.url.trim(),\n transport: row.transport,\n };\n const headers = headersToRecord(row.headers);\n if (headers) config.headers = headers;\n if (row.connectionTimeoutMs != null && Number.isFinite(row.connectionTimeoutMs)) {\n config.connectionTimeoutMs = row.connectionTimeoutMs;\n }\n return config;\n}\n\nfunction serverConfigToRow(id: string, raw: Record<string, unknown>): McpServerRow {\n const hasUrl = typeof raw.url === 'string' && raw.url.trim().length > 0;\n const transportRaw = typeof raw.transport === 'string' ? raw.transport.trim().toLowerCase() : '';\n const transport: McpTransportKind = hasUrl\n ? transportRaw === 'sse'\n ? 'sse'\n : 'streamable-http'\n : 'stdio';\n\n const headersRaw =\n raw.headers && typeof raw.headers === 'object' && !Array.isArray(raw.headers)\n ? (raw.headers as Record<string, unknown>)\n : undefined;\n\n return {\n clientKey: id,\n id,\n transport,\n command: typeof raw.command === 'string' ? raw.command : '',\n argsText: Array.isArray(raw.args) ? raw.args.map(String).join(' ') : '',\n envJson: raw.env && typeof raw.env === 'object' ? JSON.stringify(raw.env, null, 2) : '',\n cwd: typeof raw.cwd === 'string' ? raw.cwd : typeof raw.workingDirectory === 'string' ? raw.workingDirectory : '',\n url: typeof raw.url === 'string' ? raw.url : '',\n headers: recordToHeaders(headersRaw),\n connectionTimeoutMs:\n typeof raw.connectionTimeoutMs === 'number' && Number.isFinite(raw.connectionTimeoutMs)\n ? raw.connectionTimeoutMs\n : undefined,\n };\n}\n\nexport function emptyMcpServerRow(id = ''): McpServerRow {\n return {\n clientKey: crypto.randomUUID(),\n id,\n transport: 'stdio',\n command: '',\n argsText: '',\n envJson: '',\n cwd: '',\n url: '',\n headers: [{ key: 'Authorization', value: '' }],\n connectionTimeoutMs: undefined,\n };\n}\n\nexport function normalizeMcpSettingsFromConfig(cfg: unknown): McpSettingsState {\n const mcp =\n cfg && typeof cfg === 'object' && 'mcp' in cfg ? (cfg as { mcp?: unknown }).mcp : undefined;\n const root = mcp && typeof mcp === 'object' ? (mcp as Record<string, unknown>) : {};\n const serversRaw = root.servers;\n const servers: McpServerRow[] =\n serversRaw && typeof serversRaw === 'object' && !Array.isArray(serversRaw)\n ? Object.entries(serversRaw as Record<string, unknown>)\n .flatMap(([id, v]) => {\n if (!v || typeof v !== 'object') return [];\n return [serverConfigToRow(id, v as Record<string, unknown>)];\n })\n .sort((a, b) => a.id.localeCompare(b.id))\n : [];\n\n const ttlMs = typeof root.sessionIdleTtlMs === 'number' ? root.sessionIdleTtlMs : undefined;\n const sessionIdleTtlMinutes =\n ttlMs == null ? undefined : ttlMs === 0 ? 0 : Math.round(ttlMs / 60_000);\n\n return { sessionIdleTtlMinutes, servers };\n}\n\nexport function buildMcpServerConfigFromRow(row: McpServerRow): Record<string, unknown> {\n return rowToServerConfig(row);\n}\n\nexport async function patchMcpSettings(state: McpSettingsState): Promise<void> {\n const servers: Record<string, unknown> = {};\n for (const row of state.servers) {\n const id = row.id.trim();\n if (!id) continue;\n servers[id] = rowToServerConfig(row);\n }\n\n const mcp: Record<string, unknown> = { servers };\n if (state.sessionIdleTtlMinutes != null && Number.isFinite(state.sessionIdleTtlMinutes)) {\n mcp.sessionIdleTtlMs =\n state.sessionIdleTtlMinutes === 0 ? 0 : Math.round(state.sessionIdleTtlMinutes * 60_000);\n }\n\n await fetchJson(apiUrl('/api/config'), {\n method: 'PATCH',\n body: JSON.stringify({ mcp }),\n });\n void revalidateGatewayConfig();\n}\n\nexport type McpServerTestResult = {\n serverId: string;\n toolCount: number;\n tools: McpToolInfo[];\n};\n\n/** Accept legacy `string[]` or `{ name, description? }[]` from the gateway. */\nfunction normalizeMcpTools(tools: unknown): McpToolInfo[] {\n if (!Array.isArray(tools)) return [];\n const out: McpToolInfo[] = [];\n for (const item of tools) {\n if (typeof item === 'string') {\n const name = item.trim();\n if (name) out.push({ name });\n continue;\n }\n if (!item || typeof item !== 'object') continue;\n const raw = item as { name?: unknown; shortName?: unknown; description?: unknown };\n if (typeof raw.name !== 'string') continue;\n const name = raw.name.trim();\n if (!name) continue;\n const shortName =\n typeof raw.shortName === 'string' && raw.shortName.trim() ? raw.shortName.trim() : undefined;\n const description =\n typeof raw.description === 'string' && raw.description.trim()\n ? raw.description.trim()\n : undefined;\n out.push({ name, shortName, description });\n }\n return out;\n}\n\nexport async function testMcpServer(\n serverId: string,\n server?: Record<string, unknown>,\n): Promise<McpServerTestResult> {\n const res = await fetchJson<{\n ok?: boolean;\n payload?: { serverId?: string; toolCount?: number; tools?: unknown };\n error?: string;\n }>(\n apiUrl(`/api/mcp/servers/${encodeURIComponent(serverId)}/test`),\n {\n method: 'POST',\n body: server ? JSON.stringify({ server }) : undefined,\n },\n );\n if (!res.payload) {\n throw new Error(res.error ?? 'MCP test failed');\n }\n const tools = normalizeMcpTools(res.payload.tools);\n return {\n serverId: res.payload.serverId ?? serverId,\n toolCount: typeof res.payload.toolCount === 'number' ? res.payload.toolCount : tools.length,\n tools,\n };\n}\n\nexport function connectionTimeoutSeconds(row: McpServerRow): string {\n if (row.connectionTimeoutMs == null || !Number.isFinite(row.connectionTimeoutMs)) return '';\n return String(Math.round(row.connectionTimeoutMs / 1000));\n}\n\nexport function parseConnectionTimeoutSeconds(raw: string): number | undefined {\n const trimmed = raw.trim();\n if (!trimmed) return undefined;\n const seconds = Number.parseInt(trimmed, 10);\n if (!Number.isFinite(seconds) || seconds < 1 || seconds > 600) return undefined;\n return seconds * 1000;\n}\n\nexport function mcpServerCardKey(row: McpServerRow, _index: number): string {\n return row.clientKey;\n}\n","import { ClipboardPaste, Trash2 } from 'lucide-react';\n\nimport { Button } from '@/components/ui/button';\nimport { parseHeadersPaste, type McpHeaderEntry } from '@/features/settings/mcp/mcp-headers-utils';\nimport { readTextFromClipboard } from '@/lib/copy-to-clipboard';\nimport { settingsInputFocusClass } from '@/lib/form-field-width';\nimport { cn } from '@/lib/cn';\nimport { interaction } from '@/lib/interaction';\n\ntype Props = {\n label: string;\n optionalLabel?: string;\n addLabel: string;\n removeHeaderAria: string;\n pasteLabel: string;\n pasteFailed: string;\n keyPlaceholder: string;\n valuePlaceholder: string;\n headers: McpHeaderEntry[];\n onChange: (headers: McpHeaderEntry[]) => void;\n};\n\nfunction headerRowKey(row: McpHeaderEntry, index: number, all: McpHeaderEntry[]): string {\n const key = row.key.trim();\n if (key) return `key:${key}`;\n const value = row.value.trim();\n if (value) return `value:${value}`;\n const emptySlot = all.slice(0, index).filter((r) => !r.key.trim() && !r.value.trim()).length;\n return `empty:${emptySlot}`;\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 );\n}\n\nexport function McpHeadersEditor({\n label,\n optionalLabel,\n addLabel,\n removeHeaderAria,\n pasteLabel,\n pasteFailed,\n keyPlaceholder,\n valuePlaceholder,\n headers,\n onChange,\n}: Props) {\n const updateRow = (index: number, patch: Partial<McpHeaderEntry>) => {\n onChange(headers.map((row, i) => (i === index ? { ...row, ...patch } : row)));\n };\n\n const addRow = () => {\n onChange([...headers, { key: '', value: '' }]);\n };\n\n const removeRow = (index: number) => {\n const next = headers.filter((_, i) => i !== index);\n onChange(next.length > 0 ? next : [{ key: '', value: '' }]);\n };\n\n const pasteFromClipboard = async () => {\n try {\n const text = await readTextFromClipboard();\n if (!text) {\n window.alert(pasteFailed);\n return;\n }\n const parsed = parseHeadersPaste(text);\n if (!parsed?.length) {\n window.alert(pasteFailed);\n return;\n }\n onChange(parsed);\n } catch {\n window.alert(pasteFailed);\n }\n };\n\n return (\n <div className=\"flex flex-col gap-2 md:col-span-2\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-1.5 text-sm font-medium text-fg\">\n <span>{label}</span>\n {optionalLabel ? <span className=\"font-normal text-fg-subtle\">{optionalLabel}</span> : null}\n </div>\n <Button type=\"button\" variant=\"ghost\" className=\"h-8 gap-1.5 px-2 text-xs\" onClick={() => void pasteFromClipboard()}>\n <ClipboardPaste className=\"size-3.5\" aria-hidden />\n {pasteLabel}\n </Button>\n </div>\n\n <div className=\"flex flex-col gap-2\">\n {headers.map((row, index) => (\n <div key={headerRowKey(row, index, headers)} className=\"flex items-center gap-2\">\n <input\n className={cn(inputClassName(), 'min-w-0 flex-1 font-mono text-xs')}\n value={row.key}\n placeholder={keyPlaceholder}\n onChange={(e) => updateRow(index, { key: e.target.value })}\n />\n <input\n className={cn(inputClassName(), 'min-w-0 flex-[1.4] font-mono text-xs')}\n value={row.value}\n placeholder={valuePlaceholder}\n onChange={(e) => updateRow(index, { value: e.target.value })}\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"size-9 shrink-0 px-0\"\n disabled={headers.length <= 1 && !row.key && !row.value}\n onClick={() => removeRow(index)}\n aria-label={removeHeaderAria}\n >\n <Trash2 className=\"size-4 text-fg-subtle\" aria-hidden />\n </Button>\n </div>\n ))}\n </div>\n\n <button\n type=\"button\"\n className={cn('self-start text-sm text-accent hover:underline', interaction.press)}\n onClick={addRow}\n >\n + {addLabel}\n </button>\n </div>\n );\n}\n","import { ChevronDown, Loader2, Plug, Trash2, Wrench, Zap } from 'lucide-react';\nimport type { ReactNode } from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport { McpHeadersEditor } from '@/features/settings/mcp/mcp-headers-editor';\nimport {\n connectionTimeoutSeconds,\n parseConnectionTimeoutSeconds,\n type McpServerRow,\n type McpToolInfo,\n type McpTransportKind,\n} from '@/features/settings/mcp/mcp-config-api';\nimport type { McpSettingsMessages } from '@/i18n/messages';\nimport { settingsInputFocusClass } from '@/lib/form-field-width';\nimport { cn } from '@/lib/cn';\nimport { interaction } from '@/lib/interaction';\n\nconst TRANSPORTS: McpTransportKind[] = ['stdio', 'sse', 'streamable-http'];\n\ntype ServerToolsState =\n | { status: 'idle' }\n | { status: 'loading' }\n | { status: 'ok'; tools: McpToolInfo[] }\n | { status: 'error'; message: string };\n\nfunction Field({\n label,\n description,\n required,\n children,\n}: {\n label: string;\n description?: string;\n required?: boolean;\n children: ReactNode;\n}) {\n return (\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"text-sm font-medium text-fg\">\n {label}\n {required ? <span className=\"ml-0.5 text-danger\">*</span> : null}\n </div>\n {children}\n {description ? <p className=\"text-xs leading-relaxed text-fg-subtle\">{description}</p> : null}\n </div>\n );\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 );\n}\n\nfunction serverEndpointSummary(row: McpServerRow): string {\n if (row.transport === 'stdio') {\n const command = row.command.trim();\n if (!command) return '';\n const args = row.argsText.trim();\n return args ? `${command} ${args}` : command;\n }\n return row.url.trim();\n}\n\ntype Props = {\n row: McpServerRow;\n expanded: boolean;\n onToggle: () => void;\n t: McpSettingsMessages;\n testing: boolean;\n toolState: ServerToolsState;\n onUpdate: (patch: Partial<McpServerRow>) => void;\n onRemove: () => void;\n onTest: () => void;\n onViewTools: (tools: McpToolInfo[]) => void;\n};\n\nexport function McpServerCard({\n row,\n expanded,\n onToggle,\n t,\n testing,\n toolState,\n onUpdate,\n onRemove,\n onTest,\n onViewTools,\n}: Props) {\n const title = row.id.trim() || t.cardUntitled;\n const summary = serverEndpointSummary(row);\n const transportLabel = t.transportLabels[row.transport];\n\n return (\n <div className=\"rounded-xl border border-edge bg-surface-panel\">\n <div className=\"flex items-start gap-2 p-4\">\n <button\n type=\"button\"\n className={cn(\n 'flex min-w-0 flex-1 items-start gap-2 rounded-lg text-left hover:opacity-90',\n interaction.press,\n )}\n aria-expanded={expanded}\n aria-label={expanded ? t.cardCollapseAria : t.cardExpandAria}\n onClick={onToggle}\n >\n <ChevronDown\n className={cn(\n 'mt-0.5 size-4 shrink-0 text-fg-subtle transition-transform',\n expanded && 'rotate-180',\n )}\n aria-hidden\n />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <Plug className=\"size-4 shrink-0 text-accent\" aria-hidden />\n <span className=\"truncate font-medium text-fg\">{title}</span>\n <span className=\"rounded-md border border-edge bg-surface-base px-1.5 py-0.5 text-[11px] text-fg-muted\">\n {transportLabel}\n </span>\n {toolState.status === 'ok' && toolState.tools.length > 0 ? (\n <span className=\"inline-flex items-center gap-1 rounded-md border border-edge bg-surface-base px-1.5 py-0.5 text-[11px] text-fg-muted\">\n <Wrench className=\"size-3\" aria-hidden />\n {toolState.tools.length}\n </span>\n ) : null}\n </div>\n {!expanded && summary ? (\n <p className=\"mt-1 truncate font-mono text-xs text-fg-subtle\" title={summary}>\n {summary}\n </p>\n ) : null}\n {!expanded && toolState.status === 'error' ? (\n <p className=\"mt-1 truncate text-xs text-red-600 dark:text-red-300\" title={toolState.message}>\n {toolState.message}\n </p>\n ) : null}\n </div>\n </button>\n\n <div className=\"flex shrink-0 flex-wrap items-center gap-1\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"h-8 px-2 text-xs\"\n disabled={!row.id.trim() || testing}\n onClick={(e) => {\n e.stopPropagation();\n onTest();\n }}\n >\n {testing ? (\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n ) : (\n <Zap className=\"size-4\" aria-hidden />\n )}\n {t.testConnection}\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"h-8 px-2 text-xs\"\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n >\n <Trash2 className=\"size-4\" aria-hidden />\n {t.removeServer}\n </Button>\n </div>\n </div>\n\n {expanded ? (\n <div className=\"border-t border-edge px-4 pb-4 pt-3\">\n <div className=\"grid gap-4 md:grid-cols-2\">\n <Field label={t.transportLabel} required>\n <select\n className={inputClassName()}\n value={row.transport}\n onChange={(e) => onUpdate({ transport: e.target.value as McpTransportKind })}\n >\n {TRANSPORTS.map((kind) => (\n <option key={kind} value={kind}>\n {t.transportLabels[kind]}\n </option>\n ))}\n </select>\n </Field>\n\n <Field label={t.serverIdLabel} required>\n <input\n className={inputClassName()}\n value={row.id}\n placeholder={t.serverIdPlaceholder}\n onChange={(e) => onUpdate({ id: e.target.value })}\n />\n </Field>\n\n {row.transport === 'stdio' ? (\n <>\n <Field label={t.commandLabel}>\n <input\n className={inputClassName()}\n value={row.command}\n onChange={(e) => onUpdate({ command: e.target.value })}\n />\n </Field>\n <Field label={t.argsLabel} description={t.argsHint}>\n <input\n className={inputClassName()}\n value={row.argsText}\n onChange={(e) => onUpdate({ argsText: e.target.value })}\n />\n </Field>\n <Field label={t.cwdLabel}>\n <input\n className={inputClassName()}\n value={row.cwd}\n onChange={(e) => onUpdate({ cwd: e.target.value })}\n />\n </Field>\n <Field label={t.envLabel} description={t.envHint}>\n <textarea\n className={cn(inputClassName(), 'min-h-[4rem] font-mono text-xs')}\n value={row.envJson}\n onChange={(e) => onUpdate({ envJson: e.target.value })}\n />\n </Field>\n </>\n ) : (\n <>\n <div className=\"md:col-span-2\">\n <Field label={t.urlLabel} required>\n <input\n className={cn(inputClassName(), 'font-mono text-xs')}\n value={row.url}\n placeholder=\"https://example.com/mcp\"\n onChange={(e) => onUpdate({ url: e.target.value })}\n />\n </Field>\n </div>\n <McpHeadersEditor\n label={t.headersLabel}\n optionalLabel={t.optionalSuffix}\n addLabel={t.addHeader}\n removeHeaderAria={t.removeHeader}\n pasteLabel={t.pasteHeaders}\n pasteFailed={t.pasteHeadersFailed}\n keyPlaceholder={t.headerKeyPlaceholder}\n valuePlaceholder={t.headerValuePlaceholder}\n headers={row.headers}\n onChange={(headers) => onUpdate({ headers })}\n />\n </>\n )}\n\n <Field label={t.timeoutLabel} description={t.timeoutHint}>\n <input\n type=\"number\"\n min={1}\n max={600}\n className={inputClassName()}\n value={connectionTimeoutSeconds(row)}\n placeholder={t.timeoutPlaceholder}\n onChange={(e) =>\n onUpdate({\n connectionTimeoutMs: parseConnectionTimeoutSeconds(e.target.value),\n })\n }\n />\n </Field>\n </div>\n\n {toolState.status === 'loading' ? (\n <div className=\"mt-4 flex items-center gap-2 text-sm text-fg-muted\">\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n {t.toolsLoading}\n </div>\n ) : null}\n\n {toolState.status === 'error' ? (\n <p className=\"mt-4 rounded-lg border border-red-500/30 bg-red-500/10 px-3 py-2 text-xs text-red-600 dark:text-red-300\">\n {toolState.message}\n </p>\n ) : null}\n\n {toolState.status === 'ok' ? (\n <div className=\"mt-4 rounded-lg border border-edge bg-surface-base px-3 py-2.5\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <div className=\"flex items-center gap-2 text-sm font-medium text-fg\">\n <Wrench className=\"size-4 text-accent\" aria-hidden />\n {toolState.tools.length === 0\n ? t.toolsEmpty\n : t.toolsTitle.replace('{{count}}', String(toolState.tools.length))}\n </div>\n {toolState.tools.length > 0 ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"h-8 text-xs\"\n onClick={() => onViewTools(toolState.tools)}\n >\n {t.viewAllTools}\n </Button>\n ) : null}\n </div>\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n","import type { McpToolInfo } from '@/features/settings/mcp/mcp-config-api';\n\nfunction displayToolName(fullName: string | undefined, stripPrefix?: string): string {\n if (!fullName) return '';\n if (stripPrefix && fullName.startsWith(stripPrefix)) {\n return fullName.slice(stripPrefix.length);\n }\n return fullName;\n}\n\nexport function toolMatchesQuery(tool: McpToolInfo, query: string, stripPrefix?: string): boolean {\n const q = query.trim().toLowerCase();\n if (!q) return true;\n const shortName = tool.shortName || displayToolName(tool.name, stripPrefix);\n const haystack = [tool.name, shortName, tool.description].filter(Boolean).join('\\n').toLowerCase();\n return haystack.includes(q);\n}\n","import { Search, Wrench, X } from 'lucide-react';\nimport { useMemo, useState } from 'react';\nimport * as Dialog from '@radix-ui/react-dialog';\n\nimport { Button } from '@/components/ui/button';\nimport type { McpToolInfo } from '@/features/settings/mcp/mcp-config-api';\nimport { toolMatchesQuery } from '@/features/settings/mcp/mcp-tools-utils';\nimport { cn } from '@/lib/cn';\nimport { settingsInputFocusClass } from '@/lib/form-field-width';\nimport { SETTINGS_SHELL_CONTENT_Z, SETTINGS_SHELL_OVERLAY_Z } from '@/lib/settings-shell-dialog-layer';\n\ntype Props = {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n serverId: string;\n title: string;\n subtitle: string;\n searchPlaceholder: string;\n searchEmptyLabel: string;\n emptyLabel: string;\n closeLabel: string;\n tools: McpToolInfo[];\n stripPrefix?: string;\n};\n\nfunction displayToolName(fullName: string | undefined, stripPrefix?: string): string {\n if (!fullName) return '';\n if (stripPrefix && fullName.startsWith(stripPrefix)) {\n return fullName.slice(stripPrefix.length);\n }\n return fullName;\n}\n\nfunction McpToolsListSearch({\n tools,\n stripPrefix,\n searchPlaceholder,\n searchEmptyLabel,\n}: {\n tools: McpToolInfo[];\n stripPrefix?: string;\n searchPlaceholder: string;\n searchEmptyLabel: string;\n}) {\n const [query, setQuery] = useState('');\n\n const filteredTools = useMemo(\n () => tools.filter((tool) => toolMatchesQuery(tool, query, stripPrefix)),\n [query, stripPrefix, tools],\n );\n\n const hasQuery = query.trim().length > 0;\n\n return (\n <div className=\"flex min-h-0 flex-1 flex-col\">\n <div className=\"border-b border-edge px-5 py-3\">\n <div className=\"relative\">\n <Search\n className=\"pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-fg-subtle\"\n aria-hidden\n />\n <input\n type=\"search\"\n value={query}\n placeholder={searchPlaceholder}\n aria-label={searchPlaceholder}\n className={cn(\n 'w-full rounded-lg border border-edge bg-surface-panel py-2 pl-9 pr-3 text-sm text-fg',\n 'placeholder:text-fg-subtle',\n settingsInputFocusClass,\n )}\n onChange={(e) => setQuery(e.target.value)}\n />\n </div>\n {hasQuery ? (\n <p className=\"mt-2 text-xs text-fg-subtle\">\n {filteredTools.length} / {tools.length}\n </p>\n ) : null}\n </div>\n\n <div className=\"min-h-0 flex-1 overflow-y-auto px-5 py-4\">\n {filteredTools.length === 0 ? (\n <p className=\"text-sm text-fg-muted\">{searchEmptyLabel}</p>\n ) : (\n <ul className=\"flex flex-col gap-2\">\n {filteredTools.map((tool, index) => {\n const shortName =\n tool.shortName || displayToolName(tool.name, stripPrefix) || tool.name || '?';\n const toolKey = tool.name || `tool-${index}`;\n return (\n <li\n key={toolKey}\n className=\"min-w-0 rounded-lg border border-edge bg-surface-base px-3 py-2.5\"\n >\n <div\n className=\"truncate font-mono text-sm font-medium text-fg\"\n title={tool.name !== shortName ? tool.name : shortName}\n >\n {shortName}\n </div>\n {tool.description ? (\n <p\n className=\"mt-1 truncate text-xs leading-relaxed text-fg-muted\"\n title={tool.description}\n >\n {tool.description}\n </p>\n ) : null}\n </li>\n );\n })}\n </ul>\n )}\n </div>\n </div>\n );\n}\n\nexport function McpToolsListDialog({\n open,\n onOpenChange,\n serverId,\n title,\n subtitle,\n searchPlaceholder,\n searchEmptyLabel,\n emptyLabel,\n closeLabel,\n tools,\n stripPrefix,\n}: Props) {\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <Dialog.Portal>\n <Dialog.Overlay\n className={cn('xopc-dialog-overlay fixed inset-0 bg-scrim backdrop-blur-[1px]', SETTINGS_SHELL_OVERLAY_Z)}\n />\n <Dialog.Content\n className={cn(\n 'fixed left-1/2 top-1/2 flex max-h-[min(88vh,40rem)] w-[min(100%-2rem,min(92vw,36rem))] -translate-x-1/2 -translate-y-1/2 flex-col',\n SETTINGS_SHELL_CONTENT_Z,\n 'rounded-2xl border border-edge bg-surface-panel shadow-popover outline-none dark:border-edge',\n )}\n >\n <div className=\"flex items-start justify-between gap-3 border-b border-edge px-5 py-4\">\n <div className=\"min-w-0\">\n <Dialog.Title className=\"flex items-center gap-2 text-base font-semibold text-fg\">\n <Wrench className=\"size-4 shrink-0 text-accent\" aria-hidden />\n {title}\n </Dialog.Title>\n <Dialog.Description className=\"mt-1 text-sm text-fg-muted\">\n {subtitle.replace('{{serverId}}', serverId).replace('{{count}}', String(tools.length))}\n </Dialog.Description>\n </div>\n <Dialog.Close asChild>\n <Button type=\"button\" variant=\"ghost\" className=\"size-8 shrink-0 px-0\" aria-label={closeLabel}>\n <X className=\"size-4\" aria-hidden />\n </Button>\n </Dialog.Close>\n </div>\n\n {tools.length > 0 ? (\n <div className=\"flex min-h-0 flex-1 flex-col\">\n <McpToolsListSearch\n key={`${serverId}-${open ? 'open' : 'closed'}`}\n tools={tools}\n stripPrefix={stripPrefix}\n searchPlaceholder={searchPlaceholder}\n searchEmptyLabel={searchEmptyLabel}\n />\n </div>\n ) : (\n <div className=\"min-h-0 flex-1 overflow-y-auto px-5 py-4\">\n <p className=\"text-sm text-fg-muted\">{emptyLabel}</p>\n </div>\n )}\n\n <div className=\"flex justify-end border-t border-edge px-5 py-3\">\n <Dialog.Close asChild>\n <Button type=\"button\" variant=\"secondary\">\n {closeLabel}\n </Button>\n </Dialog.Close>\n </div>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n","import { Cable, Loader2, Plus, Plug } from 'lucide-react';\nimport { useCallback, useEffect, useMemo, useReducer, useRef } from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport { useGatewayConfigSwr } from '@/features/gateway/gateway-config-swr';\nimport { SettingsFormSection, SettingsFormSectionHeader } from '@/features/settings/settings-form-section';\nimport {\n emptyMcpServerRow,\n buildMcpServerConfigFromRow,\n mcpServerCardKey,\n normalizeMcpSettingsFromConfig,\n patchMcpSettings,\n testMcpServer,\n type McpSettingsState,\n type McpToolInfo,\n} from '@/features/settings/mcp/mcp-config-api';\nimport { McpServerCard } from '@/features/settings/mcp/mcp-server-card';\nimport { McpToolsListDialog } from '@/features/settings/mcp/mcp-tools-list-dialog';\nimport { uiPatchReducer } from '@/lib/settings-form-draft';\nimport { settingsInputFocusClass } from '@/lib/form-field-width';\nimport { cn } from '@/lib/cn';\nimport { messages } from '@/i18n/messages';\nimport { useGatewayStore } from '@/stores/gateway-store';\nimport { useLocaleStore } from '@/stores/locale-store';\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 );\n}\n\ntype ServerToolsState =\n | { status: 'idle' }\n | { status: 'loading' }\n | { status: 'ok'; tools: McpToolInfo[] }\n | { status: 'error'; message: string };\n\ntype McpFormDraft = {\n form: McpSettingsState | null;\n baseline: McpSettingsState | null;\n expandedKeys: Set<string>;\n};\n\ntype McpFormAction =\n | { type: 'reset' }\n | { type: 'sync'; value: McpSettingsState }\n | { type: 'set-form'; updater: (prev: McpSettingsState) => McpSettingsState }\n | { type: 'saved'; value: McpSettingsState }\n | { type: 'toggle-expanded'; key: string }\n | { type: 'set-expanded'; keys: Set<string> };\n\nfunction mcpFormReducer(state: McpFormDraft, action: McpFormAction): McpFormDraft {\n switch (action.type) {\n case 'reset':\n return { form: null, baseline: null, expandedKeys: new Set() };\n case 'sync':\n return { form: action.value, baseline: action.value, expandedKeys: new Set() };\n case 'set-form':\n return state.form ? { ...state, form: action.updater(state.form) } : state;\n case 'saved':\n return { form: action.value, baseline: action.value, expandedKeys: new Set() };\n case 'toggle-expanded': {\n const next = new Set(state.expandedKeys);\n if (next.has(action.key)) next.delete(action.key);\n else next.add(action.key);\n return { ...state, expandedKeys: next };\n }\n case 'set-expanded':\n return { ...state, expandedKeys: action.keys };\n }\n}\n\ntype McpUi = {\n saving: boolean;\n error: string | null;\n saveOk: boolean;\n testingId: string | null;\n serverTools: Record<string, ServerToolsState>;\n toolsDialog: { serverId: string; tools: McpToolInfo[] } | null;\n};\n\nconst initialMcpUi: McpUi = {\n saving: false,\n error: null,\n saveOk: false,\n testingId: null,\n serverTools: {},\n toolsDialog: null,\n};\n\nexport function McpSettingsPanel() {\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const t = m.mcpSettings;\n const token = useGatewayStore((st) => st.token);\n const hasToken = Boolean(token);\n\n const [formDraft, dispatchForm] = useReducer(mcpFormReducer, {\n form: null,\n baseline: null,\n expandedKeys: new Set<string>(),\n });\n const form = formDraft.form;\n const baseline = formDraft.baseline;\n const expandedKeys = formDraft.expandedKeys;\n const [ui, dispatchUi] = useReducer(uiPatchReducer<McpUi>, initialMcpUi);\n const { saving, error, saveOk, testingId, serverTools, toolsDialog } = ui;\n const dirtyRef = useRef(false);\n\n const { data, error: swrError, isLoading, mutate } = useGatewayConfigSwr(hasToken);\n\n const parsed = useMemo(\n () =>\n data?.payload?.config !== undefined ? normalizeMcpSettingsFromConfig(data.payload.config) : null,\n [data],\n );\n\n useEffect(() => {\n if (!hasToken) {\n dispatchForm({ type: 'reset' });\n dirtyRef.current = false;\n return;\n }\n if (parsed === null || dirtyRef.current) return;\n dispatchForm({ type: 'sync', value: parsed });\n }, [hasToken, parsed]);\n\n const loading = Boolean(hasToken && isLoading && data === undefined && !swrError);\n const fetchError =\n swrError instanceof Error ? swrError.message : swrError ? String(swrError) : null;\n\n const dirty = useMemo(() => {\n if (!form || !baseline) return false;\n return JSON.stringify(form) !== JSON.stringify(baseline);\n }, [form, baseline]);\n\n const toggleExpanded = useCallback((key: string) => {\n dispatchForm({ type: 'toggle-expanded', key });\n }, []);\n\n const updateServer = useCallback((index: number, patch: Partial<McpSettingsState['servers'][number]>) => {\n dirtyRef.current = true;\n dispatchForm({\n type: 'set-form',\n updater: (f) => {\n const servers = [...f.servers];\n const prev = servers[index];\n if (!prev) return f;\n servers[index] = { ...prev, ...patch };\n if (patch.id && patch.id !== prev.id && prev.id) {\n dispatchUi({\n type: 'patch',\n patch: {\n serverTools: (() => {\n const next = { ...serverTools };\n delete next[prev.id];\n return next;\n })(),\n },\n });\n }\n return { ...f, servers };\n },\n });\n }, []);\n\n const addServer = useCallback(() => {\n dirtyRef.current = true;\n dispatchForm({\n type: 'set-form',\n updater: (f) => {\n const nextIndex = f.servers.length;\n const newRow = emptyMcpServerRow(`server-${nextIndex + 1}`);\n const key = mcpServerCardKey(newRow, nextIndex);\n dispatchForm({ type: 'set-expanded', keys: new Set(expandedKeys).add(key) });\n return { ...f, servers: [...f.servers, newRow] };\n },\n });\n }, [expandedKeys]);\n\n const removeServer = useCallback((index: number) => {\n dirtyRef.current = true;\n dispatchForm({\n type: 'set-form',\n updater: (f) => {\n const removed = f.servers[index];\n if (removed) {\n const key = mcpServerCardKey(removed, index);\n const nextExpanded = new Set(expandedKeys);\n nextExpanded.delete(key);\n dispatchForm({ type: 'set-expanded', keys: nextExpanded });\n if (removed.id) {\n dispatchUi({\n type: 'patch',\n patch: {\n serverTools: (() => {\n const next = { ...serverTools };\n delete next[removed.id];\n return next;\n })(),\n },\n });\n }\n }\n return { ...f, servers: f.servers.filter((_, i) => i !== index) };\n },\n });\n }, [expandedKeys]);\n\n const save = useCallback(async () => {\n if (!form || saving) return;\n dispatchUi({ type: 'patch', patch: { saving: true, error: null, saveOk: false } });\n try {\n await patchMcpSettings(form);\n const next = structuredClone(form);\n dirtyRef.current = false;\n dispatchForm({ type: 'saved', value: next });\n dispatchUi({ type: 'patch', patch: { saveOk: true } });\n void mutate();\n } catch (e) {\n dispatchUi({ type: 'patch', patch: { error: e instanceof Error ? e.message : String(e) } });\n } finally {\n dispatchUi({ type: 'patch', patch: { saving: false } });\n }\n }, [form, mutate, saving]);\n\n const runTest = useCallback(async (serverId: string, row?: McpSettingsState['servers'][number]) => {\n if (!serverId.trim()) return;\n dispatchUi({\n type: 'patch',\n patch: {\n testingId: serverId,\n error: null,\n serverTools: { ...serverTools, [serverId]: { status: 'loading' } },\n },\n });\n try {\n const serverConfig = row ? buildMcpServerConfigFromRow(row) : undefined;\n const result = await testMcpServer(serverId.trim(), serverConfig);\n dispatchUi({\n type: 'patch',\n patch: {\n serverTools: {\n ...serverTools,\n [serverId]: { status: 'ok', tools: result.tools },\n },\n },\n });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n dispatchUi({\n type: 'patch',\n patch: {\n serverTools: { ...serverTools, [serverId]: { status: 'error', message } },\n },\n });\n } finally {\n dispatchUi({ type: 'patch', patch: { testingId: null } });\n }\n }, []);\n\n if (!hasToken) {\n return (\n <div className=\"mx-auto flex w-full max-w-app-main flex-col gap-4 px-4 py-8\">\n <h1 className=\"text-lg font-semibold text-fg\">{t.title}</h1>\n <p className=\"text-sm text-fg-muted\">{m.token.description}</p>\n </div>\n );\n }\n\n if (loading || !form) {\n return (\n <div className=\"mx-auto flex w-full max-w-app-main flex-col gap-4 px-4 py-8\">\n <h1 className=\"text-lg font-semibold text-fg\">{t.title}</h1>\n <p className=\"text-sm text-fg-muted\">{t.loading}</p>\n </div>\n );\n }\n\n return (\n <div className=\"mx-auto flex w-full max-w-app-main flex-col gap-6 px-4 py-8\">\n <div>\n <h1 className=\"text-lg font-semibold tracking-tight text-fg\">{t.title}</h1>\n <p className=\"mt-1 text-sm text-fg-muted\">{t.subtitle}</p>\n </div>\n\n {(fetchError || error) && (\n <p className=\"rounded-lg border border-red-500/30 bg-red-500/10 px-3 py-2 text-sm text-red-600 dark:text-red-300\">\n {error ?? fetchError}\n </p>\n )}\n {saveOk && (\n <p className=\"rounded-lg border border-edge bg-surface-panel px-3 py-2 text-sm text-fg-muted\">\n {t.saved}\n </p>\n )}\n\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Cable} title={t.globalTitle} subtitle={t.globalHint} />\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"text-sm font-medium text-fg\">{t.idleTtlLabel}</div>\n <input\n type=\"number\"\n min={0}\n className={inputClassName()}\n value={form.sessionIdleTtlMinutes ?? ''}\n placeholder={t.idleTtlPlaceholder}\n onChange={(e) => {\n dirtyRef.current = true;\n const raw = e.target.value.trim();\n dispatchForm({\n type: 'set-form',\n updater: (f) => ({\n ...f,\n sessionIdleTtlMinutes: raw === '' ? undefined : Number.parseInt(raw, 10),\n }),\n });\n }}\n />\n <p className=\"text-xs leading-relaxed text-fg-subtle\">{t.idleTtlHint}</p>\n </div>\n </SettingsFormSection>\n\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Plug} title={t.serversTitle} subtitle={t.serversHint} />\n <div className=\"flex flex-col gap-3\">\n {form.servers.length === 0 ? (\n <p className=\"text-sm text-fg-muted\">{t.serversEmpty}</p>\n ) : null}\n {form.servers.map((row, index) => {\n const cardKey = mcpServerCardKey(row, index);\n const toolState = serverTools[row.id] ?? { status: 'idle' as const };\n\n return (\n <McpServerCard\n key={cardKey}\n row={row}\n expanded={expandedKeys.has(cardKey)}\n onToggle={() => toggleExpanded(cardKey)}\n t={t}\n testing={testingId === row.id}\n toolState={toolState}\n onUpdate={(patch) => updateServer(index, patch)}\n onRemove={() => removeServer(index)}\n onTest={() => void runTest(row.id, row)}\n onViewTools={(tools) =>\n dispatchUi({ type: 'patch', patch: { toolsDialog: { serverId: row.id, tools } } })\n }\n />\n );\n })}\n\n <Button type=\"button\" variant=\"ghost\" className=\"self-start\" onClick={addServer}>\n <Plus className=\"size-4\" aria-hidden />\n {t.addServer}\n </Button>\n </div>\n </SettingsFormSection>\n\n <div className=\"flex flex-wrap gap-2\">\n <Button type=\"button\" disabled={!dirty || saving} onClick={() => void save()}>\n {saving ? <Loader2 className=\"size-4 animate-spin\" aria-hidden /> : null}\n {saving ? t.saving : t.save}\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n disabled={!dirty || saving}\n onClick={() => {\n if (!baseline) return;\n dirtyRef.current = false;\n dispatchForm({ type: 'sync', value: structuredClone(baseline) });\n dispatchUi({ type: 'patch', patch: { saveOk: false, error: null, serverTools: {} } });\n }}\n >\n {t.discard}\n </Button>\n </div>\n\n <p className=\"text-xs text-fg-subtle\">{t.disableHint}</p>\n\n {toolsDialog ? (\n <McpToolsListDialog\n open\n onOpenChange={(open) => {\n if (!open) dispatchUi({ type: 'patch', patch: { toolsDialog: null } });\n }}\n serverId={toolsDialog.serverId}\n title={t.toolsDialogTitle}\n subtitle={t.toolsDialogSubtitle}\n searchPlaceholder={t.toolsDialogSearchPlaceholder}\n searchEmptyLabel={t.toolsDialogSearchEmpty}\n emptyLabel={t.toolsEmpty}\n closeLabel={t.toolsDialogClose}\n tools={toolsDialog.tools}\n stripPrefix={`${toolsDialog.serverId.trim()}__`}\n />\n ) : null}\n </div>\n );\n}\n","import { Navigate, useParams } from 'react-router-dom';\n\nimport {\n AgentBrowserSettingsPage,\n AgentDefaultsTabbedPage,\n} from '@/features/settings/agents';\nimport { SetupStatusPanel } from '@/features/settings/setup-checklist/setup-status-panel';\nimport { ModelsHubPanel } from '@/features/settings/models-hub/models-hub-panel';\nimport { AppearanceSettingsPanel } from '@/features/settings/appearance-settings';\nimport { DreamingSettingsPanel } from '@/features/settings/dreaming-settings';\nimport { CronSettingsPanel } from '@/features/settings/cron-settings';\nimport { GoalsSettingsPanel } from '@/features/settings/goals-settings';\nimport { GatewaySettingsPanel } from '@/features/settings/gateway-settings';\nimport { HeartbeatSettingsPanel } from '@/features/settings/heartbeat-settings';\nimport { RemoteAccessHub } from '@/features/remote-access/remote-access-hub';\nimport { SharesSettingsPanel } from '@/features/shares/shares-settings';\nimport { AppManagementSettingsPanel } from '@/features/settings/app-management-settings-panel';\nimport { SystemSettingsPanel } from '@/features/settings/system-settings-panel';\nimport { McpSettingsPanel } from '@/features/settings/mcp/mcp-settings';\nimport { messages } from '@/i18n/messages';\nimport type { SettingsSectionId } from '@/navigation';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nconst SECTIONS: SettingsSectionId[] = [\n 'overview',\n 'appearance',\n 'system',\n 'app-management',\n 'agent-defaults',\n 'agent-browser',\n 'agent-mcp',\n 'credentials',\n 'providers',\n 'models',\n 'image-models',\n 'voice',\n 'gateway',\n 'heartbeat',\n 'tunnel',\n 'remote-access',\n 'shares',\n 'search',\n 'cron',\n 'goals',\n 'dreams',\n];\n\nexport function SettingsPage() {\n const { section } = useParams();\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n\n if (section === 'agent' || section === 'agents') {\n return <Navigate to=\"/agents\" replace />;\n }\n\n if (!section || !SECTIONS.includes(section as SettingsSectionId)) {\n return <Navigate to=\"/settings/overview\" replace />;\n }\n\n if (section === 'tunnel') {\n return <Navigate to=\"/settings/remote-access\" replace />;\n }\n\n // M3.4: providers / models / image-models / voice / search legacy routes\n // redirect to the unified hub at /settings/credentials, landing on the\n // matching tab via `?tab=<id>`. The hub's `parseModelsHubTab` defaults to\n // `providers` so the omitted tab is implied (clean URL on default).\n if (\n section === 'providers' ||\n section === 'models' ||\n section === 'image-models' ||\n section === 'voice' ||\n section === 'search'\n ) {\n const tab = section === 'providers' ? '' : `?tab=${section}`;\n return <Navigate to={`/settings/credentials${tab}`} replace />;\n }\n\n const id = section as SettingsSectionId;\n\n if (id === 'overview') {\n return <SetupStatusPanel />;\n }\n\n const title = m.settingsSections[id];\n\n if (id === 'agent-defaults') {\n return <AgentDefaultsTabbedPage />;\n }\n\n if (id === 'agent-browser') {\n return <AgentBrowserSettingsPage />;\n }\n\n if (id === 'agent-mcp') {\n return <McpSettingsPanel />;\n }\n\n if (id === 'appearance') {\n return <AppearanceSettingsPanel />;\n }\n\n if (id === 'system') {\n return <SystemSettingsPanel />;\n }\n\n if (id === 'app-management') {\n return <AppManagementSettingsPanel />;\n }\n\n if (id === 'credentials') {\n return <ModelsHubPanel />;\n }\n\n if (id === 'gateway') {\n return <GatewaySettingsPanel />;\n }\n\n if (id === 'heartbeat') {\n return <HeartbeatSettingsPanel />;\n }\n\n if (id === 'tunnel' || id === 'remote-access') {\n return <RemoteAccessHub />;\n }\n\n if (id === 'shares') {\n return <SharesSettingsPanel />;\n }\n\n if (id === 'dreams') {\n return <DreamingSettingsPanel />;\n }\n\n if (id === 'cron') {\n return <CronSettingsPanel />;\n }\n\n if (id === 'goals') {\n return <GoalsSettingsPanel />;\n }\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 <p className=\"text-sm text-fg-muted\">{m.settingsPage.comingSoon.replace('{{title}}', title)}</p>\n </div>\n );\n}\n"],"mappings":"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"}