Skip to content

v0.5.0

Choose a tag to compare

@github-actions github-actions released this 13 Jun 13:11
f94aa15

Adds the Lifecycle modality (graceful shutdown), a one-shot camera
screenshot, inventory thumbnail fetching, and engine/renderer host PIDs in
Info. Also breaking: the Dash modality is redesigned from a flat tree to
a tab/control model (gRPC route / C# surface / Python client + CLI all change),
so update the ResoniteIO mod and the resoio Python package in lockstep.

Added

  • Lifecycle.Shutdown RPC: A new Lifecycle modality with a unary
    Shutdown RPC that asks the engine to quit gracefully
    (Engine.RequestShutdown, the in-app Quit path). The mod schedules the
    shutdown on the engine tick and ACKs before the process tears down, so the
    RPC returns promptly and the engine exits asynchronously. Exposed as
    LifecycleClient.shutdown()
  • ServerInfo.resonite_pid / renderer_pid: Info.GetServerInfo now also
    reports the engine (Resonite.exe) and renderer (Renderite.Renderer.exe)
    host PIDs. The engine runs natively on Linux (is_wine=false), so
    resonite_pid (Environment.ProcessId) and renderer_pid
    (RenderSystem.RendererProcess, 0 when headless) are real host kernel PIDs.
    Surfaced on ServerInfo and in the resoio info output (new resonite_pid= /
    renderer_pid= lines)
  • resoio terminate / resoio.terminate: Stops the running Resonite client
    gracefully — it reads the engine PID from Info (for reporting) and sends
    Lifecycle.Shutdown; the engine quits itself and Steam/Proton reaps the
    renderer + launch wrappers. A pure gRPC call (no OS signals), so it works from
    anywhere the UDS is reachable. Prints / returns the engine's host PID, or
    "resonite not running" / None when no engine is reachable
  • CameraClient.shot() and resoio screenshot: A convenience method that
    captures a single Camera frame and closes the stream (instead of opening a
    stream and breaking on the first frame), plus a CLI command that saves it as
    an opaque PNG. resoio screenshot takes -o / --output (a .png path or
    - for stdout) and otherwise writes a timestamped
    screenshot_<timestamp>.png to the current directory. The PNG drops the alpha
    channel, because the engine framebuffer's non-opaque alpha would otherwise
    render washed-out in image viewers. Exposed as CameraClient.shot()
  • Inventory.FetchThumbnail RPC: A unary RPC that returns the thumbnail
    image of an inventory item, resolving the item's Record.ThumbnailURI
    server-side and returning the raw image bytes plus their content type (e.g.
    "image/webp", returned verbatim from the Resonite CDN, not re-encoded).
    Exposed as InventoryClient.fetch_thumbnail() (returning the new
    InventoryThumbnail dataclass) and the thumb command in the interactive
    resoio inventory REPL

Changed

  • Breaking — the Dash modality is redesigned to a tab/control model: the
    flat-tree contract (GetTree / ListScreens / SetScreen with the
    DashTree / DashElement / DashRect / DashScreen / DashScreenList
    messages) is replaced by a tab-first model. The bottom tab bar is enumerated
    with ListTabsDashTabList, the current tab's controls (Button /
    ScrollRect) with ListControlsDashControlList, and a new SetTab RPC
    switches tabs (Open / Close / GetState / Invoke / Scroll /
    Highlight are retained). On the Python side the DashTree / DashElement /
    DashScreen dataclasses are replaced by DashTab / DashControl, and the
    resoio dash CLI is restructured into open / close / state / tabs /
    tab / ls / invoke / scroll / highlight (tab navigation first, then
    control interaction within the current tab). The gRPC route is wire-broken by
    the message/RPC changes — update the ResoniteIO mod and the resoio Python
    package in lockstep