cellos-server 0.5.3

HTTP control plane for CellOS — admission, projection over JetStream, WebSocket fan-out of CloudEvents. Pure event-sourced architecture.
Documentation
[package]
name = "cellos-server"
version = "0.5.3"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
description = "HTTP control plane for CellOS — admission, projection over JetStream, WebSocket fan-out of CloudEvents. Pure event-sourced architecture."

# Architecture note (Session 16, CHATROOM.md):
# cellos-server is a pure-state-machine projection over JetStream. All cell/
# formation state is derived from CloudEvents. The in-memory registry is a
# cache for query latency only — it MUST be rebuildable by replaying
# `cellos.events.>`. HTTP is the query interface, WebSocket is the live
# projection feed, NATS is the source of truth.
readme = "README.md"
repository.workspace = true
homepage.workspace = true
documentation = "https://docs.rs/cellos-server"
keywords = ["cellos", "http-server", "jetstream", "websocket", "axum"]
categories = ["web-programming::http-server", "web-programming::websocket", "asynchronous"]

[[bin]]
name = "cellos-server"
path = "src/main.rs"

[lib]
path = "src/lib.rs"

[dependencies]
anyhow.workspace = true
async-nats.workspace = true
# RFC3339 timestamps for CloudEvent `time` field (CloudEvents 1.0 spec §3.1).
# EVT-CONTENT-001: published 0.5.0 emitted UUID-valued `time` fields which
# fail spec-compliant validators; chrono is the canonical RFC3339 source
# used elsewhere in the workspace (e.g. cellos-supervisor).
chrono = { workspace = true }
# `tracing-layer` feature pulls in `observability::redacted_filter`
# (HIGH-B5 mitigation) wired into the global subscriber in `main.rs`.
cellos-core = { version = "0.7.0", path = "../cellos-core", features = ["tracing-layer"] }
serde = { workspace = true, features = ["derive"] }
serde_json.workspace = true
tokio = { workspace = true, features = ["rt-multi-thread", "macros", "sync", "signal", "time"] }
tracing.workspace = true
tracing-subscriber = { version = "0.3", features = ["env-filter", "fmt", "json"] }
uuid.workspace = true
futures-util = "0.3"

# axum 0.7 + tower-http 0.5 are the stable pair on Rust 1.88 with hyper 1.x.
axum = { version = "0.7", features = ["ws", "macros"] }
tower = "0.4"
tower-http = { version = "0.5", features = ["cors", "trace"] }

[dev-dependencies]
tokio = { workspace = true, features = ["rt-multi-thread", "macros", "sync", "time"] }
tower = { version = "0.4", features = ["util"] }
http-body-util = "0.1"

[lints]
workspace = true