@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,981 @@
1
+ {
2
+ "schema_version": "2.0.0",
3
+ "module": "aiModule",
4
+ "enabled": true,
5
+ "source_files": ["catCommand.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": "ia",
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": ["OpenAI API"],
66
+ "dependencias_externas": ["OpenAI API"],
67
+ "responses": {
68
+ "success": "Comando executado com sucesso.",
69
+ "usage_error": "Formato de uso inválido. Consulte metodos_de_uso.",
70
+ "permission_error": "Permissão insuficiente para executar este comando."
71
+ },
72
+ "respostas_padrao": {
73
+ "sucesso": "Comando executado com sucesso.",
74
+ "erro_uso": "Formato de uso inválido. Consulte metodos_de_uso.",
75
+ "erro_permissao": "Permissão insuficiente para executar este comando."
76
+ },
77
+ "observability": {
78
+ "event_name": "command.executed",
79
+ "log_level": "info",
80
+ "tags": ["whatsapp", "command", "aiModule"]
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": 8,
98
+ "janela_ms": 300000,
99
+ "escopo": "usuario"
100
+ },
101
+ "premium": {
102
+ "max": 40,
103
+ "janela_ms": 300000,
104
+ "escopo": "usuario"
105
+ }
106
+ },
107
+ "limite_uso_por_plano": {
108
+ "comum": {
109
+ "max": 8,
110
+ "janela_ms": 300000,
111
+ "escopo": "usuario"
112
+ },
113
+ "premium": {
114
+ "max": 40,
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": "ia",
146
+ "aliases": ["cat"],
147
+ "descricao": "Perguntas para IA com suporte opcional a resposta em audio.",
148
+ "metodos_de_uso": ["<prefix>ia sua pergunta", "<prefix>ia --audio sua pergunta"],
149
+ "permissao_necessaria": "usuario comum",
150
+ "limite_de_uso": "texto sujeito a limites da API",
151
+ "local_de_uso": ["privado", "grupo"],
152
+ "informacoes_coletadas": ["identificador do chat (remoteJid)", "identificador do remetente (senderJid)", "texto do comando e argumentos", "contexto da mensagem (citacao e mencoes, quando existir)", "prompt textual enviado ao modelo de IA", "flags de resposta (ex.: audio/voz)", "midia anexada/citada para analise multimodal (quando houver)", "identidade do usuario para sessao e contexto de conversa"],
153
+ "enabled": true,
154
+ "categoria": "ia",
155
+ "subcomandos": [],
156
+ "argumentos": [
157
+ {
158
+ "nome": "prompt",
159
+ "tipo": "string",
160
+ "obrigatorio": false,
161
+ "validacao": "texto livre; pode usar contexto de mídia",
162
+ "default": null
163
+ },
164
+ {
165
+ "nome": "flags",
166
+ "tipo": "array<string>",
167
+ "obrigatorio": false,
168
+ "validacao": "aliases de áudio/texto suportados",
169
+ "default": []
170
+ }
171
+ ],
172
+ "pre_condicoes": {
173
+ "requer_grupo": false,
174
+ "requer_admin": false,
175
+ "requer_admin_principal": false,
176
+ "requer_google_login": true,
177
+ "requer_nsfw": false,
178
+ "requer_midia": false,
179
+ "requer_mensagem_respondida": false
180
+ },
181
+ "rate_limit": {
182
+ "max": null,
183
+ "janela_ms": null,
184
+ "escopo": "sem_rate_limit_explicito"
185
+ },
186
+ "dependencias_externas": ["OpenAI API"],
187
+ "efeitos_colaterais": ["envia resposta textual/áudio de IA"],
188
+ "respostas_padrao": {
189
+ "sucesso": "Comando executado com sucesso.",
190
+ "erro_uso": "Formato de uso inválido. Consulte metodos_de_uso.",
191
+ "erro_permissao": "Permissão insuficiente para executar este comando."
192
+ },
193
+ "observabilidade": {
194
+ "evento_analytics": "whatsapp_command_cat",
195
+ "tags_log": ["whatsapp", "command", "aiModule", "cat"],
196
+ "nivel_log": "info"
197
+ },
198
+ "privacidade": {
199
+ "dados_sensiveis": ["identificador do chat", "identificador do remetente", "prompt textual enviado", "conteúdo de mídia anexada/citada (quando houver)"],
200
+ "retencao": "conforme políticas de logs, banco de dados e arquivos temporários da aplicação",
201
+ "base_legal": "execução do serviço solicitado e legítimo interesse operacional"
202
+ },
203
+ "capability_keywords": ["ia", "ia", "privado", "grupo"],
204
+ "faq_patterns": ["como usar ia", "o que faz ia", "comando ia"],
205
+ "user_phrasings": ["quero usar ia", "me ajuda com ia", "perguntas para ia com"],
206
+ "suggestion_priority": 100,
207
+ "acesso": {
208
+ "somente_premium": false,
209
+ "planos_permitidos": ["comum", "premium"]
210
+ },
211
+ "limite_uso_por_plano": {
212
+ "comum": {
213
+ "max": 8,
214
+ "janela_ms": 300000,
215
+ "escopo": "usuario"
216
+ },
217
+ "premium": {
218
+ "max": 40,
219
+ "janela_ms": 300000,
220
+ "escopo": "usuario"
221
+ }
222
+ },
223
+ "mensagens_uso": {
224
+ "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."]
225
+ },
226
+ "mensagens_sistema": {
227
+ "premium_only": "⭐ *Comando Premium*\n\nEste comando é exclusivo para usuários premium.\nFale com o administrador para liberar o acesso.",
228
+ "openai_nao_configurada": "⚠️ *OpenAI não configurada*\n\nDefina a variável *OPENAI_API_KEY* no `.env` para usar o comando *cat*.",
229
+ "imagem_muito_grande": "⚠️ A imagem enviada ultrapassa o limite de {{limite_mb}} MB. Envie uma imagem menor.",
230
+ "imagem_download_falhou": "⚠️ Não consegui baixar a imagem. Tente reenviar.",
231
+ "resposta_vazia": "⚠️ Não consegui gerar uma resposta agora. Tente novamente.",
232
+ "audio_muito_longo": "⚠️ A resposta ficou longa demais para áudio. Enviando em texto.",
233
+ "audio_falhou": "⚠️ Não consegui gerar o áudio agora. Enviando texto.",
234
+ "erro_openai": "❌ *Erro ao falar com a IA*\nTente novamente em alguns instantes."
235
+ },
236
+ "opcoes": {
237
+ "parse": {
238
+ "audio_flags": ["--audio", "--voz", "--voice", "--tts", "-a"],
239
+ "text_flags": ["--texto", "--text", "--txt"],
240
+ "image_detail_aliases": {
241
+ "low": "low",
242
+ "high": "high",
243
+ "auto": "auto",
244
+ "baixo": "low",
245
+ "baixa": "low",
246
+ "alto": "high",
247
+ "alta": "high",
248
+ "automatico": "auto",
249
+ "automático": "auto"
250
+ }
251
+ }
252
+ },
253
+ "id": "ai.ia",
254
+ "description": "Perguntas para IA com suporte opcional a resposta em audio.",
255
+ "usage": ["<prefix>ia sua pergunta", "<prefix>ia --audio sua pergunta"],
256
+ "docs": {
257
+ "summary": "Perguntas para IA com suporte opcional a resposta em audio.",
258
+ "usage_examples": ["<prefix>ia sua pergunta", "<prefix>ia --audio sua pergunta"],
259
+ "usage_variants": {
260
+ "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."]
261
+ }
262
+ },
263
+ "permission": "usuario comum",
264
+ "contexts": ["privado", "grupo"],
265
+ "collected_data": ["identificador do chat (remoteJid)", "identificador do remetente (senderJid)", "texto do comando e argumentos", "contexto da mensagem (citacao e mencoes, quando existir)", "prompt textual enviado ao modelo de IA", "flags de resposta (ex.: audio/voz)", "midia anexada/citada para analise multimodal (quando houver)", "identidade do usuario para sessao e contexto de conversa"],
266
+ "requirements": {
267
+ "require_group": false,
268
+ "require_group_admin": false,
269
+ "require_bot_owner": false,
270
+ "require_google_login": true,
271
+ "require_nsfw_enabled": false,
272
+ "require_media": false,
273
+ "require_reply_message": false,
274
+ "legacy": {
275
+ "requer_grupo": false,
276
+ "requer_admin": false,
277
+ "requer_admin_principal": false,
278
+ "requer_google_login": true,
279
+ "requer_nsfw": false,
280
+ "requer_midia": false,
281
+ "requer_mensagem_respondida": false
282
+ }
283
+ },
284
+ "arguments": [
285
+ {
286
+ "name": "prompt",
287
+ "type": "string",
288
+ "required": false,
289
+ "default": null,
290
+ "enum": null,
291
+ "description": "texto livre; pode usar contexto de mídia",
292
+ "position": 0,
293
+ "accepts_mentions": false,
294
+ "accepts_reply_target": false,
295
+ "greedy": false,
296
+ "validation": "texto livre; pode usar contexto de mídia"
297
+ },
298
+ {
299
+ "name": "flags",
300
+ "type": "array",
301
+ "required": false,
302
+ "default": [],
303
+ "enum": null,
304
+ "description": "aliases de áudio/texto suportados",
305
+ "position": 1,
306
+ "accepts_mentions": false,
307
+ "accepts_reply_target": false,
308
+ "greedy": false,
309
+ "validation": "aliases de áudio/texto suportados"
310
+ }
311
+ ],
312
+ "behavior": {
313
+ "type": "argument_driven",
314
+ "allowed_actions": []
315
+ },
316
+ "limits": {
317
+ "usage_description": "texto sujeito a limites da API",
318
+ "rate_limit": {
319
+ "max": null,
320
+ "janela_ms": null,
321
+ "escopo": "sem_rate_limit_explicito"
322
+ },
323
+ "access": {
324
+ "somente_premium": false,
325
+ "planos_permitidos": ["comum", "premium"]
326
+ },
327
+ "plan_limits": {
328
+ "comum": {
329
+ "max": 8,
330
+ "janela_ms": 300000,
331
+ "escopo": "usuario"
332
+ },
333
+ "premium": {
334
+ "max": 40,
335
+ "janela_ms": 300000,
336
+ "escopo": "usuario"
337
+ }
338
+ }
339
+ },
340
+ "dependencies": ["OpenAI API"],
341
+ "side_effects": ["envia resposta textual/áudio de IA"],
342
+ "observability": {
343
+ "event_name": "command.executed",
344
+ "event_key": "ai.ia",
345
+ "analytics_event": "whatsapp_command_cat",
346
+ "log_level": "info",
347
+ "tags": ["whatsapp", "command", "aiModule", "cat"],
348
+ "legacy": {
349
+ "evento_analytics": "whatsapp_command_cat",
350
+ "tags_log": ["whatsapp", "command", "aiModule", "cat"],
351
+ "nivel_log": "info"
352
+ }
353
+ },
354
+ "privacy": {
355
+ "data_categories": ["chat_identifier", "sender_identifier", "command_content"],
356
+ "sensitive_fields": ["remoteJid", "senderJid", "text", "args"],
357
+ "retention_policy": "standard_app_logs",
358
+ "retention_notes": "conforme políticas de logs, banco de dados e arquivos temporários da aplicação",
359
+ "legal_basis": "service_execution_and_legitimate_interest",
360
+ "legal_basis_notes": "execução do serviço solicitado e legítimo interesse operacional",
361
+ "legacy": {
362
+ "dados_sensiveis": ["identificador do chat", "identificador do remetente", "prompt textual enviado", "conteúdo de mídia anexada/citada (quando houver)"],
363
+ "retencao": "conforme políticas de logs, banco de dados e arquivos temporários da aplicação",
364
+ "base_legal": "execução do serviço solicitado e legítimo interesse operacional"
365
+ }
366
+ },
367
+ "discovery": {
368
+ "keywords": ["ia", "ia", "privado", "grupo"],
369
+ "faq_queries": ["como usar ia", "o que faz ia", "comando ia"],
370
+ "user_phrasings": ["quero usar ia", "me ajuda com ia", "perguntas para ia com"],
371
+ "suggestion_priority": 100
372
+ },
373
+ "access": {
374
+ "premium_only": false,
375
+ "allowed_plans": ["comum", "premium"],
376
+ "legacy": {
377
+ "somente_premium": false,
378
+ "planos_permitidos": ["comum", "premium"]
379
+ }
380
+ },
381
+ "plan_limits": {
382
+ "comum": {
383
+ "max": 8,
384
+ "janela_ms": 300000,
385
+ "escopo": "usuario"
386
+ },
387
+ "premium": {
388
+ "max": 40,
389
+ "janela_ms": 300000,
390
+ "escopo": "usuario"
391
+ }
392
+ },
393
+ "version": "1.0.0",
394
+ "stability": "stable",
395
+ "deprecated": false,
396
+ "replaced_by": null,
397
+ "risk_level": "low",
398
+ "handler": {
399
+ "file": "catCommand.js",
400
+ "method": "handleCatCommand",
401
+ "command_case": "ia"
402
+ },
403
+ "compatibility": {
404
+ "schema": "legacy_v1_and_v2",
405
+ "legacy_name": "ia",
406
+ "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"]
407
+ }
408
+ },
409
+ {
410
+ "name": "iaimagem",
411
+ "aliases": ["catimage", "catimg"],
412
+ "descricao": "Gera/edita imagem com IA por prompt.",
413
+ "metodos_de_uso": ["<prefix>iaimagem seu prompt", "<prefix>iaimagem --size 1536x1024 seu prompt"],
414
+ "permissao_necessaria": "usuario comum",
415
+ "limite_de_uso": "imagem de entrada ate OPENAI_MAX_IMAGE_MB (padrao 50 MB)",
416
+ "local_de_uso": ["privado", "grupo"],
417
+ "informacoes_coletadas": ["identificador do chat (remoteJid)", "identificador do remetente (senderJid)", "texto do comando e argumentos", "contexto da mensagem (citacao e mencoes, quando existir)", "prompt de geracao/edicao de imagem", "opcoes de geracao (size, quality, format, background)", "imagem enviada/citada para edicao (quando houver)"],
418
+ "enabled": true,
419
+ "categoria": "ia",
420
+ "subcomandos": [],
421
+ "argumentos": [
422
+ {
423
+ "nome": "prompt",
424
+ "tipo": "string",
425
+ "obrigatorio": false,
426
+ "validacao": "texto livre para gerar/editar imagem",
427
+ "default": null
428
+ },
429
+ {
430
+ "nome": "size",
431
+ "tipo": "string",
432
+ "obrigatorio": false,
433
+ "validacao": "auto|1024x1024|1024x1536|1536x1024",
434
+ "default": "auto"
435
+ },
436
+ {
437
+ "nome": "quality",
438
+ "tipo": "string",
439
+ "obrigatorio": false,
440
+ "validacao": "auto|low|medium|high",
441
+ "default": "auto"
442
+ },
443
+ {
444
+ "nome": "format",
445
+ "tipo": "string",
446
+ "obrigatorio": false,
447
+ "validacao": "png|jpeg|webp",
448
+ "default": "png"
449
+ }
450
+ ],
451
+ "pre_condicoes": {
452
+ "requer_grupo": false,
453
+ "requer_admin": false,
454
+ "requer_admin_principal": false,
455
+ "requer_google_login": true,
456
+ "requer_nsfw": false,
457
+ "requer_midia": false,
458
+ "requer_mensagem_respondida": false
459
+ },
460
+ "rate_limit": {
461
+ "max": null,
462
+ "janela_ms": null,
463
+ "escopo": "sem_rate_limit_explicito"
464
+ },
465
+ "dependencias_externas": ["OpenAI API"],
466
+ "efeitos_colaterais": ["envia imagem gerada/editada por IA"],
467
+ "respostas_padrao": {
468
+ "sucesso": "Comando executado com sucesso.",
469
+ "erro_uso": "Formato de uso inválido. Consulte metodos_de_uso.",
470
+ "erro_permissao": "Permissão insuficiente para executar este comando."
471
+ },
472
+ "observabilidade": {
473
+ "evento_analytics": "whatsapp_command_catimg",
474
+ "tags_log": ["whatsapp", "command", "aiModule", "catimg"],
475
+ "nivel_log": "info"
476
+ },
477
+ "privacidade": {
478
+ "dados_sensiveis": ["identificador do chat", "identificador do remetente", "prompt de imagem", "imagem anexada/citada (quando houver)"],
479
+ "retencao": "conforme políticas de logs, banco de dados e arquivos temporários da aplicação",
480
+ "base_legal": "execução do serviço solicitado e legítimo interesse operacional"
481
+ },
482
+ "capability_keywords": ["iaimagem", "catimage", "ia", "privado", "grupo"],
483
+ "faq_patterns": ["como usar iaimagem", "o que faz iaimagem", "comando iaimagem"],
484
+ "user_phrasings": ["quero usar iaimagem", "me ajuda com iaimagem", "gera/edita imagem com ia"],
485
+ "suggestion_priority": 100,
486
+ "acesso": {
487
+ "somente_premium": true,
488
+ "planos_permitidos": ["premium"]
489
+ },
490
+ "limite_uso_por_plano": {
491
+ "comum": {
492
+ "max": 8,
493
+ "janela_ms": 300000,
494
+ "escopo": "usuario"
495
+ },
496
+ "premium": {
497
+ "max": 40,
498
+ "janela_ms": 300000,
499
+ "escopo": "usuario"
500
+ }
501
+ },
502
+ "mensagens_uso": {
503
+ "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."]
504
+ },
505
+ "mensagens_sistema": {
506
+ "premium_only": "⭐ *Comando Premium*\n\nEste comando é exclusivo para usuários premium.\nFale com o administrador para liberar o acesso.",
507
+ "openai_nao_configurada": "⚠️ *OpenAI não configurada*\n\nDefina a variável *OPENAI_API_KEY* no `.env` para usar o comando *catimg*.",
508
+ "imagem_muito_grande": "⚠️ A imagem enviada ultrapassa o limite de {{limite_mb}} MB. Envie uma imagem menor.",
509
+ "imagem_download_falhou": "⚠️ Não consegui baixar a imagem. Tente reenviar.",
510
+ "opcoes_invalidas": "⚠️ Opções inválidas no comando.\nDetalhes: {{detalhes}}\n\nUse *{{prefix}}catimg* sem opções para ver o formato correto.",
511
+ "resposta_vazia": "⚠️ Não consegui gerar a imagem agora. Tente novamente.",
512
+ "erro_openai": "❌ *Erro ao falar com a IA*\nTente novamente em alguns instantes."
513
+ },
514
+ "opcoes": {
515
+ "geracao_imagem": {
516
+ "size_options": ["auto", "1024x1024", "1024x1536", "1536x1024"],
517
+ "size_aliases": {
518
+ "1024": "1024x1024",
519
+ "square": "1024x1024",
520
+ "quadrado": "1024x1024",
521
+ "portrait": "1024x1536",
522
+ "retrato": "1024x1536",
523
+ "landscape": "1536x1024",
524
+ "paisagem": "1536x1024",
525
+ "auto": "auto"
526
+ },
527
+ "quality_options": ["auto", "low", "medium", "high"],
528
+ "quality_aliases": {
529
+ "baixa": "low",
530
+ "baixo": "low",
531
+ "media": "medium",
532
+ "média": "medium",
533
+ "medio": "medium",
534
+ "médio": "medium",
535
+ "alta": "high",
536
+ "alto": "high",
537
+ "auto": "auto"
538
+ },
539
+ "format_options": ["png", "jpeg", "webp"],
540
+ "format_aliases": {
541
+ "jpg": "jpeg",
542
+ "jpeg": "jpeg",
543
+ "png": "png",
544
+ "webp": "webp"
545
+ },
546
+ "background_options": ["auto", "transparent", "opaque"],
547
+ "background_aliases": {
548
+ "auto": "auto",
549
+ "transparent": "transparent",
550
+ "transparente": "transparent",
551
+ "opaque": "opaque",
552
+ "opaco": "opaque",
553
+ "opaca": "opaque"
554
+ },
555
+ "flag_aliases": {
556
+ "size": ["--size", "--tamanho"],
557
+ "quality": ["--quality", "--qualidade"],
558
+ "format": ["--format", "--formato"],
559
+ "background": ["--background", "--fundo"],
560
+ "compression": ["--compression", "--compressao", "--compressão"]
561
+ },
562
+ "compression": {
563
+ "min": 0,
564
+ "max": 100
565
+ }
566
+ }
567
+ },
568
+ "id": "ai.iaimagem",
569
+ "description": "Gera/edita imagem com IA por prompt.",
570
+ "usage": ["<prefix>iaimagem seu prompt", "<prefix>iaimagem --size 1536x1024 seu prompt"],
571
+ "docs": {
572
+ "summary": "Gera/edita imagem com IA por prompt.",
573
+ "usage_examples": ["<prefix>iaimagem seu prompt", "<prefix>iaimagem --size 1536x1024 seu prompt"],
574
+ "usage_variants": {
575
+ "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."]
576
+ }
577
+ },
578
+ "permission": "usuario comum",
579
+ "contexts": ["privado", "grupo"],
580
+ "collected_data": ["identificador do chat (remoteJid)", "identificador do remetente (senderJid)", "texto do comando e argumentos", "contexto da mensagem (citacao e mencoes, quando existir)", "prompt de geracao/edicao de imagem", "opcoes de geracao (size, quality, format, background)", "imagem enviada/citada para edicao (quando houver)"],
581
+ "requirements": {
582
+ "require_group": false,
583
+ "require_group_admin": false,
584
+ "require_bot_owner": false,
585
+ "require_google_login": true,
586
+ "require_nsfw_enabled": false,
587
+ "require_media": false,
588
+ "require_reply_message": false,
589
+ "legacy": {
590
+ "requer_grupo": false,
591
+ "requer_admin": false,
592
+ "requer_admin_principal": false,
593
+ "requer_google_login": true,
594
+ "requer_nsfw": false,
595
+ "requer_midia": false,
596
+ "requer_mensagem_respondida": false
597
+ }
598
+ },
599
+ "arguments": [
600
+ {
601
+ "name": "prompt",
602
+ "type": "string",
603
+ "required": false,
604
+ "default": null,
605
+ "enum": null,
606
+ "description": "texto livre para gerar/editar imagem",
607
+ "position": 0,
608
+ "accepts_mentions": false,
609
+ "accepts_reply_target": false,
610
+ "greedy": false,
611
+ "validation": "texto livre para gerar/editar imagem"
612
+ },
613
+ {
614
+ "name": "size",
615
+ "type": "string",
616
+ "required": false,
617
+ "default": "auto",
618
+ "enum": ["auto", "1024x1024", "1024x1536", "1536x1024"],
619
+ "description": "auto|1024x1024|1024x1536|1536x1024",
620
+ "position": 1,
621
+ "accepts_mentions": false,
622
+ "accepts_reply_target": false,
623
+ "greedy": false,
624
+ "validation": "auto|1024x1024|1024x1536|1536x1024"
625
+ },
626
+ {
627
+ "name": "quality",
628
+ "type": "string",
629
+ "required": false,
630
+ "default": "auto",
631
+ "enum": ["auto", "low", "medium", "high"],
632
+ "description": "auto|low|medium|high",
633
+ "position": 2,
634
+ "accepts_mentions": false,
635
+ "accepts_reply_target": false,
636
+ "greedy": false,
637
+ "validation": "auto|low|medium|high"
638
+ },
639
+ {
640
+ "name": "format",
641
+ "type": "string",
642
+ "required": false,
643
+ "default": "png",
644
+ "enum": ["png", "jpeg", "webp"],
645
+ "description": "png|jpeg|webp",
646
+ "position": 3,
647
+ "accepts_mentions": false,
648
+ "accepts_reply_target": false,
649
+ "greedy": false,
650
+ "validation": "png|jpeg|webp"
651
+ }
652
+ ],
653
+ "behavior": {
654
+ "type": "argument_driven",
655
+ "allowed_actions": []
656
+ },
657
+ "limits": {
658
+ "usage_description": "imagem de entrada ate OPENAI_MAX_IMAGE_MB (padrao 50 MB)",
659
+ "rate_limit": {
660
+ "max": null,
661
+ "janela_ms": null,
662
+ "escopo": "sem_rate_limit_explicito"
663
+ },
664
+ "access": {
665
+ "somente_premium": true,
666
+ "planos_permitidos": ["premium"]
667
+ },
668
+ "plan_limits": {
669
+ "comum": {
670
+ "max": 8,
671
+ "janela_ms": 300000,
672
+ "escopo": "usuario"
673
+ },
674
+ "premium": {
675
+ "max": 40,
676
+ "janela_ms": 300000,
677
+ "escopo": "usuario"
678
+ }
679
+ }
680
+ },
681
+ "dependencies": ["OpenAI API"],
682
+ "side_effects": ["envia imagem gerada/editada por IA"],
683
+ "observability": {
684
+ "event_name": "command.executed",
685
+ "event_key": "ai.iaimagem",
686
+ "analytics_event": "whatsapp_command_catimg",
687
+ "log_level": "info",
688
+ "tags": ["whatsapp", "command", "aiModule", "catimg"],
689
+ "legacy": {
690
+ "evento_analytics": "whatsapp_command_catimg",
691
+ "tags_log": ["whatsapp", "command", "aiModule", "catimg"],
692
+ "nivel_log": "info"
693
+ }
694
+ },
695
+ "privacy": {
696
+ "data_categories": ["chat_identifier", "sender_identifier", "command_content"],
697
+ "sensitive_fields": ["remoteJid", "senderJid", "text", "args"],
698
+ "retention_policy": "standard_app_logs",
699
+ "retention_notes": "conforme políticas de logs, banco de dados e arquivos temporários da aplicação",
700
+ "legal_basis": "service_execution_and_legitimate_interest",
701
+ "legal_basis_notes": "execução do serviço solicitado e legítimo interesse operacional",
702
+ "legacy": {
703
+ "dados_sensiveis": ["identificador do chat", "identificador do remetente", "prompt de imagem", "imagem anexada/citada (quando houver)"],
704
+ "retencao": "conforme políticas de logs, banco de dados e arquivos temporários da aplicação",
705
+ "base_legal": "execução do serviço solicitado e legítimo interesse operacional"
706
+ }
707
+ },
708
+ "discovery": {
709
+ "keywords": ["iaimagem", "catimage", "ia", "privado", "grupo"],
710
+ "faq_queries": ["como usar iaimagem", "o que faz iaimagem", "comando iaimagem"],
711
+ "user_phrasings": ["quero usar iaimagem", "me ajuda com iaimagem", "gera/edita imagem com ia"],
712
+ "suggestion_priority": 100
713
+ },
714
+ "access": {
715
+ "premium_only": true,
716
+ "allowed_plans": ["premium"],
717
+ "legacy": {
718
+ "somente_premium": true,
719
+ "planos_permitidos": ["premium"]
720
+ }
721
+ },
722
+ "plan_limits": {
723
+ "comum": {
724
+ "max": 8,
725
+ "janela_ms": 300000,
726
+ "escopo": "usuario"
727
+ },
728
+ "premium": {
729
+ "max": 40,
730
+ "janela_ms": 300000,
731
+ "escopo": "usuario"
732
+ }
733
+ },
734
+ "version": "1.0.0",
735
+ "stability": "stable",
736
+ "deprecated": false,
737
+ "replaced_by": null,
738
+ "risk_level": "low",
739
+ "handler": {
740
+ "file": "catCommand.js",
741
+ "method": "handleCatImageCommand",
742
+ "command_case": "iaimagem"
743
+ },
744
+ "compatibility": {
745
+ "schema": "legacy_v1_and_v2",
746
+ "legacy_name": "iaimagem",
747
+ "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"]
748
+ }
749
+ },
750
+ {
751
+ "name": "pergunteia",
752
+ "aliases": ["iaprompt", "promptia", "catprompt"],
753
+ "descricao": "Define ou reseta o prompt personalizado da IA para o usuario.",
754
+ "metodos_de_uso": ["<prefix>pergunteia novo prompt", "<prefix>pergunteia reset"],
755
+ "permissao_necessaria": "usuario comum",
756
+ "limite_de_uso": "1 prompt por usuario (atualizavel)",
757
+ "local_de_uso": ["privado", "grupo"],
758
+ "informacoes_coletadas": ["identificador do chat (remoteJid)", "identificador do remetente (senderJid)", "texto do comando e argumentos", "contexto da mensagem (citacao e mencoes, quando existir)", "prompt personalizado informado pelo usuario", "identidade do usuario para salvar/atualizar preferencia"],
759
+ "enabled": true,
760
+ "categoria": "ia",
761
+ "subcomandos": ["reset"],
762
+ "argumentos": [
763
+ {
764
+ "nome": "conteudo",
765
+ "tipo": "string",
766
+ "obrigatorio": true,
767
+ "validacao": "texto do prompt ou reset",
768
+ "default": null
769
+ }
770
+ ],
771
+ "pre_condicoes": {
772
+ "requer_grupo": false,
773
+ "requer_admin": false,
774
+ "requer_admin_principal": false,
775
+ "requer_google_login": true,
776
+ "requer_nsfw": false,
777
+ "requer_midia": false,
778
+ "requer_mensagem_respondida": false
779
+ },
780
+ "rate_limit": {
781
+ "max": null,
782
+ "janela_ms": null,
783
+ "escopo": "sem_rate_limit_explicito"
784
+ },
785
+ "dependencias_externas": ["store interno de prompt de IA"],
786
+ "efeitos_colaterais": ["salva ou reseta prompt personalizado do usuário"],
787
+ "respostas_padrao": {
788
+ "sucesso": "Comando executado com sucesso.",
789
+ "erro_uso": "Formato de uso inválido. Consulte metodos_de_uso.",
790
+ "erro_permissao": "Permissão insuficiente para executar este comando."
791
+ },
792
+ "observabilidade": {
793
+ "evento_analytics": "whatsapp_command_catprompt",
794
+ "tags_log": ["whatsapp", "command", "aiModule", "catprompt"],
795
+ "nivel_log": "info"
796
+ },
797
+ "privacidade": {
798
+ "dados_sensiveis": ["identificador do remetente", "prompt personalizado salvo pelo usuário"],
799
+ "retencao": "conforme políticas de logs, banco de dados e arquivos temporários da aplicação",
800
+ "base_legal": "execução do serviço solicitado e legítimo interesse operacional"
801
+ },
802
+ "capability_keywords": ["pergunteia", "iaprompt", "promptia", "ia", "privado", "grupo"],
803
+ "faq_patterns": ["como usar pergunteia", "o que faz pergunteia", "comando pergunteia"],
804
+ "user_phrasings": ["quero usar pergunteia", "me ajuda com pergunteia", "define ou reseta o"],
805
+ "suggestion_priority": 100,
806
+ "acesso": {
807
+ "somente_premium": false,
808
+ "planos_permitidos": ["comum", "premium"]
809
+ },
810
+ "limite_uso_por_plano": {
811
+ "comum": {
812
+ "max": 8,
813
+ "janela_ms": 300000,
814
+ "escopo": "usuario"
815
+ },
816
+ "premium": {
817
+ "max": 40,
818
+ "janela_ms": 300000,
819
+ "escopo": "usuario"
820
+ }
821
+ },
822
+ "mensagens_uso": {
823
+ "default": ["*<prefix>pergunteia* seu novo prompt", "", "Para voltar ao padrão:", "*<prefix>pergunteia reset*"]
824
+ },
825
+ "mensagens_sistema": {
826
+ "premium_only": "⭐ *Comando Premium*\n\nEste comando é exclusivo para usuários premium.\nFale com o administrador para liberar o acesso.",
827
+ "prompt_muito_longo": "⚠️ Prompt muito longo. Limite: {{max_chars}} caracteres.",
828
+ "prompt_reset_sucesso": "✅ Prompt da IA restaurado para o padrão.",
829
+ "prompt_update_sucesso": "✅ Prompt da IA atualizado para você."
830
+ },
831
+ "limites_operacionais": {
832
+ "prompt_max_chars": 2000
833
+ },
834
+ "id": "ai.pergunteia",
835
+ "description": "Define ou reseta o prompt personalizado da IA para o usuario.",
836
+ "usage": ["<prefix>pergunteia novo prompt", "<prefix>pergunteia reset"],
837
+ "docs": {
838
+ "summary": "Define ou reseta o prompt personalizado da IA para o usuario.",
839
+ "usage_examples": ["<prefix>pergunteia novo prompt", "<prefix>pergunteia reset"],
840
+ "usage_variants": {
841
+ "default": ["*<prefix>pergunteia* seu novo prompt", "", "Para voltar ao padrão:", "*<prefix>pergunteia reset*"]
842
+ }
843
+ },
844
+ "permission": "usuario comum",
845
+ "contexts": ["privado", "grupo"],
846
+ "collected_data": ["identificador do chat (remoteJid)", "identificador do remetente (senderJid)", "texto do comando e argumentos", "contexto da mensagem (citacao e mencoes, quando existir)", "prompt personalizado informado pelo usuario", "identidade do usuario para salvar/atualizar preferencia"],
847
+ "requirements": {
848
+ "require_group": false,
849
+ "require_group_admin": false,
850
+ "require_bot_owner": false,
851
+ "require_google_login": true,
852
+ "require_nsfw_enabled": false,
853
+ "require_media": false,
854
+ "require_reply_message": false,
855
+ "legacy": {
856
+ "requer_grupo": false,
857
+ "requer_admin": false,
858
+ "requer_admin_principal": false,
859
+ "requer_google_login": true,
860
+ "requer_nsfw": false,
861
+ "requer_midia": false,
862
+ "requer_mensagem_respondida": false
863
+ }
864
+ },
865
+ "arguments": [
866
+ {
867
+ "name": "conteudo",
868
+ "type": "string",
869
+ "required": true,
870
+ "default": null,
871
+ "enum": null,
872
+ "description": "texto do prompt ou reset",
873
+ "position": 0,
874
+ "accepts_mentions": false,
875
+ "accepts_reply_target": false,
876
+ "greedy": false,
877
+ "validation": "texto do prompt ou reset"
878
+ }
879
+ ],
880
+ "behavior": {
881
+ "type": "subcommand",
882
+ "allowed_actions": ["reset"]
883
+ },
884
+ "limits": {
885
+ "usage_description": "1 prompt por usuario (atualizavel)",
886
+ "rate_limit": {
887
+ "max": null,
888
+ "janela_ms": null,
889
+ "escopo": "sem_rate_limit_explicito"
890
+ },
891
+ "access": {
892
+ "somente_premium": false,
893
+ "planos_permitidos": ["comum", "premium"]
894
+ },
895
+ "plan_limits": {
896
+ "comum": {
897
+ "max": 8,
898
+ "janela_ms": 300000,
899
+ "escopo": "usuario"
900
+ },
901
+ "premium": {
902
+ "max": 40,
903
+ "janela_ms": 300000,
904
+ "escopo": "usuario"
905
+ }
906
+ }
907
+ },
908
+ "dependencies": ["store interno de prompt de IA"],
909
+ "side_effects": ["salva ou reseta prompt personalizado do usuário"],
910
+ "observability": {
911
+ "event_name": "command.executed",
912
+ "event_key": "ai.pergunteia",
913
+ "analytics_event": "whatsapp_command_catprompt",
914
+ "log_level": "info",
915
+ "tags": ["whatsapp", "command", "aiModule", "catprompt"],
916
+ "legacy": {
917
+ "evento_analytics": "whatsapp_command_catprompt",
918
+ "tags_log": ["whatsapp", "command", "aiModule", "catprompt"],
919
+ "nivel_log": "info"
920
+ }
921
+ },
922
+ "privacy": {
923
+ "data_categories": ["sender_identifier", "command_content"],
924
+ "sensitive_fields": ["senderJid", "text", "args"],
925
+ "retention_policy": "standard_app_logs",
926
+ "retention_notes": "conforme políticas de logs, banco de dados e arquivos temporários da aplicação",
927
+ "legal_basis": "service_execution_and_legitimate_interest",
928
+ "legal_basis_notes": "execução do serviço solicitado e legítimo interesse operacional",
929
+ "legacy": {
930
+ "dados_sensiveis": ["identificador do remetente", "prompt personalizado salvo pelo usuário"],
931
+ "retencao": "conforme políticas de logs, banco de dados e arquivos temporários da aplicação",
932
+ "base_legal": "execução do serviço solicitado e legítimo interesse operacional"
933
+ }
934
+ },
935
+ "discovery": {
936
+ "keywords": ["pergunteia", "iaprompt", "promptia", "ia", "privado", "grupo"],
937
+ "faq_queries": ["como usar pergunteia", "o que faz pergunteia", "comando pergunteia"],
938
+ "user_phrasings": ["quero usar pergunteia", "me ajuda com pergunteia", "define ou reseta o"],
939
+ "suggestion_priority": 100
940
+ },
941
+ "access": {
942
+ "premium_only": false,
943
+ "allowed_plans": ["comum", "premium"],
944
+ "legacy": {
945
+ "somente_premium": false,
946
+ "planos_permitidos": ["comum", "premium"]
947
+ }
948
+ },
949
+ "plan_limits": {
950
+ "comum": {
951
+ "max": 8,
952
+ "janela_ms": 300000,
953
+ "escopo": "usuario"
954
+ },
955
+ "premium": {
956
+ "max": 40,
957
+ "janela_ms": 300000,
958
+ "escopo": "usuario"
959
+ }
960
+ },
961
+ "version": "1.0.0",
962
+ "stability": "stable",
963
+ "deprecated": false,
964
+ "replaced_by": null,
965
+ "risk_level": "low",
966
+ "handler": {
967
+ "file": "catCommand.js",
968
+ "method": "handleCatPromptCommand",
969
+ "command_case": "pergunteia"
970
+ },
971
+ "compatibility": {
972
+ "schema": "legacy_v1_and_v2",
973
+ "legacy_name": "pergunteia",
974
+ "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"]
975
+ }
976
+ }
977
+ ],
978
+ "textos": {
979
+ "usage_header": "Use assim:"
980
+ }
981
+ }