diff --git a/.gitignore b/.gitignore index 86cb5bf24..d650bb21a 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,13 @@ interface/dist/ .idea list/ agents/ + +# Claude Code - Fichiers propriétaires (auto-généré) +.claude/ +CLAUDE.md +.claude-context +.claude-memory +.claude-decisions +docs/phases/ +docs/specs/ +PROJECT-STATUS.md diff --git a/Dockerfile b/Dockerfile index 84124c3c1..7388f3dc7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,3 @@ -# syntax=docker/dockerfile:1.6 # ---- Builder stage ---- # Compiles the React frontend and the Rust binary with the frontend embedded. FROM rust:bookworm AS builder @@ -22,20 +21,15 @@ WORKDIR /build # 1. Fetch and cache Rust dependencies. # cargo fetch needs a valid target, so we create stubs that get replaced later. COPY Cargo.toml Cargo.lock ./ -RUN --mount=type=cache,target=/usr/local/cargo/registry \ - --mount=type=cache,target=/usr/local/cargo/git \ - --mount=type=cache,target=/build/target \ - mkdir src && echo "fn main() {}" > src/main.rs && touch src/lib.rs \ +RUN mkdir src && echo "fn main() {}" > src/main.rs && touch src/lib.rs \ && cargo build --release \ && rm -rf src # 2. Build the frontend. COPY interface/package.json interface/ -RUN --mount=type=cache,target=/root/.bun/install/cache \ - cd interface && bun install +RUN cd interface && bun install COPY interface/ interface/ -RUN --mount=type=cache,target=/root/.bun/install/cache \ - cd interface && bun run build +RUN cd interface && bun run build # 3. Copy source and compile the real binary. # build.rs runs the frontend build (already done above, node_modules present). @@ -45,10 +39,7 @@ COPY build.rs ./ COPY prompts/ prompts/ COPY migrations/ migrations/ COPY src/ src/ -RUN --mount=type=cache,target=/usr/local/cargo/registry \ - --mount=type=cache,target=/usr/local/cargo/git \ - --mount=type=cache,target=/build/target \ - SPACEBOT_SKIP_FRONTEND_BUILD=1 cargo build --release \ +RUN SPACEBOT_SKIP_FRONTEND_BUILD=1 cargo build --release \ && mv /build/target/release/spacebot /usr/local/bin/spacebot \ && cargo clean -p spacebot --release --target-dir /build/target @@ -71,8 +62,6 @@ ENV SPACEBOT_DIR=/data ENV SPACEBOT_DEPLOYMENT=docker EXPOSE 19898 18789 -VOLUME /data - HEALTHCHECK --interval=30s --timeout=5s --retries=3 \ CMD curl -f http://localhost:19898/api/health || exit 1 diff --git a/src/api/models.rs b/src/api/models.rs index 9c737ae6a..df85d8185 100644 --- a/src/api/models.rs +++ b/src/api/models.rs @@ -81,6 +81,15 @@ const MODELS_CACHE_TTL: std::time::Duration = std::time::Duration::from_secs(360 /// Models known to work with Spacebot's current voice transcription path /// (OpenAI-compatible `/v1/chat/completions` with `input_audio`). const KNOWN_VOICE_TRANSCRIPTION_MODELS: &[&str] = &[ + // Native Gemini API + "gemini/gemini-2.0-flash", + "gemini/gemini-2.5-flash", + "gemini/gemini-2.5-flash-lite", + "gemini/gemini-2.5-pro", + "gemini/gemini-3-flash-preview", + "gemini/gemini-3-pro-preview", + "gemini/gemini-3.1-pro-preview", + // Via OpenRouter "openrouter/google/gemini-2.0-flash-001", "openrouter/google/gemini-2.5-flash", "openrouter/google/gemini-2.5-flash-lite", diff --git a/src/api/server.rs b/src/api/server.rs index 99e6f8a33..3f02a23c6 100644 --- a/src/api/server.rs +++ b/src/api/server.rs @@ -7,6 +7,7 @@ use super::{ }; use axum::Json; + use axum::Router; use axum::extract::{DefaultBodyLimit, Request, State}; use axum::http::{StatusCode, Uri, header}; diff --git a/src/llm/routing.rs b/src/llm/routing.rs index d9bdd5d31..45cdd3e10 100644 --- a/src/llm/routing.rs +++ b/src/llm/routing.rs @@ -305,16 +305,21 @@ pub fn defaults_for_provider(provider: &str) -> RoutingConfig { } } "gemini" => { - let channel: String = "gemini/gemini-2.5-flash".into(); + let channel: String = "gemini/gemini-2.5-pro".into(); let worker: String = "gemini/gemini-2.5-flash".into(); + let lite: String = "gemini/gemini-2.5-flash-lite".into(); RoutingConfig { channel: channel.clone(), branch: channel.clone(), worker: worker.clone(), compactor: worker.clone(), cortex: worker.clone(), + voice: String::new(), task_overrides: HashMap::from([("coding".into(), channel.clone())]), - fallbacks: HashMap::new(), + fallbacks: HashMap::from([ + (channel, vec![worker.clone()]), + (worker, vec![lite]), + ]), rate_limit_cooldown_secs: 60, ..RoutingConfig::default() } diff --git a/src/tools/browser.rs b/src/tools/browser.rs index 7f9b5f3e9..34b418004 100644 --- a/src/tools/browser.rs +++ b/src/tools/browser.rs @@ -4,6 +4,7 @@ //! via headless Chrome using chromiumoxide. Uses an accessibility-tree based //! ref system for LLM-friendly element addressing. + use crate::config::BrowserConfig; use chromiumoxide::browser::{Browser, BrowserConfig as ChromeConfig};