feat: complete WorkBuddy parity and Windows release workflow
This commit is contained in:
1 parent
143516b3a8
commit
d5512df549
434 files changed
+54977
-1854
No files matched your search
@@ -1,4 +1,5 @@
|
||||
import type { ChatEvent, ChatMessage, MessagePart, ToolCallRecord } from './types'
|
||||
import { normalizeContextUsageSnapshot, normalizeContextUsageBreakdown } from './context-usage'
|
||||
|
||||
/** 老会话只有合并正文与工具数组;不臆造其已经丢失的发生顺序。 */
|
||||
export function getMessageParts(message: ChatMessage): MessagePart[] {
|
||||
@@ -12,6 +13,18 @@ export function getMessageParts(message: ChatMessage): MessagePart[] {
|
||||
/** 主进程持久化和渲染进程使用同一事件归约,避免重载前后内容顺序不同。 */
|
||||
export function applyAssistantEvent(message: ChatMessage, event: ChatEvent): ChatMessage {
|
||||
switch (event.type) {
|
||||
case 'run_usage': return { ...message, runUsage: event.usage }
|
||||
case 'usage': {
|
||||
const contextUsage = normalizeContextUsageSnapshot({ usage: event.usage, contextWindow: event.contextWindow,
|
||||
source:event.source,sampledAt:event.sampledAt,requestId:event.runId,modelId:event.modelId,nativeEntryId:event.nativeEntryId })
|
||||
return contextUsage ? { ...message, contextUsage } : message
|
||||
}
|
||||
case 'context_breakdown': {
|
||||
const contextBreakdown = normalizeContextUsageBreakdown(event.breakdown)
|
||||
if (!contextBreakdown || contextBreakdown.requestId!==event.runId || (message.requestId&&message.requestId!==event.runId)
|
||||
|| (message.contextBreakdown?.sequence ?? -1) >= contextBreakdown.sequence) return message
|
||||
return {...message,contextBreakdown,contextUsage:undefined}
|
||||
}
|
||||
case 'part': {
|
||||
const parts = [...getMessageParts(message)]
|
||||
const identity = (part: MessagePart): string | undefined => {
|
||||
@@ -19,6 +32,7 @@ export function applyAssistantEvent(message: ChatMessage, event: ChatEvent): Cha
|
||||
if (part.type === 'plan') return `plan:${part.plan.id}`
|
||||
if (part.type === 'task') return `task:${part.task.id}`
|
||||
if (part.type === 'artifact') return `artifact:${part.artifact.id}`
|
||||
if (part.type === 'subagent') return `subagent:${part.agent.id}`
|
||||
return undefined
|
||||
}
|
||||
const key = identity(event.part)
|
||||
@@ -80,7 +94,11 @@ export function applyAssistantEvent(message: ChatMessage, event: ChatEvent): Cha
|
||||
tool.status === 'running' ? { ...tool, status } : tool
|
||||
)
|
||||
const interactions = message.interactions?.map((item) => item.status === 'pending' || item.status === 'responding' ? { ...item, status: 'cancelled' as const } : item)
|
||||
return { ...message, tools, interactions, status, error: event.type === 'error' ? event.message : message.error, ...terminalDuration(event) }
|
||||
const parts = message.parts?.map((part): MessagePart => part.type === 'subagent' && ['queued', 'running'].includes(part.agent.status)
|
||||
? { ...part, agent: { ...part.agent, status: 'cancelled', finishedAt: Date.now(),
|
||||
tools: part.agent.tools.map(tool => tool.status === 'running' ? { ...tool, status: 'cancelled' } : tool),
|
||||
events: part.agent.events.map(item => item.status === 'running' ? { ...item, status: 'cancelled' } : item) } } : part)
|
||||
return { ...message, tools, interactions, parts, status, error: event.type === 'error' ? event.message : message.error, ...terminalDuration(event) }
|
||||
}
|
||||
default:
|
||||
return message
|
||||
|
||||
Reference in new issue
Block a user