@@ -70,7 +70,7 @@ import type { McpServerConfig, McpServerStatus } from '../shared/domain/mcp'
7070import { installSearchConfig } from './search/service'
7171import { withDemo } from './kernel/upstream/demo'
7272import { opencodeGoProtocolFor } from './kernel/upstream/opencode-protocol'
73- import { currentConfigScope , defaultWorkspaceIdForScope } from './db/config-profile'
73+ import { currentConfigScope , defaultWorkspaceIdForScope , MODEL_DEFAULTS_SEEDED_KEY } from './db/config-profile'
7474import { ensureProviderAccountsSeeded } from './db/provider-accounts'
7575import type { ProviderConfigSource } from './kernel/upstream/router'
7676import { UpstreamRouter } from './kernel/upstream/router'
@@ -339,17 +339,28 @@ function seed(): void {
339339 *
340340 * 常量留在 main 侧而不是写进 `DEFAULT_SETTINGS`:`src/shared/` 不能
341341 * 反向 import `src/main/`,而上游是 main 的东西。
342+ *
343+ * ★★ 「没配过」靠 `MODEL_DEFAULTS_SEEDED_KEY` 判,**不靠值是不是空串**。
344+ * 原先写的是 `=== ''` 就种,但空串在设置页是一个可选项(「跟随对话」),
345+ * 而 `seed()` 每次进程启动 / 每次切账户都会重跑 —— 于是用户选了「跟随对话」,
346+ * 重启后又被顶回 deepseek,表现为「保存了,重启就变回去」,且零报错。
347+ * 现在每个配置作用域只种一次;标记跟着作用域走(登记在
348+ * `db/config-profile.ts` 的 `PROFILE_KV_KEYS`),所以新账户的空作用域照样会种。
349+ * 代价:升级后第一次启动时还没有标记,已经选了「跟随对话」的人会被最后顶回一次。
342350 */
343- const builtin = findPreset ( BUILTIN_PROVIDER_ID ) ?. suggestedModels ?? [ ]
344- const settings = store . getSettings ( )
345- const [ defaultModel , subagentModel ] = [ builtin [ 0 ] , builtin [ 1 ] ]
346-
347- if ( defaultModel !== undefined && settings . defaultModel === '' ) {
348- // 种子时把供应商一并写死是对的:这一刻只有内置上游一家,不存在「按优先级择优」的余地。
349- store . updateSettings ( { defaultModel, defaultModelProviderId : BUILTIN_PROVIDER_ID } )
350- }
351- if ( subagentModel !== undefined && settings . subagent . model === '' ) {
352- store . updateSettings ( { subagent : { model : subagentModel , modelProviderId : BUILTIN_PROVIDER_ID } } )
351+ if ( store . getKv < unknown > ( MODEL_DEFAULTS_SEEDED_KEY , false ) !== true ) {
352+ store . setKv ( MODEL_DEFAULTS_SEEDED_KEY , true )
353+ const builtin = findPreset ( BUILTIN_PROVIDER_ID ) ?. suggestedModels ?? [ ]
354+ const settings = store . getSettings ( )
355+ const [ defaultModel , subagentModel ] = [ builtin [ 0 ] , builtin [ 1 ] ]
356+
357+ if ( defaultModel !== undefined && settings . defaultModel === '' ) {
358+ // 种子时把供应商一并写死是对的:这一刻只有内置上游一家,不存在「按优先级择优」的余地。
359+ store . updateSettings ( { defaultModel, defaultModelProviderId : BUILTIN_PROVIDER_ID } )
360+ }
361+ if ( subagentModel !== undefined && settings . subagent . model === '' ) {
362+ store . updateSettings ( { subagent : { model : subagentModel , modelProviderId : BUILTIN_PROVIDER_ID } } )
363+ }
353364 }
354365
355366 seedDefaultWorkspace ( )
0 commit comments