Lot 37 : outils task_* de l'agent exécutés par la façade

Quand la façade tient les tâches (LOKI_TASKS=rust), les quatre outils par
lesquels le modèle gère ses tâches planifiées — task_list, task_create,
task_update, task_delete — s'exécutent dans ses tours (src/tasks/tools.rs,
port de tasks_tools.go), sans passer par le Go : mêmes messages, projet
actif, fuseau de l'utilisateur, tâche unique « dans N minutes » ou « à
HH:MM », fréquence validée, script vérifié, compte-rendu coupé comme le Go.
ChatShared porte la même base de tâches que les routes.

Côté Go, les outils prennent l'heure des tâches (tasksNow) au lieu de
time.Now : rien ne change en service, le journal de parité la fixe.

Parité : journal de 44 appels tiré du Go
(parity_tasks_tools_test.go → tests/parity_tasks/tools.json), rejoué par
tests/tasks.rs ; un tour de la façade qui crée une tâche (tests/lot6.rs).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016tcGfJWefW5kUGoC2wL8cv
This commit is contained in:
Claude committed 2026-10-16 03:51:09 +00:00
1 parent 869bd18bff
commit e94b625931
14 files changed
+7946 -18

No files matched your search

+11 -5
View File
@@ -262,11 +262,15 @@ fn serve() -> ExitCode {
return ExitCode::FAILURE;
}
};
// Un seul pool MCP : celui des routes, et celui des tours de la façade.
// Un seul pool MCP, une seule base de tâches : ceux des routes, et ceux
// des tours de la façade (outils mcp__* et task_*).
let mcp = mcp_rust
.then(|| std::sync::Arc::new(loki_rs::mcp::Mcp::new(engine_paths.home.clone())));
let tasks = tasks_rust
.then(|| std::sync::Arc::new(loki_rs::tasks::Tasks::new(engine_paths.home.clone())));
let chat = if chat_rust {
match start_chat(backend, &token, &engine_paths.home, mcp.clone()).await {
let held = (mcp.clone(), tasks.clone());
match start_chat(backend, &token, &engine_paths.home, held).await {
Ok(c) => Some(c),
Err(e) => {
eprintln!("[loki-rs] conversation : {e}");
@@ -368,8 +372,6 @@ fn serve() -> ExitCode {
loki_rs::backends::probe::Probe::system(),
))
});
let tasks = tasks_rust
.then(|| std::sync::Arc::new(loki_rs::tasks::Tasks::new(engine_paths.home.clone())));
let bench = bench_rust
.then(|| std::sync::Arc::new(loki_rs::bench::job::Bench::new(engine_paths.clone())));
let tune = tune_rust.then(|| {
@@ -512,7 +514,10 @@ async fn start_chat(
backend: SocketAddr,
token: &str,
home: &std::path::Path,
mcp: Option<std::sync::Arc<loki_rs::mcp::Mcp>>,
(mcp, tasks): (
Option<std::sync::Arc<loki_rs::mcp::Mcp>>,
Option<std::sync::Arc<loki_rs::tasks::Tasks>>,
),
) -> Result<std::sync::Arc<loki_rs::chat::generate::ChatService>, String> {
use loki_rs::chat::{conv::Conversation, generate::ChatService, host::ChatShared, sessions};
let store = loki_rs::store::Store::new(backend, token.to_string());
@@ -525,6 +530,7 @@ async fn start_chat(
let mut shared = ChatShared::for_sessions(&s, store.clone(), home.join("chatimg"));
shared.patterns = loki_rs::chat::generate::retry_patterns(&store).await;
shared.mcp = mcp;
shared.tasks = tasks;
eprintln!("[loki-rs] conversation tenue par la façade (LOKI_CHAT=go pour la rendre au Go)");
Ok(ChatService::new(
std::sync::Arc::new(s),