36 lines
2.0 KiB
Markdown
36 lines
2.0 KiB
Markdown
---
|
|
issueRef: "#95"
|
|
version: 6
|
|
updatedBy: {"kind":"user"}
|
|
updatedAt: 1784934174326
|
|
---
|
|
## Cause racine RÉELLE (2026-07-24, après investigation code)
|
|
|
|
### Ce qui se passe
|
|
|
|
Le `"timeout": 15000` (15 secondes) **hardcoded** dans le bloc `mcp.idea` de l'`opencode.json` généré par IdeA. OpenCode applique ce timeout **par appel `tools/call`** à ses serveurs MCP. `idea_ask_agent` bloque pendant que l'agent cible travaille (potentiellement des minutes) → OpenCode tue la requête à 15s avec l'erreur `-32001: Request timed out`.
|
|
|
|
**Pourquoi Claude/Codex ne sont pas affectés** : leur config MCP (`.mcp.json` / `config.toml`) n'a **pas** de champ `timeout`. Ce champ est spécifique à la config OpenCode.
|
|
|
|
### Emplacements du hardcoded 15000 (4 occurrences)
|
|
|
|
1. `application/src/agent/lifecycle.rs:2728` — `opencode_config_json()`
|
|
2. `application/src/agent/lifecycle.rs:2811` — `opencode_provider_config_json()`
|
|
3. `infrastructure/src/assistant/mod.rs:410` — `opencode_config_json()` (duplicate)
|
|
4. `infrastructure/src/assistant/mod.rs:495` — `opencode_provider_config_json()` (duplicate)
|
|
|
|
### Fix appliqué (feature/ticket95-opencode-mcp-timeout)
|
|
|
|
- Constante `DEFAULT_OPENCODE_MCP_TIMEOUT_MS` = 4h (14_400_000 ms), alignée sur `DEFAULT_RENDEZVOUS_CEILING` — le client MCP ne expire jamais avant le watchdog serveur.
|
|
- Fonction `resolve_opencode_mcp_timeout_ms()` — overridable via `IDEA_OPENCODE_MCP_TIMEOUT_MS`, fallback sûr sur 0/parse-error.
|
|
- Les 4 occurrences remplacées par `resolve_opencode_mcp_timeout_ms()`.
|
|
- Exporté depuis `application::agent` pour réutilisation par `infrastructure`.
|
|
- **Claude/Codex non touchés** : aucune modification de leur config MCP.
|
|
|
|
### Tests
|
|
- Application : 115 passed, 0 failed
|
|
- Infrastructure : 313 passed, 0 failed
|
|
- Compilation : OK, aucun nouveau warning
|
|
|
|
### Note déploiement
|
|
Le `opencode.json` est régénéré à chaque lancement d'agent par le code lifecycle. Nécessite rebuild AppImage pour que le binaire qui tourne génère la nouvelle config. |