Public Markdown Document
đïž Fastapp Engine â Arquitetura
Documento vivo. Atualizado para refletir o motor Anti Gravity e a Sovereign Navigation Architecture .
đïž Fastapp Engine â Arquitetura
Documento vivo. Atualizado para refletir o motor Anti-Gravity e a Sovereign Navigation Architecture.
VisĂŁo Geral
O Fastapp Engine é uma fåbrica de aplicaçÔes. O motor genérico (Core) interpreta definiçÔes JSON e renderiza CRUD, formulårios, tabelas e navegação automaticamente. Seguimos uma abordagem de Escada de Abstração (Core L1, L2, L3) para garantir que a complexidade seja tratada pelo motor, e não pela customização.
đ DimensĂ”es de Documentação
- đ°ïž Diretrizes Anti-Gravity: O Norte e as Leis de Abstração.
- đïž Hierarquia e Metadados: Estrutura de App, Module, Object e Property.
- đ§Ź Taxonomia de Dados: A semĂąntica que governa o comportamento.
- đ Protocolo Fadap: Sincronização entre Metadados e Storage.
- đ Sistema de Workflow: Manual tĂ©cnico de fluxos Human-Led.
- đ§ Sistema de Tutoriais: Onboarding interativo com Driver.js.
- đ± WAHA Integration: Camada de infraestrutura para WhatsApp (envio + webhook).
- đŁ Sistema de Comunicados: Painel de regras de notificacao por evento (e-mail + WhatsApp).
graph TB
subgraph "A FĂĄbrica (Fastapp Engine)"
SEED["đ± Seed / Builder"]
SNAPSHOT["đž Snapshot"]
API["đ API DinĂąmica v1"]
CORE["âïž Core Components"]
STORE["đïž System Store"]
end
subgraph "Modelo 01 (CRM Flux)"
CRM_PAGES["đ Dashboard + Kanban"]
CRM_COMPS["đ§© Lead Components"]
CRM_STORE["đŸ Lead Store + Offline"]
end
subgraph "Modelo 02...N (Futuro)"
FUTURE["đ« Helpdesk, đŠ InventĂĄrio..."]
end
SEED --> SNAPSHOT --> STORE
SEED --> API
STORE --> CORE
API --> CORE
CORE --> CRM_PAGES
CORE --> FUTURE
CRM_COMPS --> CRM_PAGES
CRM_STORE --> CRM_PAGES
style SEED fill:#dc2626,color:#fff
style CORE fill:#4338ca,color:#fff
style API fill:#059669,color:#fff
style SNAPSHOT fill:#7c3aed,color:#fff
Stack
| Camada | Tecnologia | VersĂŁo |
|---|---|---|
| Framework | Nuxt 4 | ^4.3.1 |
| UI Components | PrimeVue (Aura) | ^4.5.4 |
| CSS | Tailwind CSS 3 + CSS custom properties | ^3.4.19 |
| State (Global / UI) | Pinia (system.ts) |
^0.11.3 |
| State (Data L3) | Pinia (appData.ts) |
SWR + Request Coalescing |
| Utilities | VueUse (@vueuse/nuxt) |
^14.2.1 |
| Forms | VeeValidate + Zod | ^4.15.1 / ^3.25.76 |
| Drag & Drop | vuedraggable | ^4.0.1 |
| Realtime | Socket.IO (client + server) | ^4.8.3 |
| ORM | Prisma | ^6.2.1 |
| DB | PostgreSQL (Supabase) | â |
Hierarquia: App â Module â Object â Property
erDiagram
APP ||--o{ MODULE : "contains"
APP ||--o{ OBJECT : "defines"
MODULE ||--o{ OBJECT_REF : "references"
OBJECT ||--|{ PROPERTY : "has"
APP {
string name
string slug
boolean is_active
boolean is_frozen
}
OBJECT {
string name
string label
string type
string crud_mode
string key_property
string label_property
}
PROPERTY {
string name
string label
string type
string content_type
boolean required
boolean show_in_list
boolean show_in_form
}
Taxonomia SemĂąntica de Objetos
Cada object no Fastapp Ă© classificado por 3 eixos independentes:
1. Categoria SemĂąntica (object.category)
Define o "comportamento de vida" do dado no ecossistema:
| Categoria | Descrição | Exemplo | Impacto no Gerador |
|---|---|---|---|
master |
Dado mestre, estĂĄvel, base para outros | Broker, AssetClass, User | Caches, dropdowns globais, busca por nome |
transactional |
Eventos, registros de fluxo, alta volatilidade | Transaction, Lead, UserAsset | Ăndices por data, logs de auditoria, filtros de perĂodo |
configuration |
ParĂąmetros do sistema ou do usuĂĄrio | AppSettings, WalletProfile | Interfaces simplificadas ("Settings Page") |
2. Natureza Arquitetural (object.nature)
Define onde o dado mora fisicamente:
| Natureza | Armazenamento | Comportamento |
|---|---|---|
physical |
Tabela prĂłpria no DB | ID Ășnico global, referenciĂĄvel por qualquer um |
embedded |
Dentro do JSON do pai | Sem tabela prĂłpria; morre se o pai for deletado |
virtual |
Calculado em runtime | AgregaçÔes (ex: total_balance do usuårio) |
3. Relacionamentos (object.relations[])
Tipos de VĂnculo:
relation.type |
SemĂąntica | Exemplo |
|---|---|---|
belongs_to |
ReferĂȘncia a um master ou pai | UserAsset â Broker |
has_one |
Propriedade de um filho Ășnico | User â WalletProfile |
has_many |
Propriedade de uma coleção | WalletProfile â UserAsset[] |
associates_with |
Relação N:N | Tag â Lead |
EstratĂ©gias de PersistĂȘncia:
relation.storage |
Como se salva | Quando usar |
|---|---|---|
reference_id |
Salva apenas o ID (FK relacional) | Dados independentes |
document_embed |
Salva o objeto inteiro no JSON | Dados acoplados ao pai |
pivot |
Tabela intermediåria | Relação N:N |
Matriz Category Ă Nature
graph TD
subgraph "master"
M_P["physical<br/>Broker, AssetClass<br/>Tabela prĂłpria"]
M_E["embedded<br/>â<br/>(raro)"]
M_V["virtual<br/>â<br/>(raro)"]
end
subgraph "transactional"
T_P["physical<br/>Lead, UserAsset<br/>Tabela c/ Ăndices"]
T_E["embedded<br/>Transaction<br/>JSON no pai"]
T_V["virtual<br/>TotalBalance<br/>Calculado"]
end
subgraph "configuration"
C_P["physical<br/>WalletProfile<br/>Tabela simples"]
C_E["embedded<br/>AppSettings<br/>JSON no App"]
C_V["virtual<br/>â<br/>(raro)"]
end
style M_P fill:#059669,color:#fff
style T_P fill:#2563eb,color:#fff
style T_E fill:#7c3aed,color:#fff
style T_V fill:#d97706,color:#fff
style C_P fill:#64748b,color:#fff
Exemplo Concreto: App GestĂŁo de Ativos
erDiagram
BROKER ||--o{ USER_ASSET : "belongs_to (reference_id)"
ASSET_CLASS ||--o{ USER_ASSET : "belongs_to (reference_id)"
USER_ASSET ||--|{ TRANSACTION : "has_many (document_embed)"
WALLET_PROFILE ||--o{ USER_ASSET : "has_many (reference_id)"
BROKER {
string name
string cnpj
category master
nature physical
}
ASSET_CLASS {
string name
enum risk_level
category master
nature physical
}
USER_ASSET {
string ticker
number quantity
number avg_price
category transactional
nature physical
}
TRANSACTION {
date date
enum type
number quantity
number price
category transactional
nature embedded
}
WALLET_PROFILE {
string name
number target_conservative
category configuration
nature physical
}
Meta-API & GestĂŁo de Sistema
Além do CRUD de dados (/api/v1/data), o Fastapp expÔe endpoints de gestão para evoluir a própria estrutura do sistema em tempo de execução.
1. Snapshot (POST /api/system/snapshot)
- Função: Gera uma "foto" eståtica do estado atual do banco (Apps, Objetos, Campos) em
app/fastapp/static-manifest.ts. - Uso: Freeze de versão para produção ou backup de schema.
2. Schema Evolution (PATCH /api/app/:id)
- Função: Permite alterar definiçÔes de objetos (adicionar campos, mudar layout) via API.
- Uso: Editores visuais (Builder) ou scripts de migração (ex:
apply-layout-grid.ts).
3. Storage Adaptation (POST /api/data/:object/storage) [Planejado]
- Função: Analisa a definição do objeto e executa DDL (Create/Alter Table) para alinhar o banco fĂsico.
- Uso: Transformar um objeto "Generic" (JSON) em "Native" (Tabela SQL) para performance, sem reiniciar o servidor.
4. Admin Portal (Ferramentas de GestĂŁo)
- Schema Manager: Interface visual para editar Apps e Objetos (
PATCH /api/app). Alavanca componentes dinĂąmicos para editar a si mesmo. - API Tester: "Mini Postman" integrado para testar endpoints do sistema (
/api/v1/data) e validar respostas. - AI Laboratory đ§Ș: VersĂŁo evoluĂda do Agent Playground. Permite simular personas, gerir blueprints temporĂĄrios (Laboratory Manifesto) e persistir contextos de anĂĄlise LLM no LocalStorage.
5. Custom Pages & Dynamic Routing
- Configuração: O manifesto suporta uma lista de
pages. - Roteamento:
page.type === 'custom': Aponta para um arquivo fĂsico empages/.page.type === 'dynamic_crud': Gera automaticamente a rota para o objeto.
- Visibilidade: O
AppMenu.vueresolve essas rotas dinamicamente para o sidebar.
Fluxo de Runtime â Onde vive a inteligĂȘncia
sequenceDiagram
participant URL as Browser URL
participant Page as Dynamic Page
participant Store as System Store
participant Static as static-manifest.ts
participant API as /api/app (GET)
participant DataAPI as /api/v1/data/:object
participant DynDB as dynamic-db.ts
participant NativeModel as Prisma Model (Lead)
participant RecordTable as Record Table (Generic)
URL->>Page: /crm/crm/lead
Page->>Store: fetchDefs()
Page->>AppData: fetchObjectData('lead') - non-blocking SWR
Note over AppData: Checking for pending promises...
alt Already fetching (Request Coalescing)
AppData-->>Page: await the same existing promise â
else Not in cache
AppData->>DataAPI: GET /api/v1/data/lead?$limit=100
DataAPI-->>AppData: Data[]
AppData-->>Page: Hydrated data â
end
alt is_static (Snapshot ativo)
Store->>Static: import StaticManifest
Static-->>Store: App[] (instantĂąneo)
else is_live (Dev / sem snapshot)
Store->>API: GET /api/app
API-->>Store: App[] (do banco)
end
Store-->>Page: objectSchema resolved
Page->>DataAPI: GET /api/v1/data/lead
DataAPI->>DynDB: isNativeModel("lead")?
alt Modelo nativo existe
DynDB->>NativeModel: prisma.lead.findMany()
NativeModel-->>DataAPI: Lead[]
else Modelo genérico (ex: tarefa)
DynDB->>RecordTable: prisma.record.findMany(object_name)
RecordTable-->>DataAPI: Record[] â flatten JSON
end
DataAPI-->>Page: data[]
API DinĂąmica v1
Endpoints
| Rota | Método | Descrição |
|---|---|---|
/api/v1/data/:object |
GET | Lista (com filtros e ordenação via query params) |
/api/v1/data/:object |
POST | Cria (com validação meta-driven) |
/api/v1/data/:object/:id |
GET | Busca por ID |
/api/v1/data/:object/:id |
PATCH | Atualiza (com validação) |
/api/v1/data/:object/:id |
DELETE | Remove |
EstratĂ©gia HĂbrida: Native vs Generic
graph LR
REQ["Request /api/v1/data/:object"]
META["meta-validation.ts<br/>Resolve properties do manifest"]
DYN["dynamic-db.ts<br/>isNativeModel?"]
subgraph "Caminho A: Native"
PRISMA["prisma.lead / prisma.app<br/>Model dedicado"]
end
subgraph "Caminho B: Generic"
RECORD["prisma.record<br/>data: Json + object_name"]
FLATTEN["Flatten: {id, ...data, timestamps}"]
end
REQ --> META --> DYN
DYN -->|"lead, app"| PRISMA
DYN -->|"tarefa, contato, ..."| RECORD --> FLATTEN
style PRISMA fill:#059669,color:#fff
style RECORD fill:#7c3aed,color:#fff
- Native: objetos com model Prisma dedicado (
lead,app). Performance mĂĄxima. - Generic: objetos criados no Builder. Usam tabela
Recordcomdata Json. Zero setup.
Validação Meta-Driven
graph TD
BODY["Request Body"] --> RESOLVE["resolveObjectProperties(name)"]
RESOLVE --> VALIDATE["validateBody(body, properties)"]
VALIDATE -->|"required fields"| CHECK_REQ["Campos obrigatĂłrios presentes?"]
VALIDATE -->|"type checking"| CHECK_TYPE["string/number/boolean correto?"]
CHECK_REQ -->|"â"| ERR400["400: Validation failed"]
CHECK_TYPE -->|"â"| ERR400
VALIDATE -->|"â"| CLEAN["cleanBody(body, properties)"]
CLEAN -->|"strip _tabId, unknowns"| SAVE["Save to DB"]
style ERR400 fill:#dc2626,color:#fff
style SAVE fill:#059669,color:#fff
Filtragem & Ordenação (URL-Driven)
A API aceita filtros e ordenação via query params. O frontend usa a URL como fonte Ășnica de verdade.
Query Parser (server/utils/query-parser.ts):
O motor agora prioriza o formato Flattened para query strings, facilitando a integração com APIs externas.
| Operador | Formato Flat (Soberano) | Formato Legado (Legacy) | Descrição |
|---|---|---|---|
= |
?campo=valor |
?filters[campo][=]=valor |
Igualdade simples |
ne |
?campo[ne]=valor |
?filters[campo][$ne]=valor |
Diferente |
gt / gte |
?campo[gt]=5 |
?filters[campo][$gt]=5 |
Maior que / Maior ou igual |
lt / lte |
?campo[lt]=10 |
?filters[campo][$lte]=10 |
Menor que / Menor ou igual |
like |
?campo[like]=mario |
?filters[campo][$like]=mario |
Busca textual (Case Insensitive) |
between |
?campo[between]=a,b |
?filters[campo][between]=a,b |
Intervalo de valores |
Paginação e Ordenação Soberana:
| Parùmetro | Tipo | Descrição | Exemplo |
|---|---|---|---|
$limit |
number |
Quantidade de registros por pĂĄgina | ?$limit=50 |
$skip |
number |
Quantidade de registros a pular | ?$skip=100 |
$sort[f] |
1 / -1 |
Ordenação (1=ASC, -1=DESC) | ?$sort[name]=1 |
granularity |
string |
Resolução temporal para BI | ?granularity=week |
Coerção automĂĄtica: "true" â boolean, "42" â number, "null" â null.
Fluxo URL-Driven:
sequenceDiagram
participant User as UsuĂĄrio
participant Filter as CoreDynamicFilter
participant URL as URL (query params)
participant Page as index.vue
participant API as /api/v1/data/:object
participant Table as CoreDynamicTable
Note over Filter: onMounted â readFromUrl()
User->>Filter: Seleciona campo, operador, valor
Filter->>URL: router.replace({ query })
URL->>Page: watch(route.query) dispara
Page->>API: GET /api/v1/data/lead?filters[status][=]=NOVO
API-->>Page: data[] filtrado
Page->>Table: :data="data"
Note over URL: URL bookmarkĂĄvel e compartilhĂĄvel
- Native models: filtros viram clĂĄusula
wheredo Prisma (performĂĄtico) - Generic records: filtros aplicados in-memory apĂłs fetch (JSON field)
Sistema de Snapshot
sequenceDiagram
participant Admin as Admin Panel
participant API as POST /api/system/snapshot
participant DB as PostgreSQL
participant FS as Filesystem
participant Store as System Store
Admin->>API: Clique "Gerar Snapshot"
API->>DB: prisma.app.findMany()
DB-->>API: App[] (com modules/objects JSON)
API->>FS: writeFileSync(static-manifest.ts)
FS-->>API: Arquivo gerado
API-->>Admin: Toast "Snapshot gerado!"
Note over Store: No próximo boot (produção):
Store->>FS: import StaticManifest
Note over Store: is_static = true, sem DB
Smart Store â Prioridade de Dados
| Condição | Fonte | is_static |
|---|---|---|
StaticManifest.length > 0 + produção |
Arquivo estĂĄtico | true |
Dev mode (import.meta.dev) |
API /api/app |
false |
| API falha + manifest existe | Arquivo estĂĄtico (fallback) | true |
| Nenhum manifest + API ok | API /api/app |
false |
is_frozen no App
Cada App pode ter is_frozen: true. Quando congelado, o sistema ignora a API e usa exclusivamente o arquivo estĂĄtico â simulando produção "compilada".
Componentes Core
graph TD
subgraph "Navegação Soberana"
HUB["CoreBuilderHub<br/>Top bar contextual"]
MENU["CoreAppMenu<br/>Sidebar colapsĂĄvel"]
end
subgraph "Orquestração"
CRUD["CoreDynamicCRUD<br/>mode: modal|page|inline"]
end
subgraph "Visualização"
TABLE["CoreDynamicTable<br/>columns via show_in_list"]
LIST["CoreDynamicList<br/>edição in-place"]
end
subgraph "Filtros"
FILTER["CoreDynamicFilter<br/>URL-driven, adaptive inputs"]
end
subgraph "FormulĂĄrio"
FORM["CoreDynamicForm<br/>VeeValidate + Zod runtime"]
FIELDS["CoreDynamicFields<br/>recursivo, layout vertical|inline"]
RENDERER["CoreFieldRenderer<br/>type â PrimeVue"]
end
subgraph "Ferramentas do Arquiteto"
ARCHITECT["FastApp Architect<br/>Schema Studio v3"]
FLOW["FastApp Flow<br/>Visual Metadata Explorer"]
AGENT["FastApp Agent<br/>Enterprise AI Copilot"]
end
HUB -->|contexto builder| ARCHITECT & FLOW & AGENT
MENU -->|contexto navegação| CRUD
CRUD --> TABLE & LIST
CRUD -->|Dialog| FORM
FORM --> FIELDS
FIELDS -->|inner_collection| FIELDS
FIELDS --> RENDERER
style CRUD fill:#4338ca,color:#fff
style FORM fill:#059669,color:#fff
style HUB fill:#0a0d14,color:#e2e8f0,stroke:#4338ca
style ARCHITECT fill:#6366f1,color:#fff
style FLOW fill:#2563eb,color:#fff
style AGENT fill:#7c3aed,color:#fff
Props & Eventos
| Componente | Props | Eventos |
|---|---|---|
CoreDynamicCRUD |
schema, data, mode, objectName |
create, update, delete, edit-click |
CoreDynamicTable |
schema, data |
edit, delete |
CoreDynamicList |
schema, data, editable |
edit, delete, update |
CoreDynamicForm |
properties, initialValues |
submit |
CoreDynamicFields |
properties, values, errors, prefix, setFieldValue, layout |
â |
CoreFieldRenderer |
property, modelValue |
update:modelValue |
CRUD Modes
| Modo | Criar | Editar | View Default |
|---|---|---|---|
modal |
Dialog | Dialog | Table |
page |
/create |
/[id] |
Table |
inline |
Dialog | In-place na lista | List |
Banco de Dados
model App {
id Int @id @default(autoincrement())
name String
slug String @unique
description String?
version String @default("1.0.0")
icon String @default("pi pi-box")
is_active Boolean @default(true)
is_frozen Boolean @default(false)
created_at DateTime @default(now())
modules Json @default("[]")
objects Json @default("[]")
}
model Lead {
id Int @id @default(autoincrement())
nome String
email String
whatsapp String
status String @default("NOVO")
ordem Int @default(0)
}
model Record {
id Int @id @default(autoincrement())
object_name String
data Json @default("{}")
created_at DateTime @default(now())
updated_at DateTime @updatedAt
@@index([object_name])
}
Lead = model nativo (performance). Record = tabela genérica para objetos dinùmicos.
Estrutura de DiretĂłrios
lead-nuxt/
âââ app/
â âââ components/
â â âââ core/ # âïž Motor dinĂąmico
â â â âââ BuilderHub.vue # đ§ Top bar contextual (Sovereign Nav)
â â â âââ AppMenu.vue # đ Sidebar colapsĂĄvel (route-driven)
â â â âââ DynamicCRUD.vue # Orquestrador (modal/page/inline)
â â â âââ DynamicFilter.vue # đ Filtro universal (URL-driven)
â â â âââ DynamicTable.vue # DataTable por metadados
â â â âââ DynamicList.vue # List view com inline editing
â â â âââ DynamicForm.vue # Zod runtime + VeeValidate (recursivo)
â â â âââ DynamicFields.vue # Recursivo (inner_collection, Ontology v3)
â â â âââ FieldRenderer.vue # type â PrimeVue component
â â â âââ AssetUpload.vue # Upload para semantic: asset
â â â âââ MapRenderer.vue # Mapa L2 (spatial_type: point)
â â âââ fastapp/ # đïž Ferramentas do Arquiteto
â â â âââ AgentChat.vue # Chat streaming com AI Architect
â â â âââ FastNode.vue # Node customizado para Vue Flow
â â â âââ PropertyListEditor # Editor visual de propriedades
â â â âââ SchemaPropertyMgr # Manager de schemas v3
â â âââ crm/ # đ Custom: CRM Flux
â â âââ sosplantao/ # đ„ Custom: SosPlantĂŁo
â â âââ central-filtros/ # đ Custom: Central Filtros
â â âââ lead/ # đ€ Custom: Lead (ArquĂ©tipo)
â âââ layouts/
â â âââ default.vue # Shell: BuilderHub + Sidebar + Content
â âââ pages/
â â âââ fastapp/
â â â âââ apps.vue # Gerenciador + Snapshot
â â â âââ schema-v3.vue # đïž FastApp Architect (3-pane)
â â â âââ diagram.vue # đșïž FastApp Flow (Vue Flow)
â â â âââ agent.vue # đ€ FastApp Agent (AI Copilot)
â â âââ [app]/
â â â âââ index.vue # App Dashboard
â â â âââ [module]/index.vue # Module Dashboard (Focal)
â â â âââ [module]/[object]/ # đ Rotas dinĂąmicas
â â âââ crm/ # Custom pages
â âââ fastapp/
â â âââ manifest.ts # Types: App, Module, Object, Property
â â âââ static-manifest.ts # đž Snapshot (auto-gerado)
â âââ stores/
â â âââ system.ts # SystemStore (currentApp, sidebarCollapsed)
â â âââ lead.ts # Store Lead (offline, socket)
â âââ composables/
â â âââ useAppManifest.ts # Navigation metadata helper
â â âââ useFastappArchitect.ts # Schema editor composable
â âââ utils/
â â âââ MetaToFlow.ts # Metadata â Vue Flow (ER/Process)
â âââ types/
â âââ schema.ts # PropSchema, ObjectSchema, CRUDMode
âââ server/
â âââ api/
â â âââ v1/data/[object]/ # đ API DinĂąmica
â â âââ system/snapshot.post.ts # đž Gera static-manifest.ts
â â âââ fastapp-agent.post.ts # đ€ LLM Streaming endpoint
â â âââ app/ # CRUD App (admin)
â â âââ lead/ # CRUD Lead (nativo)
â âââ utils/
â âââ prisma.ts # Singleton PrismaClient
â âââ dynamic-db.ts # Hybrid: native â generic Record
â âââ meta-validation.ts # Validação meta-driven
â âââ query-parser.ts # đ Filtros/sort â Prisma where/orderBy
âââ prisma/schema.prisma # Models: App, Lead, Record
âââ nuxt.config.ts
Camadas Custom sobre o Motor
graph TB
subgraph "Camada 3 â Custom (Produto)"
P1["crm/leads.vue (Kanban)"]
C1["lead/Card, Form, CRUD"]
S1["stores/lead.ts (offline)"]
end
subgraph "Camada 2 â Motor DinĂąmico"
P2["[app]/[module]/[object]/*"]
D1["core/DynamicCRUD"]
D2["core/DynamicForm + Fields"]
D3["core/DynamicTable + List"]
S2["stores/system.ts"]
end
subgraph "Camada 1 â Infraestrutura"
API_V1["/api/v1/data/:object"]
API_LEGACY["/api/lead, /api/app"]
DYNAMIC_DB["dynamic-db.ts"]
META_VAL["meta-validation.ts"]
PRISMA["Prisma + PostgreSQL"]
SNAPSHOT["Snapshot System"]
end
P1 --> S1 --> API_LEGACY --> PRISMA
P2 --> S2 --> SNAPSHOT
P2 --> D1 --> D2 & D3
D1 -->|API calls| API_V1
API_V1 --> META_VAL --> DYNAMIC_DB --> PRISMA
style P2 fill:#4338ca,color:#fff
style API_V1 fill:#059669,color:#fff
style SNAPSHOT fill:#7c3aed,color:#fff
style P1 fill:#f59e0b,color:#000
đ§ Sovereign Navigation Architecture
A navegação do Fastapp é governada por dois contextos independentes:
| Contexto | Controlador | Store | Função |
|---|---|---|---|
| Navegação | AppMenu.vue (OverlayPanel + rota) |
Local (useFetch) |
Exibir mĂłdulos/objetos/pĂĄginas do app ativo |
| Builder | BuilderHub.vue (Dropdown "Contexto") |
systemStore.selectedAppId |
Alvo dos botÔes Architect/Flow/Agent |
Builder Hub
Barra superior fixa (h-14, bg-[#0a0d14]) com:
- Toggle sidebar (colapsa
15remâ4rem) - Brand FastApp
- Dropdown Contexto (
architect-dropdown) â define qual app as ferramentas de arquiteto miram - Pill Buttons (segmented controls) â cada ferramenta com sua cor:
- đą App (emerald) â
/{slug} - đŁ Architect (indigo) â
/fastapp/schema-v3?app={id} - đ” Flow (blue) â
/fastapp/diagram?app={id} - đ Agent (purple) â
/fastapp/agent?app={id}
- đą App (emerald) â
Sidebar ColapsĂĄvel
- Expandida (
w-60): Ăcone + label + headers de mĂłdulo - Colapsada (
w-16): Ăcones centralizados com tooltip PrimeVue - Estado persistido em
systemStore.sidebarCollapsedviauseStorage
Ferramentas do Arquiteto
| Ferramenta | Rota | Função |
|---|---|---|
| FastApp Architect | /fastapp/schema-v3 |
Schema Studio v3 â editor 3-pane de objetos, propriedades e metadados |
| FastApp Flow | /fastapp/diagram |
Visualização de metadados via Vue Flow (ER e Process modes, Dagre layout) |
| FastApp Agent | /fastapp/agent |
AI Copilot com streaming, contexto vivo e Domain-Aware Gap Analysis |
đ Auto-Evolução (O FastApp como Primeiro App)
O FastApp é seu próprio usuårio mais avançado. A cadeia de auto-evolução:
graph LR
AGENT["FastApp Agent<br/>Briefing IA"] -->|"gera schema"| ARCHITECT["FastApp Architect<br/>Schema Studio v3"]
ARCHITECT -->|"salva draft"| FADAP["FADAP Protocol<br/>Sync Metadata"]
FADAP -->|"publica snapshot"| MANIFEST["static-manifest.ts"]
MANIFEST -->|"alimenta"| MENU["AppMenu<br/>Navegação"]
MANIFEST -->|"alimenta"| FLOW["FastApp Flow<br/>Diagrama"]
MANIFEST -->|"alimenta"| AGENT
style AGENT fill:#7c3aed,color:#fff
style ARCHITECT fill:#6366f1,color:#fff
style FADAP fill:#dc2626,color:#fff
style FLOW fill:#2563eb,color:#fff
"O motor se usa para se evoluir. Cada melhoria no Schema Manager melhora a capacidade de melhorar o prĂłprio Schema Manager."
PadrÔes Importantes
Optimistic Updates
Toda mutação no Lead atualiza o estado local antes da resposta do server. Em caso de erro, faz rollback.
Tab ID (Anti-echo)
Cada aba gera um tabId random. Socket.IO ignora eventos da prĂłpria aba.
Dados â App Sincronizados
Toda propriedade nova em ObjectSchema deve ser: adicionada ao type, adicionada ao seed, consumida pelo componente.
Native vs Generic Record
Objetos com model Prisma â desempenho mĂĄximo. Objetos do Builder â tabela Record genĂ©rica, zero setup.
Scripts
npm run dev # Nuxt dev + Socket.IO :3001
npm run build # prisma generate + nuxt build
npx prisma studio # DB admin GUI
npx prisma db push # Sync schema â DB
# Seed: /api/seed-system
# Snapshot: botĂŁo no /fastapp/apps