{
  "meta": {
    "name": "English",
    "code": "en"
  },
  "common": {
    "loading": "Loading...",
    "error": "Error",
    "success": "Success",
    "warning": "Warning",
    "info": "Info",
    "done": "Done",
    "cancel": "Cancel",
    "confirm": "Confirm",
    "yes": "Yes",
    "no": "No",
    "save": "Save",
    "delete": "Delete",
    "edit": "Edit",
    "create": "Create",
    "close": "Close",
    "back": "Back",
    "next": "Next",
    "prev": "Previous",
    "search": "Search",
    "filter": "Filter",
    "refresh": "Refresh",
    "copy": "Copy",
    "copied": "Copied",
    "not_found": "Not found",
    "required": "Required",
    "optional": "Optional",
    "total": "Total",
    "local": "Local",
    "default": "Default"
  },
  "cli": {
    "description": "AgentFlow CLI — drive apply/replay with Cursor, OpenCode, Claude Code, or Codex CLI streaming",
    "usage": "Usage",
    "commands": "Commands",
    "options": "Options",
    "requires": "Requires",
    "examples": "Examples"
  },
  "flow": {
    "name": "Flow",
    "list": "List all pipelines",
    "apply": "Apply flow",
    "replay": "Replay node",
    "resume": "Resume flow",
    "validate": "Validate flow",
    "not_found": "Flow not found: {{name}}",
    "invalid": "Invalid flow",
    "running": "Flow is running",
    "completed": "Flow completed",
    "failed": "Flow failed",
    "pending": "Flow pending",
    "ready_nodes": "Ready nodes",
    "no_ready_nodes": "No ready nodes",
    "node_start": "Starting node: {{label}} ({{instanceId}})",
    "node_done": "Node completed: {{label}} ({{instanceId}})",
    "node_failed": "Node failed: {{label}} ({{instanceId}}) - {{error}}",
    "extract_thinking": "Extract thinking content",
    "dry_run_nodes": "[--dry-run] Would execute nodes: {{nodes}}. Omit --dry-run to run.",
    "stuck_error": "No ready nodes and not all done; flow may be stuck.",
    "paused": "Paused",
    "resume_hint": "To resume, run:"
  },
  "node": {
    "name": "Node",
    "status": {
      "success": "Success",
      "failed": "Failed",
      "pending": "Pending",
      "running": "Running",
      "skipped": "Skipped"
    },
    "types": {
      "agent": "Agent Node",
      "control": "Control Node",
      "tool": "Tool Node"
    },
    "start": "[START] Node",
    "end": "[END] Node",
    "start_parallel": "[START] Parallel execution",
    "end_parallel": "[END] All parallel nodes completed",
    "model_label": "Model",
    "done_label": "Done",
    "failed_label": "Failed"
  },
  "apply": {
    "done": "Apply done",
    "paused": "Paused",
    "stuck": "Flow may be stuck",
    "resume_command": "To resume, run:",
    "user_confirmed": "User confirmed to continue (including retry failed)"
  },
  "catalog": {
    "builtin_agent_not_found": "Built-in agent not found",
    "name_already_exists": "Name already exists, please choose another",
    "agent_not_found": "Agent not found",
    "invalid_agent_id": "Invalid agent id (needs to be filename-safe)",
    "builtin_flow_not_found": "Built-in flow not found",
    "builtin_flow_archive_not_supported": "Built-in pipelines do not support archive view",
    "builtin_flow_archive_path_not_supported": "Built-in pipelines do not support archive path",
    "type_text": "Text",
    "pipeline_header": "Pipeline",
    "source_header": "Source",
    "open_example_header": "Validate Command"
  },
  "composer": {
    "edit_context": "## AgentFlow Edit Context",
    "tool_nodejs_rules_title": "## tool_nodejs Node Writing Rules (Must Follow)",
    "tool_nodejs_rules_body": "The core of `definitionId: tool_nodejs` is the **`script` field**—must write a complete executable shell/node command.\n- `script`: Pipeline spawns directly, stdout becomes result, exit code determines success/failure\n- `body`: When `script` exists, it serves only as human-readable comment, **will NOT be executed**\n- `script` supports `${}` placeholders referencing input slots and system variables (workspaceRoot, pipelineWorkspace, runDir, etc.), values are auto shell-quoted; after CD Workspace, `${workspaceRoot}` is the current execution workspace and `${pipelineWorkspace}` is the pipeline workspace\n- **Do NOT** wrap `${workspaceRoot}` etc. with extra double quotes (e.g., `node \"${workspaceRoot}/...\"`); write `node ${workspaceRoot}/...` instead, otherwise path will contain extra quotes causing execution failure\n- **Forbidden** to only write natural language description in `body` without `script`—this leads to no executable code at runtime\n- If logic is too complex to write complete `script`, use `agent_subAgent` instead (also change definitionId)",
    "task_title": "## Task",
    "task_instruction": "Please complete only the above single task, no extra modifications. After completion, sync UI per context instructions.",
    "validation_passed": "flow validation passed",
    "validation_passed_detail": "✓ flow.yaml validation passed (validate-flow)",
    "validation_failed": "flow validation failed, attempting auto-fix...",
    "fix_task_title": "## Task: Fix flow.yaml to pass validate-flow",
    "fix_errors_intro": "The following errors must be **all eliminated** (same rules as CLI `agentflow validate` / `validate-flow.mjs`):",
    "fix_constraints_title": "### Constraints",
    "fix_constraints_body": "- **Only** edit the \"flow definition file\" `flow.yaml` in context, do not modify unrelated files.\n- Prefer minimal changes: add edges, fix sourceHandle/targetHandle, role, model, instance structure, etc.",
    "analyzing_task": "Analyzing task…",
    "validation_repair": "Validation repair: agent attempt {{attempt}}/{{max}}…",
    "validation_repair_start": "🔧 Starting validation repair ({{attempt}}/{{max}})…",
    "validation_repair_auto_success": "(auto-repair succeeded)",
    "skip_validation_for_phase": "Skipping validation for current phase (will validate at final phase)",
    "all_phases_complete": "All phases complete",
    "phase_complete_waiting": "{{label}} complete, waiting for confirmation…",
    "current_phase": "Phase {{index}}",
    "all_steps_complete": "All steps complete",
    "multi_step_failed": "Multi-step execution failed: {{message}}",
    "multi_step_starting": "Multi-step mode starting…",
    "classify_failed": "[CLASSIFY_FAIL] Task classification failed: {{message}}"
  },
  "runner": {
    "cursor_account_limit": "[agentflow] Cursor account limit: detected Auto-only support, auto-retrying once (Auto)...",
    "generating_reply": "Generating reply...",
    "thinking": "Thinking...",
    "completed": "Completed",
    "execution_failed": "Execution failed",
    "event_label": "Event",
    "tool_call": "Tool call ({{subtype}})",
    "base64_data": "[cursor-stdout] (base64 data, {{len}} chars)",
    "non_json_line": "(non-JSON) {{preview}}",
    "unparsed_line": "(unparsed line, {{len}} chars)",
    "opencode_exit_code": "OpenCode exit code {{code}}",
    "done": "Done"
  },
  "tool": {
    "nodejs_script_hint": "script success/failure determined by exit code (0=success), stdout directly becomes result slot content (plain text, e.g., console.log).",
    "nodejs_heal_retry": "[tool_nodejs self-heal] {{instanceId}} retry {{attempt}}/{{maxRetries}}: {{detail}}"
  },
  "planner": {
    "heuristic_analysis": "Heuristic task analysis (configure OPENAI_API_KEY or ANTHROPIC_API_KEY to enable smart planning)",
    "planning": "Planning task ({{model}})…",
    "planner_format_error": "Planner returned unexpected format, falling back to single-step",
    "planner_call_failed": "Planner call failed ({{message}}), falling back to heuristic analysis",
    "phased_planning": "Phased planning: {{label}} ({{index}}/{{total}})…",
    "phased_cli_exec": "Phased: {{label}} (CLI execution)",
    "phased_format_error": "Phased planner returned unexpected format, using default agent step",
    "phased_planning_failed": "Phased planning failed ({{message}}), using default agent step"
  },
  "api": {
    "node_context_marker": "## Node Context",
    "task_marker": "## Execution Task"
  },
  "ui": {
    "server_start": "UI server started",
    "server_listening": "Server listening on port {{port}}",
    "open_browser": "Open browser",
    "projects": "Projects & Pipelines",
    "flow_editor": "Flow Editor",
    "settings": "Settings"
  },
  "error": {
    "generic": "Error occurred: {{message}}",
    "file_not_found": "File not found: {{path}}",
    "invalid_args": "Invalid arguments",
    "missing_required": "Missing required field: {{field}}",
    "exec_failed": "Execution failed: {{command}}",
    "network_error": "Network error",
    "permission_denied": "Permission denied",
    "read_flow_failed": "Failed to read flow",
    "read_node_library_failed": "Failed to read node library",
    "save_failed": "Save failed",
    "move_failed": "Move failed"
  },
  "env": {
    "cursor_not_cached": "Not cached",
    "cursor_cached": "Model list cached",
    "opencode_not_found": "Not found",
    "opencode_ready": "Ready",
    "service_normal": "Service normal",
    "service_abnormal": "Some interfaces abnormal"
  },
  "type": {
    "node": "Node",
    "text": "Text",
    "file": "File",
    "bool": "Boolean"
  },
  "role": {
    "normal": "Normal",
    "planning": "Planning",
    "code": "Code",
    "test": "Test",
    "requirement": "Requirement"
  },
  "nodeDef": {
    "control_start": {
      "displayName": "Start",
      "description": "Entry point of AgentFlow, all flows should start from this node"
    },
    "control_end": {
      "displayName": "End",
      "description": "End point of AgentFlow, flow terminates after this node"
    },
    "agent_subAgent": {
      "displayName": "SubAgent",
      "description": "Execute tasks using SubAgent"
    },
    "tool_user_ask": {
      "displayName": "UserAsk",
      "description": "Pause and wait for the user to pick one of N branches. Each output slot is an option; the slot description is the option label (human-driven switch)."
    },
    "tool_user_check": {
      "displayName": "User Confirm",
      "description": "Wait for user confirmation, flow pauses. Requires user to reply 'continue' to resume"
    },
    "control_if": {
      "displayName": "If Branch",
      "description": "Has exactly one bool type input. Continues to next1 if true, next2 if false"
    },
    "control_anyOne": {
      "displayName": "Any One",
      "description": "Continues to next when any upstream input is ready"
    },
    "control_toBool": {
      "displayName": "Code ToBool",
      "description": "Execute script to produce true/false prediction. Like tool_nodejs but enforces bool output. Extensible inputs."
    },
    "control_delay": {
      "displayName": "Delay",
      "description": "Persistently wait for a relative duration, then scheduler resumes this run."
    },
    "control_wait_until": {
      "displayName": "Wait Until",
      "description": "Persistently wait until an absolute time, then scheduler resumes this run."
    },
    "control_cancelled": {
      "displayName": "Cancel Check",
      "description": "Check whether the current wait/run has been cancelled and output cancelled as bool."
    },
    "control_interval_loop": {
      "displayName": "Interval Loop",
      "description": "Persistently wait by interval and branch to continue, done, timeout, or cancelled based on done, cancelled, and deadline inputs."
    },
    "control_agent_toBool": {
      "displayName": "Agent ToBool",
      "description": "AI-powered boolean judgment for non-deterministic scenarios"
    },
    "control_cd_workspace": {
      "displayName": "CD Workspace",
      "description": "Switch downstream execution to another workspace context without changing the pipeline workspace"
    },
    "control_user_workspace": {
      "displayName": "User Workspace",
      "description": "Output a workspace context pointing to the current user's home directory"
    },
    "control_load_skills": {
      "displayName": "Load Skills",
      "description": "Load SKILL.md files from the current workspace, pipeline workspace, explicit paths, or both"
    },
    "tool_git_checkout": {
      "displayName": "Git Checkout",
      "description": "Clone or update a Git repository and expose it as a workspace context"
    },
    "tool_git_worktree_load": {
      "displayName": "Load Worktree",
      "description": "Create or reuse a Git worktree and output workspaceContext and gitContext"
    },
    "tool_git_worktree_unload": {
      "displayName": "Unload Worktree",
      "description": "Remove a Git worktree and restore downstream workspace context"
    },
    "tool_gitlab_create_mr": {
      "displayName": "Create GitLab MR",
      "description": "Create or reuse a GitLab merge request for the current branch and output its URL"
    },
    "tool_jenkins_build": {
      "displayName": "Jenkins Build",
      "description": "Trigger a Jenkins build and wait for completion, then output its status, artifact URL, and optional QR code",
      "guide": {
        "summary": "This node triggers one Jenkins job and durably checks its queue and build status. It does not keep an execution process blocked while waiting, and the flow continues automatically when the build finishes.",
        "prerequisites": [
          "Configure the Jenkins URL in Settings → Environment Variables; add a username and API token when authentication is required.",
          "Confirm the exact Jenkins job name and parameter names; parameter names are case-sensitive."
        ],
        "steps": [
          "Set job to the Jenkins job name, such as like-android; use folder/job for jobs inside folders.",
          "Set parameters to a JSON object; use {} for a non-parameterized build.",
          "Leave credentialRef empty to use the default JENKINS_BASE_URL variables, or set it to mobile to use JENKINS_MOBILE_* variables.",
          "pollInterval and timeout default to 30s and 2h and normally do not need changes."
        ],
        "example": "JENKINS_MOBILE_BASE_URL=http://jenkinsmobile.bigo.sg:8080/\nJENKINS_MOBILE_USERNAME=your-name\nJENKINS_MOBILE_TOKEN=your-api-token\n\njob: like-android\nparameters: {}\ncredentialRef: mobile",
        "notes": [
          "Never put a Jenkins token in flow.yaml or parameters.",
          "status returns SUCCESS, FAILURE, ABORTED, TIMEOUT, or CANCELLED; downstream notification nodes continue even when the build itself fails."
        ]
      }
    },
    "tool_wecom_send_group_markdown": {
      "displayName": "WeCom Group Chat Markdown",
      "description": "Send a Markdown message to a group chat through a WeCom group robot webhook"
    },
    "tool_wecom_send_app_markdown": {
      "displayName": "WeCom Direct Markdown",
      "description": "Send a Markdown message to one or more users through a WeCom enterprise application"
    },
    "tool_display_share_link": {
      "displayName": "Display Share Link",
      "description": "Publish upstream Display nodes as a shareable link and output the URL"
    },
    "tool_nodejs": {
      "displayName": "Node.js Script",
      "description": "Execute Node.js script, success determined by exit code, stdout as result"
    },
    "tool_print": {
      "displayName": "Print",
      "description": "Output content to user with special font style"
    },
    "tool_get_env": {
      "displayName": "Get Env",
      "description": "Get environment variable value"
    },
    "tool_set_run_env": {
      "displayName": "Set Run Env",
      "description": "Set temporary environment variables for downstream nodes in the current run"
    },
    "tool_save_key": {
      "displayName": "Save Key",
      "description": "Save key-value pair to global storage"
    },
    "tool_load_key": {
      "displayName": "Load Key",
      "description": "Load key-value from global storage"
    },
    "display_markdown": {
      "displayName": "Markdown Display",
      "description": "Render Markdown content on the Workspace canvas and pass the text downstream"
    },
    "display_code": {
      "displayName": "Code Display",
      "description": "Render highlighted source code with line numbers, copy, wrap, and download controls, then pass the code downstream"
    },
    "display_mermaid": {
      "displayName": "Mermaid Display",
      "description": "Render Mermaid diagram source on the Workspace canvas and pass the source downstream"
    },
    "display_ascii": {
      "displayName": "ASCII Display",
      "description": "Render ASCII diagram text on the Workspace canvas and pass the text downstream"
    },
    "display_html": {
      "displayName": "HTML Display",
      "description": "Render HTML in a sandboxed iframe on the Workspace canvas and pass the source downstream"
    },
    "display_react_app": {
      "displayName": "React App",
      "description": "Preview a React project in a sandboxed iframe on the Workspace canvas and pass the project JSON downstream"
    },
    "display_image": {
      "displayName": "Image Display",
      "description": "Preview an image URL, data URL, or image path on the Workspace canvas and pass the source downstream"
    },
    "display_chart": {
      "displayName": "Chart Display",
      "description": "Render ChartSpec/ECharts JSON on the Workspace canvas and pass the JSON downstream"
    },
    "display_table": {
      "displayName": "Table Display",
      "description": "Render JSON, Markdown, CSV, or TSV table data on the Workspace canvas and pass the text downstream"
    },
    "provide_str": {
      "displayName": "Text",
      "description": "Provide a text value directly, value will be passed to downstream as-is"
    },
    "provide_file": {
      "displayName": "File",
      "description": "Provide file path or content directly, value will be passed to downstream as-is"
    },
    "provide_password": {
      "displayName": "Password",
      "description": "Provide a password or secret text value without showing it on the node card"
    },
    "provide_bool": {
      "displayName": "Boolean",
      "description": "Provide a true/false boolean value directly to downstream bool pins"
    }
  },
  "pipeline": {
    "module-migrate": {
      "description": "Module migration pipeline (Define scope -> Confirm -> Migrate -> Static loop -> Compile loop -> Output document)",
      "start": { "label": "Start", "body": "Flow entry" },
      "scope": { "label": "Define Migration Scope" },
      "user_confirm_scope": { "label": "User Confirm Scope" },
      "migrate": { "label": "Execute Migration" },
      "anyOne_static": { "label": "AnyOne (Static Loop Entry)" },
      "anyOne_gradle": { "label": "AnyOne (Compile Loop Entry)" },
      "ai_check_ref": { "label": "AI Check References" },
      "agent_sum_error": { "label": "Summarize Issues" },
      "gradle_build": { "label": "Gradle Build" },
      "fix_dynamic": { "label": "Fix Build Issues" },
      "output_doc": { "label": "Output Document" },
      "end": { "label": "End", "body": "Flow exit" },
      "provide_key_ready_file": { "label": "KeyReadyFile" },
      "provide_key_module_name": { "label": "KeyModuleName" },
      "tool_save_ready_file": { "label": "Ready Files List" },
      "tool_save_module_name": { "label": "Module Name" },
      "agent_new_module": { "label": "Create Module" },
      "tool_static_analy": { "label": "Static Analysis" },
      "if_static": { "label": "If Static Check" },
      "LoadFile": { "label": "Migration File List" },
      "agent_fix_todo": { "label": "Fix TODO Items" },
      "control_toBool_static_bool": { "label": "Static Check Result Conversion" },
      "control_if_task_gradle": { "label": "If Task Complete" },
      "control_toBool_gradle_bool": { "label": "List Complete Result" },
      "control_if_fixed": { "label": "If Fix Complete" },
      "to_bool_fix_all": { "label": "Check If All Fixed" },
      "control_anyOne_start_fix": { "label": "Fix Entry" },
      "tool_print_module": { "label": "Print Summary" },
      "gradle_tasks": { "label": "Get Java/Kotlin Build Tasks" }
    },
    "figma-restore": {
      "description": "Figma design restoration pipeline",
      "Start": { "label": "Start" },
      "FigmaURL": { "label": "FigmaURL" },
      "FigmaToken": { "label": "FigmaToken" },
      "script_check": { "label": "Script Self Check" },
      "get_figma_tree": { "label": "Get Figma Node Tree and Screenshots" },
      "ai_semantic": { "label": "AI Semantic Analysis of Screenshot Structure" },
      "restore_by_depth": { "label": "Restore by Tree Depth Traversal" },
      "export_resources": { "label": "Export img/icon Resources" },
      "summarize": { "label": "Summarize Delivery JSON" },
      "End": { "label": "End" }
    },
    "new": {
      "description": "New pipeline",
      "control_start_new": { "label": "Start" },
      "agent_plan": { "label": "Plan Nodes" },
      "agent_create": { "label": "Create Flow" },
      "control_end_new": { "label": "End" },
      "provide_skills_file": { "label": "Layout Skills" },
      "provide_requirement": { "label": "Requirements" },
      "agent_fix": { "label": "Fix Nodes" },
      "agent_implement_script": { "label": "Complete Code" },
      "tool_user_check": { "label": "UserCheck" },
      "control_anyOne": { "label": "AnyOne" },
      "provide_flow": { "label": "Flows Skills" },
      "provide_newFlow_key_save": { "label": "Flow Key Name" },
      "provide_newFlow_key_load": { "label": "Flow Key Name" },
      "agent_ai_check_tool": { "label": "AI Check Tools" },
      "AI_CHECK_FILE": { "label": "AI Check Files" },
      "control_if_check": { "label": "If Check" },
      "control_toBool_check": { "label": "Check Result" }
    }
  }
}
