torc 0.14.1

Workflow management system
[workspace]
members = [
    ".",
]
resolver = "2"

[workspace.package]
version = "0.14.1"
authors = ["Daniel Thom", "Joseph McKinsey"]
license = "BSD-3-Clause"
edition = "2024"
repository = "https://github.com/NREL/torc"
description = "Workflow management system"

[workspace.dependencies]
# Self-reference for sub-crates (version only specified here)
torc = { version = "0.14.1", path = "." }

# Shared dependencies
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"

# Configuration management
config = { version = "0.14", features = ["toml"] }
dirs = "5"
toml = "0.8"
serde_repr = "0.1"
serde_with = { version = "3.8", default-features = false, features = ["base64", "std", "macros"] }
chrono = { version = "0.4", features = ["serde"] }
log = "0.4.28"
env_logger = "0.11"
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter", "fmt", "json"] }
tracing-appender = "0.2"
tracing-timing = "0.6"
hdrhistogram = "7.5"
signal-hook = "0.3"
libc = "0.2"
file-rotate = "0.7"
clap = { version = "4.5", features = ["derive", "env", "color"] }
clap_complete = "4.5"
tokio = { version = "1.47", features = ["rt-multi-thread", "macros", "net", "signal", "process", "io-util"] }
url = "2.5"
validator = { version = "0.16", features = ["derive"] }
mime = "0.3"
futures = "0.3"
bcrypt = "0.15"
rpassword = "7.3"

# TUI-specific
ratatui = "0.29"
crossterm = "0.28"
petgraph = "0.6"

# Plot-resources-specific
plotly = { version = "0.10", default-features = false, features = ["kaleido"] }

# Server-specific
rust-embed = "8.5"
async-trait = "0.1.24"
async-stream = "0.3"
axum = { version = "0.7", features = ["tokio", "http1", "http2"] }
tower = "0.4"
tower-http = { version = "0.5", features = ["cors", "fs"] }
mime_guess = "2.0"
swagger = { version = "6.1", features = ["serdejson", "server", "client", "tls", "tcp"] }
hyper = { version = "0.14", features = ["full"] }
serde_ignored = "0.1.1"
percent-encoding = "2.1.0"
regex = "1.3"
lazy_static = "1.4"
parking_lot = "0.12"
anyhow = "1"
sqlx = { version = "0.8.6", features = ["runtime-tokio", "sqlite"] }
dotenvy = "0.15.7"
iso8601 = "0.6"
jsonwebtoken = "9.3.0"
sha2 = "0.10"

# Client-specific
reqwest = { version = "0.12", default-features = false, features = ["json", "blocking", "multipart", "native-tls", "stream"] }
sysinfo = "0.29"
hostname = "0.4.1"
json5 = "0.4"
serde_yaml = "0.9"
tabled = "0.17"
kdl = "6.5"
rusqlite = { version = "0.32", features = ["bundled"] }
nvml-wrapper = "0.10"
shlex = "1.3"
flate2 = "1.0"
tar = "0.4"

# Service management
service-manager = "0.7"

# Platform-specific (macOS/Windows/iOS)
native-tls = "0.2"
hyper-tls = "0.5"

# Platform-specific (Linux/other)
hyper-openssl = "0.9"
openssl = "0.10"

# MCP server
rmcp = { version = "0.1", features = ["server", "macros", "transport-io"] }
schemars = "1.0"

# Dashboard-specific
uuid = { version = "1.11", features = ["v4"] }

# TLS
tokio-openssl = "0.6"

[package]
name = "torc"
version.workspace = true
authors.workspace = true
license.workspace = true
edition.workspace = true
repository.workspace = true
description.workspace = true

[[bin]]
name = "torc"
path = "src/main.rs"
required-features = ["client", "tui", "plot_resources"]

[[bin]]
name = "torc-server"
path = "src/bin/torc-server.rs"
required-features = ["server-bin"]

[[bin]]
name = "torc-htpasswd"
path = "src/bin/torc-htpasswd.rs"
required-features = ["server-bin"]

[[bin]]
name = "torc-mcp-server"
path = "src/bin/torc-mcp-server.rs"
required-features = ["mcp-server"]

[[bin]]
name = "torc-dash"
path = "src/bin/torc-dash.rs"
required-features = ["dash"]

[[bin]]
name = "torc-slurm-job-runner"
path = "src/bin/torc-slurm-job-runner.rs"
required-features = ["slurm-runner"]

[features]
default = ["client", "tui", "plot_resources"]
config = [
    "dep:config",
    "dep:dirs",
    "dep:toml",
]
server = [
    "dep:async-trait",
    "dep:async-stream",
    "dep:swagger",
    "dep:hyper",
    "dep:serde_ignored",
    "dep:percent-encoding",
    "dep:regex",
    "dep:lazy_static",
    "dep:anyhow",
    "dep:sqlx",
    "dep:tokio",
    "dep:dotenvy",
    "dep:jsonwebtoken",
    "dep:sha2",
    "dep:tracing",
    "dep:bcrypt",
    "dep:rust-embed",
    "dep:parking_lot",
]
client = [
    "dep:reqwest",
    "dep:sysinfo",
    "dep:hostname",
    "dep:json5",
    "dep:serde_yaml",
    "dep:kdl",
    "dep:clap",
    "dep:clap_complete",
    "dep:env_logger",
    "dep:serde_with",
    "dep:serde_repr",
    "dep:tabled",
    "dep:anyhow",
    "dep:regex",
    "dep:rusqlite",
    "dep:rpassword",
    "dep:signal-hook",
    "dep:libc",
    "dep:nvml-wrapper",
    "dep:percent-encoding",
    "dep:sha2",
    "dep:shlex",
    "dep:flate2",
    "dep:tar",
    "config",
]
tui = [
    "client",
    "dep:ratatui",
    "dep:crossterm",
    "dep:petgraph",
]
plot_resources = [
    "dep:plotly",
    "dep:rusqlite",
    "dep:anyhow",
]
server-bin = [
    "server",
    "config",
    "dep:clap",
    "dep:tracing-subscriber",
    "dep:tracing-appender",
    "dep:tracing-timing",
    "dep:hdrhistogram",
    "dep:service-manager",
    "dep:file-rotate",
    "dep:rpassword",
    "dep:openssl",
    "dep:tokio-openssl",
    "dep:daemonize",
]
mcp-server = [
    "client",
    "dep:rmcp",
    "dep:schemars",
    "dep:tempfile",
    "dep:tracing-subscriber",
    "dep:tokio",
    "dep:anyhow",
    "dep:tracing",
]
dash = [
    "client",
    "config",
    "dep:axum",
    "dep:tower",
    "dep:tower-http",
    "dep:mime_guess",
    "dep:uuid",
    "dep:tracing-subscriber",
    "dep:rust-embed",
    "dep:async-stream",
    "dep:tokio",
    "dep:anyhow",
    "dep:tracing",
]
slurm-runner = [
    "client",
]
dist = ["client", "tui", "plot_resources", "server-bin", "mcp-server", "dash", "slurm-runner"]
cli-docs = ["dep:clap-markdown"]
conversion = ["frunk", "frunk_derives", "frunk_core", "frunk-enum-core", "frunk-enum-derive"]

[target.'cfg(any(target_os = "macos", target_os = "windows", target_os = "ios"))'.dependencies]
native-tls = { workspace = true, optional = true }
hyper-tls = { workspace = true, optional = true }

[target.'cfg(not(any(target_os = "macos", target_os = "windows", target_os = "ios")))'.dependencies]
hyper-openssl = { workspace = true, optional = true }

[dependencies]
# Shared dependencies (always available)
serde.workspace = true
serde_json.workspace = true
chrono.workspace = true
log.workspace = true
mime.workspace = true
futures.workspace = true
validator.workspace = true

# Server dependencies (optional)
async-trait = { workspace = true, optional = true }
async-stream = { workspace = true, optional = true }
swagger = { workspace = true, optional = true }
hyper = { workspace = true, optional = true }
serde_ignored = { workspace = true, optional = true }
percent-encoding = { workspace = true, optional = true }
regex = { workspace = true, optional = true }
lazy_static = { workspace = true, optional = true }
anyhow = { workspace = true, optional = true }
sqlx = { workspace = true, optional = true }
tokio = { workspace = true, optional = true }
dotenvy = { workspace = true, optional = true }
iso8601 = { workspace = true }
jsonwebtoken = { workspace = true, optional = true }
sha2 = { workspace = true, optional = true }
tracing = { workspace = true, optional = true }
bcrypt = { workspace = true, optional = true }
rust-embed = { workspace = true, optional = true }
parking_lot = { workspace = true, optional = true }

# Client dependencies (optional)
reqwest = { workspace = true, optional = true }
sysinfo = { workspace = true, optional = true }
hostname = { workspace = true, optional = true }
json5 = { workspace = true, optional = true }
serde_yaml = { workspace = true, optional = true }
kdl = { workspace = true, optional = true }
serde_with = { workspace = true, optional = true }
serde_repr = { workspace = true, optional = true }
url = { workspace = true }
clap = { workspace = true, optional = true }
clap_complete = { workspace = true, optional = true }
env_logger = { workspace = true, optional = true }
tabled = { workspace = true, optional = true }
rusqlite = { workspace = true, optional = true }
rpassword = { workspace = true, optional = true }
signal-hook = { workspace = true, optional = true }
libc = { workspace = true, optional = true }
nvml-wrapper = { workspace = true, optional = true }
shlex = { workspace = true, optional = true }
flate2 = { workspace = true, optional = true }
tar = { workspace = true, optional = true }

# TUI dependencies (optional)
ratatui = { workspace = true, optional = true }
crossterm = { workspace = true, optional = true }
petgraph = { workspace = true, optional = true }

# Plot-resources dependencies (optional)
plotly = { workspace = true, optional = true }

# Server binary dependencies (optional)
tracing-subscriber = { workspace = true, optional = true }
tracing-appender = { workspace = true, optional = true }
tracing-timing = { workspace = true, optional = true }
hdrhistogram = { workspace = true, optional = true }
service-manager = { workspace = true, optional = true }
file-rotate = { workspace = true, optional = true }
openssl = { workspace = true, optional = true }
tokio-openssl = { workspace = true, optional = true }

# MCP server dependencies (optional)
rmcp = { workspace = true, optional = true }
schemars = { workspace = true, optional = true }
tempfile = { version = "3", optional = true }

# Dashboard dependencies (optional)
axum = { workspace = true, optional = true }
tower = { workspace = true, optional = true }
tower-http = { workspace = true, optional = true }
mime_guess = { workspace = true, optional = true }
uuid = { workspace = true, optional = true }

# Configuration management
config = { workspace = true, optional = true }
dirs = { workspace = true, optional = true }
toml = { workspace = true, optional = true }

# Conversion feature dependencies
frunk = { version = "0.4.0", optional = true }
frunk_derives = { version = "0.4.0", optional = true }
frunk_core = { version = "0.4.0", optional = true }
frunk-enum-derive = { version = "0.3.0", optional = true }
frunk-enum-core = { version = "0.3.0", optional = true }

[target.'cfg(not(any(target_os = "macos", target_os = "windows", target_os = "ios")))'.dev-dependencies]
tokio-openssl = "0.6"
openssl = "0.10"

# Windows testing support - vendored OpenSSL for CI
[target.'cfg(windows)'.dev-dependencies]
openssl-sys = { version = "0.9", features = ["vendored"] }

[target.'cfg(unix)'.dependencies]
daemonize = { version = "0.5", optional = true }

# Musl static builds - vendored OpenSSL (compiles from source)
[target.'cfg(target_env = "musl")'.dependencies]
openssl = { version = "0.10", features = ["vendored"] }

[dev-dependencies]
rstest = "0.26.1"
tempfile = "3.22.0"
serial_test = "3.0"
reqwest = { workspace = true }
clap-markdown = "0.1"
libc = "0.2"
cargo-husky = { version = "1", default-features = false, features = ["precommit-hook", "user-hooks"] }

# CLI documentation generator depends on clap-markdown
# It's also in dev-dependencies for tests
[dependencies.clap-markdown]
version = "0.1"
optional = true