Files
dev/Cargo.toml
T
zeekay db924855a0 feat: own the front door, consume upstream as submodules
Replaces the Rust tree. `code-rs/` was a fork of just-every/code carrying
its own copy of everything; `vendor/` held 219 MB of upstream snapshots
beside it. Both are gone.

In their place: Hanzo writes the command surface, upstream keeps the
engines. `crates/hanzo-dev/src/main.rs` is a real file that dispatches
into libraries — codex_tui::run_main, codex_exec::run_main, and the rest
— rather than an include! of upstream's 5156-line binary main. Owning the
front door is what makes a single unified command surface expressible.

Upstream arrives as submodules at upstream/codex and upstream/code, both
at latest. The gitlink is the pin, so no lockfile of hashes sits beside
it and a bump is a two-line diff instead of forty-five thousand. Crates
are consumed by ordinary path dependency; nothing is copied.

The whole Hanzo delta on upstream is sixteen anchored substitutions in
patches/codex.json, applied in place by `make prepare` and visible in one
`git -C upstream/codex status`. Each carries an exact match count, so
upstream moving the ground under one stops preparation and names the file
rather than branding the wrong line. Two are upstreamable: they publish
mcp_cmd, plugin_cmd and doctor from upstream's library instead of burying
them in its binary.

`dev` covers exec, login, logout, serve, resume, fork, review, agents,
queue, archive, unarchive, delete, cloud, mcp, plugin, doctor, features,
sandbox and completion. Auto Drive and the browser bridge are not ported
yet; migration/STATUS.md records that, and the defects the v1 patch was
already carrying, so they are fixed as features are ported rather than
copied across.

Releases build from the root after `make prepare`, with submodules
checked out. Scripts that existed only to manage a fork-diff — the
upstream-merge set and the codex path-dep check — go with the fork.
2026-09-07 18:51:26 -07:00

478 lines
19 KiB
TOML

[workspace]
members = ["crates/hanzo-dev", "crates/hanzo-config", "crates/hanzo-tui"]
exclude = ["upstream", "crates/hanzo-upstream"]
resolver = "2"
[workspace.package]
version = "0.7.0-dev.1"
# Track the edition for all workspace crates in one place. Individual
# crates can still override this value, but keeping it here means new
# crates created with `cargo new -w ...` automatically inherit the 2024
# edition.
edition = "2024"
license = "Apache-2.0"
[workspace.dependencies]
# Internal
codex-realtime-webrtc = { path = "upstream/codex/codex-rs/realtime-webrtc" }
app_test_support = { path = "upstream/codex/codex-rs/app-server/tests/common" }
codex-analytics = { path = "upstream/codex/codex-rs/analytics" }
codex-agent-graph-store = { path = "upstream/codex/codex-rs/agent-graph-store" }
codex-agent-identity = { path = "upstream/codex/codex-rs/agent-identity" }
codex-agent-roles = { path = "upstream/codex/codex-rs/agent-roles" }
codex-ansi-escape = { path = "upstream/codex/codex-rs/ansi-escape" }
codex-api = { path = "upstream/codex/codex-rs/codex-api" }
codex-attachment-store = { path = "upstream/codex/codex-rs/attachment-store" }
codex-aws-auth = { path = "upstream/codex/codex-rs/aws-auth" }
codex-app-server = { path = "upstream/codex/codex-rs/app-server" }
codex-app-server-transport = { path = "upstream/codex/codex-rs/app-server-transport" }
codex-app-server-daemon = { path = "upstream/codex/codex-rs/app-server-daemon" }
codex-app-server-client = { path = "upstream/codex/codex-rs/app-server-client" }
codex-app-server-protocol = { path = "upstream/codex/codex-rs/app-server-protocol" }
codex-app-server-protocol-noop-macros = { path = "upstream/codex/codex-rs/app-server-protocol-noop-macros" }
codex-app-server-test-client = { path = "upstream/codex/codex-rs/app-server-test-client" }
codex-apply-patch = { path = "upstream/codex/codex-rs/apply-patch" }
codex-arg0 = { path = "upstream/codex/codex-rs/arg0" }
codex-async-utils = { path = "upstream/codex/codex-rs/async-utils" }
codex-backend-client = { path = "upstream/codex/codex-rs/backend-client" }
codex-build-info = { path = "upstream/codex/codex-rs/build-info" }
codex-chatgpt = { path = "upstream/codex/codex-rs/chatgpt" }
codex-client = { path = "upstream/codex/codex-rs/codex-client" }
codex-collaboration-mode-templates = { path = "upstream/codex/codex-rs/collaboration-mode-templates" }
codex-cloud-config = { path = "upstream/codex/codex-rs/cloud-config" }
codex-cloud-tasks-client = { path = "upstream/codex/codex-rs/cloud-tasks-client" }
codex-cloud-tasks-mock-client = { path = "upstream/codex/codex-rs/cloud-tasks-mock-client" }
codex-code-mode = { path = "upstream/codex/codex-rs/code-mode" }
codex-code-mode-protocol = { path = "upstream/codex/codex-rs/code-mode-protocol" }
codex-code-mode-runtime = { path = "upstream/codex/codex-rs/code-mode-runtime" }
codex-home = { path = "upstream/codex/codex-rs/codex-home" }
codex-http-client = { path = "upstream/codex/codex-rs/http-client" }
codex-websocket-client = { path = "upstream/codex/codex-rs/websocket-client" }
codex-config = { path = "upstream/codex/codex-rs/config" }
codex-connectors = { path = "upstream/codex/codex-rs/connectors" }
codex-agent-extension = { path = "upstream/codex/codex-rs/ext/agent" }
codex-connectors-extension = { path = "upstream/codex/codex-rs/ext/connectors" }
codex-context-fragments = { path = "upstream/codex/codex-rs/context-fragments" }
codex-core = { path = "upstream/codex/codex-rs/core" }
codex-core-api = { path = "upstream/codex/codex-rs/core-api" }
codex-core-plugins = { path = "upstream/codex/codex-rs/core-plugins" }
codex-diagnostics = { path = "upstream/codex/codex-rs/diagnostics" }
codex-exec = { path = "upstream/codex/codex-rs/exec" }
codex-file-system = { path = "upstream/codex/codex-rs/file-system" }
codex-exec-server-protocol = { path = "upstream/codex/codex-rs/exec-server-protocol" }
codex-exec-server = { path = "upstream/codex/codex-rs/exec-server" }
codex-exec-server-test-support = { path = "upstream/codex/codex-rs/exec-server/tests/support" }
codex-execpolicy = { path = "upstream/codex/codex-rs/execpolicy" }
codex-extension-api = { path = "upstream/codex/codex-rs/ext/extension-api" }
codex-extension-items = { path = "upstream/codex/codex-rs/ext/items" }
codex-goal-extension = { path = "upstream/codex/codex-rs/ext/goal" }
codex-git-attribution = { path = "upstream/codex/codex-rs/ext/git-attribution" }
codex-guardian-v2 = { path = "upstream/codex/codex-rs/ext/guardian-v2" }
codex-history-notes-extension = { path = "upstream/codex/codex-rs/ext/history-notes" }
codex-image-generation-extension = { path = "upstream/codex/codex-rs/ext/image-generation" }
codex-external-agent-migration = { path = "upstream/codex/codex-rs/external-agent-migration" }
codex-experimental-api-macros = { path = "upstream/codex/codex-rs/codex-experimental-api-macros" }
codex-features = { path = "upstream/codex/codex-rs/features" }
codex-feedback = { path = "upstream/codex/codex-rs/feedback" }
codex-install-context = { path = "upstream/codex/codex-rs/install-context" }
codex-file-search = { path = "upstream/codex/codex-rs/file-search" }
codex-file-watcher = { path = "upstream/codex/codex-rs/file-watcher" }
codex-git-utils = { path = "upstream/codex/codex-rs/git-utils" }
codex-guardian-context = { path = "upstream/codex/codex-rs/guardian-context" }
codex-hooks = { path = "upstream/codex/codex-rs/hooks" }
codex-history = { path = "upstream/codex/codex-rs/history" }
codex-keyring-store = { path = "upstream/codex/codex-rs/keyring-store" }
codex-linux-sandbox = { path = "upstream/codex/codex-rs/linux-sandbox" }
codex-lmstudio = { path = "upstream/codex/codex-rs/lmstudio" }
codex-login = { path = "upstream/codex/codex-rs/login" }
codex-message-history = { path = "upstream/codex/codex-rs/message-history" }
codex-memories-extension = { path = "upstream/codex/codex-rs/ext/memories" }
codex-web-search-extension = { path = "upstream/codex/codex-rs/ext/web-search" }
codex-memories-read = { path = "upstream/codex/codex-rs/memories/read" }
codex-memories-write = { path = "upstream/codex/codex-rs/memories/write" }
codex-mcp = { path = "upstream/codex/codex-rs/codex-mcp" }
codex-mcp-extension = { path = "upstream/codex/codex-rs/ext/mcp" }
codex-model-provider-info = { path = "upstream/codex/codex-rs/model-provider-info" }
codex-models-manager = { path = "upstream/codex/codex-rs/models-manager" }
codex-mxc-sandbox = { path = "upstream/codex/codex-rs/mxc-sandbox" }
codex-network-proxy = { path = "upstream/codex/codex-rs/network-proxy" }
codex-ollama = { path = "upstream/codex/codex-rs/ollama" }
codex-otel = { path = "upstream/codex/codex-rs/otel" }
codex-otel-trace-websocket = { path = "upstream/codex/codex-rs/otel-trace-websocket" }
codex-plugin = { path = "upstream/codex/codex-rs/plugin" }
codex-model-provider = { path = "upstream/codex/codex-rs/model-provider" }
codex-process-hardening = { path = "upstream/codex/codex-rs/process-hardening" }
codex-protocol = { path = "upstream/codex/codex-rs/protocol" }
codex-prompts = { path = "upstream/codex/codex-rs/prompts" }
codex-queue-extension = { path = "upstream/codex/codex-rs/ext/queue" }
codex-responses-api-proxy = { path = "upstream/codex/codex-rs/responses-api-proxy" }
codex-response-debug-context = { path = "upstream/codex/codex-rs/response-debug-context" }
codex-rmcp-client = { path = "upstream/codex/codex-rs/rmcp-client" }
codex-rollout = { path = "upstream/codex/codex-rs/rollout" }
codex-rollout-trace = { path = "upstream/codex/codex-rs/rollout-trace" }
codex-sandboxing = { path = "upstream/codex/codex-rs/sandboxing" }
codex-secrets = { path = "upstream/codex/codex-rs/secrets" }
codex-shell-command = { path = "upstream/codex/codex-rs/shell-command" }
codex-shell-escalation = { path = "upstream/codex/codex-rs/shell-escalation" }
codex-skills-extension = { path = "upstream/codex/codex-rs/ext/skills" }
codex-skills = { path = "upstream/codex/codex-rs/skills" }
codex-state = { path = "upstream/codex/codex-rs/state" }
codex-stdio-to-uds = { path = "upstream/codex/codex-rs/stdio-to-uds" }
codex-terminal-detection = { path = "upstream/codex/codex-rs/terminal-detection" }
codex-test-binary-support = { path = "upstream/codex/codex-rs/test-binary-support" }
codex-thread-store = { path = "upstream/codex/codex-rs/thread-store" }
codex-tools = { path = "upstream/codex/codex-rs/tools" }
codex-tui = { path = "upstream/codex/codex-rs/tui" }
codex-uds = { path = "upstream/codex/codex-rs/uds" }
codex-utils-absolute-path = { path = "upstream/codex/codex-rs/utils/absolute-path" }
codex-utils-approval-presets = { path = "upstream/codex/codex-rs/utils/approval-presets" }
codex-utils-audio = { path = "upstream/codex/codex-rs/utils/audio" }
codex-utils-cache = { path = "upstream/codex/codex-rs/utils/cache" }
codex-utils-cargo-bin = { path = "upstream/codex/codex-rs/utils/cargo-bin" }
codex-utils-cli = { path = "upstream/codex/codex-rs/utils/cli" }
codex-utils-elapsed = { path = "upstream/codex/codex-rs/utils/elapsed" }
codex-utils-fuzzy-match = { path = "upstream/codex/codex-rs/utils/fuzzy-match" }
codex-utils-git-discovery = { path = "upstream/codex/codex-rs/utils/git-discovery" }
codex-utils-home-dir = { path = "upstream/codex/codex-rs/utils/home-dir" }
codex-utils-image = { path = "upstream/codex/codex-rs/utils/image" }
codex-utils-json-to-toml = { path = "upstream/codex/codex-rs/utils/json-to-toml" }
codex-utils-oss = { path = "upstream/codex/codex-rs/utils/oss" }
codex-utils-output-truncation = { path = "upstream/codex/codex-rs/utils/output-truncation" }
codex-utils-path = { path = "upstream/codex/codex-rs/utils/path-utils" }
codex-utils-path-uri = { path = "upstream/codex/codex-rs/utils/path-uri" }
codex-utils-plugins = { path = "upstream/codex/codex-rs/utils/plugins" }
codex-utils-pty = { path = "upstream/codex/codex-rs/utils/pty" }
codex-utils-redacted-string = { path = "upstream/codex/codex-rs/utils/redacted-string" }
codex-utils-rustls-provider = { path = "upstream/codex/codex-rs/utils/rustls-provider" }
codex-utils-sandbox-summary = { path = "upstream/codex/codex-rs/utils/sandbox-summary" }
codex-worktree = { path = "upstream/codex/codex-rs/worktree" }
codex-utils-sleep-inhibitor = { path = "upstream/codex/codex-rs/utils/sleep-inhibitor" }
codex-utils-stream-parser = { path = "upstream/codex/codex-rs/utils/stream-parser" }
codex-utils-string = { path = "upstream/codex/codex-rs/utils/string" }
codex-utils-template = { path = "upstream/codex/codex-rs/utils/template" }
codex-user-verification = { path = "upstream/codex/codex-rs/user-verification" }
codex-v8-poc = { path = "upstream/codex/codex-rs/v8-poc" }
codex-workload-identity = { path = "upstream/codex/codex-rs/workload-identity" }
codex-windows-sandbox = { path = "upstream/codex/codex-rs/windows-sandbox-rs" }
core_test_support = { path = "upstream/codex/codex-rs/core/tests/common" }
# External
learning_mode_windows = { git = "https://github.com/microsoft/mxc", rev = "6cd3d58f05d3447e67109cfb75e042803b843ca4" }
wxc_common = { git = "https://github.com/microsoft/mxc", rev = "6cd3d58f05d3447e67109cfb75e042803b843ca4" }
age = "0.11.1"
ansi-to-tui = "8.0.1"
anyhow = "1"
appcontainer_common = { git = "https://github.com/microsoft/mxc", rev = "6cd3d58f05d3447e67109cfb75e042803b843ca4" }
arboard = { version = "3", features = ["wayland-data-control"] }
arc-swap = "1.9.0"
assert_cmd = "2"
assert_matches = "1.5.0"
async-channel = "2.3.1"
async-io = "2.6.0"
async-stream = "0.3.6"
aws-config = "1"
aws-credential-types = "1"
aws-sigv4 = "1"
aws-types = "1"
axum = { version = "0.8", default-features = false }
base64 = "0.22.1"
bitflags = "2.13.1"
blake3 = "1.8.2"
bm25 = "2.3.2"
bytes = "1.10.1"
chardetng = "0.1.17"
chrono = "0.4.43"
clap = "4"
clap_complete = "4"
clatter = { version = "2.2.0", default-features = false, features = [
"alloc",
"getrandom",
"use-25519",
"use-aes-gcm",
"use-rust-crypto-ml-kem",
"use-sha",
] }
color-eyre = "0.6.3"
constant_time_eq = "0.3.1"
crossbeam-channel = "0.5.15"
crypto_box = { version = "0.9.1", features = ["seal"] }
crossterm = "0.29.0"
ctor = "0.6.3"
deno_core_icudata = "0.77.0"
derive_more = "2"
diffy = "0.4.2"
dirs = "6"
divan = "0.1.21"
dns-lookup = "3.0.1"
dotenvy = "0.15.7"
dunce = "1.0.4"
ed25519-dalek = { version = "2.2.0", features = ["pkcs8"] }
encoding_rs = "0.8.35"
eventsource-stream = "0.2.3"
flate2 = "1.1.8"
futures = { version = "0.3", default-features = false }
gethostname = "1.1.0"
gix = { version = "0.81.0", default-features = false, features = ["sha1"] }
gix-url = "0.35.2"
glob = "0.3"
globset = "0.4"
hmac = "0.12.1"
http = "1.3.1"
httpdate = "1.0.3"
iana-time-zone = "0.1.64"
icu_decimal = "2.1"
icu_locale_core = "2.1"
icu_provider = { version = "2.1", features = ["sync"] }
ignore = "0.4.23"
image = { version = "^0.25.9", default-features = false }
include_dir = "0.7.4"
indexmap = "2.12.0"
insta = "1.46.3"
inventory = "0.3.19"
itertools = "0.14.0"
jsonptr = { version = "0.7.1", default-features = false }
jsonwebtoken = "9.3.1"
keyring = { version = "3.6", default-features = false }
landlock = "0.4.4"
lazy_static = "1"
libc = "0.2.182"
# Keep SQLx's bundled SQLite on a version containing the WAL-reset corruption fix:
# https://www.sqlite.org/wal.html#the_wal_reset_bug
libsqlite3-sys = { version = "0.37", default-features = false }
log = "0.4"
lru = "0.18.2"
maplit = "1.0.2"
memchr = "2.7.6"
mime_guess = "2.0.5"
multimap = "0.10.0"
notify = "8.2.0"
nucleo = { git = "https://github.com/helix-editor/nucleo.git", rev = "4253de9faabb4e5c6d81d946a5e35a90f87347ee" }
once_cell = "1.20.2"
openssl-sys = "*"
opentelemetry = "0.31.0"
opentelemetry-appender-tracing = "0.31.0"
opentelemetry-otlp = "0.31.0"
opentelemetry-semantic-conventions = "0.31.0"
opentelemetry_sdk = "0.31.0"
os_info = "3.12.0"
owo-colors = "4.3.0"
pathdiff = "0.2"
portable-pty = "0.9.0"
predicates = "3"
pretty_assertions = "1.4.1"
pulldown-cmark = { version = "0.10", default-features = false }
quick-xml = "0.41.0"
rand = "0.9"
ratatui = { version = "0.30.2", default-features = false, features = [
"crossterm",
"layout-cache",
"underline-color",
] }
ratatui-macros = "0.7.2"
rcgen = { version = "0.14.7", default-features = false, features = [
"aws_lc_rs",
"pem",
] }
regex = "1.12.3"
regex-lite = "0.1.8"
reqwest = { version = "0.12", features = ["cookies"] }
rmcp = { version = "=3.2.0", default-features = false }
runfiles = { git = "https://github.com/dzbarsky/rules_rust", rev = "b56cbaa8465e74127f1ea216f813cd377295ad81" }
rustix = { version = "1.1.4", features = ["net"] }
rustls = { version = "0.23", default-features = false, features = [
"aws_lc_rs",
"std",
] }
rustls-native-certs = "0.8.3"
rustls-pki-types = "1.14.0"
schemars = "0.8.22"
seccompiler = "0.5.0"
semver = "1.0"
sentry = "0.46.0"
serde = { version = "1", features = ["rc"] }
serde_ignored = "0.1.14"
serde_json = "1"
serde_path_to_error = "0.1.20"
serde_with = "3.17"
serde_yaml = "0.9"
serial_test = "3.2.0"
sha1 = "0.10.6"
scopeguard = "1.2.0"
sha2 = "0.10"
shlex = "1.3.0"
similar = "2.7.0"
symphonia = { version = "0.6.0", default-features = false, features = [
"isomp4",
"mkv",
"mp3",
"ogg",
"wav",
] }
socket2 = "0.6.1"
# When bumping sqlx, audit the SQLite constructor deny list in clippy.toml.
sqlx = { version = "0.9.0", default-features = false, features = [
"chrono",
"json",
"macros",
"migrate",
"runtime-tokio",
"tls-rustls",
"sqlite-bundled",
"time",
"uuid",
] }
starlark = { version = "0.14.2", default-features = false }
strum = "0.27.2"
strum_macros = "0.28.0"
supports-color = "3.0.2"
syntect = "5"
sys-locale = "0.3.2"
system-configuration = "0.7"
tar = { version = "=0.4.45", default-features = false }
tempfile = "3.23.0"
test-log = "0.2.19"
textwrap = "0.16.2"
thiserror = "2.0.17"
tikv-jemallocator = "=0.7.0"
time = "0.3.47"
tiny_http = "0.12"
tokio = "1"
tokio-rustls = "0.26.4"
tokio-stream = "0.1.18"
tokio-test = "0.4"
tokio-tungstenite = { version = "0.28.0", features = [
"proxy",
"rustls-tls-native-roots",
] }
tokio-util = "0.7.18"
toml = "0.9.5"
toml_edit = "0.24.0"
tracing = "0.1.44"
tracing-appender = "0.2.3"
tracing-opentelemetry = "0.32.0"
tracing-subscriber = "0.3.22"
tracing-test = "0.2.5"
tonic = { version = "0.14.3", default-features = false, features = ["channel", "codegen"] }
tonic-prost = "0.14.3"
tree-sitter = "0.25.10"
tree-sitter-bash = "0.25"
tree-sitter-powershell = "=0.26.4"
ts-rs = "11"
tungstenite = { version = "0.27.0", features = ["deflate", "proxy"] }
uds_windows = "1.1.0"
unicode-segmentation = "1.12.0"
unicode-width = "0.2"
url = "2"
urlencoding = "2.1"
uuid = "1"
v8 = "=150.4.0"
vt100 = "0.16.2"
walkdir = "2.5.0"
webbrowser = "1.2.2"
which = "8"
whoami = "1.6.1"
wildmatch = "2.6.1"
winapi-util = "0.1.11"
zip = "2.4.2"
zstd = "0.13"
wiremock = "0.6"
zeroize = "1.8.2"
[workspace.lints]
rust = {}
[workspace.lints.clippy]
await_holding_invalid_type = "deny"
await_holding_lock = "deny"
disallowed_methods = "deny"
expect_used = "deny"
identity_op = "deny"
manual_clamp = "deny"
manual_filter = "deny"
manual_find = "deny"
manual_flatten = "deny"
manual_map = "deny"
manual_memcpy = "deny"
manual_non_exhaustive = "deny"
manual_ok_or = "deny"
manual_range_contains = "deny"
manual_retain = "deny"
manual_strip = "deny"
manual_try_fold = "deny"
manual_unwrap_or = "deny"
needless_borrow = "deny"
needless_borrowed_reference = "deny"
needless_collect = "deny"
needless_late_init = "deny"
needless_option_as_deref = "deny"
needless_question_mark = "deny"
needless_update = "deny"
redundant_clone = "deny"
redundant_closure = "deny"
redundant_closure_for_method_calls = "deny"
redundant_static_lifetimes = "deny"
trivially_copy_pass_by_ref = "deny"
uninlined_format_args = "deny"
unnecessary_filter_map = "deny"
unnecessary_lazy_evaluations = "deny"
unnecessary_sort_by = "deny"
unnecessary_to_owned = "deny"
unwrap_used = "deny"
# cargo-shear cannot see the platform-specific openssl-sys usage, so we
# silence the false positive here instead of deleting a real dependency.
[workspace.metadata.cargo-shear]
ignored = [
"icu_provider",
"openssl-sys",
"codex-v8-poc",
]
[profile.dev]
# Keep line tables/backtraces while avoiding expensive full variable debug info
# across local dev builds.
debug = "limited"
[profile.dev-small]
inherits = "dev"
opt-level = 0
debug = "none"
strip = "symbols"
[profile.release]
lto = "thin"
debug = "line-tables-only"
split-debuginfo = "off"
# Keep release binaries symbolicateable until packaging has archived the
# sidecar symbols and stripped the binaries.
strip = false
# Balance parallel release code generation against binary size.
codegen-units = 4
[profile.profiling]
inherits = "release"
debug = "full"
lto = false
strip = false
[profile.ci-test]
# Reduce binary size to reduce disk pressure.
debug = "limited"
inherits = "test"
opt-level = 0
[patch.crates-io]
# Uncomment to debug local changes.
# ratatui = { path = "upstream/codex/codex-rs/../../ratatui" }
crossterm = { git = "https://github.com/openai-oss-forks/crossterm", rev = "45fecb9508105988f42fe6ff0441783ed3717f92" }
tokio-tungstenite = { git = "https://github.com/openai-oss-forks/tokio-tungstenite", rev = "0e5b2d73aa18dd9f0a50ee9ff199d5aef7594186" }
tungstenite = { git = "https://github.com/openai-oss-forks/tungstenite-rs", rev = "4fffad30fe373adbdcffab9545e9e9bf4f2fc19f" }
# Uncomment to debug local changes.
# rmcp = { path = "upstream/codex/codex-rs/../../rust-sdk/crates/rmcp" }
[patch."ssh://[email protected]/openai-oss-forks/tungstenite-rs.git"]
tungstenite = { git = "https://github.com/openai-oss-forks/tungstenite-rs", rev = "4fffad30fe373adbdcffab9545e9e9bf4f2fc19f" }