arcadiasuite/.planning/FASE_4_OPENCLAW_PLAN.md

14 KiB

Fase 4: OpenClaw Embutido — Plano de Implementação

Fase: 4 Data Início: 2026-03-26 Prazo: 2026-04-08 (Semanas 7-8) Status: 🔄 Sprint 3 Pendente (Sprint 1 e 2 concluídos)


1. OBJETIVO DA FASE

Implementar detecção proativa de padrões e sugestão emergente de skills, transformando comportamentos repetitivos do usuário em automações reutilizáveis através de um widget conversacional flutuante.

Entregável Final

Skills emergentes funcionando end-to-end:

  • Usuário executa ação repetida → PatternDetector detecta → OpenClawWidget sugere → Blackboard gera DRAFT → Dev Center aprova → Skill disponível

2. ARQUITETURA

FLUXO OPENCCLAW:

1. USER INTERACTION
   └─ Usuário usa Arcádia
   └─ Learning API registra evento (já existe)
   └─ Neo4j armazena interação

2. PATTERN DETECTION (NOVO)
   └─ PatternDetector analisa Learning API
   └─ Identifica: 3+ ocorrências em 30 dias
   └─ Calcula confiança (threshold 0.8+)
   └─ Dispara evento no Socket.IO

3. WIDGET SUGGESTION (NOVO)
   └─ OpenClawWidget fica "ouvindo"
   └─ Recebe evento de padrão detectado
   └─ Exibe notificação flutuante
   └─ Modal SkillSuggestion mostra preview

4. SKILL GENERATION (NOVO)
   └─ Usuário confirma
   └─ OpenClawEngine chama Blackboard
   └─ Blackboard gera código (DRAFT)
   └─ Armazena em database

5. APPROVAL FLOW (EXISTENTE - Dev Center)
   └─ Skill DRAFT aparece em Dev Center
   └─ Admin/Lead revisa e aprova
   └─ Publica no tenant
   └─ Skill fica disponível para reutilização

Componentes para Implementar

BACKEND:
server/modules/openclaw/
├── PatternDetector.ts         ← [NOVO] Detecta padrões
├── SkillEmergence.ts          ← [NOVO] Coordena criação
├── OpenClawEngine.ts          ← [NOVO] Lógica central
├── config/
│   └── arcadia.config.yaml    ← [NOVO] Configuração

FRONTEND:
client/src/components/openclaw/
├── OpenClawWidget.tsx         ← [NOVO] Widget flutuante
├── PatternDetector.ts         ← [NOVO] Hook de detecção
├── SkillSuggestion.tsx        ← [NOVO] Modal de sugestão
└── useAgentEmergence.ts       ← [NOVO] Lógica de emergência

3. DEPENDÊNCIAS VERIFICADAS

Componente Status Localização
Skills Engine Pronto server/skills/engine.ts
Blackboard Pronto server/blackboard/service.ts
Dev Center Pronto client/src/pages/DevCenter.tsx
Learning API Existe /api/learning/*
Neo4j (KG) Running Docker
Socket.IO Configurado server/socket-io.ts
PostgreSQL Rodando Docker
Scientist (MiroFlow) Existe /api/manus/scientist/*

Conclusão: Todas as dependências estão prontas


4. TASKS DETALHADAS

SPRINT 1 (26-27/03): PatternDetector Backend — COMPLETO

Task 1.1: Criar PatternDetector.ts

Arquivo: server/modules/openclaw/PatternDetector.ts Objetivo: Analisar eventos de usuário e detectar padrões

// Pseudocódigo da estrutura
export class PatternDetector {
  // Config
  min_occurrences: 3;
  time_window_days: 30;
  confidence_threshold: 0.8;

  // Métodos
  detectPattern(userId: string, action: string): Pattern | null
  calculateConfidence(interactions: Interaction[]): number
  storePattern(pattern: Pattern): Promise<void>
  emitEvent(pattern: Pattern): void
}

Entrada: Eventos do Learning API (/api/learning/interactions) Saída: Pattern objects armazenados em Neo4j + Socket.IO event Dependência: Learning API funcionando

Task 1.2: Criar OpenClawEngine.ts

Arquivo: server/modules/openclaw/OpenClawEngine.ts Objetivo: Orquestração central de OpenClaw

export class OpenClawEngine {
  patternDetector: PatternDetector;
  skillEmergence: SkillEmergence;

  // Métodos
  async suggestSkill(pattern: Pattern): Promise<SkillSuggestion>
  async onUserConfirmation(suggestion: SkillSuggestion): Promise<Skill>
  async checkPatternsPeriodicly(): Promise<void>
}

Entrada: Padrões detectados Saída: Sugestões + Skills gerados Evento: Socket.IO broadcast /openclaw/pattern-detected

Task 1.3: Criar SkillEmergence.ts

Arquivo: server/modules/openclaw/SkillEmergence.ts Objetivo: Integração com Blackboard para codegen

export class SkillEmergence {
  async generateSkillDraft(pattern: Pattern): Promise<SkillDraft> {
    // 1. Montar prompt baseado no padrão
    // 2. Chamar POST /api/blackboard/generate-skill
    // 3. Receber código gerado
    // 4. Salvar como DRAFT no database
    // 5. Notificar Dev Center
    // 6. Retornar skill DRAFT
  }
}

Integração: POST /api/blackboard/generate-skill Database: skills table (com status: 'draft')

Task 1.4: Criar rotas OpenClaw

Arquivo: server/modules/openclaw/routes.ts Rotas:

POST /api/openclaw/detect-patterns         ← Trigger manual de análise
GET  /api/openclaw/patterns                ← Listar padrões detectados
POST /api/openclaw/confirm-skill           ← Usuário confirma sugestão
GET  /api/openclaw/suggestions             ← Histórico de sugestões

Task 1.5: Integrar em server/index.ts

Arquivo: server/index.ts Ação: Importar rotas OpenClaw e carregá-las

import openclawRoutes from "./modules/openclaw/routes";
app.use("/api/openclaw", openclawRoutes);

SPRINT 2 (28-29/03): Frontend Widgets — COMPLETO (commit 5231166)

Task 2.1: Criar OpenClawWidget.tsx

Arquivo: client/src/components/openclaw/OpenClawWidget.tsx Objetivo: Widget flutuante que recebe notificações de padrões

export function OpenClawWidget() {
  // Escutar Socket.IO event: /openclaw/pattern-detected
  // Exibir notificação flutuante (canto inferior direito)
  // Mostrar padrão detectado
  // Botão "Ver Sugestão" abre modal
  // Botão "Ignorar" descarta

  return (
    <div className="fixed bottom-4 right-4">
      {/* Widget flutuante */}
    </div>
  );
}

Socket.IO: Escuta evento /openclaw/pattern-detected Trigger: Modal SkillSuggestion

Task 2.2: Criar SkillSuggestion.tsx

Arquivo: client/src/components/openclaw/SkillSuggestion.tsx Objetivo: Modal com preview da skill sugerida

export function SkillSuggestion({ pattern, suggestion }) {
  // Modal mostra:
  // 1. "Detectamos um padrão na sua utilização:"
  // 2. Preview do padrão (ações repetidas)
  // 3. Preview da automação gerada
  // 4. Campo de nome (auto-preenchido)
  // 5. Descrição (auto-gerada)
  // 6. Botão "Criar Skill" ou "Cancelar"

  const handleCreate = async () => {
    // POST /api/openclaw/confirm-skill
    // Esperar resposta (skill DRAFT)
    // Toast: "Skill criada! Vá para Dev Center para publicar"
  };
}

Integração: Chama POST /api/openclaw/confirm-skill Feedback: Toast notification

Task 2.3: Hook useAgentEmergence.ts

Arquivo: client/src/hooks/useAgentEmergence.ts Objetivo: Lógica de emergência de agentes

export function useAgentEmergence(userId: string) {
  const [suggestions, setSuggestions] = useState([]);

  useEffect(() => {
    // Socket.IO listener
    socket.on("openclaw:pattern-detected", (pattern) => {
      // Filtrar por tenant, user prefs
      // Atualizar suggestions state
      setSuggestions([...suggestions, pattern]);
    });
  }, []);

  return { suggestions, dismiss, confirm };
}

Task 2.4: Integrar Widget em layout principal

Arquivo: client/src/App.tsx ou client/src/layouts/MainLayout.tsx Ação: Adicionar OpenClawWidget ao layout persistente

import { OpenClawWidget } from "@/components/openclaw/OpenClawWidget";

export default function App() {
  return (
    <>
      {/* Conteúdo existente */}
      <OpenClawWidget />  {/* ← Adicionar aqui */}
    </>
  );
}

SPRINT 3 (30-31/03): Configuração e Integração — PRÓXIMO

Task 3.1: Criar arcadia.config.yaml

Arquivo: server/modules/openclaw/config/arcadia.config.yaml

openclaw:
  enabled: true

  # Endpoints
  arcadia_api_url: http://localhost:3000/api
  arcadia_kg_url: http://localhost:7474
  blackboard_url: http://localhost:3000/api/blackboard

  # Tenant awareness
  tenant_aware: true

  # Detecção de padrões
  pattern_detection:
    enabled: true
    min_occurrences: 3
    time_window_days: 30
    confidence_threshold: 0.8
    scheduled_check_interval_minutes: 60

  # Sugestões
  suggestions:
    enabled: true
    auto_suggest: false          # Sempre pedir confirmação do usuário
    channels: ['widget', 'chat']
    priority_threshold: 0.85

  # Skills emergentes
  emergence:
    create_as_draft: true        # Sempre requer aprovação
    auto_publish: false
    notify_admins: true
    skill_prefix: "emergent_"    # Prefixo para skills auto-geradas

  # Logging
  logging:
    enabled: true
    store_patterns: true
    store_in_kg: true
    audit_trail: true

Task 3.2: Integrar Socket.IO events

Arquivo: server/socket-io.ts Ação: Adicionar listeners e emitters para OpenClaw

socket.on("openclaw:confirm-skill", async (data) => {
  // Receber confirmação do usuário
  // Chamar SkillEmergence.generateSkillDraft()
  // Emitir "openclaw:skill-created"
});

// Emitter no PatternDetector
io.emit("openclaw:pattern-detected", pattern);

Task 3.3: Database schema para OpenClaw

Arquivo: shared/schema.ts (Drizzle ORM) Adicionar tabelas:

// Padrões detectados
export const detectedPatterns = pgTable("detected_patterns", {
  id: serial().primaryKey(),
  tenant_id: uuid().notNull(),
  user_id: uuid().notNull(),
  action_type: varchar(255).notNull(),
  occurrences: integer().notNull(),
  confidence: numeric(3, 2).notNull(),
  time_window_days: integer().notNull(),
  created_at: timestamp().defaultNow(),
  metadata: jsonb(),
});

// Sugestões geradas
export const skillSuggestions = pgTable("skill_suggestions", {
  id: serial().primaryKey(),
  pattern_id: integer().references(() => detectedPatterns.id),
  skill_draft_id: uuid().references(() => skills.id),
  status: varchar(50).notNull(), // 'suggested', 'accepted', 'rejected'
  created_at: timestamp().defaultNow(),
});

Task 3.4: Migration SQL

Arquivo: migrations/0004_openclaw_tables.sql

CREATE TABLE detected_patterns (
  id SERIAL PRIMARY KEY,
  tenant_id UUID NOT NULL,
  user_id UUID NOT NULL,
  action_type VARCHAR(255) NOT NULL,
  occurrences INTEGER NOT NULL,
  confidence NUMERIC(3,2) NOT NULL,
  time_window_days INTEGER NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  metadata JSONB
);

CREATE TABLE skill_suggestions (
  id SERIAL PRIMARY KEY,
  pattern_id INTEGER REFERENCES detected_patterns(id),
  skill_draft_id UUID REFERENCES skills(id),
  status VARCHAR(50) NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX idx_detected_patterns_user_tenant
  ON detected_patterns(user_id, tenant_id);

Task 3.5: Testes unitários

Arquivo: tests/openclaw.test.ts

  • PatternDetector detecta padrão corretamente
  • OpenClawEngine orquestra fluxo correto
  • SkillEmergence integra com Blackboard
  • Socket.IO emite eventos corretamente

Task 3.6: Documentação

Arquivo: DOCUMENTATION.md (adicionar seção)

  • Como OpenClaw funciona
  • Configuração por tenant
  • Troubleshooting

5. TIMELINE

Data Sprint Tasks Status
26-27/03 1 PatternDetector backend Completo
26/03 2 OpenClawWidget frontend Completo (commit 5231166)
26/03 3 Migration DB + testes Próximo
01-08/04 Buffer Refinamento, testes E2E Próximo

Nota: Trabalho em /opt/arcadia_merged/ (diretório canônico do projeto).


6. CRITÉRIOS DE SUCESSO

PatternDetector funciona:

  • Detecta padrão após 3 ocorrências em 30 dias
  • Confiança calculada corretamente
  • Eventos emitidos para Socket.IO

OpenClawWidget funciona:

  • Widget aparece quando padrão é detectado
  • Modal mostra sugestão corretamente
  • Usuário pode confirmar ou rejeitar

SkillEmergence funciona:

  • Integra com Blackboard
  • Gera skill como DRAFT
  • Aparece em Dev Center para aprovação

E2E funciona:

  • User faz ação 3x
  • Widget sugere
  • Approva
  • Skill publicada
  • Skill disponível para reutilização

7. RISCOS E MITIGAÇÕES

Risco Probabilidade Mitigação
Blackboard não retorna código correto Média Testar integração antes, ter fallback
Padrões detectados incorretamente Média Validar threshold, testes no KG
Socket.IO não emite em tempo real Baixa Já funciona em outras partes
Performance com muitos eventos Média Usar índices em PG, cache em Redis

8. BRANCH E COMMITS

Branch: Servidor (deploy branch, conforme feedback anterior) Commit pattern:

feat(openclaw): PatternDetector backend
feat(openclaw): OpenClawWidget frontend
feat(openclaw): Integração Blackboard + esquema DB
docs(openclaw): Documentação e testes

9. PRÓXIMAS AÇÕES

  1. 26/03: Sprint 1 concluído (PatternDetector, OpenClawEngine, SkillEmergence, routes, config)
  2. 26/03: Sprint 2 concluído (OpenClawWidget, SkillSuggestion, useAgentEmergence, App.tsx — commit 5231166)
  3. Agora: Sprint 3 — migration SQL + vitest + testes unitários em /opt/arcadia_merged/
  4. 01-08/04: Refinamento e testes E2E

Fase 4: OpenClaw Embutido — Plano Executável Data: 2026-03-26 Pronto para implementação