{
  "cmd.description": "AI Support Agent CLI",
  "cmd.start": "Start agent (all registered projects)",
  "cmd.start.token": "Agent token (overrides config file)",
  "cmd.start.apiUrl": "API URL (overrides config file)",
  "cmd.start.pollInterval": "Polling interval (ms)",
  "cmd.start.heartbeatInterval": "Heartbeat interval (ms)",
  "cmd.start.verbose": "Enable verbose logging",
  "cmd.start.autoUpdate": "Enable automatic updates (disabled by default)",
  "cmd.start.noAutoUpdate": "Disable automatic updates",
  "cmd.start.updateChannel": "Update channel (latest, beta, alpha)",
  "cmd.login": "Register a project via browser authentication",
  "cmd.login.url": "Web UI URL (e.g. http://localhost:4030)",
  "cmd.login.apiUrl": "API URL",
  "cmd.login.port": "Callback server port",
  "cmd.addProject": "Add a project via browser authentication",
  "cmd.removeProject": "Remove a project registration",
  "cmd.removeProject.arg": "Project code",
  "cmd.configure": "Manually set token and API URL (backward compatible)",
  "cmd.configure.token": "Agent token",
  "cmd.configure.apiUrl": "API URL",
  "cmd.configure.projectCode": "Project code",
  "cmd.status": "Show registered projects and connection status",
  "cmd.setLanguage": "Set display language",
  "cmd.setLanguage.arg": "Language code (e.g. en, ja)",
  "cmd.lang": "Display language",

  "cmd.logRotate": "Read stdin and write to a size-rotating log file (used by the per-project wrapper script)",
  "cmd.logRotate.path": "Path to the active log file (rotated generations are stored alongside it as <path>.1 … <path>.N)",
  "cmd.logRotate.maxSize": "Rotate when the active file would exceed this size (accepts B, KB, MB, GB; default 5MB)",
  "cmd.logRotate.maxFiles": "Number of rotated generations to keep (default 5)",
  "cmd.logRotate.noTee": "Suppress passthrough of stdin to stdout (default: stdin is also written to stdout so the existing systemd / launchd StandardOutput redirection keeps receiving the agent's output)",
  "logRotate.invalidMaxSize": "Invalid --max-size value: '{{value}}'. Accepts sizes like '5MB', '1024', '512KB'.",
  "logRotate.invalidMaxFiles": "Invalid --max-files value: '{{value}}'. Must be a non-negative integer.",
  "logRotate.writeFailed": "Warning: failed to write rotated log {{path}}: {{message}}. Continuing in passthrough mode.",

  "auth.openingBrowser": "Opening browser...",
  "auth.url": "URL: {{url}}",
  "auth.selectProject": "Select a project in the browser and issue a token...",
  "auth.noApiUrl": "Could not obtain API URL",
  "auth.noTenantCode": "Could not obtain tenantCode from authentication response",
  "auth.failed": "Authentication failed: {{message}}",
  "auth.timeout": "Authentication timed out (5 minutes)",
  "auth.invalidProtocol": "Invalid URL: only http and https protocols are allowed.",
  "auth.invalidPort": "Invalid port number: '{{port}}'. Must be an integer between 1 and 65535.",

  "project.registered": "Project \"{{projectCode}}\" registered. Run \"ai-support-agent start\" to connect.",
  "project.added": "Project \"{{projectCode}}\" added. Run \"ai-support-agent start\" to connect.",
  "project.removed": "Project \"{{projectCode}}\" removed.",
  "project.notFound": "Project \"{{projectCode}}\" is not registered.",

  "config.saved": "Configuration saved. Run \"ai-support-agent start\" to connect.",
  "config.projectSaved": "Project \"{{projectCode}}\" configured. Run \"ai-support-agent start\" to connect.",
  "config.resolvingProject": "Resolving project code from server...",
  "config.resolvedProject": "Project code resolved: {{projectCode}}",
  "config.resolveProjectFailed": "Could not resolve project code from server ({{message}}). Specify --project-code to set manually.",
  "config.readError": "Failed to read config file: {{error}}",
  "config.savedDebug": "Configuration saved: {{path}}",
  "config.languageSet": "Language set to \"{{lang}}\".",
  "config.invalidInterval": "Invalid value for --{{name}}: '{{value}}'. Must be an integer between {{min}} and {{max}}.",
  "config.migrating": "Migrating config from legacy single-token format to multi-project format...",
  "config.migrated": "Config migrated successfully.",

  "cmd.stop": "Stop the running agent",
  "cmd.ecs": "ECS execution agent commands (launcher-agent architecture)",
  "cmd.ecsPublish": "Build/push an image to ECR, register a task definition, and register the ECS execution agent with the API",
  "cmd.ecsPublish.repositoryUri": "ECR repository URI to push the image to (required)",
  "cmd.ecsPublish.tag": "Image tag (required)",
  "cmd.ecsPublish.cluster": "Target ECS cluster ARN (required)",
  "cmd.ecsPublish.subnets": "Subnet IDs for the awsvpc network configuration (required)",
  "cmd.ecsPublish.securityGroups": "Security group IDs for the awsvpc network configuration (required)",
  "cmd.ecsPublish.dockerfile": "Dockerfile used for the build",
  "cmd.ecsPublish.image": "Use a pre-built local image (skips the build)",
  "cmd.ecsPublish.cpu": "ECS task CPU units (default: 1024)",
  "cmd.ecsPublish.memory": "ECS task memory in MiB (default: 2048)",
  "cmd.ecsPublish.name": "Display name shown in the agent list",
  "cmd.ecsPublish.assignPublicIp": "Assign a public IP to the task",
  "cmd.ecsPublish.logGroup": "awslogs log group name (created when missing)",
  "cmd.ecsPublish.executionRole": "ECS task execution role ARN (used for ECR pull / awslogs)",
  "cmd.ecsPublish.taskRole": "ECS task role ARN assumed by the container",
  "cmd.ecsPublish.launcherAgentId": "Resident agent id in charge of RunTask (auto-selected when omitted)",
  "cmd.ecsPublish.project": "Target project (tenantCode/projectCode); optional when only one project is registered",
  "stop.stopping": "Sending stop signal to agent (PID: {{pid}})...",
  "stop.stopped": "Agent stopped.",
  "stop.notRunning": "No running agent found (pid file not found: {{path}})",
  "stop.staleProcess": "Agent process (PID: {{pid}}) is no longer running. Cleaning up stale pid file.",
  "stop.signalFailed": "Failed to send stop signal to PID {{pid}}: {{message}}",
  "stop.timeout": "Agent (PID: {{pid}}) has not exited yet after {{timeoutSeconds}}s. This does not necessarily mean it is stuck: if it has an in-flight command, it may still be gracefully draining it before shutting down, which can take up to about 5 minutes — it will exit on its own once the drain completes. Wait a bit and run \"ai-support-agent status\" or \"ai-support-agent stop\" again to check.",

  "runner.starting": "Starting agent...",
  "runner.startedSingle": "Agent started (poll: {{pollInterval}}ms, heartbeat: {{heartbeatInterval}}ms)",
  "runner.stopHint": "Press Ctrl+C to stop",
  "runner.shuttingDown": "Shutting down...",
  "runner.stopped": "Agent stopped",
  "runner.noToken": "No token configured. Run \"ai-support-agent login --url <url>\" to set up.",
  "runner.noProjects": "No projects registered. Run \"ai-support-agent login --url <url>\" to register.",
  "runner.startingMulti": "Starting agents for {{count}} projects...",
  "runner.startedMulti": "Agent started ({{count}} projects, poll: {{pollInterval}}ms, heartbeat: {{heartbeatInterval}}ms)",
  "runner.registered": "{{prefix}} Registered: {{agentId}}",
  "runner.registerFailed": "{{prefix}} Registration failed: {{message}}",
  "runner.registerStartedFailing": "{{prefix}} Registration started to fail, retrying in {{delayMs}}ms: {{message}}",
  "runner.authErrorStartedFailing": "{{prefix}} Authentication started to fail, retrying in {{delayMs}}ms (token may need refresh). Detail: {{detail}}",
  "runner.registerWorkingAgain": "{{prefix}} Registration is working again after {{attempts}} attempt(s)",
  "runner.replicaStandby": "Waiting for a replica slot: the plan's concurrent replica limit is reached (instanceId={{instanceId}}, live {{live}}/{{max}}). This replica starts automatically once another one stops",
  "runner.replicaAdmitted": "Replica slot acquired (instanceId={{instanceId}})",
  "runner.instanceIdConflict": "Another process is already running with the same AI_SUPPORT_AGENT_INSTANCE_ID ({{instanceId}}). This commonly happens when the same token is deployed as a Kubernetes StatefulSet across multiple clusters, since a Pod name is only unique within its own cluster. Consider setting AI_SUPPORT_AGENT_INSTANCE_ID explicitly to a value that includes the cluster name.",
  "runner.replicaEvicted": "Handing the replica slot to a newer replica and returning to standby (instanceId={{instanceId}})",
  "runner.commandReceived": "{{prefix}} Command received: {{type}} ({{commandId}})",
  "runner.commandDone": "{{prefix}} Command completed: {{commandId}} ({{result}})",
  "runner.commandError": "{{prefix}} Command execution error: {{commandId}} - {{message}}",
  "runner.heartbeatFailed": "{{prefix}} Heartbeat failed: {{message}}",
  "runner.resultSendFailed": "{{prefix}} Failed to send result",
  "runner.cliTokenWarning": "Warning: Passing tokens via --token exposes them in process listings (ps aux). Consider using the AI_SUPPORT_AGENT_TOKEN environment variable instead.",
  "runner.directConnecting": "Connecting directly to {{apiUrl}} (tenant: {{tenantCode}}, project: {{projectCode}})",
  "runner.directDefaultApiUrl": "No --api-url given; using the default production API URL: {{apiUrl}}",
  "runner.envTokenWarning": "Using token from environment variable",
  "runner.tokenProjectTenantMismatch": "Token tenant ({{tokenTenant}}) does not match the tenant in --project ({{projectTenant}}). Use --project <tenantCode>/<projectCode> with the same tenant the token was issued for.",
  "runner.projectFormatInvalid": "--project must be in \"tenantCode/projectCode\" format: {{project}}",
  "runner.authError": "{{prefix}} Authentication failed. Token may be invalid or expired. Run \"ai-support-agent login\" to re-authenticate. Detail: {{detail}}",
  "runner.tokenUpdated": "{{prefix}} Token updated from config file. Re-authenticating...",
  "runner.unexpectedError": "Unexpected error in project agent: {{message}}",
  "runner.commandDeclinedDraining": "{{prefix}} Declining command {{commandId}}: this replica is shutting down. The server will re-assign it after its own ack-timeout",
  "runner.drainWaiting": "{{prefix}} Waiting for {{count}} in-flight command(s) to finish before releasing the replica slot...",
  "runner.drainTimedOut": "{{prefix}} Timed out waiting for in-flight command(s) to drain: {{commandIds}}. The replica slot was NOT released; it falls through to the server's heartbeat-timeout reclaim instead",
  "runner.slotReleased": "{{prefix}} Replica slot released",
  "runner.slotReleaseFailed": "{{prefix}} Failed to release replica slot: {{reason}}. It falls through to the server's heartbeat-timeout reclaim instead",

  "status.noConfig": "No configuration found. Run \"ai-support-agent login --url <url>\" to set up.",
  "status.header": "Configuration:",
  "status.agentId": "Agent ID:      {{agentId}}",
  "status.lastConnected": "Last connected: {{lastConnected}}",
  "status.notSet": "(not set)",
  "status.notConnected": "(not connected)",
  "status.noProjects": "Projects: none",
  "status.projectCount": "Registered projects ({{count}}):",
  "status.apiUrl": "API URL:  {{apiUrl}}",
  "status.token": "Token:    {{token}}",
  "status.autoUpdate": "Auto-update: {{status}}",
  "status.updateChannel": "Channel:     {{channel}}",

  "update.upToDate": "Up to date ({{version}})",
  "update.available": "Update available: {{current}} -> {{latest}}",
  "update.installing": "Installing version {{version}}...",
  "update.installSuccess": "Successfully updated to {{version}}",
  "update.installFailed": "Update failed: {{message}}",
  "update.permissionHint": "Try: sudo npm install -g @ai-support-agent/cli@{{version}}",
  "update.manualHint": "Run: npm install -g @ai-support-agent/cli@{{version}}",
  "update.waitingForBusy": "Waiting for in-progress commands to finish before restarting...",
  "update.stoppingAgents": "Stopping agents for restart...",
  "update.restarting": "Restarting with new version...",
  "update.forced": "Forced update required: current version is below minimum ({{minimumVersion}}). Updating to {{version}}...",
  "update.disabled": "disabled",
  "update.enabled": "enabled (auto-restart: {{autoRestart}})",
  "update.checkFailed": "Version check failed: {{message}}",
  "update.skipDev": "Development mode detected. Automatic update is not supported.",
  "update.skipLocal": "Local installation detected. Run \"npm update @ai-support-agent/cli\" in your project to update.",

  "cmd.setProjectDir": "Set project directory",
  "cmd.setProjectDir.project": "Project code",
  "cmd.setProjectDir.path": "Directory path",
  "cmd.setProjectDir.default": "Default directory template (use {projectCode} placeholder)",
  "projectDir.created": "Created project directory: {{projectDir}}",
  "projectDir.set": "Project \"{{projectCode}}\" directory set to {{projectDir}}",
  "projectDir.defaultSet": "Default project directory template set to \"{{template}}\"",
  "projectDir.noProject": "Project \"{{projectCode}}\" is not registered.",
  "projectDir.initialized": "Project directory initialized: {{projectDir}} ({{projectCode}})",
  "projectDir.usageHint": "Usage: set-project-dir --project <code> --path <path> OR --default <template>",
  "projectDir.cleaned": "Cleaned up metadata directory: {{metadataDir}}",

  "cmd.setAutoUpdate": "Configure automatic updates",
  "cmd.setAutoUpdate.enable": "Enable automatic updates",
  "cmd.setAutoUpdate.disable": "Disable automatic updates",
  "cmd.setAutoUpdate.channel": "Set update channel (latest, beta, alpha)",
  "autoUpdate.usageHint": "Usage: set-auto-update --enable | --disable | --channel <channel>",
  "autoUpdate.conflictFlags": "Cannot use --enable and --disable together.",
  "autoUpdate.disabled": "Automatic updates disabled.",
  "autoUpdate.enabled": "Automatic updates enabled (channel: {{channel}}).",
  "autoUpdate.channelSet": "Update channel set to \"{{channel}}\".",

  "cmd.start.noDocker": "Run directly on host instead of Docker container",
  "cmd.start.dockerfile": "Path to a custom Dockerfile (overrides config and bundled default)",
  "cmd.start.noDockerfileSync": "Skip writing the default Dockerfile to config dir",
  "cmd.start.noImagePull": "Never pull from the container registry; always build the image locally",
  "cmd.start.project": "Start only the matching project (format: tenantCode/projectCode)",
  "cmd.dockerLogin": "Log in to Claude Code inside a Docker container",
  "cmd.dockerBuild": "Always build the Docker image for this version locally",
  "cmd.dockerEnsureImage": "Make the Docker image for this version available (pull from the registry when nothing is customised, otherwise build)",
  "cmd.dockerBuild.dockerfile": "Path to a custom Dockerfile",
  "cmd.dockerDiffDockerfile": "Show diff between a Dockerfile and the bundled default",
  "cmd.dockerDiffDockerfile.arg": "Path to Dockerfile (default: config dir Dockerfile)",
  "docker.notAvailable": "Docker is not available. Make sure Docker Desktop is running.",
  "docker.building": "Building Docker image...",
  "docker.buildComplete": "Docker image build complete",
  "docker.imageFound": "Using existing Docker image ({{version}})",
  "docker.pulling": "Pulling the Docker image from the container registry: {{ref}}",
  "docker.pullComplete": "Docker image pull complete ({{version}})",
  "docker.pullFailed": "Could not pull the Docker image (falling back to a local build) {{ref}}: {{message}}",
  "docker.tagFailed": "Could not tag the pulled Docker image {{ref}} (falling back to a local build): {{message}}",
  "docker.registryTagRemoveFailed": "Could not remove the registry tag {{ref}} (skipped): {{message}}",
  "docker.pullDisabled": "Registry pull is disabled by configuration - building locally",
  "docker.pullSkippedCustomDockerfile": "A custom Dockerfile is in use - building locally: {{path}}",
  "docker.pullSkippedCustomized": "The Dockerfile is customised - building locally",
  "docker.oldImageListFailed": "Could not list old Docker images to prune (skipped): {{message}}",
  "docker.oldImageRemoved": "Removed superseded Docker image: {{tag}}",
  "docker.oldImagePruneFailed": "Could not remove old Docker image {{tag}} (skipped): {{message}}",
  "docker.starting": "Starting Docker container...",
  "docker.runFailed": "Failed to run Docker container: {{message}}",
  "docker.loginStep1": "Step 1: Run the following in your host terminal to get an OAuth token:",
  "docker.loginStep2": "Step 2: Set the token as an environment variable and start in Docker mode:",
  "docker.loginStep3": "The token is long-lived. Add the export to .bashrc or .zshrc to persist it.",
  "docker.usingCustomDockerfile": "Using custom Dockerfile: {{path}}",
  "docker.dockerfileSynced": "Default Dockerfile written to: {{path}}",
  "docker.dockerfileUpdated": "Bundled Dockerfile changed — updated config: {{path}}",
  "docker.dockerfileCustomized": "Skipped Dockerfile update (customised). To apply the latest bundled version manually: {{path}}",
  "docker.dockerfileSyncFailed": "Failed to write Dockerfile to config dir: {{message}}",
  "docker.dockerAssetSynced": "Bundled config updated: {{path}}",
  "docker.dockerAssetSyncFailed": "Failed to sync bundled config {{path}}: {{message}}",
  "docker.diffNoTarget": "No Dockerfile to diff. Specify a path or set dockerfilePath in config.",
  "docker.diffTargetNotFound": "Dockerfile not found: {{path}}",
  "docker.diffIdentical": "Dockerfile is identical to the bundled default.",
  "docker.diffDone": "Diff complete.",
  "docker.diffDefaultError": "Failed to read bundled Dockerfile: {{message}}",

  "cmd.service": "Manage background service",
  "cmd.service.install": "Install as a background service (Docker mode by default)",
  "cmd.service.install.verbose": "Enable verbose logging for the service",
  "cmd.service.install.noDocker": "Run in native mode without Docker",
  "cmd.service.uninstall": "Uninstall background service",
  "cmd.service.start": "Start the background service",
  "cmd.service.stop": "Stop the background service",
  "cmd.service.restart": "Restart the background service",
  "cmd.service.status": "Show background service status",
  "cmd.service.status.verbose": "Show detailed status with log file paths",
  "service.unsupportedPlatform": "This command is not supported on {{platform}}.",
  "service.entryPointNotFound": "CLI entry point not found: {{path}}",
  "service.installed": "Service file created: {{path}}",
  "service.projectInstalled": "Service file created for {{projectCode}}: {{path}}",
  "service.loadHint": "To start the service now, run: launchctl load {{path}}",
  "service.loadHintMulti": "To start all services, run: ai-support-agent service start",
  "service.legacyPlistFound": "Found legacy plist at {{path}}. Run 'service uninstall' to remove it.",
  "service.noProjectsConfigured": "No projects configured. Run 'ai-support-agent configure' to register a project first.",
  "service.logDir": "Logs will be written to: {{path}}",
  "service.notInstalled": "No service files found. Service is not installed.",
  "service.uninstalled": "Service files removed.",
  "service.daemonReloadFailed": "Warning: systemctl --user daemon-reload failed: {{message}}",
  "service.enableFailed": "Warning: systemctl --user enable {{unit}} failed: {{message}}. The service will run now but may not auto-start at next login.",
  "service.lingerEnabled": "Enabled systemd lingering (loginctl enable-linger) so the service keeps running after you log out.",
  "service.lingerEnableFailed": "Warning: could not automatically enable systemd lingering for user {{username}} ({{message}}). Without it, the service stops as soon as your login session ends. Run `sudo loginctl enable-linger {{username}}` (or `loginctl enable-linger {{username}}` without sudo, depending on your system's policy) to keep it running after logout.",
  "service.orphanUnitRemoveFailed": "Warning: failed to remove orphaned unit {{unit}}: {{message}}",
  "service.unitStartFailed": "Failed to start {{unit}}: {{message}}",
  "service.unitStopFailed": "Failed to stop {{unit}}: {{message}}",
  "service.unitRestartFailed": "Failed to restart {{unit}}: {{message}}",
  "service.projectDirMissing": "Warning: configured projectDir does not exist: {{path}}. Falling back to the default per-project directory.",
  "service.projectDirBlocked": "Warning: configured projectDir is rejected ({{message}}): {{path}}. Falling back to the default per-project directory.",
  "service.invalidProjectCode": "Invalid projectCode: contains characters disallowed in AI_SUPPORT_AGENT_PROJECT_DIR_MAP ({{projectCode}}). Allowed characters: [A-Za-z0-9_-].",
  "service.invalidWin32Value": "Invalid {{field}}: contains characters that cannot be safely used in a Windows batch wrapper (% ! \" ^ & < > | or newline). Fix the value and reinstall.",
  "service.projectInstallFailed": "Failed to install service for project {{projectCode}}: {{message}}. Continuing with the remaining projects.",
  "service.projectUnitNameCollision": "Cannot install service for project {{projectCode}}: its sanitized unit name '{{unitName}}' collides with another configured project ({{others}}). Rename one of the projectCodes so they sanitize to distinct unit names.",
  "service.projectDuplicateEntry": "Cannot install service for project {{projectCode}}: this <tenant>/<project> pair appears more than once in config (unit name '{{unitName}}'). Remove the duplicate entry.",
  "service.partialInstallSummary": "Warning: {{failed}} of {{total}} project(s) failed to install (see errors above). {{succeeded}} succeeded.",
  "docker.projectSpawnFailed": "Failed to spawn docker container for project {{projectCode}}: {{message}}. Continuing with the remaining projects.",
  "docker.projectDirChmodFailed": "Warning: chmod 0o700 on the per-project bind-mount source failed ({{path}}): {{message}}. Other local users may be able to list the directory.",
  "service.overwriting": "Existing service file found at {{path}}. Overwriting.",
  "service.noLogRotation": "Note: Logs are auto-rotated at 5MB and 5 generations are kept. Rotated files: agent.out.log (+ .1 … .5) and agent.err.log (+ .1 … .5) per project. wrapper.out.log / wrapper.err.log capture only the wrapper script's bootstrap output (not rotated).",
  "service.unloadHint": "If the service is running, stop it with: launchctl remove {{label}}",
  "service.installed.win32": "Scheduled task created: {{taskName}}",
  "service.loadHint.win32": "To start the task now, run: schtasks /Run /TN \"{{taskName}}\"",
  "service.notInstalled.win32": "Scheduled task not found. Service is not installed.",
  "service.uninstalled.win32": "Scheduled task removed.",
  "service.unloadHint.win32": "If the task is running, it will be stopped and removed.",
  "service.schtasksFailed": "schtasks command failed: {{message}}",
  "service.started": "Service started successfully.",
  "service.startFailed": "Failed to start service: {{message}}",
  "service.stopped": "Service stopped successfully.",
  "service.stopFailed": "Failed to stop service: {{message}}",
  "service.restarted": "Service restarted successfully.",
  "service.restartFailed": "Failed to restart service: {{message}}",
  "service.status.notInstalled": "Service is not installed.",
  "service.systemUnitDetected": "A system-scope systemd unit was detected at {{path}}. The CLI only manages user-scope units under ~/.config/systemd/user and cannot manage system-scope units. Running both at once causes duplicate containers. Remove the stray unit with `sudo rm {{path}}` and `sudo systemctl daemon-reload`, then use `ai-support-agent service install` to set up the official user-scope service.",
  "service.status.running": "Service is running (PID: {{pid}}).",
  "service.status.stopped": "Service is installed but not running.",
  "service.status.logHint": "Logs:\n  stdout: {{outLog}}\n  stderr: {{errLog}}",
  "service.autoStartFailed": "Warning: could not auto-start service for this project: {{message}}",
  "service.autoStartNotSupported": "Service auto-start is not supported on this platform. Run 'ai-support-agent service install' then 'ai-support-agent service start' to start the service manually.",
  "service.loadWarning": "Warning: service {{label}} may not have loaded correctly. Run 'ai-support-agent service start' to retry.",
  "service.status.noProjects": "No projects registered. Run 'ai-support-agent configure --token <token>' to register a project.",
  "service.status.projectRunning": "✓ {{projectCode}}: running (PID: {{pid}})",
  "service.status.projectStopped": "✗ {{projectCode}}: stopped"
}
