@omnizap-system/omnizap 2.6.1 → 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 (156) hide show
  1. package/.env.example +54 -9
  2. package/.github/workflows/ci.yml +3 -3
  3. package/.github/workflows/security-runner-hardening.yml +1 -1
  4. package/.github/workflows/security-zap-full-scan.yml +1 -0
  5. package/app/config/index.js +2 -0
  6. package/app/configParts/adminIdentity.js +5 -5
  7. package/app/configParts/baileysConfig.js +226 -55
  8. package/app/configParts/groupUtils.js +5 -0
  9. package/app/configParts/messagePersistenceService.js +143 -3
  10. package/app/configParts/sessionConfig.js +157 -0
  11. package/app/connection/baileysCompatibility.test.js +1 -1
  12. package/app/connection/groupOwnerWriteStateResolver.js +109 -0
  13. package/app/connection/socketController.js +625 -124
  14. package/app/connection/socketController.multiSession.test.js +108 -0
  15. package/app/controllers/messageController.js +1 -1
  16. package/app/controllers/messagePipeline/commandMiddleware.js +12 -10
  17. package/app/controllers/messagePipeline/conversationMiddleware.js +2 -1
  18. package/app/controllers/messagePipeline/messagePipelineMiddlewares.test.js +104 -0
  19. package/app/controllers/messagePipeline/preProcessingMiddlewares.js +80 -2
  20. package/app/controllers/messageProcessingPipeline.js +88 -9
  21. package/app/controllers/messageProcessingPipeline.test.js +200 -0
  22. package/app/modules/adminModule/AGENT.md +1 -1
  23. package/app/modules/adminModule/commandConfig.json +3318 -1347
  24. package/app/modules/adminModule/groupCommandHandlers.js +856 -14
  25. package/app/modules/adminModule/groupCommandHandlers.test.js +375 -9
  26. package/app/modules/adminModule/groupWarningRepository.js +152 -0
  27. package/app/modules/aiModule/AGENT.md +47 -30
  28. package/app/modules/aiModule/aiConfigRuntime.js +1 -0
  29. package/app/modules/aiModule/catCommand.js +132 -25
  30. package/app/modules/aiModule/commandConfig.json +114 -28
  31. package/app/modules/analyticsModule/messageAnalysisEventRepository.js +54 -6
  32. package/app/modules/gameModule/AGENT.md +1 -1
  33. package/app/modules/gameModule/commandConfig.json +29 -0
  34. package/app/modules/menuModule/AGENT.md +1 -1
  35. package/app/modules/menuModule/commandConfig.json +45 -10
  36. package/app/modules/menuModule/menuCatalogService.js +190 -0
  37. package/app/modules/menuModule/menuCommandUsageRepository.js +109 -0
  38. package/app/modules/menuModule/menuDynamicService.js +511 -0
  39. package/app/modules/menuModule/menuDynamicService.test.js +141 -0
  40. package/app/modules/menuModule/menus.js +36 -5
  41. package/app/modules/playModule/AGENT.md +10 -5
  42. package/app/modules/playModule/commandConfig.json +74 -16
  43. package/app/modules/playModule/playCommandConstants.js +13 -7
  44. package/app/modules/playModule/playCommandCore.js +4 -6
  45. package/app/modules/playModule/{playCommandYtDlpClient.js → playCommandMediaClient.js} +684 -332
  46. package/app/modules/playModule/playConfigRuntime.js +5 -6
  47. package/app/modules/playModule/playModuleCriticalFlows.test.js +44 -59
  48. package/app/modules/quoteModule/AGENT.md +1 -1
  49. package/app/modules/quoteModule/commandConfig.json +29 -0
  50. package/app/modules/rpgPokemonModule/AGENT.md +1 -1
  51. package/app/modules/rpgPokemonModule/commandConfig.json +29 -0
  52. package/app/modules/statsModule/AGENT.md +1 -1
  53. package/app/modules/statsModule/commandConfig.json +58 -0
  54. package/app/modules/stickerModule/AGENT.md +1 -1
  55. package/app/modules/stickerModule/commandConfig.json +145 -0
  56. package/app/modules/stickerPackModule/AGENT.md +1 -1
  57. package/app/modules/stickerPackModule/autoPackCollectorService.js +5 -1
  58. package/app/modules/stickerPackModule/commandConfig.json +29 -0
  59. package/app/modules/stickerPackModule/stickerAutoPackByTagsRuntime.js +1 -1
  60. package/app/modules/stickerPackModule/stickerPackCommandHandlers.js +78 -57
  61. package/app/modules/stickerPackModule/stickerPackService.js +13 -6
  62. package/app/modules/systemMetricsModule/AGENT.md +1 -1
  63. package/app/modules/systemMetricsModule/commandConfig.json +29 -0
  64. package/app/modules/tiktokModule/AGENT.md +1 -1
  65. package/app/modules/tiktokModule/commandConfig.json +29 -0
  66. package/app/modules/userModule/AGENT.md +1 -1
  67. package/app/modules/userModule/commandConfig.json +29 -0
  68. package/app/modules/waifuPicsModule/AGENT.md +57 -27
  69. package/app/modules/waifuPicsModule/commandConfig.json +87 -0
  70. package/app/observability/metrics.js +136 -0
  71. package/app/services/ai/commandConfigEnrichmentService.js +229 -47
  72. package/app/services/ai/geminiService.js +131 -7
  73. package/app/services/ai/geminiService.test.js +59 -2
  74. package/app/services/ai/moduleAiHelpCoreService.js +33 -4
  75. package/app/services/group/groupMetadataService.js +24 -1
  76. package/app/services/infra/dbWriteQueue.js +51 -21
  77. package/app/services/messaging/newsBroadcastService.js +843 -27
  78. package/app/services/multiSession/assignmentBalancerService.js +457 -0
  79. package/app/services/multiSession/groupOwnershipRepository.js +381 -0
  80. package/app/services/multiSession/groupOwnershipService.js +890 -0
  81. package/app/services/multiSession/groupOwnershipService.test.js +309 -0
  82. package/app/services/multiSession/sessionRegistryService.js +293 -0
  83. package/app/store/aiPromptStore.js +36 -19
  84. package/app/store/groupConfigStore.js +41 -5
  85. package/app/store/premiumUserStore.js +21 -7
  86. package/app/utils/antiLink/antiLinkModule.js +352 -16
  87. package/app/workers/aiHelperContinuousLearningWorker.js +512 -0
  88. package/database/index.js +6 -0
  89. package/database/migrations/20260307_d0_hardening_down.sql +1 -1
  90. package/database/migrations/20260314_d7_canonical_sender_down.sql +1 -1
  91. package/database/migrations/20260406_d30_security_analytics_down.sql +1 -1
  92. package/database/migrations/20260411_d35_group_community_metadata_down.sql +59 -0
  93. package/database/migrations/20260411_d35_group_community_metadata_up.sql +62 -0
  94. package/database/migrations/20260412_d36_system_config_tables_down.sql +32 -0
  95. package/database/migrations/20260412_d36_system_config_tables_up.sql +66 -0
  96. package/database/migrations/20260413_d37_group_user_warnings_down.sql +11 -0
  97. package/database/migrations/20260413_d37_group_user_warnings_up.sql +24 -0
  98. package/database/migrations/20260414_d38_multi_session_foundation_down.sql +72 -0
  99. package/database/migrations/20260414_d38_multi_session_foundation_up.sql +125 -0
  100. package/database/migrations/20260414_d39_multi_session_cutover_down.sql +103 -0
  101. package/database/migrations/20260414_d39_multi_session_cutover_up.sql +83 -0
  102. package/database/schema.sql +102 -1
  103. package/docker-compose.yml +4 -1
  104. package/docs/compliance/acceptable-use-policy-2026-03-07.md +1 -1
  105. package/docs/compliance/privacy-policy-2026-03-07.md +2 -2
  106. package/docs/security/dsar-lgpd-runbook-2026-03-07.md +1 -1
  107. package/docs/security/network-hardening-runbook-2026-03-07.md +53 -0
  108. package/docs/security/omnizap-static-security-headers.conf +25 -0
  109. package/ecosystem.prod.config.cjs +31 -11
  110. package/index.js +52 -18
  111. package/observability/alert-rules.yml +20 -0
  112. package/observability/grafana/dashboards/omnizap-system-admin.json +229 -0
  113. package/observability/mysql-setup.sql +4 -4
  114. package/observability/system-admin-observability.md +26 -0
  115. package/package.json +12 -5
  116. package/public/comandos/commands-catalog.json +2253 -78
  117. package/public/js/apps/commandsReactApp.js +267 -87
  118. package/public/js/apps/createPackApp.js +3 -3
  119. package/public/js/apps/stickersApp.js +255 -103
  120. package/public/js/apps/termsReactApp.js +57 -8
  121. package/public/js/apps/userPasswordResetReactApp.js +406 -0
  122. package/public/js/apps/userReactApp.js +96 -47
  123. package/public/js/apps/userSystemAdmReactApp.js +1506 -0
  124. package/public/pages/politica-de-privacidade.html +1 -1
  125. package/public/pages/stickers.html +5 -5
  126. package/public/pages/termos-de-uso-texto-integral.html +1 -1
  127. package/public/pages/termos-de-uso.html +1 -1
  128. package/public/pages/user-password-reset.html +3 -4
  129. package/public/pages/user-systemadm.html +8 -462
  130. package/public/pages/user.html +1 -1
  131. package/scripts/clear-whatsapp-session.sh +123 -0
  132. package/scripts/core-ai-mode.mjs +163 -0
  133. package/scripts/deploy.sh +10 -0
  134. package/scripts/enrich-command-config-ux-openai.mjs +492 -0
  135. package/scripts/generate-commands-catalog.mjs +155 -0
  136. package/scripts/new-whatsapp-session.sh +317 -0
  137. package/scripts/security-web-surface-check.mjs +218 -0
  138. package/server/controllers/admin/adminPanelHandlers.js +253 -3
  139. package/server/controllers/admin/systemAdminController.js +267 -0
  140. package/server/controllers/sticker/stickerCatalogController.js +9 -23
  141. package/server/controllers/system/contactController.js +9 -17
  142. package/server/controllers/system/stickerCatalogSystemContext.js +27 -6
  143. package/server/controllers/system/systemController.js +254 -1
  144. package/server/controllers/userController.js +6 -0
  145. package/server/email/emailTemplateService.js +3 -2
  146. package/server/http/httpServer.js +8 -4
  147. package/server/middleware/securityHeaders.js +20 -1
  148. package/server/routes/admin/systemAdminRouter.js +6 -0
  149. package/server/routes/indexRouter.js +30 -6
  150. package/server/routes/observability/grafanaProxyRouter.js +254 -0
  151. package/server/routes/static/staticPageRouter.js +27 -1
  152. package/server/utils/publicContact.js +31 -0
  153. package/utils/whatsapp/contactEnv.js +39 -0
  154. package/vite.config.mjs +2 -1
  155. package/app/modules/playModule/local/installYtDlp.js +0 -25
  156. package/app/modules/playModule/local/ytDlpInstaller.js +0 -28
@@ -22,14 +22,14 @@ const DEFAULT_TEXTS = {
22
22
  ready_title_video: '🎬 Vídeo pronto!',
23
23
  video_fallback_to_audio: '⚠️ Este link retornou somente áudio. Enviando no formato de áudio.',
24
24
  anti_bot_with_cookies: 'YouTube solicitou verificação anti-bot. Atualize o arquivo .secrets/cookies.txt e tente novamente.',
25
- anti_bot_with_browser_profile: 'YouTube solicitou verificação anti-bot. Verifique o perfil informado em PLAY_YTDLP_COOKIES_FROM_BROWSER e tente novamente.',
26
- anti_bot_without_cookies: 'YouTube solicitou verificação anti-bot. Configure PLAY_YTDLP_COOKIES_PATH com um cookies.txt válido e tente novamente.',
25
+ anti_bot_with_browser_profile: 'YouTube solicitou verificação anti-bot no provedor de mídia. Verifique suas credenciais e tente novamente.',
26
+ anti_bot_without_cookies: 'YouTube solicitou verificação anti-bot no provedor de mídia. Tente novamente em alguns minutos.',
27
27
  usage_fallback_audio: '🎵 Uso: <prefix>play <link do YouTube ou termo de busca>',
28
28
  usage_fallback_video: '🎬 Uso: <prefix>playvid <link do YouTube ou termo de busca>',
29
29
  invalid_media_type: 'Tipo de mídia inválido.',
30
30
  binary_exec_failed: 'Falha ao executar <command>.',
31
- ytdlp_error_generic: 'Falha ao processar mídia com yt-dlp.',
32
- ytdlp_timeout_generic: 'Timeout ao processar mídia com yt-dlp.',
31
+ provider_error_generic: 'Falha ao processar mídia no provedor.',
32
+ provider_timeout_generic: 'Timeout ao processar mídia no provedor.',
33
33
  search_invalid_input: 'Você precisa informar um link do YouTube ou termo de busca.',
34
34
  search_not_found: 'Nenhum resultado encontrado para a busca.',
35
35
  search_timeout: 'Timeout ao buscar metadados do vídeo.',
@@ -69,10 +69,10 @@ const DEFAULT_OPERATIONAL_LIMITS = {
69
69
  thumbnail_timeout_ms: 15000,
70
70
  max_thumb_bytes: 5 * 1024 * 1024,
71
71
  admin_alert_dedupe_window_ms: 120000,
72
+ ytmp3_poll_interval_ms: 2000,
72
73
  };
73
74
 
74
75
  const DEFAULT_EXECUTION_OPTIONS = {
75
- ytdlp_base_args: ['--ignore-config', '--no-playlist', '--no-warnings', '--js-runtimes', 'node', '--extractor-args', 'youtube:player_client=android,web'],
76
76
  estrategias_formato: {
77
77
  audio: ['bestaudio/best', 'best'],
78
78
  video: ['bv*[ext=mp4]+ba[ext=m4a]/b[ext=mp4]/best', 'bestvideo*+bestaudio/best', 'best'],
@@ -135,7 +135,6 @@ const normalizeExecutionOptions = (raw) => {
135
135
  const rawAudioExtract = rawFormat.audio_extract && typeof rawFormat.audio_extract === 'object' ? rawFormat.audio_extract : {};
136
136
 
137
137
  return {
138
- ytdlp_base_args: normalizeStringArray(source.ytdlp_base_args, DEFAULT_EXECUTION_OPTIONS.ytdlp_base_args),
139
138
  estrategias_formato: {
140
139
  audio: normalizeStringArray(rawFormat.audio, defaultFormat.audio),
141
140
  video: normalizeStringArray(rawFormat.video, defaultFormat.video),
@@ -1,11 +1,8 @@
1
1
  import { now as __timeNow, nowIso as __timeNowIso, toUnixMs as __timeNowMs } from '#time';
2
2
  import assert from 'node:assert/strict';
3
- import fs from 'node:fs';
4
- import os from 'node:os';
5
- import path from 'node:path';
6
- import { test } from 'node:test';
3
+ import { after, test } from 'node:test';
7
4
 
8
- import { __playYtDlpClientTestUtils } from './playCommandYtDlpClient.js';
5
+ import { __playMediaClientTestUtils } from './playCommandMediaClient.js';
9
6
 
10
7
  const withEnv = async (overrides, fn) => {
11
8
  const previous = new Map();
@@ -31,8 +28,18 @@ const withEnv = async (overrides, fn) => {
31
28
  }
32
29
  };
33
30
 
31
+ let closeDatabasePoolForTests = null;
32
+
33
+ after(async () => {
34
+ if (typeof closeDatabasePoolForTests !== 'function') {
35
+ return;
36
+ }
37
+ await closeDatabasePoolForTests();
38
+ closeDatabasePoolForTests = null;
39
+ });
40
+
34
41
  test('resolve candidates deduplica URLs e ignora inválidas', () => {
35
- const urls = __playYtDlpClientTestUtils.extractCandidateUrlsFromSearchResult({
42
+ const urls = __playMediaClientTestUtils.extractCandidateUrlsFromSearchResult({
36
43
  resultado: { url: 'https://www.youtube.com/watch?v=abc123' },
37
44
  resultados: [{ url: 'https://www.youtube.com/watch?v=abc123' }, { url: 'https://youtu.be/xyz987' }, { url: 'not-an-url' }, { url: 'https://www.youtube.com/watch?v=zzz000' }],
38
45
  });
@@ -40,68 +47,44 @@ test('resolve candidates deduplica URLs e ignora inválidas', () => {
40
47
  assert.deepEqual(urls, ['https://www.youtube.com/watch?v=abc123', 'https://youtu.be/xyz987', 'https://www.youtube.com/watch?v=zzz000']);
41
48
  });
42
49
 
43
- test('estratégia de formato gera tentativas de fallback para áudio e vídeo', () => {
44
- const link = 'https://www.youtube.com/watch?v=test123';
45
- const outputTemplate = '/tmp/play-test.%(ext)s';
46
-
47
- const audioAttempts = __playYtDlpClientTestUtils.buildDownloadAttemptArgsList({
48
- type: 'audio',
49
- outputTemplate,
50
- link,
51
- });
52
- assert.ok(audioAttempts.length >= 2);
53
- assert.ok(audioAttempts[0].includes('-x'));
54
- assert.ok(audioAttempts[0].includes('--audio-format'));
55
- assert.equal(audioAttempts[0][audioAttempts[0].length - 1], link);
56
-
57
- const videoAttempts = __playYtDlpClientTestUtils.buildDownloadAttemptArgsList({
58
- type: 'video',
59
- outputTemplate,
60
- link,
61
- });
62
- assert.ok(videoAttempts.length >= 2);
63
- assert.ok(videoAttempts[0].includes('--merge-output-format'));
64
- assert.equal(videoAttempts[0][videoAttempts[0].length - 1], link);
65
- });
50
+ test('ytmp3 principal é elegível para áudio e vídeo com URL do YouTube', () => {
51
+ assert.equal(
52
+ __playMediaClientTestUtils.isYtmp3PrimaryEligible({
53
+ type: 'audio',
54
+ link: 'https://www.youtube.com/watch?v=test1234567A',
55
+ }),
56
+ true,
57
+ );
66
58
 
67
- test('anti-bot: detecta causa e retorna mensagem apropriada conforme cookies', { concurrency: false }, async () => {
68
59
  assert.equal(
69
- __playYtDlpClientTestUtils.isYouTubeBotCheckCause({
70
- meta: { cause: 'ERROR: [youtube] Sign in to confirm you’re not a bot.' },
60
+ __playMediaClientTestUtils.isYtmp3PrimaryEligible({
61
+ type: 'video',
62
+ link: 'https://www.youtube.com/watch?v=test1234567A',
71
63
  }),
72
64
  true,
73
65
  );
74
66
 
75
- await withEnv(
76
- {
77
- PLAY_YTDLP_COOKIES_PATH: '/tmp/cookies-inexistente.txt',
78
- PLAY_YTDLP_COOKIES_FROM_BROWSER: '',
79
- },
80
- async () => {
81
- const message = __playYtDlpClientTestUtils.buildYouTubeBotCheckUserMessage();
82
- assert.match(message, /PLAY_YTDLP_COOKIES_PATH/);
83
- },
67
+ assert.equal(
68
+ __playMediaClientTestUtils.isYtmp3PrimaryEligible({
69
+ type: 'audio',
70
+ link: 'https://vimeo.com/1234',
71
+ }),
72
+ false,
84
73
  );
74
+ });
85
75
 
86
- const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'play-cookies-'));
87
- const cookiesPath = path.join(tempDir, 'cookies.txt');
88
- fs.writeFileSync(cookiesPath, '.youtube.com\tTRUE\t/\tFALSE\t2147483647\tSID\ttest-cookie\n', 'utf8');
76
+ test('anti-bot: detecta causa e retorna mensagem genérica do provedor', { concurrency: false }, async () => {
77
+ assert.equal(
78
+ __playMediaClientTestUtils.isYouTubeBotCheckCause({
79
+ meta: { cause: 'ERROR: [youtube] Sign in to confirm you’re not a bot.' },
80
+ }),
81
+ true,
82
+ );
89
83
 
90
- try {
91
- await withEnv(
92
- {
93
- PLAY_YTDLP_COOKIES_PATH: cookiesPath,
94
- PLAY_YTDLP_COOKIES_FROM_BROWSER: '',
95
- },
96
- async () => {
97
- const message = __playYtDlpClientTestUtils.buildYouTubeBotCheckUserMessage();
98
- assert.match(message, /cookies\.txt/i);
99
- assert.ok(!message.includes('PLAY_YTDLP_COOKIES_PATH'));
100
- },
101
- );
102
- } finally {
103
- fs.rmSync(tempDir, { recursive: true, force: true });
104
- }
84
+ const message = __playMediaClientTestUtils.buildYouTubeBotCheckUserMessage();
85
+ assert.match(message, /anti-bot/i);
86
+ assert.ok(!message.includes('PLAY_'));
87
+ assert.ok(!message.toLowerCase().includes('cookies_path'));
105
88
  });
106
89
 
107
90
  test('notifyFailure: envia admin só para erro técnico e deduplica alertas', { concurrency: false }, async () => {
@@ -111,6 +94,8 @@ test('notifyFailure: envia admin só para erro técnico e deduplica alertas', {
111
94
  },
112
95
  async () => {
113
96
  const mod = await import(`./playCommandCore.js?test=${__timeNowMs()}-${Math.random().toString(16).slice(2)}`);
97
+ const { closePool } = await import('../../../database/index.js');
98
+ closeDatabasePoolForTests = closePool;
114
99
  const utils = mod.__playCommandCoreTestUtils;
115
100
  utils.resetAdminAlertDedupCacheForTests();
116
101
 
@@ -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/quoteModule/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": "citar",
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": "Converta texto em uma figurinha no estilo quote para compartilhar citações.",
363
+ "quando_usar": ["Quando quiser transformar um texto ou mensagem citada em uma figurinha com o estilo 'quote' para compartilhar na conversa.", "Para criar citações rápidas sem digitar outros detalhes, basta digitar o comando com o texto desejado."],
364
+ "exemplos_reais": [
365
+ {
366
+ "situacao": "Criar uma quote simples a partir de um texto próprio.",
367
+ "comando": "<prefix>citar seu texto",
368
+ "resposta_esperada": "Figura citada criada com sucesso.",
369
+ "variacao": "Aparece a figurinha com o seu texto formatado como quote."
370
+ },
371
+ {
372
+ "situacao": "Citar uma frase de outro usuário mencionando-o.",
373
+ "comando": "<prefix>qc @usuário a frase citada",
374
+ "resposta_esperada": "Figura citada criada com sucesso.",
375
+ "variacao": "A citação é gerada a partir da mensagem citada."
376
+ },
377
+ {
378
+ "situacao": "Erro de formato ao não informar o texto.",
379
+ "comando": "<prefix>citar",
380
+ "resposta_esperada": "Formato de uso inválido. Consulte metodos_de_uso.",
381
+ "variacao": "O sistema pede para incluir o texto após o comando."
382
+ }
383
+ ],
384
+ "resposta_esperada": ["Figura citada criada com sucesso.", "Formato de uso inválido. Consulte metodos_de_uso.", "Permissão insuficiente para executar este comando."],
385
+ "erros_comuns_usuario": ["Esquecer de informar o texto após o comando <prefix>citar.", "Usar o comando <prefix>qc sem a estrutura correta (falta @usuario ou texto).", "Texto muito longo ou com caracteres não suportados pela figurinha.", "Não estar logado quando o sistema exigir login Google."],
386
+ "passos_se_der_erro": ["Verifique se você incluiu o texto após o comando.", "Se usar <prefix>qc, confirme a menção @usuário e o conteúdo a citar.", "Garanta que você está conectado com o Google (login requerido) e tente novamente.", "Se o problema persistir, tente novamente após atualizar a página ou contate o 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/rpgPokemonModule/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
 
@@ -377,6 +377,35 @@
377
377
  "schema": "legacy_v1_and_v2",
378
378
  "legacy_name": "pokemon",
379
379
  "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"]
380
+ },
381
+ "user_experience": {
382
+ "resumo_usuario": "Comando principal do RPG Pokemon, usado para explorar, batalhar, comprar itens e socializar dentro do jogo pelo chat.",
383
+ "quando_usar": ["Iniciar a aventura: <prefix>pokemon start.", "Explorar o mapa: <prefix>pokemon explorar.", "Batalhar contra inimigos: <prefix>pokemon atacar <id>.", "Obter ajuda ou ver os métodos de uso: <prefix>pokemon help."],
384
+ "exemplos_reais": [
385
+ {
386
+ "situacao": "Novo jogador quer começar a aventura.",
387
+ "comando": "<prefix>pokemon start",
388
+ "resposta_esperada": "Comando executado com sucesso.",
389
+ "variacao": "Prefixo pode variar (ex.: ! ou /)."
390
+ },
391
+ {
392
+ "situacao": "Explorar o mapa atual.",
393
+ "comando": "<prefix>pokemon explorar",
394
+ "resposta_esperada": "Comando executado com sucesso.",
395
+ "variacao": "Se houver área bloqueada, o jogo mostrará informações da área atual."
396
+ },
397
+ {
398
+ "situacao": "Iniciar batalha contra o oponente 1.",
399
+ "comando": "<prefix>pokemon atacar 1",
400
+ "resposta_esperada": "Comando executado com sucesso.",
401
+ "variacao": "O número pode variar conforme os oponentes disponíveis."
402
+ }
403
+ ],
404
+ "resposta_esperada": ["Comando executado com sucesso.", "Formato de uso inválido. Consulte metodos_de_uso.", "Permissão insuficiente para executar este comando."],
405
+ "erros_comuns_usuario": ["Esquecer de informar o subcomando obrigatório (ação).", "Usar um subcomando que não existe ou está incorreto.", "Não estar logado com Google antes de usar o comando.", "Formato incorreto ao enviar parâmetros (ex.: <prefix>pokemon atacar sem o id).", "Tentar usar comandos antes de iniciar o jogo com <prefix>pokemon start."],
406
+ "passos_se_der_erro": ["Leia a mensagem de erro e verifique se o uso está correto consultando <prefix>pokemon help.", "Confira se o subcomando digitado é válido e se o <prefix> está correto.", "Tente novamente com o formato correto, por exemplo <prefix>pokemon start.", "Certifique-se de estar logado com Google, já que é exigido.", "Se o problema continuar, reporte o contexto do erro para o suporte."],
407
+ "resumo_usuario_origem": "auto_ia_assistida",
408
+ "resumo_usuario_revisao_pendente": true
380
409
  }
381
410
  }
382
411
  ],
@@ -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/statsModule/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
 
@@ -335,6 +335,35 @@
335
335
  "schema": "legacy_v1_and_v2",
336
336
  "legacy_name": "classificacao",
337
337
  "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"]
338
+ },
339
+ "user_experience": {
340
+ "resumo_usuario": "Mostra os 5 membros mais ativos do grupo. Não requer Premium.",
341
+ "quando_usar": ["Quando quiser ver quem participa mais no grupo.", "Antes de uma discussão ou decisão, para identificar os participantes mais ativos.", "Para comparar participação entre diferentes períodos."],
342
+ "exemplos_reais": [
343
+ {
344
+ "situacao": "Quero ver quem são os 5 membros mais ativos no grupo agora.",
345
+ "comando": "<prefix>classificacao",
346
+ "resposta_esperada": "Top 5 ativos no grupo: 1) @usuario1, 2) @usuario2, 3) @usuario3, 4) @usuario4, 5) @usuario5.",
347
+ "variacao": "<prefix>rank."
348
+ },
349
+ {
350
+ "situacao": "Quero o mesmo resultado usando outro atalho.",
351
+ "comando": "<prefix>rank",
352
+ "resposta_esperada": "Top 5 ativos no grupo: 1) @usuario1, 2) @usuario2, 3) @usuario3, 4) @usuario4, 5) @usuario5.",
353
+ "variacao": "<prefix>classificacao."
354
+ },
355
+ {
356
+ "situacao": "Outra forma rápida de ver o top 5.",
357
+ "comando": "<prefix>top5",
358
+ "resposta_esperada": "Top 5 ativos no grupo: 1) @usuario1, 2) @usuario2, 3) @usuario3, 4) @usuario4, 5) @usuario5.",
359
+ "variacao": "<prefix>classificacao."
360
+ }
361
+ ],
362
+ "resposta_esperada": ["A lista com os 5 membros mais ativos no grupo é exibida."],
363
+ "erros_comuns_usuario": ["Não está em um grupo ao enviar o comando.", "Ainda não fez login com Google no app.", "Formato do comando incorreto; use um dos métodos de uso: <prefix>classificacao, <prefix>rank, <prefix>top5.", "O grupo não possui participantes ativos suficientes."],
364
+ "passos_se_der_erro": ["Confira se você está dentro de um grupo.", "Verifique se você está logado com Google.", "Envie o comando correto: <prefix>classificacao, <prefix>rank ou <prefix>top5.", "Tente novamente em poucos segundos.", "Se o erro persistir, peça para o admin revisar as permissões."],
365
+ "resumo_usuario_origem": "auto_ia_assistida",
366
+ "resumo_usuario_revisao_pendente": true
338
367
  }
339
368
  },
340
369
  {
@@ -531,6 +560,35 @@
531
560
  "schema": "legacy_v1_and_v2",
532
561
  "legacy_name": "classificacaoglobal",
533
562
  "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"]
563
+ },
564
+ "user_experience": {
565
+ "resumo_usuario": "Mostra o top 5 global de atividade. Use para ver quem lidera a atividade mundial e comparar com seu desempenho.",
566
+ "quando_usar": ["Quero saber quem está no topo da atividade global agora.", "Quero comparar meu desempenho com o ranking global.", "Preciso de uma visão rápida do ranking mundial sem dados locais."],
567
+ "exemplos_reais": [
568
+ {
569
+ "situacao": "Quero ver o ranking global rapidamente.",
570
+ "comando": "<prefix>classificacaoglobal",
571
+ "resposta_esperada": "Top 5 global de atividade exibidos com nomes e pontos. Ex.: 1) Nome - 980 pts, 2) Nome2 - 950 pts, ...",
572
+ "variacao": "<prefix>globalrank."
573
+ },
574
+ {
575
+ "situacao": "Quero usar a outra forma de comando para o ranking.",
576
+ "comando": "<prefix>globalrank",
577
+ "resposta_esperada": "Top 5 global de atividade exibidos com nomes e pontos.",
578
+ "variacao": "<prefix>classificacaoglobal."
579
+ },
580
+ {
581
+ "situacao": "Não estou logado com Google e tento ver o ranking.",
582
+ "comando": "<prefix>classificacaoglobal",
583
+ "resposta_esperada": "Você precisa estar logado com sua conta Google para ver o ranking global.",
584
+ "variacao": "Sem login Google."
585
+ }
586
+ ],
587
+ "resposta_esperada": ["Top 5 global de atividade exibidos com nomes e pontos.", "Se não houver dados, será exibida mensagem informando a ausência de resultados para o ranking global."],
588
+ "erros_comuns_usuario": ["Esquecer o prefixo no início do comando.", "Digitar o comando com espaços extras ou caracteres não reconhecidos.", "Tentar usar sem estar logado com Google (googleLogin requerido).", "Usar uma forma de comando incorreta ou digitá-lo com erro de grafia."],
589
+ "passos_se_der_erro": ["Confira se está logado com a conta Google ligada.", "Digite novamente um dos comandos válidos: <prefix>classificacaoglobal ou <prefix>globalrank.", "Verifique se não há espaço extra ou caracteres estranhos no comando.", "Se o problema persistir, peça ajuda e informe a mensagem de erro e o comando utilizado."],
590
+ "resumo_usuario_origem": "auto_ia_assistida",
591
+ "resumo_usuario_revisao_pendente": true
534
592
  }
535
593
  }
536
594
  ],
@@ -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/stickerModule/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": "figurinha",
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": "Converte imagem ou vídeo enviado em figurinha para o WhatsApp. Requer login Google e mídia. Disponível para planos comum e premium.",
363
+ "quando_usar": ["Quando você quer transformar uma foto ou vídeo enviada em uma figurinha para compartilhar no chat.", "Quando desejar adicionar texto opcional à figurinha com o texto após o comando.", "Quando usar o atalho <prefix>s para criar rapidamente a figurinha a partir da mídia recebida."],
364
+ "exemplos_reais": [
365
+ {
366
+ "situacao": "Transformar imagem recebida em figurinha (sem texto).",
367
+ "comando": "<prefix>figurinha",
368
+ "resposta_esperada": "Comando executado com sucesso.",
369
+ "variacao": "com imagem anexada."
370
+ },
371
+ {
372
+ "situacao": "Criar figurinha com texto personalizado.",
373
+ "comando": "<prefix>figurinha Olá amigos",
374
+ "resposta_esperada": "Comando executado com sucesso.",
375
+ "variacao": "texto_extra fornecido."
376
+ },
377
+ {
378
+ "situacao": "Usar atalho para vídeo e gerar figurinha.",
379
+ "comando": "<prefix>s",
380
+ "resposta_esperada": "Comando executado com sucesso.",
381
+ "variacao": "vídeo anexado."
382
+ }
383
+ ],
384
+ "resposta_esperada": ["Comando executado com sucesso.", "Formato de uso inválido. Consulte metodos_de_uso.", "Permissão insuficiente para executar este comando."],
385
+ "erros_comuns_usuario": ["Não há mídia anexada para transformar em figurinha.", "Formato de uso inválido. Use <prefix>figurinha ou <prefix>s.", "Não é possível converter conteúdo NSFW ou não aprovado.", "Você não está logado no Google ou a autenticação falhou."],
386
+ "passos_se_der_erro": ["Verifique se você enviou uma imagem ou vídeo junto ao comando.", "Tente novamente com <prefix>figurinha ou <prefix>s.", "Certifique-se de estar conectado com sua conta Google e que o login esteja ativo."],
387
+ "resumo_usuario_origem": "auto_ia_assistida",
388
+ "resumo_usuario_revisao_pendente": true
360
389
  }
361
390
  },
362
391
  {
@@ -553,6 +582,35 @@
553
582
  "schema": "legacy_v1_and_v2",
554
583
  "legacy_name": "paraimagem",
555
584
  "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"]
585
+ },
586
+ "user_experience": {
587
+ "resumo_usuario": "Converte figurinha (sticker) para imagem ou vídeo, para você salvar/usar fora do WhatsApp. Disponível para planos comum e premium.",
588
+ "quando_usar": ["Quando você recebeu uma figurinha e quer salvá-la como imagem.", "Quando precisa de um vídeo a partir de uma figurinha (quando suportado).", "Quando quer reutilizar a figurinha em outros lugares ou projetos."],
589
+ "exemplos_reais": [
590
+ {
591
+ "situacao": "Você recebeu uma figurinha e quer salvar como imagem.",
592
+ "comando": "<prefix>paraimagem",
593
+ "resposta_esperada": "A imagem da figurinha é gerada e enviada de volta para você.",
594
+ "variacao": "paraimagem."
595
+ },
596
+ {
597
+ "situacao": "Precisa de um vídeo da figurinha (quando suportado).",
598
+ "comando": "<prefix>tovideo",
599
+ "resposta_esperada": "Vídeo da figurinha gerado e enviado.",
600
+ "variacao": "tovideo."
601
+ },
602
+ {
603
+ "situacao": "Erro ao enviar comando com formato errado.",
604
+ "comando": "<prefix>paraimagem extra",
605
+ "resposta_esperada": "Formato de uso inválido. Consulte metodos_de_uso.",
606
+ "variacao": "erro de formatação."
607
+ }
608
+ ],
609
+ "resposta_esperada": ["Imagem ou vídeo gerado a partir da figurinha enviada (quando disponível).", "Mensagens claras de erro se houver problemas de formato, permissão ou conteúdo."],
610
+ "erros_comuns_usuario": ["Formato de comando inválido ou sem figurinha na mensagem.", "Não há figurinha na mensagem para converter.", "Falha de login ou permissão inadequada (Google Login necessário).", "Tentativa de usar o comando sem indicar uma figurinha compatível."],
611
+ "passos_se_der_erro": ["Confirme que você está logado com Google.", "Envie uma figurinha válida e tente novamente com <prefix>paraimagem, <prefix>tovideo ou <prefix>tovid.", "Verifique se o prefixo do bot está correto.", "Se o problema persistir, peça suporte com print da tela e da mensagem recebida."],
612
+ "resumo_usuario_origem": "auto_ia_assistida",
613
+ "resumo_usuario_revisao_pendente": true
556
614
  }
557
615
  },
558
616
  {
@@ -771,6 +829,35 @@
771
829
  "schema": "legacy_v1_and_v2",
772
830
  "legacy_name": "figurinhatexto",
773
831
  "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"]
832
+ },
833
+ "user_experience": {
834
+ "resumo_usuario": "Gera figurinha com texto em tema escuro. Digite o texto (até 80 caracteres, até 4 linhas) e a figurinha é criada.",
835
+ "quando_usar": ["Quando quiser transformar uma frase curta em uma figurinha para compartilhar no chat.", "Para destacar mensagens com estilo visual sem sair do chat."],
836
+ "exemplos_reais": [
837
+ {
838
+ "situacao": "Criar uma figurinha com uma frase curta para cumprimentar.",
839
+ "comando": "<prefix>figurinhatexto Olá, tudo bem?",
840
+ "resposta_esperada": "Figura gerada com o texto: 'Olá, tudo bem?'.",
841
+ "variacao": "<prefix>st Olá, tudo bem?"
842
+ },
843
+ {
844
+ "situacao": "Texto com várias linhas (até 4 linhas).",
845
+ "comando": "<prefix>figurinhatexto Linha 1\\nLinha 2\\nLinha 3\\nLinha 4",
846
+ "resposta_esperada": "Figura criada com o texto: 'Linha 1\\nLinha 2\\nLinha 3\\nLinha 4'.",
847
+ "variacao": "<prefix>st Linha 1\\nLinha 2\\nLinha 3\\nLinha 4."
848
+ },
849
+ {
850
+ "situacao": "Uso rápido com alias.",
851
+ "comando": "<prefix>st Bom dia a todos",
852
+ "resposta_esperada": "Figura gerada com o texto: 'Bom dia a todos'.",
853
+ "variacao": "<prefix>figurinhatexto Bom dia a todos."
854
+ }
855
+ ],
856
+ "resposta_esperada": ["Figura criada com sucesso e pronta para enviar no chat.", "Texto da figurinha incorporado ao sticker.", "Comando executado com sucesso."],
857
+ "erros_comuns_usuario": ["Texto com mais de 80 caracteres.", "Não informar o texto após <prefix>figurinhatexto ou <prefix>st.", "Formato de uso inválido (faltou o texto ou usou caractere não suportado).", "Usar mais de 4 linhas."],
858
+ "passos_se_der_erro": ["Verifique o texto informado: até 80 caracteres e até 4 linhas.", "Repita o comando correto, por exemplo: <prefix>figurinhatexto Seu texto aqui.", "Certifique-se de estar conectado com a conta Google, se necessário.", "Se o problema persistir, aguarde alguns minutos e tente novamente ou procure suporte."],
859
+ "resumo_usuario_origem": "auto_ia_assistida",
860
+ "resumo_usuario_revisao_pendente": true
774
861
  }
775
862
  },
776
863
  {
@@ -989,6 +1076,35 @@
989
1076
  "schema": "legacy_v1_and_v2",
990
1077
  "legacy_name": "figurinhatextobranco",
991
1078
  "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"]
1079
+ },
1080
+ "user_experience": {
1081
+ "resumo_usuario": "Crie figurinha com texto em branco em tema claro usando <prefix>figurinhatextobranco ou <prefix>stw.",
1082
+ "quando_usar": ["Quer compartilhar uma mensagem rápida como imagem no chat.", "Precisa de até 80 caracteres, em até 4 linhas.", "Não precisa de opções adicionais ou ajustes de estilo.", "Prefere um atalho curto com <prefix>stw."],
1083
+ "exemplos_reais": [
1084
+ {
1085
+ "situacao": "Frase motivacional.",
1086
+ "comando": "<prefix>figurinhatextobranco Acredite em si mesmo!",
1087
+ "resposta_esperada": "Figurinha criada com o texto 'Acredite em si mesmo!' em tema claro.",
1088
+ "variacao": "<prefix>stw Acredite em si mesmo!"
1089
+ },
1090
+ {
1091
+ "situacao": "Bom dia.",
1092
+ "comando": "<prefix>figurinhatextobranco Bom dia, equipe!",
1093
+ "resposta_esperada": "Figurinha criada com o texto 'Bom dia, equipe!' em tema claro.",
1094
+ "variacao": "<prefix>stw Bom dia, equipe!"
1095
+ },
1096
+ {
1097
+ "situacao": "Quatro linhas.",
1098
+ "comando": "<prefix>figurinhatextobranco Linha 1 Linha 2 Linha 3 Linha 4",
1099
+ "resposta_esperada": "Figurinha criada com o texto em quatro linhas.",
1100
+ "variacao": "<prefix>stw Linha 1 Linha 2 Linha 3 Linha 4."
1101
+ }
1102
+ ],
1103
+ "resposta_esperada": ["Comando executado com sucesso."],
1104
+ "erros_comuns_usuario": ["Texto não informado após o comando.", "Texto excede 80 caracteres ou ultrapassa 4 linhas.", "Formato de uso incorreto ou sem o prefixo correto.", "Tentar usar caracteres não suportados."],
1105
+ "passos_se_der_erro": ["Certifique-se de incluir o texto após o comando, ex.: <prefix>figurinhatextobranco Seu texto.", "Verifique o tamanho: até 80 caracteres e até 4 linhas.", "Use o formato correto: <prefix>figurinhatextobranco ou <prefix>stw.", "Tente novamente. Se o erro persistir, copie o comando usado e peça ajuda."],
1106
+ "resumo_usuario_origem": "auto_ia_assistida",
1107
+ "resumo_usuario_revisao_pendente": true
992
1108
  }
993
1109
  },
994
1110
  {
@@ -1207,6 +1323,35 @@
1207
1323
  "schema": "legacy_v1_and_v2",
1208
1324
  "legacy_name": "figurinhatextopisca",
1209
1325
  "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"]
1326
+ },
1327
+ "user_experience": {
1328
+ "resumo_usuario": "Gera figurinha animada de texto piscante com até 80 caracteres (máx. 4 linhas), usando <prefix>figurinhatextopisca ou <prefix>stb.",
1329
+ "quando_usar": ["Destacar mensagens com texto piscante em chats", "Promover ofertas rápidas ou lembretes", "Saudar ou chamar atenção com uma frase curta", "Transformar seu texto pronto em figurinha para envio rápido"],
1330
+ "exemplos_reais": [
1331
+ {
1332
+ "situacao": "Promoção rápida com destaque.",
1333
+ "comando": "<prefix>figurinhatextopisca Promoção de 50% hoje!",
1334
+ "resposta_esperada": "Figura criada com sucesso.",
1335
+ "variacao": "<prefix>stb Promoção de 50% hoje!"
1336
+ },
1337
+ {
1338
+ "situacao": "Saudação breve.",
1339
+ "comando": "<prefix>figurinhatextopisca Olá, bom dia!",
1340
+ "resposta_esperada": "Figura criada com sucesso.",
1341
+ "variacao": "<prefix>stb Olá, bom dia!"
1342
+ },
1343
+ {
1344
+ "situacao": "Lembrete com até 4 linhas.",
1345
+ "comando": "<prefix>figurinhatextopisca Lembrete: entrega hoje Confira novidades",
1346
+ "resposta_esperada": "Figura criada com sucesso.",
1347
+ "variacao": "<prefix>stb Lembrete: entrega hoje Confira novidades."
1348
+ }
1349
+ ],
1350
+ "resposta_esperada": ["Comando executado com sucesso.", "Formato de uso inválido. Consulte metodos_de_uso.", "Permissão insuficiente para executar este comando."],
1351
+ "erros_comuns_usuario": ["Texto excede 80 caracteres", "Mais de 4 linhas", "Não usar nenhum <prefix> no comando", "Texto vazio", "Texto com caracteres especiais não suportados"],
1352
+ "passos_se_der_erro": ["Verifique o tamanho do texto (≤ 80 caracteres) e o número de linhas (≤ 4).", "Tente novamente usando um dos comandos válidos com o mesmo texto.", "Confirme que você está logado via Google, conforme necessário.", "Se o erro continuar, tente novamente mais tarde ou procure suporte."],
1353
+ "resumo_usuario_origem": "auto_ia_assistida",
1354
+ "resumo_usuario_revisao_pendente": true
1210
1355
  }
1211
1356
  }
1212
1357
  ],
@@ -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/stickerPackModule/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
 
@@ -5,7 +5,11 @@ import { sanitizeText } from './stickerPackUtils.js';
5
5
  * Serviço responsável por direcionar figurinhas recém-criadas para packs automáticos.
6
6
  */
7
7
  const DEFAULT_AUTO_PACK_NAME = process.env.STICKER_PACK_AUTO_PACK_NAME || 'pack';
8
- const AUTO_PACK_TARGET_VISIBILITY = 'unlisted';
8
+ const VALID_VISIBILITIES = new Set(['public', 'unlisted', 'private']);
9
+ const AUTO_PACK_TARGET_VISIBILITY_RAW = String(process.env.STICKER_PACK_AUTO_COLLECT_VISIBILITY || process.env.STICKER_AUTO_PACK_BY_TAGS_VISIBILITY || 'public')
10
+ .trim()
11
+ .toLowerCase();
12
+ const AUTO_PACK_TARGET_VISIBILITY = VALID_VISIBILITIES.has(AUTO_PACK_TARGET_VISIBILITY_RAW) ? AUTO_PACK_TARGET_VISIBILITY_RAW : 'public';
9
13
  const AUTO_COLLECT_ENABLED = process.env.STICKER_PACK_AUTO_COLLECT_ENABLED !== 'false';
10
14
  const AUTO_PACK_NAME_MAX_LENGTH = 120;
11
15
  const AUTO_PACK_DESCRIPTION_MARKER = '[auto-pack:collector]';
@@ -378,6 +378,35 @@
378
378
  "schema": "legacy_v1_and_v2",
379
379
  "legacy_name": "pacote",
380
380
  "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"]
381
+ },
382
+ "user_experience": {
383
+ "resumo_usuario": "Gerencie packs de figurinhas: criar, listar, adicionar figurinhas e enviar packs para contatos.",
384
+ "quando_usar": ["Criar um novo pack de figurinhas.", "Ver a lista de packs existentes.", "Adicionar figurinhas a um pack existente.", "Enviar um pack para alguém."],
385
+ "exemplos_reais": [
386
+ {
387
+ "situacao": "Criar um pack de figurinhas.",
388
+ "comando": "<prefix>pacote create meupack",
389
+ "resposta_esperada": "Pack criado com sucesso.",
390
+ "variacao": "Use nomes simples, sem aspas. Ex.: meupack."
391
+ },
392
+ {
393
+ "situacao": "Listar todos os packs.",
394
+ "comando": "<prefix>pacote list",
395
+ "resposta_esperada": "Listagem exibida com todos os packs.",
396
+ "variacao": "Pode retornar vários nomes; observe a lista completa."
397
+ },
398
+ {
399
+ "situacao": "Adicionar figurinhas a um pack existente.",
400
+ "comando": "<prefix>pacote add meupack",
401
+ "resposta_esperada": "Figurinhas adicionadas ao pack 'meupack'.",
402
+ "variacao": "Se houver figurinhas disponíveis, elas são incluídas."
403
+ }
404
+ ],
405
+ "resposta_esperada": ["Comando executado com sucesso.", "Formato de uso inválido. Consulte metodos_de_uso.", "Permissão insuficiente para executar este comando."],
406
+ "erros_comuns_usuario": ["Esquecer de usar o prefixo correto no início do comando.", "Digitar o subcomando errado ou sem o parâmetro necessário.", "Tentar adicionar figurinhas sem indicar o pack ou sem estar logado.", "Tentar enviar sem ter criado ou sem selecionar um pack existente.", "Não estar logado com Google quando o comando exigir login."],
407
+ "passos_se_der_erro": ["Use <prefix>pacote help para confirmar a sintaxe correta.", "Verifique se o subcomando está entre create, list, add ou send e inclua os parâmetros necessários.", "Confirme que você está logado com Google, conforme exigido.", "Tente novamente após ajustar o comando. Se o erro persistir, copie a mensagem de erro e tente novamente mais tarde.", "Se não resolver, aguarde alguns minutos e procure ajuda com os detalhes do comando executado."],
408
+ "resumo_usuario_origem": "auto_ia_assistida",
409
+ "resumo_usuario_revisao_pendente": true
381
410
  }
382
411
  }
383
412
  ],
@@ -166,7 +166,7 @@ const EFFECTIVE_COMPLETION_TRANSFER_ENABLED = COMPLETION_TRANSFER_ENABLED || IS_
166
166
  const EFFECTIVE_MIGRATION_CANDIDATE_LIMIT = IS_AGGRESSIVE_PROFILE ? Math.max(MIGRATION_CANDIDATE_LIMIT, 24) : MIGRATION_CANDIDATE_LIMIT;
167
167
  const EFFECTIVE_TRANSFER_CANDIDATE_SIMILARITY_FLOOR = IS_AGGRESSIVE_PROFILE ? Math.max(0.15, TRANSFER_CANDIDATE_SIMILARITY_FLOOR * 0.72) : TRANSFER_CANDIDATE_SIMILARITY_FLOOR;
168
168
 
169
- const EXPLICIT_OWNER = String(process.env.STICKER_AUTO_PACK_OWNER_JID || process.env.USER_ADMIN || '').trim();
169
+ const EXPLICIT_OWNER = String(process.env.STICKER_AUTO_PACK_OWNER_JID || process.env.WHATSAPP_ADMIN_JID || process.env.USER_ADMIN || '').trim();
170
170
 
171
171
  const LABEL_TO_TAG = {
172
172
  'anime illustration': 'anime',