@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,547 @@
1
+ # AiModule Agent Guide
2
+
3
+ Este arquivo e destinado a agentes de IA para gerar respostas no contexto dos comandos deste modulo.
4
+
5
+ ## Fonte de Verdade
6
+
7
+ - arquivo_base: `app/modules/aiModule/commandConfig.json`
8
+ - schema_version: `2.0.0`
9
+ - module_enabled: `true`
10
+ - generated_at: `2026-03-11T02:35:17.177Z`
11
+
12
+ ## Escopo do Modulo
13
+
14
+ - module: `aiModule`
15
+ - source_files:
16
+ - catCommand.js
17
+ - total_commands: `3`
18
+ - total_enabled_commands: `3`
19
+
20
+ ## Defaults Schema v2
21
+
22
+ - inheritance_mode: deep_merge_with_command_overrides
23
+ - compatibility_mode: legacy_and_v2_fields
24
+ - legacy_field_aliases:
25
+ - descricao: description
26
+ - metodos_de_uso: usage
27
+ - permissao_necessaria: permission
28
+ - local_de_uso: contexts
29
+ - informacoes_coletadas: collected_data
30
+ - pre_condicoes: requirements
31
+ - dependencias_externas: dependencies
32
+ - efeitos_colaterais: side_effects
33
+ - observabilidade: observability
34
+ - privacidade: privacy
35
+ - limite_uso_por_plano: plan_limits
36
+ - argumentos: arguments
37
+ - acesso: access
38
+ - defaults.command:
39
+ - enabled: true
40
+ - category: ia
41
+ - version: 1.0.0
42
+ - stability: stable
43
+ - deprecated: false
44
+ - replaced_by: null
45
+ - risk_level: medium
46
+ - defaults.requirements (legacy view):
47
+ - requer_grupo: nao
48
+ - requer_admin: nao
49
+ - requer_admin_principal: nao
50
+ - requer_google_login: sim
51
+ - requer_nsfw: nao
52
+ - requer_midia: nao
53
+ - requer_mensagem_respondida: nao
54
+
55
+ ## Protocolo de Resposta para IA
56
+
57
+ - Passo 1: identificar comando pelo token apos o prefixo.
58
+ - Passo 2: resolver alias para nome canonico usando campo `aliases`.
59
+ - Passo 3: validar `enabled`, `pre_condicoes`, permissao e local de uso.
60
+ - Passo 4: se houver erro de uso, responder com `mensagens_uso` (quando existir) ou `metodos_de_uso`.
61
+ - Passo 5: seguir `respostas_padrao` como fallback de texto.
62
+ - Passo 6: considerar `informacoes_coletadas`, `privacidade` e `observabilidade` ao elaborar resposta.
63
+
64
+ ## Regras de Seguranca para IA
65
+
66
+ - A IA orienta, mas nao executa acao administrativa automaticamente.
67
+ - Nao inventar comandos, subcomandos ou permissao fora do JSON.
68
+ - Sempre informar onde pode usar (grupo/privado) e quem pode usar.
69
+ - Em duvida de permissao, responder com orientacao conservadora.
70
+
71
+ ## Catalogo de Comandos
72
+
73
+ ### ia
74
+
75
+ - id: ai.ia
76
+ - aliases: cat
77
+ - enabled: true
78
+ - categoria: ia
79
+ - descricao: Perguntas para IA com suporte opcional a resposta em audio.
80
+ - permissao_necessaria: usuario comum
81
+ - version: 1.0.0
82
+ - stability: stable
83
+ - deprecated: nao
84
+ - risk_level: low
85
+ - local_de_uso:
86
+ - privado
87
+ - grupo
88
+ - metodos_de_uso:
89
+ - <prefix>ia sua pergunta
90
+ - <prefix>ia --audio sua pergunta
91
+ - mensagens_uso (variantes):
92
+ - default:
93
+ - _<prefix>ia_ [--audio] sua pergunta
94
+ - _<prefix>ia_ (responda ou envie uma imagem com legenda)
95
+ - Opções:
96
+ - --audio | --texto
97
+ - --detail low | high | auto
98
+ - Exemplo:
99
+ - _<prefix>ia_ Explique como funciona a fotossíntese.
100
+ - _<prefix>ia_ --audio Resuma a imagem.
101
+ - subcomandos:
102
+ - (nenhum)
103
+ - argumentos:
104
+ - prompt | tipo: string | opcional | validacao: texto livre; pode usar contexto de mídia | default: null | posicao: 0
105
+ - flags | tipo: array | opcional | validacao: aliases de áudio/texto suportados | default: null | posicao: 1
106
+ - pre_condicoes:
107
+ - requer_grupo: nao
108
+ - requer_admin: nao
109
+ - requer_admin_principal: nao
110
+ - requer_google_login: sim
111
+ - requer_nsfw: nao
112
+ - requer_midia: nao
113
+ - requer_mensagem_respondida: nao
114
+ - rate_limit:
115
+ - max: null
116
+ - janela_ms: null
117
+ - escopo: sem_rate_limit_explicito
118
+ - acesso:
119
+ - somente_premium: nao
120
+ - planos_permitidos: comum, premium
121
+ - limite_uso_por_plano:
122
+ - comum: max=8, janela_ms=300000, escopo=usuario
123
+ - premium: max=40, janela_ms=300000, escopo=usuario
124
+ - informacoes_coletadas:
125
+ - identificador do chat (remoteJid)
126
+ - identificador do remetente (senderJid)
127
+ - texto do comando e argumentos
128
+ - contexto da mensagem (citacao e mencoes, quando existir)
129
+ - prompt textual enviado ao modelo de IA
130
+ - flags de resposta (ex.: audio/voz)
131
+ - midia anexada/citada para analise multimodal (quando houver)
132
+ - identidade do usuario para sessao e contexto de conversa
133
+ - dependencias_externas:
134
+ - OpenAI API
135
+ - efeitos_colaterais:
136
+ - envia resposta textual/áudio de IA
137
+ - respostas_padrao:
138
+ - success: Comando executado com sucesso.
139
+ - usage_error: Formato de uso inválido. Consulte metodos_de_uso.
140
+ - permission_error: Permissão insuficiente para executar este comando.
141
+ - sucesso: Comando executado com sucesso.
142
+ - erro_uso: Formato de uso inválido. Consulte metodos_de_uso.
143
+ - erro_permissao: Permissão insuficiente para executar este comando.
144
+ - mensagens_sistema:
145
+ - premium*only: ⭐ \_Comando Premium*
146
+
147
+ Este comando é exclusivo para usuários premium.
148
+ Fale com o administrador para liberar o acesso.
149
+
150
+ - openai*nao_configurada: ⚠️ \_OpenAI não configurada*
151
+
152
+ Defina a variável _OPENAI_API_KEY_ no `.env` para usar o comando _cat_.
153
+
154
+ - imagem_muito_grande: ⚠️ A imagem enviada ultrapassa o limite de {{limite_mb}} MB. Envie uma imagem menor.
155
+ - imagem_download_falhou: ⚠️ Não consegui baixar a imagem. Tente reenviar.
156
+ - resposta_vazia: ⚠️ Não consegui gerar uma resposta agora. Tente novamente.
157
+ - audio_muito_longo: ⚠️ A resposta ficou longa demais para áudio. Enviando em texto.
158
+ - audio_falhou: ⚠️ Não consegui gerar o áudio agora. Enviando texto.
159
+ - erro*openai: ❌ \_Erro ao falar com a IA*
160
+ Tente novamente em alguns instantes.
161
+ - limites_operacionais:
162
+ - (nao informado)
163
+ - opcoes:
164
+ - toggle_on_off_status.type: toggle
165
+ - toggle_on_off_status.allowed_actions: on, off, status
166
+ - toggle_on_off_status.action_argument: acao
167
+ - add_remove_list.type: list_management
168
+ - add_remove_list.allowed_actions: add, remove, list
169
+ - add_remove_list.action_argument: acao
170
+ - approve_reject.type: moderation_decision
171
+ - approve_reject.allowed_actions: approve, reject
172
+ - approve_reject.action_argument: acao
173
+ - approve_reject.requires_targets: true
174
+ - set_status_reset.type: configuration_window
175
+ - set_status_reset.allowed_actions: set, status, reset
176
+ - set_status_reset.action_argument: valor
177
+ - parse.audio_flags: --audio, --voz, --voice, --tts, -a
178
+ - parse.text_flags: --texto, --text, --txt
179
+ - parse.image_detail_aliases.low: low
180
+ - parse.image_detail_aliases.high: high
181
+ - parse.image_detail_aliases.auto: auto
182
+ - parse.image_detail_aliases.baixo: low
183
+ - parse.image_detail_aliases.baixa: low
184
+ - parse.image_detail_aliases.alto: high
185
+ - parse.image_detail_aliases.alta: high
186
+ - parse.image_detail_aliases.automatico: auto
187
+ - parse.image_detail_aliases.automático: auto
188
+ - observabilidade:
189
+ - event_name: command.executed
190
+ - analytics_event: whatsapp_command_cat
191
+ - tags_log: whatsapp, command, aiModule, cat
192
+ - nivel_log: info
193
+ - privacidade:
194
+ - dados_sensiveis:
195
+ - chat_identifier
196
+ - sender_identifier
197
+ - command_content
198
+ - retencao: standard_app_logs
199
+ - base_legal: service_execution_and_legitimate_interest
200
+ - docs:
201
+ - summary: Perguntas para IA com suporte opcional a resposta em audio.
202
+ - usage_examples: <prefix>ia sua pergunta, <prefix>ia --audio sua pergunta
203
+ - usage*variants.default: *<prefix>ia* [--audio] sua pergunta, *<prefix>ia* (responda ou envie uma imagem com legenda), , Opções:, --audio | --texto, --detail low | high | auto, , Exemplo:, *<prefix>ia* Explique como funciona a fotossíntese., *<prefix>ia\_ --audio Resuma a imagem.
204
+ - behavior:
205
+ - type: argument_driven
206
+ - allowed_actions: (nenhum)
207
+ - limits:
208
+ - usage_description: texto sujeito a limites da API
209
+ - rate_limit.max: null
210
+ - rate_limit.janela_ms: null
211
+ - rate_limit.escopo: sem_rate_limit_explicito
212
+ - access.somente_premium: false
213
+ - access.planos_permitidos: comum, premium
214
+ - plan_limits.comum.max: 8
215
+ - plan_limits.comum.janela_ms: 300000
216
+ - plan_limits.comum.escopo: usuario
217
+ - plan_limits.premium.max: 40
218
+ - plan_limits.premium.janela_ms: 300000
219
+ - plan_limits.premium.escopo: usuario
220
+ - discovery:
221
+ - keywords: ia, ia, privado, grupo
222
+ - faq_queries: como usar ia, o que faz ia, comando ia
223
+ - user_phrasings: quero usar ia, me ajuda com ia, perguntas para ia com
224
+ - suggestion_priority: 100
225
+ - handler:
226
+ - file: catCommand.js
227
+ - method: handleCatCommand
228
+ - command_case: ia
229
+
230
+ ### iaimagem
231
+
232
+ - id: ai.iaimagem
233
+ - aliases: catimage, catimg
234
+ - enabled: true
235
+ - categoria: ia
236
+ - descricao: Gera/edita imagem com IA por prompt.
237
+ - permissao_necessaria: usuario comum
238
+ - version: 1.0.0
239
+ - stability: stable
240
+ - deprecated: nao
241
+ - risk_level: low
242
+ - local_de_uso:
243
+ - privado
244
+ - grupo
245
+ - metodos_de_uso:
246
+ - <prefix>iaimagem seu prompt
247
+ - <prefix>iaimagem --size 1536x1024 seu prompt
248
+ - mensagens_uso (variantes):
249
+ - default:
250
+ - _<prefix>iaimagem_ seu prompt
251
+ - _<prefix>iaimagem_ (responda uma imagem com legenda para editar)
252
+ - Opções:
253
+ - --size 1024x1024 | 1024x1536 | 1536x1024 | auto
254
+ - --quality low | medium | high | auto
255
+ - --format png | jpeg | webp
256
+ - --background transparent | opaque | auto
257
+ - --compression 0-100
258
+ - Exemplo:
259
+ - _<prefix>iaimagem_ --size 1536x1024 Um gato astronauta em aquarela.
260
+ - subcomandos:
261
+ - (nenhum)
262
+ - argumentos:
263
+ - prompt | tipo: string | opcional | validacao: texto livre para gerar/editar imagem | default: null | posicao: 0
264
+ - size | tipo: string | opcional | validacao: auto|1024x1024|1024x1536|1536x1024 | default: null | posicao: 1
265
+ - quality | tipo: string | opcional | validacao: auto|low|medium|high | default: null | posicao: 2
266
+ - format | tipo: string | opcional | validacao: png|jpeg|webp | default: null | posicao: 3
267
+ - pre_condicoes:
268
+ - requer_grupo: nao
269
+ - requer_admin: nao
270
+ - requer_admin_principal: nao
271
+ - requer_google_login: sim
272
+ - requer_nsfw: nao
273
+ - requer_midia: nao
274
+ - requer_mensagem_respondida: nao
275
+ - rate_limit:
276
+ - max: null
277
+ - janela_ms: null
278
+ - escopo: sem_rate_limit_explicito
279
+ - acesso:
280
+ - somente_premium: sim
281
+ - planos_permitidos: premium
282
+ - limite_uso_por_plano:
283
+ - comum: max=8, janela_ms=300000, escopo=usuario
284
+ - premium: max=40, janela_ms=300000, escopo=usuario
285
+ - informacoes_coletadas:
286
+ - identificador do chat (remoteJid)
287
+ - identificador do remetente (senderJid)
288
+ - texto do comando e argumentos
289
+ - contexto da mensagem (citacao e mencoes, quando existir)
290
+ - prompt de geracao/edicao de imagem
291
+ - opcoes de geracao (size, quality, format, background)
292
+ - imagem enviada/citada para edicao (quando houver)
293
+ - dependencias_externas:
294
+ - OpenAI API
295
+ - efeitos_colaterais:
296
+ - envia imagem gerada/editada por IA
297
+ - respostas_padrao:
298
+ - success: Comando executado com sucesso.
299
+ - usage_error: Formato de uso inválido. Consulte metodos_de_uso.
300
+ - permission_error: Permissão insuficiente para executar este comando.
301
+ - sucesso: Comando executado com sucesso.
302
+ - erro_uso: Formato de uso inválido. Consulte metodos_de_uso.
303
+ - erro_permissao: Permissão insuficiente para executar este comando.
304
+ - mensagens_sistema:
305
+ - premium*only: ⭐ \_Comando Premium*
306
+
307
+ Este comando é exclusivo para usuários premium.
308
+ Fale com o administrador para liberar o acesso.
309
+
310
+ - openai*nao_configurada: ⚠️ \_OpenAI não configurada*
311
+
312
+ Defina a variável _OPENAI_API_KEY_ no `.env` para usar o comando _catimg_.
313
+
314
+ - imagem_muito_grande: ⚠️ A imagem enviada ultrapassa o limite de {{limite_mb}} MB. Envie uma imagem menor.
315
+ - imagem_download_falhou: ⚠️ Não consegui baixar a imagem. Tente reenviar.
316
+ - opcoes_invalidas: ⚠️ Opções inválidas no comando.
317
+ Detalhes: {{detalhes}}
318
+
319
+ Use _{{prefix}}catimg_ sem opções para ver o formato correto.
320
+
321
+ - resposta_vazia: ⚠️ Não consegui gerar a imagem agora. Tente novamente.
322
+ - erro*openai: ❌ \_Erro ao falar com a IA*
323
+ Tente novamente em alguns instantes.
324
+ - limites_operacionais:
325
+ - (nao informado)
326
+ - opcoes:
327
+ - toggle_on_off_status.type: toggle
328
+ - toggle_on_off_status.allowed_actions: on, off, status
329
+ - toggle_on_off_status.action_argument: acao
330
+ - add_remove_list.type: list_management
331
+ - add_remove_list.allowed_actions: add, remove, list
332
+ - add_remove_list.action_argument: acao
333
+ - approve_reject.type: moderation_decision
334
+ - approve_reject.allowed_actions: approve, reject
335
+ - approve_reject.action_argument: acao
336
+ - approve_reject.requires_targets: true
337
+ - set_status_reset.type: configuration_window
338
+ - set_status_reset.allowed_actions: set, status, reset
339
+ - set_status_reset.action_argument: valor
340
+ - geracao_imagem.size_options: auto, 1024x1024, 1024x1536, 1536x1024
341
+ - geracao_imagem.size_aliases.1024: 1024x1024
342
+ - geracao_imagem.size_aliases.square: 1024x1024
343
+ - geracao_imagem.size_aliases.quadrado: 1024x1024
344
+ - geracao_imagem.size_aliases.portrait: 1024x1536
345
+ - geracao_imagem.size_aliases.retrato: 1024x1536
346
+ - geracao_imagem.size_aliases.landscape: 1536x1024
347
+ - geracao_imagem.size_aliases.paisagem: 1536x1024
348
+ - geracao_imagem.size_aliases.auto: auto
349
+ - geracao_imagem.quality_options: auto, low, medium, high
350
+ - geracao_imagem.quality_aliases.baixa: low
351
+ - geracao_imagem.quality_aliases.baixo: low
352
+ - geracao_imagem.quality_aliases.media: medium
353
+ - geracao_imagem.quality_aliases.média: medium
354
+ - geracao_imagem.quality_aliases.medio: medium
355
+ - geracao_imagem.quality_aliases.médio: medium
356
+ - geracao_imagem.quality_aliases.alta: high
357
+ - geracao_imagem.quality_aliases.alto: high
358
+ - geracao_imagem.quality_aliases.auto: auto
359
+ - geracao_imagem.format_options: png, jpeg, webp
360
+ - geracao_imagem.format_aliases.jpg: jpeg
361
+ - geracao_imagem.format_aliases.jpeg: jpeg
362
+ - geracao_imagem.format_aliases.png: png
363
+ - geracao_imagem.format_aliases.webp: webp
364
+ - geracao_imagem.background_options: auto, transparent, opaque
365
+ - geracao_imagem.background_aliases.auto: auto
366
+ - geracao_imagem.background_aliases.transparent: transparent
367
+ - geracao_imagem.background_aliases.transparente: transparent
368
+ - geracao_imagem.background_aliases.opaque: opaque
369
+ - geracao_imagem.background_aliases.opaco: opaque
370
+ - geracao_imagem.background_aliases.opaca: opaque
371
+ - geracao_imagem.flag_aliases.size: --size, --tamanho
372
+ - geracao_imagem.flag_aliases.quality: --quality, --qualidade
373
+ - geracao_imagem.flag_aliases.format: --format, --formato
374
+ - geracao_imagem.flag_aliases.background: --background, --fundo
375
+ - geracao_imagem.flag_aliases.compression: --compression, --compressao, --compressão
376
+ - geracao_imagem.compression.min: 0
377
+ - geracao_imagem.compression.max: 100
378
+ - observabilidade:
379
+ - event_name: command.executed
380
+ - analytics_event: whatsapp_command_catimg
381
+ - tags_log: whatsapp, command, aiModule, catimg
382
+ - nivel_log: info
383
+ - privacidade:
384
+ - dados_sensiveis:
385
+ - chat_identifier
386
+ - sender_identifier
387
+ - command_content
388
+ - retencao: standard_app_logs
389
+ - base_legal: service_execution_and_legitimate_interest
390
+ - docs:
391
+ - summary: Gera/edita imagem com IA por prompt.
392
+ - usage_examples: <prefix>iaimagem seu prompt, <prefix>iaimagem --size 1536x1024 seu prompt
393
+ - usage*variants.default: *<prefix>iaimagem* seu prompt, *<prefix>iaimagem* (responda uma imagem com legenda para editar), , Opções:, --size 1024x1024 | 1024x1536 | 1536x1024 | auto, --quality low | medium | high | auto, --format png | jpeg | webp, --background transparent | opaque | auto, --compression 0-100, , Exemplo:, *<prefix>iaimagem\_ --size 1536x1024 Um gato astronauta em aquarela.
394
+ - behavior:
395
+ - type: argument_driven
396
+ - allowed_actions: (nenhum)
397
+ - limits:
398
+ - usage_description: imagem de entrada ate OPENAI_MAX_IMAGE_MB (padrao 50 MB)
399
+ - rate_limit.max: null
400
+ - rate_limit.janela_ms: null
401
+ - rate_limit.escopo: sem_rate_limit_explicito
402
+ - access.somente_premium: true
403
+ - access.planos_permitidos: premium
404
+ - plan_limits.comum.max: 8
405
+ - plan_limits.comum.janela_ms: 300000
406
+ - plan_limits.comum.escopo: usuario
407
+ - plan_limits.premium.max: 40
408
+ - plan_limits.premium.janela_ms: 300000
409
+ - plan_limits.premium.escopo: usuario
410
+ - discovery:
411
+ - keywords: iaimagem, catimage, ia, privado, grupo
412
+ - faq_queries: como usar iaimagem, o que faz iaimagem, comando iaimagem
413
+ - user_phrasings: quero usar iaimagem, me ajuda com iaimagem, gera/edita imagem com ia
414
+ - suggestion_priority: 100
415
+ - handler:
416
+ - file: catCommand.js
417
+ - method: handleCatImageCommand
418
+ - command_case: iaimagem
419
+
420
+ ### pergunteia
421
+
422
+ - id: ai.pergunteia
423
+ - aliases: iaprompt, promptia, catprompt
424
+ - enabled: true
425
+ - categoria: ia
426
+ - descricao: Define ou reseta o prompt personalizado da IA para o usuario.
427
+ - permissao_necessaria: usuario comum
428
+ - version: 1.0.0
429
+ - stability: stable
430
+ - deprecated: nao
431
+ - risk_level: low
432
+ - local_de_uso:
433
+ - privado
434
+ - grupo
435
+ - metodos_de_uso:
436
+ - <prefix>pergunteia novo prompt
437
+ - <prefix>pergunteia reset
438
+ - mensagens_uso (variantes):
439
+ - default:
440
+ - _<prefix>pergunteia_ seu novo prompt
441
+ - Para voltar ao padrão:
442
+ - _<prefix>pergunteia reset_
443
+ - subcomandos:
444
+ - reset
445
+ - argumentos:
446
+ - conteudo | tipo: string | obrigatorio | validacao: texto do prompt ou reset | default: null | posicao: 0
447
+ - pre_condicoes:
448
+ - requer_grupo: nao
449
+ - requer_admin: nao
450
+ - requer_admin_principal: nao
451
+ - requer_google_login: sim
452
+ - requer_nsfw: nao
453
+ - requer_midia: nao
454
+ - requer_mensagem_respondida: nao
455
+ - rate_limit:
456
+ - max: null
457
+ - janela_ms: null
458
+ - escopo: sem_rate_limit_explicito
459
+ - acesso:
460
+ - somente_premium: nao
461
+ - planos_permitidos: comum, premium
462
+ - limite_uso_por_plano:
463
+ - comum: max=8, janela_ms=300000, escopo=usuario
464
+ - premium: max=40, janela_ms=300000, escopo=usuario
465
+ - informacoes_coletadas:
466
+ - identificador do chat (remoteJid)
467
+ - identificador do remetente (senderJid)
468
+ - texto do comando e argumentos
469
+ - contexto da mensagem (citacao e mencoes, quando existir)
470
+ - prompt personalizado informado pelo usuario
471
+ - identidade do usuario para salvar/atualizar preferencia
472
+ - dependencias_externas:
473
+ - store interno de prompt de IA
474
+ - efeitos_colaterais:
475
+ - salva ou reseta prompt personalizado do usuário
476
+ - respostas_padrao:
477
+ - success: Comando executado com sucesso.
478
+ - usage_error: Formato de uso inválido. Consulte metodos_de_uso.
479
+ - permission_error: Permissão insuficiente para executar este comando.
480
+ - sucesso: Comando executado com sucesso.
481
+ - erro_uso: Formato de uso inválido. Consulte metodos_de_uso.
482
+ - erro_permissao: Permissão insuficiente para executar este comando.
483
+ - mensagens_sistema:
484
+ - premium*only: ⭐ \_Comando Premium*
485
+
486
+ Este comando é exclusivo para usuários premium.
487
+ Fale com o administrador para liberar o acesso.
488
+
489
+ - prompt_muito_longo: ⚠️ Prompt muito longo. Limite: {{max_chars}} caracteres.
490
+ - prompt_reset_sucesso: ✅ Prompt da IA restaurado para o padrão.
491
+ - prompt_update_sucesso: ✅ Prompt da IA atualizado para você.
492
+ - limites_operacionais:
493
+ - prompt_max_chars: 2000
494
+ - opcoes:
495
+ - toggle_on_off_status.type: toggle
496
+ - toggle_on_off_status.allowed_actions: on, off, status
497
+ - toggle_on_off_status.action_argument: acao
498
+ - add_remove_list.type: list_management
499
+ - add_remove_list.allowed_actions: add, remove, list
500
+ - add_remove_list.action_argument: acao
501
+ - approve_reject.type: moderation_decision
502
+ - approve_reject.allowed_actions: approve, reject
503
+ - approve_reject.action_argument: acao
504
+ - approve_reject.requires_targets: true
505
+ - set_status_reset.type: configuration_window
506
+ - set_status_reset.allowed_actions: set, status, reset
507
+ - set_status_reset.action_argument: valor
508
+ - observabilidade:
509
+ - event_name: command.executed
510
+ - analytics_event: whatsapp_command_catprompt
511
+ - tags_log: whatsapp, command, aiModule, catprompt
512
+ - nivel_log: info
513
+ - privacidade:
514
+ - dados_sensiveis:
515
+ - sender_identifier
516
+ - command_content
517
+ - retencao: standard_app_logs
518
+ - base_legal: service_execution_and_legitimate_interest
519
+ - docs:
520
+ - summary: Define ou reseta o prompt personalizado da IA para o usuario.
521
+ - usage_examples: <prefix>pergunteia novo prompt, <prefix>pergunteia reset
522
+ - usage*variants.default: *<prefix>pergunteia* seu novo prompt, , Para voltar ao padrão:, *<prefix>pergunteia reset\_
523
+ - behavior:
524
+ - type: subcommand
525
+ - allowed_actions: reset
526
+ - limits:
527
+ - usage_description: 1 prompt por usuario (atualizavel)
528
+ - rate_limit.max: null
529
+ - rate_limit.janela_ms: null
530
+ - rate_limit.escopo: sem_rate_limit_explicito
531
+ - access.somente_premium: false
532
+ - access.planos_permitidos: comum, premium
533
+ - plan_limits.comum.max: 8
534
+ - plan_limits.comum.janela_ms: 300000
535
+ - plan_limits.comum.escopo: usuario
536
+ - plan_limits.premium.max: 40
537
+ - plan_limits.premium.janela_ms: 300000
538
+ - plan_limits.premium.escopo: usuario
539
+ - discovery:
540
+ - keywords: pergunteia, iaprompt, promptia, ia, privado, grupo
541
+ - faq_queries: como usar pergunteia, o que faz pergunteia, comando pergunteia
542
+ - user_phrasings: quero usar pergunteia, me ajuda com pergunteia, define ou reseta o
543
+ - suggestion_priority: 100
544
+ - handler:
545
+ - file: catCommand.js
546
+ - method: handleCatPromptCommand
547
+ - command_case: pergunteia
@@ -0,0 +1,14 @@
1
+ import path from 'node:path';
2
+ import { fileURLToPath } from 'node:url';
3
+ import { createModuleAiHelpWrapper } from '../../services/ai/moduleAiHelpWrapperFactory.js';
4
+
5
+ const __filename = fileURLToPath(import.meta.url);
6
+ const __dirname = path.dirname(__filename);
7
+
8
+ export const aiAiHelpWrapper = createModuleAiHelpWrapper({
9
+ moduleKey: 'ai',
10
+ moduleLabel: 'comandos de IA',
11
+ envPrefix: 'AI_AI_HELP',
12
+ moduleDirPath: __dirname,
13
+ moduleNameFallback: 'aiModule',
14
+ });
@@ -0,0 +1,135 @@
1
+ import path from 'node:path';
2
+ import { fileURLToPath } from 'node:url';
3
+
4
+ import { createModuleCommandConfigRuntime } from '../../services/ai/moduleCommandConfigRuntimeService.js';
5
+
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = path.dirname(__filename);
8
+ const CONFIG_PATH = path.join(__dirname, 'commandConfig.json');
9
+
10
+ const DEFAULT_TEXTS = {
11
+ usage_header: 'Use assim:',
12
+ premium_only: '⭐ *Comando Premium*\n\nEste comando é exclusivo para usuários premium.',
13
+ openai_not_configured: '⚠️ *OpenAI não configurada*\n\nDefina a variável *OPENAI_API_KEY* no `.env` para usar este comando.',
14
+ generic_error: '❌ *Erro ao falar com a IA*\nTente novamente em alguns instantes.',
15
+ };
16
+
17
+ const runtime = createModuleCommandConfigRuntime({
18
+ configPath: CONFIG_PATH,
19
+ fallbackConfig: {
20
+ module: 'aiModule',
21
+ commands: [],
22
+ textos: DEFAULT_TEXTS,
23
+ },
24
+ });
25
+
26
+ const normalizeText = (value) =>
27
+ String(value || '')
28
+ .trim()
29
+ .toLowerCase();
30
+
31
+ const renderUsageMethod = (method, commandPrefix) => String(method || '').replaceAll('<prefix>', String(commandPrefix || '/'));
32
+
33
+ const resolveUsageLines = (entry, variant) => {
34
+ if (!entry || typeof entry !== 'object') return [];
35
+
36
+ const usageMessages = entry?.mensagens_uso && typeof entry.mensagens_uso === 'object' ? entry.mensagens_uso : null;
37
+
38
+ if (usageMessages) {
39
+ const variantKey = typeof variant === 'string' ? variant.trim() : '';
40
+ const picked = (variantKey && usageMessages[variantKey]) || usageMessages.default || null;
41
+ if (Array.isArray(picked)) {
42
+ return picked.filter(Boolean).map((value) => String(value));
43
+ }
44
+ if (typeof picked === 'string' && picked.trim()) {
45
+ return [picked.trim()];
46
+ }
47
+ }
48
+
49
+ const methods = Array.isArray(entry?.metodos_de_uso) ? entry.metodos_de_uso : [];
50
+ return methods.filter(Boolean).map((value) => String(value));
51
+ };
52
+
53
+ export const getAiModuleConfig = () => runtime.getModuleConfig();
54
+
55
+ export const resolveAiCommandName = (command) => runtime.resolveCommandName(command);
56
+ export const getAiCommandEntry = (command) => runtime.getCommandEntry(command);
57
+ export const listEnabledAiCommands = () => runtime.listEnabledCommands();
58
+
59
+ export const getAiTextConfig = () => {
60
+ const config = getAiModuleConfig();
61
+ const raw = config?.textos && typeof config.textos === 'object' ? config.textos : {};
62
+ return {
63
+ ...DEFAULT_TEXTS,
64
+ ...raw,
65
+ };
66
+ };
67
+
68
+ export const getAiUsageText = (command, { commandPrefix = '/', header, variant } = {}) => {
69
+ const entry = getAiCommandEntry(command);
70
+ const methods = resolveUsageLines(entry, variant);
71
+ if (!methods.length) return '';
72
+
73
+ const prefixHeader = typeof header === 'string' ? header : getAiTextConfig().usage_header || DEFAULT_TEXTS.usage_header;
74
+ const lines = methods.map((method) => renderUsageMethod(method, commandPrefix));
75
+ return [prefixHeader, ...lines].join('\n');
76
+ };
77
+
78
+ export const isAiCommandPremiumOnly = (command) => {
79
+ const entry = getAiCommandEntry(command);
80
+ return Boolean(entry?.acesso?.somente_premium);
81
+ };
82
+
83
+ export const getAiCommandSystemMessages = (command) => {
84
+ const entry = getAiCommandEntry(command);
85
+ const raw = entry?.mensagens_sistema && typeof entry.mensagens_sistema === 'object' ? entry.mensagens_sistema : {};
86
+ return raw;
87
+ };
88
+
89
+ export const getAiCommandOperationalLimits = (command) => {
90
+ const entry = getAiCommandEntry(command);
91
+ const raw = entry?.limites_operacionais && typeof entry.limites_operacionais === 'object' ? entry.limites_operacionais : {};
92
+ return raw;
93
+ };
94
+
95
+ const normalizeMapKeys = (value = {}) => {
96
+ if (!value || typeof value !== 'object' || Array.isArray(value)) return {};
97
+ const output = {};
98
+ for (const [key, mapValue] of Object.entries(value)) {
99
+ const normalizedKey = normalizeText(key);
100
+ if (!normalizedKey) continue;
101
+ output[normalizedKey] = String(mapValue ?? '').trim();
102
+ }
103
+ return output;
104
+ };
105
+
106
+ export const getAiCommandOptionConfig = (command) => {
107
+ const entry = getAiCommandEntry(command);
108
+ const options = entry?.opcoes && typeof entry.opcoes === 'object' ? entry.opcoes : {};
109
+
110
+ const parse = options?.parse && typeof options.parse === 'object' ? options.parse : {};
111
+ const generation = options?.geracao_imagem && typeof options.geracao_imagem === 'object' ? options.geracao_imagem : {};
112
+
113
+ return {
114
+ parse: {
115
+ audio_flags: Array.isArray(parse.audio_flags) ? parse.audio_flags.map((item) => String(item || '')).filter(Boolean) : [],
116
+ text_flags: Array.isArray(parse.text_flags) ? parse.text_flags.map((item) => String(item || '')).filter(Boolean) : [],
117
+ image_detail_aliases: normalizeMapKeys(parse.image_detail_aliases || {}),
118
+ },
119
+ geracao_imagem: {
120
+ size_options: Array.isArray(generation.size_options) ? generation.size_options.map((item) => normalizeText(item)).filter(Boolean) : [],
121
+ size_aliases: normalizeMapKeys(generation.size_aliases || {}),
122
+ quality_options: Array.isArray(generation.quality_options) ? generation.quality_options.map((item) => normalizeText(item)).filter(Boolean) : [],
123
+ quality_aliases: normalizeMapKeys(generation.quality_aliases || {}),
124
+ format_options: Array.isArray(generation.format_options) ? generation.format_options.map((item) => normalizeText(item)).filter(Boolean) : [],
125
+ format_aliases: normalizeMapKeys(generation.format_aliases || {}),
126
+ background_options: Array.isArray(generation.background_options) ? generation.background_options.map((item) => normalizeText(item)).filter(Boolean) : [],
127
+ background_aliases: normalizeMapKeys(generation.background_aliases || {}),
128
+ flag_aliases: generation.flag_aliases && typeof generation.flag_aliases === 'object' ? Object.fromEntries(Object.entries(generation.flag_aliases).map(([key, value]) => [normalizeText(key), Array.isArray(value) ? value.map((item) => normalizeText(item)).filter(Boolean) : []])) : {},
129
+ compression: {
130
+ min: Number(generation?.compression?.min ?? 0),
131
+ max: Number(generation?.compression?.max ?? 100),
132
+ },
133
+ },
134
+ };
135
+ };