feat: add CLI Command Node and Prompt Node components for orchestrator

- Implemented CliCommandNode component for executing CLI tools with AI models.
- Implemented PromptNode component for constructing AI prompts with context.
- Added styling for mode and tool badges in both components.
- Enhanced user experience with command and argument previews, execution status, and error handling.

test: add comprehensive tests for ask_question tool

- Created direct test for ask_question tool execution.
- Developed end-to-end tests to validate ask_question tool integration with WebSocket and A2UI surfaces.
- Implemented simple and integrated WebSocket tests to ensure proper message handling and surface reception.
- Added tool registration test to verify ask_question tool is correctly registered.

chore: add WebSocket listener and simulation tests

- Added WebSocket listener for A2UI surfaces to facilitate testing.
- Implemented frontend simulation test to validate complete flow from backend to frontend.
- Created various test scripts to ensure robust testing of ask_question tool functionality.
This commit is contained in:
catlog22
2026-02-03 23:10:36 +08:00
parent a806d70d9b
commit c6093ef741
134 changed files with 6392 additions and 634 deletions

View File

@@ -61,29 +61,126 @@
"updatedAt": "Updated",
"solutions": "{count, plural, one {solution} other {solutions}}"
},
"detail": {
"title": "Issue Details",
"tabs": {
"overview": "Overview",
"solutions": "Solutions",
"history": "History",
"json": "JSON"
},
"overview": {
"title": "Title",
"status": "Status",
"priority": "Priority",
"createdAt": "Created At",
"updatedAt": "Updated At",
"context": "Context",
"labels": "Labels",
"assignee": "Assignee"
},
"solutions": {
"title": "Solutions",
"empty": "No solutions yet",
"addSolution": "Add Solution",
"boundSolution": "Bound Solution"
},
"history": {
"title": "History",
"empty": "No history yet"
}
},
"queue": {
"title": "Queue",
"pageTitle": "Issue Queue",
"description": "Manage issue execution queue with execution groups",
"status": {
"pending": "Pending",
"ready": "Ready",
"executing": "Executing",
"completed": "Completed",
"failed": "Failed",
"blocked": "Blocked",
"active": "Active",
"inactive": "Inactive"
},
"stats": {
"totalItems": "Total Items",
"groups": "Groups",
"tasks": "Tasks",
"solutions": "Solutions"
"solutions": "Solutions",
"items": "Items",
"executionGroups": "Execution Groups"
},
"actions": {
"activate": "Activate",
"deactivate": "Deactivate",
"delete": "Delete",
"merge": "Merge",
"split": "Split",
"confirmDelete": "Are you sure you want to delete this queue?"
},
"executionGroup": "Execution Group",
"executionGroups": "Execution Groups",
"parallelGroup": "Parallel Group",
"sequentialGroup": "Sequential Group",
"items": "items",
"itemCount": "{count} items",
"groups": "groups",
"parallel": "Parallel",
"sequential": "Sequential",
"emptyState": "No queue data available",
"empty": "No data",
"conflicts": "Conflicts detected in queue",
"noQueueData": "No queue data"
"noQueueData": "No queue data",
"error": {
"title": "Load Failed",
"message": "Unable to load queue data, please try again later"
},
"conflicts": {
"title": "Queue Conflicts",
"description": "conflicts"
},
"deleteDialog": {
"title": "Delete Queue",
"description": "Are you sure you want to delete this queue? This action cannot be undone."
},
"mergeDialog": {
"title": "Merge Queues",
"targetQueueLabel": "Target Queue ID",
"targetQueuePlaceholder": "Enter the queue ID to merge into"
},
"splitDialog": {
"title": "Split Queue",
"selected": "{count}/{total} selected",
"selectAll": "Select All",
"clearAll": "Clear All",
"noSelection": "Please select items to split",
"cannotSplitAll": "Cannot split all items, source queue must retain at least one item"
}
},
"solution": {
"issue": "Issue",
"solution": "Solution",
"shortIssue": "Issue",
"shortSolution": "Sol",
"tabs": {
"overview": "Overview",
"tasks": "Tasks",
"json": "JSON"
},
"overview": {
"executionInfo": "Execution Info",
"executionOrder": "Execution Order",
"semanticPriority": "Semantic Priority",
"group": "Execution Group",
"taskCount": "Task Count",
"dependencies": "Dependencies",
"filesTouched": "Files Touched"
},
"tasks": {
"comingSoon": "Task list coming soon"
}
},
"discovery": {
"title": "Discovery",

View File

@@ -0,0 +1,196 @@
{
"title": "Issues",
"description": "Track and manage issues",
"status": {
"open": "Open",
"inProgress": "In Progress",
"resolved": "Resolved",
"closed": "Closed",
"completed": "Completed"
},
"priority": {
"low": "Low",
"medium": "Medium",
"high": "High",
"critical": "Critical"
},
"actions": {
"create": "New Issue",
"edit": "Edit",
"delete": "Delete",
"viewDetails": "View Details",
"changeStatus": "Change Status",
"changePriority": "Change Priority",
"startProgress": "Start Progress",
"markResolved": "Mark Resolved",
"github": "Pull from GitHub"
},
"filters": {
"all": "All",
"open": "Open",
"inProgress": "In Progress",
"resolved": "Resolved",
"closed": "Closed",
"byPriority": "By Priority"
},
"emptyState": {
"title": "No Issues Found",
"message": "No issues match your current filter.",
"createFirst": "Create your first issue to get started"
},
"createDialog": {
"title": "Create New Issue",
"labels": {
"title": "Title",
"context": "Context",
"priority": "Priority"
},
"placeholders": {
"title": "Enter issue title...",
"context": "Describe the issue context..."
},
"buttons": {
"create": "Create",
"cancel": "Cancel",
"creating": "Creating..."
}
},
"card": {
"id": "ID",
"createdAt": "Created",
"updatedAt": "Updated",
"solutions": "{count, plural, one {solution} other {solutions}}"
},
"queue": {
"title": "Queue",
"pageTitle": "Issue Queue",
"description": "Manage issue execution queue with execution groups",
"stats": {
"totalItems": "Total Items",
"groups": "Groups",
"tasks": "Tasks",
"solutions": "Solutions"
},
"actions": {
"activate": "Activate",
"deactivate": "Deactivate",
"delete": "Delete",
"merge": "Merge",
"confirmDelete": "Are you sure you want to delete this queue?"
},
"executionGroup": "Execution Group",
"parallel": "Parallel",
"sequential": "Sequential",
"emptyState": "No queue data available",
"conflicts": "Conflicts detected in queue",
"noQueueData": "No queue data"
},
"discovery": {
"title": "Discovery",
"pageTitle": "Issue Discovery",
"description": "View and manage issue discovery sessions",
"totalSessions": "Total Sessions",
"completedSessions": "Completed",
"runningSessions": "Running",
"totalFindings": "Findings",
"sessionList": "Session List",
"noSessions": "No sessions found",
"noSessionsDescription": "Start a new discovery session to begin",
"findingsDetail": "Findings Detail",
"selectSession": "Select a session to view findings",
"sessionId": "Session ID",
"name": "Name",
"status": "Status",
"createdAt": "Created At",
"completedAt": "Completed At",
"progress": "Progress",
"findingsCount": "Findings Count",
"export": "Export JSON",
"exportSelected": "Export Selected ({count})",
"exporting": "Exporting...",
"exportAsIssues": "Export as Issues",
"severityBreakdown": "Severity Breakdown",
"typeBreakdown": "Type Breakdown",
"tabFindings": "Findings",
"tabProgress": "Progress",
"tabInfo": "Session Info",
"stats": {
"totalSessions": "Total Sessions",
"completed": "Completed",
"running": "Running",
"findings": "Findings"
},
"session": {
"status": {
"running": "Running",
"completed": "Completed",
"failed": "Failed"
},
"findings": "{count} findings",
"startedAt": "Started"
},
"findings": {
"title": "Findings",
"filters": {
"severity": "Severity",
"type": "Type",
"search": "Search findings..."
},
"severity": {
"all": "All Severities",
"critical": "Critical",
"high": "High",
"medium": "Medium",
"low": "Low"
},
"type": {
"all": "All Types"
},
"exportedStatus": {
"all": "All Export Status",
"exported": "Exported",
"notExported": "Not Exported"
},
"issueStatus": {
"all": "All Issue Status",
"hasIssue": "Has Issue",
"noIssue": "No Issue"
},
"noFindings": "No findings found",
"noFindingsDescription": "No matching findings found",
"searchPlaceholder": "Search findings...",
"filterBySeverity": "Filter by severity",
"filterByType": "Filter by type",
"filterByExported": "Filter by export status",
"filterByIssue": "Filter by issue link",
"allSeverities": "All severities",
"allTypes": "All types",
"showingCount": "Showing {count} findings",
"exported": "Exported",
"hasIssue": "Linked",
"export": "Export",
"selectAll": "Select All",
"deselectAll": "Deselect All"
},
"tabs": {
"findings": "Findings",
"progress": "Progress",
"info": "Session Info"
},
"emptyState": "No discovery sessions found",
"noSessionSelected": "Select a session to view findings",
"actions": {
"export": "Export Findings",
"refresh": "Refresh"
}
},
"hub": {
"title": "Issue Hub",
"description": "Unified management for issues, queues, and discoveries",
"tabs": {
"issues": "Issues",
"queue": "Queue",
"discovery": "Discovery"
}
}
}

View File

@@ -1,6 +1,11 @@
{
"title": "MCP Servers",
"description": "Manage Model Context Protocol (MCP) servers for cross-CLI integration",
"tabs": {
"templates": "Templates",
"servers": "Servers",
"crossCli": "Cross-CLI"
},
"mode": {
"claude": "Claude",
"codex": "Codex"
@@ -25,7 +30,26 @@
"codex": {
"configPath": "Config Path",
"readOnly": "Read-only",
"readOnlyNotice": "Codex MCP servers are managed via config.toml and cannot be edited here."
"readOnlyNotice": "Codex MCP servers are managed via config.toml and cannot be edited here.",
"editable": "Editable",
"editableNotice": "This server can be edited. Changes will be saved to config.toml.",
"deleteConfirm": {
"title": "Remove Server \"{name}\"?",
"description": "This will remove \"{name}\" from your Codex config.toml file. This action cannot be undone.",
"confirm": "Remove Server",
"cancel": "Cancel",
"deleting": "Removing..."
}
},
"windows": {
"title": "Windows Compatibility",
"description": "Some MCP server commands require Windows-specific configuration for proper execution.",
"missingCount": "{count} missing command(s)",
"checking": "Checking Windows compatibility...",
"fixing": "Applying Windows compatibility fix...",
"autoFix": "Auto-Fix Commands",
"autoFixHint": "This will wrap commands with 'cmd /c' prefix for Windows compatibility.",
"install": "Download"
},
"filters": {
"all": "All",
@@ -126,5 +150,148 @@
"saveConfig": "Save Configuration",
"saving": "Saving..."
}
},
"recommended": {
"title": "Recommended Servers",
"description": "Quickly install popular MCP servers with one click",
"servers": {
"ace": {
"name": "ACE Tool",
"description": "Advanced code search and context engine for intelligent code discovery",
"command": "mcp__ace-tool__search_context",
"install": "Install ACE",
"installing": "Installing..."
},
"chrome": {
"name": "Chrome DevTools",
"description": "Browser automation and debugging tools for web development",
"command": "mcp__chrome-devtools",
"install": "Install Chrome",
"installing": "Installing..."
},
"exa": {
"name": "Exa Search",
"description": "AI-powered web search with real-time crawling capabilities",
"command": "mcp__exa__search",
"install": "Install Exa",
"installing": "Installing..."
}
},
"actions": {
"install": "Install",
"installing": "Installing...",
"installed": "Installed",
"viewAll": "View All Servers"
}
},
"configType": {
"label": "Config Format",
"mcpJson": ".mcp.json",
"claudeJson": ".claude.json",
"switchWarning": "Switching config format will not migrate existing servers. You'll need to reconfigure servers in the new format.",
"switchConfirm": "Switch Config Format",
"switchCancel": "Keep Current"
},
"templates": {
"title": "Templates",
"description": "Reusable MCP server configuration templates",
"searchPlaceholder": "Search templates by name or description...",
"filter": {
"allCategories": "All Categories"
},
"actions": {
"install": "Install Template",
"delete": "Delete Template",
"saveAsTemplate": "Save as Template"
},
"loading": "Loading templates...",
"empty": {
"title": "No Templates Found",
"message": "Create your first template or install templates from the community",
"createFirst": "Create Your First Template"
},
"saveDialog": {
"title": "Save as Template",
"name": "Template Name",
"namePlaceholder": "e.g., My Python MCP Server",
"category": "Category",
"categoryPlaceholder": "Select a category",
"description": "Description",
"descriptionPlaceholder": "Brief description of what this template does...",
"validation": {
"nameRequired": "Template name is required"
},
"save": "Save Template",
"cancel": "Cancel"
},
"deleteDialog": {
"title": "Delete Template",
"message": "Are you sure you want to delete the template \"{name}\"? This action cannot be undone.",
"delete": "Delete",
"deleting": "Deleting...",
"cancel": "Cancel"
},
"categories": {
"stdio": "STDIO",
"sse": "SSE",
"language": "Language",
"official": "Official",
"custom": "Custom"
},
"feedback": {
"installSuccess": "Template installed successfully",
"installError": "Failed to install template",
"deleteSuccess": "Template deleted successfully",
"deleteError": "Failed to delete template",
"saveSuccess": "Template saved successfully",
"saveError": "Failed to save template"
}
},
"crossCli": {
"button": "Cross-CLI Copy",
"title": "Copy MCP Servers Between CLIs",
"selectServers": "Select servers to copy from {source}",
"selectServersHint": "Choose servers to copy. Configuration will be transformed for the target CLI format.",
"noServers": "No servers available in current configuration",
"selectedCount": "{count} server(s) selected",
"copying": "Copying...",
"copyButton": "Copy to {target}"
},
"allProjects": {
"title": "All Projects",
"name": "Project Name",
"servers": "Servers",
"lastModified": "Last Modified",
"actions": "Actions",
"current": "Current",
"openNewWindow": "Open in new window",
"empty": "No projects found",
"summary": "Showing {count} project(s)"
},
"otherProjects": {
"title": "Other Projects",
"description": "Discover and import MCP servers from your other projects",
"selectProject": "Select a project",
"selectProjectPlaceholder": "Choose a project...",
"noProjects": "No other projects available",
"noServers": "No MCP servers found in {project}",
"import": "Import",
"hint": "Imported servers will be added to your current project configuration"
},
"installCmd": {
"title": "Installation Command",
"cliCommand": "CLI Command",
"cliCommandHint": "Run this command in your terminal to install the server",
"jsonConfig": "JSON Configuration",
"jsonConfigHint": "Add this to your {filename} file",
"envVars": "Environment Variables",
"steps": "Installation Steps",
"step1": "Run the CLI command above in your terminal",
"step2": "Or manually add the JSON config to your configuration file",
"step3": "Restart your CLI to load the new server"
},
"enterprise": {
"label": "Enterprise",
"tooltip": "Enterprise MCP server"
}
}

View File

@@ -143,6 +143,18 @@
"empty": "No nodes available",
"clear": "Clear all"
},
"contextAssembler": {
"title": "Context Template",
"helpTitle": "Context Assembly Syntax",
"helpSyntax1": "Reference node output: {{node:node-id}}",
"helpSyntax2": "Reference variable: {{var:variableName}}",
"helpSyntax3": "Combine multiple sources in custom format",
"addNode": "Add Node Reference",
"selectNode": "Select a node...",
"addVariable": "Add Variable Reference",
"selectVariable": "Select a variable...",
"manualEdit": "Custom Template (use {{node:id}} or {{var:name}})"
},
"propertyPanel": {
"title": "Properties",
"open": "Open properties panel",
@@ -160,7 +172,9 @@
"variableName": "variableName",
"condition": "e.g., result.success === true",
"trueLabel": "True",
"falseLabel": "False"
"falseLabel": "False",
"contextTemplate": "Template with {variable} placeholders",
"promptText": "Enter your prompt here..."
},
"labels": {
"label": "Label",
@@ -179,7 +193,13 @@
"trueLabel": "True Label",
"falseLabel": "False Label",
"joinMode": "Join Mode",
"failFast": "Fail fast (stop all branches on first error)"
"failFast": "Fail fast (stop all branches on first error)",
"tool": "CLI Tool",
"mode": "Mode",
"promptType": "Prompt Type",
"sourceNodes": "Source Nodes",
"contextTemplate": "Context Template",
"promptText": "Prompt Text"
},
"options": {
"modeMainprocess": "Main Process",
@@ -195,7 +215,18 @@
"operationMove": "Move",
"joinModeAll": "Wait for all branches",
"joinModeAny": "Complete when any branch finishes",
"joinModeNone": "No synchronization"
"joinModeNone": "No synchronization",
"toolGemini": "Gemini",
"toolQwen": "Qwen",
"toolCodex": "Codex",
"modeAnalysis": "Analysis",
"modeWrite": "Write",
"modeReview": "Review",
"promptTypeOrganize": "Organize",
"promptTypeRefine": "Refine",
"promptTypeSummarize": "Summarize",
"promptTypeTransform": "Transform",
"promptTypeCustom": "Custom"
}
}
}