mirror of
https://github.com/windmill-labs/windmill.git
synced 2026-08-22 00:01:34 +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>
70 lines
2.0 KiB
Svelte
70 lines
2.0 KiB
Svelte
<script lang="ts">
|
|
import { Markdown } from 'svelte-exmarkdown'
|
|
import { gfmPlugin } from 'svelte-exmarkdown/gfm'
|
|
import { Loader2, CheckCircle2, AlertTriangle } from 'lucide-svelte'
|
|
import CodeDisplay from '$lib/components/copilot/chat/script/CodeDisplay.svelte'
|
|
import LinkRenderer from '$lib/components/copilot/chat/LinkRenderer.svelte'
|
|
import { type ChatMessage } from './FlowChatManager.svelte'
|
|
|
|
interface Props {
|
|
message: ChatMessage
|
|
}
|
|
|
|
let { message }: Props = $props()
|
|
|
|
const messageClass = $derived.by(() => {
|
|
const base = 'max-w-[90%] min-w-0 rounded-lg w-fit'
|
|
if (message.message_type === 'user') {
|
|
return `${base} ml-auto bg-surface-secondary p-3`
|
|
}
|
|
return `${base} mr-auto bg-surface border ${message.success !== false ? 'border-gray-200 dark:border-gray-600' : '!border-red-500'}`
|
|
})
|
|
</script>
|
|
|
|
<div class={messageClass} data-message-id={message.id}>
|
|
{#if message.step_name}
|
|
<div class="bg-surface-secondary text-2xs text-tertiary mb-2 font-medium py-1 px-2 rounded-t-lg"
|
|
>{message.step_name}</div
|
|
>
|
|
{/if}
|
|
|
|
{#if message.message_type === 'user'}
|
|
<p class="whitespace-pre-wrap text-sm break-words text-right">{message.content}</p>
|
|
{:else if message.loading}
|
|
<div class="flex items-center gap-2 text-tertiary">
|
|
<Loader2 size={16} class="animate-spin" />
|
|
<span>Processing...</span>
|
|
</div>
|
|
{:else if message.content}
|
|
<div
|
|
class="flex flex-row items-center gap-2 px-3 pb-3 text-sm {!message.step_name
|
|
? 'pt-3'
|
|
: ''} overflow-x-auto"
|
|
>
|
|
{#if message.message_type === 'tool'}
|
|
{#if message.success !== false}
|
|
<CheckCircle2 class="w-3.5 h-3.5 text-green-500" />
|
|
{:else}
|
|
<AlertTriangle class="w-3.5 h-3.5 text-red-500" />
|
|
{/if}
|
|
{/if}
|
|
<div class="prose prose-sm dark:prose-invert break-words prose-headings:!text-base">
|
|
<Markdown
|
|
md={message.content}
|
|
plugins={[
|
|
gfmPlugin(),
|
|
{
|
|
renderer: {
|
|
pre: CodeDisplay,
|
|
a: LinkRenderer
|
|
}
|
|
}
|
|
]}
|
|
/>
|
|
</div>
|
|
</div>
|
|
{:else}
|
|
<p class="text-tertiary text-sm">No result</p>
|
|
{/if}
|
|
</div>
|