jevsnes.git / third-party / rust / Cargo.toml
1[package]
2name = "rust-third-party"
3version = "0.0.0"
4edition = "2024"
5publish = false
6
7[lib]
8path = "top/lib.rs"
9
10# reindeer reads this manifest to generate the Buck2 third-party graph.
11[dependencies]
12# bot.log rotation (apps/native): a dedicated pipe-reading thread owns the
13# file, so rotation can never race the C bot's own printf.
14file-rotate = "0.7"
15snes-core = { path = "jgenesis/backend/snes-core" }
16jgenesis-common = { path = "jgenesis/common/jgenesis-common" }
17snes-config = { path = "jgenesis/config/snes-config" }
18# SaveWriter's serialized methods are generic over bincode's traits, so an
19# implementor names them. Same major as jgenesis, so one copy in the graph.
20#
21# 2.0.1 is the last bincode that compiles. 3.0.0 on crates.io is a tombstone:
22# a README announcing the crate is unmaintained and a lib.rs that is one
23# `compile_error!` (downloaded and read 2026-09-20). Leaving bincode means
24# jgenesis leaving it first, since these are ITS trait bounds.
25bincode = "2"
26
27# The native window (and later the web page): one immediate-mode UI that
28# builds for both. wgpu rather than glow so the picture path is the same
29# API on desktop (Vulkan/GL) and in the browser (WebGPU/WebGL2).
30eframe = { version = "0.36", default-features = false, features = ["wgpu", "default_fonts", "wayland", "x11"] }
31egui = "0.36"
32# Audio out. `pulseaudio` is cpal's pure-Rust PulseAudio client, and cpal
33# prefers it over ALSA when it answers: WSLg's sound server IS PulseAudio
34# ($PULSE_SERVER), and nothing on this host routes ALSA into it.
35cpal = { version = "0.18", features = ["pulseaudio"] }
36# The emulator thread of control fills this and cpal's realtime callback
37# drains it; a callback must never block, so the queue is lock-free. This is
38# the crate cpal's own `feedback` example uses.
39ringbuf = "0.5"
40# `Color` is `repr(C)` and `Pod`, so a frame IS its RGBA bytes; this is how
41# that gets said without a copy. Already in the graph through jgenesis.
42bytemuck = "1"
43# The core's own CRC crate, for naming the cartridge a snapshot belongs to.
44crc = "3.4.0"
45# Server: the window, over HTTP, and `native mcp`, over stdio. Client: what
46# `native mcp` reaches the window with. reqwest comes in without a TLS stack,
47# which loopback does not need.
48rmcp = { version = "3.4.0", default-features = false, features = ["server", "client", "macros", "transport-streamable-http-server", "transport-streamable-http-client-reqwest", "transport-io"] }
49# `SessionStore` is an async trait in rmcp's terms. Already in the graph
50# through rmcp.
51async-trait = "0.1.92"
52tokio = { version = "1.53.1", features = ["rt", "net", "sync", "macros", "time", "io-util"] }
53axum = { version = "0.8.9", default-features = false, features = ["http1", "tokio"] }
54# Jev: ~/jevcrates, as the git submodule beside this file, pinned by its
55# gitlink. jev-http speaks HTTP/2 itself over rustls with the RustCrypto
56# provider - pure Rust, no C, no cmake, the same choice ~/dashboard's HTTPS
57# transport makes - and the compiled-in Mozilla roots, not /etc/ssl.
58# `packages/mcp` names rustls and the provider directly as well.
59jev-protocol = { path = "jevcrates/jev-protocol" }
60jev-client = { path = "jevcrates/jev-client" }
61jev-http = { path = "jevcrates/jev-http" }
62rustls = { version = "0.23", default-features = false, features = ["std", "tls12"] }
63rustls-rustcrypto = { git = "https://github.com/RustCrypto/rustls-rustcrypto", branch = "master" }
64
65serde = { version = "1.0.229", features = ["derive"] }
66serde_json = "1.0.151"
67schemars = "1.2.2"
68png = "0.18.1"
69# zstd over `packages/replay`'s XOR keyframe deltas. ruzstd is a pure-Rust
70# zstd (real zstd frames), so no C and no cmake, the same reasoning as the
71# TLS stack above. Its encoder implements only `Fastest` (about zstd level
72# 1), which is enough on deltas that are mostly zero. Already in the graph
73# through `object`, so this adds no crate.
74ruzstd = "0.8"
75base64 = "0.23.1"
76
77# Subsecond hot-patching (see research/subsecond-patch-build.md): `subsecond`
78# is what a patched-in-place binary links (call/try_call/apply_patch/
79# aslr_reference); `subsecond-types` is the JumpTable the patch tool
80# serializes and the running binary deserializes. Pinned to the newest 0.7.x
81# (0.8 is alpha-only on crates.io as of 2026-09-20).
82subsecond = "0.7.10"
83subsecond-types = "0.7.10"
84# `tools/hotpatch` builds the stub object + jump table with these: `object`
85# for reading/writing ELF symbol tables (same crate dx itself uses,
86# packages/cli/Cargo.toml), `ar` for pulling `.o` members out of a `.rlib`
87# when a patch spans more than the tip crate, `libc` to reset SIGPIPE
88# (code-rust.md's CLI hygiene rule) - already in the graph transitively via
89# `subsecond`, named here directly so it gets a plain third-party alias.
90object = { version = "0.37", features = ["read", "write"] }
91ar = "0.9"
92libc = "0.2"
93
94# Path dependencies inside a workspace root become its members automatically,
95# which would make cargo resolve jgenesis's `workspace = true` keys against
96# THIS manifest. Excluding the trees leaves them under their own workspace roots.
97[workspace]
98exclude = ["jgenesis", "jevcrates"]