feat(memory): injecter le rappel mémoire dans le convention file à l'activation (§14.5.4)
À l'activation d'un agent, LaunchAgent compose désormais une section « # Mémoire projet » dans le convention file généré (CLAUDE.md/AGENTS.md…), au même titre que les skills assignés (§14.2). Les agents lisent ainsi la mémoire projet sans aucun flag ni mécanisme propre à une CLI. - LaunchAgent reçoit le port MemoryRecall (Arc<dyn MemoryRecall>), résout le rappel (budget AGENT_MEMORY_RECALL_BUDGET=2048, requête = persona de l'agent) en best-effort : mémoire vide/absente ou erreur ⇒ section omise, le launch n'est jamais bloqué (comme un SkillRef dangling). - compose_convention_file gagne un argument `memory: &[MemoryIndexEntry]` (reste pure) ; section injectée seulement pour la stratégie conventionFile. - state.rs : une seule instance NaiveMemoryRecall partagée (recall + LaunchAgent). Tests: 57 binaires verts. compose_convention_file (vide ⇒ inchangé, ordre, cohabitation skills) + intégration LaunchAgent (section présente / absente / best-effort sur erreur / pas d'injection en stratégie env). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -362,6 +362,15 @@ impl AppState {
|
||||
));
|
||||
let skill_store_port = Arc::clone(&skill_store) as Arc<dyn SkillStore>;
|
||||
|
||||
// Memory store + naïve recall (LOT A/B — §14.5.1/§14.5.4). Built here so the
|
||||
// recall port can be injected into LaunchAgent below (it composes the project
|
||||
// memory recall into the convention file at activation); the memory use cases
|
||||
// are wired further down from these same instances.
|
||||
let memory_store = Arc::new(FsMemoryStore::new(Arc::clone(&fs_port)));
|
||||
let memory_store_port = Arc::clone(&memory_store) as Arc<dyn MemoryStore>;
|
||||
let memory_recall_port =
|
||||
Arc::new(NaiveMemoryRecall::new(Arc::clone(&memory_store_port))) as Arc<dyn MemoryRecall>;
|
||||
|
||||
let create_agent = Arc::new(CreateAgentFromScratch::new(
|
||||
Arc::clone(&contexts_port),
|
||||
Arc::clone(&ids) as Arc<dyn IdGenerator>,
|
||||
@ -386,6 +395,7 @@ impl AppState {
|
||||
Arc::clone(&terminal_sessions),
|
||||
Arc::clone(&events_port),
|
||||
Arc::clone(&ids) as Arc<dyn IdGenerator>,
|
||||
Arc::clone(&memory_recall_port),
|
||||
));
|
||||
|
||||
// --- Conversation inspection (T7) ---
|
||||
@ -480,12 +490,12 @@ impl AppState {
|
||||
Arc::clone(&events_port),
|
||||
));
|
||||
|
||||
// --- Memory store + use cases (LOT A — §14.5.1) ---
|
||||
// A single FsMemoryStore takes the project root per call (like the skill
|
||||
// store), so one instance serves every open project. The mutating use
|
||||
// cases share the event bus to announce Memory{Saved,Deleted}.
|
||||
let memory_store = Arc::new(FsMemoryStore::new(Arc::clone(&fs_port)));
|
||||
let memory_store_port = Arc::clone(&memory_store) as Arc<dyn MemoryStore>;
|
||||
// --- Memory use cases (LOT A — §14.5.1) ---
|
||||
// `memory_store` / `memory_store_port` / `memory_recall_port` are built
|
||||
// earlier (above LaunchAgent, which needs the recall port). A single
|
||||
// FsMemoryStore takes the project root per call (like the skill store), so
|
||||
// one instance serves every open project. The mutating use cases share the
|
||||
// event bus to announce Memory{Saved,Deleted}.
|
||||
let create_memory = Arc::new(CreateMemory::new(
|
||||
Arc::clone(&memory_store_port),
|
||||
Arc::clone(&events_port),
|
||||
@ -503,12 +513,11 @@ impl AppState {
|
||||
let read_memory_index = Arc::new(ReadMemoryIndex::new(Arc::clone(&memory_store_port)));
|
||||
let resolve_memory_links =
|
||||
Arc::new(ResolveMemoryLinks::new(Arc::clone(&memory_store_port)));
|
||||
// Naïve recall (LOT B): composes the same store, returns index entries in
|
||||
// order, truncated to the token budget. The default, dependency-free
|
||||
// MemoryRecall; substitutable by a VectorMemoryRecall (LOT C).
|
||||
let memory_recall_port =
|
||||
Arc::new(NaiveMemoryRecall::new(Arc::clone(&memory_store_port))) as Arc<dyn MemoryRecall>;
|
||||
let recall_memory = Arc::new(RecallMemory::new(memory_recall_port));
|
||||
// Naïve recall (LOT B): the same instance injected into LaunchAgent above —
|
||||
// composes the store, returns index entries in order truncated to the token
|
||||
// budget. The default, dependency-free MemoryRecall; substitutable by a
|
||||
// VectorMemoryRecall (LOT C).
|
||||
let recall_memory = Arc::new(RecallMemory::new(Arc::clone(&memory_recall_port)));
|
||||
|
||||
// --- Orchestrator service (§14.3) ---
|
||||
// Dispatches file-based orchestrator requests through the *same* use cases
|
||||
|
||||
Reference in New Issue
Block a user