refactor: use Zod validation for executionError getter

- Export zExecutionErrorWsMessage schema from apiSchema
- Use safeParse instead of type casts in TaskItemImpl.executionError
- Simplify errorMessage getter to delegate to executionError

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Richard Yu
2026-01-12 18:38:34 -08:00
parent f44c0e3842
commit eada1eca50
2 changed files with 11 additions and 19 deletions

View File

@@ -96,7 +96,7 @@ const zExecutionInterruptedWsMessage = zExecutionWsMessageBase.extend({
node_type: zNodeType,
executed: z.array(zNodeId)
})
const zExecutionErrorWsMessage = zExecutionWsMessageBase.extend({
export const zExecutionErrorWsMessage = zExecutionWsMessageBase.extend({
node_id: zNodeId,
node_type: zNodeType,
executed: z.array(zNodeId),

View File

@@ -10,6 +10,7 @@ import type {
ComfyWorkflowJSON,
NodeId
} from '@/platform/workflow/validation/schemas/workflowSchema'
import { zExecutionErrorWsMessage } from '@/schemas/apiSchema'
import type {
ExecutionErrorWsMessage,
HistoryTaskItem,
@@ -324,35 +325,26 @@ export class TaskItemImpl {
/**
* Extracts the execution error message from status messages.
* Used by error reporting UI components.
*
* Note: The type cast is required because `messages` is typed as
* `Array<[string, unknown]>` - TypeScript cannot narrow the second tuple
* element's type based on a runtime string check for 'execution_error'.
*/
get errorMessage(): string | undefined {
const messages = this.status?.messages
if (!Array.isArray(messages) || !messages.length) return undefined
const record = messages.find(
(entry: unknown) => Array.isArray(entry) && entry[0] === 'execution_error'
) as [string, { exception_message?: string }?] | undefined
return record?.[1]?.exception_message
return this.executionError?.exception_message
}
/**
* Extracts the full execution error from status messages.
* Returns the ExecutionErrorWsMessage for detailed error dialogs.
*
* Note: The type cast is required because `messages` is typed as
* `Array<[string, unknown]>` - TypeScript cannot narrow the second tuple
* element's type based on a runtime string check for 'execution_error'.
* Uses Zod validation to ensure type safety.
*/
get executionError(): ExecutionErrorWsMessage | undefined {
const messages = this.status?.messages
if (!Array.isArray(messages) || !messages.length) return undefined
const record = messages.find(
(entry: unknown) => Array.isArray(entry) && entry[0] === 'execution_error'
) as [string, ExecutionErrorWsMessage?] | undefined
return record?.[1]
for (const entry of messages) {
if (entry[0] === 'execution_error') {
const parsed = zExecutionErrorWsMessage.safeParse(entry[1])
return parsed.success ? parsed.data : undefined
}
}
return undefined
}
/**