From 0876efe97cfed23420e80d14e726644f7a45ece5 Mon Sep 17 00:00:00 2001 From: Benjamin Lu Date: Thu, 29 Jan 2026 16:30:35 -0800 Subject: [PATCH] Centraliza output key --- .../composables/useOutputStacks.test.ts | 11 ++++-- .../assets/composables/useOutputStacks.ts | 13 +++++-- src/platform/assets/utils/outputAssetUtil.ts | 37 ++++++++++++++----- 3 files changed, 45 insertions(+), 16 deletions(-) diff --git a/src/platform/assets/composables/useOutputStacks.test.ts b/src/platform/assets/composables/useOutputStacks.test.ts index c00b294b2..159b6d7da 100644 --- a/src/platform/assets/composables/useOutputStacks.test.ts +++ b/src/platform/assets/composables/useOutputStacks.test.ts @@ -2,15 +2,20 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' import { ref } from 'vue' import type { AssetItem } from '@/platform/assets/schemas/assetSchema' +import type * as OutputAssetUtil from '@/platform/assets/utils/outputAssetUtil' import { useOutputStacks } from '@/platform/assets/composables/useOutputStacks' const mocks = vi.hoisted(() => ({ resolveOutputAssetItems: vi.fn() })) -vi.mock('@/platform/assets/utils/outputAssetUtil', () => ({ - resolveOutputAssetItems: mocks.resolveOutputAssetItems -})) +vi.mock('@/platform/assets/utils/outputAssetUtil', async (importOriginal) => { + const actual = await importOriginal() + return { + ...actual, + resolveOutputAssetItems: mocks.resolveOutputAssetItems + } +}) type Deferred = { promise: Promise diff --git a/src/platform/assets/composables/useOutputStacks.ts b/src/platform/assets/composables/useOutputStacks.ts index 79e20b76c..8fa0c76c4 100644 --- a/src/platform/assets/composables/useOutputStacks.ts +++ b/src/platform/assets/composables/useOutputStacks.ts @@ -3,7 +3,10 @@ import type { Ref } from 'vue' import { getOutputAssetMetadata } from '@/platform/assets/schemas/assetMetadataSchema' import type { AssetItem } from '@/platform/assets/schemas/assetSchema' -import { resolveOutputAssetItems } from '@/platform/assets/utils/outputAssetUtil' +import { + getOutputKey, + resolveOutputAssetItems +} from '@/platform/assets/utils/outputAssetUtil' export type OutputStackListItem = { key: string @@ -109,9 +112,11 @@ export function useOutputStacks({ assets }: UseOutputStacksOptions) { } const excludeOutputKey = - metadata.nodeId && metadata.subfolder - ? `${metadata.nodeId}-${metadata.subfolder}-${asset.name}` - : undefined + getOutputKey({ + nodeId: metadata.nodeId, + subfolder: metadata.subfolder, + filename: asset.name + }) ?? undefined try { return await resolveOutputAssetItems(metadata, { diff --git a/src/platform/assets/utils/outputAssetUtil.ts b/src/platform/assets/utils/outputAssetUtil.ts index 8c5c590f8..b6258405a 100644 --- a/src/platform/assets/utils/outputAssetUtil.ts +++ b/src/platform/assets/utils/outputAssetUtil.ts @@ -20,6 +20,12 @@ type ResolveOutputAssetItemsOptions = { excludeOutputKey?: string } +type OutputKeyParts = { + nodeId?: string | number | null + subfolder?: string | null + filename?: string | null +} + function shouldLoadFullOutputs( outputCount: OutputAssetMetadata['outputCount'], outputsLength: number @@ -31,8 +37,16 @@ function shouldLoadFullOutputs( ) } -function getOutputKey(output: ResultItemImpl): string { - return `${output.nodeId}-${output.subfolder}-${output.filename}` +export function getOutputKey({ + nodeId, + subfolder, + filename +}: OutputKeyParts): string | null { + if (!nodeId || !subfolder || !filename) { + return null + } + + return `${nodeId}-${subfolder}-${filename}` } function mapOutputsToAssetItems({ @@ -45,12 +59,14 @@ function mapOutputsToAssetItems({ }: OutputAssetMapOptions): AssetItem[] { const createdAtValue = createdAt ?? new Date().toISOString() - return outputs - .filter( - (output) => output.filename && getOutputKey(output) !== excludeOutputKey - ) - .map((output) => ({ - id: `${promptId}-${getOutputKey(output)}`, + return outputs.reduce((items, output) => { + const outputKey = getOutputKey(output) + if (!output.filename || !outputKey || outputKey === excludeOutputKey) { + return items + } + + items.push({ + id: `${promptId}-${outputKey}`, name: output.filename, size: 0, created_at: createdAtValue, @@ -63,7 +79,10 @@ function mapOutputsToAssetItems({ executionTimeInSeconds, workflow } - })) + }) + + return items + }, []) } export async function resolveOutputAssetItems(