ocerebro 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/pyproject.toml +1 -1
- package/src/mcp/server.py +91 -11
package/package.json
CHANGED
package/pyproject.toml
CHANGED
package/src/mcp/server.py
CHANGED
|
@@ -282,7 +282,7 @@ class CerebroMCP:
|
|
|
282
282
|
),
|
|
283
283
|
Tool(
|
|
284
284
|
name="cerebro_dream",
|
|
285
|
-
description="
|
|
285
|
+
description="Prepara prompt para extração de memórias - use cerebro_capture_memory após receber o prompt",
|
|
286
286
|
inputSchema={
|
|
287
287
|
"type": "object",
|
|
288
288
|
"properties": {
|
|
@@ -290,15 +290,28 @@ class CerebroMCP:
|
|
|
290
290
|
"type": "integer",
|
|
291
291
|
"description": "Dias para analisar (padrão: 7)",
|
|
292
292
|
"default": 7
|
|
293
|
-
},
|
|
294
|
-
"dry_run": {
|
|
295
|
-
"type": "boolean",
|
|
296
|
-
"description": "Se True, apenas simula (padrão: True)",
|
|
297
|
-
"default": True
|
|
298
293
|
}
|
|
299
294
|
}
|
|
300
295
|
}
|
|
301
296
|
),
|
|
297
|
+
Tool(
|
|
298
|
+
name="cerebro_capture_memory",
|
|
299
|
+
description="Captura memórias da conversa atual e salva nos arquivos - requer prompt do cerebro_dream",
|
|
300
|
+
inputSchema={
|
|
301
|
+
"type": "object",
|
|
302
|
+
"properties": {
|
|
303
|
+
"prompt": {
|
|
304
|
+
"type": "string",
|
|
305
|
+
"description": "Prompt de extração retornado por cerebro_dream"
|
|
306
|
+
},
|
|
307
|
+
"memory_dir": {
|
|
308
|
+
"type": "string",
|
|
309
|
+
"description": "Diretório de memória (opcional)"
|
|
310
|
+
}
|
|
311
|
+
},
|
|
312
|
+
"required": ["prompt"]
|
|
313
|
+
}
|
|
314
|
+
),
|
|
302
315
|
Tool(
|
|
303
316
|
name="cerebro_remember",
|
|
304
317
|
description="Revisão e promoção de memórias (replica /remember do Claude Code) - classifica memórias por tipo e detecta duplicatas/conflitos entre camadas",
|
|
@@ -366,6 +379,8 @@ class CerebroMCP:
|
|
|
366
379
|
result = self._remember(arguments)
|
|
367
380
|
elif name == "cerebro_gc":
|
|
368
381
|
result = self._gc(arguments)
|
|
382
|
+
elif name == "cerebro_capture_memory":
|
|
383
|
+
result = self._capture_memory(arguments)
|
|
369
384
|
else:
|
|
370
385
|
return [TextContent(type="text", text=f"Ferramenta desconhecida: {name}")]
|
|
371
386
|
|
|
@@ -598,13 +613,78 @@ class CerebroMCP:
|
|
|
598
613
|
return self.memory_diff.generate_report(result, format=format)
|
|
599
614
|
|
|
600
615
|
def _dream(self, args: Dict[str, Any]) -> str:
|
|
601
|
-
"""
|
|
602
|
-
|
|
603
|
-
|
|
616
|
+
"""Prepara prompt para extração de memórias.
|
|
617
|
+
|
|
618
|
+
Retorna o prompt de extração + instruções para usar cerebro_capture_memory.
|
|
619
|
+
"""
|
|
620
|
+
from src.consolidation.dream import (
|
|
621
|
+
run_dream,
|
|
622
|
+
build_extract_dream_prompt,
|
|
623
|
+
scan_memory_files,
|
|
624
|
+
format_memory_manifest,
|
|
625
|
+
count_transcript_messages
|
|
626
|
+
)
|
|
604
627
|
|
|
628
|
+
since_days = args.get("since_days", 7)
|
|
605
629
|
memory_dir = get_auto_mem_path()
|
|
606
|
-
|
|
607
|
-
|
|
630
|
+
|
|
631
|
+
# Scan de memórias existentes
|
|
632
|
+
existing = scan_memory_files(memory_dir)
|
|
633
|
+
existing_manifest = format_memory_manifest(existing)
|
|
634
|
+
|
|
635
|
+
# Contagem de mensagens novas
|
|
636
|
+
message_count = count_transcript_messages(since_days)
|
|
637
|
+
|
|
638
|
+
if message_count == 0:
|
|
639
|
+
return "Nenhuma mensagem nova nos últimos {} dias. O prompt de extração não será gerado.".format(since_days)
|
|
640
|
+
|
|
641
|
+
# Build do prompt
|
|
642
|
+
prompt_sections = build_extract_dream_prompt(
|
|
643
|
+
new_message_count=message_count,
|
|
644
|
+
existing_memories=existing_manifest,
|
|
645
|
+
memory_dir=memory_dir,
|
|
646
|
+
)
|
|
647
|
+
full_prompt = "\n".join(prompt_sections)
|
|
648
|
+
|
|
649
|
+
return f"""=== PROMPT DE EXTRAÇÃO ({message_count} mensagens, {since_days} dias) ===
|
|
650
|
+
|
|
651
|
+
{full_prompt}
|
|
652
|
+
|
|
653
|
+
---
|
|
654
|
+
INSTRUÇÃO: Copie este prompt e use a ferramenta cerebro_capture_memory com:
|
|
655
|
+
{{"prompt": "<cole o prompt acima>"}}
|
|
656
|
+
|
|
657
|
+
Ou execute manualmente: ocerebro dream --since {since_days} --apply
|
|
658
|
+
"""
|
|
659
|
+
|
|
660
|
+
def _capture_memory(self, args: Dict[str, Any]) -> str:
|
|
661
|
+
"""Captura memórias usando o prompt fornecido.
|
|
662
|
+
|
|
663
|
+
Esta ferramenta deve ser chamada após cerebro_dream retornar o prompt.
|
|
664
|
+
"""
|
|
665
|
+
prompt = args.get("prompt")
|
|
666
|
+
if not prompt:
|
|
667
|
+
return "Erro: 'prompt' é obrigatório para cerebro_capture_memory"
|
|
668
|
+
|
|
669
|
+
memory_dir_str = args.get("memory_dir")
|
|
670
|
+
memory_dir = Path(memory_dir_str) if memory_dir_str else get_auto_mem_path()
|
|
671
|
+
|
|
672
|
+
# Instrui o Claude a usar o prompt para extrair memórias
|
|
673
|
+
return f"""Prompt de extração recebido.
|
|
674
|
+
|
|
675
|
+
Diretório de memória: {memory_dir}
|
|
676
|
+
|
|
677
|
+
O Claude deve agora analisar a conversa usando este prompt e salvar as memórias
|
|
678
|
+
nos arquivos .md apropriados em {memory_dir}
|
|
679
|
+
|
|
680
|
+
Formato esperado:
|
|
681
|
+
- user_*.md para memórias sobre o usuário
|
|
682
|
+
- feedback_*.md para feedbacks e convenções
|
|
683
|
+
- project_*.md para decisões e fatos do projeto
|
|
684
|
+
- reference_*.md para ponteiros externos
|
|
685
|
+
|
|
686
|
+
Use FileWrite para criar os arquivos de memória.
|
|
687
|
+
"""
|
|
608
688
|
|
|
609
689
|
def _remember(self, args: Dict[str, Any]) -> str:
|
|
610
690
|
"""Revisão e promoção de memórias"""
|