@omnizap-system/omnizap 2.5.12

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 (425) hide show
  1. package/.clusterfuzzlite/Dockerfile +10 -0
  2. package/.env.example +907 -0
  3. package/.github/codeql/codeql-config.yml +10 -0
  4. package/.github/dependabot.yml +35 -0
  5. package/.github/workflows/ci.yml +73 -0
  6. package/.github/workflows/codeql.yml +106 -0
  7. package/.github/workflows/db-migration-check.yml +98 -0
  8. package/.github/workflows/dependency-review.yml +22 -0
  9. package/.github/workflows/deploy.yml +95 -0
  10. package/.github/workflows/release.yml +106 -0
  11. package/.github/workflows/security-attest-provenance.yml +51 -0
  12. package/.github/workflows/security-gitleaks.yml +34 -0
  13. package/.github/workflows/security-runner-hardening.yml +31 -0
  14. package/.github/workflows/security-scorecard.yml +44 -0
  15. package/.github/workflows/security-zap-baseline.yml +44 -0
  16. package/.github/workflows/security-zap-full-scan.yml +43 -0
  17. package/.github/workflows/security-zizmor.yml +36 -0
  18. package/.github/workflows/wiki-sync.yml +44 -0
  19. package/.gitleaks.toml +15 -0
  20. package/.prettierrc +34 -0
  21. package/CODE_OF_CONDUCT.md +114 -0
  22. package/LICENSE +56 -0
  23. package/README.md +110 -0
  24. package/SECURITY.md +110 -0
  25. package/app/config/index.js +4 -0
  26. package/app/configParts/adminIdentity.js +92 -0
  27. package/app/configParts/baileysConfig.js +1818 -0
  28. package/app/configParts/groupUtils.js +692 -0
  29. package/app/configParts/loggerConfig.js +394 -0
  30. package/app/configParts/messagePersistenceService.js +305 -0
  31. package/app/connection/baileysCompatibility.test.js +40 -0
  32. package/app/connection/baileysDbAuthState.js +344 -0
  33. package/app/connection/socketController.js +2243 -0
  34. package/app/controllers/messageController.js +7 -0
  35. package/app/controllers/messagePipeline/commandMiddleware.js +146 -0
  36. package/app/controllers/messagePipeline/conversationMiddleware.js +183 -0
  37. package/app/controllers/messagePipeline/messagePipelineMiddlewares.test.js +522 -0
  38. package/app/controllers/messagePipeline/postProcessingMiddleware.js +41 -0
  39. package/app/controllers/messagePipeline/preProcessingMiddlewares.js +166 -0
  40. package/app/controllers/messageProcessingPipeline.js +699 -0
  41. package/app/modules/adminModule/AGENT.md +4056 -0
  42. package/app/modules/adminModule/adminAiHelpService.js +56 -0
  43. package/app/modules/adminModule/adminConfigRuntime.js +177 -0
  44. package/app/modules/adminModule/commandConfig.json +7122 -0
  45. package/app/modules/adminModule/groupCommandHandlers.js +1823 -0
  46. package/app/modules/adminModule/groupCommandHandlers.test.js +350 -0
  47. package/app/modules/adminModule/groupEventHandlers.js +399 -0
  48. package/app/modules/aiModule/AGENT.md +547 -0
  49. package/app/modules/aiModule/aiAiHelpService.js +14 -0
  50. package/app/modules/aiModule/aiConfigRuntime.js +135 -0
  51. package/app/modules/aiModule/catCommand.js +967 -0
  52. package/app/modules/aiModule/commandConfig.json +981 -0
  53. package/app/modules/analyticsModule/messageAnalysisEventRepository.js +83 -0
  54. package/app/modules/gameModule/AGENT.md +196 -0
  55. package/app/modules/gameModule/commandConfig.json +366 -0
  56. package/app/modules/gameModule/diceCommand.js +42 -0
  57. package/app/modules/gameModule/gameAiHelpService.js +14 -0
  58. package/app/modules/gameModule/gameConfigRuntime.js +68 -0
  59. package/app/modules/menuModule/AGENT.md +205 -0
  60. package/app/modules/menuModule/commandConfig.json +366 -0
  61. package/app/modules/menuModule/common.js +316 -0
  62. package/app/modules/menuModule/menuAiHelpService.js +14 -0
  63. package/app/modules/menuModule/menuConfigRuntime.js +68 -0
  64. package/app/modules/menuModule/menus.js +66 -0
  65. package/app/modules/playModule/AGENT.md +321 -0
  66. package/app/modules/playModule/commandConfig.json +584 -0
  67. package/app/modules/playModule/playAiHelpService.js +14 -0
  68. package/app/modules/playModule/playCommand.js +1417 -0
  69. package/app/modules/playModule/playConfigRuntime.js +68 -0
  70. package/app/modules/quoteModule/AGENT.md +199 -0
  71. package/app/modules/quoteModule/commandConfig.json +366 -0
  72. package/app/modules/quoteModule/quoteAiHelpService.js +14 -0
  73. package/app/modules/quoteModule/quoteCommand.js +842 -0
  74. package/app/modules/quoteModule/quoteConfigRuntime.js +68 -0
  75. package/app/modules/rpgPokemonModule/AGENT.md +229 -0
  76. package/app/modules/rpgPokemonModule/commandConfig.json +386 -0
  77. package/app/modules/rpgPokemonModule/rpgBattleCanvasRenderer.js +795 -0
  78. package/app/modules/rpgPokemonModule/rpgBattleService.js +2110 -0
  79. package/app/modules/rpgPokemonModule/rpgBattleService.test.js +770 -0
  80. package/app/modules/rpgPokemonModule/rpgEvolutionUtils.js +22 -0
  81. package/app/modules/rpgPokemonModule/rpgPokemonAiHelpService.js +14 -0
  82. package/app/modules/rpgPokemonModule/rpgPokemonCommand.js +174 -0
  83. package/app/modules/rpgPokemonModule/rpgPokemonConfigRuntime.js +68 -0
  84. package/app/modules/rpgPokemonModule/rpgPokemonDomain.js +192 -0
  85. package/app/modules/rpgPokemonModule/rpgPokemonDomain.test.js +93 -0
  86. package/app/modules/rpgPokemonModule/rpgPokemonEvolution.test.js +46 -0
  87. package/app/modules/rpgPokemonModule/rpgPokemonMessages.js +746 -0
  88. package/app/modules/rpgPokemonModule/rpgPokemonRepository.js +1847 -0
  89. package/app/modules/rpgPokemonModule/rpgPokemonService.js +6839 -0
  90. package/app/modules/rpgPokemonModule/rpgProfileCanvasRenderer.js +354 -0
  91. package/app/modules/statsModule/AGENT.md +320 -0
  92. package/app/modules/statsModule/commandConfig.json +540 -0
  93. package/app/modules/statsModule/globalRankingCommand.js +64 -0
  94. package/app/modules/statsModule/rankingCommand.js +41 -0
  95. package/app/modules/statsModule/rankingCommon.js +1305 -0
  96. package/app/modules/statsModule/statsAiHelpService.js +14 -0
  97. package/app/modules/statsModule/statsConfigRuntime.js +68 -0
  98. package/app/modules/stickerModule/AGENT.md +692 -0
  99. package/app/modules/stickerModule/addStickerMetadata.js +239 -0
  100. package/app/modules/stickerModule/commandConfig.json +1216 -0
  101. package/app/modules/stickerModule/convertToWebp.js +367 -0
  102. package/app/modules/stickerModule/stickerAiHelpService.js +14 -0
  103. package/app/modules/stickerModule/stickerCommand.js +446 -0
  104. package/app/modules/stickerModule/stickerConfigRuntime.js +68 -0
  105. package/app/modules/stickerModule/stickerConvertCommand.js +159 -0
  106. package/app/modules/stickerModule/stickerTextCommand.js +653 -0
  107. package/app/modules/stickerPackModule/AGENT.md +215 -0
  108. package/app/modules/stickerPackModule/autoPackCollectorRuntime.js +20 -0
  109. package/app/modules/stickerPackModule/autoPackCollectorService.js +357 -0
  110. package/app/modules/stickerPackModule/commandConfig.json +387 -0
  111. package/app/modules/stickerPackModule/domainEventOutboxRepository.js +227 -0
  112. package/app/modules/stickerPackModule/domainEvents.js +52 -0
  113. package/app/modules/stickerPackModule/semanticReclassificationEngine.js +429 -0
  114. package/app/modules/stickerPackModule/semanticReclassificationEngine.test.js +75 -0
  115. package/app/modules/stickerPackModule/semanticThemeClusterService.js +544 -0
  116. package/app/modules/stickerPackModule/stickerAssetClassificationRepository.js +400 -0
  117. package/app/modules/stickerPackModule/stickerAssetRepository.js +400 -0
  118. package/app/modules/stickerPackModule/stickerAssetReprocessQueueRepository.js +175 -0
  119. package/app/modules/stickerPackModule/stickerAutoPackByTagsRuntime.js +3702 -0
  120. package/app/modules/stickerPackModule/stickerClassificationBackgroundRuntime.js +559 -0
  121. package/app/modules/stickerPackModule/stickerClassificationService.js +557 -0
  122. package/app/modules/stickerPackModule/stickerDedicatedTaskWorkerRuntime.js +249 -0
  123. package/app/modules/stickerPackModule/stickerDomainEventBus.js +65 -0
  124. package/app/modules/stickerPackModule/stickerDomainEventConsumerRuntime.js +208 -0
  125. package/app/modules/stickerPackModule/stickerMarketplaceDriftService.js +99 -0
  126. package/app/modules/stickerPackModule/stickerObjectStorageService.js +285 -0
  127. package/app/modules/stickerPackModule/stickerPackAiHelpService.js +14 -0
  128. package/app/modules/stickerPackModule/stickerPackCommandHandlers.js +1148 -0
  129. package/app/modules/stickerPackModule/stickerPackConfigRuntime.js +68 -0
  130. package/app/modules/stickerPackModule/stickerPackEngagementRepository.js +152 -0
  131. package/app/modules/stickerPackModule/stickerPackErrors.js +30 -0
  132. package/app/modules/stickerPackModule/stickerPackInteractionEventRepository.js +101 -0
  133. package/app/modules/stickerPackModule/stickerPackItemRepository.js +432 -0
  134. package/app/modules/stickerPackModule/stickerPackMarketplaceService.js +313 -0
  135. package/app/modules/stickerPackModule/stickerPackMessageService.js +268 -0
  136. package/app/modules/stickerPackModule/stickerPackRepository.js +450 -0
  137. package/app/modules/stickerPackModule/stickerPackScoreSnapshotRepository.js +179 -0
  138. package/app/modules/stickerPackModule/stickerPackScoreSnapshotRuntime.js +271 -0
  139. package/app/modules/stickerPackModule/stickerPackService.js +733 -0
  140. package/app/modules/stickerPackModule/stickerPackServiceRuntime.js +32 -0
  141. package/app/modules/stickerPackModule/stickerPackUtils.js +107 -0
  142. package/app/modules/stickerPackModule/stickerStorageService.js +559 -0
  143. package/app/modules/stickerPackModule/stickerWorkerPipelineRuntime.js +242 -0
  144. package/app/modules/stickerPackModule/stickerWorkerTaskQueueRepository.js +242 -0
  145. package/app/modules/systemMetricsModule/AGENT.md +193 -0
  146. package/app/modules/systemMetricsModule/commandConfig.json +344 -0
  147. package/app/modules/systemMetricsModule/pingCommand.js +399 -0
  148. package/app/modules/systemMetricsModule/systemMetricsAiHelpService.js +14 -0
  149. package/app/modules/systemMetricsModule/systemMetricsConfigRuntime.js +68 -0
  150. package/app/modules/tiktokModule/AGENT.md +196 -0
  151. package/app/modules/tiktokModule/commandConfig.json +366 -0
  152. package/app/modules/tiktokModule/tiktokAiHelpService.js +14 -0
  153. package/app/modules/tiktokModule/tiktokCommand.js +716 -0
  154. package/app/modules/tiktokModule/tiktokConfigRuntime.js +68 -0
  155. package/app/modules/userModule/AGENT.md +200 -0
  156. package/app/modules/userModule/commandConfig.json +386 -0
  157. package/app/modules/userModule/userAiHelpService.js +14 -0
  158. package/app/modules/userModule/userCommand.js +1155 -0
  159. package/app/modules/userModule/userConfigRuntime.js +68 -0
  160. package/app/modules/waifuPicsModule/AGENT.md +431 -0
  161. package/app/modules/waifuPicsModule/commandConfig.json +780 -0
  162. package/app/modules/waifuPicsModule/waifuPicsAiHelpService.js +14 -0
  163. package/app/modules/waifuPicsModule/waifuPicsCommand.js +586 -0
  164. package/app/modules/waifuPicsModule/waifuPicsConfigRuntime.js +68 -0
  165. package/app/observability/metrics.js +766 -0
  166. package/app/services/ai/aiHelpResponseCacheRepository.js +280 -0
  167. package/app/services/ai/aiLearningRepository.js +400 -0
  168. package/app/services/ai/commandConfigEnrichmentRepository.js +769 -0
  169. package/app/services/ai/commandConfigEnrichmentService.js +452 -0
  170. package/app/services/ai/commandConfigValidationService.js +443 -0
  171. package/app/services/ai/commandToolBuilderService.js +192 -0
  172. package/app/services/ai/conversationRouterService.js +516 -0
  173. package/app/services/ai/geminiService.js +115 -0
  174. package/app/services/ai/geminiService.test.js +87 -0
  175. package/app/services/ai/globalModuleAiHelpService.js +1412 -0
  176. package/app/services/ai/globalToolCallingService.js +203 -0
  177. package/app/services/ai/messageCommandExecutionService.js +391 -0
  178. package/app/services/ai/moduleAiHelpCoreService.js +1099 -0
  179. package/app/services/ai/moduleAiHelpWrapperFactory.js +65 -0
  180. package/app/services/ai/moduleCommandConfigRuntimeService.js +113 -0
  181. package/app/services/ai/moduleToolExecutorService.js +464 -0
  182. package/app/services/ai/moduleToolRegistryService.js +178 -0
  183. package/app/services/ai/toolCandidateSelectorService.js +781 -0
  184. package/app/services/auth/googleWebLinkService.js +80 -0
  185. package/app/services/auth/whatsappLoginLinkService.js +230 -0
  186. package/app/services/external/pokeApiService.js +398 -0
  187. package/app/services/group/groupMetadataService.js +311 -0
  188. package/app/services/infra/dbWriteQueue.js +874 -0
  189. package/app/services/infra/featureFlagService.js +131 -0
  190. package/app/services/infra/queueUtils.js +55 -0
  191. package/app/services/messaging/captchaService.js +491 -0
  192. package/app/services/messaging/messagePersistenceService.js +1 -0
  193. package/app/services/messaging/newsBroadcastService.js +347 -0
  194. package/app/services/sticker/stickerFocusService.js +347 -0
  195. package/app/services/sticker/stickerFocusService.test.js +43 -0
  196. package/app/store/aiPromptStore.js +38 -0
  197. package/app/store/conversationSessionStore.js +131 -0
  198. package/app/store/groupConfigStore.js +58 -0
  199. package/app/store/premiumUserStore.js +54 -0
  200. package/app/utils/antiLink/antiLinkModule.js +700 -0
  201. package/app/utils/http/getImageBufferModule.js +18 -0
  202. package/app/utils/json/jsonSanitizer.js +113 -0
  203. package/app/utils/json/jsonSanitizer.test.js +40 -0
  204. package/app/utils/systemMetrics/systemMetricsModule.js +88 -0
  205. package/app/workers/aiLearningWorker.js +605 -0
  206. package/app/workers/commandConfigEnrichmentWorker.js +242 -0
  207. package/database/index.js +2075 -0
  208. package/database/init.js +151 -0
  209. package/database/migrations/.gitkeep +0 -0
  210. package/database/migrations/20260307_d0_hardening_down.sql +64 -0
  211. package/database/migrations/20260307_d0_hardening_up.sql +79 -0
  212. package/database/migrations/20260307_d1_terms_acceptance_down.sql +11 -0
  213. package/database/migrations/20260307_d1_terms_acceptance_up.sql +37 -0
  214. package/database/migrations/20260307_d2_auth_hardening_down.sql +75 -0
  215. package/database/migrations/20260307_d2_auth_hardening_up.sql +100 -0
  216. package/database/migrations/20260314_d7_canonical_sender_down.sql +53 -0
  217. package/database/migrations/20260314_d7_canonical_sender_up.sql +114 -0
  218. package/database/migrations/20260406_d30_security_analytics_down.sql +95 -0
  219. package/database/migrations/20260406_d30_security_analytics_up.sql +292 -0
  220. package/database/migrations/20260407_d31_web_google_session_token_hardening_down.sql +2 -0
  221. package/database/migrations/20260407_d31_web_google_session_token_hardening_up.sql +17 -0
  222. package/database/migrations/20260408_d32_ai_help_response_cache_down.sql +1 -0
  223. package/database/migrations/20260408_d32_ai_help_response_cache_up.sql +22 -0
  224. package/database/migrations/20260409_d33_ai_learning_tables_down.sql +4 -0
  225. package/database/migrations/20260409_d33_ai_learning_tables_up.sql +52 -0
  226. package/database/migrations/20260410_d34_command_config_enrichment_down.sql +3 -0
  227. package/database/migrations/20260410_d34_command_config_enrichment_up.sql +48 -0
  228. package/database/schema.sql +1186 -0
  229. package/docker-compose.yml +104 -0
  230. package/docs/audits/stickerCatalogController-out-of-scope.md +103 -0
  231. package/docs/audits/stickerCatalogController-symbols.md +58 -0
  232. package/docs/compliance/acceptable-use-policy-2026-03-07.md +35 -0
  233. package/docs/compliance/dpa-b2b-standard-2026-03-07.md +80 -0
  234. package/docs/compliance/monthly-compliance-checklist-2026-03-07.md +88 -0
  235. package/docs/compliance/notice-and-takedown-policy-2026-03-07.md +34 -0
  236. package/docs/compliance/privacy-policy-2026-03-07.md +75 -0
  237. package/docs/compliance/subprocessors-inventory-2026-03-07.md +16 -0
  238. package/docs/database/production-db-evolution-runbook-2026q1.md +365 -0
  239. package/docs/security/dsar-lgpd-runbook-2026-03-07.md +86 -0
  240. package/docs/security/incident-response-lgpd-anpd-runbook-2026-03-07.md +77 -0
  241. package/docs/security/network-hardening-runbook-2026-03-07.md +137 -0
  242. package/docs/seo/omnizap-seo-playbook-br-2026-02-28.md +238 -0
  243. package/docs/seo/satellite-page-template.md +116 -0
  244. package/docs/seo/satellite-pages-phase1.json +364 -0
  245. package/docs/wiki/Home.md +120 -0
  246. package/docs/wiki/pair-extraordinaire-2026-03-08.md +3 -0
  247. package/docs/wiki/recent-changes-2026-03-08.md +47 -0
  248. package/ecosystem.prod.config.cjs +135 -0
  249. package/eslint.config.js +89 -0
  250. package/index.js +488 -0
  251. package/ml/clip_classifier/Dockerfile +18 -0
  252. package/ml/clip_classifier/README.md +118 -0
  253. package/ml/clip_classifier/adaptive_scoring.py +40 -0
  254. package/ml/clip_classifier/classifier.py +654 -0
  255. package/ml/clip_classifier/embedding_store.py +481 -0
  256. package/ml/clip_classifier/env_loader.py +15 -0
  257. package/ml/clip_classifier/llm_label_expander.py +144 -0
  258. package/ml/clip_classifier/main.py +213 -0
  259. package/ml/clip_classifier/requirements.txt +10 -0
  260. package/ml/clip_classifier/similarity_engine.py +74 -0
  261. package/new-logo.png +0 -0
  262. package/observability/alert-rules.yml +60 -0
  263. package/observability/grafana/dashboards/omnizap-mysql.json +136 -0
  264. package/observability/grafana/dashboards/omnizap-overview.json +170 -0
  265. package/observability/grafana/provisioning/dashboards/dashboards.yml +11 -0
  266. package/observability/grafana/provisioning/datasources/datasources.yml +15 -0
  267. package/observability/loki-config.yml +38 -0
  268. package/observability/mysql-setup.sql +46 -0
  269. package/observability/prometheus.yml +35 -0
  270. package/observability/promtail-config.yml +84 -0
  271. package/observability/sticker-catalog-slo.md +83 -0
  272. package/observability/sticker-scale-hardening-rollout.md +128 -0
  273. package/package.json +144 -0
  274. package/public/apple-touch-icon.png +0 -0
  275. package/public/assets/css/commands-react.input.css +71 -0
  276. package/public/assets/css/create-pack-react.input.css +31 -0
  277. package/public/assets/css/home-react.input.css +106 -0
  278. package/public/assets/css/login-react.input.css +58 -0
  279. package/public/assets/css/stickers-react.input.css +18 -0
  280. package/public/assets/css/terms-react.input.css +115 -0
  281. package/public/assets/css/user-react.input.css +57 -0
  282. package/public/assets/images/brand-icon-192.png +0 -0
  283. package/public/assets/images/brand-logo-128.webp +0 -0
  284. package/public/assets/images/hero-banner-1280.jpg +0 -0
  285. package/public/comandos/commands-catalog.json +4517 -0
  286. package/public/css/api-docs.css +161 -0
  287. package/public/css/stickers-admin.css +1288 -0
  288. package/public/css/styles.css +679 -0
  289. package/public/css/systemadm/admin.css +474 -0
  290. package/public/css/systemadm/base.css +73 -0
  291. package/public/css/systemadm/components.css +662 -0
  292. package/public/css/systemadm/layout.css +229 -0
  293. package/public/css/systemadm/tokens.css +56 -0
  294. package/public/favicon-16x16.png +0 -0
  295. package/public/favicon-32x32.png +0 -0
  296. package/public/favicon.ico +0 -0
  297. package/public/js/apps/apiDocsApp.js +235 -0
  298. package/public/js/apps/commandsReactApp.js +528 -0
  299. package/public/js/apps/createPackApp.js +1646 -0
  300. package/public/js/apps/homeReactApp.js +942 -0
  301. package/public/js/apps/loginReactApp.js +496 -0
  302. package/public/js/apps/stickersAdminApp.js +1753 -0
  303. package/public/js/apps/stickersApp.js +3797 -0
  304. package/public/js/apps/termsReactApp.js +528 -0
  305. package/public/js/apps/userApp.js +2540 -0
  306. package/public/js/apps/userProfile/actions.js +66 -0
  307. package/public/js/apps/userReactApp.js +547 -0
  308. package/public/js/catalog.js +950 -0
  309. package/public/pages/api-docs.html +40 -0
  310. package/public/pages/aup.html +158 -0
  311. package/public/pages/comandos.html +41 -0
  312. package/public/pages/dpa.html +227 -0
  313. package/public/pages/home.html +45 -0
  314. package/public/pages/licenca.html +182 -0
  315. package/public/pages/login.html +40 -0
  316. package/public/pages/notice-and-takedown.html +234 -0
  317. package/public/pages/politica-de-privacidade.html +251 -0
  318. package/public/pages/seo-bot-whatsapp-para-grupo.html +350 -0
  319. package/public/pages/seo-bot-whatsapp-sem-programar.html +350 -0
  320. package/public/pages/seo-como-automatizar-avisos-no-whatsapp.html +350 -0
  321. package/public/pages/seo-como-criar-comandos-whatsapp.html +350 -0
  322. package/public/pages/seo-como-evitar-spam-no-whatsapp.html +350 -0
  323. package/public/pages/seo-como-moderar-grupo-whatsapp.html +350 -0
  324. package/public/pages/seo-como-organizar-comunidade-whatsapp.html +350 -0
  325. package/public/pages/seo-melhor-bot-whatsapp-para-grupos.html +350 -0
  326. package/public/pages/stickers-admin.html +31 -0
  327. package/public/pages/stickers-create.html +41 -0
  328. package/public/pages/stickers.html +45 -0
  329. package/public/pages/suboperadores.html +237 -0
  330. package/public/pages/termos-de-uso-texto-integral.html +241 -0
  331. package/public/pages/termos-de-uso.html +41 -0
  332. package/public/pages/user-password-reset.html +32 -0
  333. package/public/pages/user-systemadm.html +508 -0
  334. package/public/pages/user.html +39 -0
  335. package/public/robots.txt +9 -0
  336. package/public/site.webmanifest +24 -0
  337. package/public/sitemap.xml +98 -0
  338. package/schemas/command-config.schema.json +582 -0
  339. package/scripts/baileys-compat-smoke.mjs +12 -0
  340. package/scripts/cache-bust.mjs +142 -0
  341. package/scripts/deploy.sh +916 -0
  342. package/scripts/email-broadcast-terms-update.mjs +170 -0
  343. package/scripts/enrich-command-discovery-fields.mjs +286 -0
  344. package/scripts/generate-command-config-schema.mjs +273 -0
  345. package/scripts/generate-commands-catalog.mjs +308 -0
  346. package/scripts/generate-module-agents.mjs +631 -0
  347. package/scripts/generate-seo-satellite-pages.mjs +400 -0
  348. package/scripts/github-deploy-notify.mjs +174 -0
  349. package/scripts/github-release-notify.mjs +219 -0
  350. package/scripts/release.sh +599 -0
  351. package/scripts/run-codeql-local.sh +116 -0
  352. package/scripts/run-prettier-all.mjs +25 -0
  353. package/scripts/security-smoketest.mjs +581 -0
  354. package/scripts/sticker-catalog-loadtest.mjs +210 -0
  355. package/scripts/sticker-worker-task.mjs +119 -0
  356. package/scripts/sync-readme-snapshot.mjs +133 -0
  357. package/scripts/validate-command-config-schema.mjs +130 -0
  358. package/scripts/validate-command-configs.mjs +15 -0
  359. package/scripts/wiki-sync.sh +191 -0
  360. package/server/auth/googleWebAuth/googleWebAuthRuntime.js +62 -0
  361. package/server/auth/googleWebAuth/googleWebAuthService.js +807 -0
  362. package/server/auth/jwt/webJwtService.js +147 -0
  363. package/server/auth/stickerCatalogAuthContext.js +165 -0
  364. package/server/auth/termsAcceptance/termsAcceptanceHandler.js +189 -0
  365. package/server/auth/userPassword/index.js +14 -0
  366. package/server/auth/userPassword/userPasswordAuthService.js +422 -0
  367. package/server/auth/userPassword/userPasswordCrypto.js +199 -0
  368. package/server/auth/userPassword/userPasswordCrypto.test.js +76 -0
  369. package/server/auth/userPassword/userPasswordRecoveryService.js +728 -0
  370. package/server/auth/validation/authSchemas.js +236 -0
  371. package/server/auth/webAccount/webAccountHandlers.js +1434 -0
  372. package/server/controllers/admin/adminBanService.js +138 -0
  373. package/server/controllers/admin/adminPanelHandlers.js +2083 -0
  374. package/server/controllers/admin/stickerCatalogAdminContext.js +17 -0
  375. package/server/controllers/admin/systemAdminController.js +201 -0
  376. package/server/controllers/email/emailAutomationController.js +239 -0
  377. package/server/controllers/metricsController.js +21 -0
  378. package/server/controllers/seo/stickerCatalogSeoContext.js +514 -0
  379. package/server/controllers/sticker/nonCatalogHandlers.js +303 -0
  380. package/server/controllers/sticker/stickerCatalogController.js +4700 -0
  381. package/server/controllers/system/contactController.js +115 -0
  382. package/server/controllers/system/githubController.js +137 -0
  383. package/server/controllers/system/stickerCatalogSystemContext.js +758 -0
  384. package/server/controllers/system/storageController.js +154 -0
  385. package/server/controllers/system/systemController.js +135 -0
  386. package/server/controllers/system/systemMetricsController.js +156 -0
  387. package/server/controllers/system/visitController.js +90 -0
  388. package/server/controllers/userController.js +145 -0
  389. package/server/email/emailAutomationRuntime.js +225 -0
  390. package/server/email/emailAutomationService.js +125 -0
  391. package/server/email/emailOutboxRepository.js +282 -0
  392. package/server/email/emailTemplateService.js +480 -0
  393. package/server/email/emailTransportService.js +156 -0
  394. package/server/http/clientIp.js +95 -0
  395. package/server/http/httpRequestUtils.js +262 -0
  396. package/server/http/httpRequestUtils.test.js +80 -0
  397. package/server/http/httpServer.js +180 -0
  398. package/server/http/requestContext.js +20 -0
  399. package/server/http/siteRoutingUtils.js +87 -0
  400. package/server/index.js +1 -0
  401. package/server/middleware/cachePolicy.js +26 -0
  402. package/server/middleware/cachePolicyHelpers.js +1 -0
  403. package/server/middleware/endpointRateLimit.js +181 -0
  404. package/server/middleware/rateLimit.js +70 -0
  405. package/server/middleware/requireAdminAuth.js +48 -0
  406. package/server/middleware/securityHeaders.js +97 -0
  407. package/server/routes/admin/systemAdminRouter.js +64 -0
  408. package/server/routes/email/emailAutomationRouter.js +46 -0
  409. package/server/routes/health/healthRouter.js +41 -0
  410. package/server/routes/indexRouter.js +234 -0
  411. package/server/routes/metrics/metricsRouter.js +58 -0
  412. package/server/routes/static/staticPageRouter.js +134 -0
  413. package/server/routes/sticker/catalogHandlers/catalogAdminHttp.js +105 -0
  414. package/server/routes/sticker/catalogHandlers/catalogAuthHttp.js +77 -0
  415. package/server/routes/sticker/catalogHandlers/catalogPublicHttp.js +120 -0
  416. package/server/routes/sticker/catalogHandlers/catalogUploadHttp.js +83 -0
  417. package/server/routes/sticker/catalogRouter.js +77 -0
  418. package/server/routes/sticker/stickerApiRouter.js +84 -0
  419. package/server/routes/sticker/stickerDataRouter.js +145 -0
  420. package/server/routes/sticker/stickerSiteRouter.js +43 -0
  421. package/server/routes/user/userApiPaths.js +66 -0
  422. package/server/routes/user/userRouter.js +65 -0
  423. package/server/utils/safePath.js +26 -0
  424. package/utils/logger/loggerModule.js +35 -0
  425. package/vite.config.mjs +38 -0
@@ -0,0 +1,365 @@
1
+ # Runbook de Evolucao de Banco em Producao (2026 Q1-Q2)
2
+
3
+ Escopo: hardening e evolucao gradual de schema MySQL/InnoDB com foco em rollout online, validacao objetiva e rollback logico por fase.
4
+
5
+ ## Objetivo
6
+
7
+ Definir o processo para aplicar, validar e (quando necessario) reverter as migracoes do ciclo `d0` ate `d34`, minimizando risco de indisponibilidade e regressao de desempenho.
8
+
9
+ ## Arquivos alvo (ordem recomendada)
10
+
11
+ - `database/migrations/20260307_d0_hardening_up.sql`
12
+ - `database/migrations/20260307_d0_hardening_down.sql`
13
+ - `database/migrations/20260307_d1_terms_acceptance_up.sql`
14
+ - `database/migrations/20260307_d1_terms_acceptance_down.sql`
15
+ - `database/migrations/20260307_d2_auth_hardening_up.sql`
16
+ - `database/migrations/20260307_d2_auth_hardening_down.sql`
17
+ - `database/migrations/20260314_d7_canonical_sender_up.sql`
18
+ - `database/migrations/20260314_d7_canonical_sender_down.sql`
19
+ - `database/migrations/20260406_d30_security_analytics_up.sql`
20
+ - `database/migrations/20260406_d30_security_analytics_down.sql`
21
+ - `database/migrations/20260407_d31_web_google_session_token_hardening_up.sql`
22
+ - `database/migrations/20260407_d31_web_google_session_token_hardening_down.sql`
23
+ - `database/migrations/20260408_d32_ai_help_response_cache_up.sql`
24
+ - `database/migrations/20260408_d32_ai_help_response_cache_down.sql`
25
+ - `database/migrations/20260409_d33_ai_learning_tables_up.sql`
26
+ - `database/migrations/20260409_d33_ai_learning_tables_down.sql`
27
+ - `database/migrations/20260410_d34_command_config_enrichment_up.sql`
28
+ - `database/migrations/20260410_d34_command_config_enrichment_down.sql`
29
+
30
+ ## 1) Pre-requisitos
31
+
32
+ 1. Confirmar versao e engine:
33
+
34
+ ```sql
35
+ SELECT VERSION() AS mysql_version;
36
+ ```
37
+
38
+ Recomendado: MySQL `8.0.16+`.
39
+
40
+ 2. Confirmar politica de scheduler:
41
+
42
+ ```sql
43
+ SHOW VARIABLES LIKE 'event_scheduler';
44
+ ```
45
+
46
+ 3. Garantir backup e recuperacao:
47
+
48
+ - backup logico do schema alvo;
49
+ - cadeia PITR (binlog + snapshots);
50
+ - restore testado em homologacao.
51
+
52
+ 4. Postura operacional:
53
+
54
+ - aplicar em janela de menor pressao de escrita;
55
+ - manter aplicacao online quando possivel;
56
+ - monitorar p95/p99 e lock waits durante e apos cada fase.
57
+
58
+ ## 2) Comando padrao de execucao
59
+
60
+ ```bash
61
+ mysql -u"$DB_USER" -p"$DB_PASSWORD" -h"$DB_HOST" "$DB_NAME" < database/migrations/<arquivo>.sql
62
+ ```
63
+
64
+ ## 3) Fases de rollout
65
+
66
+ ### Fase D0 - Hardening nao disruptivo
67
+
68
+ Aplicar:
69
+
70
+ ```bash
71
+ mysql -u"$DB_USER" -p"$DB_PASSWORD" -h"$DB_HOST" "$DB_NAME" < database/migrations/20260307_d0_hardening_up.sql
72
+ ```
73
+
74
+ Validar:
75
+
76
+ ```sql
77
+ SELECT migration_key, phase, status, updated_at
78
+ FROM schema_change_log
79
+ WHERE migration_key = '20260307_d0_hardening';
80
+
81
+ SHOW INDEX FROM messages;
82
+ SHOW INDEX FROM domain_event_outbox;
83
+ SHOW INDEX FROM email_outbox;
84
+ SHOW INDEX FROM sticker_worker_task_queue;
85
+ SHOW INDEX FROM sticker_asset_reprocess_queue;
86
+ ```
87
+
88
+ Rollback:
89
+
90
+ ```bash
91
+ mysql -u"$DB_USER" -p"$DB_PASSWORD" -h"$DB_HOST" "$DB_NAME" < database/migrations/20260307_d0_hardening_down.sql
92
+ ```
93
+
94
+ ### Fase D1 - Aceite de termos versionado
95
+
96
+ Aplicar:
97
+
98
+ ```bash
99
+ mysql -u"$DB_USER" -p"$DB_PASSWORD" -h"$DB_HOST" "$DB_NAME" < database/migrations/20260307_d1_terms_acceptance_up.sql
100
+ ```
101
+
102
+ Validar:
103
+
104
+ ```sql
105
+ SELECT migration_key, phase, status, updated_at
106
+ FROM schema_change_log
107
+ WHERE migration_key = '20260307_d1_terms_acceptance';
108
+
109
+ SHOW TABLES LIKE 'web_terms_acceptance_event';
110
+ SHOW INDEX FROM web_terms_acceptance_event;
111
+ ```
112
+
113
+ Rollback:
114
+
115
+ ```bash
116
+ mysql -u"$DB_USER" -p"$DB_PASSWORD" -h"$DB_HOST" "$DB_NAME" < database/migrations/20260307_d1_terms_acceptance_down.sql
117
+ ```
118
+
119
+ ### Fase D2 - Auth hardening
120
+
121
+ Aplicar:
122
+
123
+ ```bash
124
+ mysql -u"$DB_USER" -p"$DB_PASSWORD" -h"$DB_HOST" "$DB_NAME" < database/migrations/20260307_d2_auth_hardening_up.sql
125
+ ```
126
+
127
+ Validar:
128
+
129
+ ```sql
130
+ SELECT migration_key, phase, status, updated_at
131
+ FROM schema_change_log
132
+ WHERE migration_key = '20260307_d2_auth_hardening';
133
+
134
+ SHOW TABLES LIKE 'web_user_password_login_throttle';
135
+ SHOW COLUMNS FROM web_user_password_recovery_code LIKE 'email_hash';
136
+ SHOW COLUMNS FROM web_user_password_recovery_code LIKE 'requested_ip_hash';
137
+ SHOW COLUMNS FROM web_user_password_recovery_code LIKE 'requested_user_agent_hash';
138
+ SHOW INDEX FROM web_user_password_recovery_code;
139
+ ```
140
+
141
+ Rollback:
142
+
143
+ ```bash
144
+ mysql -u"$DB_USER" -p"$DB_PASSWORD" -h"$DB_HOST" "$DB_NAME" < database/migrations/20260307_d2_auth_hardening_down.sql
145
+ ```
146
+
147
+ ### Fase D+7 - Canonical sender
148
+
149
+ Aplicar:
150
+
151
+ ```bash
152
+ mysql -u"$DB_USER" -p"$DB_PASSWORD" -h"$DB_HOST" "$DB_NAME" < database/migrations/20260314_d7_canonical_sender_up.sql
153
+ ```
154
+
155
+ Validar:
156
+
157
+ ```sql
158
+ SELECT migration_key, phase, status, updated_at
159
+ FROM schema_change_log
160
+ WHERE migration_key = '20260314_d7_canonical_sender';
161
+
162
+ SHOW COLUMNS FROM messages LIKE 'canonical_sender_id';
163
+ SHOW INDEX FROM messages;
164
+
165
+ SELECT COUNT(*) AS null_canonical_sender
166
+ FROM messages
167
+ WHERE canonical_sender_id IS NULL;
168
+ ```
169
+
170
+ Rollback:
171
+
172
+ ```bash
173
+ mysql -u"$DB_USER" -p"$DB_PASSWORD" -h"$DB_HOST" "$DB_NAME" < database/migrations/20260314_d7_canonical_sender_down.sql
174
+ ```
175
+
176
+ ### Fase D+30 - Security analytics e retencao
177
+
178
+ Aplicar:
179
+
180
+ ```bash
181
+ mysql -u"$DB_USER" -p"$DB_PASSWORD" -h"$DB_HOST" "$DB_NAME" < database/migrations/20260406_d30_security_analytics_up.sql
182
+ ```
183
+
184
+ Validar:
185
+
186
+ ```sql
187
+ SELECT migration_key, phase, status, updated_at
188
+ FROM schema_change_log
189
+ WHERE migration_key = '20260406_d30_security_analytics';
190
+
191
+ SHOW COLUMNS FROM web_google_session LIKE 'session_token_hash';
192
+ SHOW INDEX FROM web_google_session;
193
+
194
+ SELECT COUNT(*) AS null_session_hash
195
+ FROM web_google_session
196
+ WHERE session_token_hash IS NULL;
197
+
198
+ SHOW EVENTS
199
+ WHERE Db = DATABASE()
200
+ AND Name IN (
201
+ 'ev_rollup_message_activity_daily',
202
+ 'ev_purge_baileys_event_journal',
203
+ 'ev_purge_message_analysis_event',
204
+ 'ev_purge_web_visit_event',
205
+ 'ev_purge_sticker_pack_interaction_event'
206
+ );
207
+ ```
208
+
209
+ Rollback:
210
+
211
+ ```bash
212
+ mysql -u"$DB_USER" -p"$DB_PASSWORD" -h"$DB_HOST" "$DB_NAME" < database/migrations/20260406_d30_security_analytics_down.sql
213
+ ```
214
+
215
+ ### Fase D+31 - Hardening de token de sessao web
216
+
217
+ Aplicar:
218
+
219
+ ```bash
220
+ mysql -u"$DB_USER" -p"$DB_PASSWORD" -h"$DB_HOST" "$DB_NAME" < database/migrations/20260407_d31_web_google_session_token_hardening_up.sql
221
+ ```
222
+
223
+ Validar:
224
+
225
+ ```sql
226
+ SHOW COLUMNS FROM web_google_session LIKE 'session_token_hash';
227
+
228
+ SELECT COUNT(*) AS inconsistent_rows
229
+ FROM web_google_session
230
+ WHERE session_token_hash IS NULL
231
+ OR session_token <> LOWER(SUBSTRING(HEX(session_token_hash), 1, 36));
232
+ ```
233
+
234
+ Rollback:
235
+
236
+ ```bash
237
+ mysql -u"$DB_USER" -p"$DB_PASSWORD" -h"$DB_HOST" "$DB_NAME" < database/migrations/20260407_d31_web_google_session_token_hardening_down.sql
238
+ ```
239
+
240
+ ### Fase D+32 - Cache de respostas de AI Help
241
+
242
+ Aplicar:
243
+
244
+ ```bash
245
+ mysql -u"$DB_USER" -p"$DB_PASSWORD" -h"$DB_HOST" "$DB_NAME" < database/migrations/20260408_d32_ai_help_response_cache_up.sql
246
+ ```
247
+
248
+ Validar:
249
+
250
+ ```sql
251
+ SHOW TABLES LIKE 'ai_help_response_cache';
252
+ SHOW INDEX FROM ai_help_response_cache;
253
+ ```
254
+
255
+ Rollback:
256
+
257
+ ```bash
258
+ mysql -u"$DB_USER" -p"$DB_PASSWORD" -h"$DB_HOST" "$DB_NAME" < database/migrations/20260408_d32_ai_help_response_cache_down.sql
259
+ ```
260
+
261
+ ### Fase D+33 - Tabelas de aprendizado de IA
262
+
263
+ Aplicar:
264
+
265
+ ```bash
266
+ mysql -u"$DB_USER" -p"$DB_PASSWORD" -h"$DB_HOST" "$DB_NAME" < database/migrations/20260409_d33_ai_learning_tables_up.sql
267
+ ```
268
+
269
+ Validar:
270
+
271
+ ```sql
272
+ SHOW TABLES LIKE 'ai_learning_events';
273
+ SHOW TABLES LIKE 'ai_learned_patterns';
274
+ SHOW TABLES LIKE 'ai_learned_keywords';
275
+ SHOW TABLES LIKE 'ai_question_embeddings';
276
+
277
+ SHOW INDEX FROM ai_learning_events;
278
+ SHOW INDEX FROM ai_learned_patterns;
279
+ SHOW INDEX FROM ai_learned_keywords;
280
+ SHOW INDEX FROM ai_question_embeddings;
281
+ ```
282
+
283
+ Rollback:
284
+
285
+ ```bash
286
+ mysql -u"$DB_USER" -p"$DB_PASSWORD" -h"$DB_HOST" "$DB_NAME" < database/migrations/20260409_d33_ai_learning_tables_down.sql
287
+ ```
288
+
289
+ ### Fase D+34 - Enriquecimento de command config
290
+
291
+ Aplicar:
292
+
293
+ ```bash
294
+ mysql -u"$DB_USER" -p"$DB_PASSWORD" -h"$DB_HOST" "$DB_NAME" < database/migrations/20260410_d34_command_config_enrichment_up.sql
295
+ ```
296
+
297
+ Validar:
298
+
299
+ ```sql
300
+ SHOW TABLES LIKE 'ai_command_config_enrichment_cursor';
301
+ SHOW TABLES LIKE 'ai_command_config_enrichment_suggestion';
302
+ SHOW TABLES LIKE 'ai_command_config_enrichment_state';
303
+
304
+ SHOW INDEX FROM ai_command_config_enrichment_suggestion;
305
+ SHOW INDEX FROM ai_command_config_enrichment_state;
306
+ ```
307
+
308
+ Rollback:
309
+
310
+ ```bash
311
+ mysql -u"$DB_USER" -p"$DB_PASSWORD" -h"$DB_HOST" "$DB_NAME" < database/migrations/20260410_d34_command_config_enrichment_down.sql
312
+ ```
313
+
314
+ ## 4) Checklist de monitoramento (todas as fases)
315
+
316
+ Monitorar por 30-60 minutos apos cada fase:
317
+
318
+ - `Threads_running`, lock waits InnoDB, latencia p95/p99;
319
+ - profundidade de filas (`domain_event_outbox`, `email_outbox`, `sticker_worker_task_queue`);
320
+ - falhas em workers e jobs/event scheduler.
321
+
322
+ Consultas rapidas:
323
+
324
+ ```sql
325
+ SELECT status, COUNT(*) FROM domain_event_outbox GROUP BY status;
326
+ SELECT status, COUNT(*) FROM email_outbox GROUP BY status;
327
+ SELECT status, COUNT(*) FROM sticker_worker_task_queue GROUP BY status;
328
+ ```
329
+
330
+ ## 5) Criterio de avance (go/no-go)
331
+
332
+ Avancar somente se:
333
+
334
+ - migracao atual estiver `applied` (quando registrada em `schema_change_log`);
335
+ - validacoes estruturais e de indice estiverem consistentes;
336
+ - sem degradacao sustentada de erro/latencia.
337
+
338
+ Suspender se houver:
339
+
340
+ - lock waits persistentes;
341
+ - crescimento anomalo de filas sem drenagem;
342
+ - erro de aplicacao relacionado a novas colunas/tabelas.
343
+
344
+ ## 6) Politica de roll-forward
345
+
346
+ Quando rollback nao for necessario e dados estiverem integros:
347
+
348
+ 1. manter a fase aplicada;
349
+ 2. ajustar query/indice no codigo;
350
+ 3. repetir validacoes;
351
+ 4. registrar observacoes em `schema_change_log.notes`.
352
+
353
+ ## 7) Notas de seguranca operacional
354
+
355
+ - DDL no MySQL faz auto-commit. `down` e rollback logico, nao undo transacional.
356
+ - Nao usar `db:init` para migracao em producao.
357
+ - Migracoes aplicadas em producao devem permanecer imutaveis.
358
+
359
+ ## 8) Referencias
360
+
361
+ - MySQL 8.0 DDL: https://dev.mysql.com/doc/refman/8.0/en/sql-data-definition-statements.html
362
+ - MySQL CHECK constraints: https://dev.mysql.com/doc/refman/8.0/en/create-table-check-constraints.html
363
+ - MySQL Event Scheduler: https://dev.mysql.com/doc/refman/8.0/en/event-scheduler.html
364
+ - InnoDB locking: https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html
365
+ - Referencia interna: `database/` e `docs/database/`
@@ -0,0 +1,86 @@
1
+ # Runbook DSAR/LGPD (Direitos do Titular)
2
+
3
+ Data: 2026-03-07
4
+
5
+ ## 1) Objetivo
6
+
7
+ Padronizar resposta para direitos do titular: acesso, correção, exclusão, oposição e portabilidade.
8
+
9
+ ## 2) Canais de entrada
10
+
11
+ - WhatsApp oficial: https://wa.me/559591122954
12
+ - Canal interno de compliance (registro em ticket obrigatório)
13
+
14
+ ## 3) Papéis e responsáveis
15
+
16
+ - DPO/Privacidade (owner do caso): valida base legal e resposta final.
17
+ - Engenharia: localiza dados, executa exportação/correção/exclusão.
18
+ - Segurança: valida risco e cadeia de evidência.
19
+ - Suporte: confirma identidade e comunica status ao titular.
20
+
21
+ ## 4) Prazos operacionais
22
+
23
+ | Tipo de solicitação | Prazo alvo interno |
24
+ | ------------------------------------------ | -------------------- |
25
+ | Confirmação de recebimento | até 2 dias corridos |
26
+ | Acesso/confirmação de tratamento | até 7 dias corridos |
27
+ | Correção | até 7 dias corridos |
28
+ | Exclusão/anonimização (quando cabível) | até 15 dias corridos |
29
+ | Oposição/revisão | até 10 dias corridos |
30
+ | Portabilidade (quando tecnicamente viável) | até 15 dias corridos |
31
+
32
+ Observação: prevalecem prazos legais aplicáveis quando menores.
33
+ Para pedidos enquadrados no art. 19 da LGPD, observar resposta simplificada imediata quando possível e declaração clara/completa em até 15 dias.
34
+
35
+ ## 5) Fluxo operacional
36
+
37
+ 1. Registrar ticket com ID único e timestamp UTC.
38
+ 2. Confirmar identidade mínima do solicitante.
39
+ 3. Classificar direito solicitado e base jurídica.
40
+ 4. Mapear sistemas/tabelas afetadas.
41
+ 5. Executar ação técnica (consulta, ajuste, exclusão, exportação).
42
+ 6. Revisão jurídica/privacidade.
43
+ 7. Responder titular com protocolo e resumo da ação.
44
+ 8. Encerrar com evidências anexas e métricas de SLA.
45
+
46
+ ## 6) Matriz por direito
47
+
48
+ ### 6.1 Acesso
49
+
50
+ - Entregar resumo dos dados tratados e finalidades.
51
+ - Incluir categorias, origem e compartilhamentos principais.
52
+
53
+ ### 6.2 Correção
54
+
55
+ - Corrigir dado incompleto/inexato/desatualizado.
56
+ - Registrar antes/depois e fundamento da alteração.
57
+
58
+ ### 6.3 Exclusão
59
+
60
+ - Eliminar ou anonimizar quando não houver base legal de retenção.
61
+ - Se houver retenção obrigatória, informar bloqueio e justificativa.
62
+
63
+ ### 6.4 Oposição
64
+
65
+ - Avaliar legitimidade do pedido conforme base legal aplicável.
66
+ - Suspender tratamento contestado quando juridicamente cabível.
67
+
68
+ ### 6.5 Portabilidade
69
+
70
+ - Fornecer formato estruturado e interoperável quando tecnicamente viável.
71
+ - Excluir segredos comerciais e dados de terceiros não transferíveis.
72
+
73
+ ## 7) Evidências obrigatórias
74
+
75
+ - ID do ticket, timestamps e responsáveis por etapa.
76
+ - Comprovante de identidade validado.
77
+ - Consulta técnica executada e resultado.
78
+ - Mensagem de resposta final ao titular.
79
+
80
+ ## 8) Escalonamento
81
+
82
+ Escalonar para jurídico + segurança quando houver:
83
+
84
+ - risco de incidente de segurança;
85
+ - pedido envolvendo alto volume de titulares;
86
+ - conflito entre pedido e obrigação legal de retenção.
@@ -0,0 +1,77 @@
1
+ # Runbook de Resposta a Incidentes (LGPD/ANPD)
2
+
3
+ Data: 2026-03-07
4
+ Escopo: segurança, privacidade e continuidade operacional do OmniZap System.
5
+
6
+ ## 1) Objetivo
7
+
8
+ Estabelecer fluxo formal para:
9
+
10
+ - detecção, contenção e erradicação de incidentes;
11
+ - preservação de evidências técnicas e cadeia de custódia;
12
+ - decisão sobre comunicação à ANPD e aos titulares, quando aplicável;
13
+ - registro de lições aprendidas e prevenção de recorrência.
14
+
15
+ ## 2) Classificação inicial de severidade
16
+
17
+ | Severidade | Critério resumido |
18
+ | ---------- | ----------------------------------------------------------------------------------------------------------------------- |
19
+ | Crítica | Exfiltração confirmada de dados/mensagens, indisponibilidade relevante, comprometimento de credenciais administrativas. |
20
+ | Alta | Acesso não autorizado com potencial de dano relevante, impacto regulatório provável. |
21
+ | Média | Falha explorável com restrições relevantes, sem evidência de exfiltração. |
22
+ | Baixa | Evento de baixo impacto, sem risco material imediato. |
23
+
24
+ ## 3) Papéis e responsabilidades
25
+
26
+ - Líder de incidente: coordena resposta e decisões de prioridade.
27
+ - Segurança (SecOps): contenção técnica, coleta de IOC, análise de causa raiz.
28
+ - Produto/Engenharia: correção, rollback, validação e monitoramento pós-correção.
29
+ - Privacidade/Jurídico: análise LGPD, avaliação de risco ao titular, decisão de notificação.
30
+ - Comunicação: preparação de mensagens para clientes, titulares e partes interessadas.
31
+
32
+ ## 4) Fluxo operacional (tempo de referência)
33
+
34
+ 1. T+0 até T+30 min: abrir incidente, classificar severidade e acionar responsáveis.
35
+ 2. T+30 min até T+2 h: isolar vetores, revogar tokens/sessões, aplicar bloqueios emergenciais.
36
+ 3. T+2 h até T+6 h: identificar escopo afetado, coletar evidências e registrar timeline.
37
+ 4. T+6 h até T+24 h: executar correções/migações e validar estabilidade.
38
+ 5. T+24 h em diante: concluir RCA, ações preventivas e relatório final.
39
+
40
+ ## 5) Gatilhos de comunicação à ANPD e titulares
41
+
42
+ Acionar avaliação formal de notificação quando houver, por indício mínimo:
43
+
44
+ - acesso não autorizado a dados pessoais com risco ou dano relevante;
45
+ - exposição de conteúdo integral de mensagens, credenciais ou dados sensíveis;
46
+ - comprometimento em larga escala de contas, grupos ou histórico de comunicação;
47
+ - indisponibilidade relevante com potencial de prejuízo material a titulares/clientes.
48
+
49
+ Critério jurídico: observar a LGPD (Lei nº 13.709/2018, art. 48) e regulamentações vigentes da ANPD.
50
+ Quando aplicável ao controlador, observar o prazo regulatório de 3 (três) dias úteis para comunicação, sem prejuízo de obrigações setoriais específicas.
51
+
52
+ ## 6) Evidências mínimas obrigatórias
53
+
54
+ - linha do tempo do incidente (UTC e horário local);
55
+ - ativos afetados (serviços, banco, endpoints, credenciais);
56
+ - amostras de logs, hashes e identificadores técnicos;
57
+ - decisão técnica e jurídica de notificação (com justificativa);
58
+ - ações de contenção, correção e verificação pós-incidente.
59
+ - conteúdo mínimo da comunicação regulatória (natureza do incidente, categorias/dados afetados, titulares envolvidos, medidas técnicas/administrativas, riscos, motivo de eventual atraso e medidas de mitigação).
60
+
61
+ ## 7) Comunicação e rastreabilidade
62
+
63
+ - toda comunicação deve possuir ID de incidente;
64
+ - manter repositório interno com documentos e decisões;
65
+ - preservar logs de acesso a mensagens, quando aplicável, para auditoria.
66
+
67
+ ## 8) Pós-incidente (obrigatório)
68
+
69
+ 1. Executar reunião de lições aprendidas em até 5 dias úteis.
70
+ 2. Converter causas-raiz em ações com responsável e prazo.
71
+ 3. Atualizar runbooks, controles preventivos e checklist de compliance mensal.
72
+
73
+ ## 9) Referências oficiais
74
+
75
+ - LGPD (Lei nº 13.709/2018): https://www.planalto.gov.br/ccivil_03/_ato2015-2018/2018/lei/l13709.htm
76
+ - ANPD (portal institucional): https://www.gov.br/anpd/pt-br
77
+ - ANPD (comunicado de incidente de segurança - CIS): https://www.gov.br/anpd/pt-br/canais_atendimento/agente-de-tratamento/comunicado-de-incidente-de-seguranca-cis
@@ -0,0 +1,137 @@
1
+ # Runbook de Hardening de Rede (Produção)
2
+
3
+ Data: 2026-03-07
4
+ Escopo: reduzir superfície externa detectada em scan (`22`, `3001`, `8007`) e mitigar risco de DoS por conexões lentas.
5
+
6
+ ## 1) Objetivo operacional
7
+
8
+ - manter externamente acessíveis apenas `22/tcp` (restrito por IP), `80/tcp` e `443/tcp`;
9
+ - impedir exposição pública direta de serviços internos (`3001`, `8007`);
10
+ - endurecer Nginx e SSH;
11
+ - validar remediação por `nmap` externo.
12
+
13
+ ## 2) Fechar portas públicas desnecessárias
14
+
15
+ No host de produção:
16
+
17
+ ```bash
18
+ sudo ufw default deny incoming
19
+ sudo ufw default allow outgoing
20
+ sudo ufw allow 80/tcp
21
+ sudo ufw allow 443/tcp
22
+ sudo ufw allow from <IP_ADMIN>/32 to any port 22 proto tcp
23
+ sudo ufw deny 3001/tcp
24
+ sudo ufw deny 8007/tcp
25
+ sudo ufw --force enable
26
+ sudo ufw status verbose
27
+ ```
28
+
29
+ ## 3) Bind local para serviços internos
30
+
31
+ ### Node (OmniZap)
32
+
33
+ - usar `METRICS_HOST=127.0.0.1` no ambiente de produção;
34
+ - confirmar que o processo não escuta em `0.0.0.0` nas portas internas.
35
+
36
+ ### Uvicorn (porta 8007)
37
+
38
+ Se houver serviço FastAPI/Uvicorn no host, ajustar para loopback:
39
+
40
+ ```ini
41
+ ExecStart=/usr/bin/uvicorn app:app --host 127.0.0.1 --port 8007
42
+ ```
43
+
44
+ Após ajuste:
45
+
46
+ ```bash
47
+ sudo systemctl daemon-reload
48
+ sudo systemctl restart <servico-uvicorn>
49
+ sudo systemctl status <servico-uvicorn> --no-pager
50
+ ```
51
+
52
+ ## 4) Hardening do Nginx (mitigar slow HTTP / slowloris)
53
+
54
+ Criar `/etc/nginx/conf.d/omnizap-hardening.conf`:
55
+
56
+ ```nginx
57
+ server_tokens off;
58
+ client_header_timeout 10s;
59
+ client_body_timeout 10s;
60
+ send_timeout 10s;
61
+ keepalive_timeout 15s;
62
+ reset_timedout_connection on;
63
+
64
+ limit_conn_zone $binary_remote_addr zone=conn_per_ip:10m;
65
+ limit_req_zone $binary_remote_addr zone=req_per_ip:10m rate=20r/s;
66
+ ```
67
+
68
+ No `server` de produção, aplicar:
69
+
70
+ ```nginx
71
+ limit_conn conn_per_ip 40;
72
+ limit_req zone=req_per_ip burst=60 nodelay;
73
+ ```
74
+
75
+ Validar e recarregar:
76
+
77
+ ```bash
78
+ sudo nginx -t
79
+ sudo systemctl reload nginx
80
+ ```
81
+
82
+ ## 5) Hardening de SSH
83
+
84
+ Criar `/etc/ssh/sshd_config.d/omnizap-hardening.conf`:
85
+
86
+ ```sshconfig
87
+ PermitRootLogin no
88
+ PasswordAuthentication no
89
+ KbdInteractiveAuthentication no
90
+ MaxAuthTries 3
91
+ LoginGraceTime 20
92
+ AllowTcpForwarding no
93
+ X11Forwarding no
94
+ ```
95
+
96
+ Validar e reiniciar:
97
+
98
+ ```bash
99
+ sudo sshd -t
100
+ sudo systemctl restart ssh
101
+ ```
102
+
103
+ ## 6) Atualizações de segurança do sistema
104
+
105
+ ```bash
106
+ sudo apt update
107
+ sudo apt full-upgrade -y
108
+ sudo apt autoremove -y
109
+ ```
110
+
111
+ Observação: resultados do `nmap --script vuln` são majoritariamente heurísticos por versão/CPE. A confirmação final deve seguir boletins do fornecedor (Ubuntu/Nginx/OpenSSH) e versão de pacote instalada.
112
+
113
+ ## 7) Checklist de validação final
114
+
115
+ No host:
116
+
117
+ ```bash
118
+ sudo ss -lntp | egrep ':22|:80|:443|:3001|:8007'
119
+ ```
120
+
121
+ De máquina externa:
122
+
123
+ ```bash
124
+ nmap -p 22,80,443,3001,8007 -sV omnizap.shop
125
+ ```
126
+
127
+ Resultado esperado:
128
+
129
+ - `22`, `80`, `443` abertos;
130
+ - `3001` e `8007` filtrados/fechados externamente.
131
+
132
+ ## Referências
133
+
134
+ - Nginx admin guide: https://nginx.org/en/docs/
135
+ - OpenSSH hardening guidelines: https://www.openssh.com/manual.html
136
+ - Ubuntu security notices: https://ubuntu.com/security/notices
137
+ - UFW docs: https://manpages.ubuntu.com/manpages/jammy/en/man8/ufw.8.html