@omnizap-system/omnizap 2.6.0 → 2.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (261) hide show
  1. package/.env.example +58 -13
  2. package/.github/workflows/ci.yml +5 -5
  3. package/.github/workflows/codeql.yml +1 -1
  4. package/.github/workflows/db-migration-check.yml +2 -2
  5. package/.github/workflows/dependency-review.yml +1 -1
  6. package/.github/workflows/deploy.yml +2 -2
  7. package/.github/workflows/release.yml +2 -2
  8. package/.github/workflows/security-attest-provenance.yml +2 -2
  9. package/.github/workflows/security-gitleaks.yml +13 -4
  10. package/.github/workflows/security-runner-hardening.yml +2 -2
  11. package/.github/workflows/security-scorecard.yml +1 -1
  12. package/.github/workflows/security-zap-baseline.yml +1 -1
  13. package/.github/workflows/security-zap-full-scan.yml +2 -1
  14. package/.github/workflows/security-zizmor.yml +1 -1
  15. package/.github/workflows/wiki-sync.yml +1 -1
  16. package/.gitleaksignore +9 -0
  17. package/CODE_OF_CONDUCT.md +2 -2
  18. package/GEMINI.md +64 -0
  19. package/README.md +52 -82
  20. package/SECURITY.md +1 -1
  21. package/app/config/index.js +2 -0
  22. package/app/configParts/adminIdentity.js +5 -5
  23. package/app/configParts/baileysConfig.js +230 -58
  24. package/app/configParts/groupUtils.js +5 -0
  25. package/app/configParts/messagePersistenceService.js +145 -4
  26. package/app/configParts/sessionConfig.js +157 -0
  27. package/app/connection/baileysCompatibility.test.js +1 -1
  28. package/app/connection/groupOwnerWriteStateResolver.js +109 -0
  29. package/app/connection/socketController.js +660 -158
  30. package/app/connection/socketController.multiSession.test.js +108 -0
  31. package/app/controllers/messageController.js +1 -1
  32. package/app/controllers/messagePipeline/commandMiddleware.js +12 -10
  33. package/app/controllers/messagePipeline/conversationMiddleware.js +2 -1
  34. package/app/controllers/messagePipeline/messagePipelineMiddlewares.test.js +104 -0
  35. package/app/controllers/messagePipeline/preProcessingMiddlewares.js +80 -2
  36. package/app/controllers/messageProcessingPipeline.js +93 -13
  37. package/app/controllers/messageProcessingPipeline.test.js +200 -0
  38. package/app/modules/adminModule/AGENT.md +1 -1
  39. package/app/modules/adminModule/commandConfig.json +3318 -1347
  40. package/app/modules/adminModule/groupCommandHandlers.js +858 -15
  41. package/app/modules/adminModule/groupCommandHandlers.test.js +378 -11
  42. package/app/modules/adminModule/groupWarningRepository.js +152 -0
  43. package/app/modules/aiModule/AGENT.md +47 -30
  44. package/app/modules/aiModule/aiConfigRuntime.js +1 -0
  45. package/app/modules/aiModule/catCommand.js +135 -27
  46. package/app/modules/aiModule/commandConfig.json +114 -28
  47. package/app/modules/analyticsModule/messageAnalysisEventRepository.js +54 -6
  48. package/app/modules/gameModule/AGENT.md +1 -1
  49. package/app/modules/gameModule/commandConfig.json +29 -0
  50. package/app/modules/menuModule/AGENT.md +1 -1
  51. package/app/modules/menuModule/commandConfig.json +45 -10
  52. package/app/modules/menuModule/menuCatalogService.js +190 -0
  53. package/app/modules/menuModule/menuCommandUsageRepository.js +109 -0
  54. package/app/modules/menuModule/menuDynamicService.js +511 -0
  55. package/app/modules/menuModule/menuDynamicService.test.js +141 -0
  56. package/app/modules/menuModule/menus.js +36 -5
  57. package/app/modules/playModule/AGENT.md +10 -5
  58. package/app/modules/playModule/commandConfig.json +140 -12
  59. package/app/modules/playModule/playCommand.js +1 -1417
  60. package/app/modules/playModule/playCommandConstants.js +80 -0
  61. package/app/modules/playModule/playCommandCore.js +361 -0
  62. package/app/modules/playModule/playCommandHandlers.js +41 -0
  63. package/app/modules/playModule/playCommandMediaClient.js +1872 -0
  64. package/app/modules/playModule/playConfigRuntime.js +245 -4
  65. package/app/modules/playModule/playModuleCriticalFlows.test.js +152 -0
  66. package/app/modules/quoteModule/AGENT.md +1 -1
  67. package/app/modules/quoteModule/commandConfig.json +29 -0
  68. package/app/modules/quoteModule/quoteCommand.js +3 -2
  69. package/app/modules/rpgPokemonModule/AGENT.md +1 -1
  70. package/app/modules/rpgPokemonModule/commandConfig.json +29 -0
  71. package/app/modules/rpgPokemonModule/rpgBattleCanvasRenderer.js +5 -4
  72. package/app/modules/rpgPokemonModule/rpgBattleService.test.js +2 -1
  73. package/app/modules/rpgPokemonModule/rpgPokemonDomain.js +2 -1
  74. package/app/modules/rpgPokemonModule/rpgPokemonService.js +38 -37
  75. package/app/modules/rpgPokemonModule/rpgProfileCanvasRenderer.js +4 -3
  76. package/app/modules/statsModule/AGENT.md +1 -1
  77. package/app/modules/statsModule/commandConfig.json +58 -0
  78. package/app/modules/statsModule/rankingCommon.js +5 -4
  79. package/app/modules/stickerModule/AGENT.md +1 -1
  80. package/app/modules/stickerModule/addStickerMetadata.js +4 -3
  81. package/app/modules/stickerModule/commandConfig.json +145 -0
  82. package/app/modules/stickerModule/stickerCommand.js +1 -1
  83. package/app/modules/stickerPackModule/AGENT.md +1 -1
  84. package/app/modules/stickerPackModule/autoPackCollectorService.js +5 -1
  85. package/app/modules/stickerPackModule/commandConfig.json +29 -0
  86. package/app/modules/stickerPackModule/semanticThemeClusterService.js +7 -6
  87. package/app/modules/stickerPackModule/stickerAutoPackByTagsRuntime.js +10 -9
  88. package/app/modules/stickerPackModule/stickerClassificationBackgroundRuntime.js +9 -8
  89. package/app/modules/stickerPackModule/stickerDomainEventConsumerRuntime.js +3 -2
  90. package/app/modules/stickerPackModule/stickerMarketplaceDriftService.js +2 -1
  91. package/app/modules/stickerPackModule/stickerPackCommandHandlers.js +80 -58
  92. package/app/modules/stickerPackModule/stickerPackMarketplaceService.js +2 -1
  93. package/app/modules/stickerPackModule/stickerPackRepository.js +2 -1
  94. package/app/modules/stickerPackModule/stickerPackScoreSnapshotRuntime.js +5 -4
  95. package/app/modules/stickerPackModule/stickerPackService.js +13 -6
  96. package/app/modules/stickerPackModule/stickerStorageService.js +3 -2
  97. package/app/modules/stickerPackModule/stickerWorkerPipelineRuntime.js +2 -1
  98. package/app/modules/systemMetricsModule/AGENT.md +1 -1
  99. package/app/modules/systemMetricsModule/commandConfig.json +29 -0
  100. package/app/modules/systemMetricsModule/pingCommand.js +6 -5
  101. package/app/modules/tiktokModule/AGENT.md +1 -1
  102. package/app/modules/tiktokModule/commandConfig.json +29 -0
  103. package/app/modules/tiktokModule/tiktokCommand.js +2 -1
  104. package/app/modules/userModule/AGENT.md +1 -1
  105. package/app/modules/userModule/commandConfig.json +29 -0
  106. package/app/modules/userModule/userCommand.js +72 -23
  107. package/app/modules/waifuPicsModule/AGENT.md +57 -27
  108. package/app/modules/waifuPicsModule/commandConfig.json +87 -0
  109. package/app/modules/waifuPicsModule/waifuPicsCommand.js +3 -2
  110. package/app/observability/metrics.js +136 -0
  111. package/app/services/ai/commandConfigEnrichmentService.js +229 -47
  112. package/app/services/ai/conversationRouterService.js +4 -3
  113. package/app/services/ai/geminiService.js +132 -7
  114. package/app/services/ai/geminiService.test.js +59 -2
  115. package/app/services/ai/globalModuleAiHelpService.js +3 -2
  116. package/app/services/ai/messageCommandExecutionService.js +2 -1
  117. package/app/services/ai/moduleAiHelpCoreService.js +45 -14
  118. package/app/services/ai/moduleToolExecutorService.js +3 -2
  119. package/app/services/ai/moduleToolRegistryService.js +2 -1
  120. package/app/services/ai/toolCandidateSelectorService.js +6 -5
  121. package/app/services/auth/googleWebLinkService.js +3 -2
  122. package/app/services/auth/whatsappLoginLinkService.js +3 -2
  123. package/app/services/external/pokeApiService.js +4 -3
  124. package/app/services/group/groupMetadataService.js +24 -1
  125. package/app/services/infra/dbWriteQueue.js +57 -26
  126. package/app/services/infra/featureFlagService.js +2 -1
  127. package/app/services/messaging/captchaService.js +3 -2
  128. package/app/services/messaging/newsBroadcastService.js +846 -29
  129. package/app/services/multiSession/assignmentBalancerService.js +457 -0
  130. package/app/services/multiSession/groupOwnershipRepository.js +381 -0
  131. package/app/services/multiSession/groupOwnershipService.js +890 -0
  132. package/app/services/multiSession/groupOwnershipService.test.js +309 -0
  133. package/app/services/multiSession/sessionRegistryService.js +293 -0
  134. package/app/services/sticker/stickerFocusService.js +11 -10
  135. package/app/store/aiPromptStore.js +36 -19
  136. package/app/store/conversationSessionStore.js +7 -6
  137. package/app/store/groupConfigStore.js +41 -5
  138. package/app/store/premiumUserStore.js +21 -7
  139. package/app/utils/antiLink/antiLinkModule.js +352 -16
  140. package/app/workers/aiHelperContinuousLearningWorker.js +512 -0
  141. package/app/workers/aiLearningWorker.js +6 -5
  142. package/app/workers/commandConfigEnrichmentWorker.js +4 -3
  143. package/database/index.js +14 -8
  144. package/database/migrations/20260307_d0_hardening_down.sql +1 -1
  145. package/database/migrations/20260314_d7_canonical_sender_down.sql +1 -1
  146. package/database/migrations/20260406_d30_security_analytics_down.sql +1 -1
  147. package/database/migrations/20260411_d35_group_community_metadata_down.sql +59 -0
  148. package/database/migrations/20260411_d35_group_community_metadata_up.sql +62 -0
  149. package/database/migrations/20260412_d36_system_config_tables_down.sql +32 -0
  150. package/database/migrations/20260412_d36_system_config_tables_up.sql +66 -0
  151. package/database/migrations/20260413_d37_group_user_warnings_down.sql +11 -0
  152. package/database/migrations/20260413_d37_group_user_warnings_up.sql +24 -0
  153. package/database/migrations/20260414_d38_multi_session_foundation_down.sql +72 -0
  154. package/database/migrations/20260414_d38_multi_session_foundation_up.sql +125 -0
  155. package/database/migrations/20260414_d39_multi_session_cutover_down.sql +103 -0
  156. package/database/migrations/20260414_d39_multi_session_cutover_up.sql +83 -0
  157. package/database/schema.sql +102 -1
  158. package/docker-compose.yml +4 -1
  159. package/docs/compliance/acceptable-use-policy-2026-03-07.md +1 -1
  160. package/docs/compliance/dpa-b2b-standard-2026-03-07.md +1 -1
  161. package/docs/compliance/privacy-policy-2026-03-07.md +4 -4
  162. package/docs/security/dsar-lgpd-runbook-2026-03-07.md +1 -1
  163. package/docs/security/incident-response-lgpd-anpd-runbook-2026-03-07.md +1 -1
  164. package/docs/security/network-hardening-runbook-2026-03-07.md +53 -0
  165. package/docs/security/omnizap-static-security-headers.conf +25 -0
  166. package/docs/wiki/Home.md +1 -1
  167. package/ecosystem.prod.config.cjs +32 -12
  168. package/index.js +57 -23
  169. package/observability/alert-rules.yml +20 -0
  170. package/observability/grafana/dashboards/omnizap-system-admin.json +229 -0
  171. package/observability/mysql-setup.sql +4 -4
  172. package/observability/system-admin-observability.md +26 -0
  173. package/package.json +20 -6
  174. package/public/apple-touch-icon.png +0 -0
  175. package/public/comandos/commands-catalog.json +2853 -3326
  176. package/public/favicon-16x16.png +0 -0
  177. package/public/favicon-32x32.png +0 -0
  178. package/public/favicon.ico +0 -0
  179. package/public/js/apps/apiDocsApp.js +3 -2
  180. package/public/js/apps/commandsReactApp.js +280 -99
  181. package/public/js/apps/createPackApp.js +11 -10
  182. package/public/js/apps/homeReactApp.js +181 -130
  183. package/public/js/apps/loginReactApp.js +1 -1
  184. package/public/js/apps/stickersApp.js +263 -110
  185. package/public/js/apps/termsReactApp.js +73 -24
  186. package/public/js/apps/userApp.js +4 -3
  187. package/public/js/apps/userPasswordResetReactApp.js +406 -0
  188. package/public/js/apps/userReactApp.js +355 -280
  189. package/public/js/apps/userSystemAdmReactApp.js +1506 -0
  190. package/public/pages/api-docs.html +1 -1
  191. package/public/pages/aup.html +2 -2
  192. package/public/pages/dpa.html +3 -3
  193. package/public/pages/licenca.html +4 -4
  194. package/public/pages/login.html +1 -1
  195. package/public/pages/notice-and-takedown.html +2 -2
  196. package/public/pages/politica-de-privacidade.html +6 -6
  197. package/public/pages/seo-bot-whatsapp-para-grupo.html +3 -3
  198. package/public/pages/seo-bot-whatsapp-sem-programar.html +3 -3
  199. package/public/pages/seo-como-automatizar-avisos-no-whatsapp.html +3 -3
  200. package/public/pages/seo-como-criar-comandos-whatsapp.html +3 -3
  201. package/public/pages/seo-como-evitar-spam-no-whatsapp.html +3 -3
  202. package/public/pages/seo-como-moderar-grupo-whatsapp.html +3 -3
  203. package/public/pages/seo-como-organizar-comunidade-whatsapp.html +3 -3
  204. package/public/pages/seo-melhor-bot-whatsapp-para-grupos.html +3 -3
  205. package/public/pages/stickers-admin.html +1 -1
  206. package/public/pages/stickers-create.html +1 -1
  207. package/public/pages/stickers.html +6 -6
  208. package/public/pages/suboperadores.html +2 -2
  209. package/public/pages/termos-de-uso-texto-integral.html +6 -6
  210. package/public/pages/termos-de-uso.html +3 -3
  211. package/public/pages/user-password-reset.html +4 -5
  212. package/public/pages/user-systemadm.html +9 -463
  213. package/public/pages/user.html +2 -2
  214. package/scripts/clear-whatsapp-session.sh +123 -0
  215. package/scripts/core-ai-mode.mjs +163 -0
  216. package/scripts/deploy.sh +11 -1
  217. package/scripts/email-broadcast-terms-update.mjs +2 -1
  218. package/scripts/enrich-command-config-ux-openai.mjs +492 -0
  219. package/scripts/generate-commands-catalog.mjs +166 -2
  220. package/scripts/generate-module-agents.mjs +2 -1
  221. package/scripts/generate-seo-satellite-pages.mjs +5 -4
  222. package/scripts/github-deploy-notify.mjs +2 -1
  223. package/scripts/github-release-notify.mjs +25 -10
  224. package/scripts/new-whatsapp-session.sh +317 -0
  225. package/scripts/release.sh +2 -19
  226. package/scripts/security-smoketest.mjs +6 -5
  227. package/scripts/security-web-surface-check.mjs +218 -0
  228. package/scripts/sticker-catalog-loadtest.mjs +5 -4
  229. package/server/auth/googleWebAuth/googleWebAuthService.js +8 -7
  230. package/server/auth/jwt/webJwtService.js +1 -1
  231. package/server/auth/stickerCatalogAuthContext.js +2 -1
  232. package/server/auth/termsAcceptance/termsAcceptanceHandler.js +2 -1
  233. package/server/auth/userPassword/userPasswordAuthService.js +2 -1
  234. package/server/auth/userPassword/userPasswordRecoveryService.js +4 -3
  235. package/server/auth/webAccount/webAccountHandlers.js +9 -10
  236. package/server/controllers/admin/adminPanelHandlers.js +267 -16
  237. package/server/controllers/admin/systemAdminController.js +267 -0
  238. package/server/controllers/seo/stickerCatalogSeoContext.js +10 -9
  239. package/server/controllers/sticker/nonCatalogHandlers.js +2 -1
  240. package/server/controllers/sticker/stickerCatalogController.js +23 -36
  241. package/server/controllers/system/contactController.js +9 -17
  242. package/server/controllers/system/githubController.js +3 -2
  243. package/server/controllers/system/stickerCatalogSystemContext.js +41 -19
  244. package/server/controllers/system/systemController.js +254 -1
  245. package/server/controllers/system/systemMetricsController.js +2 -1
  246. package/server/controllers/userController.js +6 -0
  247. package/server/email/emailTemplateService.js +5 -3
  248. package/server/http/httpServer.js +11 -6
  249. package/server/middleware/rateLimit.js +2 -1
  250. package/server/middleware/securityHeaders.js +20 -1
  251. package/server/routes/admin/systemAdminRouter.js +6 -0
  252. package/server/routes/indexRouter.js +30 -6
  253. package/server/routes/observability/grafanaProxyRouter.js +254 -0
  254. package/server/routes/static/staticPageRouter.js +27 -1
  255. package/server/utils/publicContact.js +31 -0
  256. package/utils/time/timeModule.js +135 -0
  257. package/utils/time/timeModule.test.js +65 -0
  258. package/utils/whatsapp/contactEnv.js +39 -0
  259. package/vite.config.mjs +7 -1
  260. package/public/assets/images/brand-icon-192.png +0 -0
  261. package/scripts/sync-readme-snapshot.mjs +0 -133
@@ -146,7 +146,7 @@
146
146
  "aliases": ["cat"],
147
147
  "descricao": "Perguntas para IA com suporte opcional a resposta em audio.",
148
148
  "metodos_de_uso": ["<prefix>ia sua pergunta", "<prefix>ia --audio sua pergunta"],
149
- "permissao_necessaria": "usuario comum",
149
+ "permissao_necessaria": "usuario premium",
150
150
  "limite_de_uso": "texto sujeito a limites da API",
151
151
  "local_de_uso": ["privado", "grupo"],
152
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"],
@@ -205,8 +205,8 @@
205
205
  "user_phrasings": ["quero usar ia", "me ajuda com ia", "perguntas para ia com"],
206
206
  "suggestion_priority": 100,
207
207
  "acesso": {
208
- "somente_premium": false,
209
- "planos_permitidos": ["comum", "premium"]
208
+ "somente_premium": true,
209
+ "planos_permitidos": ["premium"]
210
210
  },
211
211
  "limite_uso_por_plano": {
212
212
  "comum": {
@@ -224,14 +224,16 @@
224
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
225
  },
226
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."
227
+ "premium_only": "⭐ *Recurso Premium*\n\nEste comando é exclusivo para usuários Premium.\nPara liberar o acesso, fale com o admin do sistema no privado.",
228
+ "openai_nao_configurada": "⚠️ *IA indisponível no momento*\n\nEste recurso está em manutenção.\nSe precisar de ajuda, fale com o admin do sistema no privado.",
229
+ "imagem_muito_grande": "⚠️ A imagem está muito grande para análise (limite {{limite_mb}} MB). Envie uma imagem menor.",
230
+ "imagem_download_falhou": "⚠️ Não consegui ler sua imagem agora. Reenvie a imagem.\nSe o erro continuar, fale com o admin do sistema no privado.",
231
+ "resposta_vazia": "⚠️ Não consegui montar uma resposta agora. Tente novamente em instantes.",
232
+ "audio_muito_longo": "⚠️ A resposta ficou grande para áudio. Vou te enviar em texto.",
233
+ "audio_falhou": "⚠️ Não consegui gerar o áudio agora. Vou te responder em texto.",
234
+ "erro_openai": "❌ *Não consegui responder agora*\n\nTente novamente em instantes.\nSe o erro continuar, fale com o admin do sistema no privado.",
235
+ "usage_header": "🤖 *Comando CAT*",
236
+ "resposta_prefixo_texto": "🐈‍⬛ "
235
237
  },
236
238
  "opcoes": {
237
239
  "parse": {
@@ -260,7 +262,7 @@
260
262
  "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
263
  }
262
264
  },
263
- "permission": "usuario comum",
265
+ "permission": "usuario premium",
264
266
  "contexts": ["privado", "grupo"],
265
267
  "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
268
  "requirements": {
@@ -321,8 +323,8 @@
321
323
  "escopo": "sem_rate_limit_explicito"
322
324
  },
323
325
  "access": {
324
- "somente_premium": false,
325
- "planos_permitidos": ["comum", "premium"]
326
+ "somente_premium": true,
327
+ "planos_permitidos": ["premium"]
326
328
  },
327
329
  "plan_limits": {
328
330
  "comum": {
@@ -371,11 +373,11 @@
371
373
  "suggestion_priority": 100
372
374
  },
373
375
  "access": {
374
- "premium_only": false,
375
- "allowed_plans": ["comum", "premium"],
376
+ "premium_only": true,
377
+ "allowed_plans": ["premium"],
376
378
  "legacy": {
377
- "somente_premium": false,
378
- "planos_permitidos": ["comum", "premium"]
379
+ "somente_premium": true,
380
+ "planos_permitidos": ["premium"]
379
381
  }
380
382
  },
381
383
  "plan_limits": {
@@ -404,6 +406,23 @@
404
406
  "schema": "legacy_v1_and_v2",
405
407
  "legacy_name": "ia",
406
408
  "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"]
409
+ },
410
+ "user_experience": {
411
+ "resumo_usuario": "Permite fazer perguntas à IA diretamente pelo chat, com opção de ouvir a resposta em áudio. Ideal para respostas rápidas, explicações simples ou conteúdos curtos.",
412
+ "quando_usar": ["Quando quiser uma resposta direta da IA para uma pergunta simples.", "Quando desejar a resposta em áudio (opção disponível).", "Quando houver contexto com mídia para a IA considerar na resposta."],
413
+ "exemplos_reais": [
414
+ {
415
+ "situacao": "Pergunta rápida sobre fato.",
416
+ "comando": "<prefix>ia qual é a capital da França",
417
+ "resposta_esperada": "Paris.",
418
+ "variacao": "variante com áudio: <prefix>ia --audio qual é a capital da França; variante com alias: <prefix>cat qual é a capital da França."
419
+ }
420
+ ],
421
+ "resposta_esperada": ["Resposta direta da IA conforme a pergunta; se áudio foi solicitado, exibe também o áudio correspondente."],
422
+ "erros_comuns_usuario": ["Esquecer de usar o prefixo correto (<prefix>).", "Usar o formato de uso errado ou ignorar os métodos de uso.", "Tentar usar o recurso de áudio sem ter acesso necessário (premium).", "Fazer perguntas vagas ou sem contexto suficiente.", "Não especificar claramente o que precisa na pergunta."],
423
+ "passos_se_der_erro": ["Verifique se o comando está no formato certo: <prefix>ia sua pergunta.", "Se pedir áudio, confirme que o seu plano permite áudio (premium).", "Corrija o texto da pergunta e tente novamente: <prefix>ia sua pergunta", "Caso o erro persista, tente a versão com alias: <prefix>cat sua pergunta", "Se precisar, procure ajuda para confirmar detalhes da sua assinatura ou suporte do serviço"],
424
+ "resumo_usuario_origem": "auto_ia_assistida",
425
+ "resumo_usuario_revisao_pendente": true
407
426
  }
408
427
  },
409
428
  {
@@ -411,7 +430,7 @@
411
430
  "aliases": ["catimage", "catimg"],
412
431
  "descricao": "Gera/edita imagem com IA por prompt.",
413
432
  "metodos_de_uso": ["<prefix>iaimagem seu prompt", "<prefix>iaimagem --size 1536x1024 seu prompt"],
414
- "permissao_necessaria": "usuario comum",
433
+ "permissao_necessaria": "usuario premium",
415
434
  "limite_de_uso": "imagem de entrada ate OPENAI_MAX_IMAGE_MB (padrao 50 MB)",
416
435
  "local_de_uso": ["privado", "grupo"],
417
436
  "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)"],
@@ -503,13 +522,16 @@
503
522
  "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
523
  },
505
524
  "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."
525
+ "premium_only": "⭐ *Recurso Premium*\n\nEste comando é exclusivo para usuários Premium.\nPara liberar o acesso, fale com o admin do sistema no privado.",
526
+ "openai_nao_configurada": "⚠️ *Gerador de imagem indisponível*\n\nEste recurso está em manutenção.\nSe precisar de ajuda, fale com o admin do sistema no privado.",
527
+ "imagem_muito_grande": "⚠️ A imagem está muito grande para edição (limite {{limite_mb}} MB). Envie uma imagem menor.",
528
+ "imagem_download_falhou": "⚠️ Não consegui ler sua imagem agora. Reenvie a imagem.\nSe o erro continuar, fale com o admin do sistema no privado.",
529
+ "opcoes_invalidas": "⚠️ Algumas opções do comando estão inválidas.\nDetalhes: {{detalhes}}\n\nUse *{{prefix}}catimg* sem opções para ver o formato correto.",
530
+ "resposta_vazia": "⚠️ Não consegui gerar a imagem agora. Tente novamente em instantes.",
531
+ "erro_openai": "❌ *Não consegui gerar sua imagem agora*\n\nTente novamente em instantes.\nSe o erro continuar, fale com o admin do sistema no privado.",
532
+ "usage_header": "🖼️ *Imagem IA*",
533
+ "resposta_prefixo_texto_imagem": "🖼️ ",
534
+ "imagem_caption_sucesso": "🖼️ Imagem gerada."
513
535
  },
514
536
  "opcoes": {
515
537
  "geracao_imagem": {
@@ -575,7 +597,7 @@
575
597
  "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
598
  }
577
599
  },
578
- "permission": "usuario comum",
600
+ "permission": "usuario premium",
579
601
  "contexts": ["privado", "grupo"],
580
602
  "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
603
  "requirements": {
@@ -745,6 +767,35 @@
745
767
  "schema": "legacy_v1_and_v2",
746
768
  "legacy_name": "iaimagem",
747
769
  "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"]
770
+ },
771
+ "user_experience": {
772
+ "resumo_usuario": "Gerar ou editar imagens com IA a partir de um prompt via <prefix>iaimagem. Você pode ajustar o tamanho com --size, escolher qualidade e formato. Algumas funções são Premium.",
773
+ "quando_usar": ["Quero criar uma imagem a partir de uma descrição simples.", "Quero definir o tamanho da imagem (por exemplo, 1024x1024 ou 1536x1024).", "Quero escolher qualidade ou formato de saída (png, jpeg, webp).", "Preciso de recursos avançados que exigem assinatura Premium."],
774
+ "exemplos_reais": [
775
+ {
776
+ "situacao": "Gerar imagem simples a partir do prompt.",
777
+ "comando": "<prefix>iaimagem pôr do sol sobre o mar",
778
+ "resposta_esperada": "Imagem gerada com sucesso.",
779
+ "variacao": "sem --size para usar o tamanho padrão."
780
+ },
781
+ {
782
+ "situacao": "Gerar imagem com tamanho específico.",
783
+ "comando": "<prefix>iaimagem --size 1536x1024 cidade futurista ao entardecer",
784
+ "resposta_esperada": "Imagem gerada com sucesso.",
785
+ "variacao": "inclui --size 1536x1024."
786
+ },
787
+ {
788
+ "situacao": "Gerar imagem com qualidade alta (Premium).",
789
+ "comando": "<prefix>iaimagem --size 1024x1024 --quality high retrato iluminado",
790
+ "resposta_esperada": "Imagem gerada com sucesso.",
791
+ "variacao": "requer assinatura Premium."
792
+ }
793
+ ],
794
+ "resposta_esperada": ["Imagem gerada com sucesso.", "Formato de uso inválido. Consulte metodos_de_uso.", "Permissão insuficiente para executar este comando."],
795
+ "erros_comuns_usuario": ["Esquecer de fornecer um prompt descritivo", "Usar tamanho ou formato não suportado", "Não ter acesso Premium quando o recurso exigir assinatura", "Não estar logado (Google Login necessário quando requerido)"],
796
+ "passos_se_der_erro": ["Copie o comando com o <prefix> correto e tente novamente", "Inclua um prompt claro que descreva a imagem desejada", "Se usar --size, escolha entre 1024x1024, 1024x1536 ou 1536x1024", "Defina --format (png|jpeg|webp) e --quality (auto|low|medium|high) se necessário", "Verifique se você tem a assinatura Premium para recursos avançados"],
797
+ "resumo_usuario_origem": "auto_ia_assistida",
798
+ "resumo_usuario_revisao_pendente": true
748
799
  }
749
800
  },
750
801
  {
@@ -826,7 +877,8 @@
826
877
  "premium_only": "⭐ *Comando Premium*\n\nEste comando é exclusivo para usuários premium.\nFale com o administrador para liberar o acesso.",
827
878
  "prompt_muito_longo": "⚠️ Prompt muito longo. Limite: {{max_chars}} caracteres.",
828
879
  "prompt_reset_sucesso": "✅ Prompt da IA restaurado para o padrão.",
829
- "prompt_update_sucesso": "✅ Prompt da IA atualizado para você."
880
+ "prompt_update_sucesso": "✅ Prompt da IA atualizado para você.",
881
+ "usage_header": "🧠 *Prompt da IA*"
830
882
  },
831
883
  "limites_operacionais": {
832
884
  "prompt_max_chars": 2000
@@ -972,6 +1024,40 @@
972
1024
  "schema": "legacy_v1_and_v2",
973
1025
  "legacy_name": "pergunteia",
974
1026
  "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"]
1027
+ },
1028
+ "opcoes": {
1029
+ "parse": {
1030
+ "reset_aliases": ["reset", "default", "padrao", "padrão"]
1031
+ }
1032
+ },
1033
+ "user_experience": {
1034
+ "resumo_usuario": "Defina ou redefina o seu prompt personalizado da IA. Envie o conteúdo desejado ou use reset para voltar ao padrão. Após o envio, a IA responderá conforme o prompt configurado.",
1035
+ "quando_usar": ["Quero orientar a IA para um estilo específico de respostas (tom, foco, formato).", "Preciso que as respostas sigam um conjunto de instruções definidas (ex.: curto, passo a passo, com exemplos).", "Quero limpar o prompt atual e voltar ao comportamento padrão da IA."],
1036
+ "exemplos_reais": [
1037
+ {
1038
+ "situacao": "Definir respostas objetivas para estudo em ciências.",
1039
+ "comando": "<prefix>pergunteia novo prompt Responda resumidamente com 3 fatos-chave sobre cada tema.",
1040
+ "resposta_esperada": "Comando executado com sucesso.",
1041
+ "variacao": "Tom direto, menos detalhes, foco no essencial."
1042
+ },
1043
+ {
1044
+ "situacao": "Resetar o prompt para o comportamento padrão.",
1045
+ "comando": "<prefix>pergunteia reset",
1046
+ "resposta_esperada": "Comando executado com sucesso.",
1047
+ "variacao": "Limpeza completa do prompt atual."
1048
+ },
1049
+ {
1050
+ "situacao": "Configurar tom formal para atendimento.",
1051
+ "comando": "<prefix>pergunteia novo prompt Responda de forma formal, com passos práticos e exemplos quando apropriado.",
1052
+ "resposta_esperada": "Comando executado com sucesso.",
1053
+ "variacao": "Tom profissional, orientado a ações."
1054
+ }
1055
+ ],
1056
+ "resposta_esperada": ["Ao executar um comando válido, a IA atualiza o prompt conforme informado e responde de acordo com o novo prompt. Em caso de sucesso, costuma aparecer: 'Comando executado com sucesso.'"],
1057
+ "erros_comuns_usuario": ["Esquecer de incluir o texto do prompt após o comando <prefix>pergunteia novo prompt.", "Não fechar aspas ou usar formatação inadequada no conteúdo do prompt.", "Não usar o prefix correto ou digitar o comando em lugar errado.", "Tentar usar o reset sem entender o impacto (volta ao comportamento padrão).", "Definir um prompt vago ou ambíguo que não orienta a IA de forma clara."],
1058
+ "passos_se_der_erro": ["Verifique se o comando segue o formato: '<prefix>pergunteia novo prompt <texto>' ou '<prefix>pergunteia reset'.", "Confirme que você está logado com Google Login, conforme exigido.", "Tente novamente com um prompt simples para confirmar funcionamento.", "Se retornar 'Formato de uso inválido', ajuste o comando para o formato correto e tente novamente.", "Se aparecer 'Permissão insuficiente', confirme se você tem acesso necessário ou peça ao admin para liberar."],
1059
+ "resumo_usuario_origem": "auto_ia_assistida",
1060
+ "resumo_usuario_revisao_pendente": true
975
1061
  }
976
1062
  }
977
1063
  ],
@@ -36,7 +36,11 @@ const sanitizeMetadata = (value) => {
36
36
  }
37
37
  };
38
38
 
39
+ let messageAnalysisSessionColumnSupported = true;
40
+
39
41
  export async function createMessageAnalysisEvent(payload = {}, connection = null) {
42
+ const sessionId = sanitizeText(payload.sessionId || payload.session_id, 64) || 'default';
43
+ const ownerSessionId = sanitizeText(payload.ownerSessionId || payload.owner_session_id || payload?.metadata?.owner_session_id, 64);
40
44
  const messageId = sanitizeText(payload.messageId, 255);
41
45
  const chatId = sanitizeText(payload.chatId, 255);
42
46
  const senderId = sanitizeText(payload.senderId, 255);
@@ -49,9 +53,42 @@ export async function createMessageAnalysisEvent(payload = {}, connection = null
49
53
  const processingResult = sanitizeText(payload.processingResult, 64) || 'processed';
50
54
  const errorCode = sanitizeText(payload.errorCode, 96);
51
55
  const metadata = sanitizeMetadata(payload.metadata);
56
+ const isGroup = sanitizeBool(payload.isGroup);
57
+
58
+ if (isGroup && ownerSessionId && ownerSessionId !== sessionId) {
59
+ return false;
60
+ }
61
+
62
+ const valuesWithSession = [sessionId, messageId, chatId, senderId, senderName, upsertType, source, isGroup, sanitizeBool(payload.isFromBot), sanitizeBool(payload.isCommand), commandName, clampInt(payload.commandArgsCount, 0, 0, 64), payload.commandKnown === null || payload.commandKnown === undefined ? null : sanitizeBool(payload.commandKnown), commandPrefix, messageKind, sanitizeBool(payload.hasMedia), clampInt(payload.mediaCount, 0, 0, 25), clampInt(payload.textLength, 0, 0, 16_000), processingResult, errorCode, metadata];
63
+ const valuesWithoutSession = valuesWithSession.slice(1);
64
+
65
+ const sqlWithSession = `INSERT INTO ${TABLES.MESSAGE_ANALYSIS_EVENT}
66
+ (
67
+ session_id,
68
+ message_id,
69
+ chat_id,
70
+ sender_id,
71
+ sender_name,
72
+ upsert_type,
73
+ source,
74
+ is_group,
75
+ is_from_bot,
76
+ is_command,
77
+ command_name,
78
+ command_args_count,
79
+ command_known,
80
+ command_prefix,
81
+ message_kind,
82
+ has_media,
83
+ media_count,
84
+ text_length,
85
+ processing_result,
86
+ error_code,
87
+ metadata
88
+ )
89
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`;
52
90
 
53
- await executeQuery(
54
- `INSERT INTO ${TABLES.MESSAGE_ANALYSIS_EVENT}
91
+ const sqlWithoutSession = `INSERT INTO ${TABLES.MESSAGE_ANALYSIS_EVENT}
55
92
  (
56
93
  message_id,
57
94
  chat_id,
@@ -74,10 +111,21 @@ export async function createMessageAnalysisEvent(payload = {}, connection = null
74
111
  error_code,
75
112
  metadata
76
113
  )
77
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
78
- [messageId, chatId, senderId, senderName, upsertType, source, sanitizeBool(payload.isGroup), sanitizeBool(payload.isFromBot), sanitizeBool(payload.isCommand), commandName, clampInt(payload.commandArgsCount, 0, 0, 64), payload.commandKnown === null || payload.commandKnown === undefined ? null : sanitizeBool(payload.commandKnown), commandPrefix, messageKind, sanitizeBool(payload.hasMedia), clampInt(payload.mediaCount, 0, 0, 25), clampInt(payload.textLength, 0, 0, 16_000), processingResult, errorCode, metadata],
79
- connection,
80
- );
114
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`;
115
+
116
+ if (messageAnalysisSessionColumnSupported) {
117
+ try {
118
+ await executeQuery(sqlWithSession, valuesWithSession, connection);
119
+ return true;
120
+ } catch (error) {
121
+ if (error?.code !== 'ER_BAD_FIELD_ERROR') {
122
+ throw error;
123
+ }
124
+ messageAnalysisSessionColumnSupported = false;
125
+ }
126
+ }
127
+
128
+ await executeQuery(sqlWithoutSession, valuesWithoutSession, connection);
81
129
 
82
130
  return true;
83
131
  }
@@ -7,7 +7,7 @@ Este arquivo e destinado a agentes de IA para gerar respostas no contexto dos co
7
7
  - arquivo_base: `app/modules/gameModule/commandConfig.json`
8
8
  - schema_version: `2.0.0`
9
9
  - module_enabled: `true`
10
- - generated_at: `2026-03-11T02:35:17.177Z`
10
+ - generated_at: `2026-03-17T04:04:14.195Z`
11
11
 
12
12
  ## Escopo do Modulo
13
13
 
@@ -357,6 +357,35 @@
357
357
  "schema": "legacy_v1_and_v2",
358
358
  "legacy_name": "dado",
359
359
  "legacy_fields_present": ["descricao", "metodos_de_uso", "permissao_necessaria", "local_de_uso", "informacoes_coletadas", "argumentos", "pre_condicoes", "dependencias_externas", "efeitos_colaterais", "observabilidade", "privacidade", "acesso", "limite_uso_por_plano"]
360
+ },
361
+ "user_experience": {
362
+ "resumo_usuario": "Rola um dado com número de lados opcional. Se não informar, usa 6. Use <prefix>dado, <prefix>dado <lados> ou <prefix>dice <lados> para obter um resultado entre 1 e o número de lados (até 1000).",
363
+ "quando_usar": ["Precisa de um número aleatório para jogos de tabuleiro, RPG ou simulações.", "Quero um dado específico de lados para um desafio ou teste.", "Vou jogar com dados com mais de 6 lados (até 1000)."],
364
+ "exemplos_reais": [
365
+ {
366
+ "situacao": "Rolar dado padrão (6 lados).",
367
+ "comando": "<prefix>dado",
368
+ "resposta_esperada": "Você rolou um dado de 6 lados: 4.",
369
+ "variacao": "Pode também usar <prefix>dado para o mesmo resultado."
370
+ },
371
+ {
372
+ "situacao": "Rolar dado de 20 lados.",
373
+ "comando": "<prefix)dado 20",
374
+ "resposta_esperada": "Você rolou um dado de 20 lados: 13.",
375
+ "variacao": "ou <prefix>dice 20."
376
+ },
377
+ {
378
+ "situacao": "Rolar dado de 100 lados.",
379
+ "comando": "<prefix>dice 100",
380
+ "resposta_esperada": "Você rolou um dado de 100 lados: 87.",
381
+ "variacao": "ou <prefix>dado 100."
382
+ }
383
+ ],
384
+ "resposta_esperada": ["Resultado do dado: <valor>", "Você rolou um dado de <lados> lados: <valor>"],
385
+ "erros_comuns_usuario": ["Formato de uso inválido. Use um dos formatos: <prefix>dado, <prefix>dado <lados> ou <prefix>dice <lados>.", "O número de lados precisa estar entre 2 e 1000.", "Informar um valor não numérico ou caracteres.", "Esquecer de incluir o <prefix> ao digitar o comando."],
386
+ "passos_se_der_erro": ["Leia a mensagem de erro com atenção e ajuste o comando para um formato válido.", "Verifique se o valor de lados está entre 2 e 1000 quando informado.", "Use exatamente um dos formatos: <prefix>dado, <prefix>dado <lados> ou <prefix>dice <lados>.", "Se o problema persistir, confirme que você está logado com Google e tente novamente.", "Se ainda assim não funcionar, peça ajuda ao suporte."],
387
+ "resumo_usuario_origem": "auto_ia_assistida",
388
+ "resumo_usuario_revisao_pendente": true
360
389
  }
361
390
  }
362
391
  ],
@@ -7,7 +7,7 @@ Este arquivo e destinado a agentes de IA para gerar respostas no contexto dos co
7
7
  - arquivo_base: `app/modules/menuModule/commandConfig.json`
8
8
  - schema_version: `2.0.0`
9
9
  - module_enabled: `true`
10
- - generated_at: `2026-03-11T02:35:17.177Z`
10
+ - generated_at: `2026-03-17T04:04:14.195Z`
11
11
 
12
12
  ## Escopo do Modulo
13
13
 
@@ -144,15 +144,15 @@
144
144
  {
145
145
  "name": "menu",
146
146
  "aliases": [],
147
- "descricao": "Exibe o menu principal ou um menu por categoria.",
148
- "metodos_de_uso": ["<prefix>menu", "<prefix>menu anime", "<prefix>menu stats"],
147
+ "descricao": "Exibe o menu dinâmico de comandos (com destaques por uso), categorias e atalhos para catálogo completo.",
148
+ "metodos_de_uso": ["<prefix>menu", "<prefix>menu top", "<prefix>menu categoria <nome>", "<prefix>menu todos", "<prefix>menu anime", "<prefix>menu stats"],
149
149
  "permissao_necessaria": "usuario comum",
150
150
  "limite_de_uso": "sem limite especifico",
151
151
  "local_de_uso": ["privado", "grupo"],
152
152
  "informacoes_coletadas": ["identificador do chat (remoteJid)", "identificador do remetente (senderJid)", "texto do comando e argumentos", "contexto da mensagem (citacao e mencoes, quando existir)", "categoria solicitada no menu (quando informada)"],
153
153
  "enabled": true,
154
154
  "categoria": "menu",
155
- "subcomandos": ["figurinhas", "sticker", "stickers", "midia", "media", "quote", "quotes", "ia", "ai", "stats", "estatisticas", "anime"],
155
+ "subcomandos": ["top", "todos", "categoria", "figurinhas", "sticker", "stickers", "midia", "media", "quote", "quotes", "ia", "ai", "stats", "estatisticas", "anime"],
156
156
  "argumentos": [
157
157
  {
158
158
  "nome": "categoria",
@@ -214,16 +214,22 @@
214
214
  }
215
215
  },
216
216
  "mensagens_uso": {
217
- "default": ["<prefix>menu", "<prefix>menu anime", "<prefix>menu stats"]
217
+ "default": ["<prefix>menu", "<prefix>menu top", "<prefix>menu categoria <nome>", "<prefix>menu todos", "<prefix>menu anime", "<prefix>menu stats"],
218
+ "category": ["<prefix>menu categoria <nome>"],
219
+ "top": ["<prefix>menu top"],
220
+ "all": ["<prefix>menu todos"]
218
221
  },
219
222
  "id": "menu.menu",
220
- "description": "Exibe o menu principal ou um menu por categoria.",
221
- "usage": ["<prefix>menu", "<prefix>menu anime", "<prefix>menu stats"],
223
+ "description": "Exibe o menu dinâmico de comandos (com destaques por uso), categorias e atalhos para catálogo completo.",
224
+ "usage": ["<prefix>menu", "<prefix>menu top", "<prefix>menu categoria <nome>", "<prefix>menu todos", "<prefix>menu anime", "<prefix>menu stats"],
222
225
  "docs": {
223
- "summary": "Exibe o menu principal ou um menu por categoria.",
224
- "usage_examples": ["<prefix>menu", "<prefix>menu anime", "<prefix>menu stats"],
226
+ "summary": "Exibe o menu dinâmico de comandos (com destaques por uso), categorias e atalhos para catálogo completo.",
227
+ "usage_examples": ["<prefix>menu", "<prefix>menu top", "<prefix>menu categoria <nome>", "<prefix>menu todos", "<prefix>menu anime", "<prefix>menu stats"],
225
228
  "usage_variants": {
226
- "default": ["<prefix>menu", "<prefix>menu anime", "<prefix>menu stats"]
229
+ "default": ["<prefix>menu", "<prefix>menu top", "<prefix>menu categoria <nome>", "<prefix>menu todos", "<prefix>menu anime", "<prefix>menu stats"],
230
+ "category": ["<prefix>menu categoria <nome>"],
231
+ "top": ["<prefix>menu top"],
232
+ "all": ["<prefix>menu todos"]
227
233
  }
228
234
  },
229
235
  "permission": "usuario comum",
@@ -264,7 +270,7 @@
264
270
  ],
265
271
  "behavior": {
266
272
  "type": "subcommand",
267
- "allowed_actions": ["figurinhas", "sticker", "stickers", "midia", "media", "quote", "quotes", "ia", "ai", "stats", "estatisticas", "anime"]
273
+ "allowed_actions": ["top", "todos", "categoria", "figurinhas", "sticker", "stickers", "midia", "media", "quote", "quotes", "ia", "ai", "stats", "estatisticas", "anime"]
268
274
  },
269
275
  "limits": {
270
276
  "usage_description": "sem limite especifico",
@@ -357,6 +363,35 @@
357
363
  "schema": "legacy_v1_and_v2",
358
364
  "legacy_name": "menu",
359
365
  "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"]
366
+ },
367
+ "user_experience": {
368
+ "resumo_usuario": "Exibe um menu dinâmico com comandos em destaque por uso, navegação por categoria e acesso ao catálogo completo do site.",
369
+ "quando_usar": ["Quando quiser descobrir os comandos mais usados sem receber uma lista gigante.", "Quando precisar navegar por comandos de uma categoria específica.", "Quando quiser abrir rapidamente o catálogo completo no site."],
370
+ "exemplos_reais": [
371
+ {
372
+ "situacao": "Usuário quer ver os comandos mais usados.",
373
+ "comando": "<prefix>menu top",
374
+ "resposta_esperada": "Lista com comandos em destaque por uso recente.",
375
+ "variacao": "ranking por uso"
376
+ },
377
+ {
378
+ "situacao": "Usuário quer comandos da categoria admin.",
379
+ "comando": "<prefix>menu categoria admin",
380
+ "resposta_esperada": "Lista de comandos da categoria solicitada.",
381
+ "variacao": "filtro por categoria"
382
+ },
383
+ {
384
+ "situacao": "Usuário quer ver o catálogo completo.",
385
+ "comando": "<prefix>menu todos",
386
+ "resposta_esperada": "Visão completa dos comandos por categoria e link do site.",
387
+ "variacao": "catálogo completo"
388
+ }
389
+ ],
390
+ "resposta_esperada": ["Menu carregado com as opções disponíveis.", "Menu da categoria exibido com opções correspondentes.", "Menu de estatísticas exibido com opções relevantes."],
391
+ "erros_comuns_usuario": ["Formato de uso incorreto. Use <prefix>menu ou <prefix>menu <categoria>.", "Categoria digitada não existe ou está incorreta.", "Não estar logado com Google quando o comando exigir autenticação.", "Digitar espaços extras ou caracteres não suportados na sintaxe do comando."],
392
+ "passos_se_der_erro": ["Verifique o formato: <prefix>menu ou <prefix>menu <categoria>.", "Confirme se a categoria informada existe entre as opções válidas.", "Assegure-se de estar logado com Google, se necessário.", "Tente novamente; se persistir, envie uma captura de tela do erro para apoio."],
393
+ "resumo_usuario_origem": "auto_ia_assistida",
394
+ "resumo_usuario_revisao_pendente": true
360
395
  }
361
396
  }
362
397
  ],