zeph 0.21.1

Lightweight AI agent with hybrid inference, skills-first architecture, and multi-channel I/O
FROM rust:1.95-slim@sha256:985053ebf77f576c742435c12c1923ee04dbe511e17f087dd1a8f022307d3aeb 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:67b30a61dc87758f0caf819646104f29ecbda97d920aaf5edc834128ac8493d3

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"]