zeph 0.21.0

Lightweight AI agent with hybrid inference, skills-first architecture, and multi-channel I/O
FROM rust:1.95-slim@sha256:81099830a1e1d244607b9a7a30f3ff6ecadc52134a933b4635faba24f52840c9 AS builder

ARG CARGO_FEATURES=""

WORKDIR /build

# Cache dependencies in a separate layer
COPY Cargo.toml Cargo.lock ./
COPY crates/zeph-core/Cargo.toml crates/zeph-core/Cargo.toml
COPY crates/zeph-llm/Cargo.toml crates/zeph-llm/Cargo.toml
COPY crates/zeph-skills/Cargo.toml crates/zeph-skills/Cargo.toml
COPY crates/zeph-memory/Cargo.toml crates/zeph-memory/Cargo.toml
COPY crates/zeph-channels/Cargo.toml crates/zeph-channels/Cargo.toml
COPY crates/zeph-tools/Cargo.toml crates/zeph-tools/Cargo.toml
COPY crates/zeph-mcp/Cargo.toml crates/zeph-mcp/Cargo.toml
COPY crates/zeph-a2a/Cargo.toml crates/zeph-a2a/Cargo.toml
COPY crates/zeph-tui/Cargo.toml crates/zeph-tui/Cargo.toml
RUN mkdir -p src && echo 'fn main() {}' > src/main.rs && \
    for d in crates/*/; do mkdir -p "$d/src" && echo '' > "$d/src/lib.rs"; done && \
    cargo build --release ${CARGO_FEATURES:+--features $CARGO_FEATURES} 2>/dev/null || true

COPY . .
RUN touch src/main.rs && \
    for d in crates/*/src/lib.rs; do touch "$d"; done && \
    cargo build --release ${CARGO_FEATURES:+--features $CARGO_FEATURES}

FROM debian:bookworm-slim@sha256:f9c6a2fd2ddbc23e336b6257a5245e31f996953ef06cd13a59fa0a1df2d5c252

RUN apt-get update && apt-get install -y --no-install-recommends \
    ca-certificates \
    curl wget git jq file findutils iproute2 procps \
    nodejs npm python3 && \
    rm -rf /var/lib/apt/lists/* && \
    useradd --system --create-home --shell /sbin/nologin zeph

WORKDIR /app

COPY --from=builder /build/target/release/zeph /app/zeph
COPY config/ /app/config/
COPY .zeph/skills/ /app/.zeph/skills/

RUN mkdir -p /app/.zeph/data && \
    chown -R zeph:zeph /app && \
    chmod +x /app/zeph

USER zeph

ENTRYPOINT ["/app/zeph"]