feat(agent): bind transport S-MCP — outils idea_* vivants de bout en bout (M5a-e) — §14.3.1
Dernier kilomètre de l'orchestration native : une CLI MCP réellement lancée
joint le serveur MCP du projet et ses outils idea_* aboutissent au vrai dispatch.
- M5a endpoint loopback par projet (interprocess UDS/named pipe, source unique
mcp_endpoint, cleanup au close) — zéro port réseau, AppImage/SSH-safe.
- M5b sous-commande `idea mcp-server` : pont stdio↔loopback headless (avant init
Tauri), handshake {"project","requester"}, endpoint-absent borné, EOF propre.
- M5c McpServerHandle boucle accept + serve_peer par pair ; requester réel
propagé jusqu'à OrchestratorRequestProcessed (fin du "mcp" figé) ; isolation
des pairs ; terminaison propre.
- M5d apply_mcp_config écrit la déclaration réelle (current_exe + --endpoint
mcp_endpoint + --project simple-uuid + --requester) ; McpRuntime injecté comme
donnée (application ne dépend pas de app-tauri).
- M5e smoke e2e sur vrai loopback : list/ask inline, cible PTY → erreur typée,
JSON malformé → pas de panic, requester propagé.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -42,6 +42,18 @@ where
|
||||
writer,
|
||||
}
|
||||
}
|
||||
|
||||
/// Wraps an **already-buffered** reader plus a writer as a line-delimited JSON
|
||||
/// transport.
|
||||
///
|
||||
/// Used by the per-peer accept loop (M5c): the handshake line (cadrage v5 §1.4)
|
||||
/// is read off a `BufReader` over the loopback's read half *before* serving, and
|
||||
/// that same `BufReader` — carrying any bytes already buffered past the handshake
|
||||
/// — is handed here so no JSON-RPC byte is lost between the handshake and the
|
||||
/// serve loop.
|
||||
pub fn from_buffered(reader: BufReader<R>, writer: W) -> Self {
|
||||
Self { reader, writer }
|
||||
}
|
||||
}
|
||||
|
||||
#[async_trait::async_trait]
|
||||
|
||||
Reference in New Issue
Block a user