hatchery-node 0.2.21

Hatchery node: the complete node kit over the gate4agent transport (PTY/inline sessions, file browser, local git, worktrees, mailbox, browser station, session restore)
Documentation

[package]
name = "hatchery-node"
version = "0.2.21"
edition = "2021"
license = "MIT"
repository = "https://github.com/ZENG3LD/hatchery"
description = "Hatchery node: the complete node kit over the gate4agent transport (PTY/inline sessions, file browser, local git, worktrees, mailbox, browser station, session restore)"

[lib]
name = "hatchery_node"

[[bin]]
name = "gate4agent-node"
path = "src/main.rs"

[dependencies]
ed25519-dalek = "2"
sha2 = "0.10"
hex = "0.4"
zeroize = "1"
getrandom = "0.3"
reqwest = { version = "0.12", default-features = false, features = ["rustls-tls"] }
hatchery-enroll = { path = "../hatchery-enroll", version = "0.2.21" }
hatchery-core = { path = "../hatchery-core", version = "0.2.21" }
hatchery-build = { path = "../hatchery-build", version = "0.2.21" }
base64 = "0.22"
# Standard kit cores, all from crates.io: dig2browser 0.5 (browser machine and
# stream), mail4agent 0.4 (lib face), session-restore libraries 0.1.x.
dig2browser = { version = "0.5.3", optional = true, default-features = false }
tokio-tungstenite = { version = "0.26", optional = true }
image = { version = "0.25", optional = true, default-features = false, features = ["jpeg"] }
futures-util = { version = "0.3", optional = true, default-features = false, features = ["sink", "std"] }
mail4agent = { version = "0.4.14", optional = true, default-features = false }
claude-session-restore = { version = "0.1.3", optional = true }
codex-session-restore = { version = "0.1.3", optional = true }
grok-session-restore = { version = "0.1.4", optional = true }
kimi-session-restore = { version = "0.1.4", optional = true }
gate4agent-adapters = { version = "0.5.4" }
gate4agent-catalog = { version = "0.5.2" }
gate4agent-handle = { version = "0.5.2" }
gate4agent-node-core = { version = "0.5.2" }
gate4agent-node-protocol = { version = "0.5.4" }
gate4agent-node-wire = { version = "0.5.4" }
gate4agent-runtime-native = { version = "0.5.4" }
gate4agent-wake = { version = "0.5.2", default-features = false, features = ["wake-routine", "wake-kimi"] }
gate4agent-testkit = { optional = true, version = "0.5.2" }
gate4agent-types = { version = "0.5.2" }
ring = "=0.17.14"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
thiserror = "2"
tokio = { version = "1", features = ["io-util", "macros", "net", "process", "rt", "signal", "sync", "time"] }
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
tesserax = { version = "0.1.1", default-features = false, features = ["server"], optional = true }
tesserax-http = { version = "0.1.1", default-features = false, optional = true }
uuid = { version = "1", features = ["v4"], optional = true }

[target.'cfg(unix)'.dependencies]
libc = "0.2"

[target.'cfg(windows)'.dependencies]
windows-sys = { version = "0.61", features = [
    "Win32_Foundation",
    "Win32_Security",
    "Win32_Security_Authorization",
    "Win32_Storage_FileSystem",
    "Win32_System_Diagnostics_ToolHelp",
    "Win32_System_Pipes",
    "Win32_System_Threading",
] }

[features]
# Full kit by default: there is no light mode.
default = ["kit"]
kit = ["m4a", "d2b", "session-restore", "wireguard", "memory", "local-server"]
# Mailbox (mail4agent 0.4): started automatically by the node binary.
m4a = ["dep:mail4agent"]
# Local browser machine (dig2browser).
d2b = ["dep:dig2browser", "dep:tokio-tungstenite", "dep:futures-util", "dep:image"]
# claude / codex / grok / kimi session restore.
session-restore = [
    "dep:claude-session-restore",
    "dep:codex-session-restore",
    "dep:grok-session-restore",
    "dep:kimi-session-restore",
]
# Kernel WireGuard for node<->C2. Either peer may dial. Not the UDP+ChaCha mesh
# underlay and not open_wireguard_daemon_stub. The driver may be replaced later;
# this build calls `ip link` / `wg`.
wireguard = ["gate4agent-node-core/wireguard"]
# Memory is exposed to agents only as a tool the agent chooses to call; the
# node never starts a memory daemon. Reserved: the tool registration lands with
# the memory4agent dependency; no code is gated on it yet.
memory = []
# Session-local HTTP pool (tesserax-http static + supervised http children).
local-server = ["dep:tesserax", "dep:tesserax-http", "dep:uuid"]
fixture = ["dep:gate4agent-testkit", "gate4agent-node-wire/fixture"]
# Cheap dig2browser-station named-pipe path reachability probe + node-local
# exclusive BrowserStationLease. The dig2browser crate dep itself is feature `d2b`.
# Feature off keeps browser_profile_id stub echo.
dig2-station-probe = []

[dev-dependencies]
hatchery-keystore = { path = "../hatchery-keystore", version = "0.2.21" }
tempfile = "3"
tokio = { version = "1", features = ["io-util", "macros", "net", "process", "rt-multi-thread", "signal", "sync", "time"] }
vt100 = "0.16"

[[test]]
name = "windows_fixture_local_node_snapshot_reconnect_controller_lease"
required-features = ["fixture"]

[[test]]
name = "unix_workspace_file_read_e2e"
required-features = ["fixture"]

[[test]]
name = "windows_workspace_file_read_e2e"
required-features = ["fixture"]

[[test]]
name = "unix_fixture_local_node_e2e"
required-features = ["fixture"]

[[test]]
name = "windows_context_pack_worktree_bundle_e2e"
required-features = ["fixture"]

[[test]]
name = "windows_fixture_runtime_policy_e2e"
required-features = ["fixture"]