@omnizap-system/omnizap 2.6.0 → 2.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (261) hide show
  1. package/.env.example +58 -13
  2. package/.github/workflows/ci.yml +5 -5
  3. package/.github/workflows/codeql.yml +1 -1
  4. package/.github/workflows/db-migration-check.yml +2 -2
  5. package/.github/workflows/dependency-review.yml +1 -1
  6. package/.github/workflows/deploy.yml +2 -2
  7. package/.github/workflows/release.yml +2 -2
  8. package/.github/workflows/security-attest-provenance.yml +2 -2
  9. package/.github/workflows/security-gitleaks.yml +13 -4
  10. package/.github/workflows/security-runner-hardening.yml +2 -2
  11. package/.github/workflows/security-scorecard.yml +1 -1
  12. package/.github/workflows/security-zap-baseline.yml +1 -1
  13. package/.github/workflows/security-zap-full-scan.yml +2 -1
  14. package/.github/workflows/security-zizmor.yml +1 -1
  15. package/.github/workflows/wiki-sync.yml +1 -1
  16. package/.gitleaksignore +9 -0
  17. package/CODE_OF_CONDUCT.md +2 -2
  18. package/GEMINI.md +64 -0
  19. package/README.md +52 -82
  20. package/SECURITY.md +1 -1
  21. package/app/config/index.js +2 -0
  22. package/app/configParts/adminIdentity.js +5 -5
  23. package/app/configParts/baileysConfig.js +230 -58
  24. package/app/configParts/groupUtils.js +5 -0
  25. package/app/configParts/messagePersistenceService.js +145 -4
  26. package/app/configParts/sessionConfig.js +157 -0
  27. package/app/connection/baileysCompatibility.test.js +1 -1
  28. package/app/connection/groupOwnerWriteStateResolver.js +109 -0
  29. package/app/connection/socketController.js +660 -158
  30. package/app/connection/socketController.multiSession.test.js +108 -0
  31. package/app/controllers/messageController.js +1 -1
  32. package/app/controllers/messagePipeline/commandMiddleware.js +12 -10
  33. package/app/controllers/messagePipeline/conversationMiddleware.js +2 -1
  34. package/app/controllers/messagePipeline/messagePipelineMiddlewares.test.js +104 -0
  35. package/app/controllers/messagePipeline/preProcessingMiddlewares.js +80 -2
  36. package/app/controllers/messageProcessingPipeline.js +93 -13
  37. package/app/controllers/messageProcessingPipeline.test.js +200 -0
  38. package/app/modules/adminModule/AGENT.md +1 -1
  39. package/app/modules/adminModule/commandConfig.json +3318 -1347
  40. package/app/modules/adminModule/groupCommandHandlers.js +858 -15
  41. package/app/modules/adminModule/groupCommandHandlers.test.js +378 -11
  42. package/app/modules/adminModule/groupWarningRepository.js +152 -0
  43. package/app/modules/aiModule/AGENT.md +47 -30
  44. package/app/modules/aiModule/aiConfigRuntime.js +1 -0
  45. package/app/modules/aiModule/catCommand.js +135 -27
  46. package/app/modules/aiModule/commandConfig.json +114 -28
  47. package/app/modules/analyticsModule/messageAnalysisEventRepository.js +54 -6
  48. package/app/modules/gameModule/AGENT.md +1 -1
  49. package/app/modules/gameModule/commandConfig.json +29 -0
  50. package/app/modules/menuModule/AGENT.md +1 -1
  51. package/app/modules/menuModule/commandConfig.json +45 -10
  52. package/app/modules/menuModule/menuCatalogService.js +190 -0
  53. package/app/modules/menuModule/menuCommandUsageRepository.js +109 -0
  54. package/app/modules/menuModule/menuDynamicService.js +511 -0
  55. package/app/modules/menuModule/menuDynamicService.test.js +141 -0
  56. package/app/modules/menuModule/menus.js +36 -5
  57. package/app/modules/playModule/AGENT.md +10 -5
  58. package/app/modules/playModule/commandConfig.json +140 -12
  59. package/app/modules/playModule/playCommand.js +1 -1417
  60. package/app/modules/playModule/playCommandConstants.js +80 -0
  61. package/app/modules/playModule/playCommandCore.js +361 -0
  62. package/app/modules/playModule/playCommandHandlers.js +41 -0
  63. package/app/modules/playModule/playCommandMediaClient.js +1872 -0
  64. package/app/modules/playModule/playConfigRuntime.js +245 -4
  65. package/app/modules/playModule/playModuleCriticalFlows.test.js +152 -0
  66. package/app/modules/quoteModule/AGENT.md +1 -1
  67. package/app/modules/quoteModule/commandConfig.json +29 -0
  68. package/app/modules/quoteModule/quoteCommand.js +3 -2
  69. package/app/modules/rpgPokemonModule/AGENT.md +1 -1
  70. package/app/modules/rpgPokemonModule/commandConfig.json +29 -0
  71. package/app/modules/rpgPokemonModule/rpgBattleCanvasRenderer.js +5 -4
  72. package/app/modules/rpgPokemonModule/rpgBattleService.test.js +2 -1
  73. package/app/modules/rpgPokemonModule/rpgPokemonDomain.js +2 -1
  74. package/app/modules/rpgPokemonModule/rpgPokemonService.js +38 -37
  75. package/app/modules/rpgPokemonModule/rpgProfileCanvasRenderer.js +4 -3
  76. package/app/modules/statsModule/AGENT.md +1 -1
  77. package/app/modules/statsModule/commandConfig.json +58 -0
  78. package/app/modules/statsModule/rankingCommon.js +5 -4
  79. package/app/modules/stickerModule/AGENT.md +1 -1
  80. package/app/modules/stickerModule/addStickerMetadata.js +4 -3
  81. package/app/modules/stickerModule/commandConfig.json +145 -0
  82. package/app/modules/stickerModule/stickerCommand.js +1 -1
  83. package/app/modules/stickerPackModule/AGENT.md +1 -1
  84. package/app/modules/stickerPackModule/autoPackCollectorService.js +5 -1
  85. package/app/modules/stickerPackModule/commandConfig.json +29 -0
  86. package/app/modules/stickerPackModule/semanticThemeClusterService.js +7 -6
  87. package/app/modules/stickerPackModule/stickerAutoPackByTagsRuntime.js +10 -9
  88. package/app/modules/stickerPackModule/stickerClassificationBackgroundRuntime.js +9 -8
  89. package/app/modules/stickerPackModule/stickerDomainEventConsumerRuntime.js +3 -2
  90. package/app/modules/stickerPackModule/stickerMarketplaceDriftService.js +2 -1
  91. package/app/modules/stickerPackModule/stickerPackCommandHandlers.js +80 -58
  92. package/app/modules/stickerPackModule/stickerPackMarketplaceService.js +2 -1
  93. package/app/modules/stickerPackModule/stickerPackRepository.js +2 -1
  94. package/app/modules/stickerPackModule/stickerPackScoreSnapshotRuntime.js +5 -4
  95. package/app/modules/stickerPackModule/stickerPackService.js +13 -6
  96. package/app/modules/stickerPackModule/stickerStorageService.js +3 -2
  97. package/app/modules/stickerPackModule/stickerWorkerPipelineRuntime.js +2 -1
  98. package/app/modules/systemMetricsModule/AGENT.md +1 -1
  99. package/app/modules/systemMetricsModule/commandConfig.json +29 -0
  100. package/app/modules/systemMetricsModule/pingCommand.js +6 -5
  101. package/app/modules/tiktokModule/AGENT.md +1 -1
  102. package/app/modules/tiktokModule/commandConfig.json +29 -0
  103. package/app/modules/tiktokModule/tiktokCommand.js +2 -1
  104. package/app/modules/userModule/AGENT.md +1 -1
  105. package/app/modules/userModule/commandConfig.json +29 -0
  106. package/app/modules/userModule/userCommand.js +72 -23
  107. package/app/modules/waifuPicsModule/AGENT.md +57 -27
  108. package/app/modules/waifuPicsModule/commandConfig.json +87 -0
  109. package/app/modules/waifuPicsModule/waifuPicsCommand.js +3 -2
  110. package/app/observability/metrics.js +136 -0
  111. package/app/services/ai/commandConfigEnrichmentService.js +229 -47
  112. package/app/services/ai/conversationRouterService.js +4 -3
  113. package/app/services/ai/geminiService.js +132 -7
  114. package/app/services/ai/geminiService.test.js +59 -2
  115. package/app/services/ai/globalModuleAiHelpService.js +3 -2
  116. package/app/services/ai/messageCommandExecutionService.js +2 -1
  117. package/app/services/ai/moduleAiHelpCoreService.js +45 -14
  118. package/app/services/ai/moduleToolExecutorService.js +3 -2
  119. package/app/services/ai/moduleToolRegistryService.js +2 -1
  120. package/app/services/ai/toolCandidateSelectorService.js +6 -5
  121. package/app/services/auth/googleWebLinkService.js +3 -2
  122. package/app/services/auth/whatsappLoginLinkService.js +3 -2
  123. package/app/services/external/pokeApiService.js +4 -3
  124. package/app/services/group/groupMetadataService.js +24 -1
  125. package/app/services/infra/dbWriteQueue.js +57 -26
  126. package/app/services/infra/featureFlagService.js +2 -1
  127. package/app/services/messaging/captchaService.js +3 -2
  128. package/app/services/messaging/newsBroadcastService.js +846 -29
  129. package/app/services/multiSession/assignmentBalancerService.js +457 -0
  130. package/app/services/multiSession/groupOwnershipRepository.js +381 -0
  131. package/app/services/multiSession/groupOwnershipService.js +890 -0
  132. package/app/services/multiSession/groupOwnershipService.test.js +309 -0
  133. package/app/services/multiSession/sessionRegistryService.js +293 -0
  134. package/app/services/sticker/stickerFocusService.js +11 -10
  135. package/app/store/aiPromptStore.js +36 -19
  136. package/app/store/conversationSessionStore.js +7 -6
  137. package/app/store/groupConfigStore.js +41 -5
  138. package/app/store/premiumUserStore.js +21 -7
  139. package/app/utils/antiLink/antiLinkModule.js +352 -16
  140. package/app/workers/aiHelperContinuousLearningWorker.js +512 -0
  141. package/app/workers/aiLearningWorker.js +6 -5
  142. package/app/workers/commandConfigEnrichmentWorker.js +4 -3
  143. package/database/index.js +14 -8
  144. package/database/migrations/20260307_d0_hardening_down.sql +1 -1
  145. package/database/migrations/20260314_d7_canonical_sender_down.sql +1 -1
  146. package/database/migrations/20260406_d30_security_analytics_down.sql +1 -1
  147. package/database/migrations/20260411_d35_group_community_metadata_down.sql +59 -0
  148. package/database/migrations/20260411_d35_group_community_metadata_up.sql +62 -0
  149. package/database/migrations/20260412_d36_system_config_tables_down.sql +32 -0
  150. package/database/migrations/20260412_d36_system_config_tables_up.sql +66 -0
  151. package/database/migrations/20260413_d37_group_user_warnings_down.sql +11 -0
  152. package/database/migrations/20260413_d37_group_user_warnings_up.sql +24 -0
  153. package/database/migrations/20260414_d38_multi_session_foundation_down.sql +72 -0
  154. package/database/migrations/20260414_d38_multi_session_foundation_up.sql +125 -0
  155. package/database/migrations/20260414_d39_multi_session_cutover_down.sql +103 -0
  156. package/database/migrations/20260414_d39_multi_session_cutover_up.sql +83 -0
  157. package/database/schema.sql +102 -1
  158. package/docker-compose.yml +4 -1
  159. package/docs/compliance/acceptable-use-policy-2026-03-07.md +1 -1
  160. package/docs/compliance/dpa-b2b-standard-2026-03-07.md +1 -1
  161. package/docs/compliance/privacy-policy-2026-03-07.md +4 -4
  162. package/docs/security/dsar-lgpd-runbook-2026-03-07.md +1 -1
  163. package/docs/security/incident-response-lgpd-anpd-runbook-2026-03-07.md +1 -1
  164. package/docs/security/network-hardening-runbook-2026-03-07.md +53 -0
  165. package/docs/security/omnizap-static-security-headers.conf +25 -0
  166. package/docs/wiki/Home.md +1 -1
  167. package/ecosystem.prod.config.cjs +32 -12
  168. package/index.js +57 -23
  169. package/observability/alert-rules.yml +20 -0
  170. package/observability/grafana/dashboards/omnizap-system-admin.json +229 -0
  171. package/observability/mysql-setup.sql +4 -4
  172. package/observability/system-admin-observability.md +26 -0
  173. package/package.json +20 -6
  174. package/public/apple-touch-icon.png +0 -0
  175. package/public/comandos/commands-catalog.json +2853 -3326
  176. package/public/favicon-16x16.png +0 -0
  177. package/public/favicon-32x32.png +0 -0
  178. package/public/favicon.ico +0 -0
  179. package/public/js/apps/apiDocsApp.js +3 -2
  180. package/public/js/apps/commandsReactApp.js +280 -99
  181. package/public/js/apps/createPackApp.js +11 -10
  182. package/public/js/apps/homeReactApp.js +181 -130
  183. package/public/js/apps/loginReactApp.js +1 -1
  184. package/public/js/apps/stickersApp.js +263 -110
  185. package/public/js/apps/termsReactApp.js +73 -24
  186. package/public/js/apps/userApp.js +4 -3
  187. package/public/js/apps/userPasswordResetReactApp.js +406 -0
  188. package/public/js/apps/userReactApp.js +355 -280
  189. package/public/js/apps/userSystemAdmReactApp.js +1506 -0
  190. package/public/pages/api-docs.html +1 -1
  191. package/public/pages/aup.html +2 -2
  192. package/public/pages/dpa.html +3 -3
  193. package/public/pages/licenca.html +4 -4
  194. package/public/pages/login.html +1 -1
  195. package/public/pages/notice-and-takedown.html +2 -2
  196. package/public/pages/politica-de-privacidade.html +6 -6
  197. package/public/pages/seo-bot-whatsapp-para-grupo.html +3 -3
  198. package/public/pages/seo-bot-whatsapp-sem-programar.html +3 -3
  199. package/public/pages/seo-como-automatizar-avisos-no-whatsapp.html +3 -3
  200. package/public/pages/seo-como-criar-comandos-whatsapp.html +3 -3
  201. package/public/pages/seo-como-evitar-spam-no-whatsapp.html +3 -3
  202. package/public/pages/seo-como-moderar-grupo-whatsapp.html +3 -3
  203. package/public/pages/seo-como-organizar-comunidade-whatsapp.html +3 -3
  204. package/public/pages/seo-melhor-bot-whatsapp-para-grupos.html +3 -3
  205. package/public/pages/stickers-admin.html +1 -1
  206. package/public/pages/stickers-create.html +1 -1
  207. package/public/pages/stickers.html +6 -6
  208. package/public/pages/suboperadores.html +2 -2
  209. package/public/pages/termos-de-uso-texto-integral.html +6 -6
  210. package/public/pages/termos-de-uso.html +3 -3
  211. package/public/pages/user-password-reset.html +4 -5
  212. package/public/pages/user-systemadm.html +9 -463
  213. package/public/pages/user.html +2 -2
  214. package/scripts/clear-whatsapp-session.sh +123 -0
  215. package/scripts/core-ai-mode.mjs +163 -0
  216. package/scripts/deploy.sh +11 -1
  217. package/scripts/email-broadcast-terms-update.mjs +2 -1
  218. package/scripts/enrich-command-config-ux-openai.mjs +492 -0
  219. package/scripts/generate-commands-catalog.mjs +166 -2
  220. package/scripts/generate-module-agents.mjs +2 -1
  221. package/scripts/generate-seo-satellite-pages.mjs +5 -4
  222. package/scripts/github-deploy-notify.mjs +2 -1
  223. package/scripts/github-release-notify.mjs +25 -10
  224. package/scripts/new-whatsapp-session.sh +317 -0
  225. package/scripts/release.sh +2 -19
  226. package/scripts/security-smoketest.mjs +6 -5
  227. package/scripts/security-web-surface-check.mjs +218 -0
  228. package/scripts/sticker-catalog-loadtest.mjs +5 -4
  229. package/server/auth/googleWebAuth/googleWebAuthService.js +8 -7
  230. package/server/auth/jwt/webJwtService.js +1 -1
  231. package/server/auth/stickerCatalogAuthContext.js +2 -1
  232. package/server/auth/termsAcceptance/termsAcceptanceHandler.js +2 -1
  233. package/server/auth/userPassword/userPasswordAuthService.js +2 -1
  234. package/server/auth/userPassword/userPasswordRecoveryService.js +4 -3
  235. package/server/auth/webAccount/webAccountHandlers.js +9 -10
  236. package/server/controllers/admin/adminPanelHandlers.js +267 -16
  237. package/server/controllers/admin/systemAdminController.js +267 -0
  238. package/server/controllers/seo/stickerCatalogSeoContext.js +10 -9
  239. package/server/controllers/sticker/nonCatalogHandlers.js +2 -1
  240. package/server/controllers/sticker/stickerCatalogController.js +23 -36
  241. package/server/controllers/system/contactController.js +9 -17
  242. package/server/controllers/system/githubController.js +3 -2
  243. package/server/controllers/system/stickerCatalogSystemContext.js +41 -19
  244. package/server/controllers/system/systemController.js +254 -1
  245. package/server/controllers/system/systemMetricsController.js +2 -1
  246. package/server/controllers/userController.js +6 -0
  247. package/server/email/emailTemplateService.js +5 -3
  248. package/server/http/httpServer.js +11 -6
  249. package/server/middleware/rateLimit.js +2 -1
  250. package/server/middleware/securityHeaders.js +20 -1
  251. package/server/routes/admin/systemAdminRouter.js +6 -0
  252. package/server/routes/indexRouter.js +30 -6
  253. package/server/routes/observability/grafanaProxyRouter.js +254 -0
  254. package/server/routes/static/staticPageRouter.js +27 -1
  255. package/server/utils/publicContact.js +31 -0
  256. package/utils/time/timeModule.js +135 -0
  257. package/utils/time/timeModule.test.js +65 -0
  258. package/utils/whatsapp/contactEnv.js +39 -0
  259. package/vite.config.mjs +7 -1
  260. package/public/assets/images/brand-icon-192.png +0 -0
  261. package/scripts/sync-readme-snapshot.mjs +0 -133
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="utf-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1" />
6
- <title>OmniZap System | System Admin</title>
6
+ <title>Omnizap | System Admin</title>
7
7
  <meta name="description" content="Painel System Admin do OmniZap com moderação, saúde, auditoria e operações." />
8
8
  <meta name="robots" content="noindex, nofollow" />
9
9
  <meta name="theme-color" content="#0b1220" />
@@ -41,468 +41,14 @@
41
41
  </style>
42
42
  </head>
43
43
  <body>
44
- <main id="user-app-root" class="admin-shell" data-api-base-path="/api" data-login-path="/login" data-stickers-path="/stickers">
45
- <aside class="sidebar">
46
- <a href="/" class="brand">
47
- <img src="https://iili.io/FC3FABe.jpg" alt="OmniZap" loading="lazy" decoding="async" />
48
- <span>OmniZap System</span>
49
- </a>
50
-
51
- <div class="sidebar-summary">
52
- <p>Painel corporativo de operações, segurança e moderação para bots e stickers.</p>
53
- </div>
54
-
55
- <ul class="nav-list" id="user-admin-nav">
56
- <li>
57
- <a class="nav-link" href="#overview">Dashboard <span class="nav-kbd">1</span></a>
58
- </li>
59
- <li>
60
- <a class="nav-link" href="#moderacao">Moderação <span class="nav-kbd">2</span></a>
61
- </li>
62
- <li>
63
- <a class="nav-link" href="#usuarios">Usuários <span class="nav-kbd">3</span></a>
64
- </li>
65
- <li>
66
- <a class="nav-link" href="#sessoes">Sessões <span class="nav-kbd">4</span></a>
67
- </li>
68
- <li>
69
- <a class="nav-link" href="#saude">Saúde <span class="nav-kbd">5</span></a>
70
- </li>
71
- <li>
72
- <a class="nav-link" href="#auditoria">Auditoria <span class="nav-kbd">6</span></a>
73
- </li>
74
- <li>
75
- <a class="nav-link" href="#alertas">Alertas <span class="nav-kbd">7</span></a>
76
- </li>
77
- <li>
78
- <a class="nav-link" href="#exportacao">Exportação <span class="nav-kbd">8</span></a>
79
- </li>
80
- <li>
81
- <a class="nav-link" href="#configuracoes">Configurações <span class="nav-kbd">9</span></a>
82
- </li>
83
- </ul>
84
-
85
- <div class="sidebar-footer">
86
- <a class="btn" href="/">Home</a>
87
- <a class="btn" href="/user/">Minha Conta</a>
88
- <a id="user-manage-head-link" class="btn" href="/stickers/perfil">Gerenciar Stickers</a>
89
- </div>
90
- </aside>
91
-
92
- <div class="workspace">
93
- <header class="topbar">
94
- <div class="topbar-left">
95
- <h2 class="topbar-title">System Admin</h2>
96
- <div class="topbar-meta">
97
- <span id="user-env-badge" class="chip env">Production</span>
98
- <span id="user-global-status" class="chip status"><span class="top-status-dot"></span><span id="user-global-status-text">Online</span></span>
99
- </div>
100
- </div>
101
-
102
- <div class="topbar-right">
103
- <button id="user-compact-toggle" type="button" class="btn ghost" aria-label="Alternar modo compacto">Modo compacto</button>
104
- <div class="topbar-admin">
105
- <img id="user-top-avatar" src="https://iili.io/FC3FABe.jpg" alt="Admin" />
106
- <span id="user-top-admin-name">Admin</span>
107
- </div>
108
- </div>
109
- </header>
110
-
111
- <div class="viewport">
112
- <section id="user-admin-panel" class="section admin-panel" hidden>
113
- <p id="user-admin-status" class="admin-note" hidden></p>
114
-
115
- <p id="user-admin-error" class="admin-error" hidden></p>
116
-
117
- <form id="user-admin-unlock-form" class="admin-form" hidden>
118
- <label for="user-admin-password" class="admin-label">Senha do painel admin</label>
119
- <div class="admin-form-row">
120
- <input id="user-admin-password" class="admin-input" type="password" autocomplete="current-password" placeholder="Digite sua senha" />
121
- <button id="user-admin-unlock-btn" type="submit" class="btn">Desbloquear</button>
122
- </div>
123
- </form>
124
-
125
- <div id="user-admin-overview" hidden>
126
- <div class="admin-toolbar">
127
- <div class="admin-toolbar-meta">
128
- <p class="admin-last-updated">Última atualização: <span id="user-admin-last-updated">n/d</span></p>
129
- <div id="user-admin-carousel-nav" class="admin-carousel-nav" aria-label="Navegação do carrossel administrativo">
130
- <button id="user-admin-carousel-prev" type="button" class="admin-carousel-btn" aria-label="Slide anterior">Anterior</button>
131
- <span id="user-admin-carousel-counter" class="admin-carousel-counter">1 / 1</span>
132
- <button id="user-admin-carousel-next" type="button" class="admin-carousel-btn" aria-label="Próximo slide">Próximo</button>
133
- </div>
134
- </div>
135
-
136
- <form id="user-admin-search-form" class="admin-inline-form">
137
- <input id="user-admin-search-input" class="admin-input" type="text" placeholder="Buscar por usuário, grupo, pack ou sessão" />
138
- <button id="user-admin-search-btn" type="submit" class="btn">Buscar</button>
139
- </form>
140
-
141
- <div class="security-strip">
142
- <span id="user-security-session" class="security-pill">Sessão segura</span>
143
- <span id="user-security-encryption" class="security-pill">Criptografia ativa</span>
144
- <span id="user-security-ip" class="security-pill">IP n/d</span>
145
- <span id="user-security-2fa" class="security-pill">2FA n/d</span>
146
- </div>
147
-
148
- <div class="risk-strip">
149
- <span id="user-risk-cpu" class="risk-pill">CPU normal</span>
150
- <span id="user-risk-spam" class="risk-pill">Spam sob controle</span>
151
- <span id="user-risk-bans" class="risk-pill">Bans estáveis</span>
152
- <span id="user-risk-errors" class="risk-pill">Erros baixos</span>
153
- </div>
154
-
155
- <p id="user-admin-ops-status" class="admin-item-meta">Ações operacionais disponíveis.</p>
156
- </div>
157
-
158
- <div id="user-admin-layout" class="admin-layout admin-layout--enterprise is-carousel is-subpage">
159
- <section id="overview" class="section section-kpis span-12" data-admin-page="overview">
160
- <div class="section-head">
161
- <div>
162
- <h4 class="panel-title">Dashboard Estratégico</h4>
163
- <p class="panel-subtitle">Métricas segmentadas por Operação, Sistema, Segurança e Usuários.</p>
164
- </div>
165
- </div>
166
-
167
- <div class="admin-grid">
168
- <article class="metric-card">
169
- <p class="admin-metric-label">Bots online</p>
170
- <p id="user-admin-bots-online" class="admin-metric-value">0</p>
171
- <span class="trend up">Operação</span>
172
- <p id="user-admin-bots-online-context" class="metric-context">vs ontem: n/d</p>
173
- </article>
174
- <article class="metric-card">
175
- <p class="admin-metric-label">Mensagens hoje</p>
176
- <p id="user-admin-messages-today" class="admin-metric-value">0</p>
177
- <span class="trend up">Operação</span>
178
- <p id="user-admin-messages-today-context" class="metric-context">vs ontem: n/d</p>
179
- </article>
180
- <article class="metric-card system">
181
- <p class="admin-metric-label">Uptime</p>
182
- <p id="user-admin-uptime" class="admin-metric-value">n/d</p>
183
- <span class="trend up">Sistema</span>
184
- <p id="user-admin-uptime-context" class="metric-context">janela: processo atual</p>
185
- </article>
186
- <article class="metric-card system">
187
- <p class="admin-metric-label">Erros 5xx</p>
188
- <p id="user-admin-errors-5xx" class="admin-metric-value">0</p>
189
- <span class="trend warn">Sistema</span>
190
- <p id="user-admin-errors-5xx-context" class="metric-context">vs ontem: n/d</p>
191
- </article>
192
- <article class="metric-card">
193
- <p class="admin-metric-label">Packs (total)</p>
194
- <p id="user-admin-total-packs" class="admin-metric-value">0</p>
195
- <span class="trend up">Produto</span>
196
- <p id="user-admin-total-packs-context" class="metric-context">delta 24h: n/d</p>
197
- </article>
198
- <article class="metric-card">
199
- <p class="admin-metric-label">Stickers (total)</p>
200
- <p id="user-admin-total-stickers" class="admin-metric-value">0</p>
201
- <span class="trend up">Produto</span>
202
- <p id="user-admin-total-stickers-context" class="metric-context">delta 24h: n/d</p>
203
- </article>
204
- <article class="metric-card security warning">
205
- <p class="admin-metric-label">Spam bloqueado</p>
206
- <p id="user-admin-spam-blocked" class="admin-metric-value">0</p>
207
- <span class="trend warn">Segurança</span>
208
- <p id="user-admin-spam-blocked-context" class="metric-context">vs ontem: n/d</p>
209
- </article>
210
- <article class="metric-card security critical">
211
- <p class="admin-metric-label">Bans ativos</p>
212
- <p id="user-admin-active-bans" class="admin-metric-value">0</p>
213
- <span class="trend down">Segurança</span>
214
- <p id="user-admin-active-bans-context" class="metric-context">delta 24h: n/d</p>
215
- </article>
216
- <article class="metric-card users">
217
- <p class="admin-metric-label">Usuários Google</p>
218
- <p id="user-admin-known-users" class="admin-metric-value">0</p>
219
- <span class="trend up">Usuários</span>
220
- <p id="user-admin-known-users-context" class="metric-context">delta 7d: n/d</p>
221
- </article>
222
- <article class="metric-card users">
223
- <p class="admin-metric-label">Sessões Google</p>
224
- <p id="user-admin-active-sessions" class="admin-metric-value">0</p>
225
- <span class="trend warn">Usuários</span>
226
- <p id="user-admin-active-sessions-context" class="metric-context">agora: n/d</p>
227
- </article>
228
- <article class="metric-card users">
229
- <p class="admin-metric-label">Visitas 24h</p>
230
- <p id="user-admin-visits-24h" class="admin-metric-value">0</p>
231
- <span class="trend up">Usuários</span>
232
- <p id="user-admin-visits-24h-context" class="metric-context">janela: 24h</p>
233
- </article>
234
- <article class="metric-card users">
235
- <p class="admin-metric-label">Visitas 7d</p>
236
- <p id="user-admin-visits-7d" class="admin-metric-value">0</p>
237
- <span class="trend up">Usuários</span>
238
- <p id="user-admin-visits-7d-context" class="metric-context">janela: 7 dias</p>
239
- </article>
240
- <article class="metric-card users">
241
- <p class="admin-metric-label">Visitantes 7d</p>
242
- <p id="user-admin-unique-visitors-7d" class="admin-metric-value">0</p>
243
- <span class="trend up">Usuários</span>
244
- <p id="user-admin-unique-visitors-7d-context" class="metric-context">janela: 7 dias</p>
245
- </article>
246
- </div>
247
- </section>
248
-
249
- <section id="saude" class="section section-health span-12" data-admin-page="saude">
250
- <div class="section-head">
251
- <div>
252
- <h4 class="panel-title">Saúde do Sistema</h4>
253
- <p class="panel-subtitle">Visão DevOps com barras de utilização e status de banco.</p>
254
- </div>
255
- </div>
256
-
257
- <div class="health-grid">
258
- <article class="health-card">
259
- <div class="health-head">
260
- <p class="admin-metric-label">CPU</p>
261
- <p id="user-admin-health-cpu" class="admin-metric-value">n/d</p>
262
- </div>
263
- <div class="health-meter"><span id="user-admin-health-cpu-bar"></span></div>
264
- <p id="user-admin-health-cpu-meta" class="health-meta">Limite recomendado: 88%</p>
265
- </article>
266
- <article class="health-card">
267
- <div class="health-head">
268
- <p class="admin-metric-label">RAM</p>
269
- <p id="user-admin-health-ram" class="admin-metric-value">n/d</p>
270
- </div>
271
- <div class="health-meter"><span id="user-admin-health-ram-bar"></span></div>
272
- <p id="user-admin-health-ram-meta" class="health-meta">Limite recomendado: 90%</p>
273
- </article>
274
- <article class="health-card">
275
- <div class="health-head">
276
- <p class="admin-metric-label">Latência p95</p>
277
- <p id="user-admin-health-latency" class="admin-metric-value">n/d</p>
278
- </div>
279
- <div class="health-meter">
280
- <span id="user-admin-health-latency-bar"></span>
281
- </div>
282
- <p id="user-admin-health-latency-meta" class="health-meta">Alerta acima de 300ms</p>
283
- </article>
284
- <article class="health-card">
285
- <div class="health-head">
286
- <p class="admin-metric-label">Fila pendente</p>
287
- <p id="user-admin-health-queue" class="admin-metric-value">n/d</p>
288
- </div>
289
- <div class="health-meter"><span id="user-admin-health-queue-bar"></span></div>
290
- <p id="user-admin-health-queue-meta" class="health-meta">Ideal: abaixo de 120 jobs</p>
291
- </article>
292
- <article class="health-card">
293
- <div class="health-head">
294
- <p class="admin-metric-label">Status DB</p>
295
- <span id="user-admin-health-db-badge" class="db-badge">Status</span>
296
- </div>
297
- <p id="user-admin-health-db" class="admin-metric-value">n/d</p>
298
- <p id="user-admin-health-db-meta" class="health-meta">SLA alvo: 99.95%</p>
299
- </article>
300
- </div>
301
- </section>
302
-
303
- <section id="moderacao" class="section section-security span-6" data-admin-page="moderacao">
304
- <div class="section-head">
305
- <div>
306
- <h4 class="panel-title">Moderação</h4>
307
- <p class="panel-subtitle">Timeline de incidentes e ações de contenção.</p>
308
- </div>
309
- </div>
310
-
311
- <div class="filters">
312
- <div class="filter-field">
313
- <label for="user-admin-moderation-filter-severity">Severidade</label>
314
- <select id="user-admin-moderation-filter-severity" class="admin-input">
315
- <option value="all">Todas</option>
316
- <option value="critical">Critical</option>
317
- <option value="high">High</option>
318
- <option value="medium">Medium</option>
319
- <option value="low">Low</option>
320
- </select>
321
- </div>
322
- <div class="filter-field">
323
- <label for="user-admin-moderation-filter-type">Tipo</label>
324
- <select id="user-admin-moderation-filter-type" class="admin-input">
325
- <option value="all">Todos</option>
326
- <option value="ban">Ban</option>
327
- <option value="spam">Spam</option>
328
- <option value="session">Sessão</option>
329
- </select>
330
- </div>
331
- </div>
332
-
333
- <div id="user-admin-moderation-list" class="admin-list timeline"></div>
334
- <div id="user-admin-moderation-pagination" class="list-pagination" hidden>
335
- <p id="user-admin-moderation-page-meta" class="list-pagination-meta"></p>
336
- <div class="list-pagination-controls">
337
- <button id="user-admin-moderation-prev" type="button" class="admin-mini-btn">Anterior</button>
338
- <span id="user-admin-moderation-page-counter" class="list-pagination-counter">1 / 1</span>
339
- <button id="user-admin-moderation-next" type="button" class="admin-mini-btn">Próxima</button>
340
- </div>
341
- </div>
342
- </section>
343
-
344
- <section id="auditoria" class="section section-security span-6" data-admin-page="auditoria">
345
- <div class="section-head">
346
- <div>
347
- <h4 class="panel-title">Auditoria</h4>
348
- <p class="panel-subtitle">Rastro de alterações administrativas e eventos sensíveis.</p>
349
- </div>
350
- </div>
351
-
352
- <div class="filters">
353
- <div class="filter-field">
354
- <label for="user-admin-audit-filter-status">Status</label>
355
- <select id="user-admin-audit-filter-status" class="admin-input">
356
- <option value="all">Todos</option>
357
- <option value="success">Success</option>
358
- <option value="error">Error</option>
359
- </select>
360
- </div>
361
- <div class="filter-field">
362
- <label for="user-admin-audit-search">Busca</label>
363
- <input id="user-admin-audit-search" class="admin-input" type="text" placeholder="Filtrar por ação, alvo ou admin" />
364
- </div>
365
- </div>
366
-
367
- <div id="user-admin-audit-list" class="admin-list timeline"></div>
368
- <div id="user-admin-audit-pagination" class="list-pagination" hidden>
369
- <p id="user-admin-audit-page-meta" class="list-pagination-meta"></p>
370
- <div class="list-pagination-controls">
371
- <button id="user-admin-audit-prev" type="button" class="admin-mini-btn">Anterior</button>
372
- <span id="user-admin-audit-page-counter" class="list-pagination-counter">1 / 1</span>
373
- <button id="user-admin-audit-next" type="button" class="admin-mini-btn">Próxima</button>
374
- </div>
375
- </div>
376
- </section>
377
-
378
- <section id="usuarios" class="section section-users span-6" data-admin-page="usuarios">
379
- <div class="section-head">
380
- <div>
381
- <h4 class="panel-title">Usuários</h4>
382
- <p class="panel-subtitle">Contas mapeadas e ações de segurança.</p>
383
- </div>
384
- </div>
385
- <div id="user-admin-users-list" class="admin-list"></div>
386
- <div id="user-admin-users-pagination" class="list-pagination" hidden>
387
- <p id="user-admin-users-page-meta" class="list-pagination-meta"></p>
388
- <div class="list-pagination-controls">
389
- <button id="user-admin-users-prev" type="button" class="admin-mini-btn">Anterior</button>
390
- <span id="user-admin-users-page-counter" class="list-pagination-counter">1 / 1</span>
391
- <button id="user-admin-users-next" type="button" class="admin-mini-btn">Próxima</button>
392
- </div>
393
- </div>
394
- </section>
395
-
396
- <section id="sessoes" class="section section-users span-6" data-admin-page="sessoes">
397
- <div class="section-head">
398
- <div>
399
- <h4 class="panel-title">Sessões Ativas</h4>
400
- <p class="panel-subtitle">Sessões autenticadas com opção de encerramento forçado.</p>
401
- </div>
402
- </div>
403
- <div id="user-admin-sessions-list" class="admin-list"></div>
404
- <div id="user-admin-sessions-pagination" class="list-pagination" hidden>
405
- <p id="user-admin-sessions-page-meta" class="list-pagination-meta"></p>
406
- <div class="list-pagination-controls">
407
- <button id="user-admin-sessions-prev" type="button" class="admin-mini-btn">Anterior</button>
408
- <span id="user-admin-sessions-page-counter" class="list-pagination-counter">1 / 1</span>
409
- <button id="user-admin-sessions-next" type="button" class="admin-mini-btn">Próxima</button>
410
- </div>
411
- </div>
412
- </section>
413
-
414
- <section id="alertas" class="section section-security span-6" data-admin-page="alertas">
415
- <div class="section-head">
416
- <div>
417
- <h4 class="panel-title">Alertas</h4>
418
- <p class="panel-subtitle">Incidentes monitorados e criticidade operacional.</p>
419
- </div>
420
- </div>
421
- <div id="user-admin-alerts-list" class="admin-list timeline"></div>
422
- <div id="user-admin-alerts-pagination" class="list-pagination" hidden>
423
- <p id="user-admin-alerts-page-meta" class="list-pagination-meta"></p>
424
- <div class="list-pagination-controls">
425
- <button id="user-admin-alerts-prev" type="button" class="admin-mini-btn">Anterior</button>
426
- <span id="user-admin-alerts-page-counter" class="list-pagination-counter">1 / 1</span>
427
- <button id="user-admin-alerts-next" type="button" class="admin-mini-btn">Próxima</button>
428
- </div>
429
- </div>
430
- </section>
431
-
432
- <section id="configuracoes" class="section section-governance span-6" data-admin-page="configuracoes">
433
- <div class="section-head">
434
- <div>
435
- <h4 class="panel-title">Controle de Recursos</h4>
436
- <p class="panel-subtitle">Feature flags e ajustes de rollout.</p>
437
- </div>
438
- </div>
439
- <div id="user-admin-flags-list" class="admin-list"></div>
440
- </section>
441
-
442
- <section class="section section-security span-6" data-admin-page="configuracoes">
443
- <div class="section-head">
444
- <div>
445
- <h4 class="panel-title">Bans</h4>
446
- <p class="panel-subtitle">Estado das contas bloqueadas.</p>
447
- </div>
448
- </div>
449
- <div id="user-admin-bans-list" class="admin-list"></div>
450
- </section>
451
-
452
- <section class="section section-governance span-6" data-admin-page="usuarios">
453
- <div class="section-head">
454
- <div>
455
- <h4 class="panel-title">Busca Global</h4>
456
- <p class="panel-subtitle">Resultados consolidados por usuário, grupo, pack e sessão.</p>
457
- </div>
458
- </div>
459
- <div id="user-admin-search-results" class="admin-list"></div>
460
- </section>
461
-
462
- <section class="section section-governance span-12" data-admin-page="configuracoes">
463
- <div class="section-head">
464
- <div>
465
- <h4 class="panel-title">Atalhos Operacionais</h4>
466
- <p class="panel-subtitle">Ações de manutenção com confirmação para operações críticas.</p>
467
- </div>
468
- </div>
469
- <div class="admin-item-actions">
470
- <button type="button" class="admin-mini-btn" data-admin-op-action="restart_worker">Reiniciar worker</button>
471
- <button type="button" class="admin-mini-btn" data-admin-op-action="clear_cache">Limpar cache</button>
472
- <button type="button" class="admin-mini-btn" data-admin-op-action="reprocess_jobs">Reprocessar jobs</button>
473
- </div>
474
- </section>
475
-
476
- <section id="exportacao" class="section section-governance span-12" data-admin-page="exportacao">
477
- <div class="section-head">
478
- <div>
479
- <h4 class="panel-title">Exportação</h4>
480
- <p class="panel-subtitle">Exportar métricas e eventos para auditoria externa.</p>
481
- </div>
482
- </div>
483
- <div class="admin-item-actions">
484
- <button id="user-admin-export-metrics-json" type="button" class="admin-mini-btn">Métricas JSON</button>
485
- <button id="user-admin-export-metrics-csv" type="button" class="admin-mini-btn">Métricas CSV</button>
486
- <button id="user-admin-export-events-json" type="button" class="admin-mini-btn">Eventos JSON</button>
487
- <button id="user-admin-export-events-csv" type="button" class="admin-mini-btn">Eventos CSV</button>
488
- </div>
489
- </section>
490
- </div>
491
-
492
- <div class="admin-actions">
493
- <button id="user-admin-refresh-btn" type="button" class="btn">Atualizar dados admin</button>
494
- <button id="user-admin-logout-btn" type="button" class="btn">Sair do admin</button>
495
- </div>
496
- </div>
497
- </section>
498
-
499
- <p class="footer">OmniZap System · <span id="user-current-year"></span></p>
500
- </div>
501
- </div>
502
- </main>
503
-
504
- <div id="user-admin-toast-stack" class="toast-stack" aria-live="polite" aria-atomic="false"></div>
505
-
44
+ <div id="user-systemadm-react-root" data-api-base-path="/api" data-login-path="/login" data-stickers-path="/stickers"></div>
45
+ <noscript>
46
+ <main style="max-width: 680px; margin: 100px auto; text-align: center; padding: 20px">
47
+ <h1>System Admin</h1>
48
+ <p>Ative o JavaScript para carregar o painel administrativo.</p>
49
+ <a href="/user/" style="color: #22c55e">Voltar para Minha Conta</a>
50
+ </main>
51
+ </noscript>
506
52
  <script type="module" src="/assets/js/user-systemadm.bundle.js"></script>
507
53
  </body>
508
54
  </html>
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="utf-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1" />
6
- <title>Minha Conta | OmniZap System</title>
6
+ <title>Minha Conta | Omnizap</title>
7
7
  <meta name="robots" content="noindex, nofollow" />
8
8
  <meta name="theme-color" content="#020617" />
9
9
  <link rel="canonical" href="https://omnizap.shop/user/" />
@@ -26,7 +26,7 @@
26
26
  </style>
27
27
  </head>
28
28
  <body>
29
- <div id="user-react-root" data-api-base-path="/api" data-login-path="/login"></div>
29
+ <div id="user-react-root" data-api-base-path="/api" data-login-path="/login" data-panel-path="/user" data-password-reset-web-path="/user/password-reset" data-support-whatsapp-number="" data-support-whatsapp-url=""></div>
30
30
  <noscript>
31
31
  <main style="max-width: 600px; margin: 100px auto; text-align: center; padding: 20px">
32
32
  <h1>Dashboard do Usuário</h1>
@@ -0,0 +1,123 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
5
+ ENV_FILE="${ENV_FILE:-$PROJECT_ROOT/.env}"
6
+ SESSION_ID_OVERRIDE=""
7
+ CLEAR_AUTH_FILES=0
8
+
9
+ log() {
10
+ printf '[clear-whatsapp-session] %s\n' "$*"
11
+ }
12
+
13
+ fail() {
14
+ printf '[clear-whatsapp-session] erro: %s\n' "$*" >&2
15
+ exit 1
16
+ }
17
+
18
+ require_cmd() {
19
+ if ! command -v "$1" >/dev/null 2>&1; then
20
+ fail "comando ausente: $1"
21
+ fi
22
+ }
23
+
24
+ resolve_db_name() {
25
+ local base_name="$1"
26
+ local node_env="${2:-development}"
27
+
28
+ if [[ "$base_name" == *_dev || "$base_name" == *_prod ]]; then
29
+ printf '%s' "$base_name"
30
+ return 0
31
+ fi
32
+
33
+ if [[ "$node_env" == "production" ]]; then
34
+ printf '%s_prod' "$base_name"
35
+ else
36
+ printf '%s_dev' "$base_name"
37
+ fi
38
+ }
39
+
40
+ usage() {
41
+ cat <<'EOF'
42
+ Uso:
43
+ bash scripts/clear-whatsapp-session.sh [opcoes]
44
+
45
+ Opcoes:
46
+ --session <id> Forca um session_id especifico (padrao: BAILEYS_AUTH_SESSION_ID ou "default")
47
+ --clear-auth-files Remove app/connection/auth/*.json tambem (evita rebootstrap da sessao antiga)
48
+ -h, --help Mostra esta ajuda
49
+ EOF
50
+ }
51
+
52
+ while [[ $# -gt 0 ]]; do
53
+ case "$1" in
54
+ --session)
55
+ [[ $# -ge 2 ]] || fail "faltou valor para --session"
56
+ SESSION_ID_OVERRIDE="$2"
57
+ shift 2
58
+ ;;
59
+ --clear-auth-files)
60
+ CLEAR_AUTH_FILES=1
61
+ shift
62
+ ;;
63
+ -h|--help)
64
+ usage
65
+ exit 0
66
+ ;;
67
+ *)
68
+ fail "opcao invalida: $1 (use --help)"
69
+ ;;
70
+ esac
71
+ done
72
+
73
+ require_cmd mysql
74
+ require_cmd base64
75
+
76
+ if [[ ! -f "$ENV_FILE" ]]; then
77
+ fail "arquivo .env nao encontrado em: $ENV_FILE"
78
+ fi
79
+
80
+ set -a
81
+ # shellcheck disable=SC1090
82
+ source "$ENV_FILE"
83
+ set +a
84
+
85
+ DB_HOST="${DB_HOST:-}"
86
+ DB_USER="${DB_USER:-}"
87
+ DB_PASSWORD="${DB_PASSWORD:-}"
88
+ DB_NAME="${DB_NAME:-}"
89
+ NODE_ENV_VALUE="${NODE_ENV:-development}"
90
+ SESSION_ID="${SESSION_ID_OVERRIDE:-${BAILEYS_AUTH_SESSION_ID:-default}}"
91
+
92
+ [[ -n "$DB_HOST" ]] || fail "DB_HOST nao definido no .env"
93
+ [[ -n "$DB_USER" ]] || fail "DB_USER nao definido no .env"
94
+ [[ -n "$DB_PASSWORD" ]] || fail "DB_PASSWORD nao definido no .env"
95
+ [[ -n "$DB_NAME" ]] || fail "DB_NAME nao definido no .env"
96
+ [[ -n "$SESSION_ID" ]] || SESSION_ID="default"
97
+
98
+ DB_REAL_NAME="$(resolve_db_name "$DB_NAME" "$NODE_ENV_VALUE")"
99
+ SESSION_ID_B64="$(printf '%s' "$SESSION_ID" | base64 -w0)"
100
+
101
+ log "Limpando sessao '$SESSION_ID' na tabela baileys_auth_state (database: $DB_REAL_NAME)..."
102
+
103
+ mysql -h "$DB_HOST" -u "$DB_USER" "-p$DB_PASSWORD" "$DB_REAL_NAME" <<SQL
104
+ SET @sid = CONVERT(FROM_BASE64('${SESSION_ID_B64}') USING utf8mb4);
105
+ DELETE FROM baileys_auth_state WHERE session_id = @sid;
106
+ SELECT ROW_COUNT() AS removed_rows, @sid AS session_id;
107
+ SQL
108
+
109
+ if [[ "$CLEAR_AUTH_FILES" == "1" ]]; then
110
+ AUTH_DIR="$PROJECT_ROOT/app/connection/auth"
111
+ if compgen -G "$AUTH_DIR/*.json" >/dev/null 2>&1; then
112
+ rm -f "$AUTH_DIR"/*.json
113
+ log "Arquivos legados removidos em: $AUTH_DIR/*.json"
114
+ else
115
+ log "Nenhum arquivo legado encontrado em: $AUTH_DIR"
116
+ fi
117
+ fi
118
+
119
+ if [[ "${BAILEYS_AUTH_BOOTSTRAP_FROM_FILES:-true}" == "true" && "$CLEAR_AUTH_FILES" != "1" ]]; then
120
+ log "Aviso: BAILEYS_AUTH_BOOTSTRAP_FROM_FILES=true. Considere usar --clear-auth-files para evitar restaurar sessao antiga."
121
+ fi
122
+
123
+ log "Concluido. Reinicie o bot para gerar novo QR Code."