@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,780 @@
1
+ {
2
+ "schema_version": "2.0.0",
3
+ "module": "waifuPicsModule",
4
+ "enabled": true,
5
+ "source_files": ["waifuPicsCommand.js"],
6
+ "defaults": {
7
+ "inheritance_mode": "deep_merge_with_command_overrides",
8
+ "compatibility_mode": "legacy_and_v2_fields",
9
+ "legacy_field_aliases": {
10
+ "descricao": "description",
11
+ "metodos_de_uso": "usage",
12
+ "permissao_necessaria": "permission",
13
+ "local_de_uso": "contexts",
14
+ "informacoes_coletadas": "collected_data",
15
+ "pre_condicoes": "requirements",
16
+ "dependencias_externas": "dependencies",
17
+ "efeitos_colaterais": "side_effects",
18
+ "observabilidade": "observability",
19
+ "privacidade": "privacy",
20
+ "limite_uso_por_plano": "plan_limits",
21
+ "argumentos": "arguments",
22
+ "acesso": "access"
23
+ },
24
+ "command": {
25
+ "enabled": true,
26
+ "category": "anime",
27
+ "version": "1.0.0",
28
+ "stability": "stable",
29
+ "deprecated": false,
30
+ "replaced_by": null,
31
+ "risk_level": "medium"
32
+ },
33
+ "requirements": {
34
+ "require_group": false,
35
+ "require_group_admin": false,
36
+ "require_bot_owner": false,
37
+ "require_google_login": true,
38
+ "require_nsfw_enabled": false,
39
+ "require_media": false,
40
+ "require_reply_message": false,
41
+ "legacy": {
42
+ "requer_grupo": false,
43
+ "requer_admin": false,
44
+ "requer_admin_principal": false,
45
+ "requer_google_login": true,
46
+ "requer_nsfw": false,
47
+ "requer_midia": false,
48
+ "requer_mensagem_respondida": false
49
+ }
50
+ },
51
+ "pre_condicoes": {
52
+ "requer_grupo": false,
53
+ "requer_admin": false,
54
+ "requer_admin_principal": false,
55
+ "requer_google_login": true,
56
+ "requer_nsfw": false,
57
+ "requer_midia": false,
58
+ "requer_mensagem_respondida": false
59
+ },
60
+ "rate_limit": {
61
+ "max": null,
62
+ "janela_ms": null,
63
+ "escopo": "sem_rate_limit_explicito"
64
+ },
65
+ "dependencies": ["Waifu.pics API"],
66
+ "dependencias_externas": ["Waifu.pics API"],
67
+ "responses": {
68
+ "success": "✅ Pedido recebido! Aqui vai sua imagem.\nDica: você pode pedir outra categoria no próximo comando (ex.: <prefix>waifu neko).",
69
+ "usage_error": "❗ Não entendi o formato do comando.\nExemplos:\n• <prefix>waifu neko\n• <prefix>waifunsfw waifu\nPara ver todas as categorias: <prefix>waifuajuda",
70
+ "permission_error": "🔒 Este comando não está liberado para você neste contexto.\nSe for NSFW em grupo, peça para um admin usar <prefix>nsfw on."
71
+ },
72
+ "respostas_padrao": {
73
+ "sucesso": "✅ Pedido recebido! Aqui vai sua imagem.\nDica: você pode pedir outra categoria no próximo comando (ex.: <prefix>waifu neko).",
74
+ "erro_uso": "❗ Não entendi o formato do comando.\nExemplos:\n• <prefix>waifu neko\n• <prefix>waifunsfw waifu\nPara ver todas as categorias: <prefix>waifuajuda",
75
+ "erro_permissao": "🔒 Este comando não está liberado para você neste contexto.\nSe for NSFW em grupo, peça para um admin usar <prefix>nsfw on."
76
+ },
77
+ "observability": {
78
+ "event_name": "command.executed",
79
+ "log_level": "info",
80
+ "tags": ["whatsapp", "command", "waifuPicsModule"]
81
+ },
82
+ "privacy": {
83
+ "data_categories": ["chat_identifier", "sender_identifier", "command_content"],
84
+ "retention_policy": "standard_app_logs",
85
+ "legal_basis": "service_execution_and_legitimate_interest"
86
+ },
87
+ "access": {
88
+ "premium_only": false,
89
+ "allowed_plans": ["comum", "premium"]
90
+ },
91
+ "acesso": {
92
+ "somente_premium": false,
93
+ "planos_permitidos": ["comum", "premium"]
94
+ },
95
+ "plan_limits": {
96
+ "comum": {
97
+ "max": 10,
98
+ "janela_ms": 300000,
99
+ "escopo": "usuario"
100
+ },
101
+ "premium": {
102
+ "max": 35,
103
+ "janela_ms": 300000,
104
+ "escopo": "usuario"
105
+ }
106
+ },
107
+ "limite_uso_por_plano": {
108
+ "comum": {
109
+ "max": 10,
110
+ "janela_ms": 300000,
111
+ "escopo": "usuario"
112
+ },
113
+ "premium": {
114
+ "max": 35,
115
+ "janela_ms": 300000,
116
+ "escopo": "usuario"
117
+ }
118
+ },
119
+ "behavior_templates": {
120
+ "toggle_on_off_status": {
121
+ "type": "toggle",
122
+ "allowed_actions": ["on", "off", "status"],
123
+ "action_argument": "acao"
124
+ },
125
+ "add_remove_list": {
126
+ "type": "list_management",
127
+ "allowed_actions": ["add", "remove", "list"],
128
+ "action_argument": "acao"
129
+ },
130
+ "approve_reject": {
131
+ "type": "moderation_decision",
132
+ "allowed_actions": ["approve", "reject"],
133
+ "action_argument": "acao",
134
+ "requires_targets": true
135
+ },
136
+ "set_status_reset": {
137
+ "type": "configuration_window",
138
+ "allowed_actions": ["set", "status", "reset"],
139
+ "action_argument": "valor"
140
+ }
141
+ }
142
+ },
143
+ "commands": [
144
+ {
145
+ "name": "waifu",
146
+ "aliases": ["waifupics", "wp"],
147
+ "descricao": "Receba uma imagem incrível de anime (SFW)! Escolha uma categoria como 'neko' ou 'waifu'. ✨",
148
+ "metodos_de_uso": ["<prefix>waifu <categoria>", "<prefix>wp neko"],
149
+ "permissao_necessaria": "Livre para todos!",
150
+ "limite_de_uso": "Conforme seu plano de uso.",
151
+ "local_de_uso": ["Privado", "Grupos"],
152
+ "informacoes_coletadas": ["ID do chat", "ID do remetente", "Comando e categoria escolhida"],
153
+ "enabled": true,
154
+ "categoria": "anime",
155
+ "subcomandos": [],
156
+ "argumentos": [
157
+ {
158
+ "nome": "categoria",
159
+ "tipo": "string",
160
+ "obrigatorio": true,
161
+ "validacao": "Categorias seguras (SFW) da Waifu.pics",
162
+ "default": "waifu"
163
+ }
164
+ ],
165
+ "pre_condicoes": {
166
+ "requer_grupo": false,
167
+ "requer_admin": false,
168
+ "requer_admin_principal": false,
169
+ "requer_google_login": true,
170
+ "requer_nsfw": false,
171
+ "requer_midia": false,
172
+ "requer_mensagem_respondida": false
173
+ },
174
+ "rate_limit": {
175
+ "max": null,
176
+ "janela_ms": null,
177
+ "escopo": "sem_rate_limit_explicito"
178
+ },
179
+ "dependencias_externas": ["Waifu.pics API"],
180
+ "efeitos_colaterais": ["consulta API externa", "envia imagem no chat"],
181
+ "respostas_padrao": {
182
+ "sucesso": "✅ Imagem enviada com sucesso!\nExemplo de próximo pedido: <prefix>waifu hug",
183
+ "erro_uso": "❗ Categoria inválida ou ausente.\nExemplos: <prefix>waifu neko | <prefix>wp waifu\nVeja a lista completa em <prefix>waifuajuda.",
184
+ "erro_permissao": "🔒 Não consegui liberar este pedido para seu perfil.\nSe achar que é engano, verifique seu plano e tente novamente."
185
+ },
186
+ "observabilidade": {
187
+ "evento_analytics": "whatsapp_command_wp",
188
+ "tags_log": ["whatsapp", "command", "waifuPicsModule", "wp"],
189
+ "nivel_log": "info"
190
+ },
191
+ "privacidade": {
192
+ "dados_sensiveis": ["identificador do chat", "identificador do remetente", "conteudo textual do comando"],
193
+ "retencao": "conforme políticas de logs, banco de dados e arquivos temporários da aplicação",
194
+ "base_legal": "execução do serviço solicitado e legítimo interesse operacional"
195
+ },
196
+ "capability_keywords": ["waifu", "waifupics", "anime", "privado", "grupo"],
197
+ "faq_patterns": ["como usar waifu", "o que faz waifu", "comando waifu"],
198
+ "user_phrasings": ["quero usar waifu", "me ajuda com waifu", "envia imagem sfw da"],
199
+ "suggestion_priority": 100,
200
+ "acesso": {
201
+ "somente_premium": false,
202
+ "planos_permitidos": ["comum", "premium"]
203
+ },
204
+ "limite_uso_por_plano": {
205
+ "comum": {
206
+ "max": 10,
207
+ "janela_ms": 300000,
208
+ "escopo": "usuario"
209
+ },
210
+ "premium": {
211
+ "max": 35,
212
+ "janela_ms": 300000,
213
+ "escopo": "usuario"
214
+ }
215
+ },
216
+ "mensagens_uso": {
217
+ "default": ["🖼️ *Como usar:* <prefix>waifu <categoria>", "Exemplos rápidos: <prefix>waifu neko | <prefix>wp hug", "Quer ver todas as categorias disponíveis? Use <prefix>waifuajuda."]
218
+ },
219
+ "id": "waifupics.waifu",
220
+ "description": "Receba uma imagem incrível de anime (SFW)! Escolha uma categoria como 'neko' ou 'waifu'. ✨",
221
+ "usage": ["<prefix>waifu <categoria>", "<prefix>wp neko"],
222
+ "docs": {
223
+ "summary": "Busca e envia imagens aleatórias de anime (Safe For Work).",
224
+ "usage_examples": ["<prefix>waifu waifu", "<prefix>wp neko"],
225
+ "usage_variants": {
226
+ "default": ["<prefix>waifu <categoria>", "<prefix>wp neko"]
227
+ }
228
+ },
229
+ "permission": "Livre para todos!",
230
+ "contexts": ["Privado", "Grupos"],
231
+ "collected_data": ["ID do chat", "ID do remetente", "Comando e categoria escolhida"],
232
+ "requirements": {
233
+ "require_group": false,
234
+ "require_group_admin": false,
235
+ "require_bot_owner": false,
236
+ "require_google_login": true,
237
+ "require_nsfw_enabled": false,
238
+ "require_media": false,
239
+ "require_reply_message": false,
240
+ "legacy": {
241
+ "requer_grupo": false,
242
+ "requer_admin": false,
243
+ "requer_admin_principal": false,
244
+ "requer_google_login": true,
245
+ "requer_nsfw": false,
246
+ "requer_midia": false,
247
+ "requer_mensagem_respondida": false
248
+ }
249
+ },
250
+ "arguments": [
251
+ {
252
+ "name": "categoria",
253
+ "type": "string",
254
+ "required": true,
255
+ "default": null,
256
+ "enum": null,
257
+ "description": "categoria SFW suportada",
258
+ "position": 0,
259
+ "accepts_mentions": false,
260
+ "accepts_reply_target": false,
261
+ "greedy": false,
262
+ "validation": "categoria SFW suportada"
263
+ }
264
+ ],
265
+ "behavior": {
266
+ "type": "argument_driven",
267
+ "allowed_actions": []
268
+ },
269
+ "limits": {
270
+ "usage_description": "sem limite especifico",
271
+ "rate_limit": {
272
+ "max": null,
273
+ "janela_ms": null,
274
+ "escopo": "sem_rate_limit_explicito"
275
+ },
276
+ "access": {
277
+ "somente_premium": false,
278
+ "planos_permitidos": ["comum", "premium"]
279
+ },
280
+ "plan_limits": {
281
+ "comum": {
282
+ "max": 10,
283
+ "janela_ms": 300000,
284
+ "escopo": "usuario"
285
+ },
286
+ "premium": {
287
+ "max": 35,
288
+ "janela_ms": 300000,
289
+ "escopo": "usuario"
290
+ }
291
+ }
292
+ },
293
+ "dependencies": ["Waifu.pics API"],
294
+ "side_effects": ["consulta API externa", "envia imagem no chat"],
295
+ "observability": {
296
+ "event_name": "command.executed",
297
+ "event_key": "waifupics.waifu",
298
+ "analytics_event": "whatsapp_command_wp",
299
+ "log_level": "info",
300
+ "tags": ["whatsapp", "command", "waifuPicsModule", "wp"],
301
+ "legacy": {
302
+ "evento_analytics": "whatsapp_command_wp",
303
+ "tags_log": ["whatsapp", "command", "waifuPicsModule", "wp"],
304
+ "nivel_log": "info"
305
+ }
306
+ },
307
+ "privacy": {
308
+ "data_categories": ["chat_identifier", "sender_identifier", "command_content"],
309
+ "sensitive_fields": ["remoteJid", "senderJid", "text", "args"],
310
+ "retention_policy": "standard_app_logs",
311
+ "retention_notes": "conforme políticas de logs, banco de dados e arquivos temporários da aplicação",
312
+ "legal_basis": "service_execution_and_legitimate_interest",
313
+ "legal_basis_notes": "execução do serviço solicitado e legítimo interesse operacional",
314
+ "legacy": {
315
+ "dados_sensiveis": ["identificador do chat", "identificador do remetente", "conteudo textual do comando"],
316
+ "retencao": "conforme políticas de logs, banco de dados e arquivos temporários da aplicação",
317
+ "base_legal": "execução do serviço solicitado e legítimo interesse operacional"
318
+ }
319
+ },
320
+ "discovery": {
321
+ "keywords": ["waifu", "waifupics", "anime", "privado", "grupo"],
322
+ "faq_queries": ["como usar waifu", "o que faz waifu", "comando waifu"],
323
+ "user_phrasings": ["quero usar waifu", "me ajuda com waifu", "envia imagem sfw da"],
324
+ "suggestion_priority": 100
325
+ },
326
+ "access": {
327
+ "premium_only": false,
328
+ "allowed_plans": ["comum", "premium"],
329
+ "legacy": {
330
+ "somente_premium": false,
331
+ "planos_permitidos": ["comum", "premium"]
332
+ }
333
+ },
334
+ "plan_limits": {
335
+ "comum": {
336
+ "max": 10,
337
+ "janela_ms": 300000,
338
+ "escopo": "usuario"
339
+ },
340
+ "premium": {
341
+ "max": 35,
342
+ "janela_ms": 300000,
343
+ "escopo": "usuario"
344
+ }
345
+ },
346
+ "version": "1.0.0",
347
+ "stability": "stable",
348
+ "deprecated": false,
349
+ "replaced_by": null,
350
+ "risk_level": "low",
351
+ "handler": {
352
+ "file": "waifuPicsCommand.js",
353
+ "method": "handleWaifuPicsCommand",
354
+ "command_case": "waifu"
355
+ },
356
+ "compatibility": {
357
+ "schema": "legacy_v1_and_v2",
358
+ "legacy_name": "waifu",
359
+ "legacy_fields_present": ["descricao", "metodos_de_uso", "permissao_necessaria", "local_de_uso", "informacoes_coletadas", "argumentos", "pre_condicoes", "dependencias_externas", "efeitos_colaterais", "observabilidade", "privacidade", "acesso", "limite_uso_por_plano"]
360
+ }
361
+ },
362
+ {
363
+ "name": "waifunsfw",
364
+ "aliases": ["waifupicsnsfw", "wpnsfw"],
365
+ "descricao": "Mande aquela imagem picante (NSFW). Exige que o grupo autorize! 🔞",
366
+ "metodos_de_uso": ["<prefix>waifunsfw <categoria>", "<prefix>wpnsfw waifu"],
367
+ "permissao_necessaria": "Membros em grupos com NSFW ativado.",
368
+ "limite_de_uso": "Restrito a usuários Premium e grupos autorizados.",
369
+ "local_de_uso": ["Privado", "Grupos"],
370
+ "informacoes_coletadas": ["ID do chat", "ID do remetente", "Comando e categoria"],
371
+ "enabled": true,
372
+ "categoria": "anime",
373
+ "subcomandos": [],
374
+ "argumentos": [
375
+ {
376
+ "nome": "categoria",
377
+ "tipo": "string",
378
+ "obrigatorio": true,
379
+ "validacao": "Categorias adultas (NSFW) da Waifu.pics",
380
+ "default": "waifu"
381
+ }
382
+ ],
383
+ "pre_condicoes": {
384
+ "requer_grupo": false,
385
+ "requer_admin": false,
386
+ "requer_admin_principal": false,
387
+ "requer_google_login": true,
388
+ "requer_nsfw": true,
389
+ "requer_midia": false,
390
+ "requer_mensagem_respondida": false
391
+ },
392
+ "rate_limit": {
393
+ "max": null,
394
+ "janela_ms": null,
395
+ "escopo": "sem_rate_limit_explicito"
396
+ },
397
+ "dependencias_externas": ["Waifu.pics API", "configuração de NSFW por grupo"],
398
+ "efeitos_colaterais": ["consulta API externa", "envia imagem NSFW no chat"],
399
+ "respostas_padrao": {
400
+ "sucesso": "🔞 Imagem NSFW enviada.\nExemplo de próximo pedido: <prefix>waifunsfw neko",
401
+ "erro_uso": "❗ Categoria NSFW inválida ou ausente.\nExemplos: <prefix>waifunsfw waifu | <prefix>wpnsfw neko\nVeja opções em <prefix>waifuajuda.",
402
+ "erro_permissao": "🔒 Este comando NSFW exige acesso Premium.\nEm grupos, também é preciso NSFW ativo com <prefix>nsfw on."
403
+ },
404
+ "observabilidade": {
405
+ "evento_analytics": "whatsapp_command_wpnsfw",
406
+ "tags_log": ["whatsapp", "command", "waifuPicsModule", "wpnsfw"],
407
+ "nivel_log": "info"
408
+ },
409
+ "privacidade": {
410
+ "dados_sensiveis": ["identificador do chat", "identificador do remetente", "conteudo textual do comando"],
411
+ "retencao": "conforme políticas de logs, banco de dados e arquivos temporários da aplicação",
412
+ "base_legal": "execução do serviço solicitado e legítimo interesse operacional"
413
+ },
414
+ "capability_keywords": ["waifunsfw", "waifupicsnsfw", "anime", "privado", "grupo"],
415
+ "faq_patterns": ["como usar waifunsfw", "o que faz waifunsfw", "comando waifunsfw"],
416
+ "user_phrasings": ["quero usar waifunsfw", "me ajuda com waifunsfw", "envia imagem nsfw da"],
417
+ "suggestion_priority": 100,
418
+ "acesso": {
419
+ "somente_premium": true,
420
+ "planos_permitidos": ["premium"]
421
+ },
422
+ "limite_uso_por_plano": {
423
+ "comum": {
424
+ "max": 10,
425
+ "janela_ms": 300000,
426
+ "escopo": "usuario"
427
+ },
428
+ "premium": {
429
+ "max": 35,
430
+ "janela_ms": 300000,
431
+ "escopo": "usuario"
432
+ }
433
+ },
434
+ "mensagens_uso": {
435
+ "default": ["🔞 *Como usar:* <prefix>waifunsfw <categoria>", "Exemplos rápidos: <prefix>waifunsfw waifu | <prefix>wpnsfw neko", "Pré-requisitos: plano Premium; em grupo, NSFW ativo com <prefix>nsfw on."]
436
+ },
437
+ "id": "waifupics.waifunsfw",
438
+ "description": "Mande aquela imagem picante (NSFW). Exige que o grupo autorize! 🔞",
439
+ "usage": ["<prefix>waifunsfw <categoria>", "<prefix>wpnsfw waifu"],
440
+ "docs": {
441
+ "summary": "Envia imagens de anime para maiores (Not Safe For Work) se permitido.",
442
+ "usage_examples": ["<prefix>waifunsfw waifu", "<prefix>wpnsfw neko"],
443
+ "usage_variants": {
444
+ "default": ["<prefix>waifunsfw <categoria>", "<prefix>wpnsfw waifu"]
445
+ }
446
+ },
447
+ "permission": "Membros em grupos com NSFW ativado.",
448
+ "contexts": ["Privado", "Grupos"],
449
+ "collected_data": ["ID do chat", "ID do remetente", "Categoria"],
450
+ "requirements": {
451
+ "require_group": false,
452
+ "require_group_admin": false,
453
+ "require_bot_owner": false,
454
+ "require_google_login": true,
455
+ "require_nsfw_enabled": true,
456
+ "require_media": false,
457
+ "require_reply_message": false,
458
+ "legacy": {
459
+ "requer_grupo": false,
460
+ "requer_admin": false,
461
+ "requer_admin_principal": false,
462
+ "requer_google_login": true,
463
+ "requer_nsfw": true,
464
+ "requer_midia": false,
465
+ "requer_mensagem_respondida": false
466
+ }
467
+ },
468
+ "arguments": [
469
+ {
470
+ "name": "categoria",
471
+ "type": "string",
472
+ "required": true,
473
+ "default": null,
474
+ "enum": null,
475
+ "description": "categoria NSFW suportada",
476
+ "position": 0,
477
+ "accepts_mentions": false,
478
+ "accepts_reply_target": false,
479
+ "greedy": false,
480
+ "validation": "categoria NSFW suportada"
481
+ }
482
+ ],
483
+ "behavior": {
484
+ "type": "argument_driven",
485
+ "allowed_actions": []
486
+ },
487
+ "limits": {
488
+ "usage_description": "depende de configuracao global e do grupo",
489
+ "rate_limit": {
490
+ "max": null,
491
+ "janela_ms": null,
492
+ "escopo": "sem_rate_limit_explicito"
493
+ },
494
+ "access": {
495
+ "somente_premium": true,
496
+ "planos_permitidos": ["premium"]
497
+ },
498
+ "plan_limits": {
499
+ "comum": {
500
+ "max": 10,
501
+ "janela_ms": 300000,
502
+ "escopo": "usuario"
503
+ },
504
+ "premium": {
505
+ "max": 35,
506
+ "janela_ms": 300000,
507
+ "escopo": "usuario"
508
+ }
509
+ }
510
+ },
511
+ "dependencies": ["Waifu.pics API", "configuração de NSFW por grupo"],
512
+ "side_effects": ["consulta API externa", "envia imagem NSFW no chat"],
513
+ "observability": {
514
+ "event_name": "command.executed",
515
+ "event_key": "waifupics.waifunsfw",
516
+ "analytics_event": "whatsapp_command_wpnsfw",
517
+ "log_level": "info",
518
+ "tags": ["whatsapp", "command", "waifuPicsModule", "wpnsfw"],
519
+ "legacy": {
520
+ "evento_analytics": "whatsapp_command_wpnsfw",
521
+ "tags_log": ["whatsapp", "command", "waifuPicsModule", "wpnsfw"],
522
+ "nivel_log": "info"
523
+ }
524
+ },
525
+ "privacy": {
526
+ "data_categories": ["chat_identifier", "sender_identifier", "command_content"],
527
+ "sensitive_fields": ["remoteJid", "senderJid", "text", "args"],
528
+ "retention_policy": "standard_app_logs",
529
+ "retention_notes": "conforme políticas de logs, banco de dados e arquivos temporários da aplicação",
530
+ "legal_basis": "service_execution_and_legitimate_interest",
531
+ "legal_basis_notes": "execução do serviço solicitado e legítimo interesse operacional",
532
+ "legacy": {
533
+ "dados_sensiveis": ["identificador do chat", "identificador do remetente", "conteudo textual do comando"],
534
+ "retencao": "conforme políticas de logs, banco de dados e arquivos temporários da aplicação",
535
+ "base_legal": "execução do serviço solicitado e legítimo interesse operacional"
536
+ }
537
+ },
538
+ "discovery": {
539
+ "keywords": ["waifunsfw", "waifupicsnsfw", "anime", "privado", "grupo"],
540
+ "faq_queries": ["como usar waifunsfw", "o que faz waifunsfw", "comando waifunsfw"],
541
+ "user_phrasings": ["quero usar waifunsfw", "me ajuda com waifunsfw", "envia imagem nsfw da"],
542
+ "suggestion_priority": 100
543
+ },
544
+ "access": {
545
+ "premium_only": true,
546
+ "allowed_plans": ["premium"],
547
+ "legacy": {
548
+ "somente_premium": true,
549
+ "planos_permitidos": ["premium"]
550
+ }
551
+ },
552
+ "plan_limits": {
553
+ "comum": {
554
+ "max": 10,
555
+ "janela_ms": 300000,
556
+ "escopo": "usuario"
557
+ },
558
+ "premium": {
559
+ "max": 35,
560
+ "janela_ms": 300000,
561
+ "escopo": "usuario"
562
+ }
563
+ },
564
+ "version": "1.0.0",
565
+ "stability": "stable",
566
+ "deprecated": false,
567
+ "replaced_by": null,
568
+ "risk_level": "low",
569
+ "handler": {
570
+ "file": "waifuPicsCommand.js",
571
+ "method": "handleWaifuPicsCommand",
572
+ "command_case": "waifunsfw"
573
+ },
574
+ "compatibility": {
575
+ "schema": "legacy_v1_and_v2",
576
+ "legacy_name": "waifunsfw",
577
+ "legacy_fields_present": ["descricao", "metodos_de_uso", "permissao_necessaria", "local_de_uso", "informacoes_coletadas", "argumentos", "pre_condicoes", "dependencias_externas", "efeitos_colaterais", "observabilidade", "privacidade", "acesso", "limite_uso_por_plano"]
578
+ }
579
+ },
580
+ {
581
+ "name": "waifuajuda",
582
+ "aliases": ["wppicshelp"],
583
+ "descricao": "Veja todas as categorias de fotos anime que eu posso te enviar! 📖",
584
+ "metodos_de_uso": ["<prefix>waifuajuda"],
585
+ "permissao_necessaria": "Livre para todos!",
586
+ "limite_de_uso": "Baixo consumo de recursos.",
587
+ "local_de_uso": ["Privado", "Grupos"],
588
+ "informacoes_coletadas": ["ID do chat", "ID do remetente"],
589
+ "enabled": true,
590
+ "categoria": "anime",
591
+ "subcomandos": [],
592
+ "argumentos": [],
593
+ "pre_condicoes": {
594
+ "requer_grupo": false,
595
+ "requer_admin": false,
596
+ "requer_admin_principal": false,
597
+ "requer_google_login": true,
598
+ "requer_nsfw": false,
599
+ "requer_midia": false,
600
+ "requer_mensagem_respondida": false
601
+ },
602
+ "rate_limit": {
603
+ "max": null,
604
+ "janela_ms": null,
605
+ "escopo": "sem_rate_limit_explicito"
606
+ },
607
+ "dependencias_externas": ["Waifu.pics API"],
608
+ "efeitos_colaterais": ["envia mensagem de ajuda"],
609
+ "respostas_padrao": {
610
+ "sucesso": "📚 Guia enviado com sucesso.\nAgora experimente: <prefix>waifu neko",
611
+ "erro_uso": "ℹ️ Este comando não precisa de argumentos.\nUse apenas: <prefix>waifuajuda",
612
+ "erro_permissao": "🔒 Não consegui mostrar o guia neste contexto.\nTente novamente no privado ou em um grupo permitido."
613
+ },
614
+ "observabilidade": {
615
+ "evento_analytics": "whatsapp_command_wppicshelp",
616
+ "tags_log": ["whatsapp", "command", "waifuPicsModule", "wppicshelp"],
617
+ "nivel_log": "info"
618
+ },
619
+ "privacidade": {
620
+ "dados_sensiveis": ["identificador do chat", "identificador do remetente", "conteudo textual do comando"],
621
+ "retencao": "conforme políticas de logs, banco de dados e arquivos temporários da aplicação",
622
+ "base_legal": "execução do serviço solicitado e legítimo interesse operacional"
623
+ },
624
+ "capability_keywords": ["waifuajuda", "anime", "privado", "grupo"],
625
+ "faq_patterns": ["como usar waifuajuda", "o que faz waifuajuda", "comando waifuajuda"],
626
+ "user_phrasings": ["quero usar waifuajuda", "me ajuda com waifuajuda", "mostra ajuda e categorias"],
627
+ "suggestion_priority": 100,
628
+ "acesso": {
629
+ "somente_premium": false,
630
+ "planos_permitidos": ["comum", "premium"]
631
+ },
632
+ "limite_uso_por_plano": {
633
+ "comum": {
634
+ "max": 10,
635
+ "janela_ms": 300000,
636
+ "escopo": "usuario"
637
+ },
638
+ "premium": {
639
+ "max": 35,
640
+ "janela_ms": 300000,
641
+ "escopo": "usuario"
642
+ }
643
+ },
644
+ "mensagens_uso": {
645
+ "default": ["📖 *Como usar:* <prefix>waifuajuda", "Depois do guia, teste: <prefix>waifu neko", "Para NSFW: <prefix>waifunsfw waifu (Premium; em grupo exige <prefix>nsfw on)."]
646
+ },
647
+ "id": "waifupics.waifuajuda",
648
+ "description": "Veja todas as categorias de fotos anime que eu posso te enviar! 📖",
649
+ "usage": ["<prefix>waifuajuda"],
650
+ "docs": {
651
+ "summary": "Exibe o menu de ajuda detalhado do módulo Waifu.pics com todas as categorias.",
652
+ "usage_examples": ["<prefix>waifuajuda"],
653
+ "usage_variants": {
654
+ "default": ["<prefix>waifuajuda"]
655
+ }
656
+ },
657
+ "permission": "Livre para todos!",
658
+ "contexts": ["Privado", "Grupos"],
659
+ "collected_data": ["ID do chat", "ID do remetente"],
660
+ "requirements": {
661
+ "require_group": false,
662
+ "require_group_admin": false,
663
+ "require_bot_owner": false,
664
+ "require_google_login": true,
665
+ "require_nsfw_enabled": false,
666
+ "require_media": false,
667
+ "require_reply_message": false,
668
+ "legacy": {
669
+ "requer_grupo": false,
670
+ "requer_admin": false,
671
+ "requer_admin_principal": false,
672
+ "requer_google_login": true,
673
+ "requer_nsfw": false,
674
+ "requer_midia": false,
675
+ "requer_mensagem_respondida": false
676
+ }
677
+ },
678
+ "arguments": [],
679
+ "behavior": {
680
+ "type": "simple_action",
681
+ "allowed_actions": []
682
+ },
683
+ "limits": {
684
+ "usage_description": "sem limite especifico",
685
+ "rate_limit": {
686
+ "max": null,
687
+ "janela_ms": null,
688
+ "escopo": "sem_rate_limit_explicito"
689
+ },
690
+ "access": {
691
+ "somente_premium": false,
692
+ "planos_permitidos": ["comum", "premium"]
693
+ },
694
+ "plan_limits": {
695
+ "comum": {
696
+ "max": 10,
697
+ "janela_ms": 300000,
698
+ "escopo": "usuario"
699
+ },
700
+ "premium": {
701
+ "max": 35,
702
+ "janela_ms": 300000,
703
+ "escopo": "usuario"
704
+ }
705
+ }
706
+ },
707
+ "dependencies": ["Waifu.pics API"],
708
+ "side_effects": ["envia mensagem de ajuda"],
709
+ "observability": {
710
+ "event_name": "command.executed",
711
+ "event_key": "waifupics.waifuajuda",
712
+ "analytics_event": "whatsapp_command_wppicshelp",
713
+ "log_level": "info",
714
+ "tags": ["whatsapp", "command", "waifuPicsModule", "wppicshelp"],
715
+ "legacy": {
716
+ "evento_analytics": "whatsapp_command_wppicshelp",
717
+ "tags_log": ["whatsapp", "command", "waifuPicsModule", "wppicshelp"],
718
+ "nivel_log": "info"
719
+ }
720
+ },
721
+ "privacy": {
722
+ "data_categories": ["chat_identifier", "sender_identifier", "command_content"],
723
+ "sensitive_fields": ["remoteJid", "senderJid", "text", "args"],
724
+ "retention_policy": "standard_app_logs",
725
+ "retention_notes": "conforme políticas de logs, banco de dados e arquivos temporários da aplicação",
726
+ "legal_basis": "service_execution_and_legitimate_interest",
727
+ "legal_basis_notes": "execução do serviço solicitado e legítimo interesse operacional",
728
+ "legacy": {
729
+ "dados_sensiveis": ["identificador do chat", "identificador do remetente", "conteudo textual do comando"],
730
+ "retencao": "conforme políticas de logs, banco de dados e arquivos temporários da aplicação",
731
+ "base_legal": "execução do serviço solicitado e legítimo interesse operacional"
732
+ }
733
+ },
734
+ "discovery": {
735
+ "keywords": ["waifuajuda", "anime", "privado", "grupo"],
736
+ "faq_queries": ["como usar waifuajuda", "o que faz waifuajuda", "comando waifuajuda"],
737
+ "user_phrasings": ["quero usar waifuajuda", "me ajuda com waifuajuda", "mostra ajuda e categorias"],
738
+ "suggestion_priority": 100
739
+ },
740
+ "access": {
741
+ "premium_only": false,
742
+ "allowed_plans": ["comum", "premium"],
743
+ "legacy": {
744
+ "somente_premium": false,
745
+ "planos_permitidos": ["comum", "premium"]
746
+ }
747
+ },
748
+ "plan_limits": {
749
+ "comum": {
750
+ "max": 10,
751
+ "janela_ms": 300000,
752
+ "escopo": "usuario"
753
+ },
754
+ "premium": {
755
+ "max": 35,
756
+ "janela_ms": 300000,
757
+ "escopo": "usuario"
758
+ }
759
+ },
760
+ "version": "1.0.0",
761
+ "stability": "stable",
762
+ "deprecated": false,
763
+ "replaced_by": null,
764
+ "risk_level": "low",
765
+ "handler": {
766
+ "file": "waifuPicsCommand.js",
767
+ "method": "getWaifuPicsUsageText",
768
+ "command_case": "waifuajuda"
769
+ },
770
+ "compatibility": {
771
+ "schema": "legacy_v1_and_v2",
772
+ "legacy_name": "waifuajuda",
773
+ "legacy_fields_present": ["descricao", "metodos_de_uso", "permissao_necessaria", "local_de_uso", "informacoes_coletadas", "argumentos", "pre_condicoes", "dependencias_externas", "efeitos_colaterais", "observabilidade", "privacidade", "acesso", "limite_uso_por_plano"]
774
+ }
775
+ }
776
+ ],
777
+ "textos": {
778
+ "usage_header": "🎨 *Menu de Fotos Anime (Waifu.pics)*\n\nOlá! Escolha uma categoria abaixo para receber uma imagem aleatória. ✨"
779
+ }
780
+ }