@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,14 +3,65 @@ import { createRoot } from 'react-dom/client';
3
3
  import htm from 'htm';
4
4
 
5
5
  const html = htm.bind(React.createElement);
6
+ const rootElement = document.getElementById('terms-react-root');
7
+
8
+ const DEFAULT_SUPPORT_WHATSAPP_NUMBER = '';
9
+ const DEFAULT_SUPPORT_WHATSAPP_URL = '#';
10
+ const DEFAULT_SUPPORT_WHATSAPP_DISPLAY = 'Canal oficial';
11
+ const DEFAULT_SUPPORT_LGPD_TEXT = 'Olá, gostaria de exercer meus direitos de titular de dados (LGPD).';
12
+
13
+ const normalizePhoneDigits = (value) =>
14
+ String(value || '')
15
+ .replace(/\D+/g, '')
16
+ .slice(0, 15);
17
+
18
+ const formatWhatsappDisplay = (value) => {
19
+ const digits = normalizePhoneDigits(value);
20
+ if (!digits) return DEFAULT_SUPPORT_WHATSAPP_DISPLAY;
21
+ if (digits.startsWith('55') && digits.length === 12) {
22
+ return `+55 ${digits.slice(2, 4)} ${digits.slice(4, 8)}-${digits.slice(8)}`;
23
+ }
24
+ if (digits.startsWith('55') && digits.length === 13) {
25
+ return `+55 ${digits.slice(2, 4)} ${digits.slice(4, 9)}-${digits.slice(9)}`;
26
+ }
27
+ return `+${digits}`;
28
+ };
29
+
30
+ const buildWhatsappUrl = (value, text = '') => {
31
+ const digits = normalizePhoneDigits(value);
32
+ if (!digits) return '';
33
+ const normalizedText = String(text || '').trim();
34
+ if (!normalizedText) return `https://wa.me/${digits}`;
35
+ return `https://wa.me/${digits}?text=${encodeURIComponent(normalizedText)}`;
36
+ };
37
+
38
+ const isValidWhatsappUrl = (value) => /^https?:\/\/wa\.me\/\d{8,15}(?:\?.*)?$/i.test(String(value || '').trim());
39
+
40
+ const resolveSupportLinks = (root) => {
41
+ const dataset = root?.dataset || {};
42
+ const supportNumber = normalizePhoneDigits(dataset.whatsappSupportNumber) || DEFAULT_SUPPORT_WHATSAPP_NUMBER;
43
+ const rawSupportUrl = String(dataset.whatsappSupportUrl || '').trim();
44
+ const rawSupportLgpdUrl = String(dataset.whatsappSupportLgpdUrl || '').trim();
45
+ const rawSupportDisplay = String(dataset.whatsappSupportDisplay || '').trim();
46
+ const supportUrl = (isValidWhatsappUrl(rawSupportUrl) ? rawSupportUrl : buildWhatsappUrl(supportNumber)) || DEFAULT_SUPPORT_WHATSAPP_URL;
47
+ const supportLgpdUrl = (isValidWhatsappUrl(rawSupportLgpdUrl) ? rawSupportLgpdUrl : buildWhatsappUrl(supportNumber, DEFAULT_SUPPORT_LGPD_TEXT)) || supportUrl;
48
+ const supportDisplay = rawSupportDisplay && !/__WHATSAPP_(?:PUBLIC_CONTACT|SUPPORT)_/i.test(rawSupportDisplay) ? rawSupportDisplay : formatWhatsappDisplay(supportNumber);
49
+ return {
50
+ supportUrl,
51
+ supportLgpdUrl,
52
+ supportDisplay: supportDisplay || DEFAULT_SUPPORT_WHATSAPP_DISPLAY,
53
+ };
54
+ };
55
+
56
+ const { supportUrl: SUPPORT_WHATSAPP_URL, supportLgpdUrl: SUPPORT_WHATSAPP_LGPD_URL, supportDisplay: SUPPORT_WHATSAPP_DISPLAY } = resolveSupportLinks(rootElement);
6
57
 
7
58
  const TERMS_CONTENT_HTML = String.raw`
8
59
  <section class="terms-card" style="border-bottom: 4px solid hsla(142, 71%, 45%, 0.3)">
9
60
  <h1>Termos de Uso</h1>
10
61
  <span class="updated">Última atualização: 07/03/2026</span>
11
- <p>Este instrumento regula o acesso e uso do site, API, painel e funcionalidades de automação disponibilizadas pelo OmniZap System.</p>
62
+ <p>Este instrumento regula o acesso e uso do site, API, painel e funcionalidades de automação disponibilizadas pelo Omnizap.</p>
12
63
  <div class="flex flex-wrap gap-3 mt-6">
13
- <a class="contact-btn wa" href="https://wa.me/559591122954" target="_blank">WhatsApp Oficial</a>
64
+ <a class="contact-btn wa" href="${SUPPORT_WHATSAPP_URL}" target="_blank">WhatsApp Oficial</a>
14
65
  <a class="contact-btn ig" href="https://www.instagram.com/kaikybrofc/" target="_blank">Instagram</a>
15
66
  </div>
16
67
  </section>
@@ -22,7 +73,7 @@ const TERMS_CONTENT_HTML = String.raw`
22
73
  <li>Nome empresarial: <strong>59.034.123 KAIKY BRITO RIBEIRO</strong>.</li>
23
74
  <li>CNPJ: <strong>59.034.123/0001-96</strong>.</li>
24
75
  <li>UF do registro: <strong>RR</strong>.</li>
25
- <li>Canal de contato principal: <a href="https://wa.me/559591122954" target="_blank" class="accent">https://wa.me/559591122954</a>.</li>
76
+ <li>Canal de contato principal: <a href="${SUPPORT_WHATSAPP_URL}" target="_blank" class="accent">${SUPPORT_WHATSAPP_URL}</a>.</li>
26
77
  </ul>
27
78
  </section>
28
79
 
@@ -39,8 +90,8 @@ const TERMS_CONTENT_HTML = String.raw`
39
90
  <section class="terms-card">
40
91
  <h2>3. Definições contratuais</h2>
41
92
  <ul>
42
- <li><strong>Plataforma:</strong> ambiente digital OmniZap System (site, API, integrações e painel).</li>
43
- <li><strong>Serviço oficial:</strong> operação hospedada e controlada pelos canais oficiais do OmniZap System (incluindo domínio omnizap.shop e endpoints oficiais).</li>
93
+ <li><strong>Plataforma:</strong> ambiente digital Omnizap (site, API, integrações e painel).</li>
94
+ <li><strong>Serviço oficial:</strong> operação hospedada e controlada pelos canais oficiais do Omnizap (incluindo domínio omnizap.shop e endpoints oficiais).</li>
44
95
  <li><strong>Instância derivada/self-host:</strong> fork, redistribuição ou implantação independente feita por terceiro a partir do código-fonte open source.</li>
45
96
  <li><strong>Usuário:</strong> pessoa natural ou jurídica que acessa ou utiliza a plataforma.</li>
46
97
  <li><strong>Conta:</strong> credencial de acesso vinculada a usuário, e-mail e/ou identificadores técnicos.</li>
@@ -52,7 +103,7 @@ const TERMS_CONTENT_HTML = String.raw`
52
103
  <section class="terms-card">
53
104
  <h2>4. Objeto e escopo de uso</h2>
54
105
  <ul>
55
- <li>Estes Termos se aplicam ao uso do serviço oficial do OmniZap System (site, API, painel administrativo e módulos de automação operados pelos canais oficiais).</li>
106
+ <li>Estes Termos se aplicam ao uso do serviço oficial do Omnizap (site, API, painel administrativo e módulos de automação operados pelos canais oficiais).</li>
56
107
  <li>Forks, redistribuições e instâncias auto-hospedadas por terceiros não se vinculam automaticamente a estes Termos.</li>
57
108
  <li>Em instância derivada/self-host, o operador dessa instância é responsável por publicar seus próprios termos, política de privacidade e instrumentos de conformidade.</li>
58
109
  <li>A plataforma possui finalidade técnica e educacional, sem prejuízo de usos operacionais legítimos pelo usuário.</li>
@@ -124,7 +175,7 @@ const TERMS_CONTENT_HTML = String.raw`
124
175
  </ul>
125
176
  <h3>8.2 Compromisso de sigilo e confidencialidade</h3>
126
177
  <ul>
127
- <li>O OmniZap System compromete-se a observar o sigilo e a confidencialidade das informações tratadas, nos limites legais e técnicos aplicáveis.</li>
178
+ <li>O Omnizap compromete-se a observar o sigilo e a confidencialidade das informações tratadas, nos limites legais e técnicos aplicáveis.</li>
128
179
  <li>O acesso interno ao conteúdo é restrito por necessidade operacional (need-to-know), com controles de acesso e trilha de auditoria.</li>
129
180
  <li>Operadores e fornecedores contratados para apoiar o serviço devem observar obrigações contratuais de confidencialidade e proteção de dados.</li>
130
181
  <li>A divulgação de conteúdo a terceiros somente ocorrerá mediante obrigação legal, ordem judicial/requisição válida de autoridade competente ou autorização do usuário, quando cabível.</li>
@@ -152,7 +203,7 @@ const TERMS_CONTENT_HTML = String.raw`
152
203
  <p>Quando aplicável, o atendimento observará resposta simplificada imediata e declaração clara/completa em até 15 (quinze) dias, conforme LGPD art. 19.</p>
153
204
  <p>Para exercício de direitos e demandas de privacidade:</p>
154
205
  <div class="flex flex-wrap gap-3 mt-4">
155
- <a class="contact-btn wa" href="https://wa.me/559591122954?text=Ol%C3%A1%2C%20gostaria%20de%20exercer%20meus%20direitos%20de%20titular%20de%20dados%20(LGPD)." target="_blank">Solicitar via WhatsApp</a>
206
+ <a class="contact-btn wa" href="${SUPPORT_WHATSAPP_LGPD_URL}" target="_blank">Solicitar via WhatsApp</a>
156
207
  <a class="contact-btn ig" href="https://www.instagram.com/kaikybrofc/" target="_blank">Contato no Instagram</a>
157
208
  </div>
158
209
  </section>
@@ -197,7 +248,7 @@ const TERMS_CONTENT_HTML = String.raw`
197
248
  <ul>
198
249
  <li>O usuário declara possuir direitos, licenças e autorizações necessárias sobre os conteúdos submetidos à plataforma.</li>
199
250
  <li>Conteúdo que infrinja direitos autorais, marca, imagem, privacidade ou legislação poderá ser removido, sem aviso prévio, para mitigação de risco jurídico.</li>
200
- <li>O software, documentação, layout, sinais distintivos e demais ativos do OmniZap System permanecem protegidos pela legislação aplicável, sem prejuízo dos direitos concedidos pela licença MIT sobre o código-fonte publicado no repositório oficial.</li>
251
+ <li>O software, documentação, layout, sinais distintivos e demais ativos do Omnizap permanecem protegidos pela legislação aplicável, sem prejuízo dos direitos concedidos pela licença MIT sobre o código-fonte publicado no repositório oficial.</li>
201
252
  <li>Pedidos de remoção por violação de direitos poderão ser enviados aos canais oficiais, com documentação mínima comprobatória.</li>
202
253
  </ul>
203
254
  </section>
@@ -223,7 +274,7 @@ const TERMS_CONTENT_HTML = String.raw`
223
274
  <section class="terms-card">
224
275
  <h2>16. Responsabilidade do usuário e indenização regressiva</h2>
225
276
  <ul>
226
- <li>O usuário compromete-se a indenizar regressivamente o OmniZap System por danos, custos e despesas decorrentes de uso ilícito ou violação destes Termos.</li>
277
+ <li>O usuário compromete-se a indenizar regressivamente o Omnizap por danos, custos e despesas decorrentes de uso ilícito ou violação destes Termos.</li>
227
278
  <li>Incluem-se, quando aplicável, custos de defesa, perícia, cumprimento de ordem judicial e sanções atribuíveis à conduta do usuário.</li>
228
279
  <li>Esta cláusula não afasta direitos inderrogáveis previstos em lei.</li>
229
280
  </ul>
@@ -231,7 +282,7 @@ const TERMS_CONTENT_HTML = String.raw`
231
282
 
232
283
  <section class="terms-card">
233
284
  <h2>17. Limitação de responsabilidade</h2>
234
- <p>Na extensão máxima permitida pela legislação aplicável, o OmniZap System não será responsável por danos indiretos, lucros cessantes, perdas de oportunidade, indisponibilidade de terceiros, bloqueios externos de conta, força maior, caso fortuito, atos de terceiros ou uso indevido da plataforma pelo usuário.</p>
285
+ <p>Na extensão máxima permitida pela legislação aplicável, o Omnizap não será responsável por danos indiretos, lucros cessantes, perdas de oportunidade, indisponibilidade de terceiros, bloqueios externos de conta, força maior, caso fortuito, atos de terceiros ou uso indevido da plataforma pelo usuário.</p>
235
286
  <p class="note"><strong>Nota:</strong> nada neste instrumento regula responsabilidade nos casos em que a legislação brasileira expressamente proíba limitação ou exclusão.</p>
236
287
  </section>
237
288
 
@@ -253,12 +304,12 @@ const TERMS_CONTENT_HTML = String.raw`
253
304
  <h2>20. Contato e foro</h2>
254
305
  <p>Para questões contratuais, privacidade e proteção de dados, utilize os canais oficiais abaixo.</p>
255
306
  <div class="flex flex-wrap gap-3 mt-4">
256
- <a class="contact-btn wa" href="https://wa.me/559591122954" target="_blank">WhatsApp oficial</a>
307
+ <a class="contact-btn wa" href="${SUPPORT_WHATSAPP_URL}" target="_blank">WhatsApp oficial</a>
257
308
  <a class="contact-btn ig" href="https://www.instagram.com/kaikybrofc/" target="_blank">Instagram oficial</a>
258
309
  </div>
259
310
  <ul class="mt-6">
260
- <li>WhatsApp oficial: <strong>+55 95 9112-2954</strong>.</li>
261
- <li>Link direto: <a href="https://wa.me/559591122954" target="_blank" class="accent">https://wa.me/559591122954</a>.</li>
311
+ <li>WhatsApp oficial: <strong>${SUPPORT_WHATSAPP_DISPLAY}</strong>.</li>
312
+ <li>Link direto: <a href="${SUPPORT_WHATSAPP_URL}" target="_blank" class="accent">${SUPPORT_WHATSAPP_URL}</a>.</li>
262
313
  <li>Instagram oficial: <a href="https://www.instagram.com/kaikybrofc/" target="_blank" class="accent">https://www.instagram.com/kaikybrofc/</a>.</li>
263
314
  <li>Contato complementar para notificações formais: privacidade@omnizap.shop.</li>
264
315
  <li>Encarregado (LGPD art. 41): Kaiky Brito Ribeiro, contato pelo canal oficial de privacidade.</li>
@@ -303,7 +354,7 @@ const TERMS_CONTENT_HTML = String.raw`
303
354
  <h2>23. Cláusulas adicionais de proteção jurídica</h2>
304
355
  <h3>23.1 Papéis LGPD entre as partes</h3>
305
356
  <ul>
306
- <li>Conforme o fluxo operacional, o OmniZap System poderá atuar como controlador ou operador de dados pessoais, nos termos da LGPD.</li>
357
+ <li>Conforme o fluxo operacional, o Omnizap poderá atuar como controlador ou operador de dados pessoais, nos termos da LGPD.</li>
307
358
  <li>Quando o tratamento decorrer de instruções do cliente/usuário, este permanecerá responsável pela legalidade da instrução e pela definição de finalidade.</li>
308
359
  </ul>
309
360
  <h3>23.2 Declaração de base legal pelo usuário/cliente</h3>
@@ -329,7 +380,7 @@ const TERMS_CONTENT_HTML = String.raw`
329
380
  </ul>
330
381
  <h3>23.6 Limite global de responsabilidade financeira</h3>
331
382
  <ul>
332
- <li>Ressalvadas hipóteses de dolo, violação de sigilo, danos morais, danos à personalidade e demais limites legais inderrogáveis, a responsabilidade total do OmniZap System, por evento ou série de eventos relacionados, fica limitada ao montante efetivamente pago pelo usuário nos 12 (doze) meses anteriores ao fato gerador.</li>
383
+ <li>Ressalvadas hipóteses de dolo, violação de sigilo, danos morais, danos à personalidade e demais limites legais inderrogáveis, a responsabilidade total do Omnizap, por evento ou série de eventos relacionados, fica limitada ao montante efetivamente pago pelo usuário nos 12 (doze) meses anteriores ao fato gerador.</li>
333
384
  </ul>
334
385
  <h3>23.7 Cláusula penal calibrada e revisão judicial</h3>
335
386
  <ul>
@@ -338,7 +389,7 @@ const TERMS_CONTENT_HTML = String.raw`
338
389
  </ul>
339
390
  <h3>23.8 Suspensão imediata por risco jurídico ou técnico</h3>
340
391
  <ul>
341
- <li>O OmniZap System poderá suspender imediatamente contas, tokens, integrações ou endpoints em caso de risco iminente à segurança, fraude, abuso, decisão de autoridade ou potencial dano relevante a terceiros.</li>
392
+ <li>O Omnizap poderá suspender imediatamente contas, tokens, integrações ou endpoints em caso de risco iminente à segurança, fraude, abuso, decisão de autoridade ou potencial dano relevante a terceiros.</li>
342
393
  </ul>
343
394
  <h3>23.9 Procedimento de notice-and-takedown</h3>
344
395
  <ul>
@@ -357,7 +408,7 @@ const TERMS_CONTENT_HTML = String.raw`
357
408
  <ul>
358
409
  <li>A não exigência imediata de direito contratual não implicará renúncia.</li>
359
410
  <li>Se qualquer cláusula for considerada inválida, as demais permanecerão eficazes.</li>
360
- <li>É vedada a cessão de posição contratual pelo usuário sem anuência prévia e expressa do OmniZap System, ressalvadas hipóteses legais obrigatórias.</li>
411
+ <li>É vedada a cessão de posição contratual pelo usuário sem anuência prévia e expressa do Omnizap, ressalvadas hipóteses legais obrigatórias.</li>
361
412
  </ul>
362
413
  </section>
363
414
 
@@ -372,13 +423,13 @@ const TERMS_CONTENT_HTML = String.raw`
372
423
  </ul>
373
424
  <h3>24.2 Branding e uso de marcas de terceiros</h3>
374
425
  <ul>
375
- <li>É vedado apresentar o OmniZap System como serviço oficial, parceiro certificado, afiliado ou endossado pela Meta/WhatsApp sem autorização formal e verificável.</li>
426
+ <li>É vedado apresentar o Omnizap como serviço oficial, parceiro certificado, afiliado ou endossado pela Meta/WhatsApp sem autorização formal e verificável.</li>
376
427
  <li>É vedado utilizar logotipos, nomes comerciais, ícones ou identidade visual de terceiros fora das diretrizes oficiais de marca e sem o licenciamento pertinente.</li>
377
428
  <li>Quando houver referência nominativa a marcas de terceiros, ela deverá ser estritamente descritiva, sem sugerir patrocínio, apoio institucional ou vínculo societário inexistente.</li>
378
429
  </ul>
379
430
  <h3>24.3 Contratação corporativa, DPA e alocação de risco</h3>
380
431
  <ul>
381
- <li>Para operação corporativa em escala do serviço oficial, o OmniZap System poderá exigir contrato específico com cláusulas de proteção de dados, incluindo DPA (Data Processing Addendum).</li>
432
+ <li>Para operação corporativa em escala do serviço oficial, o Omnizap poderá exigir contrato específico com cláusulas de proteção de dados, incluindo DPA (Data Processing Addendum).</li>
382
433
  <li>O contrato poderá prever garantias expressas de base legal, dever de cooperação regulatória, indenização regressiva e limitação de responsabilidade em parâmetros economicamente proporcionais.</li>
383
434
  <li>A recusa em firmar os instrumentos jurídicos mínimos poderá ensejar suspensão de funcionalidades de alto risco até regularização contratual.</li>
384
435
  </ul>
@@ -390,7 +441,7 @@ const TERMS_CONTENT_HTML = String.raw`
390
441
  </ul>
391
442
  <h3>24.5 Plano formal de incidentes e gatilho ANPD/titulares</h3>
392
443
  <ul>
393
- <li>O OmniZap System manterá plano formal de resposta a incidentes com etapas de detecção, contenção, erradicação, recuperação e lições aprendidas.</li>
444
+ <li>O Omnizap manterá plano formal de resposta a incidentes com etapas de detecção, contenção, erradicação, recuperação e lições aprendidas.</li>
394
445
  <li>Quando houver incidente com risco ou dano relevante aos titulares, será acionado fluxo formal de comunicação à ANPD e aos titulares potencialmente afetados, nos termos da legislação vigente.</li>
395
446
  <li>Quando aplicável ao controlador, a comunicação regulatória observará os prazos legais vigentes, incluindo o prazo de 3 (três) dias úteis previsto no regulamento da ANPD, ressalvada legislação específica superveniente.</li>
396
447
  <li>As comunicações incluirão, quando exigido, descrição do incidente, dados afetados, medidas técnicas/administrativas adotadas, riscos envolvidos, justificativa para eventual atraso e medidas para mitigar efeitos.</li>
@@ -456,7 +507,7 @@ const TermsReactApp = () => html`
456
507
  </main>
457
508
 
458
509
  <footer className="py-12 border-t border-base-200 mt-auto text-center">
459
- <p className="text-[10px] font-bold uppercase tracking-[0.3em] text-base-content/20">© 2026 OMNIZAP SYSTEM · TERMS OF SERVICE V2</p>
510
+ <p className="text-[10px] font-bold uppercase tracking-[0.3em] text-base-content/20">© 2026 OMNIZAP · TERMS OF SERVICE V2</p>
460
511
  </footer>
461
512
  </div>
462
513
  `;
@@ -520,8 +571,6 @@ const TermsReactAppWithEffects = () => {
520
571
  return html`<${TermsReactApp} />`;
521
572
  };
522
573
 
523
- const rootElement = document.getElementById('terms-react-root');
524
-
525
574
  if (rootElement) {
526
575
  const root = createRoot(rootElement);
527
576
  root.render(html`<${TermsReactAppWithEffects} />`);
@@ -1,3 +1,4 @@
1
+ import { now as __timeNow, nowIso as __timeNowIso, toUnixMs as __timeNowMs } from '#time';
1
2
  const DEFAULT_API_BASE_PATH = '/api';
2
3
  const DEFAULT_STICKERS_PATH = '/stickers';
3
4
  const DEFAULT_LOGIN_PATH = '/login';
@@ -555,7 +556,7 @@ if (root) {
555
556
  const formatRelativeTime = (value) => {
556
557
  const ms = Date.parse(String(value || ''));
557
558
  if (!Number.isFinite(ms)) return 'n/d';
558
- const deltaMs = Date.now() - ms;
559
+ const deltaMs = __timeNowMs() - ms;
559
560
  const absMs = Math.abs(deltaMs);
560
561
  const suffix = deltaMs >= 0 ? 'atrás' : 'à frente';
561
562
  if (absMs < 1000) return 'agora';
@@ -2247,7 +2248,7 @@ if (root) {
2247
2248
 
2248
2249
  const normalizedType = normalizeString(type || 'metrics').toLowerCase();
2249
2250
  const normalizedFormat = normalizeString(format || 'json').toLowerCase();
2250
- const fallbackName = `admin-${normalizedType}-${Date.now()}.${normalizedFormat === 'csv' ? 'csv' : 'json'}`;
2251
+ const fallbackName = `admin-${normalizedType}-${__timeNowMs()}.${normalizedFormat === 'csv' ? 'csv' : 'json'}`;
2251
2252
 
2252
2253
  showAdminError('');
2253
2254
  setButtonProcessing(triggerButton, 'Exportando...');
@@ -2303,7 +2304,7 @@ if (root) {
2303
2304
  const manageHref = `${state.stickersPath.replace(/\/+$/, '') || DEFAULT_STICKERS_PATH}/perfil`;
2304
2305
  if (ui.manageHeadLink) ui.manageHeadLink.href = manageHref;
2305
2306
  if (ui.manageMainLink) ui.manageMainLink.href = manageHref;
2306
- if (ui.currentYear) ui.currentYear.textContent = String(new Date().getFullYear());
2307
+ if (ui.currentYear) ui.currentYear.textContent = String(__timeNow().getFullYear());
2307
2308
  applyEnvironmentBadge();
2308
2309
  restoreCompactMode();
2309
2310
  bindAdminCarousel();