File size: 3,916 Bytes
fb56537
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# aduc_framework/engineers/planner_2d.py
#
# Copyright (C) August 4, 2025  Carlos Rodrigues dos Santos
#
# Versão 2.1.0 (Focused 3-Step Plan)
# Esta versão desativa temporariamente a Etapa 4 (revisão) para focar na
# geração da estrutura de atos, que é o insumo para a próxima fase.
# A mensagem final para o orquestrador foi aprimorada.

import logging
from typing import List, Dict, Any, Generator, Optional, Callable

logger = logging.getLogger(__name__)

class Planner2D:
    """
    O Planner2D cria o plano de trabalho estratégico (o `execution_plan`)
    para a fase de pré-produção, focando na construção progressiva da narrativa.
    """

    def generate_execution_plan(
        self,
        global_prompt: str,
        num_scenes: int,
        max_duration_per_act: float,
        fast_mode: bool,
        callback: Optional[Callable] = None
    ) -> Generator[Dict[str, Any], None, List[Dict[str, Any]]]:
        """
        Cria e emite o plano de execução para a pré-produção.
        """
        message = "Planner2D (Arquiteto): Criando novo plano de execução focado em narrativa..."
        logger.info(message)
        if callback: callback(0.0, desc="Arquiteto iniciando o planejamento...")
        yield {"status": "planning", "progress": 0.0, "message": message}
        
        execution_plan: List[Dict[str, Any]]

        if fast_mode:
            logger.info("Planner2D: Modo Rápido ativado. Consolidando tarefas de planejamento.")
            execution_plan = [
                {
                    "task_id": "FAST_01_GENERATE_SCENES_AND_ACTS",
                    "description": "(Modo Rápido) Gerando a estrutura completa de Cenas e Atos...",
                    "inputs": {"global_prompt": global_prompt, "num_scenes": num_scenes},
                    "status": "pending"
                }
            ]
        else:
            # --- MUDANÇA PRINCIPAL AQUI ---
            logger.info("Planner2D: Modo Detalhado ativado com 3 etapas (Etapa 4 desativada temporariamente).")
            execution_plan = [
                {
                    "task_id": "STEP_01_CREATE_CONTINUOUS_STORY",
                    "description": "Etapa 1/3: Criando a história contínua...",
                    "inputs": {"global_prompt": global_prompt, "num_scenes": num_scenes},
                    "status": "pending"
                },
                {
                    "task_id": "STEP_02_CREATE_INDEPENDENT_SCENES",
                    "description": "Etapa 2/3: Refinando cada parágrafo em uma cena independente...",
                    "inputs": {},
                    "status": "pending"
                },
                {
                    "task_id": "STEP_03_FRAGMENT_SCENES_INTO_ACTS",
                    "description": "Etapa 3/3: Detalhando cada cena em atos independentes...",
                    "inputs": {},
                    "status": "pending"
                },
                # {
                #     "task_id": "STEP_04_FINAL_REVIEW",
                #     "description": "Etapa 4/4: Realizando a revisão final de coerência...",
                #     "inputs": {"global_prompt": global_prompt},
                #     "status": "pending"
                # }
            ]
        
        # --- MENSAGEM FINAL APRIMORADA ---
        message = f"Planner2D (Arquiteto): Plano de pré-produção finalizado com {len(execution_plan)} etapas. Entregando para o Composer (Encarregado) executar."
        logger.info(message)
        if callback:
            callback(0.1, desc="Plano estratégico concluído. Iniciando execução...")

        # Este yield informa ao Orquestrador que o planejamento terminou e entrega o plano final.
        yield {"status": "planning_complete", "progress": 0.1, "message": message, "plan": execution_plan}
        
        return execution_plan

# --- Instância Singleton ---
planner_2d_singleton = Planner2D()