From 065ab19a1733463931ec3ace5f52afbd0a2564c5 Mon Sep 17 00:00:00 2001 From: jonaspachecoometas Date: Mon, 9 Feb 2026 17:46:40 -0300 Subject: [PATCH] Arcadia Suite - Projeto completo --- .gitignore | 8 + .replit | 88 + DOCUMENTATION.md | 553 + PLANO_EVOLUCAO_ARCADIA.md | 421 + README.md | 1 - client/index.html | 27 + client/public/favicon.ico | Bin 0 -> 1675 bytes client/public/favicon.png | Bin 0 -> 1675 bytes client/public/opengraph.jpg | Bin 0 -> 45382 bytes client/src/App.tsx | 152 + client/src/components/ApiTester.tsx | 651 + client/src/components/BpmnDiagram.tsx | 645 + .../src/components/Browser/BrowserFrame.tsx | 246 + client/src/components/Browser/Omnibox.tsx | 110 + client/src/components/Browser/Tab.tsx | 51 + client/src/components/Browser/TabBar.tsx | 45 + .../src/components/Browser/WindowControls.tsx | 17 + client/src/components/CommandPalette.tsx | 421 + client/src/components/DevHistory.tsx | 488 + client/src/components/DigitalClock.tsx | 38 + client/src/components/ElementPanel.tsx | 12 + .../src/components/KnowledgeCollectorInit.tsx | 6 + client/src/components/LoginBridgePopup.tsx | 196 + client/src/components/ProcessDiagram.tsx | 184 + client/src/components/ResultViewer.tsx | 366 + client/src/components/RichTextEditor.tsx | 342 + client/src/components/TradeInForm.tsx | 988 + client/src/components/UserAvatar.tsx | 39 + client/src/components/lowcode/DevAgent.tsx | 267 + client/src/components/lowcode/DynamicForm.tsx | 316 + client/src/components/lowcode/DynamicList.tsx | 258 + client/src/components/lowcode/index.ts | 2 + client/src/components/ui/accordion.tsx | 55 + client/src/components/ui/alert-dialog.tsx | 139 + client/src/components/ui/alert.tsx | 59 + client/src/components/ui/aspect-ratio.tsx | 5 + client/src/components/ui/avatar.tsx | 50 + client/src/components/ui/badge.tsx | 43 + client/src/components/ui/breadcrumb.tsx | 115 + client/src/components/ui/button-group.tsx | 83 + client/src/components/ui/button.tsx | 65 + client/src/components/ui/calendar.tsx | 213 + client/src/components/ui/card.tsx | 76 + client/src/components/ui/carousel.tsx | 260 + client/src/components/ui/chart.tsx | 367 + client/src/components/ui/checkbox.tsx | 28 + client/src/components/ui/collapsible.tsx | 11 + client/src/components/ui/command.tsx | 153 + client/src/components/ui/context-menu.tsx | 198 + client/src/components/ui/dialog.tsx | 120 + client/src/components/ui/drawer.tsx | 116 + client/src/components/ui/dropdown-menu.tsx | 201 + client/src/components/ui/empty.tsx | 104 + client/src/components/ui/field.tsx | 244 + client/src/components/ui/form.tsx | 176 + client/src/components/ui/hover-card.tsx | 27 + client/src/components/ui/input-group.tsx | 168 + client/src/components/ui/input-otp.tsx | 69 + client/src/components/ui/input.tsx | 22 + client/src/components/ui/item.tsx | 193 + client/src/components/ui/kbd.tsx | 28 + client/src/components/ui/label.tsx | 26 + client/src/components/ui/menubar.tsx | 254 + client/src/components/ui/navigation-menu.tsx | 128 + client/src/components/ui/pagination.tsx | 117 + client/src/components/ui/popover.tsx | 31 + client/src/components/ui/progress.tsx | 28 + client/src/components/ui/radio-group.tsx | 42 + client/src/components/ui/resizable.tsx | 45 + client/src/components/ui/scroll-area.tsx | 46 + client/src/components/ui/select.tsx | 159 + client/src/components/ui/separator.tsx | 29 + client/src/components/ui/sheet.tsx | 140 + client/src/components/ui/sidebar.tsx | 727 + client/src/components/ui/skeleton.tsx | 15 + client/src/components/ui/slider.tsx | 26 + client/src/components/ui/sonner.tsx | 31 + client/src/components/ui/spinner.tsx | 16 + client/src/components/ui/switch.tsx | 27 + client/src/components/ui/table.tsx | 120 + client/src/components/ui/tabs.tsx | 53 + client/src/components/ui/textarea.tsx | 22 + client/src/components/ui/toast.tsx | 127 + client/src/components/ui/toaster.tsx | 33 + client/src/components/ui/toggle-group.tsx | 61 + client/src/components/ui/toggle.tsx | 43 + client/src/components/ui/tooltip.tsx | 32 + client/src/contexts/ErpProfileContext.tsx | 52 + client/src/hooks/use-auth.tsx | 110 + client/src/hooks/use-knowledge-collector.ts | 51 + client/src/hooks/use-mobile.tsx | 19 + client/src/hooks/use-navigation-tracking.ts | 141 + client/src/hooks/use-toast.ts | 191 + client/src/index.css | 67 + client/src/lib/knowledge-collector.ts | 274 + client/src/lib/protected-route.tsx | 33 + client/src/lib/queryClient.ts | 57 + client/src/lib/utils.ts | 6 + client/src/main.tsx | 5 + client/src/modules/RetailReport.tsx | 21 + .../modules/api-central/ApiCentralModule.tsx | 605 + client/src/modules/ide/IDEModule.tsx | 844 + client/src/pages/Admin.tsx | 3237 ++ client/src/pages/Agent.tsx | 2153 ++ client/src/pages/ApiHub.tsx | 1599 + client/src/pages/ApiTesterPage.tsx | 5 + client/src/pages/AppCenter.tsx | 654 + client/src/pages/AppViewer.tsx | 673 + client/src/pages/ArcadiaNext.tsx | 1766 + client/src/pages/ArcadiaRetail.tsx | 8853 +++++ client/src/pages/Automations.tsx | 559 + client/src/pages/BiWorkspace.tsx | 2969 ++ client/src/pages/BpmnPage.tsx | 12 + client/src/pages/Canvas.tsx | 524 + client/src/pages/CentralApis.tsx | 985 + client/src/pages/Chat.tsx | 570 + client/src/pages/Cockpit.tsx | 2170 ++ client/src/pages/CommercialEnv.tsx | 1148 + client/src/pages/Communities.tsx | 788 + client/src/pages/Contabil.tsx | 1237 + client/src/pages/Crm.tsx | 2690 ++ client/src/pages/DevCenter.tsx | 2134 ++ client/src/pages/DevelopmentModule.tsx | 865 + client/src/pages/DocTypeBuilder.tsx | 637 + client/src/pages/ERP.tsx | 2197 ++ client/src/pages/EngineRoom.tsx | 520 + client/src/pages/EngineeringHub.tsx | 224 + client/src/pages/FieldOperations.tsx | 871 + client/src/pages/Financeiro.tsx | 1462 + client/src/pages/Fisco.tsx | 1443 + client/src/pages/Home.tsx | 1323 + client/src/pages/IDE.tsx | 20 + client/src/pages/Knowledge.tsx | 539 + client/src/pages/LMS.tsx | 644 + client/src/pages/Marketplace.tsx | 418 + client/src/pages/MetabaseProxyPage.tsx | 26 + client/src/pages/Migration.tsx | 588 + client/src/pages/NPSSurvey.tsx | 588 + client/src/pages/PageBuilder.tsx | 450 + client/src/pages/People.tsx | 1039 + client/src/pages/Plus.tsx | 238 + client/src/pages/ProcessCompass.tsx | 6106 +++ client/src/pages/Production.tsx | 2820 ++ client/src/pages/QualityModule.tsx | 1722 + client/src/pages/Scientist.tsx | 835 + client/src/pages/SuperAdmin.tsx | 1121 + client/src/pages/SuppliersPortal.tsx | 599 + client/src/pages/Support.tsx | 513 + client/src/pages/SystemOverview.tsx | 33 + client/src/pages/TechnicalModule.tsx | 599 + client/src/pages/UserList.tsx | 50 + client/src/pages/Valuation.tsx | 1586 + client/src/pages/WhatsApp.tsx | 293 + client/src/pages/WorkflowBuilder.tsx | 493 + client/src/pages/WorkspacePage.tsx | 470 + client/src/pages/XosAutomations.tsx | 350 + client/src/pages/XosCampaigns.tsx | 452 + client/src/pages/XosCentral.tsx | 525 + client/src/pages/XosCrm.tsx | 752 + client/src/pages/XosGovernance.tsx | 517 + client/src/pages/XosInbox.tsx | 1217 + client/src/pages/XosPipeline.tsx | 1009 + client/src/pages/XosSites.tsx | 334 + client/src/pages/XosTickets.tsx | 510 + client/src/pages/auth-page.tsx | 210 + client/src/pages/not-found.tsx | 21 + components.json | 21 + db/index.ts | 17 + drizzle.config.ts | 14 + ecosystem.config.js | 54 + grafico_ativo_passivo.py | 22 + main.py | 6 + metabase/metabase-data.trace.db | 3818 ++ metabase/start-metabase.sh | 23 + migrations/0000_low_tiger_shark.sql | 4603 +++ migrations/meta/0000_snapshot.json | 30870 ++++++++++++++++ migrations/meta/_journal.json | 13 + package.json | 151 + postcss.config.js | 6 + pyproject.toml | 26 + python-service/main.py | 345 + python-service/requirements.txt | 9 + python-service/scripts/run_capture.py | 40 + python-service/services/capture.py | 176 + python-service/services/cientista.py | 566 + python-service/services/embeddings.py | 80 + python-service/services/executor.py | 43 + python-service/services/rpa.py | 281 + python-service/services/workflow.py | 297 + replit.md | 74 + script/build.ts | 67 + scripts/deploy.sh | 371 + scripts/generate-architecture-doc.ts | 361 + scripts/generate-docs.ts | 1049 + scripts/github-backup-full.ts | 186 + scripts/github-sync-essential.ts | 221 + scripts/github-sync.ts | 310 + scripts/upload-backup.ts | 130 + server/admin/routes.ts | 621 + server/api-central/routes.ts | 337 + server/auth.ts | 113 + server/automations/engine-proxy.ts | 266 + server/automations/routes.ts | 342 + server/automations/service.ts | 208 + server/autonomous/agents/ArchitectAgent.ts | 212 + server/autonomous/agents/BaseAgent.ts | 120 + .../autonomous/agents/CodeGeneratorAgent.ts | 330 + server/autonomous/agents/OrchestratorAgent.ts | 192 + server/autonomous/agents/ValidationAgent.ts | 144 + server/autonomous/agents/index.ts | 5 + server/autonomous/routes.ts | 136 + server/autonomous/tools/BaseTool.ts | 82 + server/autonomous/tools/ToolManager.ts | 196 + .../tools/command/RunCommandTool.ts | 76 + .../autonomous/tools/command/TypeCheckTool.ts | 70 + server/autonomous/tools/command/index.ts | 6 + .../tools/filesystem/ListDirectoryTool.ts | 85 + .../tools/filesystem/ReadFileTool.ts | 66 + .../tools/filesystem/SearchCodeTool.ts | 92 + .../tools/filesystem/WriteFileTool.ts | 88 + server/autonomous/tools/filesystem/index.ts | 10 + server/autonomous/tools/git/GitCommitTool.ts | 67 + server/autonomous/tools/git/GitStatusTool.ts | 47 + server/autonomous/tools/git/index.ts | 6 + .../tools/github/AnalyzeRepoTool.ts | 41 + .../tools/github/GitHubCommitTool.ts | 55 + .../tools/github/ReadExternalFileTool.ts | 41 + server/autonomous/tools/github/index.ts | 3 + server/autonomous/tools/index.ts | 65 + server/autonomous/tools/metaset.ts | 282 + server/bi/engine-proxy.ts | 201 + server/bi/routes.ts | 871 + server/bi/staging.ts | 407 + server/bi/upload.ts | 1063 + server/blackboard/BaseBlackboardAgent.ts | 189 + server/blackboard/ContextIndexer.ts | 277 + server/blackboard/PipelineOrchestrator.ts | 696 + server/blackboard/agents/ArchitectAgent.ts | 156 + server/blackboard/agents/EvolutionAgent.ts | 263 + server/blackboard/agents/ExecutorAgent.ts | 178 + server/blackboard/agents/GeneratorAgent.ts | 187 + server/blackboard/agents/ResearcherAgent.ts | 145 + server/blackboard/agents/ValidatorAgent.ts | 343 + server/blackboard/agents/index.ts | 58 + server/blackboard/pipelineRoutes.ts | 189 + server/blackboard/routes.ts | 457 + server/blackboard/service.ts | 476 + server/chat/routes.ts | 154 + server/chat/socket.ts | 119 + server/chat/storage.ts | 236 + server/communication/engine.ts | 686 + server/communication/proxy.ts | 172 + server/communities/routes.ts | 527 + server/communities/socket.ts | 379 + server/compass/routes.ts | 2277 ++ server/compass/storage.ts | 1371 + server/contabil/routes.ts | 603 + server/crm/commission-engine.ts | 417 + server/crm/communication.ts | 288 + server/crm/frappe-service.ts | 270 + server/crm/google-calendar.ts | 360 + server/crm/routes.ts | 1592 + server/crm/storage.ts | 708 + server/crm/whatsapp-bridge.ts | 125 + server/devAgent.ts | 185 + server/email/routes.ts | 265 + server/email/service.ts | 449 + server/engine-room/routes.ts | 384 + server/erp/index.ts | 210 + server/erp/routes.ts | 1138 + server/erpnext/routes.ts | 154 + server/erpnext/service.ts | 305 + server/financeiro/routes.ts | 739 + server/fisco/routes.ts | 1139 + server/governance/jobQueue.ts | 252 + server/governance/policyTests.ts | 181 + server/governance/routes.ts | 291 + server/governance/service.ts | 287 + server/ide/routes.ts | 447 + server/index.ts | 378 + server/integrations/github/index.ts | 2 + server/integrations/github/routes.ts | 352 + server/integrations/github/service.ts | 568 + server/learning/routes.ts | 480 + server/learning/service.ts | 658 + server/lms/routes.ts | 303 + server/login-bridge/routes.ts | 443 + server/login-bridge/service.ts | 88 + server/lowcode/routes.ts | 356 + server/manus/routes.ts | 64 + server/manus/service.ts | 3952 ++ server/manus/tools.ts | 746 + server/marketplace/routes.ts | 201 + server/mcp/routes.ts | 238 + server/metabase/proxy.ts | 42 + server/metaset/client.ts | 375 + server/metaset/routes.ts | 212 + server/migration/bson-parser.ts | 328 + server/migration/importer.ts | 471 + server/migration/routes.ts | 389 + server/para/routes.ts | 329 + server/para/storage.ts | 190 + server/people/routes.ts | 622 + server/plus/client.ts | 98 + server/plus/launcher.ts | 84 + server/plus/proxy.ts | 102 + server/plus/sso.ts | 133 + server/production/routes.ts | 856 + server/production/storage.ts | 510 + server/productivity/routes.ts | 684 + server/protocols/a2a/client.ts | 252 + server/protocols/a2a/routes.ts | 330 + server/protocols/a2a/service.ts | 319 + server/protocols/index.ts | 63 + server/protocols/mcp/routes.ts | 102 + server/protocols/mcp/service.ts | 140 + server/protocols/middleware.ts | 70 + server/proxy/routes.ts | 283 + server/python/automation_engine.py | 667 + server/python/bi_analysis_service.py | 355 + server/python/bi_engine.py | 706 + server/python/contabil_service.py | 596 + server/python/fisco_service.py | 707 + server/python/people_service.py | 654 + server/quality/routes.ts | 698 + server/replit_integrations/batch/index.ts | 7 + server/replit_integrations/batch/utils.ts | 182 + server/replit_integrations/chat/index.ts | 3 + server/replit_integrations/chat/prompt.ts | 180 + server/replit_integrations/chat/routes.ts | 531 + server/replit_integrations/chat/storage.ts | 90 + server/replit_integrations/image/client.ts | 59 + server/replit_integrations/image/index.ts | 3 + server/replit_integrations/image/routes.ts | 31 + server/retail/routes.ts | 4608 +++ server/retail/sync-service.ts | 648 + server/routes.ts | 300 + server/routes/bpmnRoutes.ts | 17 + server/routes/docs.ts | 16 + server/routes/userAvatarRoutes.ts | 5 + server/routes/users.ts | 49 + server/services/fiscal/FiscalAdapter.ts | 159 + server/static.ts | 19 + server/storage.ts | 159 + server/support/routes.ts | 357 + server/support/storage.ts | 150 + server/valuation/routes.ts | 1293 + server/valuation/storage.ts | 709 + server/vite.ts | 58 + server/whatsapp/routes.ts | 456 + server/whatsapp/service.ts | 1152 + server/xos/routes.ts | 707 + shared/models/protocols.ts | 157 + shared/schema.ts | 7034 ++++ temp_laravel/.editorconfig | 18 + temp_laravel/.env.example | 58 + temp_laravel/.htaccess | 3 + temp_laravel/__MACOSX/._.editorconfig | Bin 0 -> 176 bytes temp_laravel/__MACOSX/._.env | Bin 0 -> 176 bytes temp_laravel/__MACOSX/._.htaccess | Bin 0 -> 276 bytes temp_laravel/__MACOSX/._app | Bin 0 -> 220 bytes temp_laravel/__MACOSX/app/._Imports | Bin 0 -> 213 bytes temp_laravel/app/.DS_Store | Bin 0 -> 8196 bytes temp_laravel/app/Models/AcaoLog.php | 88 + temp_laravel/app/Models/ApiConfig.php | 67 + .../app/Models/ApuracaoMensalEvento.php | 20 + .../app/Models/BairroDeliveryMaster.php | 19 + temp_laravel/app/Models/Caixa.php | 52 + temp_laravel/app/Models/CashBackConfig.php | 16 + .../app/Models/CategoriaAdicional.php | 19 + temp_laravel/app/Models/CategoriaConta.php | 15 + temp_laravel/app/Models/ChaveNfeCte.php | 16 + temp_laravel/app/Models/ComponenteMdfe.php | 16 + temp_laravel/app/Models/Convenio.php | 15 + .../app/Models/EstoqueAtualProduto.php | 15 + temp_laravel/app/Models/EventoSalario.php | 15 + temp_laravel/app/Models/Fornecedor.php | 41 + temp_laravel/app/Models/FreteAnexo.php | 20 + temp_laravel/app/Models/FuncionarioEvento.php | 23 + .../app/Models/FuncionarioServico.php | 21 + .../Models/GestaoCustoProducaoOutroCusto.php | 15 + temp_laravel/app/Models/ImpressoraPedido.php | 20 + .../app/Models/InformacaoBancariaMdfe.php | 15 + .../app/Models/ItemCarrinhoCardapio.php | 40 + temp_laravel/app/Models/ItemIbpt.php | 16 + temp_laravel/app/Models/ItemInventario.php | 38 + temp_laravel/app/Models/ItemNotaServico.php | 24 + .../app/Models/ItemPizzaCarrinhoCardapio.php | 20 + .../Models/ItemPropostaPlanejamentoCusto.php | 37 + temp_laravel/app/Models/Laboratorio.php | 19 + .../app/Models/ManutencaoVeiculoAnexo.php | 20 + temp_laravel/app/Models/Mesa.php | 15 + temp_laravel/app/Models/MetaResultado.php | 27 + temp_laravel/app/Models/Motoboy.php | 20 + .../app/Models/MunicipioCarregamento.php | 19 + temp_laravel/app/Models/NaturezaOperacao.php | 17 + temp_laravel/app/Models/Ncm.php | 15 + .../Models/PadraoTributacaoProdutoSuper.php | 22 + temp_laravel/app/Models/PreVenda.php | 83 + temp_laravel/app/Models/Produto.php | 976 + .../app/Models/ProdutoIngrediente.php | 15 + temp_laravel/app/Models/ProdutoUnico.php | 27 + .../app/Models/ProjetoCustoConfig.php | 11 + temp_laravel/app/Models/RemessaBoleto.php | 24 + temp_laravel/app/Models/ReservaConfig.php | 25 + temp_laravel/app/Models/RetiradaEstoque.php | 27 + temp_laravel/app/Models/Segmento.php | 15 + temp_laravel/app/Models/SegmentoEmpresa.php | 16 + .../app/Models/ServicoPlanejamentoCusto.php | 19 + temp_laravel/app/Models/ServicoReserva.php | 19 + temp_laravel/app/Models/Transportadora.php | 25 + temp_laravel/app/Models/UnidadeCarga.php | 15 + .../app/Models/WoocommerceItemPedido.php | 20 + .../app/Providers/AppServiceProvider.php | 25 + .../app/Providers/AuthServiceProvider.php | 26 + .../Providers/BroadcastServiceProvider.php | 19 + .../app/Providers/EventServiceProvider.php | 38 + .../app/Providers/RouteServiceProvider.php | 44 + .../app/ServicesIA/FinancePrevisaoService.php | 104 + temp_laravel/app/Utils/BoletoUtil.php | 225 + temp_laravel/app/Utils/ContaEmpresaUtil.php | 27 + temp_laravel/app/Utils/ContratoUtil.php | 37 + temp_laravel/app/Utils/CorreioUtil.php | 169 + temp_laravel/app/Utils/EmailUtil.php | 127 + temp_laravel/app/Utils/EmpresaUtil.php | 209 + temp_laravel/app/Utils/EstoqueUtil.php | 349 + temp_laravel/app/Utils/FilaEnvioUtil.php | 100 + temp_laravel/app/Utils/FinanceInsightUtil.php | 98 + temp_laravel/app/Utils/IfoodUtil.php | 379 + temp_laravel/app/Utils/MercadoLivreUtil.php | 351 + temp_laravel/app/Utils/ModuloUtil.php | 31 + temp_laravel/app/Utils/NuvemShopUtil.php | 53 + temp_laravel/app/Utils/PlanoContaUtil.php | 191 + temp_laravel/app/Utils/SiegUtil.php | 40 + temp_laravel/app/Utils/SintegraUtil.php | 47 + temp_laravel/app/Utils/SpedUtil.php | 102 + temp_laravel/app/Utils/UploadUtil.php | 65 + temp_laravel/app/Utils/WhatsAppUtil.php | 109 + temp_laravel/app/Utils/WoocommerceUtil.php | 111 + tsconfig.json | 23 + vite-plugin-meta-images.ts | 78 + vite.config.ts | 51 + 442 files changed, 203490 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 .replit create mode 100644 DOCUMENTATION.md create mode 100644 PLANO_EVOLUCAO_ARCADIA.md delete mode 100644 README.md create mode 100644 client/index.html create mode 100644 client/public/favicon.ico create mode 100644 client/public/favicon.png create mode 100644 client/public/opengraph.jpg create mode 100644 client/src/App.tsx create mode 100644 client/src/components/ApiTester.tsx create mode 100644 client/src/components/BpmnDiagram.tsx create mode 100644 client/src/components/Browser/BrowserFrame.tsx create mode 100644 client/src/components/Browser/Omnibox.tsx create mode 100644 client/src/components/Browser/Tab.tsx create mode 100644 client/src/components/Browser/TabBar.tsx create mode 100644 client/src/components/Browser/WindowControls.tsx create mode 100644 client/src/components/CommandPalette.tsx create mode 100644 client/src/components/DevHistory.tsx create mode 100644 client/src/components/DigitalClock.tsx create mode 100644 client/src/components/ElementPanel.tsx create mode 100644 client/src/components/KnowledgeCollectorInit.tsx create mode 100644 client/src/components/LoginBridgePopup.tsx create mode 100644 client/src/components/ProcessDiagram.tsx create mode 100644 client/src/components/ResultViewer.tsx create mode 100644 client/src/components/RichTextEditor.tsx create mode 100644 client/src/components/TradeInForm.tsx create mode 100644 client/src/components/UserAvatar.tsx create mode 100644 client/src/components/lowcode/DevAgent.tsx create mode 100644 client/src/components/lowcode/DynamicForm.tsx create mode 100644 client/src/components/lowcode/DynamicList.tsx create mode 100644 client/src/components/lowcode/index.ts create mode 100644 client/src/components/ui/accordion.tsx create mode 100644 client/src/components/ui/alert-dialog.tsx create mode 100644 client/src/components/ui/alert.tsx create mode 100644 client/src/components/ui/aspect-ratio.tsx create mode 100644 client/src/components/ui/avatar.tsx create mode 100644 client/src/components/ui/badge.tsx create mode 100644 client/src/components/ui/breadcrumb.tsx create mode 100644 client/src/components/ui/button-group.tsx create mode 100644 client/src/components/ui/button.tsx create mode 100644 client/src/components/ui/calendar.tsx create mode 100644 client/src/components/ui/card.tsx create mode 100644 client/src/components/ui/carousel.tsx create mode 100644 client/src/components/ui/chart.tsx create mode 100644 client/src/components/ui/checkbox.tsx create mode 100644 client/src/components/ui/collapsible.tsx create mode 100644 client/src/components/ui/command.tsx create mode 100644 client/src/components/ui/context-menu.tsx create mode 100644 client/src/components/ui/dialog.tsx create mode 100644 client/src/components/ui/drawer.tsx create mode 100644 client/src/components/ui/dropdown-menu.tsx create mode 100644 client/src/components/ui/empty.tsx create mode 100644 client/src/components/ui/field.tsx create mode 100644 client/src/components/ui/form.tsx create mode 100644 client/src/components/ui/hover-card.tsx create mode 100644 client/src/components/ui/input-group.tsx create mode 100644 client/src/components/ui/input-otp.tsx create mode 100644 client/src/components/ui/input.tsx create mode 100644 client/src/components/ui/item.tsx create mode 100644 client/src/components/ui/kbd.tsx create mode 100644 client/src/components/ui/label.tsx create mode 100644 client/src/components/ui/menubar.tsx create mode 100644 client/src/components/ui/navigation-menu.tsx create mode 100644 client/src/components/ui/pagination.tsx create mode 100644 client/src/components/ui/popover.tsx create mode 100644 client/src/components/ui/progress.tsx create mode 100644 client/src/components/ui/radio-group.tsx create mode 100644 client/src/components/ui/resizable.tsx create mode 100644 client/src/components/ui/scroll-area.tsx create mode 100644 client/src/components/ui/select.tsx create mode 100644 client/src/components/ui/separator.tsx create mode 100644 client/src/components/ui/sheet.tsx create mode 100644 client/src/components/ui/sidebar.tsx create mode 100644 client/src/components/ui/skeleton.tsx create mode 100644 client/src/components/ui/slider.tsx create mode 100644 client/src/components/ui/sonner.tsx create mode 100644 client/src/components/ui/spinner.tsx create mode 100644 client/src/components/ui/switch.tsx create mode 100644 client/src/components/ui/table.tsx create mode 100644 client/src/components/ui/tabs.tsx create mode 100644 client/src/components/ui/textarea.tsx create mode 100644 client/src/components/ui/toast.tsx create mode 100644 client/src/components/ui/toaster.tsx create mode 100644 client/src/components/ui/toggle-group.tsx create mode 100644 client/src/components/ui/toggle.tsx create mode 100644 client/src/components/ui/tooltip.tsx create mode 100644 client/src/contexts/ErpProfileContext.tsx create mode 100644 client/src/hooks/use-auth.tsx create mode 100644 client/src/hooks/use-knowledge-collector.ts create mode 100644 client/src/hooks/use-mobile.tsx create mode 100644 client/src/hooks/use-navigation-tracking.ts create mode 100644 client/src/hooks/use-toast.ts create mode 100644 client/src/index.css create mode 100644 client/src/lib/knowledge-collector.ts create mode 100644 client/src/lib/protected-route.tsx create mode 100644 client/src/lib/queryClient.ts create mode 100644 client/src/lib/utils.ts create mode 100644 client/src/main.tsx create mode 100644 client/src/modules/RetailReport.tsx create mode 100644 client/src/modules/api-central/ApiCentralModule.tsx create mode 100644 client/src/modules/ide/IDEModule.tsx create mode 100644 client/src/pages/Admin.tsx create mode 100644 client/src/pages/Agent.tsx create mode 100644 client/src/pages/ApiHub.tsx create mode 100644 client/src/pages/ApiTesterPage.tsx create mode 100644 client/src/pages/AppCenter.tsx create mode 100644 client/src/pages/AppViewer.tsx create mode 100644 client/src/pages/ArcadiaNext.tsx create mode 100644 client/src/pages/ArcadiaRetail.tsx create mode 100644 client/src/pages/Automations.tsx create mode 100644 client/src/pages/BiWorkspace.tsx create mode 100644 client/src/pages/BpmnPage.tsx create mode 100644 client/src/pages/Canvas.tsx create mode 100644 client/src/pages/CentralApis.tsx create mode 100644 client/src/pages/Chat.tsx create mode 100644 client/src/pages/Cockpit.tsx create mode 100644 client/src/pages/CommercialEnv.tsx create mode 100644 client/src/pages/Communities.tsx create mode 100644 client/src/pages/Contabil.tsx create mode 100644 client/src/pages/Crm.tsx create mode 100644 client/src/pages/DevCenter.tsx create mode 100644 client/src/pages/DevelopmentModule.tsx create mode 100644 client/src/pages/DocTypeBuilder.tsx create mode 100644 client/src/pages/ERP.tsx create mode 100644 client/src/pages/EngineRoom.tsx create mode 100644 client/src/pages/EngineeringHub.tsx create mode 100644 client/src/pages/FieldOperations.tsx create mode 100644 client/src/pages/Financeiro.tsx create mode 100644 client/src/pages/Fisco.tsx create mode 100644 client/src/pages/Home.tsx create mode 100644 client/src/pages/IDE.tsx create mode 100644 client/src/pages/Knowledge.tsx create mode 100644 client/src/pages/LMS.tsx create mode 100644 client/src/pages/Marketplace.tsx create mode 100644 client/src/pages/MetabaseProxyPage.tsx create mode 100644 client/src/pages/Migration.tsx create mode 100644 client/src/pages/NPSSurvey.tsx create mode 100644 client/src/pages/PageBuilder.tsx create mode 100644 client/src/pages/People.tsx create mode 100644 client/src/pages/Plus.tsx create mode 100644 client/src/pages/ProcessCompass.tsx create mode 100644 client/src/pages/Production.tsx create mode 100644 client/src/pages/QualityModule.tsx create mode 100644 client/src/pages/Scientist.tsx create mode 100644 client/src/pages/SuperAdmin.tsx create mode 100644 client/src/pages/SuppliersPortal.tsx create mode 100644 client/src/pages/Support.tsx create mode 100644 client/src/pages/SystemOverview.tsx create mode 100644 client/src/pages/TechnicalModule.tsx create mode 100644 client/src/pages/UserList.tsx create mode 100644 client/src/pages/Valuation.tsx create mode 100644 client/src/pages/WhatsApp.tsx create mode 100644 client/src/pages/WorkflowBuilder.tsx create mode 100644 client/src/pages/WorkspacePage.tsx create mode 100644 client/src/pages/XosAutomations.tsx create mode 100644 client/src/pages/XosCampaigns.tsx create mode 100644 client/src/pages/XosCentral.tsx create mode 100644 client/src/pages/XosCrm.tsx create mode 100644 client/src/pages/XosGovernance.tsx create mode 100644 client/src/pages/XosInbox.tsx create mode 100644 client/src/pages/XosPipeline.tsx create mode 100644 client/src/pages/XosSites.tsx create mode 100644 client/src/pages/XosTickets.tsx create mode 100644 client/src/pages/auth-page.tsx create mode 100644 client/src/pages/not-found.tsx create mode 100644 components.json create mode 100644 db/index.ts create mode 100644 drizzle.config.ts create mode 100644 ecosystem.config.js create mode 100644 grafico_ativo_passivo.py create mode 100644 main.py create mode 100644 metabase/metabase-data.trace.db create mode 100644 metabase/start-metabase.sh create mode 100644 migrations/0000_low_tiger_shark.sql create mode 100644 migrations/meta/0000_snapshot.json create mode 100644 migrations/meta/_journal.json create mode 100644 package.json create mode 100644 postcss.config.js create mode 100644 pyproject.toml create mode 100644 python-service/main.py create mode 100644 python-service/requirements.txt create mode 100644 python-service/scripts/run_capture.py create mode 100644 python-service/services/capture.py create mode 100644 python-service/services/cientista.py create mode 100644 python-service/services/embeddings.py create mode 100644 python-service/services/executor.py create mode 100644 python-service/services/rpa.py create mode 100644 python-service/services/workflow.py create mode 100644 replit.md create mode 100644 script/build.ts create mode 100644 scripts/deploy.sh create mode 100644 scripts/generate-architecture-doc.ts create mode 100644 scripts/generate-docs.ts create mode 100644 scripts/github-backup-full.ts create mode 100644 scripts/github-sync-essential.ts create mode 100644 scripts/github-sync.ts create mode 100644 scripts/upload-backup.ts create mode 100644 server/admin/routes.ts create mode 100644 server/api-central/routes.ts create mode 100644 server/auth.ts create mode 100644 server/automations/engine-proxy.ts create mode 100644 server/automations/routes.ts create mode 100644 server/automations/service.ts create mode 100644 server/autonomous/agents/ArchitectAgent.ts create mode 100644 server/autonomous/agents/BaseAgent.ts create mode 100644 server/autonomous/agents/CodeGeneratorAgent.ts create mode 100644 server/autonomous/agents/OrchestratorAgent.ts create mode 100644 server/autonomous/agents/ValidationAgent.ts create mode 100644 server/autonomous/agents/index.ts create mode 100644 server/autonomous/routes.ts create mode 100644 server/autonomous/tools/BaseTool.ts create mode 100644 server/autonomous/tools/ToolManager.ts create mode 100644 server/autonomous/tools/command/RunCommandTool.ts create mode 100644 server/autonomous/tools/command/TypeCheckTool.ts create mode 100644 server/autonomous/tools/command/index.ts create mode 100644 server/autonomous/tools/filesystem/ListDirectoryTool.ts create mode 100644 server/autonomous/tools/filesystem/ReadFileTool.ts create mode 100644 server/autonomous/tools/filesystem/SearchCodeTool.ts create mode 100644 server/autonomous/tools/filesystem/WriteFileTool.ts create mode 100644 server/autonomous/tools/filesystem/index.ts create mode 100644 server/autonomous/tools/git/GitCommitTool.ts create mode 100644 server/autonomous/tools/git/GitStatusTool.ts create mode 100644 server/autonomous/tools/git/index.ts create mode 100644 server/autonomous/tools/github/AnalyzeRepoTool.ts create mode 100644 server/autonomous/tools/github/GitHubCommitTool.ts create mode 100644 server/autonomous/tools/github/ReadExternalFileTool.ts create mode 100644 server/autonomous/tools/github/index.ts create mode 100644 server/autonomous/tools/index.ts create mode 100644 server/autonomous/tools/metaset.ts create mode 100644 server/bi/engine-proxy.ts create mode 100644 server/bi/routes.ts create mode 100644 server/bi/staging.ts create mode 100644 server/bi/upload.ts create mode 100644 server/blackboard/BaseBlackboardAgent.ts create mode 100644 server/blackboard/ContextIndexer.ts create mode 100644 server/blackboard/PipelineOrchestrator.ts create mode 100644 server/blackboard/agents/ArchitectAgent.ts create mode 100644 server/blackboard/agents/EvolutionAgent.ts create mode 100644 server/blackboard/agents/ExecutorAgent.ts create mode 100644 server/blackboard/agents/GeneratorAgent.ts create mode 100644 server/blackboard/agents/ResearcherAgent.ts create mode 100644 server/blackboard/agents/ValidatorAgent.ts create mode 100644 server/blackboard/agents/index.ts create mode 100644 server/blackboard/pipelineRoutes.ts create mode 100644 server/blackboard/routes.ts create mode 100644 server/blackboard/service.ts create mode 100644 server/chat/routes.ts create mode 100644 server/chat/socket.ts create mode 100644 server/chat/storage.ts create mode 100644 server/communication/engine.ts create mode 100644 server/communication/proxy.ts create mode 100644 server/communities/routes.ts create mode 100644 server/communities/socket.ts create mode 100644 server/compass/routes.ts create mode 100644 server/compass/storage.ts create mode 100644 server/contabil/routes.ts create mode 100644 server/crm/commission-engine.ts create mode 100644 server/crm/communication.ts create mode 100644 server/crm/frappe-service.ts create mode 100644 server/crm/google-calendar.ts create mode 100644 server/crm/routes.ts create mode 100644 server/crm/storage.ts create mode 100644 server/crm/whatsapp-bridge.ts create mode 100644 server/devAgent.ts create mode 100644 server/email/routes.ts create mode 100644 server/email/service.ts create mode 100644 server/engine-room/routes.ts create mode 100644 server/erp/index.ts create mode 100644 server/erp/routes.ts create mode 100644 server/erpnext/routes.ts create mode 100644 server/erpnext/service.ts create mode 100644 server/financeiro/routes.ts create mode 100644 server/fisco/routes.ts create mode 100644 server/governance/jobQueue.ts create mode 100644 server/governance/policyTests.ts create mode 100644 server/governance/routes.ts create mode 100644 server/governance/service.ts create mode 100644 server/ide/routes.ts create mode 100644 server/index.ts create mode 100644 server/integrations/github/index.ts create mode 100644 server/integrations/github/routes.ts create mode 100644 server/integrations/github/service.ts create mode 100644 server/learning/routes.ts create mode 100644 server/learning/service.ts create mode 100644 server/lms/routes.ts create mode 100644 server/login-bridge/routes.ts create mode 100644 server/login-bridge/service.ts create mode 100644 server/lowcode/routes.ts create mode 100644 server/manus/routes.ts create mode 100644 server/manus/service.ts create mode 100644 server/manus/tools.ts create mode 100644 server/marketplace/routes.ts create mode 100644 server/mcp/routes.ts create mode 100644 server/metabase/proxy.ts create mode 100644 server/metaset/client.ts create mode 100644 server/metaset/routes.ts create mode 100644 server/migration/bson-parser.ts create mode 100644 server/migration/importer.ts create mode 100644 server/migration/routes.ts create mode 100644 server/para/routes.ts create mode 100644 server/para/storage.ts create mode 100644 server/people/routes.ts create mode 100644 server/plus/client.ts create mode 100644 server/plus/launcher.ts create mode 100644 server/plus/proxy.ts create mode 100644 server/plus/sso.ts create mode 100644 server/production/routes.ts create mode 100644 server/production/storage.ts create mode 100644 server/productivity/routes.ts create mode 100644 server/protocols/a2a/client.ts create mode 100644 server/protocols/a2a/routes.ts create mode 100644 server/protocols/a2a/service.ts create mode 100644 server/protocols/index.ts create mode 100644 server/protocols/mcp/routes.ts create mode 100644 server/protocols/mcp/service.ts create mode 100644 server/protocols/middleware.ts create mode 100644 server/proxy/routes.ts create mode 100644 server/python/automation_engine.py create mode 100644 server/python/bi_analysis_service.py create mode 100644 server/python/bi_engine.py create mode 100644 server/python/contabil_service.py create mode 100644 server/python/fisco_service.py create mode 100644 server/python/people_service.py create mode 100644 server/quality/routes.ts create mode 100644 server/replit_integrations/batch/index.ts create mode 100644 server/replit_integrations/batch/utils.ts create mode 100644 server/replit_integrations/chat/index.ts create mode 100644 server/replit_integrations/chat/prompt.ts create mode 100644 server/replit_integrations/chat/routes.ts create mode 100644 server/replit_integrations/chat/storage.ts create mode 100644 server/replit_integrations/image/client.ts create mode 100644 server/replit_integrations/image/index.ts create mode 100644 server/replit_integrations/image/routes.ts create mode 100644 server/retail/routes.ts create mode 100644 server/retail/sync-service.ts create mode 100644 server/routes.ts create mode 100644 server/routes/bpmnRoutes.ts create mode 100644 server/routes/docs.ts create mode 100644 server/routes/userAvatarRoutes.ts create mode 100644 server/routes/users.ts create mode 100644 server/services/fiscal/FiscalAdapter.ts create mode 100644 server/static.ts create mode 100644 server/storage.ts create mode 100644 server/support/routes.ts create mode 100644 server/support/storage.ts create mode 100644 server/valuation/routes.ts create mode 100644 server/valuation/storage.ts create mode 100644 server/vite.ts create mode 100644 server/whatsapp/routes.ts create mode 100644 server/whatsapp/service.ts create mode 100644 server/xos/routes.ts create mode 100644 shared/models/protocols.ts create mode 100644 shared/schema.ts create mode 100644 temp_laravel/.editorconfig create mode 100644 temp_laravel/.env.example create mode 100644 temp_laravel/.htaccess create mode 100644 temp_laravel/__MACOSX/._.editorconfig create mode 100644 temp_laravel/__MACOSX/._.env create mode 100644 temp_laravel/__MACOSX/._.htaccess create mode 100644 temp_laravel/__MACOSX/._app create mode 100644 temp_laravel/__MACOSX/app/._Imports create mode 100644 temp_laravel/app/.DS_Store create mode 100644 temp_laravel/app/Models/AcaoLog.php create mode 100644 temp_laravel/app/Models/ApiConfig.php create mode 100644 temp_laravel/app/Models/ApuracaoMensalEvento.php create mode 100644 temp_laravel/app/Models/BairroDeliveryMaster.php create mode 100644 temp_laravel/app/Models/Caixa.php create mode 100644 temp_laravel/app/Models/CashBackConfig.php create mode 100644 temp_laravel/app/Models/CategoriaAdicional.php create mode 100644 temp_laravel/app/Models/CategoriaConta.php create mode 100644 temp_laravel/app/Models/ChaveNfeCte.php create mode 100644 temp_laravel/app/Models/ComponenteMdfe.php create mode 100644 temp_laravel/app/Models/Convenio.php create mode 100644 temp_laravel/app/Models/EstoqueAtualProduto.php create mode 100644 temp_laravel/app/Models/EventoSalario.php create mode 100644 temp_laravel/app/Models/Fornecedor.php create mode 100644 temp_laravel/app/Models/FreteAnexo.php create mode 100644 temp_laravel/app/Models/FuncionarioEvento.php create mode 100644 temp_laravel/app/Models/FuncionarioServico.php create mode 100644 temp_laravel/app/Models/GestaoCustoProducaoOutroCusto.php create mode 100644 temp_laravel/app/Models/ImpressoraPedido.php create mode 100644 temp_laravel/app/Models/InformacaoBancariaMdfe.php create mode 100644 temp_laravel/app/Models/ItemCarrinhoCardapio.php create mode 100644 temp_laravel/app/Models/ItemIbpt.php create mode 100644 temp_laravel/app/Models/ItemInventario.php create mode 100644 temp_laravel/app/Models/ItemNotaServico.php create mode 100644 temp_laravel/app/Models/ItemPizzaCarrinhoCardapio.php create mode 100644 temp_laravel/app/Models/ItemPropostaPlanejamentoCusto.php create mode 100644 temp_laravel/app/Models/Laboratorio.php create mode 100644 temp_laravel/app/Models/ManutencaoVeiculoAnexo.php create mode 100644 temp_laravel/app/Models/Mesa.php create mode 100644 temp_laravel/app/Models/MetaResultado.php create mode 100644 temp_laravel/app/Models/Motoboy.php create mode 100644 temp_laravel/app/Models/MunicipioCarregamento.php create mode 100644 temp_laravel/app/Models/NaturezaOperacao.php create mode 100644 temp_laravel/app/Models/Ncm.php create mode 100644 temp_laravel/app/Models/PadraoTributacaoProdutoSuper.php create mode 100644 temp_laravel/app/Models/PreVenda.php create mode 100644 temp_laravel/app/Models/Produto.php create mode 100644 temp_laravel/app/Models/ProdutoIngrediente.php create mode 100644 temp_laravel/app/Models/ProdutoUnico.php create mode 100644 temp_laravel/app/Models/ProjetoCustoConfig.php create mode 100644 temp_laravel/app/Models/RemessaBoleto.php create mode 100644 temp_laravel/app/Models/ReservaConfig.php create mode 100644 temp_laravel/app/Models/RetiradaEstoque.php create mode 100644 temp_laravel/app/Models/Segmento.php create mode 100644 temp_laravel/app/Models/SegmentoEmpresa.php create mode 100644 temp_laravel/app/Models/ServicoPlanejamentoCusto.php create mode 100644 temp_laravel/app/Models/ServicoReserva.php create mode 100644 temp_laravel/app/Models/Transportadora.php create mode 100644 temp_laravel/app/Models/UnidadeCarga.php create mode 100644 temp_laravel/app/Models/WoocommerceItemPedido.php create mode 100644 temp_laravel/app/Providers/AppServiceProvider.php create mode 100644 temp_laravel/app/Providers/AuthServiceProvider.php create mode 100644 temp_laravel/app/Providers/BroadcastServiceProvider.php create mode 100644 temp_laravel/app/Providers/EventServiceProvider.php create mode 100644 temp_laravel/app/Providers/RouteServiceProvider.php create mode 100644 temp_laravel/app/ServicesIA/FinancePrevisaoService.php create mode 100644 temp_laravel/app/Utils/BoletoUtil.php create mode 100644 temp_laravel/app/Utils/ContaEmpresaUtil.php create mode 100644 temp_laravel/app/Utils/ContratoUtil.php create mode 100644 temp_laravel/app/Utils/CorreioUtil.php create mode 100644 temp_laravel/app/Utils/EmailUtil.php create mode 100644 temp_laravel/app/Utils/EmpresaUtil.php create mode 100644 temp_laravel/app/Utils/EstoqueUtil.php create mode 100644 temp_laravel/app/Utils/FilaEnvioUtil.php create mode 100644 temp_laravel/app/Utils/FinanceInsightUtil.php create mode 100644 temp_laravel/app/Utils/IfoodUtil.php create mode 100644 temp_laravel/app/Utils/MercadoLivreUtil.php create mode 100644 temp_laravel/app/Utils/ModuloUtil.php create mode 100644 temp_laravel/app/Utils/NuvemShopUtil.php create mode 100644 temp_laravel/app/Utils/PlanoContaUtil.php create mode 100644 temp_laravel/app/Utils/SiegUtil.php create mode 100644 temp_laravel/app/Utils/SintegraUtil.php create mode 100644 temp_laravel/app/Utils/SpedUtil.php create mode 100644 temp_laravel/app/Utils/UploadUtil.php create mode 100644 temp_laravel/app/Utils/WhatsAppUtil.php create mode 100644 temp_laravel/app/Utils/WoocommerceUtil.php create mode 100644 tsconfig.json create mode 100644 vite-plugin-meta-images.ts create mode 100644 vite.config.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..95d7cc2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +node_modules +dist +.DS_Store +server/public +vite.config.ts.* +*.tar.gz +metabase/metabase-data.* +metabase/plugins/ \ No newline at end of file diff --git a/.replit b/.replit new file mode 100644 index 0000000..16452d5 --- /dev/null +++ b/.replit @@ -0,0 +1,88 @@ +modules = ["nodejs-20", "web", "python-3.11", "python3", "postgresql-16"] +run = "npm run dev" +hidden = [".config", ".git", "generated-icon.png", "node_modules", "dist"] + +[nix] +channel = "stable-24_05" +packages = ["cairo", "cargo", "ffmpeg-full", "freetype", "ghostscript", "gitFull", "glibcLocales", "gobject-introspection", "gtk3", "libiconv", "libxcrypt", "mysql80", "openssl", "php82", "php82Packages.composer", "pkg-config", "playwright-driver", "qhull", "rustc", "tcl", "tk", "unzip", "xcodebuild", "zlib", "jdk21"] + +[[ports]] +localPort = 5000 +externalPort = 80 + +[[ports]] +localPort = 8001 +externalPort = 3001 + +[[ports]] +localPort = 8002 +externalPort = 3000 + +[[ports]] +localPort = 8003 +externalPort = 3003 + +[[ports]] +localPort = 8004 +externalPort = 4200 + +[[ports]] +localPort = 8005 +externalPort = 3002 + +[[ports]] +localPort = 8006 +externalPort = 5173 + +[[ports]] +localPort = 8080 +externalPort = 8080 + +[[ports]] +localPort = 8088 +externalPort = 5000 + +[env] +PORT = "5000" + +[deployment] +deploymentTarget = "autoscale" +build = ["npm", "run", "build"] +publicDir = "dist/public" +run = ["node", "./dist/index.cjs"] + +[workflows] +runButton = "Project" + +[[workflows.workflow]] +name = "Project" +mode = "parallel" +author = "agent" + +[[workflows.workflow.tasks]] +task = "workflow.run" +args = "Start application" + +[[workflows.workflow]] +name = "Start application" +author = "agent" + +[[workflows.workflow.tasks]] +task = "shell.exec" +args = "npm run dev" +waitForPort = 5000 + +[agent] +mockupState = "FULLSTACK" +integrations = ["javascript_openai_ai_integrations:2.0.0", "github:1.0.0"] + +[userenv] + +[userenv.shared] +FISCO_PYTHON_URL = "http://localhost:8002" +FISCO_PORT = "8002" +CONTABIL_PYTHON_URL = "http://localhost:8003" +PEOPLE_PYTHON_URL = "http://localhost:8004" +CONTABIL_PORT = "8003" +PEOPLE_PORT = "8004" +SSO_SECRET = "arcadia-sso-secret-2024-plus-integration-key-secure" diff --git a/DOCUMENTATION.md b/DOCUMENTATION.md new file mode 100644 index 0000000..af4aedd --- /dev/null +++ b/DOCUMENTATION.md @@ -0,0 +1,553 @@ +# Arcádia Suite - Documentação Técnica Completa + +**Versão:** 1.0 +**Data:** Janeiro 2026 +**Desenvolvido por:** Arcádia Technology + +--- + +## Sumário + +1. [Visão Geral](#visão-geral) +2. [Arquitetura do Sistema](#arquitetura-do-sistema) +3. [Módulos do Sistema](#módulos-do-sistema) +4. [Modelo de Dados](#modelo-de-dados) +5. [APIs e Endpoints](#apis-e-endpoints) +6. [Integrações Externas](#integrações-externas) +7. [Segurança e Autenticação](#segurança-e-autenticação) +8. [Guia de Implantação](#guia-de-implantação) + +--- + +## Visão Geral + +O **Arcádia Suite** é um Sistema Operacional Empresarial (Business Operating System) alimentado por Inteligência Artificial, projetado para revolucionar operações empresariais. O sistema integra cinco pilares fundamentais: + +### Os 5 Pilares + +1. **Knowledge Graph** - Grafo de conhecimento para dados empresariais interconectados +2. **Central Intelligence (Scientist)** - Módulo de IA para geração automática de soluções +3. **Manus (Agente Autônomo)** - Execução de tarefas e automação +4. **Centro de Comunicação Unificado** - Interação com clientes via múltiplas plataformas +5. **IDE Completa** - Ambiente de desenvolvimento multi-modal + +### Segmentação de Produtos + +| Produto | Público-Alvo | Stack Tecnológica | +|---------|-------------|-------------------| +| **Arcádia Plus** | Pequenas empresas | Node.js + Python + PostgreSQL | +| **Arcádia Next** | Médias/Grandes empresas | Frappe Framework + PostgreSQL | + +Ambos compartilham o **Arcádia Fisco** como motor fiscal centralizado. + +--- + +## Arquitetura do Sistema + +### Arquitetura em 4 Camadas + +``` +┌─────────────────────────────────────────────────────────────────┐ +│ CAMADA DE APRESENTAÇÃO │ +│ React 18 + TypeScript + Tailwind CSS + shadcn/ui │ +│ Interface estilo navegador com abas e omnibox │ +│ Porta: 5000 │ +└─────────────────────────────────────────────────────────────────┘ + ▼ +┌─────────────────────────────────────────────────────────────────┐ +│ CAMADA DE ORQUESTRAÇÃO │ +│ Express.js + Socket.IO + Manus Agent │ +│ API REST + WebSocket em tempo real │ +│ Porta: 5000 │ +└─────────────────────────────────────────────────────────────────┘ + ▼ +┌─────────────────────────────────────────────────────────────────┐ +│ CAMADA DE INTELIGÊNCIA │ +│ FastAPI (Python) + OpenAI API │ +│ Scientist, Embeddings, RPA, Workflows │ +│ Porta: 8001 (IA) / 8002 (Fisco) │ +└─────────────────────────────────────────────────────────────────┘ + ▼ +┌─────────────────────────────────────────────────────────────────┐ +│ CAMADA DE DADOS │ +│ PostgreSQL + Knowledge Graph + ChromaDB │ +│ Drizzle ORM + Session Store │ +└─────────────────────────────────────────────────────────────────┘ +``` + +### Estrutura de Diretórios + +``` +arcadia-suite/ +├── client/ # Frontend React +│ └── src/ +│ ├── components/ # Componentes reutilizáveis +│ ├── hooks/ # React hooks customizados +│ ├── lib/ # Utilitários e configurações +│ └── pages/ # Páginas da aplicação +├── server/ # Backend Node.js +│ ├── admin/ # Rotas administrativas +│ ├── api-central/ # Central de APIs +│ ├── automations/ # Motor de automações +│ ├── bi/ # Business Intelligence +│ ├── chat/ # Chat interno +│ ├── compass/ # Process Compass (clientes/projetos) +│ ├── crm/ # Gestão de relacionamento +│ ├── email/ # Serviço de e-mail +│ ├── erp/ # Integração ERP +│ ├── fisco/ # Motor fiscal (NF-e) +│ ├── ide/ # IDE integrada +│ ├── learning/ # Sistema de aprendizado +│ ├── login-bridge/ # Bridge de autenticação +│ ├── manus/ # Agente autônomo +│ ├── production/ # Gestão de produção +│ ├── productivity/ # Hub de produtividade +│ ├── proxy/ # Proxy reverso +│ ├── python/ # Serviços Python (FastAPI) +│ ├── support/ # Central de suporte +│ ├── valuation/ # Precificação e valuation +│ └── whatsapp/ # Integração WhatsApp +└── shared/ # Código compartilhado + └── schema.ts # Schemas do banco de dados +``` + +--- + +## Módulos do Sistema + +### 1. Cockpit (Dashboard Principal) +**Arquivo:** `client/src/pages/Cockpit.tsx` + +Painel central com visão geral do sistema: +- Widgets configuráveis +- Métricas em tempo real +- Atividades recentes +- Atalhos para módulos + +### 2. Process Compass +**Arquivo:** `client/src/pages/ProcessCompass.tsx` +**API:** `/api/compass/*` + +Gestão completa de processos empresariais: +- **Clientes:** Cadastro, histórico, segmentação +- **Projetos:** Cronograma, tarefas, milestones +- **Contratos:** Gestão de contratos e renovações +- **Timesheet:** Controle de horas trabalhadas + +### 3. Comunicação Unificada +**Arquivo:** `client/src/pages/Comunicacao.tsx` +**API:** `/api/whatsapp/*` + +Centro de comunicação multi-canal: +- **WhatsApp Business:** Atendimento via Baileys +- **Chat Interno:** Comunicação da equipe +- **E-mail:** Integração IMAP/SMTP +- **Tickets:** Sistema de filas de atendimento + +### 4. CRM (Customer Relationship Management) +**Arquivo:** `client/src/pages/Crm.tsx` +**API:** `/api/crm/*` + +Gestão de relacionamento com clientes: +- Pipeline de vendas +- Funil de conversão +- Gestão de oportunidades +- Comissionamento automático +- Integração com Google Calendar + +### 5. Business Intelligence (Arcádia Insights) +**Arquivo:** `client/src/pages/BiWorkspace.tsx` +**API:** `/api/bi/*` + +Análise e visualização de dados: +- Upload de arquivos (CSV, Excel) +- Gráficos interativos (Recharts) +- Dashboards personalizáveis +- Conexão com múltiplas fontes + +### 6. Scientist (Central de Inteligência) +**Arquivo:** `client/src/pages/Scientist.tsx` +**API:** `/api/scientist/*` + +Módulo de auto-programação com IA: +- Análise de dados automatizada +- Geração de código (Python/SQL) +- Execução em sandbox +- Armazenamento de soluções reutilizáveis + +### 7. Manus (Agente Autônomo) +**Arquivo:** `client/src/pages/Agent.tsx` +**API:** `/api/manus/*` + +Executor de tarefas autônomo: +- Loop pensamento-ação-observação +- Ferramentas disponíveis: + - Busca web + - Consulta ao Knowledge Graph + - Consulta ERP + - Cálculos + - Envio de mensagens + - Geração de relatórios + - Agendamentos + +### 8. Arcádia Fisco (Motor Fiscal) +**Arquivo:** `client/src/pages/Fisco.tsx` +**API:** `/api/fisco/*` + +Motor fiscal centralizado para compliance brasileiro: +- **NCM:** Nomenclatura Comum do Mercosul +- **CFOP:** Código Fiscal de Operações +- **CEST:** Código Especificador da Substituição Tributária +- **Grupos de Tributação:** Configuração de impostos +- **Certificados Digitais:** Gestão de A1/A3 +- **NF-e/NFC-e:** Emissão de notas fiscais eletrônicas +- **IBS/CBS:** Campos para Reforma Tributária + +#### Integração nfelib (Python) +**Arquivo:** `server/python/fisco_service.py` + +Serviço FastAPI para processamento de NF-e: +- Geração de XML (layout 4.00) +- Assinatura digital com certificado A1 +- Comunicação com SEFAZ (homologação/produção) +- Consulta, cancelamento e inutilização + +### 9. Produção +**Arquivo:** `client/src/pages/Production.tsx` +**API:** `/api/production/*` + +Gestão de produção e manufatura: +- Ordens de produção +- Controle de estoque +- Rastreabilidade +- Custos de produção + +### 10. Valuation (Precificação) +**Arquivo:** `client/src/pages/Valuation.tsx` +**API:** `/api/valuation/*` + +Sistema de precificação inteligente: +- Cálculo de custos +- Margem de contribuição +- Markup +- Simulações de preço + +### 11. Suporte +**Arquivo:** `client/src/pages/Support.tsx` +**API:** `/api/support/*` + +Central de atendimento: +- Tickets de suporte +- Base de conhecimento +- SLA e prioridades +- Histórico de atendimentos + +### 12. Automações +**Arquivo:** `client/src/pages/Automations.tsx` +**API:** `/api/automations/*` + +Motor de automações: +- Triggers e ações +- Workflows visuais +- Integrações via webhooks +- Agendamentos (cron) + +### 13. Knowledge Base +**Arquivo:** `client/src/pages/Knowledge.tsx` +**API:** `/api/knowledge/*` + +Base de conhecimento: +- Artigos e documentação +- Categorização +- Busca semântica +- Integração com IA + +### 14. IDE +**Arquivo:** `client/src/pages/IDE.tsx` +**API:** `/api/ide/*` + +Ambiente de desenvolvimento integrado: +- Monaco Editor +- Terminal (Xterm.js) +- Execução de código +- Gerenciamento de arquivos + +### 15. Administração +**Arquivo:** `client/src/pages/Admin.tsx` +**API:** `/api/admin/*` + +Painel administrativo: +- **Usuários:** Gestão de contas +- **Perfis:** Controle de acesso +- **Parceiros:** Hierarquia multi-tenant +- **Módulos:** Configuração de funcionalidades +- **Configurações:** Parâmetros do sistema + +### 16. API Hub +**Arquivo:** `client/src/pages/ApiHub.tsx` + +Documentação interativa de APIs: +- Listagem de endpoints +- Testes em tempo real +- Exemplos de uso +- Geração de código + +--- + +## Modelo de Dados + +### Entidades Principais + +#### Usuários e Autenticação +```sql +users -- Usuários do sistema +profiles -- Perfis de acesso +roles -- Papéis (RBAC) +permissions -- Permissões granulares +role_permissions -- Associação papel-permissão +user_roles -- Associação usuário-papel +module_access -- Controle de acesso a módulos +``` + +#### Produtividade +```sql +workspace_pages -- Páginas estilo Notion +page_blocks -- Blocos de conteúdo +page_links -- Links bidirecionais +dashboard_widgets -- Widgets do dashboard +quick_notes -- Notas rápidas +activity_feed -- Feed de atividades +user_favorites -- Favoritos +command_history -- Histórico de comandos +``` + +#### Conversação e IA +```sql +conversations -- Conversas com agente +messages -- Mensagens +chat_attachments -- Anexos +knowledge_base -- Base de conhecimento +``` + +#### ERP e Integrações +```sql +erp_connections -- Conexões com ERPs +agent_tasks -- Tarefas do agente +task_executions -- Execuções de tarefas +``` + +#### Comunicação +```sql +chat_threads -- Threads de chat +chat_participants -- Participantes +chat_messages -- Mensagens de chat +whatsapp_sessions -- Sessões WhatsApp +whatsapp_contacts -- Contatos WhatsApp +whatsapp_messages -- Mensagens WhatsApp +whatsapp_queues -- Filas de atendimento +whatsapp_tickets -- Tickets de atendimento +``` + +#### Process Compass +```sql +compass_clients -- Clientes +compass_projects -- Projetos +compass_project_members -- Membros de projeto +compass_project_phases -- Fases de projeto +compass_contracts -- Contratos +compass_timesheet -- Timesheet +compass_invoices -- Faturas +compass_payments -- Pagamentos +``` + +#### CRM +```sql +crm_leads -- Leads +crm_opportunities -- Oportunidades +crm_activities -- Atividades +crm_pipelines -- Pipelines +crm_stages -- Estágios +crm_commissions -- Comissões +``` + +#### Fisco +```sql +fisco_ncm -- NCMs +fisco_cest -- CESTs +fisco_cfop -- CFOPs +fisco_grupos_tributacao -- Grupos de tributação +fisco_natureza_operacao -- Naturezas de operação +fisco_ibpt -- Tabela IBPT +fisco_certificados -- Certificados digitais +fisco_configuracoes -- Configurações fiscais +fisco_notas -- Notas fiscais +fisco_nota_itens -- Itens das notas +fisco_nota_eventos -- Eventos fiscais +``` + +#### Multi-Tenant +```sql +partners -- Parceiros +partner_invites -- Convites de parceiros +tenant_clients -- Clientes dos tenants +``` + +--- + +## APIs e Endpoints + +### Estrutura Base + +| Módulo | Base URL | Descrição | +|--------|----------|-----------| +| Admin | `/api/admin` | Administração do sistema | +| Compass | `/api/compass` | Process Compass | +| CRM | `/api/crm` | Gestão de relacionamento | +| WhatsApp | `/api/whatsapp` | Comunicação WhatsApp | +| Fisco | `/api/fisco` | Motor fiscal | +| BI | `/api/bi` | Business Intelligence | +| Production | `/api/production` | Gestão de produção | +| Valuation | `/api/valuation` | Precificação | +| Support | `/api/support` | Central de suporte | +| Automations | `/api/automations` | Automações | +| IDE | `/api/ide` | Ambiente de desenvolvimento | +| Learning | `/api/learning` | Sistema de aprendizado | + +### Exemplos de Endpoints + +#### Fisco - NF-e +``` +GET /api/fisco/nfe/service-status # Status do serviço +POST /api/fisco/nfe/validar-certificado # Validar certificado A1 +POST /api/fisco/nfe/gerar-xml # Gerar XML preview +POST /api/fisco/nfe/emitir # Emitir NF-e +POST /api/fisco/nfe/consultar # Consultar na SEFAZ +POST /api/fisco/nfe/cancelar # Cancelar NF-e +POST /api/fisco/nfe/inutilizar # Inutilizar numeração +``` + +#### Compass - Clientes +``` +GET /api/compass/clients # Listar clientes +GET /api/compass/clients/:id # Detalhes do cliente +POST /api/compass/clients # Criar cliente +PUT /api/compass/clients/:id # Atualizar cliente +DELETE /api/compass/clients/:id # Excluir cliente +``` + +#### Admin - Usuários +``` +GET /api/admin/users # Listar usuários +GET /api/admin/users/:id # Detalhes do usuário +POST /api/admin/users # Criar usuário +PUT /api/admin/users/:id # Atualizar usuário +DELETE /api/admin/users/:id # Excluir usuário +``` + +--- + +## Integrações Externas + +### OpenAI API +- **Uso:** Agente de IA, Scientist, auto-replies +- **Modelo:** gpt-4o-mini +- **Configuração:** Via Replit Secrets + +### Baileys (WhatsApp) +- **Uso:** Conexão multi-sessão WhatsApp +- **Recursos:** QR Code, mensagens em tempo real +- **Armazenamento:** Sessões no banco de dados + +### nfelib (Python) +- **Uso:** Emissão de NF-e/NFC-e +- **Recursos:** XML, assinatura digital, SEFAZ +- **Certificados:** A1 (PFX) + +### Frappe Framework +- **Uso:** Arcádia Next (futuro) +- **Recursos:** ERPNext integration + +### Google Calendar +- **Uso:** Sincronização de eventos CRM +- **OAuth:** Configurável por usuário + +--- + +## Segurança e Autenticação + +### Autenticação +- **Método:** Session-based com Passport.js +- **Hash:** bcrypt para senhas +- **Sessões:** PostgreSQL session store + +### Controle de Acesso (RBAC) +``` +Hierarquia: +├── Master (Arcádia) +│ └── Parceiros +│ └── Clientes +``` + +### Permissões +- Baseadas em módulos e ações +- Código formato: `modulo.recurso.acao` +- Exemplo: `compass.clients.write` + +### Certificados Digitais +- Tipo A1 (arquivo PFX) +- Armazenamento seguro com senha +- Validação de expiração + +--- + +## Guia de Implantação + +### Requisitos +- Node.js 20+ +- Python 3.11+ +- PostgreSQL 15+ +- Certificado SSL (produção) + +### Variáveis de Ambiente +```env +DATABASE_URL=postgresql://... +SESSION_SECRET=... +OPENAI_API_KEY=... +FISCO_PYTHON_URL=http://localhost:8002 +FISCO_PORT=8002 +``` + +### Comandos de Inicialização +```bash +# Instalar dependências +npm install + +# Iniciar em desenvolvimento +npm run dev + +# Serviço Python Fisco (separado) +cd server/python && python fisco_service.py +``` + +### Portas +| Serviço | Porta | +|---------|-------| +| Frontend + API | 5000 | +| Python Fisco | 8002 | +| Python IA | 8001 | + +--- + +## Changelog + +### Janeiro 2026 +- Integração nfelib para NF-e +- Módulo Fisco completo +- Sistema de aprendizado automático +- Validação Zod em todas as rotas fiscais + +--- + +**Arcádia Suite** - Transformando a gestão empresarial com Inteligência Artificial + +*Documentação gerada automaticamente pelo sistema.* diff --git a/PLANO_EVOLUCAO_ARCADIA.md b/PLANO_EVOLUCAO_ARCADIA.md new file mode 100644 index 0000000..8268535 --- /dev/null +++ b/PLANO_EVOLUCAO_ARCADIA.md @@ -0,0 +1,421 @@ +# PLANO ESTRATÉGICO DE EVOLUÇÃO +## Arcádia Suite → Frappe Framework +### Versão 1.0 - Janeiro 2026 + +--- + +## 1. VISÃO GERAL + +### 1.1 Objetivo +Evoluir o Arcádia Suite para um **Business Operating System** completo, inspirado em três referências: + +| Referência | O que Inspira | +|------------|---------------| +| **Notion** | Blocos modulares, banco de dados relacional, personalização | +| **Replit** | IDE no navegador, colaboração em tempo real, deploy instantâneo | +| **Discord** | Comunidades, canais contextuais, comunicação em tempo real | + +### 1.2 Estratégia de Migração: Strangler Fig + +A estratégia Strangler Fig permite: +- Manter WhatsApp, Manus, CRM funcionando durante toda a migração +- Construir o novo sistema em paralelo +- Migrar módulo a módulo até o sistema legado "desaparecer" + +``` +Sistema Atual (Express/React) continua funcionando + ↓ +Você vai adicionando "camadas Frappe" por cima + ↓ +Cada módulo migrado substitui o antigo + ↓ +No final, o "núcleo antigo" sumiu naturalmente +``` + +### 1.3 Stack Técnico + +| Camada | Atual | Futuro | +|--------|-------|--------| +| Frontend | React 18 + TypeScript | Frappe Desk + React | +| Backend | Express.js | Frappe Framework | +| Database | PostgreSQL | PostgreSQL (mesmo) | +| Real-time | Socket.IO | Frappe Realtime + Socket.IO | +| WhatsApp | Baileys | Frappe App (Baileys) | +| IDE | Monaco + Terminal | IDE 3 Modos | + +--- + +## 2. ESTRUTURA MULTI-TENANT + +### 2.1 Hierarquia de 3 Níveis + +``` +NÍVEL 1: MASTER (Arcádia) +═════════════════════════ +• Equipe de desenvolvimento +• Acesso total ao sistema +• IDE Pro-Code completa +• Central de Bibliotecas (publica apps) +• Suporte N3 (acessa tenants para debug) +• Gerencia parceiros e planos + │ + ├───────────────────────┬───────────────────────┐ + ▼ ▼ ▼ +NÍVEL 2: PARCEIROS +══════════════════ +• Consultorias, integradores, revendas +• IDE Low-Code +• Gerencia seus clientes +• Comissões sobre vendas +• Suporte N2 aos clientes +• Baixa apps da biblioteca + │ + ┌────┴────┐ + ▼ ▼ +NÍVEL 3: CLIENTES +═════════════════ +• Empresas usuárias finais +• Cockpit personalizado +• CRM/ERP operacional +• WhatsApp (N sessões conforme plano) +• BI próprio +• Manus com tools básicas +``` + +### 2.2 Matriz de Permissões por Tipo de Tenant + +| Módulo | Master | Parceiro | Cliente | +|--------|--------|----------|---------| +| **IDE Pro-Code** | ✅ | ❌ | ❌ | +| **IDE Low-Code** | ✅ | ✅ | ❌ | +| **IDE No-Code** | ✅ | ✅ | ✅ (se habilitado) | +| **Central de Bibliotecas** | ✅ Publicar | ✅ Baixar | ❌ | +| **Central de APIs** | ✅ Gerenciar | ⚠️ Seus conectores | ⚠️ Leitura | +| **WhatsApp** | ✅ Ilimitado | ✅ N sessões | ✅ N sessões | +| **CRM/ERP** | ✅ Global | ✅ Próprio | ✅ Próprio | +| **Manus (IA)** | ✅ Todas tools | ✅ Tools permitidas | ✅ Básicas | +| **BI/Relatórios** | ✅ Global | ✅ Próprio | ✅ Próprio | +| **Suporte N3** | ✅ Acessa tenants | ❌ | ❌ | +| **Ver Parceiros** | ✅ | ✅ Seus clientes | ❌ | +| **Comissões** | ✅ Gerencia | ✅ Visualiza suas | ❌ | + +### 2.3 Alterações no Schema + +```sql +-- Alterações na tabela tenants +ALTER TABLE tenants ADD COLUMN tenant_type TEXT DEFAULT 'client'; +-- master = Arcádia, partner = Parceiros, client = Clientes + +ALTER TABLE tenants ADD COLUMN parent_tenant_id INTEGER REFERENCES tenants(id); +-- Referência ao tenant pai (hierarquia) + +ALTER TABLE tenants ADD COLUMN partner_code TEXT; +-- Código do parceiro para rastreamento + +ALTER TABLE tenants ADD COLUMN max_users INTEGER DEFAULT 5; +ALTER TABLE tenants ADD COLUMN max_storage_mb INTEGER DEFAULT 1000; +ALTER TABLE tenants ADD COLUMN features JSONB; +ALTER TABLE tenants ADD COLUMN commission_rate NUMERIC(5,2); +ALTER TABLE tenants ADD COLUMN trial_ends_at TIMESTAMP; + +-- Nova tabela: Planos +CREATE TABLE tenant_plans ( + id SERIAL PRIMARY KEY, + code TEXT NOT NULL UNIQUE, + name TEXT NOT NULL, + tenant_type TEXT NOT NULL, + max_users INTEGER DEFAULT 5, + max_storage_mb INTEGER DEFAULT 1000, + features JSONB, + monthly_price INTEGER DEFAULT 0, + yearly_price INTEGER DEFAULT 0, + is_active TEXT DEFAULT 'true', + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +-- Nova tabela: Relacionamento Parceiro-Cliente +CREATE TABLE partner_clients ( + id SERIAL PRIMARY KEY, + partner_id INTEGER NOT NULL REFERENCES tenants(id), + client_id INTEGER NOT NULL REFERENCES tenants(id), + commission_rate NUMERIC(5,2), + status TEXT DEFAULT 'active', + started_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + ended_at TIMESTAMP +); + +-- Nova tabela: Comissões +CREATE TABLE partner_commissions ( + id SERIAL PRIMARY KEY, + partner_id INTEGER NOT NULL REFERENCES tenants(id), + client_id INTEGER NOT NULL REFERENCES tenants(id), + reference_month TEXT NOT NULL, + client_plan_value INTEGER NOT NULL, + commission_rate NUMERIC(5,2) NOT NULL, + commission_value INTEGER NOT NULL, + status TEXT DEFAULT 'pending', + paid_at TIMESTAMP, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); +``` + +--- + +## 3. CRONOGRAMA GERAL (6-9 Meses) + +``` + Mês 1 Mês 2 Mês 3 Mês 4 Mês 5 Mês 6+ + ├──────────┼──────────┼──────────┼──────────┼──────────┼────────► + +FASE 0 ████████████████████ + FUNDAÇÃO + Setup + Tenants + SSO + +FASE 1 ████████████████████████████ + INFRAESTRUTURA + CRM/ERP + Central APIs + Manus + +FASE 2 ████████████████████████████████ + EXPERIÊNCIA + Cockpit + Comunidades + IDE + +FASE 3 ████████████████████► + AUTOMAÇÃO + WhatsApp + RPA + Decommission +``` + +--- + +## 4. FASE 0: FUNDAÇÃO (Semanas 1-8) + +### 4.1 Objetivo +Preparar a base técnica sem quebrar nada do sistema atual. + +### 4.2 Entregas + +| # | Entrega | Descrição | Semana | +|---|---------|-----------|--------| +| 0.1 | **Setup Frappe Bench** | Instalar Frappe em servidor paralelo | 1-2 | +| 0.2 | **Hierarquia de Tenants** | Novos campos e tabelas no PostgreSQL | 2-3 | +| 0.3 | **SSO Bridge** | Login unificado (usuário loga uma vez) | 3-4 | +| 0.4 | **CDC Pipeline** | Sincronização de dados PostgreSQL ↔ Frappe | 4-6 | +| 0.5 | **Vault de Secrets** | Gerenciamento seguro de API keys | 5-6 | +| 0.6 | **Feature Flags** | Sistema de features por plano/tenant | 6-7 | +| 0.7 | **Planos e Preços** | Tabela de planos (free, starter, pro, enterprise) | 7-8 | + +### 4.3 Resultado +- ✅ Frappe rodando em paralelo +- ✅ Hierarquia master/partner/client funcionando +- ✅ Login único nos dois sistemas +- ✅ Dados sincronizados em tempo real +- ✅ Planos e features configuráveis + +--- + +## 5. FASE 1: INFRAESTRUTURA (Semanas 6-16) + +### 5.1 Objetivo +Migrar dados mestres e criar a Central de APIs. + +### 5.2 Entregas + +| # | Entrega | Descrição | Semana | +|---|---------|-----------|--------| +| 1.1 | **DocTypes CRM** | Clientes, Leads, Oportunidades no Frappe | 6-8 | +| 1.2 | **DocTypes ERP** | Produtos, Pedidos, Faturas no Frappe | 8-10 | +| 1.3 | **Central de APIs (MVP)** | Dashboard visual de integrações | 9-12 | +| 1.4 | **Conectores Básicos** | Interface para SEFAZ, Bancos (dados demo) | 12-14 | +| 1.5 | **Manus Frappe** | Agente IA via background jobs | 13-15 | +| 1.6 | **Knowledge Graph** | Migração do grafo para DocTypes | 14-16 | + +### 5.3 Central de APIs - Detalhamento + +**IMPORTANTE:** A Central de APIs é uma interface visual de gerenciamento. Os dados de integrações (SEFAZ, Bancos, Mercado Livre) são ILUSTRATIVOS/DEMO. Não fazemos integração real com APIs externas nesta fase. + +O que construímos: +- ✅ Interface visual (React) +- ✅ CRUD de conectores (cadastrar, editar, remover) +- ✅ Status visual (online, warning, error) +- ✅ Logs fictícios para demonstração +- ✅ Configurações por conector +- ✅ Permissões por tenant type + +O que NÃO fazemos: +- ❌ Conectar à SEFAZ real +- ❌ Conectar a bancos reais +- ❌ Chamadas API externas + +### 5.4 Resultado +- ✅ CRM/ERP acessível via Frappe Desk +- ✅ Central de APIs funcionando (dados demo) +- ✅ Manus consultando dados do Frappe +- ✅ Knowledge Graph migrado + +--- + +## 6. FASE 2: EXPERIÊNCIA (Semanas 12-24) + +### 6.1 Objetivo +Construir a nova interface (Cockpit, Comunidades, IDE). + +### 6.2 Entregas + +| # | Entrega | Descrição | Semana | +|---|---------|-----------|--------| +| 2.1 | **Cockpit PARA** | Navegação Projetos/Áreas/Recursos/Arquivo | 12-15 | +| 2.2 | **Dashboard Tríade** | Importante/Urgente/Circunstancial | 14-16 | +| 2.3 | **Widgets Sistema** | Tarefas, Calendário, Gráficos | 15-17 | +| 2.4 | **Comunidades MVP** | Canais por projeto (Socket.IO via Frappe) | 16-19 | +| 2.5 | **IDE No-Code** | DocType Builder visual | 18-20 | +| 2.6 | **IDE Low-Code** | Templates de scripts | 20-22 | +| 2.7 | **IDE Pro-Code** | Monaco + Terminal + Live Preview | 21-23 | +| 2.8 | **Central de Bibliotecas** | Repositório de apps Frappe | 22-24 | + +### 6.3 Cockpit PARA + Tríade + +O Cockpit é a interface principal do usuário, baseado em duas metodologias: + +**Método PARA (Tiago Forte):** +- **P**rojetos: Todos os projetos ativos com metas e prazos +- **Á**reas: Áreas de responsabilidade contínua (Vendas, Financeiro, RH) +- **R**ecursos: Base de conhecimento, templates, manuais +- **A**rquivo: Tudo concluído ou inativo, para consulta futura + +**Tríade do Tempo (Christian Barbosa):** +- 🟢 **Importante** (70% do tempo): Atividades que geram valor +- 🟡 **Urgente** (20% do tempo): Atividades com prazo apertado +- 🔴 **Circunstancial** (10% do tempo): Atividades que não agregam + +### 6.4 IDE 3 Modos + +| Modo | Quem Usa | O que Faz | +|------|----------|-----------| +| **No-Code** | Clientes | Criar formulários arrastando, workflows visuais, relatórios com filtros | +| **Low-Code** | Parceiros | Server Scripts com templates, validações, webhooks, fórmulas | +| **Pro-Code** | Arcádia | Monaco Editor completo, Terminal, Git, Deploy de apps | + +### 6.5 Resultado +- ✅ Cockpit PARA + Tríade funcionando +- ✅ Comunidades com canais por projeto +- ✅ IDE com 3 modos operando +- ✅ Central de Bibliotecas publicando apps + +--- + +## 7. FASE 3: AUTOMAÇÃO E DECOMMISSION (Semana 20+) + +### 7.1 Objetivo +Migrar serviços restantes e desligar o legado. + +### 7.2 Entregas + +| # | Entrega | Descrição | Semana | +|---|---------|-----------|--------| +| 3.1 | **WhatsApp Frappe App** | Reconstruir Baileys como app nativo | 20-24 | +| 3.2 | **Motor de Workflows** | Automações visuais (RPA) | 22-26 | +| 3.3 | **Scientist Frappe** | Migrar para Frappe Workers | 24-28 | +| 3.4 | **Validação de Paridade** | Testes A/B, métricas | 26-30 | +| 3.5 | **Decommission Express** | Desligar endpoints legados | 30+ | + +### 7.3 Resultado +- ✅ Sistema 100% unificado no Frappe +- ✅ Express/React desligado +- ✅ Uma única plataforma para manter + +--- + +## 8. MAPEAMENTO DE MÓDULOS + +| Módulo Atual | O que Acontece | Fase | +|--------------|----------------|------| +| **users, tenants** | Expande com hierarquia | 0 | +| **profiles, roles, permissions** | Migra para Frappe RBAC | 0 | +| **whatsapp_contacts, messages, tickets** | Mantém → Migra na Fase 3 | 3 | +| **pc_crm_leads, stages, opportunities** | Migra para Frappe DocTypes | 1 | +| **pc_clients, projects, tasks** | Migra para Frappe DocTypes | 1 | +| **graph_nodes, graph_edges** | Migra para Frappe Knowledge Graph | 1 | +| **internal_chat_*** | Evolui para Comunidades | 2 | +| **manus_*** | Integra via background jobs | 1 | +| **bi_*** | Mantém + novos widgets Cockpit | 2 | +| **ide_*** | Evolui para 3 modos | 2 | + +--- + +## 9. RISCOS E MITIGAÇÕES + +| Risco | Probabilidade | Impacto | Mitigação | +|-------|---------------|---------|-----------| +| **Drift de dados** | Média | Alto | CDC com validação contínua | +| **Performance chat** | Média | Médio | Load test antes de migrar | +| **Tokens WhatsApp** | Baixa | Alto | Vault de secrets | +| **Curva aprendizado Frappe** | Alta | Médio | Treinamento na Fase 0 | +| **Regressões funcionais** | Média | Alto | Testes A/B, telemetria | +| **Resistência usuários** | Média | Médio | Piloto gradual: Master → Partners → Clients | + +--- + +## 10. QUICK WINS (Entregas Rápidas) + +| Item | Tempo | Valor | +|------|-------|-------| +| **Hierarquia de Tenants** | 2 semanas | Estrutura para parceiros | +| **SSO unificado** | 2 semanas | Login único | +| **Central de APIs (UI)** | 3 semanas | Visibilidade integrações | +| **Dashboard Tríade** | 2 semanas | Consciência sobre tempo | +| **Planos e Features** | 2 semanas | Monetização estruturada | + +--- + +## 11. OS 5 PILARES DO SISTEMA + +### Pilar 1: Knowledge Graph +- Todos os dados do negócio conectados e pesquisáveis +- Navegação visual entre entidades relacionadas +- Base para IA contextual + +### Pilar 2: Central Intelligence (Scientist) +- IA que aprende com interações do sistema +- Gera e executa código automaticamente +- Detecta padrões e sugere otimizações + +### Pilar 3: Autonomous Agent (Manus) +- Executa tarefas multi-step de forma autônoma +- Acessa ferramentas e APIs +- Deep research com planejamento + +### Pilar 4: Unified Communication +- WhatsApp integrado com CRM +- Chat interno com canais por projeto +- Email (futuro) +- Todos os canais em um lugar + +### Pilar 5: Complete IDE +- 3 modos de desenvolvimento (No/Low/Pro Code) +- Central de Bibliotecas +- Deploy integrado + +--- + +## 12. DOCUMENTOS DE REFERÊNCIA + +Os documentos originais que basearam este plano estão em: +- `attached_assets/cocpti_docs/cocpti/` - Cockpit e DNA Notion +- `attached_assets/cocpti_docs/Ide Arcadia/` - Proposta IDE +- `attached_assets/cocpti_docs/Rota de desenvolviento/` - Roadmap original +- `attached_assets/cocpti_docs/Central de API/` - Central de APIs + +--- + +## 13. PRÓXIMOS PASSOS + +1. [ ] Implementar hierarquia de tenants no schema +2. [ ] Criar tabelas de planos e comissões +3. [ ] Documentar arquitetura CDC +4. [ ] Provisionar servidor Frappe +5. [ ] Implementar Central de APIs (UI com dados demo) +6. [ ] Construir Cockpit PARA + Tríade + +--- + +*Documento criado em Janeiro 2026* +*Última atualização: Janeiro 2026* diff --git a/README.md b/README.md deleted file mode 100644 index d50e9f4..0000000 --- a/README.md +++ /dev/null @@ -1 +0,0 @@ -# Arcadia Suite\nOffice Estratégico Empresarial diff --git a/client/index.html b/client/index.html new file mode 100644 index 0000000..89057ed --- /dev/null +++ b/client/index.html @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + Arcádia Suite + + +
+ + + \ No newline at end of file diff --git a/client/public/favicon.ico b/client/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..7b615d49e1e1cec208e4e78649d88a71f4167042 GIT binary patch literal 1675 zcmV;626Xv}P)CymLS_?q}Sn(>MP%c_pdT)DwX6DY!IeRT1_C9BZ^RQ>1J!h|< zZ>{yMMb*Lp7~c61u(*IE0KhCBTlEP+LwULU8;sXUSWuPpC4eMn;<4(KX%|o8nZcqo zixQaB8ex?k=Hr*83L1<^>x80YHJNstuqN%v=-xZ*GBSi(dnTgaGzq14)ocL8+Ez08EwMXMh14 z6%vzLFb0soG{6uvog1z6kAMeDP|C|@^e&t_`Pkz}|8n}wnt>E2LUB&$C?*t=B0>Oy z%NDoYe)InM#e*S;&|=8VQf@M6F%BW2YR-itzy9&J?|*XnT!p6rQl?-T3P?mloV#Lg z`@!$tvG3qLL7fn076YRes9IR*fogC*`}f};`Sh0`IJ;JF)&eLnjSf41XaV-J1f-S0c3At$8-ypR%D0!Hz);cp*5`sNB+4Gp9klup3_S?y|;Syr?2 z8=){LEC6Z@kk*tgomxL~?5{*_Z~$Yq7~l<65rSkGTzGZ)qQIHO>@%na#U*XIYSCZ) zftL5~U(2J@X9jOw$TJrc)L>?6rfLr=@2FN|Z{*Ld zS$dW-zm$3c#S^L_~(eQ6A*lJ+9Nr z-h6v&VQ%Jg2j_c3>u-gvfi~)yswM^rYNn;AR6;&dnGsMh0tPjhi1fBbTU-5Fy?*5R z(Sa*mx7&N+w9AYBzRO*^>3{iXKetA=-xbPSr=>t13RJ955}?5&k)m0mJE)o?^Srox z@2-#U`^by`T=H4=>`Slg*}Zt}huzdvz1^9sW%bWony;*^?poa0+v*?t^Kqy$x*o|l z#*>hU5E;2Ia#1jY_wH9e`~J@D@9On7zxCC-x6ik}aMvw&-ge{RyKZCX{pj8=_517h z9RBQqk9}yWE+sdFsOpFwFBJ^!kI} zJn^TcS6=_!6Hj%!{q^;6xOzkX|o>^6B6Auj<)U=jmyD!~YuhkcK%>VJ} z;}8Du-o^JWJp25Mwam}8TLzt*n+>68x0@fm=7a5aGXyng#3RLk zsXa!5tu@*^=i5bbHuH_;Gv{AhK07ltC3X47(&>7w=3RDiz307;>-t82<-!IGo%U1+ zVaLKOT`TrQn8l@pC}~#KW^X@qL({K!2W-wXI<2O2LRh;wRnNQ=HtIDeY}7L+Y}9>g zX1dd!UhCRIXZXpRug|SXgmLQye41^dLNy_;yYchiy!+(`9)9M0e@?tFeP#??OgAf2 zn?xvz`S#WizIO1kt8Nvk@JYW+gBQ{iMIbN2|Ni^xiDM5Refq??)qXY65C&3G!z3vb zapdCm_Mw{&TzSo%3-8%euepitZK_4=XyX{fO;PCj=H|xg8~yGD)xb2Yq&AZBgCyvj zt5450W_HZZwleQ3(WM_{%bc8+tb8wmsYdOJG`o!nxf;$yn7POcHdbJ+N7I|WF)=NTE3!kj3 z9Iw_&8i6>lmTh`cghjG9!}z~Sh=E`cMy2?KQ%bK=xRrR7w@Y9uG{)#xsc03k{U5{* V){&>51o8j?002ovPDHLkV1iMxJ8=L2 literal 0 HcmV?d00001 diff --git a/client/public/favicon.png b/client/public/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..7b615d49e1e1cec208e4e78649d88a71f4167042 GIT binary patch literal 1675 zcmV;626Xv}P)CymLS_?q}Sn(>MP%c_pdT)DwX6DY!IeRT1_C9BZ^RQ>1J!h|< zZ>{yMMb*Lp7~c61u(*IE0KhCBTlEP+LwULU8;sXUSWuPpC4eMn;<4(KX%|o8nZcqo zixQaB8ex?k=Hr*83L1<^>x80YHJNstuqN%v=-xZ*GBSi(dnTgaGzq14)ocL8+Ez08EwMXMh14 z6%vzLFb0soG{6uvog1z6kAMeDP|C|@^e&t_`Pkz}|8n}wnt>E2LUB&$C?*t=B0>Oy z%NDoYe)InM#e*S;&|=8VQf@M6F%BW2YR-itzy9&J?|*XnT!p6rQl?-T3P?mloV#Lg z`@!$tvG3qLL7fn076YRes9IR*fogC*`}f};`Sh0`IJ;JF)&eLnjSf41XaV-J1f-S0c3At$8-ypR%D0!Hz);cp*5`sNB+4Gp9klup3_S?y|;Syr?2 z8=){LEC6Z@kk*tgomxL~?5{*_Z~$Yq7~l<65rSkGTzGZ)qQIHO>@%na#U*XIYSCZ) zftL5~U(2J@X9jOw$TJrc)L>?6rfLr=@2FN|Z{*Ld zS$dW-zm$3c#S^L_~(eQ6A*lJ+9Nr z-h6v&VQ%Jg2j_c3>u-gvfi~)yswM^rYNn;AR6;&dnGsMh0tPjhi1fBbTU-5Fy?*5R z(Sa*mx7&N+w9AYBzRO*^>3{iXKetA=-xbPSr=>t13RJ955}?5&k)m0mJE)o?^Srox z@2-#U`^by`T=H4=>`Slg*}Zt}huzdvz1^9sW%bWony;*^?poa0+v*?t^Kqy$x*o|l z#*>hU5E;2Ia#1jY_wH9e`~J@D@9On7zxCC-x6ik}aMvw&-ge{RyKZCX{pj8=_517h z9RBQqk9}yWE+sdFsOpFwFBJ^!kI} zJn^TcS6=_!6Hj%!{q^;6xOzkX|o>^6B6Auj<)U=jmyD!~YuhkcK%>VJ} z;}8Du-o^JWJp25Mwam}8TLzt*n+>68x0@fm=7a5aGXyng#3RLk zsXa!5tu@*^=i5bbHuH_;Gv{AhK07ltC3X47(&>7w=3RDiz307;>-t82<-!IGo%U1+ zVaLKOT`TrQn8l@pC}~#KW^X@qL({K!2W-wXI<2O2LRh;wRnNQ=HtIDeY}7L+Y}9>g zX1dd!UhCRIXZXpRug|SXgmLQye41^dLNy_;yYchiy!+(`9)9M0e@?tFeP#??OgAf2 zn?xvz`S#WizIO1kt8Nvk@JYW+gBQ{iMIbN2|Ni^xiDM5Refq??)qXY65C&3G!z3vb zapdCm_Mw{&TzSo%3-8%euepitZK_4=XyX{fO;PCj=H|xg8~yGD)xb2Yq&AZBgCyvj zt5450W_HZZwleQ3(WM_{%bc8+tb8wmsYdOJG`o!nxf;$yn7POcHdbJ+N7I|WF)=NTE3!kj3 z9Iw_&8i6>lmTh`cghjG9!}z~Sh=E`cMy2?KQ%bK=xRrR7w@Y9uG{)#xsc03k{U5{* V){&>51o8j?002ovPDHLkV1iMxJ8=L2 literal 0 HcmV?d00001 diff --git a/client/public/opengraph.jpg b/client/public/opengraph.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3b8b7dcfc87ea6a319144c47b444d1e1839fdc8c GIT binary patch literal 45382 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%0DPG>Xnu_Sfx?BF;IncF8*MRl?&G3 z3{UuLB`<7@@33bo#{$#Tcf)LL^$Omou4>O0_s-HXJ+m*}uOF$au0fpN3#NwF%qe`< z7~H~f9i0c5bpQKy)UoHnCyLD#i$MR%G2TVmp6DL6q;~R!H;selS;r zQh5E}A|xyWe1~bjbA9*o*XijSt-da1j%;(IAqrZs?O32M43z6 z(0uv1b>DxwEaFzUwXX6YvTsZI^5x#s4eHO*p|^zD8uAVA8I|;sEQ7<%hr4G(cCU^L zIrwON5FM#&9SG6A=9FRKRX5S&Wx z+eyl#UT9zY9y(vwXn^QbeExh8I&8&3NzaI+4TojUpf42i=Er;7=`k?b?X>L$4g1hd zz?8R%C7P#?P+<2M6!(k-_{D0QS;Q08-D-=iL8bz_aw?BfjcR$BZs5r(0e96y!g%3r zX=^W@y&4xl1O(;JaZ;AHS@Hp~30vMq0wOCpNEiXmClg&GluuIa!6CqlJ@ITG>{=*= z9BMRQeZ^LutcWu%|9P;_2F1*Fc_b^g&iI&DD3ogP<#(A1{@dT>yyen+wl_~N{ocooXa-XQ!! zm)XvmkGtF!yW+#8ndR2KZpV)qn7rR|ghy0CioFM}wC5V~;}R|Lh#nmkWPW#8pT&pELSHi2 zl$>BJq&)y;91^v^59#Qx_iA9Uc0^;xt-L{Kb*X6EL*?C6F}aA)e(vqXD(wZioKC0w z!U2re725FQG>0UBYwXR-OuMywVEpaAAGud2qm-4=NhwXY||2o&j+TXwI1KYnZT^5(Ra3OE7{P>O7&bVx+ z^-9FA31^A>PhUQMrf9|B&K4St6%jD=kt9V;TZAz8$kfkofjL!i^3HZR-{_w)Ju&+Z=2D+-^tm%rBgv*od-FWCOrAl~WiE#Hq% zz6Xf3Rm&#FtR`nh-<|)nB|2Zf=RZ#nyU_f78`metO>MJJjb5MapC9;FYvO@Yir)SI zT;)H{1(2NogXM+r>6E1fyy&L%Jq<0b@bZ>va~>ErZ!xdtR##typKU~n&+kK{UdS_S zNb;hlEN0b%kC#?ArC|cp?U`?Sk$)mudK=m-SZ?t7dn++1Fvp5st;TgLdpG%S)lPc` zK)5A=a0Fm*{*#I5%lo%EglDFtQvd+GPz`EXCS_$EFjL*LQAOQ8Qm=I^jzkGZdGd9d zSjd4qf=IkohS$-|_4#NTEmJv*yAz>%56YIVx_6;Br^G_yMe9C_Swm5lnyEg6b!my=#(%&XviS`_VImKXJJ!Y7t6xJ$i&e|Cj-d5 z%O?c>Q4r!ifTyK41wR!S5Q^3c z>RMRHB^Il=26&@JaAUO8w$Mn{Az`}O*7{YrBuA~7E#TtIm_b*r06e)-6LOKA;mM(z zQVBQmNKSYa0(1s_WoA0AO`PBo$#BK~ulBAysHr22KMt`1YGFW>Lo&b!JOmL$3<{Me0zMm@3-H6o4oh!%dUe2BdI^BYc_wtmbJIB?uI74tWiYFz!q-M zUKxFz-+pe+-uV=Fw9P<`bI9Bky{21YWjmaP$epNiQezs zgQC&NBM8NC@1L@Y6D+E+zyI6=j&?ms^rbSvi~7QIH1%%%XY(uDtHp}G+}z9Szgz3> zWt!O}^^-&zcHR@j7hNU}Ifx6<>Jy<$6qQ77aCH6ahTUZ9Rqnb)!G_EXU!8_{h2m9H zLyRDC<81NlD+%M2HtB%Y0yZN_Cau~KOtwp}UnZ$CfV*Y|Gwo_b; zhof4G#A&FIX6*p}T)2P`z;f=D@pqImJ31`o_v1cP`n=+xweMC`n^N`GQ4)R(vve`# zEYk@&Y+~i3)hv0x`kF9keLDMV$D5fgc4oPoZ?uhe)INy>T2 zqnbvY&Ro2OemsR4S#Mpe<>evdGu|HLdM9RdxKva!4m(|V6?o#AYYcl{38>w<`$pm& z7xaoVkDK^CSAxp80T;V_1@ls~Wc;TKNLX>j=+hZOP*bDH3PRoenavugCH?)nrHh#C zJ+6D?%UetB?ETBH=sJ0L`Jjf+0}GxCEIB6S>4U5LkKH`H_q^cfn`*bln7}6k4-dBy z?S$GwwgG#JX{LQZ-nJO)X+*T9H-gWT+iK8vMDzC4mff~^S}UZ@u_F6NIg6&mJ%~M} zk-aaKF~}agAU)-_J#Om)itF?)X=m7VYX|p7t~xC&M{1S!nuf|GA9Qy4E=#V_B6{#b zid{BZkPZ$$P#c}aJ0dWx`sS@>bp^Cr8vO}iU&GU4z2iU4aY`uqHTNvCyZg{lEz#7e z+E=}=t<0R3x$F7C6H*$nlYB2LK0dUIrAe%AD{)%hkZl~o7>HN#=C6VGe^&{huHf>lo4FrnG`qD@LEf>c@)6`?A+;N9@m1TmYnyqhZZ-YVk&>LE z1hZ~_dTDZ)mlyXYqxnoqeI-@TJ)Ky#B|mFw6pytkj9y;8ye_NNLbAavJg=B@{i(p> zP})rLvTOt{$OCg$0}MB7$hgxDIlp9Tnogt8*Vi{92niV!P-4RaqT37@ z^4g_}+!Um-R}y__;JX?D_$NyHQ9lhMHWheQ^0fww!A7DhXOVORdufG#rI=hgyY{0^ zC^DbT3OY0F_kZpGLTmE;eQqofUr#q@QaWMhrXUCA5OZk#3pm81bg&08$%p~Jzy#o| zB7l1mO$-5~2?7a(aVM+|Gz^%890LK~%ZzfB6mB=LDt?>@kW^DNAi)Qq)I^a71MIAn zj^8}NuV;K8$1$kz(gYAR5d#PfM*=trWT_wmuF4)=WCVryp#rc5G92>B(;P^DHJQ7T zta@5NGu|NJ-ar)`6^v1^WBSDY87!`FCD<6)9ykxc37Hvm4@4)5rf2dnMi_ic2GPX8 zhiXXGVVne11+EH@6aGS<&^M3w09XYy5WE^5g9pou>)a#b({B=3@|86C#yzkC4H{AY zSYsdtAi!%v7?9hLa5QR~z_{TUgXEX!@uA1Q95pKxNRU<4t7051(W2ml#w ziZBZsg#kDy8Iw{0#Rmcu`F*16(K1c*HHen=gc?LY0`Y!aO VRSFn@A}9?zs*(k-?Zl2q{|4`1eV70M literal 0 HcmV?d00001 diff --git a/client/src/App.tsx b/client/src/App.tsx new file mode 100644 index 0000000..cd2629a --- /dev/null +++ b/client/src/App.tsx @@ -0,0 +1,152 @@ +import { Switch, Route } from "wouter"; +import { queryClient } from "./lib/queryClient"; +import { QueryClientProvider } from "@tanstack/react-query"; +import { Toaster } from "@/components/ui/toaster"; +import { TooltipProvider } from "@/components/ui/tooltip"; +import { AuthProvider } from "@/hooks/use-auth"; +import { ErpProfileProvider } from "@/contexts/ErpProfileContext"; +import { ProtectedRoute } from "@/lib/protected-route"; +import { CommandPalette } from "@/components/CommandPalette"; +import { KnowledgeCollectorInit } from "@/components/KnowledgeCollectorInit"; +import NotFound from "@/pages/not-found"; +import AuthPage from "@/pages/auth-page"; +import Agent from "@/pages/Agent"; +import Admin from "@/pages/Admin"; +import Chat from "@/pages/Chat"; +import WhatsApp from "@/pages/WhatsApp"; +import Automations from "@/pages/Automations"; +import BiWorkspace from "@/pages/BiWorkspace"; +import ProcessCompass from "@/pages/ProcessCompass"; +import WorkspacePage from "@/pages/WorkspacePage"; +import AppViewer from "@/pages/AppViewer"; +import Crm from "@/pages/Crm"; +import Production from "@/pages/Production"; +import Support from "@/pages/Support"; +import Valuation from "@/pages/Valuation"; +import Canvas from "@/pages/Canvas"; +import IDE from "@/pages/IDE"; +import Scientist from "@/pages/Scientist"; +import Knowledge from "@/pages/Knowledge"; +import CentralApis from "@/pages/CentralApis"; +import ApiTesterPage from "@/pages/ApiTesterPage"; +import ApiHub from "@/pages/ApiHub"; +import Cockpit from "@/pages/Cockpit"; +import Fisco from "@/pages/Fisco"; +import People from "@/pages/People"; +import Contabil from "@/pages/Contabil"; +import ERP from "@/pages/ERP"; +import Financeiro from "@/pages/Financeiro"; +import Communities from "@/pages/Communities"; +import ArcadiaNext from "@/pages/ArcadiaNext"; +import QualityModule from "@/pages/QualityModule"; +import CommercialEnv from "@/pages/CommercialEnv"; +import FieldOperations from "@/pages/FieldOperations"; +import TechnicalModule from "@/pages/TechnicalModule"; +import SuppliersPortal from "@/pages/SuppliersPortal"; +import NPSSurvey from "@/pages/NPSSurvey"; +import EngineeringHub from "@/pages/EngineeringHub"; +import DocTypeBuilder from "@/pages/DocTypeBuilder"; +import PageBuilder from "@/pages/PageBuilder"; +import DevelopmentModule from "@/pages/DevelopmentModule"; +import ArcadiaRetail from "@/pages/ArcadiaRetail"; +import Plus from "@/pages/Plus"; +import SuperAdmin from "@/pages/SuperAdmin"; +import Marketplace from "@/pages/Marketplace"; +import LMS from "@/pages/LMS"; +import AppCenter from "@/pages/AppCenter"; +import XosCentral from "@/pages/XosCentral"; +import XosCrm from "@/pages/XosCrm"; +import XosInbox from "@/pages/XosInbox"; +import XosTickets from "@/pages/XosTickets"; +import Migration from "@/pages/Migration"; +import DevCenter from "@/pages/DevCenter"; +import XosCampaigns from "@/pages/XosCampaigns"; +import XosAutomations from "@/pages/XosAutomations"; +import XosSites from "@/pages/XosSites"; +import XosGovernance from "@/pages/XosGovernance"; +import XosPipeline from "@/pages/XosPipeline"; + + +function Router() { + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +} + +function App() { + return ( + + + + + + + + + + + + + ); +} + +export default App; diff --git a/client/src/components/ApiTester.tsx b/client/src/components/ApiTester.tsx new file mode 100644 index 0000000..3a1b709 --- /dev/null +++ b/client/src/components/ApiTester.tsx @@ -0,0 +1,651 @@ +import { useState } from "react"; +import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; +import { Button } from "@/components/ui/button"; +import { Input } from "@/components/ui/input"; +import { Textarea } from "@/components/ui/textarea"; +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; +import { Badge } from "@/components/ui/badge"; +import { ScrollArea } from "@/components/ui/scroll-area"; +import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter } from "@/components/ui/dialog"; +import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; +import { + Plus, + Play, + Save, + Trash2, + Edit, + Send, + Clock, + CheckCircle, + XCircle, + RefreshCw, + Copy, + Eye, + EyeOff, + PlugZap, + Code, + FileJson, +} from "lucide-react"; + +interface ApiConnection { + id: number; + name: string; + type: string; + base_url: string; + api_key?: string; + status: string; + last_sync_at?: string; +} + +interface ApiEndpoint { + id: number; + connection_id: number; + name: string; + method: string; + path: string; + description?: string; + headers?: Record; + body_template?: string; +} + +interface ApiLog { + id: number; + method: string; + url: string; + response_status: number; + latency_ms: number; + created_at: string; +} + +export default function ApiTester() { + const queryClient = useQueryClient(); + const [showNewConnectionDialog, setShowNewConnectionDialog] = useState(false); + const [showNewEndpointDialog, setShowNewEndpointDialog] = useState(false); + const [showExecuteDialog, setShowExecuteDialog] = useState(false); + const [selectedConnection, setSelectedConnection] = useState(null); + const [showApiKey, setShowApiKey] = useState(false); + + const [newConnection, setNewConnection] = useState({ + name: "", + type: "rest", + baseUrl: "", + apiKey: "", + apiSecret: "", + }); + + const [newEndpoint, setNewEndpoint] = useState({ + name: "", + method: "GET", + path: "", + description: "", + bodyTemplate: "", + }); + + const [executeRequest, setExecuteRequest] = useState({ + method: "GET", + url: "", + headers: "{}", + body: "", + }); + + const [executeResponse, setExecuteResponse] = useState<{ + status?: number; + body?: string; + latency?: number; + error?: string; + } | null>(null); + + const { data: connections = [] } = useQuery({ + queryKey: ["/api/api-central/connections"], + queryFn: async () => { + const res = await fetch("/api/api-central/connections", { credentials: "include" }); + if (!res.ok) return []; + return res.json(); + }, + }); + + const { data: endpoints = [] } = useQuery({ + queryKey: ["/api/api-central/endpoints", selectedConnection?.id], + queryFn: async () => { + if (!selectedConnection) return []; + const res = await fetch(`/api/api-central/connections/${selectedConnection.id}/endpoints`, { credentials: "include" }); + if (!res.ok) return []; + return res.json(); + }, + enabled: !!selectedConnection, + }); + + const { data: logs = [] } = useQuery({ + queryKey: ["/api/api-central/logs"], + queryFn: async () => { + const res = await fetch("/api/api-central/logs?limit=20", { credentials: "include" }); + if (!res.ok) return []; + return res.json(); + }, + }); + + const createConnectionMutation = useMutation({ + mutationFn: async (data: typeof newConnection) => { + const res = await fetch("/api/api-central/connections", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + name: data.name, + type: data.type, + baseUrl: data.baseUrl, + apiKey: data.apiKey, + apiSecret: data.apiSecret, + }), + credentials: "include", + }); + if (!res.ok) throw new Error("Falha ao criar conexão"); + return res.json(); + }, + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ["/api/api-central/connections"] }); + setShowNewConnectionDialog(false); + setNewConnection({ name: "", type: "rest", baseUrl: "", apiKey: "", apiSecret: "" }); + }, + }); + + const deleteConnectionMutation = useMutation({ + mutationFn: async (id: number) => { + const res = await fetch(`/api/api-central/connections/${id}`, { + method: "DELETE", + credentials: "include", + }); + if (!res.ok) throw new Error("Falha ao deletar"); + return res.json(); + }, + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ["/api/api-central/connections"] }); + setSelectedConnection(null); + }, + }); + + const createEndpointMutation = useMutation({ + mutationFn: async (data: typeof newEndpoint) => { + if (!selectedConnection) throw new Error("Selecione uma conexão"); + const res = await fetch(`/api/api-central/connections/${selectedConnection.id}/endpoints`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(data), + credentials: "include", + }); + if (!res.ok) throw new Error("Falha ao criar endpoint"); + return res.json(); + }, + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ["/api/api-central/endpoints", selectedConnection?.id] }); + setShowNewEndpointDialog(false); + setNewEndpoint({ name: "", method: "GET", path: "", description: "", bodyTemplate: "" }); + }, + }); + + const executeMutation = useMutation({ + mutationFn: async (data: typeof executeRequest) => { + const res = await fetch("/api/api-central/execute", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + connectionId: selectedConnection?.id, + method: data.method, + url: data.url, + headers: JSON.parse(data.headers || "{}"), + body: data.body ? JSON.parse(data.body) : undefined, + }), + credentials: "include", + }); + return res.json(); + }, + onSuccess: (result) => { + setExecuteResponse({ + status: result.status, + body: result.body, + latency: result.latency, + error: result.error, + }); + queryClient.invalidateQueries({ queryKey: ["/api/api-central/logs"] }); + }, + onError: (error: any) => { + setExecuteResponse({ error: error.message }); + }, + }); + + const testConnectionMutation = useMutation({ + mutationFn: async (id: number) => { + const res = await fetch(`/api/api-central/connections/${id}/test`, { + method: "POST", + credentials: "include", + }); + return res.json(); + }, + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ["/api/api-central/connections"] }); + }, + }); + + const getMethodColor = (method: string) => { + switch (method) { + case "GET": return "bg-green-500/20 text-green-400"; + case "POST": return "bg-blue-500/20 text-blue-400"; + case "PUT": return "bg-amber-500/20 text-amber-400"; + case "DELETE": return "bg-red-500/20 text-red-400"; + default: return "bg-slate-500/20 text-slate-400"; + } + }; + + const getStatusColor = (status: number) => { + if (status >= 200 && status < 300) return "bg-green-500/20 text-green-400"; + if (status >= 400) return "bg-red-500/20 text-red-400"; + return "bg-amber-500/20 text-amber-400"; + }; + + return ( +
+ {/* Sidebar - Conexões */} +
+
+
+

+ + Minhas Conexões +

+ +
+
+ + +
+ {connections.map((conn) => ( +
setSelectedConnection(conn)} + className={`p-3 rounded-lg cursor-pointer transition-colors ${ + selectedConnection?.id === conn.id + ? "bg-cyan-500/20 border border-cyan-500/30" + : "hover:bg-slate-800/50" + }`} + > +
+ {conn.name} +
+
+

{conn.base_url}

+
+ ))} + {connections.length === 0 && ( +
+ +

Nenhuma conexão

+

Clique em + para adicionar

+
+ )} +
+ +
+ + {/* Main Content */} +
+ {selectedConnection ? ( + +
+
+
+

{selectedConnection.name}

+

{selectedConnection.base_url}

+
+
+ + +
+
+ + Endpoints + Executar + Logs + +
+ + +
+

Endpoints Salvos

+ +
+
+ {endpoints.map((endpoint) => ( + + +
+ + {endpoint.method} + + {endpoint.path} + {endpoint.name && ( + - {endpoint.name} + )} +
+ +
+
+ ))} + {endpoints.length === 0 && ( +
+ +

Nenhum endpoint salvo

+

Adicione endpoints para reutilizar

+
+ )} +
+
+ + +
+
+
+ + setExecuteRequest({ ...executeRequest, url: e.target.value })} + placeholder="https://api.exemplo.com/endpoint" + className="flex-1 bg-slate-800 border-slate-700 text-white" + /> + +
+
+ +