Scaffolds the workspace per architecture/generic.md §1 and implements
phases 0-3 of doc/spec.md §12.
Crates:
entities manifest/ref/repo schemas, bucket key layout, config, the
X-Error-Code taxonomy. No I/O.
core resolver, freeze pinning, single-flight, the streaming tee,
policy, gc/verify/refresh. Defines the Store and Upstream
ports.
data object_store (S3 + local) and reqwest Hub adapters.
api the axum surface: resolve, model/dataset info, tree, refs,
whoami, metrics, bearer auth, range handling.
bin one binary: serve plus fetch/pin/refresh/list/show/rm/gc/
verify/doctor.
Deployment targets bob.hanzalova.internal:20482 (port derived per
architecture/port-allocations.md §3), storing to the MinIO on
caveman.kosherinata.internal, fronted by hanzalova at rf.internal.
Ships the sysusers drop-in, hardened unit, firewalld service, nginx
vhost, config template, infra-setup.sh and the Gitea Actions
ci/deploy/conformance workflows.
Testing: 112 unit and integration tests, including the sovereignty
suite (cold fetch, sealed replay, single-flight, client disconnect,
range resume, freeze stability, gc-after-rm, digest mismatch), plus a
conformance suite driving a pinned huggingface_hub against a real Hub.
Deviations from the spec, all deliberate:
- one binary with subcommands (spec §9) rather than generic.md's
separate -api and -cli binaries; the library split is unchanged.
- a dedicated sysusers account and hardened unit (generic.md §8)
rather than the spec's illustrative DynamicUser unit.
- manifests carry an optional repo_tree recorded verbatim, resolving
spec §13's "record whole, filter on read" question for the tree
endpoint as well as model-info.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XZG2i4AmfSqE97EJGBVb64
55 lines
2.5 KiB
TOML
55 lines
2.5 KiB
TOML
[workspace]
|
|
resolver = "3"
|
|
members = ["crates/*"]
|
|
|
|
[workspace.package]
|
|
version = "0.1.0"
|
|
edition = "2024"
|
|
rust-version = "1.85"
|
|
license = "GPL-3.0-or-later"
|
|
authors = ["Rob Thijssen <rthijssen@gmail.com>"]
|
|
repository = "https://git.lair.cafe/grenade/rustingface"
|
|
|
|
[workspace.dependencies]
|
|
rustingface-entities = { path = "crates/rustingface-entities", version = "=0.1.0" }
|
|
rustingface-core = { path = "crates/rustingface-core", version = "=0.1.0" }
|
|
rustingface-data = { path = "crates/rustingface-data", version = "=0.1.0" }
|
|
rustingface-api = { path = "crates/rustingface-api", version = "=0.1.0" }
|
|
|
|
anyhow = "1"
|
|
async-trait = "0.1"
|
|
axum = { version = "0.8", default-features = false, features = ["http1", "http2", "json", "tokio", "query", "matched-path"] }
|
|
bytes = "1"
|
|
clap = { version = "4", features = ["derive", "env"] }
|
|
dashmap = "6"
|
|
figment = { version = "0.10", features = ["toml", "env"] }
|
|
futures = "0.3"
|
|
globset = "0.4"
|
|
hex = "0.4"
|
|
http = "1"
|
|
http-body-util = "0.1"
|
|
humantime-serde = "1"
|
|
metrics = "0.24"
|
|
metrics-exporter-prometheus = { version = "0.18", default-features = false }
|
|
object_store = { version = "0.14", features = ["aws"] }
|
|
percent-encoding = "2"
|
|
reqwest = { version = "0.13", default-features = false, features = ["rustls", "rustls-native-certs", "stream", "http2", "charset", "json"] }
|
|
serde = { version = "1", features = ["derive"] }
|
|
serde_json = { version = "1", features = ["preserve_order"] }
|
|
sha2 = "0.10"
|
|
subtle = "2"
|
|
thiserror = "2"
|
|
time = { version = "0.3", features = ["formatting", "parsing", "serde", "macros"] }
|
|
tokio = { version = "1", features = ["full"] }
|
|
tokio-util = { version = "0.7", features = ["io"] }
|
|
toml = "0.9"
|
|
tower = "0.5"
|
|
tower-http = { version = "0.7", features = ["trace", "normalize-path"] }
|
|
tracing = "0.1"
|
|
tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] }
|
|
|
|
[profile.release]
|
|
lto = "thin"
|
|
codegen-units = 1
|
|
strip = "symbols"
|