mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-22 06:28:11 +02:00
Façade : changement de projet sans écraser la discussion, détenteur décidé par le Go
Avec LOKI_CHAT=rust, changer de projet passait par projectSwitch du Go, qui enregistrait SA copie de la discussion — chargée au démarrage, périmée — par-dessus celle de la façade, ouvrait une autre discussion que la façade ignorait, et ne voyait pas un tour de la façade en cours. Désormais : - /api/projects (switch) remet le changement à la façade (/internal/facade/v1/project/switch) : elle enregistre sa discussion avec le projet quitté, fait changer le projet actif au Go (/internal/v1/project/activate), ouvre la plus récente du nouveau projet (une neuve s'il n'en a pas) ; refusé pendant un tour (409) ; - supprimer un projet : la façade le quitte d'abord s'il est actif, puis supprime ses discussions (/internal/facade/v1/project/drop). Réglages que la façade ne sait pas honorer (PROJ_SNAPSHOT, KEEP_TURN_IMAGES, NUDGE_IN_TOOL, SIDE_SLOT, SLOT_PERSIST, PREWARM, motifs retry_patterns) : le Go garde la conversation, décidé une fois au démarrage (facadeChatBlocker) ; la façade le lit (/internal/v1/chat/holder) avant de servir quoi que ce soit, au lieu d'échouer en plein tour. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016tcGfJWefW5kUGoC2wL8cv
This commit is contained in:
14 files changed
+655
-20
No files matched your search
@@ -55,12 +55,16 @@ pub fn handles(path: &str) -> bool {
|
||||
}
|
||||
|
||||
/// API interne de la façade, pour le Go : un événement d'affichage né chez
|
||||
/// lui (bascule du mode Code, critères) à journaliser ici, et le
|
||||
/// rechargement de la discussion après le déverrouillage de la mémoire.
|
||||
/// lui (bascule du mode Code, critères) à journaliser ici, le rechargement de
|
||||
/// la discussion après le déverrouillage de la mémoire, le changement de
|
||||
/// projet et les discussions d'un projet supprimé.
|
||||
pub fn is_internal(path: &str) -> bool {
|
||||
matches!(
|
||||
path,
|
||||
"/internal/facade/v1/delta" | "/internal/facade/v1/reload"
|
||||
"/internal/facade/v1/delta"
|
||||
| "/internal/facade/v1/reload"
|
||||
| "/internal/facade/v1/project/switch"
|
||||
| "/internal/facade/v1/project/drop"
|
||||
)
|
||||
}
|
||||
|
||||
@@ -86,6 +90,23 @@ pub async fn serve_internal(chat: &Arc<ChatService>, req: Request<Incoming>) ->
|
||||
&json!({ "error": "événement illisible" }),
|
||||
),
|
||||
},
|
||||
"/internal/facade/v1/project/switch" | "/internal/facade/v1/project/drop" => {
|
||||
let v = read_json(req.into_body()).await.unwrap_or_default();
|
||||
let slug = str_of(&v, "slug");
|
||||
let res = if path.ends_with("switch") {
|
||||
chat.project_switch(slug)
|
||||
.await
|
||||
.map(|()| json!({ "ok": true }))
|
||||
} else {
|
||||
chat.drop_project(slug)
|
||||
.await
|
||||
.map(|n| json!({ "ok": true, "dropped": n }))
|
||||
};
|
||||
match res {
|
||||
Ok(v) => send_json(StatusCode::OK, &v),
|
||||
Err(r) => refused(r.status, &r.error),
|
||||
}
|
||||
}
|
||||
_ => match chat.sessions.reload_if_empty().await {
|
||||
Ok(reloaded) => send_json(StatusCode::OK, &json!({ "reloaded": reloaded })),
|
||||
Err(e) => send_json(StatusCode::SERVICE_UNAVAILABLE, &json!({ "error": e })),
|
||||
|
||||
Reference in new issue
Block a user