mirror of
https://github.com/windmill-labs/windmill.git
synced 2026-08-22 08:02:19 +00:00
1afa36ceeb
* draft mcp client * testing * fix * cleaning * mcp resource in inputtransforms * cleaning * big cleaning * cleaning * no arc * add utils file * refactor tools * add mcp actions * draft frontend * send arguments from backend * better frontend * cleaning * use token for auth * add logo * rm * fix * fix * chore: refactor mcp for ai agents (#6829) * Add Tool enum for AIAgent with backward compatibility - Created Tool enum that can be either Windmill (FlowModule) or Mcp (resource reference) - Created McpToolRef struct to hold MCP resource path - Implemented custom Deserialize for Tool with backward compatibility: - New format: {type: 'windmill'|'mcp', ...} - Old format: FlowModule objects (automatically wrapped in Tool::Windmill) - Updated AIAgent to use Vec<Tool> instead of Vec<FlowModule> - Updated FlowValue::traverse_leafs to handle Tool enum - Backward compatible: old flows with Vec<FlowModule> will deserialize correctly * Refactor AI executor to process Tool enum instead of extracting MCP from input_transforms - Separate Windmill tools and MCP resource paths from tools list - Process Windmill FlowModules into Tool definitions - Load MCP tools from resource paths in Tool::Mcp variants - Remove old logic that extracted mcp_resources from input_transforms - Import FlowModule, remove unused InputTransform - Fix type issues: use .as_str() for path and handle Option<bool> properly * handle in args * mcp as flowmodule * frontend * config for mcp * simplify logic * fix ai executor logic * cleaning * clean frontend * fix * better resource picker * fix and styling * add endpoint to fetch tools * apply tool filtering * fix name validation * better ui * use cache * fix * fix merge * refactor: Separate MCP tools from FlowModule in AIAgent - Add new AgentTool, ToolValue, and McpToolValue types - Update AIAgent to use Vec<AgentTool> instead of Vec<FlowModule> - Implement From traits for clean conversion between AgentTool and FlowModule - Add backward compatibility via custom deserializer for AgentTool - Simplify resolve_module logic by reusing existing resolve_modules function - Update traverse_leafs to handle AgentTool structure This refactoring separates MCP tools from FlowModule tools, making the type system clearer and eliminating the need to treat MCP servers as a special case of FlowModule. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * refactor: Update ai_executor and worker_lockfiles for AgentTool - Update ai_executor.rs to handle new AgentTool structure - Separate MCP tools from FlowModule tools using ToolValue enum - Convert AgentTool to FlowModule for backward compatibility - Add imports for AgentTool and ToolValue types - Update worker_lockfiles.rs for lazy loading optimization - Convert AgentTool <-> FlowModule in insert_flow_modules - Preserve lazy loading for FlowModule tools via modules_node - Keep MCP tools inline (lightweight, no need for lazy loading) - Maintain backward compatibility with existing flows This enables the lazy loading optimization for FlowModule tools while keeping MCP tools inline, balancing performance and simplicity. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * cleaning * adapt frontend * cleaning * cleaning * type fix * cleaning * fix back comp * move mcp button position * nit * cleaning * fix nested removal * cleaning * opti * fix chat markdown display * fix chat messages layout * fix back comp frontend * fix deserializer * nit * simpler serializer * use if else --------- Co-authored-by: Claude <noreply@anthropic.com>
79 lines
2.1 KiB
Svelte
79 lines
2.1 KiB
Svelte
<script lang="ts">
|
|
import BarsStaggered from '$lib/components/icons/BarsStaggered.svelte'
|
|
import {
|
|
BotIcon,
|
|
CheckCircle2,
|
|
ChevronRight,
|
|
Code,
|
|
GitBranch,
|
|
Plug,
|
|
Repeat,
|
|
Square,
|
|
Zap
|
|
} from 'lucide-svelte'
|
|
import { twMerge } from 'tailwind-merge'
|
|
import type { ComponentType } from 'svelte'
|
|
|
|
interface Props {
|
|
label: string
|
|
selected?: boolean
|
|
returnIcon?: boolean
|
|
onSelect: () => void
|
|
class?: string
|
|
}
|
|
|
|
let { label, selected, returnIcon, onSelect, class: className }: Props = $props()
|
|
|
|
interface IconConfig {
|
|
icon: ComponentType
|
|
showChevron?: boolean
|
|
iconClass?: string
|
|
}
|
|
|
|
const iconMap: Record<string, IconConfig> = {
|
|
Action: { icon: Code, showChevron: true },
|
|
Trigger: { icon: Zap, showChevron: true },
|
|
'Approval/Prompt': { icon: CheckCircle2, showChevron: true },
|
|
Flow: { icon: BarsStaggered as unknown as ComponentType, showChevron: true },
|
|
'End Flow': { icon: Square },
|
|
'For loop': { icon: Repeat },
|
|
'While loop': { icon: Repeat },
|
|
'Branch to one': { icon: GitBranch },
|
|
'Branch to all': { icon: GitBranch },
|
|
'AI Agent': { icon: BotIcon, iconClass: 'text-violet-800 dark:text-violet-400' },
|
|
MCP: { icon: Plug, showChevron: true }
|
|
}
|
|
|
|
const config = $derived(iconMap[label])
|
|
</script>
|
|
|
|
{#snippet iconWithText(icon: ComponentType, showChevron = false, iconClass = '')}
|
|
{@const Icon = icon}
|
|
<Icon size={14} class={iconClass} />
|
|
{label}
|
|
{#if showChevron}
|
|
<ChevronRight size={12} class="ml-auto" color="#4c566a" />
|
|
{/if}
|
|
{/snippet}
|
|
|
|
<button
|
|
id={`flow-editor-flow-kind-${label.replaceAll(' ', '-').toLowerCase()}`}
|
|
class={twMerge(
|
|
'w-full text-left py-2 px-1.5 hover:bg-surface-hover text-xs font-medium transition-all whitespace-nowrap flex flex-row gap-2 items-center rounded-md',
|
|
selected ? 'bg-surface-hover' : '',
|
|
className
|
|
)}
|
|
onpointerdown={onSelect}
|
|
role="menuitem"
|
|
tabindex="-1"
|
|
>
|
|
<span class="grow flex items-center gap-2">
|
|
{#if config}
|
|
{@render iconWithText(config.icon, config.showChevron, config.iconClass ?? '')}
|
|
{/if}
|
|
</span>
|
|
{#if returnIcon && selected}
|
|
<kbd class="!text-xs text-right">↵</kbd>
|
|
{/if}
|
|
</button>
|