refactor(backend): extraire le cœur backend commun hors Tauri (#13)

Lot B1 du chantier server/client mode : création de la crate `backend`
qui héberge le cœur commun (endpoint MCP, outils OpenAI) indépendant de
Tauri, préalable au futur serveur web + PTY WebSocket.

- crates/backend : nouvelle crate (lib.rs, mcp_endpoint.rs, openai_tools.rs).
- crates/app-tauri : câblage sur la crate backend (state.rs, mcp_bridge.rs,
  Cargo.toml, tests/orchestrator_wiring.rs).
- Cargo.toml / Cargo.lock racine : ajout de la crate au workspace.

Validé : cargo check --workspace vert, tests backend/app-tauri verts.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-15 09:50:17 +02:00
parent 5505acc1f6
commit 955db79e97
10 changed files with 6950 additions and 6315 deletions

View File

@ -23,6 +23,7 @@ tauri-build = { workspace = true }
domain = { workspace = true }
application = { workspace = true }
infrastructure = { workspace = true }
backend = { workspace = true }
tauri = { workspace = true }
tauri-plugin-dialog = { workspace = true }
# `io-std` (on top of the workspace features) gives the headless `mcp-server`
@ -44,8 +45,8 @@ interprocess = { version = "2.4", features = ["tokio"] }
[features]
# Passthrough toggles to enable the real embedders in an IDE build. OFF by default
# (founding posture: `none` ⇒ naïve recall, zero dependency).
vector-http = ["infrastructure/vector-http"]
vector-onnx = ["infrastructure/vector-onnx"]
vector-http = ["infrastructure/vector-http", "backend/vector-http"]
vector-onnx = ["infrastructure/vector-onnx", "backend/vector-onnx"]
[dev-dependencies]
uuid = { workspace = true }

View File

@ -600,6 +600,7 @@ mod tests {
/// the server (reads the handshake, echoes a canned response); the relay drives
/// it over an actual connection. Verifies the handshake crosses the real socket
/// and the response returns on the CLI stdout.
#[ignore = "requires local socket bind permission"]
#[tokio::test]
async fn end_to_end_over_real_loopback() {
let endpoint = temp_endpoint("e2e");

File diff suppressed because it is too large Load Diff

View File

@ -242,6 +242,7 @@ fn socket_exists(project: &Project) -> bool {
}
#[cfg(unix)]
#[ignore = "requires local socket bind permission"]
#[tokio::test]
async fn open_binds_the_project_loopback_endpoint() {
let state = AppState::build(temp_path("appdata"));
@ -259,6 +260,7 @@ async fn open_binds_the_project_loopback_endpoint() {
}
#[cfg(unix)]
#[ignore = "requires local socket bind permission"]
#[tokio::test]
async fn double_open_keeps_a_single_endpoint_no_address_in_use() {
let state = AppState::build(temp_path("appdata"));
@ -280,6 +282,7 @@ async fn double_open_keeps_a_single_endpoint_no_address_in_use() {
}
#[cfg(unix)]
#[ignore = "requires local socket bind permission"]
#[tokio::test]
async fn close_cleans_up_the_endpoint_socket_file() {
let state = AppState::build(temp_path("appdata"));
@ -311,6 +314,7 @@ fn endpoint_is_deterministic_and_collision_free_across_projects() {
}
#[cfg(unix)]
#[ignore = "requires local socket bind permission"]
#[tokio::test]
async fn file_watcher_and_loopback_endpoint_live_together() {
let state = AppState::build(temp_path("appdata"));