Lot 6 : plusieurs discussions côté Rust (chat::sessions)

Port des opérations de chat_sessions.go et de LoadConversation :
discussion active créée au besoin (reprise du fil unique d'avant les
discussions, clé d'origine gardée), chargement au démarrage qui réessaie et
n'écrit rien sur une base illisible, liste du projet actif, création,
bascule (la courante enregistrée sous SON identifiant), renommage,
suppression (l'écriture en vol ne la fait pas renaître ; bascule sur la plus
récente restante ou une neuve : toujours une discussion active).

Les opérations sont sérialisées ; l'index partage son verrou avec
l'écrivain (StoreSink::index_lock, convIndexMu en Go). Fichiers, travaux,
critères, mode, résultats d'outils d'une discussion supprimée et
préchauffage après bascule passent par SessionHooks. Store gagne
get_open / put_seal (getStoreBytesErr / putStoreBytes).

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-15 10:09:00 +00:00
1 parent 74c2d5105c
commit a73b20ea04
5 files changed
+574 -7

No files matched your search

+18 -4
View File
@@ -97,7 +97,7 @@ pub fn tool_res_conv(key: &str) -> &str {
}
}
fn now_unix() -> i64 {
pub(crate) fn now_unix() -> i64 {
SystemTime::now()
.duration_since(UNIX_EPOCH)
.map(|d| d.as_secs() as i64)
@@ -783,16 +783,30 @@ async fn run<S: PersistSink>(sh: Arc<Shared<S>>) {
#[derive(Clone)]
pub struct StoreSink {
pub store: Store,
/// Sérialise les lectures-modifications-écritures de l'index
/// (`convIndexMu`) : celles de l'écrivain et celles des opérations sur
/// les discussions ([`super::sessions`]), qui partagent ce verrou.
pub index_lock: Arc<tokio::sync::Mutex<()>>,
}
impl StoreSink {
pub fn new(store: Store) -> Self {
StoreSink {
store,
index_lock: Arc::new(tokio::sync::Mutex::new(())),
}
}
}
impl PersistSink for StoreSink {
fn commit(
async fn commit(
&self,
snaps: Vec<ConvSnap>,
res: Vec<ToolResJob>,
gate: ResGate,
) -> impl Future<Output = CommitOutcome> + Send {
commit_batch(&self.store, snaps, res, gate, now_unix())
) -> CommitOutcome {
let _index = self.index_lock.lock().await;
commit_batch(&self.store, snaps, res, gate, now_unix()).await
}
}