feat: layer runtime and model selection across conversation, project and global
- Store runtime selection as { provider?, model? } layers and resolve them per
field (conversation -> project -> global); drop the legacy auto provider.
- Migrate stored selections (database v49) and clear deleted profile ids.
- Re-resolve selections in Main per request and at queue dispatch.
- Add ProjectRuntimeSelector and a two-column RuntimeModelPicker; manage
link opens model connections; restore per-runtime default model tabs.
- Stop duplicating trusted instructions and history across OpenCode,
Continue and DeepSeek Harness runtimes.
- Document the layered design, global provider removal plan and planned
purpose-specific models.
This commit is contained in:
@@ -14,7 +14,10 @@ const draft = {
|
||||
name: '远程项目',
|
||||
description: 'Awaited save',
|
||||
defaultWorkMode: 'ask' as const,
|
||||
runtimeSelection: { provider: 'model' as const, profileId },
|
||||
runtimeSelection: {
|
||||
provider: 'opencode' as const,
|
||||
model: { kind: 'profile' as const, profileId }
|
||||
},
|
||||
hostId,
|
||||
remoteRootPath: '/srv/projects/goodbuddy'
|
||||
}
|
||||
@@ -64,11 +67,12 @@ describe('remote project save contracts', () => {
|
||||
).toThrow()
|
||||
})
|
||||
|
||||
it('requires a Runtime and a bounded absolute remote root', () => {
|
||||
it('lets the Runtime follow global settings and bounds the absolute remote root', () => {
|
||||
const withoutRuntime: Partial<typeof draft> = { ...draft }
|
||||
delete withoutRuntime.runtimeSelection
|
||||
expect(remoteProjectCreateDraftSchema.parse(withoutRuntime).runtimeSelection).toBeUndefined()
|
||||
expect(() =>
|
||||
remoteProjectCreateDraftSchema.parse(withoutRuntime)
|
||||
remoteProjectCreateDraftSchema.parse({ ...draft, runtimeSelection: { provider: 'auto-ish' } })
|
||||
).toThrow()
|
||||
expect(() =>
|
||||
remoteProjectCreateDraftSchema.parse({
|
||||
|
||||
Reference in New Issue
Block a user