# Titan Server Launcher — agent handoff

Give this file to your agent / Add át ezt a fájlt az agentednek.

Install Titan Server Launcher on Windows, locate titan.exe beside the installed launcher (or add that folder to PATH), start the launcher, then use an elevated terminal on that same host. Verify the installed version with titan hello and titan help; this reference is a source snapshot, not a promise that every release supports every command.

PowerShell invocation from the installation directory:

~~~powershell
.\titan.exe help
.\titan.exe hello --json
.\titan.exe commands --json
.\titan.exe help server create
.\titan.exe docs --out installed-cli-reference.md
~~~

The local bridge uses a Windows named pipe restricted to Administrators and SYSTEM. Never expose it as a network listener. Read = no side effects; write = changes state; destructive = requires explicit human authorization before --yes; forbidden = never available over this channel. Unknown commands fail closed. Inspect risks with titan commands before acting. Do not blanket-approve --yes, extract secrets, or log credentials. Use --payload-file for structured JSON; protect and redact that file. Redacted responses do not make arbitrary payload logging safe.

Global output options: --json (also default for redirected stdout), --human, --pretty, --quiet/-q, --timeout <seconds> (default 600). Payload: --payload <json>, --payload-file <path>, repeatable -p key=value. Confirmation: --yes/-y. Where supported, --wait polls operation.get every 2 seconds, bounded by --timeout. Exit codes: 0 success, 1 command/operation failed, 2 usage error, 3 launcher unavailable, 4 forbidden/access denied, 5 confirmation required, 6 timeout. A queued operation is not completed work; inspect the terminal result. Do not blindly retry mutations after a timeout.

## Steam sources / Steam-források (1.5.x)

EN: Reuse completed server and Workshop downloads from your signed-in Steam client. Titan copies them into its own instances during maintenance; it does not run the server directly from your Steam library. Auto prefers ready client content when Steam is signed in, SteamClient requires ready client content, and SteamCmd selects SteamCMD. Account-based SteamCMD login is blocked while Steam is signed in (and on detection failure), even in SteamCmd mode, so updates do not sign you out of Steam. Server app 223350 uses anonymous SteamCMD; missing Workshop content may be deferred: subscribe to the reported IDs and finish downloads in Steam. SteamClient does not start or control Steam. Copying requires extra disk space.

HU: A bejelentkezve futó Steam-kliens kész szerver- és Workshop-letöltéseit a Titan karbantartáskor saját példányaiba másolja. Az Auto kész kliensforrást választ bejelentkezett Steam mellett; a SteamClient kész kliensforrást igényel; a SteamCmd a SteamCMD-t választja. Bejelentkezett Steam mellett és felismerési hibánál a fiókos SteamCMD-belépés tiltott, SteamCmd módban is: a frissítés nem lépteti ki a Steamet. A 223350 szerver-app anonymous SteamCMD-t használ; hiányzó Workshop-tartalomnál halasztás lehet: iratkozz fel a jelzett ID-kre, és várd meg a letöltést. A kliensmód nem indítja vagy vezérli a Steamet; a másolatokhoz szabad lemezhely kell.

~~~powershell
titan steam status --json --pretty
titan help steam source
titan steam source Auto
titan steam source SteamClient
titan steam source SteamCmd
~~~

status = read, no login/download; source = write, saves the global source mode, not an immediate update. / A status csak olvas, nem lép be és nem tölt le; a source a közös forrásmódot menti, nem azonnali frissítés. Inspect status and obtain authorization for settings changes; the three source commands above are alternatives.

1.5.0: instance-local executable and relative profiles; configuration saves preserve unknown lines/comments; password redaction in previews, responses and logs. / Saját instance-exe, relatív profiles, ismeretlen cfg-sorok és megjegyzések megőrzése, jelszókitakarás.

1.5.1 (stable since 2026-10-18): the DayZ update watchdog defers in SteamClient mode and in Auto with a running Steam process; client copying remains the launcher task. In SteamCmd, or Auto without Steam, watchdog build checks and updates use anonymous only. / 1.5.1 (2026-10-18 óta stabil): a watchdog SteamClient módban és Auto mellett futó Steamnél halaszt; a másolás a launcher feladata. SteamCmd módban vagy Steam nélküli Auto esetén a watchdog csak anonymous belépést használ.

## Common workflows

Use a disposable test instance first. Replace chernarus-1 with the actual ID returned by server list/create. Creation, restart and backup below change state: obtain the owner's authorization for the intended scope.

~~~powershell
titan server list --json
titan server create --name "Test" --auto-ports --wait --json
titan mod list chernarus-1 --json
titan server preview chernarus-1 --json
titan server restart chernarus-1 --in 15m --json
titan backup create chernarus-1 --json
~~~

Before adding mods use titan help mod add, verify Workshop IDs and back up. Before restoring use titan help backup restore; stop the instance and obtain specific destructive-action approval. Do not invent payload fields: consult the command section and installed help.

## TSM remote workflow

Titan Server Manager (TSM, wire name @TitanServermod) is the server mod. launcherLocal uses the designated launcher producer and local profile files; directRemote uses the API and is mutually exclusive with local mutation. The website owner dashboard relays through the backend; the local titan CLI is not an Internet client and has no generic TSM remote-command alias in this snapshot.

Provision and bind the installation through the owner/host tools; keep credentials in secure configuration. directRemote uses POST /titanmod/v2/{register,negotiate,poll,report,result,ack}: register the install, negotiate the current boot/protocol, check fresh capabilities and actor permission, submit an allowed operation through the owner dashboard, then inspect its terminal result and acknowledgement. HTTP 2xx/queued/accepted does not prove execution. Reuse the same command identity on transport retry; unknown outcomes require reconciliation, not a new dispatch.

Permissions default to deny-all: permissions.actors[].allow is the complete immutable actor-ID allowlist, intersected with enabled capabilities and adapter policy. Claimed role/name gives no permission. Secrets are never command payloads or log content. restartMission restarts only the mission; restartProcess belongs to the launcher. Feature availability depends on installed versions, negotiation and capability evidence; API support alone is not end-to-end verification.

directRemote TLS limitation: the DayZ engine has accepted self-signed certificates without verified trust/hostname authentication. Use a trusted isolated network or authenticated tunnel, preferably a trusted proxy that validates upstream TLS. HTTPS alone is insufficient. Use install-bound, revocable credentials and never publish them.

## Troubleshooting

Code 3: start the launcher on this host. Code 4: check elevation and policy; never bypass ACLs. Code 5: review the exact action before confirming. Code 6: query operation state before retrying. Usage error: titan help <alias or bridge command>. Stale boot, missing negotiation, disabled capability or forbidden actor: refresh and repair the binding/policy; never fall back automatically to another transport. Keep secrets out of diagnostic output.

Product and download: https://dayz-launcher.com/server-launcher
HTML reference: https://dayz-launcher.com/server-launcher/cli
Agent index: https://dayz-launcher.com/llms.txt

Generated from launcher source (policy, aliases, embedded payload catalog and help), ref 68dac34b9fada385034786ce278711cef3a0d494, commit 68dac34b9fada385034786ce278711cef3a0d494. Input SHA-256: c365d4f3ce04f4c5e425969ea8a186f985441e5353b774aa572d7f05f7e03cb9. Payload catalog text below follows upstream Hungarian; alias summaries are English.

## CLI general commands

~~~text
titan help [alias | command]
titan docs [--out <file.md>]
titan hello
titan commands [--risk <risk>]
titan call <command> [--payload-file <path>] [--yes]
~~~

## Aliases

### titan status

Launcher state summary. Bridge: app.getState. Risk: write.

~~~text
titan status
titan help status
~~~

Options and conditional flows: use the installed help above before executing.

### titan steam status

Steam client content source and reason (read-only). Bridge: steam.status. Risk: read.

~~~text
titan steam status
titan help steam status
~~~

Options and conditional flows: use the installed help above before executing.

### titan steam source

Set Auto, SteamClient or SteamCmd content source. Bridge: steam.source.set. Risk: write.

~~~text
titan steam source <mode>
titan help steam source
~~~

Options and conditional flows: use the installed help above before executing.

### titan server list

List server profiles. Bridge: server.list. Risk: read.

~~~text
titan server list
titan help server list
~~~

Options and conditional flows: use the installed help above before executing.

### titan server get

Show one server profile. Bridge: server.get. Risk: read.

~~~text
titan server get <serverId>
titan help server get
~~~

Options and conditional flows: use the installed help above before executing.

### titan server create

Create a new server instance. Bridge: server.create. Risk: write.

~~~text
titan server create
titan help server create
~~~

Options and conditional flows: use the installed help above before executing.

### titan server ports

Suggest a free game/query/RCON port triple. Bridge: server.ports.suggest. Risk: read.

~~~text
titan server ports
titan help server ports
~~~

Options and conditional flows: use the installed help above before executing.

### titan server config

Show the server configuration (passwords redacted). Bridge: server.config.get. Risk: read.

~~~text
titan server config <serverId>
titan help server config
~~~

Options and conditional flows: use the installed help above before executing.

### titan server preview

Show the launch command line and mod list. Bridge: server.launchPreview. Risk: read.

~~~text
titan server preview <serverId>
titan help server preview
~~~

Options and conditional flows: use the installed help above before executing.

### titan server set

Change server settings (only the given fields). Bridge: server.config.patch. Risk: write.

~~~text
titan server set <serverId>
titan help server set
~~~

Options and conditional flows: use the installed help above before executing.

### titan server start

Start a server. Bridge: server.start. Risk: write.

~~~text
titan server start <serverId>
titan help server start
~~~

Options and conditional flows: use the installed help above before executing.

### titan server stop

Stop a server. Bridge: server.stop. Risk: write.

~~~text
titan server stop <serverId>
titan help server stop
~~~

Options and conditional flows: use the installed help above before executing.

### titan server restart

Restart a server (now, or --in N with warnings). Bridge: server.restart. Risk: write.

~~~text
titan server restart <serverId>
titan help server restart
~~~

Options and conditional flows: use the installed help above before executing.

### titan server settings

Show or change per-instance settings (overrides of the globals). Bridge: server.settings.get. Risk: read.

~~~text
titan server settings <serverId>
titan help server settings
~~~

Options and conditional flows: use the installed help above before executing.

### titan server firewall

Open Windows Firewall rules for the server ports. Bridge: server.firewall.open. Risk: write.

~~~text
titan server firewall <serverId>
titan help server firewall
~~~

Options and conditional flows: use the installed help above before executing.

### titan server delete

Stop the server and DELETE its root folder. Bridge: server.delete. Risk: destructive.

~~~text
titan server delete <serverId> --yes
titan help server delete
~~~

Options and conditional flows: use the installed help above before executing.

### titan schedule list

Restart jobs, one-time restarts and scheduled messages of a server. Bridge: server.schedule.list. Risk: read.

~~~text
titan schedule list <serverId>
titan help schedule list
~~~

Options and conditional flows: use the installed help above before executing.

### titan schedule upcoming

Next restarts of a server (interval + jobs + one-time, merged). Bridge: server.schedule.upcoming. Risk: read.

~~~text
titan schedule upcoming <serverId>
titan help schedule upcoming
~~~

Options and conditional flows: use the installed help above before executing.

### titan schedule add

Add a restart job, one-time restart or scheduled message. Bridge: server.schedule.add. Risk: write.

~~~text
titan schedule add <serverId>
titan help schedule add
~~~

Options and conditional flows: use the installed help above before executing.

### titan schedule update

Change a schedule item (only the given fields). Bridge: server.schedule.update. Risk: write.

~~~text
titan schedule update <serverId> <id>
titan help schedule update
~~~

Options and conditional flows: use the installed help above before executing.

### titan schedule remove

Remove a schedule item. Bridge: server.schedule.remove. Risk: destructive.

~~~text
titan schedule remove <serverId> <id> --yes
titan help schedule remove
~~~

Options and conditional flows: use the installed help above before executing.

### titan mod list

List the mods of a server. Bridge: mod.list. Risk: read.

~~~text
titan mod list <serverId>
titan help mod list
~~~

Options and conditional flows: use the installed help above before executing.

### titan mod add

Download and add a Workshop mod (id or URL). Bridge: mod.addWorkshop. Risk: write.

~~~text
titan mod add <serverId> <input>
titan help mod add
~~~

Options and conditional flows: use the installed help above before executing.

### titan mod search

Search the Steam Workshop. Bridge: mod.searchWorkshop. Risk: read.

~~~text
titan mod search <serverId> <query>
titan help mod search
~~~

Options and conditional flows: use the installed help above before executing.

### titan mod update

Change mod settings (-p enabled=, optional=, loadOrder=, type=). Bridge: mod.update. Risk: write.

~~~text
titan mod update <serverId> <modId>
titan help mod update
~~~

Options and conditional flows: use the installed help above before executing.

### titan mod workshop-update

Download a Workshop mod update (restarts the server if it is running). Bridge: mod.checkUpdate. Risk: write.

~~~text
titan mod workshop-update <serverId> <modId>
titan help mod workshop-update
~~~

Options and conditional flows: use the installed help above before executing.

### titan mod sync-keys

Copy the mods' .bikey files into the server keys folder. Bridge: mod.syncKeys. Risk: write.

~~~text
titan mod sync-keys <serverId>
titan help mod sync-keys
~~~

Options and conditional flows: use the installed help above before executing.

### titan mod purge

Remove a mod and delete its files. Bridge: mod.purge. Risk: destructive.

~~~text
titan mod purge <serverId> <modId> --yes
titan help mod purge
~~~

Options and conditional flows: use the installed help above before executing.

### titan backup list

List backups of a server. Bridge: backup.list. Risk: read.

~~~text
titan backup list <serverId>
titan help backup list
~~~

Options and conditional flows: use the installed help above before executing.

### titan backup create

Create a manual backup. Bridge: backup.create. Risk: write.

~~~text
titan backup create <serverId>
titan help backup create
~~~

Options and conditional flows: use the installed help above before executing.

### titan backup preview

Check a backup and show what a restore would write. Bridge: backup.preview. Risk: read.

~~~text
titan backup preview <serverId> <backupId>
titan help backup preview
~~~

Options and conditional flows: use the installed help above before executing.

### titan backup restore

Restore a backup (stops the server, does not restart it). Bridge: backup.restore. Risk: destructive.

~~~text
titan backup restore <serverId> <backupId> --yes
titan help backup restore
~~~

Options and conditional flows: use the installed help above before executing.

### titan rcon say

Global admin message to all players. Bridge: rcon.adminMessage. Risk: write.

~~~text
titan rcon say <serverId> <message>
titan help rcon say
~~~

Options and conditional flows: use the installed help above before executing.

### titan rcon msg

Private message to one player. Bridge: rcon.playerMessage. Risk: write.

~~~text
titan rcon msg <serverId> <playerIndex> <message>
titan help rcon msg
~~~

Options and conditional flows: use the installed help above before executing.

### titan rcon kick

Kick a player. Bridge: rcon.playerKick. Risk: destructive.

~~~text
titan rcon kick <serverId> <playerIndex> --yes
titan help rcon kick
~~~

Options and conditional flows: use the installed help above before executing.

### titan rcon ban

Ban a player. Bridge: rcon.playerBan. Risk: destructive.

~~~text
titan rcon ban <serverId> <playerIndex> --yes
titan help rcon ban
~~~

Options and conditional flows: use the installed help above before executing.

### titan maint update-server

Update the DayZ server files (restarts a running server). Bridge: maintenance.updateServer. Risk: write.

~~~text
titan maint update-server <serverId>
titan help maint update-server
~~~

Options and conditional flows: use the installed help above before executing.

### titan maint update-mods

Update all Workshop mods (restarts a running server). Bridge: maintenance.updateMods. Risk: write.

~~~text
titan maint update-mods <serverId>
titan help maint update-mods
~~~

Options and conditional flows: use the installed help above before executing.

### titan maint repair-keys

Repair mod keys (same as mod sync-keys). Bridge: maintenance.repairKeys. Risk: write.

~~~text
titan maint repair-keys <serverId>
titan help maint repair-keys
~~~

Options and conditional flows: use the installed help above before executing.

### titan dayz install

Install or update DayZ Dedicated Server via SteamCMD. Bridge: dayz.install. Risk: write.

~~~text
titan dayz install
titan help dayz install
~~~

Options and conditional flows: use the installed help above before executing.

### titan op

Show one long-running operation. Bridge: operation.get. Risk: read.

~~~text
titan op <operationId>
titan help op
~~~

Options and conditional flows: use the installed help above before executing.

### titan ops

List long-running operations. Bridge: operation.list. Risk: read.

~~~text
titan ops
titan help ops
~~~

Options and conditional flows: use the installed help above before executing.

## Bridge commands and payloads

### control.hello

Risk: built-in.

Visszaadja a launcher- és protokollverziót és a kapcsolódott felhasználót.
- **Payload:** nincs.
- **Válasz:** `protocolVersion`, `launcherVersion`, `user`, `notes[]`.
- **Példa:** `titan hello` (vagy `titan call control.hello`)

### control.commands

Risk: built-in.

A policy összes bejegyzése parancsnév szerint rendezve.
- **Payload:** nincs.
- **Válasz:** tömb: `[{command, risk: read|write|destructive|forbidden, note?}]`.
- **Példa:** `titan commands --risk destructive`

---

### app.getState

Risk: write. Full UI state; also starts RCON monitors and may queue the automatic DayZ server install.

A teljes UI-állapotot adja vissza.
- **Payload:** nincs.
- **Válasz:** `app{name, version, update, apiConfigured, apiOnline, apiStatus, backgroundMode}`, `settings`,
  `selectedServerId`, `steamCredentials`, `account`, `host`, `network`, `setupReadiness`, `configSyntaxIssues`,
  `servers`, `operations`.
- **Policy:** *Full UI state; also starts RCON monitors and may queue the automatic DayZ server install.*
- **Példa:** `titan status` (vagy `titan call app.getState`)

### app.getSettings

Risk: read.

A mentett `AppSettings` objektumot adja vissza.
- **Payload:** nincs.
- **Válasz:** `version`, `dataRoot`, `defaultServerRoot`, `steamCmdPath`, `steamCmd`, `steamCredentials`, `dayZServer`,
  `apiBaseUrl`, `selectedServerId`, `uiLocale`, `launcherLogging`, `launcherUpdates`, `ai`, `backgroundMode`,
  `features`, `notifications`, `protection`, `serverOperations`.
- **Példa:** `titan call app.getSettings`

### app.selectServer

Risk: write.

Kijelöli és elmenti az aktív szervert.
- **Payload:** `serverId` (string, kötelező).
- **Válasz:** `serverId`.
- **Hibák:** `invalid_payload`, `server_not_found`.
- **Példa:** `titan call app.selectServer -p serverId=chernarus-1`

### app.updateSettings

Risk: write.

Lecseréli és elmenti a launcher beállításait (újrakonfigurálja a naplózást is).
- **Payload:** teljes `AppSettings` objektum (kötelező; a mezőket lásd `app.getSettings`). Az `apiBaseUrl`,
  `steamCredentials`, `uiLocale` mezőket a launcher figyelmen kívül hagyja; üres `selectedServerId` esetén a
  jelenlegi marad. A UI a teljes `settings`-t küldi vissza módosítva – érdemes így tenni: `app.getSettings` →
  szerkesztés → mentés.
- **Szerverenkénti adatok védelme:** az ütemezési listák a szerverekhez tartoznak (`server.schedule.*`), ezért
  ez a parancs **nem írja felül** őket: a szerverhez rendelt újraindítási jobok, egyszeri újraindítások és az
  időzített üzenetek mindig a jelenlegi állapotból maradnak meg (akkor is, ha a payloadból hiányoznak vagy régi
  másolat van benne). A régi, szerver nélküli (minden szerverre vonatkozó) jobok/egyszeri újraindítások csak akkor
  változnak, ha a payload kifejezetten tartalmazza a listát; azonos `id` esetén csak a küldött mezők változnak
  (pl. egy egyszeri újraindítás `message` mezője megmarad, ha nem küldöd). A szerverenkénti felülírások a
  profilon élnek, ezeket ez a parancs nem érinti (`server.settings.patch`).
- **Válasz:** a mentett `AppSettings`.
- **Hibák:** `invalid_payload`, `invalid_steamcmd_path`, `invalid_cpu_affinity_mask`, `invalid_process_priority`.
- **Példa:** `titan call app.updateSettings --payload-file .\settings.json`

### app.setLocale

Risk: write.

Beállítja és elmenti a UI nyelvét (az RCON broadcastok nyelvét is ez adja).
- **Payload:** `locale` (string, opcionális; hiányában normalizált alapérték).
- **Válasz:** `locale`.
- **Példa:** `titan call app.setLocale -p locale=hu`

### app.update.check

Risk: read.

Lekérdezi a legújabb launcher-verziót (és elmenti a megadott frissítési beállításokat).
- **Payload:** opcionális `LauncherUpdateSettings`: `enabled` (bool), `channel` (string), `autoDownloadEnabled`
  (bool), `notifyOnly` (bool). Hiányában a mentett beállítás érvényes.
- **Válasz:** `update{available, currentVersion, latestVersion, mandatory, releaseNotesUrl, installerUrl,
  installerSha256, status, …}`, `settings`, `message`.
- **Példa:** `titan call app.update.check`

### app.update.later

Risk: read.

Csak nyugtázza a frissítés elhalasztását, mást nem csinál.
- **Payload:** figyelmen kívül marad (a UI `{version}`-t küld).
- **Válasz:** `accepted: true`.
- **Példa:** `titan call app.update.later`

### app.update.installNow

Risk: destructive. Runs the launcher updater and restarts the launcher.

Letölti és ellenőrzi a telepítőt, elindítja egy segédscripttel, majd kb. 1 mp múlva leállítja a launchert.
- **Payload:** `version` (string, opcionális, csak naplózásra).
- **Válasz:** `version`, `path`, `sha256`, `sizeBytes`, `update`, `message`.
- **Hibák:** `launcher_update_not_available`, `launcher_update_open_failed`.
- **Policy:** *Runs the launcher updater and restarts the launcher.*
- **Példa:** `titan call app.update.installNow --yes`

---

### server.list

Risk: read.

Visszaadja a szerverprofilokat.
- **Payload:** nincs.
- **Válasz:** `items[]` (`ServerProfileState`: `id`, `displayName`, `enabled`, `status`, `rootPath`, `configPath`,
  `profilesPath`, `map`, `maxPlayers`, `gamePort`, `queryPort`, `rconPort`, `publish`, …).
- **Példa:** `titan server list`

### server.get

Risk: read.

Egy szerverprofilt ad vissza.
- **Payload:** `serverId` (string, kötelező).
- **Válasz:** `ServerProfileState` (lásd `server.list`).
- **Hibák:** `invalid_payload`, `server_not_found`.
- **Példa:** `titan server get chernarus-1`

### server.create

Risk: write.

Létrehoz egy új szerver-instance-t; Namalsk / Deer Isle / Banov / Bitterroot pályánál a szükséges Workshop modokat is
letölti (hosszú művelet, `server.create`).
- **Payload** (`CreateServerRequest`; a payload kötelező, a mezőknek van alapértéke): `displayName` (string),
  `rootPath` (string, üres = alapútvonal), `map` (string, `chernarusplus`), `maxPlayers` (int, 60), `gamePort`
  (int, 2302), `queryPort` (int, 27016), `rconPort` (int, 2305).
- **Válasz:** `profile`, `configPath`, `settingsPath`, `launchProfilePath`, `operationId`, `mapSetupStatus`,
  `mapSetupMessage`.
- **Hibák:** `invalid_payload`, `server_create_failed`.
- **Példa:** `titan call server.create -p displayName=Teszt -p map=chernarusplus -p gamePort=2402 -p queryPort=27116 -p rconPort=2405`

### server.ports.suggest

Risk: read.

Szabad game/query/rcon port-hármast javasol (10-es lépésközzel).
- **Payload:** nincs.
- **Válasz:** `gamePort`, `queryPort`, `rconPort`, `unavailablePortCount`.
- **Példa:** `titan call server.ports.suggest`

### server.delete

Risk: destructive.

Leállítja a szervert, lezárja a tűzfalportjait, és **törli a szerver gyökérkönyvtárát**.
- **Payload:** `serverId` (string, kötelező), `confirmDelete` (bool, kötelezően `true`).
- **Válasz:** `serverId`, `displayName`, `deletedPath`, `firewall{succeeded, startedElevatedProcess, cancelled,
  message, check}`.
- **Hibák:** `server_not_found`, `delete_not_confirmed`, `server_delete_failed`.
- **Példa:** `titan call server.delete -p serverId=chernarus-1 -p confirmDelete=true --yes`

### server.start

Risk: write.

Elindítja a DayZ szerverfolyamatot.
- **Payload:** `serverId` (string, kötelező).
- **Válasz:** `ServerProcessResult`: `status`, `serverId`, `processId`, `logPath`, `message`, `preflight`,
  `failureDiagnostic`. Az `ok` csak `Running` státusznál igaz.
- **Hibák:** `server_not_found`, `server_start_failed` (a részletes diagnosztika a `failureDiagnostic`-ban és az
  operation rekordban).
- **Példa:** `titan server start chernarus-1`

### server.preflight

Risk: read.

Ellenőrzi az indítás feltételeit.
- **Payload:** `serverId` (string, kötelező).
- **Válasz:** `issues[{code, severity, message, details, blocking}]`, `canStart`, `blockingCount`, `warningCount`
  (blokkoló hiba esetén is `ok: true` – a `canStart`-ot nézd).
- **Példa:** `titan call server.preflight -p serverId=chernarus-1`

### server.firewall.open

Risk: write. Adds Windows Firewall rules for the server ports.

Windows tűzfalszabályokat nyit a szerver portjaira (UAC-emelést kérhet a desktopon).
- **Payload:** `serverId` (string, kötelező).
- **Válasz:** `FirewallPortOpenResult`: `succeeded`, `startedElevatedProcess`, `cancelled`, `message`,
  `check{isApplicable, checkSucceeded, requiredPorts, openPorts, missingPorts, message}`.
- **Hibák:** `server_not_found`, `firewall_open_failed`.
- **Policy:** *Adds Windows Firewall rules for the server ports.*
- **Példa:** `titan call server.firewall.open -p serverId=chernarus-1`

### server.firewall.openForCreate

Risk: write. Adds Windows Firewall rules for the server ports.

Mint az előző, de egy még létre nem hozott profil portjaira.
- **Payload:** `CreateServerRequest` (mezők: lásd `server.create`; a payload kötelező).
- **Válasz:** `FirewallPortOpenResult`.
- **Hibák:** `invalid_payload`, `firewall_open_failed`.
- **Policy:** *Adds Windows Firewall rules for the server ports.*
- **Példa:** `titan call server.firewall.openForCreate -p gamePort=2402 -p queryPort=27116 -p rconPort=2405`

### server.launchPreview

Risk: read.

Megmutatja az indítási parancssort és a modlistát.
- **Payload:** `serverId` (string, kötelező).
- **Válasz:** `serverId`, `executablePath`, `configPath`, `profilesPath`, `gamePort`, `preview`, `clientMods`,
  `serverMods`, `disabledMods`, `issues`.
- **Hibák:** `server_not_found`, `launch_preview_failed`.
- **Példa:** `titan call server.launchPreview -p serverId=chernarus-1`

### server.stop

Risk: write.

RCON-visszaszámlálás után leállítja a szervert (hosszú, megszakítható művelet).
- **Payload:** `serverId` (string, kötelező).
- **Válasz:** `ServerProcessResult` (lásd `server.start`).
- **Hibák:** `server_not_found`, `server_stop_failed`, `operation_cancelled`.
- **Példa:** `titan server stop chernarus-1 --timeout 900`

### server.kill

Risk: destructive.

Azonnal kilövi a szerverfolyamatot (törli a visszaszámlálásokat), majd leállítási mentést készít és offline-nak
publikálja.
- **Payload:** `serverId` (string, kötelező).
- **Válasz:** `ServerProcessResult`.
- **Hibák:** `server_not_found`, `server_kill_failed`.
- **Példa:** `titan call server.kill -p serverId=chernarus-1 --yes`

### server.restart

Risk: write.

Visszaszámlálás után újraindítja a szervert (hosszú, megszakítható művelet).
- **Payload:** `serverId` (string, kötelező).
- **Válasz:** `ServerProcessResult`.
- **Hibák:** `server_not_found`, `server_restart_failed`, `operation_cancelled`.
- **Példa:** `titan server restart chernarus-1 --timeout 900`

### server.config.get

Risk: read.

Beolvassa a szerver konfigurációját.
- **Payload:** `serverId` (string, kötelező).
- **Válasz:** `ServerConfigurationResult`: `configuration`, `profile`, `configPath`, `settingsPath`, `preview`,
  `restartRequired`, `operationId`, `message`, `firewall`. (A jelszómezők kitakarva jönnek.)
- **Példa:** `titan call server.config.get -p serverId=chernarus-1`

### server.config.save

Risk: write.

Elmenti a szerver konfigurációját; portváltozásnál tűzfal-szinkront végez, publikált szervernél újrapublikálást állít
sorba.
- **Payload** (`ServerConfigurationRequest`): `serverId` (string, kötelező), `hostname`, `password`, `adminPassword`,
  `maxPlayers` (60), `map`, `gamePort`, `queryPort`, `rconPort`, `useSmartCpuAffinityMask` (true),
  `manualCpuAffinityMask`, `serverProcessPriority` ("normal"), `rconEnabled`, `rconHost` ("127.0.0.1"),
  `rconPassword`, `verifySignatures` (2), `forceSameBuild` (1), `disableVoN`, `disableThirdPerson`,
  `disableCrosshair` (int 0/1), `serverTime` ("SystemTime"), `serverTimeAcceleration` (12),
  `serverNightTimeAcceleration` (1), `serverTimePersistent`, `instanceId` (1), `storageAutoFix` (1),
  `logAverageFpsSeconds` (20). **Teljes csere**: a hiányzó mezők alapértékre állnak.
- **Válasz:** `ServerConfigurationResult` (lásd `server.config.get`).
- **Hibák:** `server_not_found`, `invalid_payload`, `config_save_server_running`, `config_save_failed`.
- **Figyelem:** a `server.config.get` válaszában a jelszavak `***`-ként jönnek; ezeket mentés előtt ki kell
  cserélni a valódi értékre, különben `***` lesz a jelszó (lásd Eltérések).
- **Példa:** `titan call server.config.save --payload-file .\config.json`

### server.config.patch

Risk: write. Partial update: only the given fields change; "***" secrets count as not provided.

Részleges módosítás: a launcher betölti az aktuális (nem kitakart) konfigurációt, csak a payloadban szereplő
mezőket írja felül, majd ugyanazon az úton ment, mint a `server.config.save` (validálás, tűzfal-szinkron,
újrapublikálás, `config_save_server_running` szabály).
- **Payload:** `serverId` (string, kötelező) + a `ServerConfigurationRequest` mezőinek tetszőleges részhalmaza,
  ugyanazokkal a JSON-nevekkel (lásd `server.config.save`). A típus szigorú: számmezőbe szám, logikai mezőbe
  `true`/`false`, szövegesbe string kell; `null` nem megengedett.
- **Jelszómezők** (`password`, `adminPassword`, `rconPassword`): a `***` érték „nincs megadva”, a jelszó változatlan
  marad – így a `server.config.get` kitakart válasza visszaküldhető. Az üres string (`""`) törli a jelszót.
- **Válasz:** `ServerConfigurationResult` (lásd `server.config.get`, a jelszavak kitakarva) + `changedFields`
  (string tömb: a ténylegesen megváltozott mezők camelCase nevei; azonos érték nem számít változásnak).
- **Hibák:** `server_not_found`, `invalid_payload` (ismeretlen mezők vagy hibás típusú értékek felsorolva),
  `config_load_failed`, `config_save_server_running`, `config_save_failed`.
- **Példa:** `titan call server.config.patch -p serverId=chernarus-1 -p maxPlayers=40`

---

### server.restart.schedule

Risk: write. One-time restart in N minutes with the server's restart warnings.

Egyszeri újraindítás `inMinutes` perc múlva (a következő egész percre kerekítve). Egyszeri újraindításként
(`oneTimeRestarts`, dátummal: `targetLocal`) mentődik, az ismétlődő újraindítást nem kapcsolja ki, így a launcher újraindítása után is megmarad; az ütemező a szerver érvényes
`restartWarningMinutes` értékei szerint küldi a figyelmeztetéseket, és a kick/lock védelem is lefut.
- **Payload:** `serverId` (kötelező), `inMinutes` (int 1–1440, kötelező), `message` (string, opcionális
  figyelmeztető sablon: `{{countdown}}`, `{{time}}`, `{{server}}`).
- **Válasz:** `serverId`, `scheduleId`, `inMinutes`, `targetLocal`, `warningMinutes` (a még kiküldésre kerülő
  figyelmeztetések), `oneTimeRestart`, `message`.
- **Hibák:** `server_not_found`, `invalid_payload`. Visszavonás: `server.schedule.remove` a `scheduleId`-vel.
- **Példa:** `titan server restart chernarus-1 --in 15m --message "Restart in {{countdown}}"`

---

### server.settings.get

Risk: read.

Egy szerver instanszbeállításai.
- **Payload:** `serverId` (string, kötelező).
- **Válasz:** `serverId`; `effective` (minden mező kitöltve: az érvényes érték), `overrides` (a profil
  felülírásai, a nem felülírt mezők `null`), `globals` (a globális értékek ugyanebben az alakban),
  `changedFields` (itt mindig üres tömb).
- **Hibák:** `server_not_found`.
- **Példa:** `titan call server.settings.get -p serverId=chernarus-1`

### server.settings.patch

Risk: write. Per-instance overrides; null clears an override (= use the global value).

Részleges módosítás: csak a payloadban szereplő mezők változnak; `null` törli a felülírást (a globális érték
érvényes újra). A mentés a szerverprofil mentési útján megy (ugyanaz, mint a UI-é), utána állapotfrissítés a
felületnek. Szerver-újraindítás nem kell: a következő ütemező-/watchdog-kör már az új értéket használja.
- **Payload:** `serverId` (kötelező) + a fenti mezők tetszőleges részhalmaza. Szigorú típus: bool mezőbe
  `true`/`false`, számmezőbe egész szám, tartományon kívüli érték hiba; a figyelmeztetés-perceket a launcher
  csökkenő sorrendbe rendezi és duplikátummentesíti.
- **Válasz:** mint `server.settings.get`, plusz `changedFields` (a ténylegesen megváltozott mezők; azonos érték
  nem változás). Ha minden felülírás `null` lett, a profil `overrides` értéke `null`.
- **Hibák:** `server_not_found`, `invalid_payload` (ismeretlen mezők / hibás értékek felsorolva).
- **Példa:** `titan call server.settings.patch --payload "{\"serverId\":\"chernarus-1\",\"autoRestartAfterCrash\":false,\"restartIntervalHours\":6}"`

### server.schedule.list

Risk: read.

Egy szerver saját ütemezési elemei. A szerver nélküli (régi, minden szerverre vonatkozó) elemek nem jelennek meg
és itt nem szerkeszthetők.
- **Payload:** `serverId` (kötelező).
- **Válasz:** `serverId`, `jobs` (`RestartScheduleJobSettings`: `id`, `serverId`, `enabled`, `title`, `type`,
  `recurrence` daily|weekly|one_time|interval, `weekday`, `timeOfDay`, `targetLocal`, `message`, `warningMinutes`,
  `createdAtUtc`), `oneTimeRestarts` (`id`, `serverId`, `enabled`, `targetLocal` (dátum + idő; régi elemnél
  `null`), `hour`, `minute`, `message`, `createdAtUtc`),
  `scheduledMessages` (`id`, `serverId`, `enabled`, `name`, `message`, `intervalSeconds`, `createdAtUtc`),
  `upcoming` (a következő 3 újraindítás, mint `server.schedule.upcoming`),
  `restartSchedule` (a szerver érvényes ütemezése a következő futásidőkkel, mint az AI-parancsoknál).
- **Hibák:** `server_not_found`.
- **Példa:** `titan schedule list chernarus-1`

### server.schedule.upcoming

Risk: read. Next restarts of a server: interval, fixed-time jobs and one-time restarts merged (within 30 minutes = one restart).

Egy szerver következő újraindításai. A két független funkció – az ismétlődő újraindítás (N óránként, ha be van
kapcsolva) és az egyszeri újraindítások – valamint a fix időpontos (napi/heti) jobok célidőpontjai egy listába
kerülnek; ha két célidőpont 30 percen belül van, a szerver csak egyszer indul újra (a korábbinál), egy
figyelmeztetés-sorozattal. Az ütemező pontosan ezt a listát hajtja végre.
- **Payload:** `serverId` (kötelező), `count` (int 1–50, alapértelmezés 3).
- **Válasz:** `serverId`, `recurringEnabled`, `intervalHours`, `mergeWindowMinutes` (30), `upcoming` (időrendben:
  `id` (`recurring` = az ismétlődő intervallum, egyébként a job / egyszeri elem azonosítója), `kind`
  (`interval` | `job` | `onetime`), `at` ("yyyy-MM-dd HH:mm" helyi idő), `targetLocal`, `targetInSeconds`,
  `message`, `mergedIds` / `covers` (a 30 percen belüli, ebbe összevont elemek)).
- **Hibák:** `server_not_found`, `invalid_payload`.
- **Példa:** `titan schedule upcoming chernarus-1 --count 5`

### server.schedule.add

Risk: write.

Új ütemezési elem a szervernek.
- **Payload:** `serverId` (kötelező), `kind` (kötelező: `restart` | `message` | `onetime`), továbbá:
  - `restart` (fix időpontos ismétlődés, az N óránkénti ismétlődő újraindítás MELLETT fut): `timeOfDay`
    ("HH:mm", kötelező), `recurrence` (`daily` alapértelmezés | `weekly`), `weekday` (weekly-nél kötelező:
    `mon`…`sun` vagy teljes név), `title`, `message` (figyelmeztető szöveg; üres = az ütemezés üzenete),
    `warningMinutes`, `enabled` (true).
  - `onetime` (egyszeri újraindítás, lefutás után törlődik): `at` ("yyyy-MM-dd HH:mm" helyi idő, a jövőben,
    legfeljebb egy évre; `targetLocal` néven is), vagy `timeOfDay` ("HH:mm") / `hour` + `minute` (a következő
    ilyen időpont – a launcher a dátumot is eltárolja), `message`, `enabled`.
  - `message`: `message` (kötelező), `intervalSeconds` (30–86400, alapértelmezés 600), `name`, `enabled`.
  Más mező `invalid_payload`.
- **Válasz:** `serverId`, `kind`, `item` (a létrehozott elem, új `id`-vel), `note` (`restart` jobnál: a job az
  ismétlődő intervallum mellett fut; ha csak a jobokat akarod, kapcsold ki a szerver ismétlődő újraindítását).
- **Hibák:** `server_not_found`, `invalid_payload`.
- **Példa:** `titan schedule add chernarus-1 --at "2026-10-13 04:00" --message "Karbantartás {{countdown}} múlva"`

### server.schedule.update

Risk: write.

Egy elem részleges módosítása; csak a szerver saját elemei érhetők el.
- **Payload:** `serverId`, `id` (kötelező) + az elem fajtájának mezői (lásd `server.schedule.add`); `kind`
  megadható ellenőrzésnek (ha nem egyezik: `invalid_payload`).
- **Válasz:** `serverId`, `kind`, `item` (a módosított elem).
- **Hibák:** `server_not_found`, `invalid_payload`, `schedule_item_not_found` (nincs ilyen `id` ezen a szerveren).
- **Példa:** `titan schedule update chernarus-1 restart_job_0123 --daily 05:30`

### server.schedule.remove

Risk: destructive.

Egy elem törlése (job, egyszeri újraindítás vagy ütemezett üzenet).
- **Payload:** `serverId`, `id` (kötelező).
- **Válasz:** `serverId`, `kind`, `removed` (a törölt elem).
- **Hibák:** `server_not_found`, `invalid_payload`, `schedule_item_not_found`.
- **Példa:** `titan schedule remove chernarus-1 restart_job_0123 --yes`

### rcon.test

Risk: read.

RCON kapcsolatteszt.
- **Payload** (`RconUiRequest`): `serverId` (string, kötelező), `host` (string), `port` (int), `password` (string),
  `message` (string).
- **Válasz:** `RconOperationResult`: `status`, `serverId`, `host`, `port`, `command`, `response`, `operationId`,
  `logPath`, `message`.
- **Hibák:** `server_not_found`, `rcon_test_failed`.
- **Példa:** `titan call rcon.test -p serverId=chernarus-1`

### rcon.adminMessage

Risk: write.

Globális admin üzenetet küld a szerverre.
- **Payload:** mint `rcon.test`; `message` (string, gyakorlatilag kötelező).
- **Válasz:** `RconOperationResult`.
- **Hibák:** `server_not_found`, `rcon_admin_message_failed`.
- **Példa:** `titan call rcon.adminMessage -p serverId=chernarus-1 -p "message=Restart 5 perc mulva"`

### rcon.playerMessage

Risk: write.

Privát üzenetet küld egy játékosnak (és naplózza a játékos-adatbázisba).
- **Payload** (`RconPlayerActionUiRequest`): `serverId` (kötelező), `playerIndex` (int, gyakorlatilag kötelező;
  alapérték -1), `message` (string), `host`, `port`, `password`.
- **Válasz:** `RconOperationResult`.
- **Hibák:** `server_not_found`, `rcon_player_message_failed`.
- **Példa:** `titan call rcon.playerMessage -p serverId=chernarus-1 -p playerIndex=3 -p message=Szia`

### rcon.playerKick

Risk: destructive.

Kirúgja a játékost.
- **Payload:** mint `rcon.playerMessage`, plusz `reason` (string).
- **Válasz:** `RconOperationResult`.
- **Hibák:** `server_not_found`, `rcon_player_kick_failed`.
- **Példa:** `titan call rcon.playerKick -p serverId=chernarus-1 -p playerIndex=3 -p reason=AFK --yes`

### rcon.playerBan

Risk: destructive.

Kitiltja a játékost.
- **Payload:** mint `rcon.playerKick`, plusz `targetMode` (string, alapérték "player"), `identifier` (string),
  `durationMinutes` (int; 0 = valószínűleg végleges).
- **Válasz:** `RconOperationResult`.
- **Hibák:** `server_not_found`, `rcon_player_ban_failed`.
- **Példa:** `titan call rcon.playerBan -p serverId=chernarus-1 -p playerIndex=3 -p durationMinutes=1440 -p reason=Cheat --yes`

### scheduledMessages.save

Risk: write.

Ütemezett játékosüzenetet hoz létre vagy frissít.
- **Payload** (`ScheduledMessageUiRequest`): `id` (string, üres = új `msg_<guid>`), `serverId` (kötelező),
  `message` (string, kötelező), `enabled` (bool, true), `name` (string), `intervalSeconds` (int, 600; 30–86400
  közé szorítva).
- **Válasz:** `message`, `settings`.
- **Hibák:** `server_not_found`, `invalid_message`.
- **Példa:** `titan call scheduledMessages.save -p serverId=chernarus-1 -p "message=Discord: ..." -p intervalSeconds=1800`

### scheduledMessages.delete

Risk: destructive.

Töröl egy ütemezett üzenetet (nem létező `id` esetén is `ok: true`).
- **Payload:** `id` (string, kötelező).
- **Válasz:** `id`, `settings`.
- **Hibák:** `invalid_payload`.
- **Példa:** `titan call scheduledMessages.delete -p id=msg_0123abcd --yes`

---

### steamcmd.detect

Risk: read.

Megkeresi a SteamCMD-t (szükség esetén írható helyre másolja).
- **Payload:** nincs.
- **Válasz:** `status`, `path`, `message`, `checkedPaths`, `isDetected`.
- **Példa:** `titan call steamcmd.detect`

### steamcmd.install

Risk: write.

Letölti és telepíti a SteamCMD-t (hosszú művelet).
- **Payload:** nincs.
- **Válasz:** `status`, `path`, `installDirectory`, `logPath`, `downloadUrl`, `operationId`, `message`.
- **Hibák:** `steamcmd_install_failed`.
- **Példa:** `titan call steamcmd.install`

### steam.credentials.save

Risk: forbidden. Steam credentials are UI-only.

Titkosítva elmenti a Steam belépési adatokat. Payload (csak tájékoztatásul): `userName`, `password`,
`steamGuardCode`, `queueDayZInstall`.
- **Policy:** *Steam credentials are UI-only.*

### steam.status

Risk: read.

W269: `titan steam status` a `steam.status` olvasó parancs aliasa, teljes JSON kimenettel
(mode, installed, running, loggedIn, accountLoginBlocked, libraries, server.source/reason,
buildId, workshop[].id/timeUpdated/ready/decision). `titan steam source Auto|SteamClient|SteamCmd`
a `steam.source.set` módmentést hívja. Az explicit SteamCmd mód sem engedi a fiókos belépést,
ha a kliens bejelentkezve fut. A 223350-es app frissítése mindig anonymous.

### steam.source.set

Risk: write.

W269: `titan steam status` a `steam.status` olvasó parancs aliasa, teljes JSON kimenettel
(mode, installed, running, loggedIn, accountLoginBlocked, libraries, server.source/reason,
buildId, workshop[].id/timeUpdated/ready/decision). `titan steam source Auto|SteamClient|SteamCmd`
a `steam.source.set` módmentést hívja. Az explicit SteamCmd mód sem engedi a fiókos belépést,
ha a kliens bejelentkezve fut. A 223350-es app frissítése mindig anonymous.

### steam.credentials.verify

Risk: forbidden. Steam credentials are UI-only.

Háttérben ellenőrzi a Steam munkamenetet.
- **Policy:** *Steam credentials are UI-only.*

### steam.credentials.clear

Risk: forbidden. Steam credentials are UI-only.

Törli a mentett Steam adatokat.
- **Policy:** *Steam credentials are UI-only.*

### dayz.install

Risk: write.

Telepíti vagy frissíti a DayZ Dedicated Servert a kiválasztott Steam-forrásból (hosszú művelet, `dayz.install`).
- **Payload** (`DayZServerInstallRequest`, mind opcionális): `installPath` (string), `steamLogin` (string, a mentett
  adat nem írja felül a 223350-es app anonymous belépését), `steamPassword` (string), `steamGuardCode` (string), `appId` (int, 223350), `validate` (bool,
  true). A UI `{}`-t vagy `{steamGuardCode}`-t küld.
- **Válasz:** `status`, `steamCmdPath`, `installPath`, `serverExePath`, `logPath`, `exitCode`, `operationId`,
  `message`.
- **Hibák:** `steamcmd_missing`, `steam_credentials_required`, `dayz_server_install_failed`.
- **Példa:** `titan call dayz.install --timeout 1800`

---

### account.refresh

Risk: write.

A Steam felhasználónév alapján szinkronizálja a launcher-fiókot (kreditek, e-mail) a backenddel.
- **Payload:** nincs.
- **Válasz:** `status`, `steamUserName`, `userId`, `displayName`, `email`, `aiCredits`, `creditsBalance`, `provider`,
  `lastSyncedAtUtc`, `lastError`.
- **Hibák:** `steam_account_missing`, `account_sync_failed`.
- **Példa:** `titan call account.refresh`

### account.setEmail

Risk: write.

Beállítja vagy törli az értesítési e-mail címet a backend-fiókon.
- **Payload:** `email` (string, opcionális; üres = törlés). Payload objektum kötelező.
- **Válasz:** `userId`, `email`, `updated`.
- **Hibák:** `api_not_configured`, `host_not_registered`, `invalid_payload`, `invalid_email`, `set_email_failed`.
- **Példa:** `titan call account.setEmail -p email=admin@example.com`

### host.ensureIdentity

Risk: write.

Létrehozza vagy betölti a helyi host identitást (installId, kulcspár).
- **Payload:** nincs.
- **Válasz:** HostPayload.
- **Példa:** `titan call host.ensureIdentity`

### host.register

Risk: write.

Regisztrálja a launcher hostot a backendnél.
- **Payload:** nincs.
- **Válasz:** HostPayload.
- **Hibák:** `host_register_failed`.
- **Példa:** `titan call host.register`

### host.token

Risk: write.

Frissíti a host access tokent a backendtől (a UI nem hívja).
- **Payload:** nincs.
- **Válasz:** HostPayload.
- **Hibák:** `host_token_failed`.
- **Példa:** `titan call host.token`

### host.check

Risk: read.

Ellenőrzi a host identitást a backendnél, és szinkronizálja a hostolt szerverek publikálási adatait.
- **Payload:** nincs.
- **Válasz:** `host` (HostPayload), `me` (backend `me` válasz vagy null).
- **Hibák:** `host_check_failed`.
- **Példa:** `titan call host.check`

### host.publishServer

Risk: write.

Publikálja (regisztrálja) a szervert a backenden.
- **Payload:** `serverId` (string, kötelező).
- **Válasz:** PublishState.
- **Hibák:** `server_not_found`, `server_publish_failed`.
- **Példa:** `titan call host.publishServer -p serverId=chernarus-1`

### host.heartbeat

Risk: write.

Heartbeatet küld (PID, uptime, játékosszám, metrikák) a backendnek.
- **Payload:** `serverId` (string, kötelező).
- **Válasz:** PublishState.
- **Hibák:** `server_not_found`, `heartbeat_failed`.
- **Példa:** `titan call host.heartbeat -p serverId=chernarus-1`

### host.offline

Risk: write.

Offline állapotot jelez a backend felé (a UI nem hívja).
- **Payload:** `serverId` (string, kötelező).
- **Válasz:** PublishState.
- **Hibák:** `server_not_found`, `offline_failed`.
- **Példa:** `titan call host.offline -p serverId=chernarus-1`

### host.probe

Risk: read.

Szükség esetén publikál, majd külső elérhetőségi próbát kér a backendtől.
- **Payload:** `serverId` (string, kötelező).
- **Válasz:** `publish`, `probe` (null, ha a publikálás nem sikerült).
- **Hibák:** `server_not_found`, `server_publish_failed`, `probe_failed`.
- **Példa:** `titan call host.probe -p serverId=chernarus-1`

### host.publishManifest

Risk: write.

Szükség esetén publikál, majd feltölti a szerver (mod) manifestjét.
- **Payload:** `serverId` (string, kötelező).
- **Válasz:** `publish`, `manifest`, `validation`.
- **Hibák:** `server_not_found`, `server_publish_failed`, `manifest_publish_failed`.
- **Példa:** `titan call host.publishManifest -p serverId=chernarus-1`

### host.titanMod.provision

Risk: write.

TitanMod remote API tokent kér a backendtől, és kiírja a helyi TitanMod configot a szerver mappájába.
- **Payload:** `serverId` (string, kötelező), `rotate` (bool, opcionális, alapérték false).
- **Válasz:** `publish`, `titanMod{accepted, backendServerId, apiKeyId, apiMode, baseUrl, scopes, …}`,
  `configPath`, `localStatus`, `serverRestarted`, `reloadMayRequireRestart`.
- **Hibák:** `server_not_found`, `server_publish_failed`, `titanmod_provision_failed`.
- **Példa:** `titan call host.titanMod.provision -p serverId=chernarus-1`

### notification.test_email

Risk: forbidden. Sends e-mail; UI-only.

Teszt e-mail értesítést kér a backendtől.
- **Policy:** *Sends e-mail; UI-only.*

---

### network.routerInfo

Risk: read.

Visszaadja a helyi IP-t, a gateway-t és a lehetséges router admin URL-eket.
- **Payload:** nincs.
- **Válasz:** `localIp`, `gatewayIp`, `routerUrl`, `commonRouterUrls[]`.
- **Példa:** `titan call network.routerInfo`

### network.openRouter

Risk: forbidden. Opens the router admin page in a browser; UI-only.

Megnyitja a router admin oldalát a böngészőben. Payload (tájékoztatásul): `url`.
- **Policy:** *Opens the router admin page in a browser; UI-only.*

---

### ai.status

Risk: read.

Az AI agent állapotát és biztonsági beállításait adja vissza.
- **Payload:** nincs.
- **Válasz:** `enabled`, `backendConfigured`, `backendUrl`, `mode`, `agentStatus` (`disabled|ready|not_configured`),
  `selectedServerId`, `manifestAvailable`, `capabilities[]`, `safeguards{…}`.
- **Példa:** `titan call ai.status`

### ai.chat.send

Risk: write.

AI chat üzenetet küld (helyi tool → backend → helyi fallback válasz).
- **Payload:** `message` (string, kötelező), `serverId` (string, opcionális).
- **Válasz:** `sessionId`, `serverId`, `prompt`, `answer`, `userMessage`, `assistantMessage`, `suggestedNextActions`,
  `stages[]`, `backendFallback`, `account`. Backend-hiba esetén is `ok: true`, `backendFallback: true`-val.
- **Hibák:** `server_not_found`, `invalid_payload`.
- **Példa:** `titan call ai.chat.send -p serverId=chernarus-1 -p "message=Miert crashel a szerver?"`

### ai.settings.save

Risk: forbidden. AI provider settings contain API keys; UI-only.

AI beállítások mentése. Payload (tájékoztatásul): `AiSettings` objektum a gyökérben.
- **Policy:** *AI provider settings contain API keys; UI-only.*

### ai.agent.manifest

Risk: read.

Helyi AI agent manifestet épít az összes szerverről (útvonalak, RCON, modok).
- **Payload:** nincs.
- **Válasz:** `agentVersion`, `capabilities[]`, `servers[{serverId, displayName, map, status, selected,
  missionTemplate, paths, rcon, mods}]`.
- **Példa:** `titan call ai.agent.manifest`

### ai.agent.resolvePath

Risk: read.

Ellenőrzi, hogy egy útvonal olvasható-e az AI számára a szerver hatókörén belül, és aliasra oldja fel.
- **Payload:** `path` (string, gyakorlatilag kötelező), `serverId` (string, opcionális).
- **Válasz:** `allowed`, `alias`, `message`.
- **Hibák:** `server_not_found`, `invalid_path`, `invalid_alias`, `server_scope_mismatch`, `root_not_allowed`,
  `path_outside_scope`, `target_is_file`, `directory_not_found`.
- **Példa:** `titan call ai.agent.resolvePath -p serverId=chernarus-1 -p path=profiles`

### ai.plan.create

Risk: write.

AI tervet készít a megadott célból a backenden (hiba esetén helyi mock tervet ad, mindig `ok: true`).
- **Payload:** `userGoal` (string, opcionális), `serverId` (string, opcionális).
- **Válasz:** `AiPlanPreview`.
- **Példa:** `titan call ai.plan.create -p serverId=chernarus-1 -p "userGoal=Novelj a jarmuvek szamat"`

### ai.artifacts.list

Risk: read.

Egy backend AI session artifactjait listázza (legfeljebb 25).
- **Payload:** `sessionId` (string, kötelező).
- **Válasz:** `items[]`, `count`.
- **Hibák:** `invalid_payload`, `ai_not_connected`, `ai_artifacts_list_failed`.
- **Példa:** `titan call ai.artifacts.list -p sessionId=<sessionId>`

### ai.plan.preview

Risk: read.

Egy kívülről kapott AI terv JSON-t normalizál (helyi művelet).
- **Payload:** `plan` (`AiPlanPreview`, kötelező; `plan` kulcs nélkül a teljes payload a terv), `serverId`.
- **Válasz:** a normalizált `AiPlanPreview`.
- **Hibák:** `invalid_payload`.
- **Példa:** `titan call ai.plan.preview --payload-file .\plan.json`

### ai.plan.approve

Risk: write.

Jóváhagy egy AI tervet (backend tervnél a backenden is).
- **Payload:** `plan` (`AiPlanPreview`, kötelező, `planId`-val), `operationIds` (string[], opcionális; üres = mind),
  `confirmedHighRisk` (bool, opcionális).
- **Válasz:** `AiPlanDecision`: `planId`, `status`, `operationIds[]`, `highRiskConfirmed`, `backendApprovalId`,
  `backendApprovalStatus`, `decidedAtUtc`.
- **Hibák:** `invalid_payload`, `high_risk_confirmation_required`, `ai_not_connected`, `ai_backend_approval_failed`.
- **Példa:** `titan call ai.plan.approve --payload-file .\decision.json`

### ai.plan.reject

Risk: write.

Elutasít egy AI tervet (`status: rejected`).
- **Payload / Válasz:** mint `ai.plan.approve`.
- **Példa:** `titan call ai.plan.reject --payload-file .\decision.json`

### ai.plan.revise

Risk: write.

Átdolgozásra küldi az AI tervet (`status: needs_revision`).
- **Payload / Válasz:** mint `ai.plan.approve`.
- **Példa:** `titan call ai.plan.revise --payload-file .\decision.json`

### ai.plan.applyPreview

Risk: read.

Kiszámolja, alkalmazható-e a terv (blokkolók, lépések).
- **Payload:** `plan` (kötelező), `decision` (`AiPlanDecision`, opcionális).
- **Válasz:** `AiPlanApplyPreview`: `planId`, `status`, `canApply`, `backupRequired`, `validationRequired`,
  `atomicReplaceRequired`, `operationIds[]`, `steps[]`, `blockers[]`, `warnings[]`.
- **Hibák:** `invalid_payload`, `ai_apply_preview_blocked` (az előnézet ekkor is a payloadban).
- **Példa:** `titan call ai.plan.applyPreview --payload-file .\apply.json`

### ai.plan.prepareApply

Risk: write.

Ha a terv igényli, biztonsági mentést készít a szerverről az alkalmazás előtt (hosszú lehet).
- **Payload:** `plan` (kötelező), `decision`, `serverId`.
- **Válasz:** `preview`, `backup` (`BackupCreateResult` vagy null), `message`.
- **Hibák:** `server_not_found`, `invalid_payload`, `ai_apply_preview_blocked`, `ai_apply_backup_failed`.
- **Példa:** `titan call ai.plan.prepareApply --payload-file .\apply.json --timeout 1200`

### ai.plan.validateTemp

Risk: write.

A módosított fájlokat ideiglenes helyre írja és validálja (XML/JSON).
- **Payload:** `plan` (kötelező), `decision`, `serverId`.
- **Válasz:** `planId`, `status`, `valid`, `files[{alias, kind, valid, tempPath, message}]`, `errors[]`.
- **Hibák:** `server_not_found`, `invalid_payload`, `ai_apply_preview_blocked`, `ai_apply_validation_failed`.
- **Példa:** `titan call ai.plan.validateTemp --payload-file .\apply.json`

### ai.plan.apply

Risk: write.

Alkalmazza a tervet: helyi tervnél atomikusan cseréli a szerverfájlokat (rollback manifesttel), backend tervnél a
backend parancsait hajtja végre.
- **Payload:** `plan` (kötelező), `decision` (backend tervnél `backendApprovalId`-val), `serverId`, `backup` (a
  `prepareApply` `backup` eredménye; helyi tervnél kötelező, ha az előnézet mentést ír elő).
- **Válasz:** `planId`, `status`, `applied`, `backupId`, `rollbackManifestPath`, `backendApplyId`,
  `backendApplyStatus`, `files[]`, `errors[]`, `verification`, `message`.
- **Hibák:** `server_not_found`, `invalid_payload`, `ai_apply_preview_blocked`, `ai_apply_backup_required`,
  `ai_apply_validation_failed`, `ai_apply_failed`, `ai_backend_approval_required`, `ai_not_connected`,
  `ai_backend_apply_failed`.
- **Példa:** `titan call ai.plan.apply --payload-file .\apply.json`

### ai.mods.previewInstallPlan

Risk: read.

Validálja és normalizálja egy Workshop mod telepítési tervét (fő mod, függőségek, duplikátumok).
- **Payload:** `plan` (`AiModInstallPlan`; `plan` kulcs nélkül a gyökér): `workshopId` (string, kötelező), `planId`,
  `displayName`, `loadKind` ("client"), `dependencies[{workshopId, displayName, loadKind, required}]`, `syncKeys`
  (true), `restartRequired` (true).
- **Válasz:** `planId`, `valid`, `plan`, `main`, `dependencies[]`, `syncKeys`, `restartRequired`, `warnings[]`,
  `errors[]`.
- **Hibák:** `invalid_payload`, `ai_mod_plan_invalid`.
- **Példa:** `titan call ai.mods.previewInstallPlan -p workshopId=1559212036`

### ai.mods.installPlan

Risk: write.

SteamCMD-vel telepíti a függőségeket és a fő modot, majd opcionálisan szinkronizálja a kulcsokat (hosszú,
megszakítható).
- **Payload:** mint `ai.mods.previewInstallPlan`, plusz `serverId`.
- **Válasz:** `planId`, `status` (`installed|failed`), `install`, `dependencies[]`, `modList`, `keySync`,
  `progress[]`, `restartRequired`, `message`.
- **Hibák:** `server_not_found`, `invalid_payload`, `ai_mod_plan_invalid`, `ai_mod_dependency_failed`,
  `ai_mod_install_failed`, `operation_cancelled`.
- **Példa:** `titan call ai.mods.installPlan -p serverId=chernarus-1 -p workshopId=1559212036 --timeout 1800`

### ai.logs.evidencePreview

Risk: read.

Kiválaszt egy szerverlogot (alapból RPT), és kitakart részletet ad belőle.
- **Payload:** `serverId` (opcionális), `preferredKind` (string, "rpt"), `maxLines` (int, 20–5000; 0 = beállítás).
- **Válasz:** `serverId`, `status`, `selectedKind`, `selectedFile`, `files[]`, `excerpt`, `lineCount`, `maxLines`,
  `redacted`, `warnings[]`.
- **Hibák:** `server_not_found`.
- **Példa:** `titan call ai.logs.evidencePreview -p serverId=chernarus-1 -p maxLines=500`

### ai.logs.fixPlanPreview

Risk: read.

Egy log-javító AI tervet normalizál a log-bizonyítékhoz kötve.
- **Payload:** `plan` (kötelező), `evidence` (`AiLogEvidencePreview`, opcionális), `serverId`.
- **Válasz:** a normalizált `AiPlanPreview`.
- **Hibák:** `invalid_payload`.
- **Példa:** `titan call ai.logs.fixPlanPreview --payload-file .\fixplan.json`

### ai.types.inspect

Risk: read.

Beolvassa az aktív `types.xml`-t, és megnézi, létezik-e már a céltípus.
- **Payload:** `targetType` (string, opcionális), `serverId`.
- **Válasz:** `serverId`, `status`, `targetType`, `duplicateFound`, `existingType`, `typeCount`,
  `existingTypeNames[]`, `categories[]`, `usages[]`, `values[]`, `warnings[]`, `errors[]`.
- **Hibák:** `server_not_found`, `ai_types_inspect_blocked`.
- **Példa:** `titan call ai.types.inspect -p serverId=chernarus-1 -p targetType=AKM`

### ai.types.planPreview

Risk: read.

`types.xml`-módosító AI tervet normalizál az inspect eredmény alapján.
- **Payload:** `plan` (kötelező), `inspect` (`AiTypesInspectPreview`, opcionális), `serverId`.
- **Válasz:** a normalizált `AiPlanPreview`.
- **Hibák:** `invalid_payload`.
- **Példa:** `titan call ai.types.planPreview --payload-file .\typesplan.json`

---

### mod.list

Risk: read.

A szerver modlistáját adja vissza.
- **Payload:** `serverId` (string, kötelező).
- **Válasz:** `ModListState`: `version`, `revision`, `updatedAtUtc`, `mods[]`.
- **Hibák:** `server_not_found`.
- **Példa:** `titan mod list chernarus-1`

### mod.searchWorkshop

Risk: read.

Keres a Steam Workshopban.
- **Payload:** `serverId` (kötelező), `query` (string), `maxResults` (int, 10).
- **Válasz:** `query`, `items[{workshopId, title, author, previewUrl, url, alreadyAdded}]`, `message`.
- **Hibák:** `server_not_found`, `invalid_payload`, `workshop_search_failed`.
- **Példa:** `titan call mod.searchWorkshop -p serverId=chernarus-1 -p query=trader`

### mod.openWorkshop

Risk: forbidden. Opens the Steam Workshop page; UI-only.

Megnyitja a Workshop oldalt a böngészőben. Payload (tájékoztatásul): `workshopId`.
- **Policy:** *Opens the Steam Workshop page; UI-only.*

### mod.addWorkshop

Risk: write.

Letölti SteamCMD-vel és felveszi a Workshop modot a szerverre (hosszú, megszakítható).
- **Payload** (`AddWorkshopModRequest`): `serverId` (kötelező), `input` (string: Workshop ID vagy URL, kötelező),
  `previewUrl` (string), `steamLogin` (string, "anonymous"), `useSavedCredentials` (bool, true).
- **Válasz:** `status` (`added|duplicate|…`), `mod`, `modListPath`, `logPath`, `operationId`, `message`,
  `requiresSteamLogin`.
- **Hibák:** `server_not_found`, `invalid_payload`, `steam_approval_required`, `workshop_mod_add_failed`,
  `operation_cancelled`.
- **Példa:** `titan call mod.addWorkshop -p serverId=chernarus-1 -p input=1559212036 --timeout 1800`

### mod.workshopProgress

Risk: read.

A Workshop letöltés állapota (SteamCMD log és mappaméret alapján).
- **Payload:** `serverId` (kötelező), `workshopId` (string, kötelező).
- **Válasz:** `workshopId`, `downloadedBytes`, `totalBytes`, `percent`, `detail`, `latestLine`, `logPath`.
- **Hibák:** `server_not_found`, `invalid_payload`.
- **Példa:** `titan call mod.workshopProgress -p serverId=chernarus-1 -p workshopId=1559212036`

### operation.cancel

Risk: write.

Megszakít egy futó, megszakítható műveletet (szűrő nélkül a legújabbat).
- **Payload** (mind opcionális szűrő): `operationId` (string), `operationType` (string, pl. `workshop.add`),
  `serverId` (string).
- **Válasz:** `operationId`.
- **Hibák:** `invalid_payload`, `operation_not_found`, `operation_not_cancelable`.
- **Példa:** `titan call operation.cancel -p serverId=chernarus-1 -p operationType=workshop.add`

### operation.get

Risk: read.

Egy hosszú művelet (`server.create`, `mod.addWorkshop`, `dayz.install`, `maintenance.*`, backup…) állapota a
visszakapott `operationId` alapján; pollozásra való.
- **Payload:** `operationId` (string, kötelező).
- **Válasz:** `operationId`, `kind` (a művelet típusa), `serverId` (vagy `null`), `status`
  (`running` | `succeeded` | `failed` | `cancelled` | `unknown`), `message`, `progress` (0–100 vagy `null`),
  `startedAtUtc`, `finishedAtUtc` (futás közben `null`), `errorCode` (vagy `null`). A megszakított művelet
  `cancelled` (a tárolt állapot `failed` + `operation_cancelled`), a sorban álló `running`.
- **Ismeretlen azonosító:** `ok=true`, `status: "unknown"` (a launcher csak a legutóbbi 25 műveletet őrzi meg).
- **Hibák:** `invalid_payload` (hiányzó `operationId`).
- **Példa:** `titan call operation.get -p operationId=op_ui_mod_addworkshop_20261012101500123`

### operation.list

Risk: read.

A legutóbbi műveletek, legújabb elöl, legfeljebb 50 (a gyakorlatban a megőrzött 25).
- **Payload:** `serverId` (string, opcionális szűrő).
- **Válasz:** `items` – elemei az `operation.get` válaszával azonos alakúak.
- **Példa:** `titan call operation.list -p serverId=chernarus-1`

### mod.update

Risk: write.

A mod metaadatait módosítja (típus, engedélyezés, opcionális, betöltési sorrend), letöltés nélkül.
- **Payload** (`UpdateModRequest`): `serverId` (kötelező), `modId` (string, kötelező), `type` (string, opcionális),
  `enabled` (bool, opcionális), `optional` (bool, opcionális), `loadOrder` (int, opcionális).
- **Válasz:** `ModListState`.
- **Hibák:** `server_not_found`, `invalid_payload`, `mod_update_failed`.
- **Példa:** `titan mod update chernarus-1 cf -p enabled=false`

### mod.checkUpdate

Risk: write. Over the pipe this downloads the Workshop update and restarts a running server; the check-only path is a WebView hook.

**A pipe-on** egy Workshop mod frissítése: ha a szerver fut, visszaszámlálás után leállítja, letölti a frissítést,
majd újraindítja a szervert (sikertelen frissítés után is). A felületen elérhető „csak ellenőrzés” egy WebView-hook
része, a pipe-on nem érhető el.
- **Payload** (`ModActionRequest`): `serverId` (kötelező), `modId` (string, kötelező).
- **Válasz:** `UpdateWorkshopModsResult`: `status`, `updated`, `failed`, `skipped`, `modList`, `modListPath`,
  `logPath`, `operationId`, `message`, `requiresAttention`.
- **Hibák:** `server_not_found`, `invalid_payload`, `steam_approval_required`, `workshop_mod_update_failed`,
  `workshop_mod_integrity_failed`, `server_restart_failed`.
- **Példa:** `titan mod workshop-update chernarus-1 cf --timeout 1800`

### mod.purge

Risk: destructive.

Eltávolítja a modot a listából, és (alapból) törli a fájljait.
- **Payload** (`ModActionRequest`): `serverId` (kötelező), `modId` (string, kötelező), `deleteFiles` (bool,
  alapérték **true**).
- **Válasz:** `status`, `modList`, `modId`, `workshopId`, `message`, `deletedFiles`, `failedPaths`.
- **Hibák:** `server_not_found`, `invalid_payload`, `server_running` (fájltörlés futó szervernél),
  `mod_purge_failed`.
- **Példa:** `titan call mod.purge -p serverId=chernarus-1 -p modId=cf -p deleteFiles=false --yes`

### mod.syncKeys

Risk: write.

Bemásolja a modok `.bikey` kulcsait a szerver `keys` mappájába.
- **Payload:** `serverId` (string, kötelező).
- **Válasz:** `KeySyncResult`: `copied`, `updated`, `existing`, `missing`, `conflicts`, `removed`, `indexPath`,
  `logPath`, `missingModIds`.
- **Hibák:** `server_not_found`, `key_sync_failed`.
- **Példa:** `titan call mod.syncKeys -p serverId=chernarus-1`

---

### backup.list

Risk: read.

A szerver mentéseinek listája.
- **Payload:** `serverId` (string, kötelező).
- **Válasz:** `BackupIndexState`: `version`, `backups[]`.
- **Hibák:** `server_not_found`.
- **Példa:** `titan backup list chernarus-1`

### backup.create

Risk: write.

Új zip mentést készít (hosszú művelet).
- **Payload:** `serverId` (string, kötelező).
- **Válasz:** `status`, `backup`, `index`, `operationId`, `zipPath`, `indexPath`, `logPath`, `includedFileCount`,
  `includedBytes`, `message`.
- **Hibák:** `server_not_found`, `backup_create_failed`.
- **Példa:** `titan backup create chernarus-1`

### backup.preview

Risk: read.

Egy mentés visszaállításának előnézete (`ok` = a mentés érvényes).
- **Payload:** `serverId` (kötelező), `backupId` (string, kötelező).
- **Válasz:** `status`, `backupId`, `zipPath`, `entries[]`, `includedRoots[]`, `fileCount`, `totalBytes`, `valid`,
  `message`.
- **Hibák:** `server_not_found`, `invalid_payload`, `backup_preview_failed`.
- **Példa:** `titan call backup.preview -p serverId=chernarus-1 -p backupId=<backupId>`

### backup.restore

Risk: destructive.

Visszaállít egy mentést; a futó szervert előbb leállítja, és **nem** indítja újra.
- **Payload:** `serverId` (kötelező), `backupId` (string, kötelező).
- **Válasz:** `status`, `backupId`, `operationId`, `zipPath`, `logPath`, `restoredFileCount`, `restoredBytes`,
  `preview`, `message`.
- **Hibák:** `server_not_found`, `invalid_payload`, `backup_restore_stop_failed`, `backup_restore_failed`.
- **Példa:** `titan call backup.restore -p serverId=chernarus-1 -p backupId=<backupId> --yes`

### backup.delete

Risk: destructive.

Töröl egy mentést.
- **Payload:** `serverId` (kötelező), `backupId` (string, kötelező).
- **Válasz:** `status`, `backupId`, `index`, `operationId`, `zipPath`, `deletedFile`, `message`.
- **Hibák:** `server_not_found`, `invalid_payload`, `backup_delete_failed`.
- **Példa:** `titan call backup.delete -p serverId=chernarus-1 -p backupId=<backupId> --yes`

### backup.pickDestinationFolder

Risk: forbidden. Opens a folder picker; UI-only.

Mappaválasztó dialógus a mentési célhoz.
- **Policy:** *Opens a folder picker; UI-only.*

### backup.pickIncludeFolder

Risk: forbidden. Opens a folder picker; UI-only.

Mappaválasztó a mentésbe felveendő mappához.
- **Policy:** *Opens a folder picker; UI-only.*

### backup.pickIncludeFile

Risk: forbidden. Opens a file picker; UI-only.

Fájlválasztó a mentésbe felveendő fájlhoz.
- **Policy:** *Opens a file picker; UI-only.*

---

### files.list

Risk: read.

A szerver fontos fájl- és mappahelyeinek listája.
- **Payload:** `serverId` (string, kötelező).
- **Válasz:** `locations[{id, label, path, kind, exists, sizeBytes, fileCount, status}]`.
- **Hibák:** `server_not_found`.
- **Példa:** `titan call files.list -p serverId=chernarus-1`

### files.openLocation

Risk: forbidden. Opens Explorer; UI-only.

Megnyitja a helyet az Explorerben. Payload (tájékoztatásul): `serverId`, `locationId`.
- **Policy:** *Opens Explorer; UI-only.*

### files.openConfigSyntaxIssue

Risk: forbidden. Opens Explorer; UI-only.

Kijelöli a hibás JSON/XML konfigot az Explorerben. Payload (tájékoztatásul): `serverId`, `path`.
- **Policy:** *Opens Explorer; UI-only.*

---

### editor.db.loadTypes

Risk: read.

Egy `types.xml`-t tölt be a DB-szerkesztőbe (automatikus XML-javítást végezhet).
- **Payload:** `serverId` (kötelező), `path` (string, alapból `mission/db/types.xml`), `sourceKind` (string,
  "official"), `sourceName` (string), `modId` (string).
- **Válasz:** `serverId`, `missionFolder`, `typesPath`, `sourceKind`, `sourceName`, `managed`, `aggregate`,
  `sourceFiles`, `typeCount`, `categories`, `usages`, `values`, `types[]`, `loadedAtUtc`, …
- **Hibák:** `server_not_found`, `invalid_loot_path`, `types_xml_missing`, `db_types_load_failed`.
- **Példa:** `titan call editor.db.loadTypes -p serverId=chernarus-1`

### editor.db.loadActiveTypes

Risk: read.

Az összes aktív (`cfgeconomycore`-ban engedélyezett) loot XML összevont betöltése.
- **Payload:** `serverId` (string, kötelező).
- **Válasz:** mint `editor.db.loadTypes`, `aggregate: true`, `sourceKind: "server_active"`.
- **Hibák:** `server_not_found`, `active_loot_sources_missing`, `db_active_types_load_failed`.
- **Példa:** `titan call editor.db.loadActiveTypes -p serverId=chernarus-1`

### editor.db.saveTypes

Risk: write.

Type bejegyzéseket ment forrásfájlonként csoportosítva (előtte mentést készít a `db_backups` mappába).
- **Payload** (`DbTypesSaveRequest`): `serverId` (kötelező), `types[]` (kötelező, nem üres; elemenként saját
  `sourcePath`, `sourceKind`, `sourceName`, `sourceModId` is lehet), `sourcePath`, `sourceKind`, `sourceName`,
  `modId`, `aggregate`.
- **Válasz:** `typesPath`, `backupPath`, `backupPaths`, `sourceFiles[]`, `typeCount`, `savedAtUtc`, `message`, …
- **Hibák:** `server_not_found`, `invalid_payload`, `invalid_type_name`, `invalid_loot_path`, `db_types_save_failed`.
- **Példa:** `titan call editor.db.saveTypes --payload-file .\types.json`

### editor.db.openSource

Risk: forbidden. Opens Explorer; UI-only.

Kijelöli a loot XML-t az Explorerben.
- **Policy:** *Opens Explorer; UI-only.*

### editor.loot.list

Risk: read.

A loot források listája (hivatalos, mod, managed).
- **Payload:** `serverId` (string, kötelező).
- **Válasz:** `serverId`, `missionFolder`, `economyCorePath`, `official`, `mods[]`, `managed[]`, `usedMods[]`,
  `economyEntries`.
- **Hibák:** `server_not_found`, `loot_sources_failed`.
- **Példa:** `titan call editor.loot.list -p serverId=chernarus-1`

### editor.loot.addToServer

Risk: write.

Egy mod loot XML-jét átmásolja a `mods_type` mappába, és engedélyezi a `cfgeconomycore.xml`-ben.
- **Payload** (`LootSourceAddRequest`): `serverId` (kötelező), `sourcePath` (string, kötelező), `sourceKind`,
  `sourceName`, `modId`.
- **Válasz:** `sourcePath`, `typesPath`, `sourceKind: "managed"`, `backupPath`, `addedAtUtc`, `xmlRepaired`,
  `message`, …
- **Hibák:** `invalid_payload`, `invalid_loot_path`, `loot_source_missing`, `loot_add_to_server_failed`.
- **Példa:** `titan call editor.loot.addToServer -p serverId=chernarus-1 -p "sourcePath=<a forrás types.xml útvonala>"`

### editor.loot.setEconomyEntryEnabled

Risk: write.

Ki- vagy bekapcsol egy `cfgeconomycore.xml` bejegyzést (letiltáskor kommentbe teszi).
- **Payload:** `serverId` (kötelező), `name` (string, kötelező), `folder` (string), `enabled` (bool, alapérték
  false).
- **Válasz:** `economyCorePath`, `folder`, `name`, `enabled`.
- **Hibák:** `invalid_payload`, `economy_core_missing`, `economy_entry_missing`, `economy_entry_toggle_failed`.
- **Példa:** `titan call editor.loot.setEconomyEntryEnabled -p serverId=chernarus-1 -p folder=mods_type -p name=types_cf.xml -p enabled=true`

### editor.xml.open

Risk: forbidden. Opens a file picker; UI-only.

XML fájl megnyitása fájlválasztóval.
- **Policy:** *Opens a file picker; UI-only.*

### editor.xml.save

Risk: write.

XML tartalmat ment egy **meglévő** fájlba (`.bak` mentéssel, atomikus cserével).
- **Payload** (`XmlEditorSaveRequest`): `filePath` (string, kötelező, létező fájl), `content` (string, kötelező,
  érvényes XML).
- **Válasz:** `filePath`, `fileName`, `directory`, `backupPath`, `rootName`, `lineCount`, `length`, `savedAtUtc`.
- **Hibák:** `invalid_payload`, `xml_file_missing`, `invalid_xml_path`, `xml_editor_save_failed`.
- **Példa:** `titan call editor.xml.save --payload-file .\xml-save.json`

### editor.validator.open

Risk: forbidden. Opens a file picker; UI-only.

XML/JSON fájl megnyitása a validátorba fájlválasztóval.
- **Policy:** *Opens a file picker; UI-only.*

### editor.validator.save

Risk: write. Always pass filePath: without it the launcher opens a save dialog on the desktop.

XML/JSON tartalmat validál és ment (`.bak` mentéssel, szükség esetén könyvtárat hoz létre).
- **Payload** (`ValidatorDocumentSaveRequest`): `filePath` (string, **mindig add meg**), `content` (string).
- **Válasz:** `filePath`, `fileName`, `directory`, `content`, `format`, `lineCount`, `length`, `backupPath`,
  `savedAtUtc` (vagy `cancelled: true`).
- **Hibák:** `invalid_payload`, `invalid_validator_path`, `validator_save_failed` (parse hiba esetén is).
- **Policy:** *Always pass filePath: without it the launcher opens a save dialog on the desktop.*
- **Példa:** `titan call editor.validator.save --payload-file .\validator-save.json`

### editor.validator.saveAs

Risk: forbidden. Opens a save dialog; UI-only.

Mint az előző, de mindig mentési dialógust nyit.
- **Policy:** *Opens a save dialog; UI-only.*

### editor.spawnables.load

Risk: read.

Betölti a `cfgspawnabletypes.xml`-t (ha hiányzik, üres dokumentumot ad).
- **Payload:** `serverId` (string, kötelező).
- **Válasz:** `serverId`, `missionFolder`, `filePath`, `exists`, `typeCount`, `types[]`, `knownItemTypes`,
  `loadedAtUtc`.
- **Hibák:** `server_not_found`, `invalid_spawnabletypes_path`, `spawnabletypes_load_failed`.
- **Példa:** `titan call editor.spawnables.load -p serverId=chernarus-1`

### editor.spawnables.openFile

Risk: forbidden. Opens the file in an external application; UI-only.

Megnyitja a `cfgspawnabletypes.xml`-t az alapértelmezett alkalmazásban.
- **Policy:** *Opens the file in an external application; UI-only.*

### editor.spawnables.save

Risk: write.

Elmenti a `cfgspawnabletypes.xml`-t (`.bak` mentéssel).
- **Payload** (`SpawnableTypesSaveRequest`): `serverId` (kötelező), `types[]` (`SpawnableTypeEditorItem`),
  `filePath` (string, opcionális; a misszió mappáján belül).
- **Válasz:** `filePath`, `backupPath`, `typeCount`, `types`, `savedAtUtc`, `message`, …
- **Hibák:** `invalid_payload`, `invalid_spawnabletypes_path`, `spawnabletypes_save_failed`.
- **Példa:** `titan call editor.spawnables.save --payload-file .\spawnables.json`

### editor.map.load

Risk: read.

A missziós térkép adatai: player spawnok, event spawnok, effect area-k, zombie zónák.
- **Payload:** `serverId` (string, kötelező).
- **Válasz:** `serverId`, `missionFolder`, `files`, `issues[]`, `playerSpawns`, `eventSpawns`, `effectAreas`,
  `zombieTerritories`, `coordinateOverlays`, `loadedAtUtc`, `message`.
- **Hibák:** `server_not_found`, `invalid_playerspawnpoints_path`, `mission_map_load_failed`.
- **Példa:** `titan call editor.map.load -p serverId=chernarus-1`

### editor.map.openFile

Risk: forbidden. Opens the file in an external application; UI-only.

Megnyitja a kiválasztott térképfájlt az alapértelmezett alkalmazásban.
- **Policy:** *Opens the file in an external application; UI-only.*

### editor.map.save

Risk: write.

Csak a `targetFileKey` szerinti térképfájlt menti (`.bak` mentéssel).
- **Payload** (`MissionMapSaveRequest`): `serverId` (kötelező), `targetFileKey` (string: `playerSpawns`,
  `eventSpawns`, `effectAreas`, `zombieTerritories`; alapból `playerSpawns`), `filePath`, `eventSpawnsFilePath`,
  `effectAreasFilePath`, `zombieTerritoriesFilePath`, `sections[]`, `eventSpawns[]`, `effectAreas[]`,
  `zombieTerritories[]`.
- **Válasz:** mint `editor.map.load`.
- **Hibák:** `invalid_payload`, `area_flags_readonly`, `invalid_playerspawnpoints_path`,
  `invalid_zombie_territories_path`, `invalid_eventspawns_path`, `invalid_effectareas_path`.
- **Példa:** `titan call editor.map.save --payload-file .\map.json`

### editor.init.load

Risk: read.

Betölti a misszió `init.c` fájlját (ha hiányzik, alapértelmezett tartalmat ad).
- **Payload:** `serverId` (string, kötelező).
- **Válasz:** `filePath`, `exists`, `content`, `lineCount`, `length`, `validation{valid, errors, warnings}`,
  `starterGear`, `knownItemTypes`, `loadedAtUtc`, …
- **Hibák:** `server_not_found`, `invalid_init_path`, `init_editor_load_failed`.
- **Példa:** `titan call editor.init.load -p serverId=chernarus-1`

### editor.init.save

Risk: write.

Elmenti az `init.c`-t: vagy a nyers `content`-et, vagy a `starterGear` blokkot írja a meglévő fájlba (`.bak`
mentéssel).
- **Payload** (`InitEditorSaveRequest`): `serverId` (kötelező), `content` (string) **vagy** `starterGear`
  (`{removeExistingItems, sets[{name, chance, items[{type, quantity, location, quickbar, healthMin, healthMax}]}]}`;
  ha meg van adva, a `content` figyelmen kívül marad).
- **Válasz:** `filePath`, `backupPath`, `content`, `lineCount`, `validation`, `starterGear`, `savedAtUtc`, …
- **Hibák:** `invalid_payload`, `server_not_found`, `invalid_init_path`, `invalid_init_script`,
  `init_editor_save_failed`.
- **Példa:** `titan call editor.init.save --payload-file .\init.json`

---

### events.list

Risk: read.

Az eseménynapló bejegyzései.
- **Payload:** `serverId` (string, opcionális).
- **Válasz:** `events[{timestampUtc, level, source, component, operationId, serverId, errorCode, message, path,
  lineNumber}]`, `sources[]`.
- **Példa:** `titan call events.list -p serverId=chernarus-1`

### maintenance.updateServer

Risk: write.

Frissíti a DayZ dedikált szervert SteamCMD-vel (validate); ha a megadott szerver futott, visszaszámlálás után
leállítja, majd újraindítja.
- **Payload:** `serverId` (string, opcionális; nélküle csak a frissítés fut).
- **Válasz:** `status` (`installed|busy|failed`), `steamCmdPath`, `installPath`, `serverExePath`, `logPath`,
  `exitCode`, `operationId`, `message`.
- **Hibák:** `dayz_server_update_failed`, `server_restart_failed`.
- **Példa:** `titan call maintenance.updateServer -p serverId=chernarus-1 --timeout 1800`

### maintenance.updateMods

Risk: write.

Frissíti a szerver összes Workshop modját; futó szervernél visszaszámlálás, leállítás, majd újraindítás.
- **Payload:** `serverId` (string, kötelező).
- **Válasz:** `UpdateWorkshopModsResult` (lásd `mod.checkUpdate`; `partial` státusznál is `ok: true`).
- **Hibák:** `server_not_found`, `steam_approval_required`, `workshop_mod_update_failed`,
  `workshop_mod_integrity_failed`, `server_restart_failed`.
- **Példa:** `titan call maintenance.updateMods -p serverId=chernarus-1 --timeout 1800`

### maintenance.repairKeys

Risk: write.

Ugyanaz, mint a `mod.syncKeys` (ugyanaz a handler).
- **Payload:** `serverId` (string, kötelező).
- **Válasz:** `KeySyncResult`.
- **Hibák:** `server_not_found`, `key_sync_failed`.
- **Példa:** `titan call maintenance.repairKeys -p serverId=chernarus-1`

### maintenance.clearLogs

Risk: destructive.

Törli a szerver logfájljait.
- **Payload:** `serverId` (string, kötelező).
- **Válasz:** `status`, `deletedFiles`, `skippedFiles`, `freedBytes`, `logPath`, `operationId`, `message`.
- **Hibák:** `server_not_found`, `clear_logs_failed`.
- **Példa:** `titan call maintenance.clearLogs -p serverId=chernarus-1 --yes`

---

### kill

Risk: destructive.

Classified for safety only; the bridge returns unknown_command, even with --yes. Use server.kill, rcon.playerKick or rcon.playerBan after reviewing their payload and risk.

### kick

Risk: destructive.

Classified for safety only; the bridge returns unknown_command, even with --yes. Use server.kill, rcon.playerKick or rcon.playerBan after reviewing their payload and risk.

### ban

Risk: destructive.

Classified for safety only; the bridge returns unknown_command, even with --yes. Use server.kill, rcon.playerKick or rcon.playerBan after reviewing their payload and risk.
