( manifest: ResolvedManifest, selectedWorkflows: WorkflowManifestEntry[], ctx: PredicateContext, )
| 410 | } |
| 411 | |
| 412 | async function enumerateAndRegisterTools( |
| 413 | manifest: ResolvedManifest, |
| 414 | selectedWorkflows: WorkflowManifestEntry[], |
| 415 | ctx: PredicateContext, |
| 416 | ): Promise<{ registeredCount: number; desiredWorkflows: Set<string> }> { |
| 417 | const desiredToolNames = new Set<string>(); |
| 418 | const desiredWorkflows = new Set<string>(); |
| 419 | const catalogTools: ToolDefinition[] = []; |
| 420 | const moduleCache = new Map<string, ImportedToolModule>(); |
| 421 | const forceExposedToolAliases = getForceExposedToolAliases(); |
| 422 | |
| 423 | for (const workflow of selectedWorkflows) { |
| 424 | desiredWorkflows.add(workflow.id); |
| 425 | |
| 426 | for (const toolId of workflow.tools) { |
| 427 | const toolManifest = manifest.tools.get(toolId); |
| 428 | if (!toolManifest) continue; |
| 429 | |
| 430 | if (!shouldExposeTool(toolManifest, ctx, forceExposedToolAliases)) { |
| 431 | continue; |
| 432 | } |
| 433 | |
| 434 | const toolModule = await tryImportToolModule(toolManifest, moduleCache); |
| 435 | if (!toolModule) { |
| 436 | continue; |
| 437 | } |
| 438 | |
| 439 | desiredToolNames.add(toolManifest.names.mcp); |
| 440 | catalogTools.push(toCatalogTool(toolManifest, workflow, toolModule)); |
| 441 | registerToolFromManifest(toolManifest, toolModule); |
| 442 | } |
| 443 | } |
| 444 | |
| 445 | registryState.catalog = createToolCatalog(catalogTools); |
| 446 | |
| 447 | for (const [toolName, registeredTool] of registryState.tools.entries()) { |
| 448 | if (!desiredToolNames.has(toolName)) { |
| 449 | registeredTool.remove(); |
| 450 | registryState.tools.delete(toolName); |
| 451 | } |
| 452 | } |
| 453 | |
| 454 | return { registeredCount: desiredToolNames.size, desiredWorkflows }; |
| 455 | } |
| 456 | |
| 457 | export async function applyWorkflowSelectionFromManifest( |
| 458 | requestedWorkflows: string[] | undefined, |
no test coverage detected