}
+function runtimeSelectionForProvider(
+ provider: 'model' | 'opencode' | 'continue',
+ settings: RuntimeSettings
+): AgentRuntimeSelection {
+ if (provider === 'model') {
+ return {
+ provider,
+ profileId: settings.defaultModelProfileId
+ }
+ }
+ const source =
+ provider === 'opencode'
+ ? settings.opencodeModelSource
+ : settings.continueModelSource
+ return {
+ provider,
+ ...(source.kind === 'profile' ? { profileId: source.profileId } : {})
+ }
+}
+
+function defaultRuntimeSelection(
+ settings: RuntimeSettings
+): AgentRuntimeSelection {
+ if (settings.provider === 'model') {
+ return runtimeSelectionForProvider('model', settings)
+ }
+ if (settings.provider === 'opencode') {
+ return runtimeSelectionForProvider('opencode', settings)
+ }
+ if (settings.provider === 'continue') {
+ return runtimeSelectionForProvider('continue', settings)
+ }
+ return settings.opencodeBaseUrl || settings.opencodeEmbedded
+ ? runtimeSelectionForProvider('opencode', settings)
+ : runtimeSelectionForProvider('model', settings)
+}
+
export function ProjectSwitcher({
projects,
activeProjectId,
+ runtimeSettings,
onArchive,
onCreate,
onDelete,
@@ -111,10 +152,17 @@ export function ProjectSwitcher({
setSaving(true)
setError(undefined)
try {
+ const input =
+ draft.runtimeSelection || !runtimeSettings
+ ? draft
+ : {
+ ...draft,
+ runtimeSelection: defaultRuntimeSelection(runtimeSettings)
+ }
if (dialogMode === 'settings' && activeProject) {
- await onUpdate(activeProject.id, draft)
+ await onUpdate(activeProject.id, input)
} else {
- await onCreate(draft)
+ await onCreate(input)
}
closeDialog()
} catch (reason) {
@@ -226,7 +274,10 @@ export function ProjectSwitcher({
name: '',
description: '',
rootPath: '',
- defaultWorkMode: 'ask'
+ defaultWorkMode: 'ask',
+ runtimeSelection: runtimeSettings
+ ? defaultRuntimeSelection(runtimeSettings)
+ : undefined
})
restoreFocusTarget.current = 'create'
setDialogMode('create')
@@ -253,7 +304,12 @@ export function ProjectSwitcher({
rootPath: activeProject.rootPath,
defaultWorkMode: normalizeInteractiveWorkMode(
activeProject.defaultWorkMode
- )
+ ),
+ runtimeSelection:
+ activeProject.runtimeSelection ??
+ (runtimeSettings
+ ? defaultRuntimeSelection(runtimeSettings)
+ : undefined)
})
restoreFocusTarget.current = 'settings'
setDialogMode('settings')
@@ -373,6 +429,48 @@ export function ProjectSwitcher({
))}
+ {runtimeSettings && (
+
+ )}
{error && (
{error}
diff --git a/src/renderer/src/i18n/locales/en-US/workspace.ts b/src/renderer/src/i18n/locales/en-US/workspace.ts
index 9b8521d..a4e088d 100644
--- a/src/renderer/src/i18n/locales/en-US/workspace.ts
+++ b/src/renderer/src/i18n/locales/en-US/workspace.ts
@@ -23,8 +23,14 @@ export const workspace = {
name: 'Name',
description: 'Description',
rootPath: 'Root folder',
- defaultMode: 'Default mode'
+ defaultMode: 'Default mode',
+ defaultRuntime: 'Default Runtime for new conversations'
},
+ runtimeOptions: {
+ direct: 'Direct model'
+ },
+ defaultRuntimeHelp:
+ 'Applies only to new conversations in this project. Existing conversations are unchanged.',
channelManaged: 'GoodBuddy manages channel project names.',
selectRoot: 'Select project root folder',
danger: {
diff --git a/src/renderer/src/i18n/locales/zh-CN/workspace.ts b/src/renderer/src/i18n/locales/zh-CN/workspace.ts
index 93d5db1..85ad293 100644
--- a/src/renderer/src/i18n/locales/zh-CN/workspace.ts
+++ b/src/renderer/src/i18n/locales/zh-CN/workspace.ts
@@ -20,8 +20,14 @@ export const workspace = {
name: '名称',
description: '说明',
rootPath: '根目录',
- defaultMode: '默认模式'
+ defaultMode: '默认模式',
+ defaultRuntime: '新对话默认 Runtime'
},
+ runtimeOptions: {
+ direct: '直连模型'
+ },
+ defaultRuntimeHelp:
+ '仅应用于此项目中新建的对话,不会更改已有对话。',
channelManaged: '通道项目名称由 GoodBuddy 管理。',
selectRoot: '选择项目根目录',
danger: {