//! alkssh — the alk family's SSH adapter (the alkhttp-style door for the //! SSH protocol): a thin wrapper around russh terminating the vanilla-ssh //! wire and bridging to/from alkcall channels (the `alk/ssh` ALPN). //! //! No SSH framing is authored in-family (family ADR-003): russh owns the //! wire, and the crate's substance is the channel-type mappings — //! session/pty → alktty, direct/forwarded-tcpip → alktunnels, git exec → //! alkgit, sftp → alkfs later (a declining placeholder until then), each //! behind its cargo feature. Git over SSH is exec-only (ADR-006): a //! subsystem request can never carry the repository, so it declines. A //! client opening an unfeatured or unimplemented channel type gets a //! clean decline — never a half-capability, never a silent fallback; the //! default build (no features) is structurally incapable of serving //! anything but declines. //! //! Identity is the family's, not SSH's: a verified key's fingerprint → //! alkcall `IdentityProvider`. Keys the crate holds (client dial keys, //! host keys) come from alkvault-backed sources — vault-encrypted at //! rest, decrypted at use (ADR-005), never env vars. //! //! Architecture: `docs/architecture/` (phase 1 — ADRs 001–006 accepted; //! the dependency surface, feature graph, and wave-1 foundations are //! landed; the server stack, the mappings, the client direction, and //! validation are later implementation waves — wave 2 decomposes after //! this gate). See also `docs/research/` and family ADR-003. mod adapter; mod channel_cap; mod config; mod dispatch; mod error; mod fingerprint; mod handler; mod host_key; mod key_source; mod observe; mod serve; pub use adapter::SshAdapter; #[cfg(feature = "git")] pub use config::GitSeam; #[cfg(feature = "session")] pub use config::SessionSeam; pub use config::{DialConfig, Limits, ServeConfig}; pub use error::{AdapterError, KeySourceError}; pub use fingerprint::fingerprint; /// Contract-test surface (`#[doc(hidden)]`): the per-connection auth /// bridge handler — constructible so the tests drive its hooks directly /// against the wave-1 doubles (see `handler.rs` §Test surface). Not /// documented API: the wire-facing surface is exactly `SshAdapter` + /// the config/error/host/key-source types. #[doc(hidden)] pub use handler::SessionHandler; pub use host_key::{HostKeyPolicy, PresentedHostKey, RejectAll}; pub use key_source::{HostKeySource, KeySource, VaultHostKeySource, VaultKeySource}; /// Contract-test surface (`#[doc(hidden)]`): the spawn-and-return /// plumbing (`ADR-006 decision 4`, see `serve.rs`) — the mechanics the /// mechanics-proof rows in `tests/spawn_return.rs` compose over the /// real wire to pin the constraint as tests. Not documented API. #[doc(hidden)] pub use serve::{report_exit_status_then_close, spawn_serving_path};