{
    "cli.error": "Error: {message}",
    "cli.programDescription": "Open the loop board or start loops in the background.",
    "cli.startDescription": "Start the background daemon (restores persisted loops)",
    "cli.newDescription": "Create a new loop in the background",
    "cli.runDescription": "Run a loop in the foreground",
    "cli.argInterval": "Interval between runs (e.g. 30s, 5m, 1h, or manual)",
    "cli.argCommand": "Command to execute",
    "cli.optNow": "Run immediately before waiting",
    "cli.optMaxRuns": "Stop after N executions",
    "cli.optVerbose": "Show execution details",
    "cli.optCwd": "Working directory for the command",
    "cli.daemonStarted": "Daemon started. Loops restored.",
    "cli.startedTitle": "Loop started in background",
    "cli.startedId": "  ID:       {id}",
    "cli.startedCommand": "  Command:  {command}",
    "cli.startedInterval": "  Interval: {interval}",
    "cli.startedStatus": "  Status:   running",
    "cli.startedHint": "  loop-task new ...        # create another loop\n  loop-task                # open the board",
    "cli.noLoops": "No background loops running.",
    "cli.headerId": "ID",
    "cli.headerCommand": "COMMAND",
    "cli.headerInterval": "INTERVAL",
    "cli.headerStatus": "STATUS",
    "cli.headerRuns": "RUNS",
    "cli.headerLastExit": "LAST EXIT",
    "cli.statusTitle": "Loop: {id}",
    "cli.statusCommand": "  Command:   {command}",
    "cli.statusInterval": "  Interval:  {interval} ({duration})",
    "cli.statusStatus": "  Status:    {status}",
    "cli.statusRuns": "  Runs:      {runs} / {maxRuns}",
    "cli.statusSilentChains": "  Silent:    {count} silent-chain runs",
    "cli.statusCreated": "  Created:   {created}",
    "cli.statusLastRun": "  Last run:  {lastRun} {exit} {duration}",
    "cli.statusNextRun": "  Next run:  {nextRun}",
    "cli.exitInfo": "exit {code}",
    "cli.unlimited": "∞",
    "cli.paused": "Loop {id} paused.",
    "cli.resumed": "Loop {id} resumed.",
    "cli.deleted": "Loop {id} deleted.",
    "cli.attaching": "Attaching to loop {id}... (Ctrl+C to detach)\n",
    "cli.detached": "\nDetached.",
    "cli.optProject": "Assign the loop to a project (name or id)",
    "cli.projectDescription": "Manage projects",
    "cli.projectListDescription": "List all projects",
    "cli.projectNewDescription": "Create a new project",
    "cli.projectRenameDescription": "Rename a project",
    "cli.projectColorDescription": "Change a project's color",
    "cli.projectDeleteDescription": "Delete a project (loops move to Default)",
    "cli.optProjectColor": "Project color (name or #hex)",
    "cli.optProjectDirectory": "Project working directory",
    "cli.optProjectGithubSource": "GitHub repository in owner/repo format",
    "cli.projectArgName": "Project name",
    "cli.projectArgNewName": "New project name",
    "cli.projectArgIdOrName": "Project id or name",
    "cli.projectArgColor": "Color name or #hex",
    "cli.noProjects": "No projects.",
    "cli.projectHeaderName": "NAME",
    "cli.projectHeaderId": "ID",
    "cli.projectHeaderColor": "COLOR",
    "cli.projectHeaderLoops": "LOOPS",
    "cli.projectHeaderSystem": "SYSTEM",
    "cli.projectCreated": "Project \"{name}\" created (id: {id})",
    "cli.projectRenamed": "Project renamed to \"{name}\"",
    "cli.projectColorSet": "Project \"{name}\" color set to {color}",
    "cli.projectDeleted": "Project \"{name}\" deleted (loops moved to Default)",
    "cli.projectNotFound": "Project not found: {name}",
    "cli.projectAmbiguous": "Multiple projects named \"{name}\" - use the id instead",
    "cli.projectInvalidColor": "Invalid color \"{color}\". Valid names: {valid}, or a #rrggbb hex",
    "loop.runHeader": "\n[Run #{runNumber} - {timestamp}]\n",
    "loop.commandLine": "$ {command}\n",
    "loop.cwdLine": "  cwd: {cwd}\n",
    "loop.chainHeader": "\n--- Chain: {name} ({branch}, prev exit {prevExit}) ---\n",
    "loop.exitMarker": "[exit {code} · {duration}]\n",
    "loop.cwdMissingLog": "[error] working directory does not exist: {cwd}\n",
    "loop.cwdMissing": "Working directory does not exist: {cwd}",
    "loop.executing": "Executing: {command}",
    "loop.shuttingDown": "\nShutting down gracefully...",
    "loop.completed": "Completed {runs} run(s). Exiting.",
    "loop.waitingFirst": "Waiting {duration} before first run...",
    "loop.runSeparator": "\n--- Run {run}{maxRuns} ---",
    "loop.commandFailed": "Command failed with exit code {code}",
    "loop.debugStartedAt": "Started at:  {timestamp}",
    "loop.debugEndedAt": "Ended at:    {timestamp}",
    "loop.debugExitCode": "Exit code:   {code}",
    "loop.debugDuration": "Duration:    {duration}",
    "loop.nextRun": "Next run in {duration} (at {time})",
    "errors.durationEmpty": "Duration cannot be empty",
    "errors.durationInvalid": "Invalid duration: \"{input}\". Use formats like 10s, 5m, 1h, 1d, 1w, or manual",
    "errors.durationNotPositive": "Duration must be positive, got: \"{input}\"",
    "errors.maxRunsInvalid": "--max-runs must be a positive integer",
    "errors.unbalancedQuote": "Unbalanced quote in command",
    "errors.commandEmpty": "Command cannot be empty",
    "errors.descriptionEmpty": "Description cannot be empty",
    "errors.loopNotFound": "Loop {id} not found",
    "errors.invalidJson": "Invalid JSON",
    "errors.noLogsYet": "No logs yet",
    "errors.invalidResponse": "Invalid response from daemon",
    "errors.connectionClosed": "Connection closed before response",
    "errors.cannotConnect": "Cannot connect to daemon: {message}",
    "errors.requestTimedOut": "Daemon request timed out",
    "errors.daemonFailedToStart": "Daemon failed to start within 5 seconds",
    "errors.daemonUncaught": "Daemon uncaught exception:",
    "errors.daemonFailed": "Daemon failed to start:",
    "errors.pauseFailed": "pause failed",
    "errors.resumeFailed": "resume failed",
    "errors.forceRunFailed": "force run failed",
    "errors.deleteFailed": "delete failed",
    "errors.maxRunsReached": "Max runs reached - edit the loop and increase 'Max runs' to continue",
    "errors.triggerWhileRunning": "Loop is already running - force run skipped",
    "format.dash": "-",
    "format.justNow": "just now",
    "format.secsAgo": "{secs}s ago",
    "format.minsAgo": "{mins}m ago",
    "format.hrsAgo": "{hrs}h ago",
    "format.daysAgo": "{days}d ago",
    "format.secsAhead": "{secs}s",
    "format.minsAhead": "{mins}m",
    "format.hrsAhead": "{hrs}h",
    "format.daysAhead": "{days}d",
    "format.timingPaused": "paused",
    "format.timingIdle": "not scheduled",
    "format.durationManual": "manual trigger only",
    "format.timingNext": "in {timeAgo}",
    "format.timingLast": "last {timeAgo}",
    "format.timingNew": "new",
    "board.appName": "loop-task",
    "board.appTagline": "  background task loops",
    "board.daemonLabel": "Daemon: ",
    "board.loopsLabel": "    Loops: ",
    "board.runningLabel": "    Running: ",
    "board.waitingLabel": "    Waiting: ",
    "board.pausedLabel": "    Paused: ",
    "board.idleLabel": "    Stopped: ",
    "board.searchTitle": " Search / ",
    "board.searchPlaceholder": "type to filter, enter to apply",
    "board.searchSelectPlaceholder": "type to filter...",
    "board.searchEmpty": "press / to search",
    "board.statusFilterTitle": " Status x ",
    "board.sortTitle": " Order o ",
    "board.newLoopTitle": "",
    "board.newLoopLabel": "Add Loop",
    "board.viewTasksTitle": "",
    "board.viewTasksLabel": "View Tasks",
    "board.viewLoopsTitle": " Loops ",
    "board.viewLoopsLabel": "View Loops",
    "board.headerSince": "SINCE",
    "board.headerRuns": "RUNS",
    "board.headerStatus": "STATUS",
    "board.headerDescription": "DESCRIPTION",
    "board.headerTiming": "TIMING",
    "board.headerExitRuns": "EXIT RUNS",
    "board.navigatorTitle": " Loops {visible}/{total}  sort:{sort}  status:{status} ",
    "board.navigatorCount": " Loops {visible}/{total} ",
    "board.chipFilter": "filter: {query}",
    "board.chipProject": "project:",
    "board.chipStatus": "status:",
    "board.chipSort": "sort:",
    "board.chipAll": "all",
    "board.chipSearch": "search: {query}",
    "board.chipLoops": "loops:",
    "board.chipType": "type:",
    "board.runHistoryFailStreak": "streak:{count} fail",
    "board.runHistoryLastFail": "last fail:{ago}",
    "board.noMatch": "  No loops match the current view",
    "board.inspectorTitle": " Inspector ",
    "board.inspectorEmpty": "  Select a loop to view details",
    "board.fieldId": "ID:",
    "board.fieldDesc": "Desc:",
    "board.fieldCommand": "Command:",
    "board.fieldTask": "Task:",
    "board.fieldDir": "Dir:",
    "board.fieldInterval": "Interval:",
    "board.fieldStatus": "Status:",
    "board.fieldRuns": "Runs:",
    "board.fieldLastRun": "Last run:",
    "board.fieldLastExit": "Last exit:",
    "board.fieldNextRun": "Next run:",
    "board.fieldSilentChains": "Silent:",
    "board.fieldPid": "PID:",
    "board.inherit": "(inherit)",
    "board.unlimited": "∞",
    "board.timelineTitle": " Timeline ",
    "board.timelineEmpty": "  No output yet.",
    "board.runHistoryTitle": " Run History ",
    "board.runHistoryTitleHint": " Run History (Enter to view log) ",
    "board.runHistoryEmpty": "  No runs yet.",
    "board.runHistoryTime": "TIME",
    "board.runHistoryDesc": "DESCRIPTION",
    "board.runHistoryDuration": "DURATION",
    "board.runHistorySize": "SIZE",
    "board.logModalTitle": " Run Log {icon} {time} ",
    "board.logModalLoading": "  Loading...",
    "board.logModalEmpty": "  No output captured.",
    "board.logModalNoMatches": "No matches",
    "board.logModalRunning": "Running",
    "board.logModalExit": "exit {code}",
    "board.logModalDuration": "duration",
    "board.logModalSearchHint": "type to filter, enter to apply, esc to exit search",
    "board.logModalFooterHints": "/:search  ctrl+x:copy  up/down:scroll  ctrl+t:top  ctrl+b:bottom  esc:close",
    "board.logModalEscClose": "esc to close",
    "board.logModalRunning": "running…",
    "board.detailTitle": " Loop Detail ",
    "board.detailFieldId": "ID:        ",
    "board.detailFieldDesc": "Desc:      ",
    "board.detailFieldCommand": "Command:   ",
    "board.detailFieldDir": "Dir:       ",
    "board.detailFieldInterval": "Interval:  ",
    "board.detailFieldStatus": "Status:    ",
    "board.detailFieldRuns": "Runs:      ",
    "board.detailFieldCreated": "Created:   ",
    "board.detailFieldLastRun": "Last run:  ",
    "board.detailFieldLastExit": "Last exit: ",
    "board.detailFieldNextRun": "Next run:  ",
    "board.detailFieldPid": "PID:       ",
    "board.detailFieldSilentChains": "Silent:    ",
    "board.detailSummaryStatus": "status",
    "board.detailSummaryTiming": "next",
    "board.detailSummaryInterval": "every",
    "board.detailSummaryRuns": "runs",
    "board.detailSummaryExit": "exit",
    "board.liveOutputTitle": " Live Output ",
    "board.helpTitle": " Help ",
    "board.helpMoveSelection": "move selection",
    "board.helpToggleDetail": "toggle loop detail",
    "board.helpCreate": "create loop",
    "board.helpCreateTask": "create task",
    "board.helpEdit": "edit loop (pauses it)",
    "board.helpPauseResume": "pause/resume selected loop",
    "board.helpStopPlay": "stop/play selected loop (resets schedule)",
    "board.helpForceRun": "force run selected loop now",
    "board.helpDelete": "delete selected loop",
    "board.helpSearch": "search loops",
    "board.helpCycleFilter": "cycle status filter",
    "board.helpCycleSort": "cycle sort mode",
    "board.helpRunHistory": "navigate run history",
    "board.helpOpenRunLog": "open run log",
    "board.helpSwitchPanel": "switch panel focus",
    "board.helpKeyLeftRight": "←/→",
    "board.helpToggleHelp": "toggle help",
    "board.helpBack": "back to board",
    "board.helpQuit": "quit",
    "board.labelInterval": "Interval",
    "board.labelCommand": "Command",
    "board.labelDescription": "Description",
    "board.labelCwd": "Working dir",
    "board.labelRunNow": "Run immediately?",
    "board.labelMaxRuns": "Max runs",
    "board.labelTaskMode": "Task",
    "board.labelTask": "Select task",
    "board.taskModeInline": "Inline command",
    "board.taskModeExisting": "Existing task",
    "board.selectTask": "(select a task)",
    "board.taskLabelName": "Name",
    "board.taskLabelCommand": "Command",
    "board.taskLabelOnSuccess": "On success",
    "board.taskLabelOnFailure": "On failure",
    "board.taskHintName": "A short name for this task",
    "board.taskHintOnSuccess": "Task to run when this one succeeds (optional)",
    "board.taskHintOnFailure": "Task to run when this one fails (optional)",
    "board.taskNone": "(none)",
    "board.taskCreateTitle": " New Task ",
    "board.taskEditTitle": " Edit Task ",
    "board.hintTaskMode": "type a command inline, or pick an existing task",
    "board.hintInterval": "How often to run, e.g. 30s, 5m, 30m, 1h, 1d, or manual",
    "board.hintCommand": "Full command line. Quote args with spaces",
    "board.hintDescription": "Short label shown in the list. Blank uses the command",
    "board.hintCwd": "Leave blank to inherit from project directory, or set a specific path",
    "board.hintRunNow": "run once now then every interval, or wait the first interval",
    "board.hintMaxRuns": "Stop after N runs. Leave blank to run forever",
    "board.hintTask": "Pick a previously defined task",
    "wizard.taskPickerHint": "Press {action} to browse and search tasks",
    "wizard.cmdEditorHint": "Press {action} to open the command editor",
    "taskPicker.title": "Choose a task",
    "taskPicker.searchPlaceholder": "Type to search tasks...",
    "taskPicker.empty": "No tasks found",
    "taskPicker.hint": "up/down to navigate, enter to select, esc to cancel",
    "selectModal.searchPlaceholder": "Type to filter...",
    "selectModal.empty": "No matches",
    "selectModal.hint": "up/down to navigate, enter to select, esc to cancel",
    "selectModal.fieldHint": "Press {action} to change",
    "cmdEditor.title": "Command Editor",
    "cmdEditor.hint": "enter: new line . ctrl+s: save . esc: cancel",
    "cmdEditor.lines": "lines",
    "cmdEditor.inlineHint": "enter: new line . ctrl+v: paste . ctrl+y: copy . tab: next field . ctrl+s: save",
    "codeEditor.title": "Command Editor",
    "codeEditor.hint": "ctrl+s save . esc cancel . ctrl+z/ctrl+shift+z undo/redo . && sequential . || parallel",
    "codeEditor.buttonCopy": "Copy",
    "codeEditor.buttonPaste": "Paste",
    "codeEditor.buttonClear": "Clear",
    "codeEditor.buttonSave": "Save",
    "codeEditor.previewLabel": "Will execute:",
    "codeEditor.previewTruncated": "…",
    "codeEditor.emptyPlaceholder": "Enter command...",
    "codeEditor.fieldHint": "press enter to open editor",
    "codeEditor.copied": "Copied!",
    "codeEditor.cleared": "Cleared",
    "codeEditor.clipboardEmpty": "Clipboard empty, right-click to paste",
    "codeEditor.commandsTitle": "Parallel Commands",
    "codeEditor.commandsHint": "tab: next . shift+tab: prev . ctrl+s: save all . esc: cancel",
    "codeEditor.commandLabel": "Command",
    "codeEditor.commandEmpty": "empty = deleted",
    "codeEditor.commandMax": "max 4",
    "wizard.taskCommandsPrompt": "Commands to run (parallel)",
    "wizard.taskCommandsHint": "Multiple commands run at once, merge JSON output",
    "board.exampleInterval": "30m",
    "board.exampleCommand": "opencode run \"search missing translations and translate them, 3 maximum\" --model \"opencode/big-pickle\"",
    "board.exampleDescription": "translate missing strings",
    "board.runNowNo": "No",
    "board.runNowYes": "Yes - run now",
    "board.cwdMissing": "Working directory does not exist: {cwd}",
    "board.createTitle": " New Loop ",
    "board.editTitle": " Edit Loop (will pause) ",
    "board.exampleHeading": "Full example of the loop you are building:",
    "board.exampleFull": "loop-task start 30m --now -- opencode run \"search missing translations and translate them, 3 maximum\" --model \"opencode/big-pickle\"",
    "board.placeholderExample": "e.g. {example}",
    "board.placeholderBlank": "(blank)",
    "board.saving": "Saving...",
    "board.save": "Save",
    "board.create": "Create",
    "board.cancel": "Cancel",
    "board.formNav": "Tab/Shift+Tab to move | Enter advances or activates | Esc cancels",
    "board.badgeNormal": "Loops",
    "board.badgeSearch": "SEARCH",
    "board.badgeCreate": "CREATE",
    "board.badgeTask": "TASK",
    "board.badgeHelp": "HELP",
    "board.badgeDetail": "DETAIL",
    "board.badgeConfirm": "CONFIRM",
    "board.confirmTitle": " Confirm ",
    "board.yes": "Yes",
    "board.no": "No",
    "board.actionEdit": "Edit",
    "board.actionDelete": "Delete",
    "board.actionPause": "Pause",
    "board.actionStop": "Stop",
    "board.actionPlay": "Play",
    "board.actionClone": "Clone",
    "board.actionTrigger": "Force Run",
    "board.noActions": "Select a loop to see actions",
    "board.confirmPause": "Pause loop \"{desc}\"?",
    "board.confirmStop": "Stop loop \"{desc}\"? (schedule will reset on Play)",
    "board.confirmPlay": "Play loop \"{desc}\"? (starts fresh interval from now)",
    "board.confirmResume": "Resume loop \"{desc}\"?",
    "board.confirmTrigger": "Force run loop \"{desc}\"?",
    "board.confirmDelete": "Delete loop \"{desc}\"?",
    "board.toastPaused": "Paused \"{desc}\"",
    "board.toastStopped": "Stopped \"{desc}\"",
    "board.toastPlayed": "Playing \"{desc}\"",
    "board.toastResumed": "Resumed \"{desc}\"",
    "board.toastDeleted": "Deleted \"{desc}\"",
    "board.toastUpdated": "Updated \"{desc}\" (paused)",
    "board.toastTriggered": "Triggered \"{desc}\"",
    "board.toastStarted": "Started \"{desc}\"",
    "board.toastTaskCreated": "Task created {id}",
    "board.toastTaskUpdated": "Task updated {id}",
    "board.toastTaskSelected": "Selected task \"{desc}\"",
    "board.toastCopied": "Copied to clipboard",
    "board.toastTextCopied": "Text Copied",
    "board.copyCommand": "Copy",
    "board.logWaiting": "  Waiting for live output...",
    "board.logStreamError": "Log stream error: {message}",
    "board.hintSearch": "search",
    "board.hintRunHistory": "runs",
    "board.hintOpenRun": "select loop / open log",
    "board.hintSwitchPanel": "panel",
    "board.hintHelp": "help",
    "board.hintQuit": "quit",
    "board.hintApply": "apply",
    "board.hintCancel": "cancel",
    "board.hintNextField": "next field",
    "board.hintCreate": "create",
    "board.hintBack": "back",
    "board.hintChoose": "choose",
    "board.hintConfirm": "confirm",
    "board.hintYesNo": "yes/no",
    "board.helpKeyMove": "up/down, j/k",
    "board.helpKeyEnter": "enter",
    "board.helpKeyN": "n",
    "board.helpKeyE": "e",
    "board.helpKeyP": "p",
    "board.helpKeyX": "x",
    "board.helpKeyD": "d",
    "board.helpKeySlash": "/",
    "board.helpKeyF": "f",
    "board.helpKeyS": "s",
    "board.helpKeyH": "h",
    "board.helpKeyEsc": "esc",
    "board.helpKeyQ": "q",
    "board.hintKeySlash": "/",
    "board.hintKeyH": "h",
    "board.hintKeyQ": "q",
    "board.hintKeyEnter": "enter",
    "board.hintKeyEsc": "esc",
    "board.hintKeyTab": "tab",
    "board.hintKeyHelpEsc": "h/esc",
    "board.hintKeyArrows": "←/→",
    "board.hintKeyYN": "y/n",
    "board.taskBrowserTitle": " Tasks {visible}/{total} ",
    "board.taskBrowserEmpty": "  No tasks defined yet. Press n to create one.",
    "board.taskInspectorTitle": " Task Inspector ",
    "board.taskInspectorEmpty": "  Select a task to inspect",
    "board.taskFieldName": "Name:",
    "board.taskFieldId": "ID:",
    "board.taskFieldCommand": "Command:",
    "board.taskFieldChain": "Chain:",
    "board.taskFieldSilent": "Silent:",
    "board.taskFieldCreated": "Created:",
    "board.taskHeaderName": "NAME",
    "board.taskHeaderCommand": "COMMAND",
    "board.taskHeaderChains": "CHAINS",
    "board.taskActionSelect": "Select",
    "board.taskActionNew": "+ New Task",
    "board.newTaskTitle": " New ",
    "board.taskActionEdit": "Edit",
    "board.taskActionDelete": "Delete",
    "board.confirmDeleteTask": "Delete task \"{desc}\"?",
    "board.toastTaskDeleted": "Deleted task \"{desc}\"",
    "board.chooseTask": "Choose Task",
    "board.selectedTask": "Task: {name}",
    "board.taskChainsNone": "-",
    "board.taskChainsFormat": "✓:{success} ✗:{failure}",
    "board.silentChainCount": "{count} silent-chain runs",
    "board.silentChainYes": "yes",
    "board.silentChainNo": "no",
    "board.logModalCopied": "Log copied to clipboard",
    "project.selectProject": " Select Project ",
    "project.projectsLabel": "Projects",
    "project.projectsTitle": " Projects ",
    "project.filterTitle": " Project r ",
    "project.newProjectLabel": "+ New Project",
    "project.manageLabel": "View Projects",
    "project.showAll": "Show All",
    "project.showAllLoops": "All loops",
    "project.manageTitle": "",
    "project.createTitle": " New Project ",
    "project.editTitle": " Edit Project ",
    "project.deleteTitle": " Delete Project ",
    "project.labelName": "Name",
    "project.labelColor": "Color",
    "project.hintName": "A short name for this project",
    "project.hintColor": "Pick a color for this project",
    "project.systemLabel": "System project",
    "project.editProjectLabel": "Edit",
    "project.deleteProjectLabel": "Delete",
    "project.loopCount": "{count} loop(s)",
    "project.noLoops": "No loops",
    "project.deleteConfirm": "Delete project \"{name}\"?",
    "project.deleteWarning": "This project has {count} loop(s). Loops will be moved to Default.",
    "project.moveToDefault": "Yes, move to Default",
    "project.keyNewHint": "n: new",
    "project.keyEditHint": "e: edit",
    "project.keyDeleteHint": "d: delete",
    "project.error.nameRequired": "Project name is required",
    "project.error.nameEmpty": "Project name cannot be empty",
    "project.wizard.namePrompt": "What is the project name?",
    "project.wizard.nameHint": "A short name for this project",
    "project.wizard.colorPrompt": "Pick a color for this project",
    "project.wizard.colorHint": "Choose a color to identify this project",
    "project.wizard.directoryPrompt": "Working directory? (optional)",
    "project.wizard.directoryHint": "Default directory for loops in this project. Leave blank to inherit",
    "project.wizard.githubSourcePrompt": "GitHub Source? (optional)",
    "project.wizard.githubSourceHint": "Repository in owner/repo format, e.g. CKGrafico/loop-task",
    "project.error.updateFailed": "Failed to update project",
    "project.error.deleteFailed": "Failed to delete project",
    "project.toastCreated": "Project \"{name}\" created",
    "project.toastUpdated": "Project \"{name}\" updated",
    "project.toastDeleted": "Project \"{name}\" deleted",
    "project.filterHasLoopsTitle": " Loops l ",
    "project.filterHasLoopsAll": "all",
    "project.filterHasLoopsWithLoops": "with loops",
    "project.filterHasLoopsEmpty": "empty",
    "project.filterIsSystemTitle": " Type t ",
    "project.filterIsSystemAll": "all",
    "project.filterIsSystemSystem": "system",
    "project.filterIsSystemUser": "user",
    "project.sortTitle": " Order o ",
    "project.sortName": "name",
    "project.sortLoopCount": "loop count",
    "project.sortCreatedDate": "created",
    "project.navigatorTitle": " Projects {visible}/{total}  sort:{sort}  loops:{hasLoops} ",
    "project.noMatch": "  No projects match the current view",
    "project.headerName": "NAME",
    "project.headerLoops": "LOOPS",
    "project.headerCreated": "CREATED",
    "project.inspectorEmpty": "  Select a project to view details",
    "project.fieldId": "ID:       ",
    "project.fieldDirectory": "Dir:      ",
    "project.fieldCreated": "Created:  ",
    "project.fieldLoops": "Loops:    ",
    "project.hintSearch": "search",
    "context.truncationWarning": "stdout exceeded 1MB - context was truncated",
    "context.helpTitle": "Chain Context Sharing",
    "context.helpRules": "JSON output merges its keys. JSONL merges each line as a separate key. Plain text is stored under the \"output\" key. Empty output produces no change.",
    "context.helpTemplates": "Use {{key}} in commands and args - replaced with context values from earlier tasks in the chain.",
    "context.helpCaveat": "Plain text stdout overwrites the \"output\" key. Use JSON with named keys when data must survive across tasks.",
    "context.helpJqTip": "Tip: use --jq '{key: .field}' to wrap any value in a named JSON key",
    "cmd.edit": "Edit selected loop",
    "cmd.editTask": "Edit selected task",
    "cmd.editProject": "Edit selected project",
    "cmd.delete": "Delete selected loop",
    "cmd.deleteTask": "Delete selected task",
    "cmd.deleteProject": "Delete selected project",
    "cmd.pause": "Pause selected loop",
    "cmd.play": "Play resume loop",
    "cmd.stop": "Stop selected loop",
    "cmd.clone": "Clone selected loop",
    "cmd.trigger": "Trigger run now",
    "cmd.logs": "Open logs viewer",
    "cmd.newLoop": "New loop",
    "cmd.newTask": "New task",
    "cmd.newProject": "New project",
    "cmd.help": "Help show all commands",
    "cmd.helpMe": "Help me with commands",
    "cmd.allCommands": "All commands",
    "cmd.search": "Find search filter",
    "cmd.searchTasks": "Search tasks",
    "cmd.searchProjects": "Search projects",
    "cmd.setDefault": "Set as default project",
    "cmd.show": "Show a hidden panel",
    "cmd.hide": "Hide a panel",
    "cmd.api": "API - Information",
    "cmd.toggleApi": "API - Toggle on/off",
    "cmd.mcp": "MCP - Information",
    "cmd.toggleMcp": "MCP - Toggle on/off",
    "board.toastApiEnabled": "HTTP API enabled",
    "board.toastApiDisabled": "HTTP API disabled",
    "board.toastApiToggleError": "Failed to toggle API: {message}",
    "board.toastMcpEnabled": "MCP server enabled",
    "board.toastMcpDisabled": "MCP server disabled",
    "board.toastMcpToggleError": "Failed to toggle MCP: {message}",
    "cmd.telemetry": "Telemetry - Information",
    "cmd.toggleTelemetry": "Telemetry - Toggle on/off",
    "cmd.telemetryDiagnostics": "Telemetry - Test connection",
    "board.toastTelemetryEnabled": "OpenTelemetry enabled",
    "board.toastTelemetryDisabled": "OpenTelemetry disabled",
    "board.toastTelemetryToggleError": "Could not update OpenTelemetry: {message}",
    "board.toastTelemetryNotConfigured": "OpenTelemetry: enabled but no endpoint configured",
    "board.toastTelemetryTestSucceeded": "OpenTelemetry test succeeded: {endpoint}",
    "board.toastTelemetryTestFailed": "OpenTelemetry test failed: {message}",
    "telemetry.statusEnabled": "enabled",
    "telemetry.statusDisabled": "disabled",
    "telemetry.exportNotConfigured": "not configured",
    "telemetry.exportConfigured": "configured",
    "telemetry.exportHealthy": "connected",
    "telemetry.exportUnavailable": "unavailable",
    "telemetry.infoTitle": "OpenTelemetry",
    "telemetry.infoEnabled": "OpenTelemetry: {status}",
    "telemetry.infoExport": "Export: {state}",
    "telemetry.infoEndpoint": "Endpoint: {endpoint}",
    "telemetry.infoProtocol": "Protocol: {protocol}",
    "telemetry.infoAgents": "Agent auto-instrumentation: {status}",
    "telemetry.infoCapture": "Content capture: {status}",
    "telemetry.infoHeaders": "Headers: {status}",
    "telemetry.infoService": "Service name: {name}",
    "cmd.filterStatus": "Filter by status",
    "cmd.sort": "Order sort by field",
    "cmd.project": "Filter by project",
    "cmd.debug": "Debug toggle panel",
    "cmd.export": "Export loops JSON",
    "cmd.import": "Import loops JSON",
    "import.missingVersion": "Missing export version. Expected: 2",
    "import.unsupportedVersion": "Unsupported export version: {version}. Expected: 2",
    "import.missingKeys": "Missing required keys: {keys}",
    "import.nonArrayKey": "field '{key}' must be an array",
    "import.invalidFile": "Invalid export file: expected a JSON object",
    "import.writeFailed": "Failed to write store: {error}",
    "import.rolledBack": "Rolled back previously written stores.",
    "import.success": "Imported {loops} loops, {tasks} tasks, {projects} projects",
    "import.hotReload": "Daemon will hot-reload automatically.",
    "export.modalTitle": "Export Loops JSON",
    "export.filePath": "Saved to: {path}",
    "export.error": "Export failed: {message}",
    "export.truncated": "[truncated, {total} lines]",
    "export.hint": "up/down:scroll  c:copy  esc:close",
    "cmd.quit": "Exit loop-task",
    "cmd.save": "Save changes",
    "cmd.cancel": "Discard changes",
    "cmd.change": "Change a field value",
    "cmd.changeInterval": "Change interval",
    "cmd.changeCommand": "Change command",
    "cmd.changeCwd": "Change working directory",
    "cmd.changeDescription": "Change description",
    "cmd.changeRunNow": "Change run-now setting",
    "cmd.changeMaxRuns": "Change max runs",
    "cmd.changeProject": "Change project",
    "cmd.changeName": "Change name",
    "cmd.changeOnSuccess": "Change on-success chain",
    "cmd.changeOnFailure": "Change on-failure chain",
    "cmdInput.placeholder": "Type a command, or help",
    "cmdInput.welcomeHint": "type 'help' for commands, 'all' to browse",
    "cmdInput.noMatches": "No commands match",
    "commandBuilder.executableLabel": "Executable",
    "commandBuilder.executableHint": "e.g. npm, pnpm, dotnet, docker",
    "commandBuilder.argsLabel": "Arguments",
    "commandBuilder.argsHint": "run, build, test...",
    "commandBuilder.previewLabel": "Preview:",
    "commandBuilder.copyHint": "Ctrl+Y copy",
    "commandBuilder.navHint": "Tab/Enter next field . Esc done",
    "commandBuilder.templatesLabel": "Templates (↑/↓ to select, Enter to apply):",
    "commandBuilder.templateNpmRun": "npm run",
    "commandBuilder.templateNpmTest": "npm test",
    "commandBuilder.templatePnpmBuild": "pnpm build",
    "commandBuilder.templatePnpmTest": "pnpm test",
    "commandBuilder.templateDockerCompose": "docker compose up",
    "wizard.chainNone": "None",
    "cmdInput.searchPlaceholder": "Write something to filter about...",
    "cmdInput.confirmYes": "yes",
    "cmdInput.confirmCancel": "cancel",
    "confirm.deleteLoop": "Type yes to delete \"{name}\"",
    "confirm.deleteTask": "Type yes to delete task \"{id}\"",
    "confirm.deleteProject": "Type yes to delete project \"{name}\"",
    "confirm.stopLoop": "Type yes to stop \"{name}\"",
    "confirm.quit": "Type yes to exit loop-task",
    "wizard.newLoop": "New loop",
    "wizard.editLoop": "Edit loop",
    "wizard.newTask": "New task",
    "wizard.stepOf": "Step {current} of {total}",
    "wizard.intervalPrompt": "How often should it run?",
    "wizard.intervalHint": "e.g. 30s, 5m, 30m, 1h, 1d, or manual for trigger-only",
    "wizard.commandPrompt": "What command should run?",
    "wizard.commandHint": "Full command line. Quote args with spaces",
    "wizard.taskModePrompt": "Inline command or existing task?",
    "wizard.taskModeInline": "Inline command",
    "wizard.taskModeExisting": "Existing task",
    "wizard.runNowPrompt": "Run immediately or wait for first interval?",
    "wizard.runNowWait": "Wait for the first interval",
    "wizard.runNowNow": "Run now, then every interval",
    "wizard.cwdPrompt": "Working directory? (optional)",
    "wizard.cwdHint": "Leave blank to inherit from project, or set a specific directory",
    "wizard.descriptionPrompt": "Description?",
    "wizard.descriptionHint": "Short label shown in the list",
    "wizard.maxRunsPrompt": "Max runs? (optional)",
    "wizard.maxRunsHint": "Stop after N runs. Leave blank to run forever",
    "wizard.projectPrompt": "Which project?",
    "wizard.projectHint": "Assign this loop to a project",
    "wizard.taskNamePrompt": "Name for this task?",
    "wizard.taskNameHint": "Short name to identify this task",
    "wizard.taskCommandPrompt": "What command should this task run?",
    "wizard.onSuccessPrompt": "On success, chain to? (optional)",
    "wizard.onFailurePrompt": "On failure, chain to? (optional)",
    "wizard.silentChainPrompt": "Silent chain? (suppress log output)",
    "wizard.silentChainHint": "If true, this task won't appear in logs",
    "wizard.taskMaxRunsPrompt": "Max runs per loop session?",
    "wizard.taskMaxRunsHint": "Fail task after N executions within one loop session. Default: 5",
    "wizard.contextPrompt": "Initial context? (optional)",
    "wizard.contextHint": "JSON object with string values, e.g. {\"env\":\"staging\"}",
    "wizard.contextInvalid": "Invalid context: must be a flat JSON object with non-nested, non-array values",
    "wizard.created": "Created",
    "wizard.filled": "{filled}/{total} filled",
    "wizard.footerHints": "tab next . ctrl+s save . esc cancel",
    "wizard.ctrlSave": "Ctrl+S to save with defaults",
    "wizard.escBack": "Esc to go back",
    "wizard.validationError": "Invalid value",
    "patch.pendingChanges": "{count} pending changes",
    "patch.noChanges": "No changes",
    "patch.hintNavigation": "↑/↓ navigate fields . Enter to edit . Esc to cancel",
    "patch.hintEditing": "Enter to confirm . Esc to cancel",
    "patch.hintCopy": "Ctrl+Y copy field value",
    "patch.hintNavPending": "↑/↓ navigate . Ctrl+S save . Esc cancel",
    "patch.hintNavIdle": "↑/↓ navigate . Ctrl+Y copy",
    "patch.enterEdit": "Enter to edit",
    "patch.escapeCancel": "Esc to cancel",
    "patch.save": "Save",
    "patch.cancel": "Cancel",
    "patch.field": "Field",
    "patch.value": "Value",
    "patch.validationError": "Invalid: {error}",
    "api.title": "API Endpoints",
    "api.daemonSocket": "Daemon socket",
    "api.statusEndpoint": "Get daemon status",
    "api.exportEndpoint": "Export loops",
    "api.importEndpoint": "Import loops",
    "api.closeHint": "Press Escape or q to close",
    "helpGuide.title": "How loop-task works",
    "helpGuide.intro": "This is a command-first terminal app. Instead of clicking buttons, you type commands at the bottom input.",
    "helpGuide.commands": "Type a command and press Enter. Start typing to see matching commands - like fuzzy search.",
    "helpGuide.examples": "Try: 'new' to create, 'edit' to modify, 'delete' to remove, 'pause' / 'play' to control loops.",
    "helpGuide.confirm": "Destructive commands ask you to type 'yes' to confirm. This prevents accidents.",
    "helpGuide.navigation": "Use Tab to switch between the left list and right detail. Use 1/2/3 to switch tabs (Loops/Tasks/Projects).",
    "helpGuide.ctrl": "Ctrl+E = edit, Ctrl+D = delete - shortcuts that bypass typing.",
    "helpGuide.allCommands": "Type 'all' or 'all commands' to browse every command grouped by category.",
    "helpGuide.esc": "Press Escape or 'q' to close this window.",
    "cmdsBrowser.title": "All Commands",
    "cmdsBrowser.groupGlobal": "Global",
    "cmdsBrowser.groupFilters": "Filters",
    "cmdsBrowser.groupActions": "Actions",
    "cmdsBrowser.groupLoop": "Loop Actions",
    "cmdsBrowser.groupTask": "Task Actions",
    "cmdsBrowser.groupProject": "Project Actions",
    "cmdsBrowser.hint": "Up/Down to navigate, Enter to execute, Esc to close",
    "errors.recipeDeleteRejected": "Recipe loops cannot be deleted; remove the recipe file instead",
    "errors.recipeTaskImmutable": "Recipe tasks are immutable and cannot be modified",
    "errors.recipeFieldLocked": "Recipe loops only allow editing interval, maxRuns, and context",
    "board.recipeBadge": "R",
    "board.recipeFile": "Recipe",
    "board.recipeTooltip": "Recipe loops are managed by .loops/recipes/*.json",
    "cmd.diagram": "View loop diagram",
    "diagram.modalTitle": "Loop Diagram",
    "diagram.hint": "up/down:scroll  c:copy  esc:close",
    "diagram.noTaskChain": "This loop has no task chain.",
    "diagram.loopNotFound": "Loop not found: {id}",
    "diagram.noTaskLinked": "Loop {id} has no task chain",
    "diagram.noDiagramInRecipe": "This recipe has no diagram field. Add a diagram: section to the YAML file.",
    "diagram.notARecipe": "Only recipe loops have diagrams. This loop was created manually.",
    "diagram.readError": "Failed to read recipe diagram: {message}",
    "task.recipeImmutable": "Recipe tasks are immutable. Edit the .loops/recipes/*.yaml file instead.",
    "task.recipeImmutableShort": "Recipe task — edit the .yaml file"
}
