* feat(copilot): display tool calls immediately in loading state during streaming
Display tool calls in loading state as soon as they are parsed during
OpenAI streaming, rather than waiting until processToolCall is invoked.
Changes:
- parseOpenAICompletion: Track initialized tool calls and display them
immediately when we have complete tool info (id + function.name)
- processToolCall: Updated comment to clarify it merges with existing
loading state set during parsing
This provides better UX by showing tool execution progress progressively
as the stream is parsed.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* feat(copilot): display Anthropic tool calls immediately in loading state
Apply the same immediate tool call display pattern to Anthropic streaming
that was implemented for OpenAI.
Changes:
- parseAnthropicCompletion: Display tool calls immediately in loading state
when tool_use blocks are received in the message event
This ensures consistent UX across both OpenAI and Anthropic providers,
showing tool execution progress as soon as tool calls are detected.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* feat(copilot): show Anthropic tool calls even earlier with temp displays
Display temporary loading states for Anthropic tool calls as soon as
inputJson events are received (when tool input starts streaming), then
replace them with real tool displays when complete tool_use blocks
arrive in the message event.
Changes:
- ToolCallbacks: Added removeToolStatus method to clean up temp displays
- AIChatManager: Implemented removeToolStatus to remove tool messages
from displayMessages array
- anthropic.ts:
* Display temp tool on first inputJson event (earliest indicator)
* Flush pending text message before showing temp tool (proper ordering)
* Remove temp display when complete tool_use block arrives
* Replace with real tool display via preAction
This provides the earliest possible feedback for Anthropic tool calls,
showing loading states as soon as the model starts generating tool
inputs rather than waiting for complete blocks.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* cleaning
* cleaning
* cleaning
* fix icon
* nit
* handle error
* nit
---------
Co-authored-by: Claude <noreply@anthropic.com>
* feat(aichat): create reusable CustomAIPrompts component
Extract custom AI prompts UI into a reusable component that can be
used in both workspace settings and user settings. Component includes:
- AI mode selector with visual indicators for set prompts
- Textarea with character limit
- Customizable title, description, and hint messages
Co-authored-by: centdix <centdix@users.noreply.github.com>
* refactor(aichat): update workspace AISettings to use reusable component
Replace inline custom prompts UI with the reusable CustomAIPrompts
component. Add hint about user-level custom prompts being available
in account settings and how they combine with workspace prompts.
Co-authored-by: centdix <centdix@users.noreply.github.com>
* feat(aichat): add user-level custom AI prompts in account settings
Add collapsible section in user settings for custom AI prompts:
- Stored in localStorage (key: userCustomAIPrompts)
- Collapsible UI to save space
- Visual indicator when prompts are configured
- Hint about prompt combination with workspace settings
- Prompts apply across all workspaces for the user
Co-authored-by: centdix <centdix@users.noreply.github.com>
* feat(aichat): combine workspace and user custom prompts
Update AIChatManager to combine workspace-level and user-level custom
prompts. Prompts are combined in order: workspace first, then user.
Add helper functions in aiStore.ts:
- getUserCustomPrompts(): retrieves user prompts from localStorage
- getCombinedCustomPrompt(mode): combines workspace + user prompts
All AI modes (script, flow, navigator, ask, API) now use combined
prompts, allowing users to append their own instructions to workspace
settings across all workspaces.
Co-authored-by: centdix <centdix@users.noreply.github.com>
* fix: remove unused imports
Remove unused imports to fix svelte-check errors:
- Remove unused 'get' from svelte/store in AIChatManager
- Remove unused 'copilotInfo' from aiStore in AIChatManager
- Remove unused 'AIMode' from AISettings
Co-authored-by: centdix <centdix@users.noreply.github.com>
* simplify
* nit
* fix
* fix
---------
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: centdix <centdix@users.noreply.github.com>
* feat(flow chat): add cancel button
Add cancel button to flow chat interface that appears when a flow is executing.
- Replace send button with red stop button when processing
- Wire up cancel functionality to stop flow execution
- Support both polling and streaming modes
- Fixes#6868🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: windmill-internal-app[bot] <windmill-internal-app[bot]@users.noreply.github.com>
* fix
---------
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: windmill-internal-app[bot] <windmill-internal-app[bot]@users.noreply.github.com>
* 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>
* feat(aiagent): Store AI provider config in localStorage
- Added localStorage persistence for AI provider, resource, and model selections
- Configuration is loaded as default values on component initialization
- Automatically saves whenever selections change
- Validates stored provider is still available before loading
- Uses storage key: windmill_ai_provider_config
Co-authored-by: windmill-internal-app[bot] <windmill-internal-app[bot]@users.noreply.github.com>
* better
* fix logic
* Update toggle option text for default setting
---------
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: windmill-internal-app[bot] <windmill-internal-app[bot]@users.noreply.github.com>
Co-authored-by: Ruben Fiszel <ruben@windmill.dev>