# CLI-referentie
> Vertaling van de [oorspronkelijke Engelse pagina](https://github.com/lmonteirotech/OmsiLaunch/blob/v0.1.0-beta.3/docs/reference/cli.md) voor OmsiLaunch 0.1.0-beta3. De Engelse pagina is normatief: bij verschillen gelden de Engelse pagina en de code.
Deze pagina is de volledige, normatieve referentie voor de opdrachtregel van OmsiLaunch `0.1.0-beta3`: de drie uitvoerbare bestanden, de argumentgrammatica, de dispatchvolgorde, elk opdrachtwoord, elke hiërarchische route, elke vlag, de uitvoer-envelopes en het foutgedrag van elke opdracht. De pagina is gegenereerd uit `tools\OmsiLaunch.Cli\Program.cs` (`CliProgram.RunAsync`, `OwnerSession.RunAsync`, `CliInput.Parse`, `CliInput.KnownFlags`, `CliInput.AcceptedNoEffectFlags`, `CliInput.CommandWordsAccepted`, `CliInput.HierarchicalRoutes`, `CliInput.BuildSpecAsync`, `CliEventWatch`), `tools\OmsiLaunch.Cli\LaunchSpecJson.cs` en de twee native shims onder `tools\OmsiLaunch.Bootstrapper`. Procesresultaten staan in [exitcodes](https://omsilaunch.omsimods.com.br/nl/docs/reference/exit-codes/index.md), foutcodes in [fouten](https://omsilaunch.omsimods.com.br/nl/docs/reference/errors/index.md) en uitgewerkte aanroepen in [CLI-voorbeelden](https://omsilaunch.omsimods.com.br/nl/docs/reference/cli-examples/index.md).
## Uitvoerbare bestanden
| Bestand | Subsysteem | Rol | Verschillen |
|---|---|---|---|
| `OmsiLaunch.exe` | Console | Native bootstrapper (`OmsiLaunch.Bootstrapper.cpp`): bepaalt zijn eigen map, splitst de opdrachtregel op met `CommandLineToArgvW`, zoekt `hostfxr` via `nethost.dll` en voert `OmsiLaunch.Controller.dll` uit met dezelfde argumenten. | Er wordt console-uitvoer geschreven; de exitcode van het proces is de exitcode van de managed controller, of een shimcode `100`..`106` als de .NET-host niet kon worden gestart. |
| `OmsiLaunchW.exe` | Windows (GUI) | Dezelfde shim (`OmsiLaunch.WindowsHost.cpp`), gebouwd voor het Windows-subsysteem. Deze stelt de omgevingsvariabele `OMSILAUNCH_WINDOWS_HOST=1` in voordat de controller wordt gestart. | Geen console: console-uitvoer wordt onderdrukt tenzij `--json` is opgegeven (`WindowsHost.SuppressConsole`), fouten worden als berichtvensters getoond (`WindowsHost.ShowFailure`: bericht, `Code: OL_E_...` en de hint `See .omsilaunch\diagnostics for details.`), en een shimfout `100`..`106` wordt getoond als `OmsiLaunch could not start the .NET host (code N).` Volledig gedrag: [referentie voor OmsiLaunchW.exe](https://omsilaunch.omsimods.com.br/nl/docs/reference/omsilaunchw/index.md). |
| `OmsiLaunch.Controller.dll` | Managed (x64, `net6.0-windows`, Windows Forms) | De controller zelf. Gebruikers roepen deze nooit rechtstreeks aan; beide shims geven het pad van de controller door als eerste hostargument, zodat het nooit in de openbare argumentenlijst verschijnt. | Vereist de x64-.NET 6-runtime met `Microsoft.WindowsDesktop.App`; zie [installatie](https://omsilaunch.omsimods.com.br/nl/docs/getting-started/installation/index.md). |
`nethost.dll` moet naast de shims staan. De shims lezen zelf geen argumenten; elk argument bereikt `CliInput.Parse` ongewijzigd, zodat `OmsiLaunch.exe` en `OmsiLaunchW.exe` precies dezelfde syntaxis accepteren.
## Aanroepmodel
### Argumentgrammatica (`CliInput.Parse`)
| Vorm | Betekenis |
|---|---|
| `/key:value`, `/key`, `-key:value`, `-key` | Een vlag. De sleutel is niet hoofdlettergevoelig; de waarde is alles na de eerste `:`. Onbekende sleutels mislukken met `OL_E_INVALID_ARGUMENT` (`Unknown argument: ...`), exit `2`. |
| `--key=value` | Een runtimeargument voor de geselecteerde runtime-operatie (bijvoorbeeld `--handle=rv-000001`). Elk `--`-token dat `=` bevat, is een runtimeargument en nooit een vlag. |
| `--json`, `/json` | Gestructureerde uitvoer (zie [Uitvoerformaten](#output-formats)). `--json` is het enige `--`-token zonder `=` dat betekenis heeft; het wordt geparseerd als de vlag `/json`. |
| los woord | Als er nog geen opdrachtwoord is gezien en het woord een van de [opdrachtwoorden](#command-words) is, wordt het de opdracht. Zodra er een opdrachtwoord aanwezig is, is elk later los woord een opdrachtwoord (de route). Anders is het eerste losse woord de installatiemap en wordt elk later los woord aan de route toegevoegd. |
Gevolgen: een hiërarchische route (`time get`) kan niet worden gecombineerd met een installatieargument dat erna staat (`time get D:\OMSI` is de onbekende route `time get d:\omsi`, exit `2`). `D:\OMSI time get` wordt geaccepteerd, maar is **eigenaarmodus** (er wordt een nieuwe sessie gestart en de operatie wordt daarin één keer uitgevoerd). Parseerfouten (`ArgumentException`, `FormatException`, `InvalidDataException`, `OverflowException`) en sessieprofielfouten (`SessionProfileException`) worden gemeld voordat er iets wordt uitgevoerd, altijd met exit `2`.
### Installatiemap
- Een expliciet installatieargument als los woord heeft voorrang op `RootPath` in een `/spec`-bestand (`CliInput.BuildSpecAsync`).
- `.` betekent de map die het uitvoerbare bestand bevat (`AppContext.BaseDirectory`), nooit de werkmap van de aanroeper (`CliInput.ResolveInstallationRoot`). Een portable pakket is hiervan afhankelijk.
- Als het argument ontbreekt, gebruiken operaties in eigenaarmodus (`/new`, `/saved`, `/spec`, `/list`, `/recovery-status`, `/recover`) ook de map van het uitvoerbare bestand. Het pad wordt genormaliseerd met `Path.GetFullPath`.
- Opdrachten in clientmodus nemen nooit een installatieargument: ze richten zich tot het lokale control-endpoint van de installatie waarin het uitvoerbare bestand staat (`AppContext.BaseDirectory`). Zie [local control](https://omsilaunch.omsimods.com.br/nl/docs/reference/local-control/index.md).
### Eigenaar en client
- **Eigenaar**: het proces dat een sessie plant, start, bewaakt en herstelt (`OwnerSession.RunAsync`). Het houdt de installatielease (`Local\OmsiLaunch.Installation.`) en de configuratietransactie vast, stelt het lokale control-endpoint beschikbaar zolang de sessie actief is en toont het [systeemvakpictogram](https://omsilaunch.omsimods.com.br/nl/docs/reference/windows-tray/index.md). Precies één eigenaar per installatie: als een eigenaar al antwoordt op `session.status` via het control-endpoint, mislukt een tweede start met `OL_E_SESSION_ALREADY_ACTIVE` (exit `7`).
- **Client**: elke aanroep zonder installatieargument die `session status`, `session stop`, `events read`, `events watch` of een runtime-operatie verstuurt. Deze wordt doorgestuurd via de local-control-pipe; zonder eigenaar mislukt hij met `OL_E_NO_ACTIVE_SESSION` (exit `4`).
### Dispatchvolgorde (`CliProgram.RunAsync`)
1. `/silent` (als het proces nog niet onder `OmsiLaunchW.exe` draait): start `OmsiLaunchW.exe` vanuit de map van het uitvoerbare bestand via `ShellExecute` (zonder overerving van handles) met dezelfde argumenten zonder `/silent`/`--silent`, schrijf de envelope `silent` (`delegated`, `host_process_id`) en retourneer `0`. Het consoleproces wacht niet op de sessie; zie [OmsiLaunchW.exe](https://omsilaunch.omsimods.com.br/nl/docs/reference/omsilaunchw/index.md#silent-delegation). `OL_E_WINDOWS_HOST_MISSING` / `OL_E_WINDOWS_HOST_START_FAILED` retourneren `7`.
2. `/version`: envelope `version` met `product`, `version` (informatieve assemblyversie, gestempeld vanuit `OmsiLaunch.Version.props`, `0.1.0-beta3`), `protocol_version` (`0.1`), `supported_family` (`OMSI_2_3_004_COMMON`); exit `0`.
3. `capabilities`: envelope met elke `PublicStableBeta`- of `PublicExperimental`-descriptor van `PublicCapabilityRegistry`; exit `0`.
4. `help [family]`: envelope `help` met `usage`, `product_version`, `protocol_version`, `family` en de openbare `commands` (`CliRoute`, `Description`, `Classification`, `RuntimeValidation`), optioneel gefilterd op familie; exit `0`.
5. `profiles`: envelope met `family` en de `supported` varianten van het uitvoerbare bestand (`ALTERNATE_LAA` `692EBFBF...`, `runtime_validated=true`; de Steam-LAA-hash `7DAB063D...` met `validation_status=pending_beta_field_validation`); exit `0`.
6. Runtime-operatie als client (geen installatieargument en een route of `/runtime:`): argumenten worden gevalideerd tegen `PublicCapabilityRegistry.ValidateRuntimeArguments` (`OL_E_RUNTIME_OPERATION_UNKNOWN`, `OL_E_RUNTIME_ARGUMENT_REQUIRED`, exit `2`), waarna `runtime.execute` wordt doorgestuurd met een timeout van 8 s (30 s voor `road-vehicles.spawn`).
7. Client-`session status` (750 ms), `session stop` (gebonden aan de actieve sessie-id, 750 ms), `events read` (750 ms), `events watch` (pollt elke 250 ms tot Ctrl+C).
8. `detect`, of **helemaal geen argumenten** (geen installatie, geen opdracht, geen `/?`, geen `/spec`, geen startvlag, geen recoveryvlag, geen `/list`): somt `Omsi`-processen op en test het control-endpoint (250 ms); envelope `detect`; exit `0`.
9. `/?` of `/help`: druk de gebruikstekst af, exit `0`. Elke andere aanroep met een opdrachtwoord maar zonder dispatchbare route (bijvoorbeeld `d3d` alleen of `session status D:\OMSI`) drukt de gebruikstekst af en eindigt met exit `2`.
10. Eigenaarmodus. Voorwaarden: `plugins\OmsiLaunch.Plugin.opl` en `plugins\OmsiLaunch.Native.x86.dll` moeten naast het uitvoerbare bestand staan (`OL_E_RUNTIME_INSTALLATION_INCOMPLETE`, exit `7`). `release-manifest.json` naast het uitvoerbare bestand levert, indien aanwezig, de verwachte plugin-hashes.
11. `/recovery-status` / `/recover`: `RecoverPendingAsync`; envelope `recover` met `pending`, `recovered`, `diagnostics`; exit `8` alleen als een herstel is aangevraagd en niet is voltooid, anders `0`.
12. `/list:`: `DiscoverAsync`; envelope `content.list`; exit `0`.
13. Bouw de `LaunchSpec` (`BuildSpecAsync`), plan deze (`PlanSessionAsync`) en druk het plan af. `/plan` of `/validate`: exit `0` als `IsRunnable`, anders `1`. Een niet-uitvoerbaar plan start OMSI nooit (exit `1`); onder `OmsiLaunchW.exe` toont een start met een niet-uitvoerbaar plan de laatste `OL_E_`-diagnose in een berichtvenster (documentatie-audit BUG-06). Tijdens het plannen wordt ook de geïnstalleerde permanente plugin-closure gecontroleerd tegen `release-manifest.json`, zodat een ontbrekende of gewijzigde plugin het plan niet uitvoerbaar maakt (`OL_E_PERMANENT_PLUGIN_*`).
14. Test of er al een eigenaar is (`OL_E_SESSION_ALREADY_ACTIVE`, exit `7`) en voer daarna `OwnerSession.RunAsync` uit.
### Levenscyclus van de eigenaar (`OwnerSession.RunAsync`)
1. `StartSessionAsync(plan)`. Vanaf hier bereikt elk exitpad `CloseAsync` in een `finally`-blok: exceptions, Ctrl+C (`Console.CancelKeyPress`), sluiten van de console / afmelden (`AppDomain.ProcessExit` met een budget van 4 s voor stop + herstel; wat overblijft, wordt bij de volgende start via het journal hersteld), "End session" in het systeemvak, pipe-`session.stop` en `/observe-seconds`.
2. Het systeemvakpictogram wordt aangemaakt, tenzij `Presentation.SuppressTrayIcon` in de spec is ingesteld.
3. Wacht `StartupTimeoutSeconds + 5` seconden op `Running`. De status wordt afgedrukt. Als de toestand niet `Running` is, exit `1` (`OmsiLaunchW.exe` toont `The OMSI session did not reach gameplay.` met de laatste `OL_E_`-diagnose of `OL_E_SESSION_START_FAILED`).
4. Validatiebatches (`/runtime-batch`, `/runtime-write-batch`, `/d3d-batch`) worden uitgevoerd en schrijven hun artefacten.
5. Het lokale control-endpoint start.
6. `/runtime:` wordt één keer uitgevoerd (5 s, 15 s voor `road-vehicles.spawn`); het resultaat wordt geschreven naar `\.omsilaunch\diagnostics\-runtime-operation.json` en afgedrukt. Een mislukte runtimeopdracht beëindigt de sessie nooit (in plaats daarvan wordt `runtime_error` afgedrukt).
7. Wachten: met `/observe-seconds:n` wordt de sessie na `n` seconden gestopt, **of** eerder bij een stop via systeemvak/pipe, of wanneer OMSI afsluit; zonder deze vlag wacht de eigenaar tot OMSI afsluit of een stop wordt aangevraagd.
8. De eindstatus wordt afgedrukt; exit `0` bij `Completed`, anders `1`.
`session.stop`, "End session" in het systeemvak, Ctrl+C en `CloseAsync` vragen allemaal de canonieke stop aan: OMSI wordt beëindigd met `TerminateProcess` (de eigen afsluitroutine van OMSI wordt niet uitgevoerd en `options.cfg` wordt niet door OMSI herschreven), waarna elk bestand in bezit van de sessie wordt hersteld. Zie [levenscyclus van de sessie](https://omsilaunch.omsimods.com.br/nl/docs/concepts/session-lifecycle/index.md) en [transacties en recovery](https://omsilaunch.omsimods.com.br/nl/docs/concepts/transactions-and-recovery/index.md).
## Opdrachtwoorden
Elk woord dat op de eerste positie wordt geaccepteerd (`CliInput.CommandWordsAccepted`):
| Woord | Doel | Modus | Opmerkingen |
|---|---|---|---|
| `capabilities` | Openbare capabilities weergeven | Lokaal, geen sessie | Envelope `capabilities`. |
| `profiles` | Ondersteunde `Omsi.exe`-varianten weergeven | Lokaal, geen sessie | Envelope `profiles`. |
| `detect` | `Omsi.exe`-processen en een actieve eigenaar rapporteren | Lokaal, geen sessie | Ook de standaard als er geen argumenten worden opgegeven. Toestanden: `NO_OMSI_FOUND`, `OMSI_FOUND_UNMANAGED`, per proces `UNKNOWN_BINARY_FOUND` als het binaire bestand niet kan worden geïnspecteerd; `active_omsilaunch_instance`, `managed_session`. |
| `help` | Gebruik en openbare opdrachtcatalogus | Lokaal, geen sessie | `help ` filtert op capabilityfamilie (`session`, `time`, `weather`, `map`, `camera`, `vehicles`, `player`, `humans`, `timetable`, `scripts`, `constants`, `curves`, `hof`, `drivers`, `tickets`, `d3d`, `events`). |
| `session` | `session status`, `session stop` | Client | Precies één volgend woord; al het andere drukt de gebruikstekst af, exit `2`. `session plan`/`session start` zijn API-routenamen, geen CLI-woorden: gebruik `/plan` en `/new`. |
| `events` | `events read`, `events watch` | Client | `read` retourneert de begrensde lijst met events één keer; `watch` drukt elk nieuw event (op `Sequence`) elke 250 ms af als `events.watch`-envelope tot Ctrl+C (exit `0`), `4` als geen eigenaar antwoordt, `7` bij een control-fout. |
| `time` | `time get`, `time set` | Clientroute | |
| `weather` | `weather get`, `weather set`, `weather actual get` | Clientroute | |
| `map` | `map get` | Clientroute | |
| `camera` | `camera get`, `camera set`, `camera lock`, `camera unlock` | Clientroute | |
| `vehicles` | `vehicles list`, `vehicles get`, `vehicles summary`, `vehicles spawn`, `vehicles place-random` | Clientroute | |
| `player` | `player get` | Clientroute | |
| `humans` | `humans list`, `humans get`, `humans summary` | Clientroute | |
| `timetable` | `timetable get`, `timetable
list`, `timetable logs list` | Clientroute | |
| `scripts` | `scripts variable list|get|set`, `scripts string list|get` | Clientroute | |
| `constants` | `constants list`, `constants get` | Clientroute | |
| `curves` | `curves list`, `curves evaluate` | Clientroute | |
| `hof` | `hof get` | Clientroute | |
| `drivers` | `drivers list` | Clientroute | |
| `tickets` | `tickets get` | Clientroute | |
| `d3d` | Gereserveerd familiewoord | Geen | `d3d` heeft **geen hiërarchische route**: `d3d texture ...` is een onbekende route (exit `2`) en `d3d` alleen drukt de gebruikstekst af (exit `2`). D3D-operaties worden bereikt met `/runtime:d3d.status`, `/runtime:d3d.texture.create` enzovoort (zie [Operaties zonder route](#operations-without-a-route)). |
## Hiërarchische routes
`CliInput.HierarchicalRoutes` koppelt een route in kleine letters aan een runtime-operatie-id. Alle routes vereisen een sessie in `Running` en worden uitgevoerd via de runtime-mailbox (`ExecuteRuntimeAsync`). Runtime-schrijfacties wijzigen alleen de toestand van OMSI in het geheugen: ze raken nooit bestanden aan, maken geen deel uit van de configuratietransactie en worden bij de stop **niet** teruggedraaid (OMSI wordt beëindigd). De stabiliteit volgt `PublicCapabilityRegistry` en de [validatiematrix](https://omsilaunch.omsimods.com.br/nl/docs/status/runtime-validation-status/index.md); details en resultaatvelden staan in [runtimebesturing](https://omsilaunch.omsimods.com.br/nl/docs/reference/runtime-control/index.md).
| Route | Runtime-operatie | Soort | Vereist Running | Wijzigt OMSI | Deelname aan herstel | Stabiliteit | Opmerkingen |
|---|---|---|---|---|---|---|---|
| `time get` | `time.read` | Read | Ja | Nee | Geen | STABLE_BETA | Klok- en kalendervelden. |
| `time set` | `time.set` | Write | Ja | Ja (klok in het geheugen) | Geen, niet teruggedraaid | EXPERIMENTAL | Bijvoorbeeld `--minute=<0..59>`; schrijven, teruglezen en herstel gevalideerd op 2026-09-20. |
| `weather get` | `weather.read` | Read | Ja | Nee | Geen | STABLE_BETA | |
| `weather set` | `weather.set` | Write | Ja | Nee (altijd geweigerd) | Geen | UNAVAILABLE | Retourneert `OL_E_RUNTIME_SETTING_NOT_PERSISTENT`; OMSI overschrijft de waarde bij zijn volgende weertick. |
| `weather actual get` | `weather.actual.read` | Read | Ja | Nee | Geen | EXPERIMENTAL | Toestand van de actual/ICAO-controller. |
| `map get` | `map.read` | Read | Ja | Nee | Geen | STABLE_BETA | Kaartnaam, bestand, beschrijving, aantal tegels, jaarbereik en rijzijde; opnieuw runtime-gevalideerd op het gecorrigeerde kaartslot. |
| `camera get` | `camera.read` | Read | Ja | Nee | Geen | STABLE_BETA | |
| `camera set` | `camera.set` | Write | Ja | Ja (camerascalairen, bijv. `--field_of_view=`) | Geen, niet teruggedraaid | EXPERIMENTAL | Schrijven/teruglezen van FOV gevalideerd. |
| `camera lock` | `camera.lock` | Action | Ja | Ja (beleid binnen de sessie) | Geen | EXPERIMENTAL | Vereist `--family=<0..3>` (chauffeur=0, passagier=1, extern=2, kaart=3), optioneel `--preset=` (familie 0 of 1). Heeft een spelersvoertuig nodig (bijvoorbeeld een opgeslagen situatie). Runtime-gevalideerd in de runtime-closure (`CAM01`); de `RuntimeValidation`-tekenreeks van het register zegt nog steeds `STATICALLY_VALIDATED` (zie [capabilities](https://omsilaunch.omsimods.com.br/nl/docs/reference/capabilities/index.md)). |
| `camera unlock` | `camera.unlock` | Action | Ja | Ja | Geen | EXPERIMENTAL | Heft het beleid op dat door `camera lock` is ingesteld (`CAM01`). |
| `vehicles list` | `road-vehicles.list` | Read | Ja | Nee | Geen | STABLE_BETA | Retourneert `rv-NNNNNN`-handles binnen de sessie. |
| `vehicles get` | `road-vehicle.read` | Read | Ja | Nee | Geen | STABLE_BETA | Vereist `--handle=`. Verouderde handle: `OL_E_RUNTIME_OBJECT_HANDLE_STALE`. |
| `vehicles summary` | `road-vehicles.read` | Read | Ja | Nee | Geen | STABLE_BETA | Aantallen en spelerstoestand, geen handles. |
| `vehicles spawn` | `road-vehicles.spawn` | Action | Ja | Ja (voegt één RoadVehicle toe) | Geen, niet verwijderd | EXPERIMENTAL | Vereist `--model=Vehicles\...\*.bus`. Timeout van 30 s voor de client, 15 s voor de eigenaar. Wijst het spelersvoertuig niet toe. RV-003 `RUNTIME_PASS`. |
| `vehicles place-random` | `road-vehicles.place-random` | Action | Ja | Ja | Geen | EXPERIMENTAL | Geprofileerde `PlaceRandomBus`. |
| `player get` | `player-vehicle.read` | Read | Ja | Nee | Geen | STABLE_BETA | Semantische null als er geen spelersvoertuig is. |
| `humans list` | `humans.list` | Read | Ja | Nee | Geen | EXPERIMENTAL | Retourneert `hb-NNNNNN`-handles. |
| `humans get` | `human.read` | Read | Ja | Nee | Geen | EXPERIMENTAL | Vereist `--handle=`. |
| `humans summary` | `humans.read` | Read | Ja | Nee | Geen | EXPERIMENTAL | Alleen aantallen. |
| `timetable get` | `timetable.read` | Read | Ja | Nee | Geen | STABLE_BETA | Toestand van de dienstregelingmanager. |
| `timetable tracks list` | `timetable.tracks.list` | Read | Ja | Nee | Geen | STABLE_BETA | Onderdeel van de capability `timetable.read`; batchleesbewijs 2026-09-20. |
| `timetable trips list` | `timetable.trips.list` | Read | Ja | Nee | Geen | STABLE_BETA | Zoals hierboven. |
| `timetable lines list` | `timetable.lines.list` | Read | Ja | Nee | Geen | STABLE_BETA | Zoals hierboven. |
| `timetable tours list` | `timetable.tours.list` | Read | Ja | Nee | Geen | STABLE_BETA | Zoals hierboven. |
| `timetable profiles list` | `timetable.profiles.list` | Read | Ja | Nee | Geen | STABLE_BETA | Zoals hierboven. |
| `timetable bus-stops list` | `timetable.bus-stops.list` | Read | Ja | Nee | Geen | STABLE_BETA | Zoals hierboven. |
| `timetable station-links list` | `timetable.station-links.list` | Read | Ja | Nee | Geen | STABLE_BETA | Zoals hierboven. |
| `timetable logs list` | `timetable.logs.read` | Read | Ja | Nee | Geen | STABLE_BETA | Zoals hierboven. |
| `drivers list` | `drivers.read` | Read | Ja | Nee | Geen | EXPERIMENTAL | Chauffeursrecords. |
| `tickets get` | `tickets.read` | Read | Ja | Nee | Geen | EXPERIMENTAL | Records van kaartjespakketten. |
| `hof get` | `vehicle.hofs.read` | Read | Ja | Nee | Geen | STABLE_BETA | Vereist `--handle=`. |
| `constants list` | `vehicle.constants.list` | Read | Ja | Nee | Geen | STABLE_BETA | Vereist `--handle=`. |
| `constants get` | `vehicle.constant.get` | Read | Ja | Nee | Geen | STABLE_BETA | Vereist `--handle=`, `--name=`. |
| `curves list` | `vehicle.curves.list` | Read | Ja | Nee | Geen | STABLE_BETA | Vereist `--handle=`. |
| `curves evaluate` | `vehicle.curve.evaluate` | Read | Ja | Nee | Geen | STABLE_BETA | Vereist `--handle=`, `--name=`, `--x=`. |
| `scripts variable list` | `vehicle.variables.list` | Read | Ja | Nee | Geen | EXPERIMENTAL | Vereist `--handle=`. |
| `scripts variable get` | `vehicle.variable.get` | Read | Ja | Nee | Geen | EXPERIMENTAL | Vereist `--handle=`, `--name=`. |
| `scripts variable set` | `vehicle.variable.set` | Write | Ja | Ja (scriptvariabele) | Geen, niet teruggedraaid | EXPERIMENTAL | Vereist `--handle=`, `--name=`, `--value=` (eindig getal). |
| `scripts string list` | `vehicle.string-variables.list` | Read | Ja | Nee | Geen | EXPERIMENTAL | Vereist `--handle=`. |
| `scripts string get` | `vehicle.string-variable.get` | Read | Ja | Nee | Geen | EXPERIMENTAL | Vereist `--handle=`, `--name=`. |
### Operaties zonder route
Deze openbare operatie-id's (`PublicCapabilityRegistry.PublicRuntimeOperationIds`) hebben geen hiërarchische route en worden aangeroepen met `/runtime:` plus `--key=value` of `/runtime-arg:key=value`: `timetable.rv-files.list`, `timetable.track-entries.list`, `timetable.tour-entries.list`, `d3d.status`, `d3d.texture.create` (`width`, `height`, `format` vereist; `levels` optioneel), `d3d.texture.describe` (`handle`; `level` optioneel), `d3d.texture.update` (`handle`, `width`, `height`, `pixels_base64` vereist; `level`, `x`, `y` optioneel), `d3d.texture.release` (`handle`). D3D-operaties zijn EXPERIMENTAL; de levenscyclus van textures en de invalidatie bij een apparaatreset zijn runtime-gevalideerd (runtime-closure `H02`, `D01`; zie [capabilities](https://omsilaunch.omsimods.com.br/nl/docs/reference/capabilities/index.md)). `timetable.track-entries.list` en `timetable.tour-entries.list` zijn begrensde lijsten: een resultaat dat niet in het runtime-slot past, wordt ingekort (`truncated=true`). `internal.road-vehicles.make-basic` is INTERNAL en wordt door zowel de CLI als de API geweigerd met `OL_E_RUNTIME_OPERATION_UNKNOWN`.
## Vlaggen
Elke vlag van `CliInput.KnownFlags`. "Fase" is *starttijd* (bepaalt de `LaunchSpec`/het plan van een nieuwe sessie), *runtime* (werkt op een actieve sessie) of *control* (verandert het gedrag van de CLI zelf). Vlaggen die alleen voor compatibiliteit worden geparseerd (`CliInput.AcceptedNoEffectFlags`), zijn op hun regel gemarkeerd.
### Besturing en uitvoer
| Vlag | Syntaxis en waarden | Standaard | Fase | Stabiliteit | Gedrag |
|---|---|---|---|---|---|
| `/?` | `/?` | uit | control | STABLE_BETA | Druk de gebruikstekst af, exit `0`. |
| `/help` | `/help` | uit | control | STABLE_BETA | Hetzelfde als `/?`. (Het losse woord `help` retourneert in plaats daarvan de gestructureerde catalogus.) |
| `/version` | `/version` | uit | control | STABLE_BETA | Envelope `version`, exit `0`. Wordt vóór elke andere opdracht geëvalueerd, behalve `/silent`. |
| `/json` | `/json` of `--json` | uit | control | STABLE_BETA | Geef JSON-envelopes uit; forceert ook console-uitvoer, zelfs onder `OmsiLaunchW.exe`. |
| `/quiet` | `/quiet` | uit | control | ACCEPTED_FOR_COMPATIBILITY / CURRENTLY_NO_EFFECT | Stelt `CliInput.Quiet` in; niets leest deze waarde. |
| `/silent` | `/silent` (ook `--silent`) | uit | control | EXPERIMENTAL | Delegeer de volledige opdrachtregel aan `OmsiLaunchW.exe` en retourneer `0` zodra het hostproces is gestart. De uitkomst van de sessie wordt gerapporteerd door `OmsiLaunchW.exe` (berichtvensters, systeemvakpictogram), `.omsilaunch\diagnostics` en het lokale control-endpoint. De delegatie en de foutdialoogvensters zijn runtime-gevalideerd (runtime-closure `T04`); zie [OmsiLaunchW.exe](https://omsilaunch.omsimods.com.br/nl/docs/reference/omsilaunchw/index.md). |
| `/serve` | `/serve` | uit | control | ACCEPTED_FOR_COMPATIBILITY / CURRENTLY_NO_EFFECT | Stelt `CliInput.Serve` in; niets leest deze waarde. Het control-endpoint wordt altijd door een eigenaar gestart. |
| `/verbose` | `/verbose` | uit | starttijd | PARTIAL | `DiagnosticsSpec.Verbose`. Waarden worden in de spec meegenomen; hun effect is beperkt tot de host-trace onder `.omsilaunch\diagnostics`. |
| `/log` | `/log` | aan (`DiagnosticsSpec.Log` staat standaard op `true`) | starttijd | PARTIAL | `DiagnosticsSpec.Log`. In de praktijk altijd aan. |
| `/logall` | `/logall` | uit | starttijd | PARTIAL | Stelt `Verbose`, `ProcessTrace`, `PluginTrace` en `NativeTrace` tegelijk in. |
| `/omsi-logall` | `/omsi-logall` | uit | starttijd | PARTIAL | `DiagnosticsSpec.OmsiLogAll`. |
| `/trace` | `/trace` | uit | starttijd | PARTIAL | Alias van `/trace-process`. |
| `/trace-process` | `/trace-process` | uit | starttijd | PARTIAL | `DiagnosticsSpec.ProcessTrace`. |
| `/trace-plugin` | `/trace-plugin` | uit | starttijd | PARTIAL | `DiagnosticsSpec.PluginTrace`. |
| `/trace-native` | `/trace-native` | uit | starttijd | PARTIAL | `DiagnosticsSpec.NativeTrace`. |
### Plannen, validatie en harnassen
| Vlag | Syntaxis en waarden | Standaard | Fase | Stabiliteit | Gedrag |
|---|---|---|---|---|---|
| `/plan` | `/plan` | uit | starttijd | STABLE_BETA | Bouw het `SessionPlan` en druk het af, zonder OMSI te starten. Exit `0` bij `IsRunnable`, anders `1`. Vereist een startselectie (`/new`, `/saved`, `/spec` of een installatieargument); `/plan` alleen, zonder iets anders, voert `detect` uit. |
| `/validate` | `/validate` | uit | starttijd | STABLE_BETA | Identiek aan `/plan` in deze build. |
| `/runtime-batch` | `/runtime-batch` | uit | runtime (eigenaar) | INTERNAL | Validatieharnas: voert na `Running` de set leesoperaties uit en schrijft `-runtime-read-batch.json`. |
| `/runtime-write-batch` | `/runtime-write-batch` | uit | runtime (eigenaar) | INTERNAL | Validatieharnas: leesacties plus `time.set`, `camera.set` en `vehicle.variable.set` met herstel; schrijft `-runtime-write-batch.json`. |
| `/d3d-batch` | `/d3d-batch` | uit | runtime (eigenaar) | INTERNAL | Validatieharnas voor de levenscyclus van D3D-textures; schrijft `-d3d-wave-d-batch.json`. |
| `/runtime` | `/runtime:` | geen | runtime | STABLE_BETA (dispatch) | Selecteer een openbare runtime-operatie op id. Clientmodus (geen installatieargument): doorgestuurd naar de eigenaar. Eigenaarmodus: één keer uitgevoerd na `Running`. Onbekende id's: `OL_E_RUNTIME_OPERATION_UNKNOWN`, exit `2`. |
| `/runtime-arg` | `/runtime-arg:=` (herhaalbaar) | geen | runtime | STABLE_BETA (dispatch) | Runtimeargument; gelijkwaardig aan `--key=value`. Ontbrekende `=`: `/runtime-arg requires key=value`, exit `2`. |
### Wereldselectie
| Vlag | Syntaxis en waarden | Standaard | Fase | Stabiliteit | Gedrag |
|---|---|---|---|---|---|
| `/new` | `/new` | `WorldMode.NewMap` is de standaardmodus, maar een start wordt alleen aangevraagd als een van `/new`, `/saved`, `/last`, `/spec` aanwezig is | starttijd | STABLE_BETA | NEW_MAP. Vereist `/map` en `/entrypoint-index` (een plan zonder index van een gepresenteerd instappunt meldt `OL_E_ENTRYPOINT_REQUIRED`; zonder `/map` wordt geen kaart bepaald). `/new` selecteert nooit stilzwijgend een kaart. |
| `/saved` | `/saved:` | geen | starttijd | STABLE_BETA | SAVED_SITUATION. Kaart en positie komen uit het `.osn`-bestand; `/map`, `/entrypoint`, `/entrypoint-index` worden in combinatie met `/saved` geweigerd (exit `2`). Ontbrekende situatie: `OL_E_SITUATION_NOT_FOUND`; ontbrekende kaart van de situatie: `OL_E_SITUATION_MAP_NOT_FOUND`. |
| `/last` | `/last` | geen | starttijd | UNAVAILABLE | LAST_MAP_STATE. Levert op dit profiel altijd `OL_E_CAPABILITY_UNAVAILABLE` op (niet uitvoerbaar, exit `1`); er wordt geen terugval op een `.osn` op basis van tijdstempels uitgevoerd. |
| `/map` | `/map:` (bijvoorbeeld `maps\Grundorf\global.cfg`) | geen | starttijd | STABLE_BETA | Kaartidentiteit voor `/new`, of het bereik voor `/list:Entrypoints`. Onbekend: `OL_E_MAP_NOT_FOUND`. |
| `/entrypoint` | `/entrypoint:` | geen | starttijd | UNAVAILABLE | Instappunt op label. Afgeschermd: het plan registreert `world.entrypoint-identity` als `RUNTIME_PARTIAL` en wordt niet uitvoerbaar (`OL_E_CAPABILITY_UNAVAILABLE`). Sluit `/entrypoint-index` uit (de identiteit heeft voorrang en wist de index). |
| `/entrypoint-index` | `/entrypoint-index:`, `0..2147483647` | geen | starttijd | STABLE_BETA | Index van het instappunt in de gepresenteerde lijst (op 1 gebaseerd, zoals OMSI de lijst presenteert). Vereist voor een uitvoerbaar NEW_MAP-plan. |
### Datum, tijd en weer
Alle vier worden geaccepteerd en in de `LaunchSpec` meegenomen, maar het native startpad past ze niet toe: de planner registreert ze als `STATICALLY_PARTIAL` **en voegt `OL_E_CAPABILITY_UNAVAILABLE` toe, zodat het plan NIET UITVOERBAAR is (exit `1`)**. Een `/spec`-bestand of sessieprofiel dat ze instelt, heeft hetzelfde effect.
| Vlag | Syntaxis en waarden | Standaard | Fase | Stabiliteit | Gedrag |
|---|---|---|---|---|---|
| `/date` | `/date:` of `/date:system` | niet ingesteld | starttijd | UNAVAILABLE | `DateSpec` expliciet/systeem. Niet-parseerbare waarde: `OL_E_INVALID_ARGUMENT`, exit `2`. |
| `/time` | `/time:` of `/time:system` | niet ingesteld | starttijd | UNAVAILABLE | `TimeSpec` expliciet/systeem. |
| `/year` | `/year:` of `/year:system` | niet ingesteld | starttijd | UNAVAILABLE | `YearSpec`. |
| `/weather` | `/weather:` | niet ingesteld | starttijd | UNAVAILABLE | `WeatherMode.Preset`. |
| `/weather-icao` | `/weather-icao:` | niet ingesteld | starttijd | UNAVAILABLE | `WeatherMode.Icao`. |
| `/weather-real` | `/weather-real` | niet ingesteld | starttijd | UNAVAILABLE | `WeatherMode.RealCurrent`. De laatste van `/weather`, `/weather-icao`, `/weather-real` heeft voorrang. |
### Spelersvoertuig
Geaccepteerd en bepaald aan de hand van de installatie, maar niet toegepast door de runtime: elk ingesteld veld is `STATICALLY_PARTIAL` en voegt `OL_E_CAPABILITY_UNAVAILABLE` toe (plan NIET UITVOERBAAR, exit `1`).
| Vlag | Syntaxis en waarden | Standaard | Fase | Stabiliteit | Gedrag |
|---|---|---|---|---|---|
| `/vehicle` | `/vehicle:` (`Vehicles\...\*.bus`) | niet ingesteld | starttijd | UNAVAILABLE | Wordt als eerste bepaald (`OL_E_VEHICLE_NOT_FOUND` als onbekend). |
| `/repaint` | `/repaint:` | niet ingesteld | starttijd | UNAVAILABLE | Wordt alleen samen met `/vehicle` bepaald (`OL_E_REPAINT_NOT_FOUND`). |
| `/hof` | `/hof:` | niet ingesteld | starttijd | UNAVAILABLE | `OL_E_HOF_NOT_FOUND` als onbekend. |
| `/fleet` | `/fleet:` | niet ingesteld | starttijd | UNAVAILABLE | Wagennummer. |
| `/registration` | `/registration:` | niet ingesteld | starttijd | UNAVAILABLE | Kenteken. |
| `/no-vehicle` | `/no-vehicle` | uit | starttijd | STABLE_BETA | Wist elk spelersvoertuig uit de basis (`/spec` of profiel). Onschadelijk. |
### Configuratie-overlays
| Vlag | Syntaxis en waarden | Standaard | Fase | Stabiliteit | Gedrag |
|---|---|---|---|---|---|
| `/set` | `/set:=` (herhaalbaar; sleutels niet hoofdlettergevoelig) | geen | starttijd | STABLE_BETA | Semantische `options.cfg`-overlay uit `ConfigurationCatalog` (bijvoorbeeld `graphics.maxFPS=60`, `traffic.randomVehicles=150`). Onbekende sleutel: `OL_E_UNKNOWN_SETTING` (exit `2`); alleen-lezen sleutel (`advanced.multithreadingCalculate`, `advanced.multithreadingTextureLoad`, `graphics.texture`, `graphics.textureFilter`): `OL_E_SETTING_NOT_WRITABLE` (exit `2`); waarde buiten bereik of ongeldig gevormd: `OL_E_INVALID_SETTING_VALUE` bij het opbouwen van de overlay. De overlay is een sessiewijziging: er wordt een snapshot van gemaakt, hij wordt toegepast voordat OMSI start en bij de stop byte voor byte hersteld (RV-005 `RUNTIME_PASS`). Conflicten met een sleutel die eigendom is van een preset van een geselecteerd profiel: `OL_E_SESSION_PROFILE_OVERRIDE_CONFLICT`. |
### Presentatie van het opstartscherm
| Vlag | Syntaxis en waarden | Standaard | Fase | Stabiliteit | Gedrag |
|---|---|---|---|---|---|
| `/splash` | `/splash:Managed`, `/splash:Native`, `/splash:Unset` (niet hoofdlettergevoelig) | `Managed` | starttijd | STABLE_BETA | `Managed`: de meegeleverde 24-bits BMP's van 640x480 worden één keer gekopieerd naar `\.omsilaunch\assets\splash`, en `GUI\NewSplashscreen_ENG.bmp` plus `GUI\NewSplashscreen_.bmp` worden transactioneel als overlay aangebracht en exact hersteld (RV-006 `RUNTIME_PASS`). `Native`/`Unset` (aliassen): OMSI-bestanden blijven onaangeroerd. Ontbrekende waarde: `/splash requires Unset, Native, or Managed`, exit `2`. |
| `/splash-language` | `/splash-language:PTB|ENG|DEU|FRA` (ook `pt-BR`, `de`, `fr`, `en`; al het andere valt terug op `ENG`) | `[language]` uit `options.cfg`, anders `ENG` | starttijd | STABLE_BETA | Selecteert het gelokaliseerde doelbestand. |
| `/splash-assets` | `/splash-assets:` (relatieve paden worden onder de installatiemap bepaald) | `\.omsilaunch\assets\splash`, anders de meegeleverde set | starttijd | STABLE_BETA | Aangepaste assetmap; moet `ENG.bmp` bevatten en, voor een niet-Engelse taal, `.bmp`. Fouten: `OL_E_SPLASH_ASSET_DIRECTORY_MISSING`, `OL_E_SPLASH_ASSET_MISSING`, `OL_E_SPLASH_FORMAT_UNSUPPORTED` (in het plan gemeld als `OL_E_SESSION_PRESENTATION_INVALID`; niet uitvoerbaar). |
### Internettextures
| Vlag | Syntaxis en waarden | Standaard | Fase | Stabiliteit | Gedrag |
|---|---|---|---|---|---|
| `/internet-textures` | `/internet-textures:Native|Disabled|Override` | `Native` | starttijd | EXPERIMENTAL | `Native`: onaangeroerd. `Disabled`: de geprofileerde downloader binnen het proces wordt onderdrukt. `Override`: het opgegeven `.itx`-profiel wordt als overlay `Texture\standard.itx` aangebracht; elk daarin vermeld HTTP(S)-doel plus `Texture\standard.ipr` worden sessieverwijderingen (voor de sessie verwijderd, bij de stop hersteld). Ontbrekende waarde: exit `2`. |
| `/internet-textures-profile` | `/internet-textures-profile:` | geen | starttijd | EXPERIMENTAL | Vereist bij `Override` (`OL_E_ITX_PROFILE_REQUIRED`, exit `2`). `OL_E_ITX_PROFILE_MISSING`, `OL_E_ITX_PROFILE_INVALID` (moet bestaan uit paren van URL- en doelregels met `http`/`https`-URL's), `OL_E_ITX_TARGET_OUTSIDE_TEXTURE_PATH` (doelen moeten onder `Texture\` uitkomen, zonder absolute paden, `..` of reparse points). |
### Sessieprofielen
| Vlag | Syntaxis en waarden | Standaard | Fase | Stabiliteit | Gedrag |
|---|---|---|---|---|---|
| `/predefined-profile` | `/predefined-profile:` | geen | starttijd | STABLE_BETA (compilatie; offline `OmsiLaunch.ProfileTests`) | Laadt `\.omsilaunch\session-profiles\\profile.yaml` (zie [sessieprofielen](https://omsilaunch.omsimods.com.br/nl/docs/reference/session-profiles/index.md)). Vereist `/predefined-profile-index` (`OL_E_SESSION_PROFILE_PRESET_NOT_FOUND`, exit `2`). Het `new:`-blok geldt alleen met `/new`; `compatibility.maps` wordt afgedwongen voor `/new` en `/saved` (`OL_E_SESSION_PROFILE_MAP_MISMATCH`). Expliciete vlaggen die botsen met een veld dat eigendom is van het profiel, worden geweigerd met `OL_E_SESSION_PROFILE_OVERRIDE_CONFLICT` (`CliInput.RejectProfileConflicts`): kaart/instappunt/datum/tijd/jaar/weer wanneer het `new:`-blok die bezit, `/set`-sleutels die eigendom zijn van de preset, opstartschermvlaggen wanneer de preset `presentation` heeft, internettexturevlaggen wanneer hij `internet-textures` heeft, timeouts wanneer hij `behavior` heeft. |
| `/predefined-profile-index` | `/predefined-profile-index:<1..5>` | geen | starttijd | STABLE_BETA | Selecteert de preset op `index`. Buiten bereik: exit `2`. |
### LaunchSpec-bestand
| Vlag | Syntaxis en waarden | Standaard | Fase | Stabiliteit | Gedrag |
|---|---|---|---|---|---|
| `/spec` | `/spec:` | geen | starttijd | STABLE_BETA (loader offline getest; sessiesemantiek identiek aan vlaggen) | Laadt een `LaunchSpec`-JSON-bestand als basis (zie [LaunchSpec](https://omsilaunch.omsimods.com.br/nl/docs/reference/launchspec/index.md)) en markeert dat een start is aangevraagd. Regels (`LaunchSpecJson`): het bestand moet bestaan (`OL_E_SPEC_NOT_FOUND`, exit `6`); maximaal 1 MiB (`OL_E_SPEC_TOO_LARGE`, exit `2`); de root moet een object zijn (`OL_E_SPEC_INVALID`); eigenschapsnamen niet hoofdlettergevoelig; `//`-commentaar en afsluitende komma's toegestaan; diepte maximaal 32; elke onbekende eigenschap wordt geweigerd met haar JSON-pad (`OL_E_SPEC_UNKNOWN_PROPERTY: $.Presentation.Foo`, exit `2`). |
**Voorrang** (`CliInput.BuildSpecAsync`): standaardwaarden → `/spec`-bestand → `/predefined-profile` (vervangt `Installation` en `World` en past daarna het profiel toe) → expliciete vlaggen. Een expliciet installatieargument gaat vóór `RootPath` in de spec. `/no-vehicle` wist het spelersvoertuig van de spec; `/vehicle` en verwante vlaggen worden er veld voor veld in samengevoegd. `/set`-sleutels worden samengevoegd in `Environment.General`. `/splash`, `/splash-language`, `/splash-assets`, `/internet-textures`, `/internet-textures-profile` overschrijven alleen als ze zijn opgegeven. `/startup-timeout` en `/shutdown-timeout` overschrijven alleen als ze zijn opgegeven; `Presentation.SuppressTrayIcon` komt alleen uit de spec (geen vlag). Diagnosevlaggen worden met OR gecombineerd met de `Diagnostics` van de spec.
### Inhoud ontdekken
| Vlag | Syntaxis en waarden | Standaard | Fase | Stabiliteit | Gedrag |
|---|---|---|---|---|---|
| `/list` | `/list:`; categorieën zijn de `ContentQueryKind`-waarden `Maps`, `Situations`, `Vehicles`, `Repaints`, `Hofs`, `FleetNumbers`, `Registrations`, `Addons`, `Entrypoints` (niet hoofdlettergevoelig) | geen | lokaal, geen sessie | STABLE_BETA | `DiscoverAsync` over de installatie; envelope `content.list` met items `Identity`, `Kind`, `DisplayName`; exit `0`. Onbekende categorie: `Unknown discovery category`, exit `2`. Reparse points (junctions/symlinks) worden overgeslagen, OMSI-bestanden worden gelezen als Windows-1252. |
| `/vehicle-scope` | `/vehicle-scope:` | geen | lokaal | STABLE_BETA | Bereik dat wordt doorgegeven voor elke categorie behalve `Entrypoints`, die `/map` als bereik gebruikt. |
### Timeouts en observatie
| Vlag | Syntaxis en waarden | Standaard | Fase | Stabiliteit | Gedrag |
|---|---|---|---|---|---|
| `/startup-timeout` | `/startup-timeout:<1..600>` seconden | waarde uit spec/profiel, anders `180` | starttijd | STABLE_BETA | `Behavior.StartupTimeoutSeconds`. De eigenaar wacht deze waarde plus 5 s op `Running`; `OL_E_STARTUP_TIMEOUT` beëindigt de sessie met exit `1`. |
| `/shutdown-timeout` | `/shutdown-timeout:<1..600>` seconden | waarde uit spec/profiel, anders `30` | starttijd | ACCEPTED_FOR_COMPATIBILITY / CURRENTLY_NO_EFFECT | Wordt meegenomen in `Behavior.ShutdownTimeoutSeconds`; de supervisor gebruikt deze waarde in deze build niet (OMSI wordt beëindigd, niet gevraagd om af te sluiten). |
| `/observe-seconds` | `/observe-seconds:<0..2147483647>` | geen (actief tot OMSI afsluit of een stop wordt aangevraagd) | runtime (eigenaar) | STABLE_BETA | Bovengrens voor de actieve fase: na `n` seconden in `Running` wordt de canonieke stop aangevraagd. Een stop via systeemvak of pipe, of het afsluiten van OMSI, beëindigt de fase eerder. `0` stopt direct na `Running`. |
### Recovery
| Vlag | Syntaxis en waarden | Standaard | Fase | Stabiliteit | Gedrag |
|---|---|---|---|---|---|
| `/recovery-status` | `/recovery-status` | uit | lokaal | STABLE_BETA | Rapporteert of `\.omsilaunch\journal.json` openstaat (`pending`), herstelt nooit; exit `0`. Neemt de installatielease: `OL_E_INSTALLATION_BUSY` (exit `7`) zolang een eigenaar die vasthoudt. |
| `/recover` | `/recover` | uit | lokaal | STABLE_BETA | Herstelt een openstaand journal (back-ups worden eerst gecontroleerd tegen de SHA-256 van de snapshot; `OL_E_RECOVERY_BACKUP_CORRUPT`, `OL_E_RECOVERY_ABSENT_OWNERSHIP_MISMATCH`, `OL_W_RESTORE_FOREIGN_FILE_RETAINED` worden gemeld in `diagnostics`). Exit `0` als er niets openstond of het herstel is voltooid; `8` als er een journal openstond en dat blijft openstaan. Geweigerd met `OL_E_INSTALLATION_BUSY` zolang het in het journal vastgelegde OMSI-proces (PID, aanmaaktijd, exe-pad) actief is, of, voor een journal voorbij `HandoffCreated` zonder PID, zolang enige `Omsi.exe` uit die root actief is. Elke sessiestart voert dezelfde recovery automatisch uit voordat de installatie wordt gelezen. |
## Uitvoerformaten
- **Envelope bij succes** (`CliInput.WriteEnvelope`, met `--json`): `{"ok": true, "command": "", "protocol_version": "0.1", "result":