@@ -473,6 +473,39 @@ export function extractAndParseJSON(content: string): any {
473473 }
474474}
475475
476+ /**
477+ * Resolves canonical pair ids (e.g. `tableId`, `knowledgeBaseId`) from a tool's
478+ * raw params, filling them in from their basic/advanced selector subblock source
479+ * values when the canonical key isn't already present.
480+ *
481+ * Selector subblocks persist their value under the subblock id (e.g.
482+ * `tableSelector`), not the canonical id, so any lookup that keys off the
483+ * canonical id — like the unique-tool-id suffix below — must resolve it first.
484+ * Mode selection mirrors {@link transformBlockTool}'s execution-time
485+ * `paramsTransform` so the resolved id matches the params the tool actually runs
486+ * with.
487+ *
488+ * @returns The params with canonical resource ids resolved (non-destructive)
489+ */
490+ function resolveCanonicalResourceParams (
491+ params : Record < string , any > ,
492+ canonicalGroups : CanonicalGroup [ ] ,
493+ blockType : string ,
494+ canonicalModes ?: Record < string , 'basic' | 'advanced' >
495+ ) : Record < string , any > {
496+ if ( canonicalGroups . length === 0 ) return params
497+ const resolved = { ...params }
498+ for ( const group of canonicalGroups ) {
499+ const existing = resolved [ group . canonicalId ]
500+ if ( existing !== undefined && existing !== null && existing !== '' ) continue
501+ const { basicValue, advancedValue } = getCanonicalValues ( group , params )
502+ const pairMode = canonicalModes ?. [ `${ blockType } :${ group . canonicalId } ` ] ?? 'basic'
503+ const chosen = pairMode === 'advanced' ? advancedValue : basicValue
504+ if ( chosen !== undefined ) resolved [ group . canonicalId ] = chosen
505+ }
506+ return resolved
507+ }
508+
476509/**
477510 * Transforms a block tool into a provider tool config with operation selection
478511 *
@@ -549,14 +582,25 @@ export async function transformBlockTool(
549582 userProvidedParams
550583 )
551584
585+ const canonicalGroups : CanonicalGroup [ ] = blockDef ?. subBlocks
586+ ? Object . values ( buildCanonicalIndex ( blockDef . subBlocks ) . groupsById ) . filter ( isCanonicalPair )
587+ : [ ]
588+
589+ const resolvedResourceParams = resolveCanonicalResourceParams (
590+ userProvidedParams ,
591+ canonicalGroups ,
592+ block . type ,
593+ canonicalModes
594+ )
595+
552596 let uniqueToolId = toolConfig . id
553597 let toolName = toolConfig . name
554598 let toolDescription = enrichedDescription || toolConfig . description
555599
556- if ( toolId === 'workflow_executor' && userProvidedParams . workflowId ) {
557- uniqueToolId = `${ toolConfig . id } _${ userProvidedParams . workflowId } `
600+ if ( toolId === 'workflow_executor' && resolvedResourceParams . workflowId ) {
601+ uniqueToolId = `${ toolConfig . id } _${ resolvedResourceParams . workflowId } `
558602
559- const workflowMetadata = await fetchWorkflowMetadata ( userProvidedParams . workflowId )
603+ const workflowMetadata = await fetchWorkflowMetadata ( resolvedResourceParams . workflowId )
560604 if ( workflowMetadata ) {
561605 toolName = workflowMetadata . name || toolConfig . name
562606 if (
@@ -566,21 +610,17 @@ export async function transformBlockTool(
566610 toolDescription = workflowMetadata . description
567611 }
568612 }
569- } else if ( toolId . startsWith ( 'knowledge_' ) && userProvidedParams . knowledgeBaseId ) {
570- uniqueToolId = `${ toolConfig . id } _${ userProvidedParams . knowledgeBaseId } `
571- } else if ( toolId . startsWith ( 'table_' ) && userProvidedParams . tableId ) {
572- uniqueToolId = `${ toolConfig . id } _${ userProvidedParams . tableId } `
613+ } else if ( toolId . startsWith ( 'knowledge_' ) && resolvedResourceParams . knowledgeBaseId ) {
614+ uniqueToolId = `${ toolConfig . id } _${ resolvedResourceParams . knowledgeBaseId } `
615+ } else if ( toolId . startsWith ( 'table_' ) && resolvedResourceParams . tableId ) {
616+ uniqueToolId = `${ toolConfig . id } _${ resolvedResourceParams . tableId } `
573617 }
574618
575619 const blockParamsFn = blockDef ?. tools ?. config ?. params as
576620 | ( ( p : Record < string , any > ) => Record < string , any > )
577621 | undefined
578622 const blockInputDefs = blockDef ?. inputs as Record < string , any > | undefined
579623
580- const canonicalGroups : CanonicalGroup [ ] = blockDef ?. subBlocks
581- ? Object . values ( buildCanonicalIndex ( blockDef . subBlocks ) . groupsById ) . filter ( isCanonicalPair )
582- : [ ]
583-
584624 const needsTransform = blockParamsFn || blockInputDefs || canonicalGroups . length > 0
585625 const paramsTransform = needsTransform
586626 ? ( params : Record < string , any > ) : Record < string , any > => {
0 commit comments