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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ocerebro",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "OCerebro - Sistema de Memoria para Agentes (Claude Code/MCP)",
5
5
  "main": "bin/ocerebro.js",
6
6
  "bin": {
package/pyproject.toml CHANGED
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "ocerebro"
7
- version = "0.2.0"
7
+ version = "0.2.1"
8
8
  description = "OCerebro - Sistema de Memoria para Agentes (Claude Code/MCP)"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
package/src/mcp/server.py CHANGED
@@ -282,7 +282,7 @@ class CerebroMCP:
282
282
  ),
283
283
  Tool(
284
284
  name="cerebro_dream",
285
- description="Extração automática de memórias (replica extractMemories do Claude Code) - analisa transcript e extrai memórias para user/feedback/project/reference",
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
- """Extração automática de memórias"""
602
- since_days = args.get("since_days", 7)
603
- dry_run = args.get("dry_run", True)
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
- result = run_dream(memory_dir=memory_dir, since_days=since_days, dry_run=dry_run)
607
- return generate_dream_report(result)
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"""