feat: expand multi-runtime workflows for 0.10.0
GoodBuddy previously exposed Runtime capabilities, MCP assignments, plugin controls, context compaction, usage reporting, and task-completion behavior through incomplete or inconsistent paths. This release unifies managed OpenCode, Continue, and DeepSeek Harness controls; adds DSH plugin and image workflows; strengthens MCP and Runtime lifecycle bounds; fixes Windows notification activation; validates cross-architecture packages; and presents the approved bilingual four-section release notes. The DSH plugin marketplace remains a default-off preview whose trusted third-party code runs with current-user permissions. Ask remains read-only, Execute keeps approval controls, and context compaction may use the selected model without deleting GoodBuddy chat history. Release note: GoodBuddy 0.10.0 重点完善多 Runtime 工作流,统一 OpenCode、Continue 与 DeepSeek Harness 的能力、MCP、插件和上下文管理,并提升长对话、多会话与任务通知的连贯性。
This commit is contained in:
+46
-2
@@ -2151,6 +2151,9 @@ describe('registerIpcHandlers Runtime customization', () => {
|
||||
state: 'complete' as const
|
||||
}
|
||||
]
|
||||
let persistedRuntimeSelection:
|
||||
| { provider: 'opencode' }
|
||||
| undefined = { provider: 'opencode' }
|
||||
const assistantDatabase = {
|
||||
claimDueSchedules: vi.fn(() => []),
|
||||
getProject: vi.fn(() => ({
|
||||
@@ -2160,7 +2163,7 @@ describe('registerIpcHandlers Runtime customization', () => {
|
||||
getConversation: vi.fn(() => ({
|
||||
id: conversationId,
|
||||
projectId,
|
||||
runtimeSelection: { provider: 'opencode' as const },
|
||||
runtimeSelection: persistedRuntimeSelection,
|
||||
title: 'Runtime conversation',
|
||||
updatedAt: Date.now(),
|
||||
messages
|
||||
@@ -2290,13 +2293,54 @@ describe('registerIpcHandlers Runtime customization', () => {
|
||||
)?.(event, {
|
||||
...compactInput,
|
||||
requestId: '00000000-0000-4000-8000-000000000606',
|
||||
runtimeSelection: { provider: 'continue' }
|
||||
})
|
||||
).rejects.toThrow('对话 Runtime 或 Project 已更改')
|
||||
await expect(
|
||||
electronMocks.handlers.get(
|
||||
ipcChannels.agentCompactConversation
|
||||
)?.(event, {
|
||||
...compactInput,
|
||||
requestId: '00000000-0000-4000-8000-000000000607',
|
||||
projectId: '00000000-0000-4000-8000-000000000608'
|
||||
})
|
||||
).rejects.toThrow('对话 Runtime 或 Project 已更改')
|
||||
|
||||
persistedRuntimeSelection = undefined
|
||||
await expect(
|
||||
electronMocks.handlers.get(
|
||||
ipcChannels.agentCompactConversation
|
||||
)?.(event, {
|
||||
...compactInput,
|
||||
requestId: '00000000-0000-4000-8000-000000000609'
|
||||
})
|
||||
).resolves.toMatchObject({
|
||||
provider: 'opencode',
|
||||
compacted: true
|
||||
})
|
||||
await expect(
|
||||
electronMocks.handlers.get(
|
||||
ipcChannels.agentCompactConversation
|
||||
)?.(event, {
|
||||
...compactInput,
|
||||
requestId: '00000000-0000-4000-8000-000000000610',
|
||||
runtimeSelection: { provider: 'continue' }
|
||||
})
|
||||
).rejects.toThrow('对话 Runtime 或 Project 已更改')
|
||||
|
||||
await expect(
|
||||
electronMocks.handlers.get(
|
||||
ipcChannels.agentCompactConversation
|
||||
)?.(event, {
|
||||
...compactInput,
|
||||
requestId: '00000000-0000-4000-8000-000000000611',
|
||||
history: [
|
||||
compactInput.history[0],
|
||||
{ role: 'assistant', content: 'stale content' }
|
||||
]
|
||||
})
|
||||
).rejects.toThrow('对话历史已更改')
|
||||
expect(selectedRuntimes.compactConversation).toHaveBeenCalledOnce()
|
||||
expect(selectedRuntimes.compactConversation).toHaveBeenCalledTimes(2)
|
||||
await dispose()
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user