import type { ParsedTriplets, NodeRole } from './triplet-parser'; import { resolveNodeRole } from './triplet-parser'; export type SearchResult = { nodeResults: Record; missingNodes: string[]; }; /** * 對所有節點進行解析,確認每個節點對應的零件 ID。 * * 注意:此步驟只做靜態解析,不做遠端查找。 * 零件是否真的存在由 component-loader 在執行時決定(Service Binding / KV / URL)。 * * 優先序: * 1. Input/Output 角色:自動標記,componentId = 小寫節點名稱 * 2. config[nodeName].component 已指定:使用 config 提供的 componentId * 3. 其他:componentId = 節點名稱(交給 component-loader 在執行時解析) */ export function searchNodes( parsed: ParsedTriplets, config?: Record>, ): SearchResult { const nodeResults: Record = {}; for (const nodeName of parsed.nodeNames) { const role = resolveNodeRole(nodeName, parsed); if (role === 'Input' || role === 'Output') { nodeResults[nodeName] = { status: 'found', componentId: nodeName.toLowerCase(), type: role }; continue; } const configComponent = config?.[nodeName]?.component as string | undefined; const componentId = configComponent ?? nodeName; nodeResults[nodeName] = { status: 'found', componentId, type: role }; } return { nodeResults, missingNodes: [] }; }