@omnizap-system/omnizap 2.5.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.clusterfuzzlite/Dockerfile +10 -0
- package/.env.example +907 -0
- package/.github/codeql/codeql-config.yml +10 -0
- package/.github/dependabot.yml +35 -0
- package/.github/workflows/ci.yml +73 -0
- package/.github/workflows/codeql.yml +106 -0
- package/.github/workflows/db-migration-check.yml +98 -0
- package/.github/workflows/dependency-review.yml +22 -0
- package/.github/workflows/deploy.yml +95 -0
- package/.github/workflows/release.yml +106 -0
- package/.github/workflows/security-attest-provenance.yml +51 -0
- package/.github/workflows/security-gitleaks.yml +34 -0
- package/.github/workflows/security-runner-hardening.yml +31 -0
- package/.github/workflows/security-scorecard.yml +44 -0
- package/.github/workflows/security-zap-baseline.yml +44 -0
- package/.github/workflows/security-zap-full-scan.yml +43 -0
- package/.github/workflows/security-zizmor.yml +36 -0
- package/.github/workflows/wiki-sync.yml +44 -0
- package/.gitleaks.toml +15 -0
- package/.prettierrc +34 -0
- package/CODE_OF_CONDUCT.md +114 -0
- package/LICENSE +56 -0
- package/README.md +110 -0
- package/SECURITY.md +110 -0
- package/app/config/index.js +4 -0
- package/app/configParts/adminIdentity.js +92 -0
- package/app/configParts/baileysConfig.js +1818 -0
- package/app/configParts/groupUtils.js +692 -0
- package/app/configParts/loggerConfig.js +394 -0
- package/app/configParts/messagePersistenceService.js +305 -0
- package/app/connection/baileysCompatibility.test.js +40 -0
- package/app/connection/baileysDbAuthState.js +344 -0
- package/app/connection/socketController.js +2243 -0
- package/app/controllers/messageController.js +7 -0
- package/app/controllers/messagePipeline/commandMiddleware.js +146 -0
- package/app/controllers/messagePipeline/conversationMiddleware.js +183 -0
- package/app/controllers/messagePipeline/messagePipelineMiddlewares.test.js +522 -0
- package/app/controllers/messagePipeline/postProcessingMiddleware.js +41 -0
- package/app/controllers/messagePipeline/preProcessingMiddlewares.js +166 -0
- package/app/controllers/messageProcessingPipeline.js +699 -0
- package/app/modules/adminModule/AGENT.md +4056 -0
- package/app/modules/adminModule/adminAiHelpService.js +56 -0
- package/app/modules/adminModule/adminConfigRuntime.js +177 -0
- package/app/modules/adminModule/commandConfig.json +7122 -0
- package/app/modules/adminModule/groupCommandHandlers.js +1823 -0
- package/app/modules/adminModule/groupCommandHandlers.test.js +350 -0
- package/app/modules/adminModule/groupEventHandlers.js +399 -0
- package/app/modules/aiModule/AGENT.md +547 -0
- package/app/modules/aiModule/aiAiHelpService.js +14 -0
- package/app/modules/aiModule/aiConfigRuntime.js +135 -0
- package/app/modules/aiModule/catCommand.js +967 -0
- package/app/modules/aiModule/commandConfig.json +981 -0
- package/app/modules/analyticsModule/messageAnalysisEventRepository.js +83 -0
- package/app/modules/gameModule/AGENT.md +196 -0
- package/app/modules/gameModule/commandConfig.json +366 -0
- package/app/modules/gameModule/diceCommand.js +42 -0
- package/app/modules/gameModule/gameAiHelpService.js +14 -0
- package/app/modules/gameModule/gameConfigRuntime.js +68 -0
- package/app/modules/menuModule/AGENT.md +205 -0
- package/app/modules/menuModule/commandConfig.json +366 -0
- package/app/modules/menuModule/common.js +316 -0
- package/app/modules/menuModule/menuAiHelpService.js +14 -0
- package/app/modules/menuModule/menuConfigRuntime.js +68 -0
- package/app/modules/menuModule/menus.js +66 -0
- package/app/modules/playModule/AGENT.md +321 -0
- package/app/modules/playModule/commandConfig.json +584 -0
- package/app/modules/playModule/playAiHelpService.js +14 -0
- package/app/modules/playModule/playCommand.js +1417 -0
- package/app/modules/playModule/playConfigRuntime.js +68 -0
- package/app/modules/quoteModule/AGENT.md +199 -0
- package/app/modules/quoteModule/commandConfig.json +366 -0
- package/app/modules/quoteModule/quoteAiHelpService.js +14 -0
- package/app/modules/quoteModule/quoteCommand.js +842 -0
- package/app/modules/quoteModule/quoteConfigRuntime.js +68 -0
- package/app/modules/rpgPokemonModule/AGENT.md +229 -0
- package/app/modules/rpgPokemonModule/commandConfig.json +386 -0
- package/app/modules/rpgPokemonModule/rpgBattleCanvasRenderer.js +795 -0
- package/app/modules/rpgPokemonModule/rpgBattleService.js +2110 -0
- package/app/modules/rpgPokemonModule/rpgBattleService.test.js +770 -0
- package/app/modules/rpgPokemonModule/rpgEvolutionUtils.js +22 -0
- package/app/modules/rpgPokemonModule/rpgPokemonAiHelpService.js +14 -0
- package/app/modules/rpgPokemonModule/rpgPokemonCommand.js +174 -0
- package/app/modules/rpgPokemonModule/rpgPokemonConfigRuntime.js +68 -0
- package/app/modules/rpgPokemonModule/rpgPokemonDomain.js +192 -0
- package/app/modules/rpgPokemonModule/rpgPokemonDomain.test.js +93 -0
- package/app/modules/rpgPokemonModule/rpgPokemonEvolution.test.js +46 -0
- package/app/modules/rpgPokemonModule/rpgPokemonMessages.js +746 -0
- package/app/modules/rpgPokemonModule/rpgPokemonRepository.js +1847 -0
- package/app/modules/rpgPokemonModule/rpgPokemonService.js +6839 -0
- package/app/modules/rpgPokemonModule/rpgProfileCanvasRenderer.js +354 -0
- package/app/modules/statsModule/AGENT.md +320 -0
- package/app/modules/statsModule/commandConfig.json +540 -0
- package/app/modules/statsModule/globalRankingCommand.js +64 -0
- package/app/modules/statsModule/rankingCommand.js +41 -0
- package/app/modules/statsModule/rankingCommon.js +1305 -0
- package/app/modules/statsModule/statsAiHelpService.js +14 -0
- package/app/modules/statsModule/statsConfigRuntime.js +68 -0
- package/app/modules/stickerModule/AGENT.md +692 -0
- package/app/modules/stickerModule/addStickerMetadata.js +239 -0
- package/app/modules/stickerModule/commandConfig.json +1216 -0
- package/app/modules/stickerModule/convertToWebp.js +367 -0
- package/app/modules/stickerModule/stickerAiHelpService.js +14 -0
- package/app/modules/stickerModule/stickerCommand.js +446 -0
- package/app/modules/stickerModule/stickerConfigRuntime.js +68 -0
- package/app/modules/stickerModule/stickerConvertCommand.js +159 -0
- package/app/modules/stickerModule/stickerTextCommand.js +653 -0
- package/app/modules/stickerPackModule/AGENT.md +215 -0
- package/app/modules/stickerPackModule/autoPackCollectorRuntime.js +20 -0
- package/app/modules/stickerPackModule/autoPackCollectorService.js +357 -0
- package/app/modules/stickerPackModule/commandConfig.json +387 -0
- package/app/modules/stickerPackModule/domainEventOutboxRepository.js +227 -0
- package/app/modules/stickerPackModule/domainEvents.js +52 -0
- package/app/modules/stickerPackModule/semanticReclassificationEngine.js +429 -0
- package/app/modules/stickerPackModule/semanticReclassificationEngine.test.js +75 -0
- package/app/modules/stickerPackModule/semanticThemeClusterService.js +544 -0
- package/app/modules/stickerPackModule/stickerAssetClassificationRepository.js +400 -0
- package/app/modules/stickerPackModule/stickerAssetRepository.js +400 -0
- package/app/modules/stickerPackModule/stickerAssetReprocessQueueRepository.js +175 -0
- package/app/modules/stickerPackModule/stickerAutoPackByTagsRuntime.js +3702 -0
- package/app/modules/stickerPackModule/stickerClassificationBackgroundRuntime.js +559 -0
- package/app/modules/stickerPackModule/stickerClassificationService.js +557 -0
- package/app/modules/stickerPackModule/stickerDedicatedTaskWorkerRuntime.js +249 -0
- package/app/modules/stickerPackModule/stickerDomainEventBus.js +65 -0
- package/app/modules/stickerPackModule/stickerDomainEventConsumerRuntime.js +208 -0
- package/app/modules/stickerPackModule/stickerMarketplaceDriftService.js +99 -0
- package/app/modules/stickerPackModule/stickerObjectStorageService.js +285 -0
- package/app/modules/stickerPackModule/stickerPackAiHelpService.js +14 -0
- package/app/modules/stickerPackModule/stickerPackCommandHandlers.js +1148 -0
- package/app/modules/stickerPackModule/stickerPackConfigRuntime.js +68 -0
- package/app/modules/stickerPackModule/stickerPackEngagementRepository.js +152 -0
- package/app/modules/stickerPackModule/stickerPackErrors.js +30 -0
- package/app/modules/stickerPackModule/stickerPackInteractionEventRepository.js +101 -0
- package/app/modules/stickerPackModule/stickerPackItemRepository.js +432 -0
- package/app/modules/stickerPackModule/stickerPackMarketplaceService.js +313 -0
- package/app/modules/stickerPackModule/stickerPackMessageService.js +268 -0
- package/app/modules/stickerPackModule/stickerPackRepository.js +450 -0
- package/app/modules/stickerPackModule/stickerPackScoreSnapshotRepository.js +179 -0
- package/app/modules/stickerPackModule/stickerPackScoreSnapshotRuntime.js +271 -0
- package/app/modules/stickerPackModule/stickerPackService.js +733 -0
- package/app/modules/stickerPackModule/stickerPackServiceRuntime.js +32 -0
- package/app/modules/stickerPackModule/stickerPackUtils.js +107 -0
- package/app/modules/stickerPackModule/stickerStorageService.js +559 -0
- package/app/modules/stickerPackModule/stickerWorkerPipelineRuntime.js +242 -0
- package/app/modules/stickerPackModule/stickerWorkerTaskQueueRepository.js +242 -0
- package/app/modules/systemMetricsModule/AGENT.md +193 -0
- package/app/modules/systemMetricsModule/commandConfig.json +344 -0
- package/app/modules/systemMetricsModule/pingCommand.js +399 -0
- package/app/modules/systemMetricsModule/systemMetricsAiHelpService.js +14 -0
- package/app/modules/systemMetricsModule/systemMetricsConfigRuntime.js +68 -0
- package/app/modules/tiktokModule/AGENT.md +196 -0
- package/app/modules/tiktokModule/commandConfig.json +366 -0
- package/app/modules/tiktokModule/tiktokAiHelpService.js +14 -0
- package/app/modules/tiktokModule/tiktokCommand.js +716 -0
- package/app/modules/tiktokModule/tiktokConfigRuntime.js +68 -0
- package/app/modules/userModule/AGENT.md +200 -0
- package/app/modules/userModule/commandConfig.json +386 -0
- package/app/modules/userModule/userAiHelpService.js +14 -0
- package/app/modules/userModule/userCommand.js +1155 -0
- package/app/modules/userModule/userConfigRuntime.js +68 -0
- package/app/modules/waifuPicsModule/AGENT.md +431 -0
- package/app/modules/waifuPicsModule/commandConfig.json +780 -0
- package/app/modules/waifuPicsModule/waifuPicsAiHelpService.js +14 -0
- package/app/modules/waifuPicsModule/waifuPicsCommand.js +586 -0
- package/app/modules/waifuPicsModule/waifuPicsConfigRuntime.js +68 -0
- package/app/observability/metrics.js +766 -0
- package/app/services/ai/aiHelpResponseCacheRepository.js +280 -0
- package/app/services/ai/aiLearningRepository.js +400 -0
- package/app/services/ai/commandConfigEnrichmentRepository.js +769 -0
- package/app/services/ai/commandConfigEnrichmentService.js +452 -0
- package/app/services/ai/commandConfigValidationService.js +443 -0
- package/app/services/ai/commandToolBuilderService.js +192 -0
- package/app/services/ai/conversationRouterService.js +516 -0
- package/app/services/ai/geminiService.js +115 -0
- package/app/services/ai/geminiService.test.js +87 -0
- package/app/services/ai/globalModuleAiHelpService.js +1412 -0
- package/app/services/ai/globalToolCallingService.js +203 -0
- package/app/services/ai/messageCommandExecutionService.js +391 -0
- package/app/services/ai/moduleAiHelpCoreService.js +1099 -0
- package/app/services/ai/moduleAiHelpWrapperFactory.js +65 -0
- package/app/services/ai/moduleCommandConfigRuntimeService.js +113 -0
- package/app/services/ai/moduleToolExecutorService.js +464 -0
- package/app/services/ai/moduleToolRegistryService.js +178 -0
- package/app/services/ai/toolCandidateSelectorService.js +781 -0
- package/app/services/auth/googleWebLinkService.js +80 -0
- package/app/services/auth/whatsappLoginLinkService.js +230 -0
- package/app/services/external/pokeApiService.js +398 -0
- package/app/services/group/groupMetadataService.js +311 -0
- package/app/services/infra/dbWriteQueue.js +874 -0
- package/app/services/infra/featureFlagService.js +131 -0
- package/app/services/infra/queueUtils.js +55 -0
- package/app/services/messaging/captchaService.js +491 -0
- package/app/services/messaging/messagePersistenceService.js +1 -0
- package/app/services/messaging/newsBroadcastService.js +347 -0
- package/app/services/sticker/stickerFocusService.js +347 -0
- package/app/services/sticker/stickerFocusService.test.js +43 -0
- package/app/store/aiPromptStore.js +38 -0
- package/app/store/conversationSessionStore.js +131 -0
- package/app/store/groupConfigStore.js +58 -0
- package/app/store/premiumUserStore.js +54 -0
- package/app/utils/antiLink/antiLinkModule.js +700 -0
- package/app/utils/http/getImageBufferModule.js +18 -0
- package/app/utils/json/jsonSanitizer.js +113 -0
- package/app/utils/json/jsonSanitizer.test.js +40 -0
- package/app/utils/systemMetrics/systemMetricsModule.js +88 -0
- package/app/workers/aiLearningWorker.js +605 -0
- package/app/workers/commandConfigEnrichmentWorker.js +242 -0
- package/database/index.js +2075 -0
- package/database/init.js +151 -0
- package/database/migrations/.gitkeep +0 -0
- package/database/migrations/20260307_d0_hardening_down.sql +64 -0
- package/database/migrations/20260307_d0_hardening_up.sql +79 -0
- package/database/migrations/20260307_d1_terms_acceptance_down.sql +11 -0
- package/database/migrations/20260307_d1_terms_acceptance_up.sql +37 -0
- package/database/migrations/20260307_d2_auth_hardening_down.sql +75 -0
- package/database/migrations/20260307_d2_auth_hardening_up.sql +100 -0
- package/database/migrations/20260314_d7_canonical_sender_down.sql +53 -0
- package/database/migrations/20260314_d7_canonical_sender_up.sql +114 -0
- package/database/migrations/20260406_d30_security_analytics_down.sql +95 -0
- package/database/migrations/20260406_d30_security_analytics_up.sql +292 -0
- package/database/migrations/20260407_d31_web_google_session_token_hardening_down.sql +2 -0
- package/database/migrations/20260407_d31_web_google_session_token_hardening_up.sql +17 -0
- package/database/migrations/20260408_d32_ai_help_response_cache_down.sql +1 -0
- package/database/migrations/20260408_d32_ai_help_response_cache_up.sql +22 -0
- package/database/migrations/20260409_d33_ai_learning_tables_down.sql +4 -0
- package/database/migrations/20260409_d33_ai_learning_tables_up.sql +52 -0
- package/database/migrations/20260410_d34_command_config_enrichment_down.sql +3 -0
- package/database/migrations/20260410_d34_command_config_enrichment_up.sql +48 -0
- package/database/schema.sql +1186 -0
- package/docker-compose.yml +104 -0
- package/docs/audits/stickerCatalogController-out-of-scope.md +103 -0
- package/docs/audits/stickerCatalogController-symbols.md +58 -0
- package/docs/compliance/acceptable-use-policy-2026-03-07.md +35 -0
- package/docs/compliance/dpa-b2b-standard-2026-03-07.md +80 -0
- package/docs/compliance/monthly-compliance-checklist-2026-03-07.md +88 -0
- package/docs/compliance/notice-and-takedown-policy-2026-03-07.md +34 -0
- package/docs/compliance/privacy-policy-2026-03-07.md +75 -0
- package/docs/compliance/subprocessors-inventory-2026-03-07.md +16 -0
- package/docs/database/production-db-evolution-runbook-2026q1.md +365 -0
- package/docs/security/dsar-lgpd-runbook-2026-03-07.md +86 -0
- package/docs/security/incident-response-lgpd-anpd-runbook-2026-03-07.md +77 -0
- package/docs/security/network-hardening-runbook-2026-03-07.md +137 -0
- package/docs/seo/omnizap-seo-playbook-br-2026-02-28.md +238 -0
- package/docs/seo/satellite-page-template.md +116 -0
- package/docs/seo/satellite-pages-phase1.json +364 -0
- package/docs/wiki/Home.md +120 -0
- package/docs/wiki/pair-extraordinaire-2026-03-08.md +3 -0
- package/docs/wiki/recent-changes-2026-03-08.md +47 -0
- package/ecosystem.prod.config.cjs +135 -0
- package/eslint.config.js +89 -0
- package/index.js +488 -0
- package/ml/clip_classifier/Dockerfile +18 -0
- package/ml/clip_classifier/README.md +118 -0
- package/ml/clip_classifier/adaptive_scoring.py +40 -0
- package/ml/clip_classifier/classifier.py +654 -0
- package/ml/clip_classifier/embedding_store.py +481 -0
- package/ml/clip_classifier/env_loader.py +15 -0
- package/ml/clip_classifier/llm_label_expander.py +144 -0
- package/ml/clip_classifier/main.py +213 -0
- package/ml/clip_classifier/requirements.txt +10 -0
- package/ml/clip_classifier/similarity_engine.py +74 -0
- package/new-logo.png +0 -0
- package/observability/alert-rules.yml +60 -0
- package/observability/grafana/dashboards/omnizap-mysql.json +136 -0
- package/observability/grafana/dashboards/omnizap-overview.json +170 -0
- package/observability/grafana/provisioning/dashboards/dashboards.yml +11 -0
- package/observability/grafana/provisioning/datasources/datasources.yml +15 -0
- package/observability/loki-config.yml +38 -0
- package/observability/mysql-setup.sql +46 -0
- package/observability/prometheus.yml +35 -0
- package/observability/promtail-config.yml +84 -0
- package/observability/sticker-catalog-slo.md +83 -0
- package/observability/sticker-scale-hardening-rollout.md +128 -0
- package/package.json +144 -0
- package/public/apple-touch-icon.png +0 -0
- package/public/assets/css/commands-react.input.css +71 -0
- package/public/assets/css/create-pack-react.input.css +31 -0
- package/public/assets/css/home-react.input.css +106 -0
- package/public/assets/css/login-react.input.css +58 -0
- package/public/assets/css/stickers-react.input.css +18 -0
- package/public/assets/css/terms-react.input.css +115 -0
- package/public/assets/css/user-react.input.css +57 -0
- package/public/assets/images/brand-icon-192.png +0 -0
- package/public/assets/images/brand-logo-128.webp +0 -0
- package/public/assets/images/hero-banner-1280.jpg +0 -0
- package/public/comandos/commands-catalog.json +4517 -0
- package/public/css/api-docs.css +161 -0
- package/public/css/stickers-admin.css +1288 -0
- package/public/css/styles.css +679 -0
- package/public/css/systemadm/admin.css +474 -0
- package/public/css/systemadm/base.css +73 -0
- package/public/css/systemadm/components.css +662 -0
- package/public/css/systemadm/layout.css +229 -0
- package/public/css/systemadm/tokens.css +56 -0
- package/public/favicon-16x16.png +0 -0
- package/public/favicon-32x32.png +0 -0
- package/public/favicon.ico +0 -0
- package/public/js/apps/apiDocsApp.js +235 -0
- package/public/js/apps/commandsReactApp.js +528 -0
- package/public/js/apps/createPackApp.js +1646 -0
- package/public/js/apps/homeReactApp.js +942 -0
- package/public/js/apps/loginReactApp.js +496 -0
- package/public/js/apps/stickersAdminApp.js +1753 -0
- package/public/js/apps/stickersApp.js +3797 -0
- package/public/js/apps/termsReactApp.js +528 -0
- package/public/js/apps/userApp.js +2540 -0
- package/public/js/apps/userProfile/actions.js +66 -0
- package/public/js/apps/userReactApp.js +547 -0
- package/public/js/catalog.js +950 -0
- package/public/pages/api-docs.html +40 -0
- package/public/pages/aup.html +158 -0
- package/public/pages/comandos.html +41 -0
- package/public/pages/dpa.html +227 -0
- package/public/pages/home.html +45 -0
- package/public/pages/licenca.html +182 -0
- package/public/pages/login.html +40 -0
- package/public/pages/notice-and-takedown.html +234 -0
- package/public/pages/politica-de-privacidade.html +251 -0
- package/public/pages/seo-bot-whatsapp-para-grupo.html +350 -0
- package/public/pages/seo-bot-whatsapp-sem-programar.html +350 -0
- package/public/pages/seo-como-automatizar-avisos-no-whatsapp.html +350 -0
- package/public/pages/seo-como-criar-comandos-whatsapp.html +350 -0
- package/public/pages/seo-como-evitar-spam-no-whatsapp.html +350 -0
- package/public/pages/seo-como-moderar-grupo-whatsapp.html +350 -0
- package/public/pages/seo-como-organizar-comunidade-whatsapp.html +350 -0
- package/public/pages/seo-melhor-bot-whatsapp-para-grupos.html +350 -0
- package/public/pages/stickers-admin.html +31 -0
- package/public/pages/stickers-create.html +41 -0
- package/public/pages/stickers.html +45 -0
- package/public/pages/suboperadores.html +237 -0
- package/public/pages/termos-de-uso-texto-integral.html +241 -0
- package/public/pages/termos-de-uso.html +41 -0
- package/public/pages/user-password-reset.html +32 -0
- package/public/pages/user-systemadm.html +508 -0
- package/public/pages/user.html +39 -0
- package/public/robots.txt +9 -0
- package/public/site.webmanifest +24 -0
- package/public/sitemap.xml +98 -0
- package/schemas/command-config.schema.json +582 -0
- package/scripts/baileys-compat-smoke.mjs +12 -0
- package/scripts/cache-bust.mjs +142 -0
- package/scripts/deploy.sh +916 -0
- package/scripts/email-broadcast-terms-update.mjs +170 -0
- package/scripts/enrich-command-discovery-fields.mjs +286 -0
- package/scripts/generate-command-config-schema.mjs +273 -0
- package/scripts/generate-commands-catalog.mjs +308 -0
- package/scripts/generate-module-agents.mjs +631 -0
- package/scripts/generate-seo-satellite-pages.mjs +400 -0
- package/scripts/github-deploy-notify.mjs +174 -0
- package/scripts/github-release-notify.mjs +219 -0
- package/scripts/release.sh +599 -0
- package/scripts/run-codeql-local.sh +116 -0
- package/scripts/run-prettier-all.mjs +25 -0
- package/scripts/security-smoketest.mjs +581 -0
- package/scripts/sticker-catalog-loadtest.mjs +210 -0
- package/scripts/sticker-worker-task.mjs +119 -0
- package/scripts/sync-readme-snapshot.mjs +133 -0
- package/scripts/validate-command-config-schema.mjs +130 -0
- package/scripts/validate-command-configs.mjs +15 -0
- package/scripts/wiki-sync.sh +191 -0
- package/server/auth/googleWebAuth/googleWebAuthRuntime.js +62 -0
- package/server/auth/googleWebAuth/googleWebAuthService.js +807 -0
- package/server/auth/jwt/webJwtService.js +147 -0
- package/server/auth/stickerCatalogAuthContext.js +165 -0
- package/server/auth/termsAcceptance/termsAcceptanceHandler.js +189 -0
- package/server/auth/userPassword/index.js +14 -0
- package/server/auth/userPassword/userPasswordAuthService.js +422 -0
- package/server/auth/userPassword/userPasswordCrypto.js +199 -0
- package/server/auth/userPassword/userPasswordCrypto.test.js +76 -0
- package/server/auth/userPassword/userPasswordRecoveryService.js +728 -0
- package/server/auth/validation/authSchemas.js +236 -0
- package/server/auth/webAccount/webAccountHandlers.js +1434 -0
- package/server/controllers/admin/adminBanService.js +138 -0
- package/server/controllers/admin/adminPanelHandlers.js +2083 -0
- package/server/controllers/admin/stickerCatalogAdminContext.js +17 -0
- package/server/controllers/admin/systemAdminController.js +201 -0
- package/server/controllers/email/emailAutomationController.js +239 -0
- package/server/controllers/metricsController.js +21 -0
- package/server/controllers/seo/stickerCatalogSeoContext.js +514 -0
- package/server/controllers/sticker/nonCatalogHandlers.js +303 -0
- package/server/controllers/sticker/stickerCatalogController.js +4700 -0
- package/server/controllers/system/contactController.js +115 -0
- package/server/controllers/system/githubController.js +137 -0
- package/server/controllers/system/stickerCatalogSystemContext.js +758 -0
- package/server/controllers/system/storageController.js +154 -0
- package/server/controllers/system/systemController.js +135 -0
- package/server/controllers/system/systemMetricsController.js +156 -0
- package/server/controllers/system/visitController.js +90 -0
- package/server/controllers/userController.js +145 -0
- package/server/email/emailAutomationRuntime.js +225 -0
- package/server/email/emailAutomationService.js +125 -0
- package/server/email/emailOutboxRepository.js +282 -0
- package/server/email/emailTemplateService.js +480 -0
- package/server/email/emailTransportService.js +156 -0
- package/server/http/clientIp.js +95 -0
- package/server/http/httpRequestUtils.js +262 -0
- package/server/http/httpRequestUtils.test.js +80 -0
- package/server/http/httpServer.js +180 -0
- package/server/http/requestContext.js +20 -0
- package/server/http/siteRoutingUtils.js +87 -0
- package/server/index.js +1 -0
- package/server/middleware/cachePolicy.js +26 -0
- package/server/middleware/cachePolicyHelpers.js +1 -0
- package/server/middleware/endpointRateLimit.js +181 -0
- package/server/middleware/rateLimit.js +70 -0
- package/server/middleware/requireAdminAuth.js +48 -0
- package/server/middleware/securityHeaders.js +97 -0
- package/server/routes/admin/systemAdminRouter.js +64 -0
- package/server/routes/email/emailAutomationRouter.js +46 -0
- package/server/routes/health/healthRouter.js +41 -0
- package/server/routes/indexRouter.js +234 -0
- package/server/routes/metrics/metricsRouter.js +58 -0
- package/server/routes/static/staticPageRouter.js +134 -0
- package/server/routes/sticker/catalogHandlers/catalogAdminHttp.js +105 -0
- package/server/routes/sticker/catalogHandlers/catalogAuthHttp.js +77 -0
- package/server/routes/sticker/catalogHandlers/catalogPublicHttp.js +120 -0
- package/server/routes/sticker/catalogHandlers/catalogUploadHttp.js +83 -0
- package/server/routes/sticker/catalogRouter.js +77 -0
- package/server/routes/sticker/stickerApiRouter.js +84 -0
- package/server/routes/sticker/stickerDataRouter.js +145 -0
- package/server/routes/sticker/stickerSiteRouter.js +43 -0
- package/server/routes/user/userApiPaths.js +66 -0
- package/server/routes/user/userRouter.js +65 -0
- package/server/utils/safePath.js +26 -0
- package/utils/logger/loggerModule.js +35 -0
- package/vite.config.mjs +38 -0
|
@@ -0,0 +1,547 @@
|
|
|
1
|
+
# AiModule Agent Guide
|
|
2
|
+
|
|
3
|
+
Este arquivo e destinado a agentes de IA para gerar respostas no contexto dos comandos deste modulo.
|
|
4
|
+
|
|
5
|
+
## Fonte de Verdade
|
|
6
|
+
|
|
7
|
+
- arquivo_base: `app/modules/aiModule/commandConfig.json`
|
|
8
|
+
- schema_version: `2.0.0`
|
|
9
|
+
- module_enabled: `true`
|
|
10
|
+
- generated_at: `2026-03-11T02:35:17.177Z`
|
|
11
|
+
|
|
12
|
+
## Escopo do Modulo
|
|
13
|
+
|
|
14
|
+
- module: `aiModule`
|
|
15
|
+
- source_files:
|
|
16
|
+
- catCommand.js
|
|
17
|
+
- total_commands: `3`
|
|
18
|
+
- total_enabled_commands: `3`
|
|
19
|
+
|
|
20
|
+
## Defaults Schema v2
|
|
21
|
+
|
|
22
|
+
- inheritance_mode: deep_merge_with_command_overrides
|
|
23
|
+
- compatibility_mode: legacy_and_v2_fields
|
|
24
|
+
- legacy_field_aliases:
|
|
25
|
+
- descricao: description
|
|
26
|
+
- metodos_de_uso: usage
|
|
27
|
+
- permissao_necessaria: permission
|
|
28
|
+
- local_de_uso: contexts
|
|
29
|
+
- informacoes_coletadas: collected_data
|
|
30
|
+
- pre_condicoes: requirements
|
|
31
|
+
- dependencias_externas: dependencies
|
|
32
|
+
- efeitos_colaterais: side_effects
|
|
33
|
+
- observabilidade: observability
|
|
34
|
+
- privacidade: privacy
|
|
35
|
+
- limite_uso_por_plano: plan_limits
|
|
36
|
+
- argumentos: arguments
|
|
37
|
+
- acesso: access
|
|
38
|
+
- defaults.command:
|
|
39
|
+
- enabled: true
|
|
40
|
+
- category: ia
|
|
41
|
+
- version: 1.0.0
|
|
42
|
+
- stability: stable
|
|
43
|
+
- deprecated: false
|
|
44
|
+
- replaced_by: null
|
|
45
|
+
- risk_level: medium
|
|
46
|
+
- defaults.requirements (legacy view):
|
|
47
|
+
- requer_grupo: nao
|
|
48
|
+
- requer_admin: nao
|
|
49
|
+
- requer_admin_principal: nao
|
|
50
|
+
- requer_google_login: sim
|
|
51
|
+
- requer_nsfw: nao
|
|
52
|
+
- requer_midia: nao
|
|
53
|
+
- requer_mensagem_respondida: nao
|
|
54
|
+
|
|
55
|
+
## Protocolo de Resposta para IA
|
|
56
|
+
|
|
57
|
+
- Passo 1: identificar comando pelo token apos o prefixo.
|
|
58
|
+
- Passo 2: resolver alias para nome canonico usando campo `aliases`.
|
|
59
|
+
- Passo 3: validar `enabled`, `pre_condicoes`, permissao e local de uso.
|
|
60
|
+
- Passo 4: se houver erro de uso, responder com `mensagens_uso` (quando existir) ou `metodos_de_uso`.
|
|
61
|
+
- Passo 5: seguir `respostas_padrao` como fallback de texto.
|
|
62
|
+
- Passo 6: considerar `informacoes_coletadas`, `privacidade` e `observabilidade` ao elaborar resposta.
|
|
63
|
+
|
|
64
|
+
## Regras de Seguranca para IA
|
|
65
|
+
|
|
66
|
+
- A IA orienta, mas nao executa acao administrativa automaticamente.
|
|
67
|
+
- Nao inventar comandos, subcomandos ou permissao fora do JSON.
|
|
68
|
+
- Sempre informar onde pode usar (grupo/privado) e quem pode usar.
|
|
69
|
+
- Em duvida de permissao, responder com orientacao conservadora.
|
|
70
|
+
|
|
71
|
+
## Catalogo de Comandos
|
|
72
|
+
|
|
73
|
+
### ia
|
|
74
|
+
|
|
75
|
+
- id: ai.ia
|
|
76
|
+
- aliases: cat
|
|
77
|
+
- enabled: true
|
|
78
|
+
- categoria: ia
|
|
79
|
+
- descricao: Perguntas para IA com suporte opcional a resposta em audio.
|
|
80
|
+
- permissao_necessaria: usuario comum
|
|
81
|
+
- version: 1.0.0
|
|
82
|
+
- stability: stable
|
|
83
|
+
- deprecated: nao
|
|
84
|
+
- risk_level: low
|
|
85
|
+
- local_de_uso:
|
|
86
|
+
- privado
|
|
87
|
+
- grupo
|
|
88
|
+
- metodos_de_uso:
|
|
89
|
+
- <prefix>ia sua pergunta
|
|
90
|
+
- <prefix>ia --audio sua pergunta
|
|
91
|
+
- mensagens_uso (variantes):
|
|
92
|
+
- default:
|
|
93
|
+
- _<prefix>ia_ [--audio] sua pergunta
|
|
94
|
+
- _<prefix>ia_ (responda ou envie uma imagem com legenda)
|
|
95
|
+
- Opções:
|
|
96
|
+
- --audio | --texto
|
|
97
|
+
- --detail low | high | auto
|
|
98
|
+
- Exemplo:
|
|
99
|
+
- _<prefix>ia_ Explique como funciona a fotossíntese.
|
|
100
|
+
- _<prefix>ia_ --audio Resuma a imagem.
|
|
101
|
+
- subcomandos:
|
|
102
|
+
- (nenhum)
|
|
103
|
+
- argumentos:
|
|
104
|
+
- prompt | tipo: string | opcional | validacao: texto livre; pode usar contexto de mídia | default: null | posicao: 0
|
|
105
|
+
- flags | tipo: array | opcional | validacao: aliases de áudio/texto suportados | default: null | posicao: 1
|
|
106
|
+
- pre_condicoes:
|
|
107
|
+
- requer_grupo: nao
|
|
108
|
+
- requer_admin: nao
|
|
109
|
+
- requer_admin_principal: nao
|
|
110
|
+
- requer_google_login: sim
|
|
111
|
+
- requer_nsfw: nao
|
|
112
|
+
- requer_midia: nao
|
|
113
|
+
- requer_mensagem_respondida: nao
|
|
114
|
+
- rate_limit:
|
|
115
|
+
- max: null
|
|
116
|
+
- janela_ms: null
|
|
117
|
+
- escopo: sem_rate_limit_explicito
|
|
118
|
+
- acesso:
|
|
119
|
+
- somente_premium: nao
|
|
120
|
+
- planos_permitidos: comum, premium
|
|
121
|
+
- limite_uso_por_plano:
|
|
122
|
+
- comum: max=8, janela_ms=300000, escopo=usuario
|
|
123
|
+
- premium: max=40, janela_ms=300000, escopo=usuario
|
|
124
|
+
- informacoes_coletadas:
|
|
125
|
+
- identificador do chat (remoteJid)
|
|
126
|
+
- identificador do remetente (senderJid)
|
|
127
|
+
- texto do comando e argumentos
|
|
128
|
+
- contexto da mensagem (citacao e mencoes, quando existir)
|
|
129
|
+
- prompt textual enviado ao modelo de IA
|
|
130
|
+
- flags de resposta (ex.: audio/voz)
|
|
131
|
+
- midia anexada/citada para analise multimodal (quando houver)
|
|
132
|
+
- identidade do usuario para sessao e contexto de conversa
|
|
133
|
+
- dependencias_externas:
|
|
134
|
+
- OpenAI API
|
|
135
|
+
- efeitos_colaterais:
|
|
136
|
+
- envia resposta textual/áudio de IA
|
|
137
|
+
- respostas_padrao:
|
|
138
|
+
- success: Comando executado com sucesso.
|
|
139
|
+
- usage_error: Formato de uso inválido. Consulte metodos_de_uso.
|
|
140
|
+
- permission_error: Permissão insuficiente para executar este comando.
|
|
141
|
+
- sucesso: Comando executado com sucesso.
|
|
142
|
+
- erro_uso: Formato de uso inválido. Consulte metodos_de_uso.
|
|
143
|
+
- erro_permissao: Permissão insuficiente para executar este comando.
|
|
144
|
+
- mensagens_sistema:
|
|
145
|
+
- premium*only: ⭐ \_Comando Premium*
|
|
146
|
+
|
|
147
|
+
Este comando é exclusivo para usuários premium.
|
|
148
|
+
Fale com o administrador para liberar o acesso.
|
|
149
|
+
|
|
150
|
+
- openai*nao_configurada: ⚠️ \_OpenAI não configurada*
|
|
151
|
+
|
|
152
|
+
Defina a variável _OPENAI_API_KEY_ no `.env` para usar o comando _cat_.
|
|
153
|
+
|
|
154
|
+
- imagem_muito_grande: ⚠️ A imagem enviada ultrapassa o limite de {{limite_mb}} MB. Envie uma imagem menor.
|
|
155
|
+
- imagem_download_falhou: ⚠️ Não consegui baixar a imagem. Tente reenviar.
|
|
156
|
+
- resposta_vazia: ⚠️ Não consegui gerar uma resposta agora. Tente novamente.
|
|
157
|
+
- audio_muito_longo: ⚠️ A resposta ficou longa demais para áudio. Enviando em texto.
|
|
158
|
+
- audio_falhou: ⚠️ Não consegui gerar o áudio agora. Enviando texto.
|
|
159
|
+
- erro*openai: ❌ \_Erro ao falar com a IA*
|
|
160
|
+
Tente novamente em alguns instantes.
|
|
161
|
+
- limites_operacionais:
|
|
162
|
+
- (nao informado)
|
|
163
|
+
- opcoes:
|
|
164
|
+
- toggle_on_off_status.type: toggle
|
|
165
|
+
- toggle_on_off_status.allowed_actions: on, off, status
|
|
166
|
+
- toggle_on_off_status.action_argument: acao
|
|
167
|
+
- add_remove_list.type: list_management
|
|
168
|
+
- add_remove_list.allowed_actions: add, remove, list
|
|
169
|
+
- add_remove_list.action_argument: acao
|
|
170
|
+
- approve_reject.type: moderation_decision
|
|
171
|
+
- approve_reject.allowed_actions: approve, reject
|
|
172
|
+
- approve_reject.action_argument: acao
|
|
173
|
+
- approve_reject.requires_targets: true
|
|
174
|
+
- set_status_reset.type: configuration_window
|
|
175
|
+
- set_status_reset.allowed_actions: set, status, reset
|
|
176
|
+
- set_status_reset.action_argument: valor
|
|
177
|
+
- parse.audio_flags: --audio, --voz, --voice, --tts, -a
|
|
178
|
+
- parse.text_flags: --texto, --text, --txt
|
|
179
|
+
- parse.image_detail_aliases.low: low
|
|
180
|
+
- parse.image_detail_aliases.high: high
|
|
181
|
+
- parse.image_detail_aliases.auto: auto
|
|
182
|
+
- parse.image_detail_aliases.baixo: low
|
|
183
|
+
- parse.image_detail_aliases.baixa: low
|
|
184
|
+
- parse.image_detail_aliases.alto: high
|
|
185
|
+
- parse.image_detail_aliases.alta: high
|
|
186
|
+
- parse.image_detail_aliases.automatico: auto
|
|
187
|
+
- parse.image_detail_aliases.automático: auto
|
|
188
|
+
- observabilidade:
|
|
189
|
+
- event_name: command.executed
|
|
190
|
+
- analytics_event: whatsapp_command_cat
|
|
191
|
+
- tags_log: whatsapp, command, aiModule, cat
|
|
192
|
+
- nivel_log: info
|
|
193
|
+
- privacidade:
|
|
194
|
+
- dados_sensiveis:
|
|
195
|
+
- chat_identifier
|
|
196
|
+
- sender_identifier
|
|
197
|
+
- command_content
|
|
198
|
+
- retencao: standard_app_logs
|
|
199
|
+
- base_legal: service_execution_and_legitimate_interest
|
|
200
|
+
- docs:
|
|
201
|
+
- summary: Perguntas para IA com suporte opcional a resposta em audio.
|
|
202
|
+
- usage_examples: <prefix>ia sua pergunta, <prefix>ia --audio sua pergunta
|
|
203
|
+
- usage*variants.default: *<prefix>ia* [--audio] sua pergunta, *<prefix>ia* (responda ou envie uma imagem com legenda), , Opções:, --audio | --texto, --detail low | high | auto, , Exemplo:, *<prefix>ia* Explique como funciona a fotossíntese., *<prefix>ia\_ --audio Resuma a imagem.
|
|
204
|
+
- behavior:
|
|
205
|
+
- type: argument_driven
|
|
206
|
+
- allowed_actions: (nenhum)
|
|
207
|
+
- limits:
|
|
208
|
+
- usage_description: texto sujeito a limites da API
|
|
209
|
+
- rate_limit.max: null
|
|
210
|
+
- rate_limit.janela_ms: null
|
|
211
|
+
- rate_limit.escopo: sem_rate_limit_explicito
|
|
212
|
+
- access.somente_premium: false
|
|
213
|
+
- access.planos_permitidos: comum, premium
|
|
214
|
+
- plan_limits.comum.max: 8
|
|
215
|
+
- plan_limits.comum.janela_ms: 300000
|
|
216
|
+
- plan_limits.comum.escopo: usuario
|
|
217
|
+
- plan_limits.premium.max: 40
|
|
218
|
+
- plan_limits.premium.janela_ms: 300000
|
|
219
|
+
- plan_limits.premium.escopo: usuario
|
|
220
|
+
- discovery:
|
|
221
|
+
- keywords: ia, ia, privado, grupo
|
|
222
|
+
- faq_queries: como usar ia, o que faz ia, comando ia
|
|
223
|
+
- user_phrasings: quero usar ia, me ajuda com ia, perguntas para ia com
|
|
224
|
+
- suggestion_priority: 100
|
|
225
|
+
- handler:
|
|
226
|
+
- file: catCommand.js
|
|
227
|
+
- method: handleCatCommand
|
|
228
|
+
- command_case: ia
|
|
229
|
+
|
|
230
|
+
### iaimagem
|
|
231
|
+
|
|
232
|
+
- id: ai.iaimagem
|
|
233
|
+
- aliases: catimage, catimg
|
|
234
|
+
- enabled: true
|
|
235
|
+
- categoria: ia
|
|
236
|
+
- descricao: Gera/edita imagem com IA por prompt.
|
|
237
|
+
- permissao_necessaria: usuario comum
|
|
238
|
+
- version: 1.0.0
|
|
239
|
+
- stability: stable
|
|
240
|
+
- deprecated: nao
|
|
241
|
+
- risk_level: low
|
|
242
|
+
- local_de_uso:
|
|
243
|
+
- privado
|
|
244
|
+
- grupo
|
|
245
|
+
- metodos_de_uso:
|
|
246
|
+
- <prefix>iaimagem seu prompt
|
|
247
|
+
- <prefix>iaimagem --size 1536x1024 seu prompt
|
|
248
|
+
- mensagens_uso (variantes):
|
|
249
|
+
- default:
|
|
250
|
+
- _<prefix>iaimagem_ seu prompt
|
|
251
|
+
- _<prefix>iaimagem_ (responda uma imagem com legenda para editar)
|
|
252
|
+
- Opções:
|
|
253
|
+
- --size 1024x1024 | 1024x1536 | 1536x1024 | auto
|
|
254
|
+
- --quality low | medium | high | auto
|
|
255
|
+
- --format png | jpeg | webp
|
|
256
|
+
- --background transparent | opaque | auto
|
|
257
|
+
- --compression 0-100
|
|
258
|
+
- Exemplo:
|
|
259
|
+
- _<prefix>iaimagem_ --size 1536x1024 Um gato astronauta em aquarela.
|
|
260
|
+
- subcomandos:
|
|
261
|
+
- (nenhum)
|
|
262
|
+
- argumentos:
|
|
263
|
+
- prompt | tipo: string | opcional | validacao: texto livre para gerar/editar imagem | default: null | posicao: 0
|
|
264
|
+
- size | tipo: string | opcional | validacao: auto|1024x1024|1024x1536|1536x1024 | default: null | posicao: 1
|
|
265
|
+
- quality | tipo: string | opcional | validacao: auto|low|medium|high | default: null | posicao: 2
|
|
266
|
+
- format | tipo: string | opcional | validacao: png|jpeg|webp | default: null | posicao: 3
|
|
267
|
+
- pre_condicoes:
|
|
268
|
+
- requer_grupo: nao
|
|
269
|
+
- requer_admin: nao
|
|
270
|
+
- requer_admin_principal: nao
|
|
271
|
+
- requer_google_login: sim
|
|
272
|
+
- requer_nsfw: nao
|
|
273
|
+
- requer_midia: nao
|
|
274
|
+
- requer_mensagem_respondida: nao
|
|
275
|
+
- rate_limit:
|
|
276
|
+
- max: null
|
|
277
|
+
- janela_ms: null
|
|
278
|
+
- escopo: sem_rate_limit_explicito
|
|
279
|
+
- acesso:
|
|
280
|
+
- somente_premium: sim
|
|
281
|
+
- planos_permitidos: premium
|
|
282
|
+
- limite_uso_por_plano:
|
|
283
|
+
- comum: max=8, janela_ms=300000, escopo=usuario
|
|
284
|
+
- premium: max=40, janela_ms=300000, escopo=usuario
|
|
285
|
+
- informacoes_coletadas:
|
|
286
|
+
- identificador do chat (remoteJid)
|
|
287
|
+
- identificador do remetente (senderJid)
|
|
288
|
+
- texto do comando e argumentos
|
|
289
|
+
- contexto da mensagem (citacao e mencoes, quando existir)
|
|
290
|
+
- prompt de geracao/edicao de imagem
|
|
291
|
+
- opcoes de geracao (size, quality, format, background)
|
|
292
|
+
- imagem enviada/citada para edicao (quando houver)
|
|
293
|
+
- dependencias_externas:
|
|
294
|
+
- OpenAI API
|
|
295
|
+
- efeitos_colaterais:
|
|
296
|
+
- envia imagem gerada/editada por IA
|
|
297
|
+
- respostas_padrao:
|
|
298
|
+
- success: Comando executado com sucesso.
|
|
299
|
+
- usage_error: Formato de uso inválido. Consulte metodos_de_uso.
|
|
300
|
+
- permission_error: Permissão insuficiente para executar este comando.
|
|
301
|
+
- sucesso: Comando executado com sucesso.
|
|
302
|
+
- erro_uso: Formato de uso inválido. Consulte metodos_de_uso.
|
|
303
|
+
- erro_permissao: Permissão insuficiente para executar este comando.
|
|
304
|
+
- mensagens_sistema:
|
|
305
|
+
- premium*only: ⭐ \_Comando Premium*
|
|
306
|
+
|
|
307
|
+
Este comando é exclusivo para usuários premium.
|
|
308
|
+
Fale com o administrador para liberar o acesso.
|
|
309
|
+
|
|
310
|
+
- openai*nao_configurada: ⚠️ \_OpenAI não configurada*
|
|
311
|
+
|
|
312
|
+
Defina a variável _OPENAI_API_KEY_ no `.env` para usar o comando _catimg_.
|
|
313
|
+
|
|
314
|
+
- imagem_muito_grande: ⚠️ A imagem enviada ultrapassa o limite de {{limite_mb}} MB. Envie uma imagem menor.
|
|
315
|
+
- imagem_download_falhou: ⚠️ Não consegui baixar a imagem. Tente reenviar.
|
|
316
|
+
- opcoes_invalidas: ⚠️ Opções inválidas no comando.
|
|
317
|
+
Detalhes: {{detalhes}}
|
|
318
|
+
|
|
319
|
+
Use _{{prefix}}catimg_ sem opções para ver o formato correto.
|
|
320
|
+
|
|
321
|
+
- resposta_vazia: ⚠️ Não consegui gerar a imagem agora. Tente novamente.
|
|
322
|
+
- erro*openai: ❌ \_Erro ao falar com a IA*
|
|
323
|
+
Tente novamente em alguns instantes.
|
|
324
|
+
- limites_operacionais:
|
|
325
|
+
- (nao informado)
|
|
326
|
+
- opcoes:
|
|
327
|
+
- toggle_on_off_status.type: toggle
|
|
328
|
+
- toggle_on_off_status.allowed_actions: on, off, status
|
|
329
|
+
- toggle_on_off_status.action_argument: acao
|
|
330
|
+
- add_remove_list.type: list_management
|
|
331
|
+
- add_remove_list.allowed_actions: add, remove, list
|
|
332
|
+
- add_remove_list.action_argument: acao
|
|
333
|
+
- approve_reject.type: moderation_decision
|
|
334
|
+
- approve_reject.allowed_actions: approve, reject
|
|
335
|
+
- approve_reject.action_argument: acao
|
|
336
|
+
- approve_reject.requires_targets: true
|
|
337
|
+
- set_status_reset.type: configuration_window
|
|
338
|
+
- set_status_reset.allowed_actions: set, status, reset
|
|
339
|
+
- set_status_reset.action_argument: valor
|
|
340
|
+
- geracao_imagem.size_options: auto, 1024x1024, 1024x1536, 1536x1024
|
|
341
|
+
- geracao_imagem.size_aliases.1024: 1024x1024
|
|
342
|
+
- geracao_imagem.size_aliases.square: 1024x1024
|
|
343
|
+
- geracao_imagem.size_aliases.quadrado: 1024x1024
|
|
344
|
+
- geracao_imagem.size_aliases.portrait: 1024x1536
|
|
345
|
+
- geracao_imagem.size_aliases.retrato: 1024x1536
|
|
346
|
+
- geracao_imagem.size_aliases.landscape: 1536x1024
|
|
347
|
+
- geracao_imagem.size_aliases.paisagem: 1536x1024
|
|
348
|
+
- geracao_imagem.size_aliases.auto: auto
|
|
349
|
+
- geracao_imagem.quality_options: auto, low, medium, high
|
|
350
|
+
- geracao_imagem.quality_aliases.baixa: low
|
|
351
|
+
- geracao_imagem.quality_aliases.baixo: low
|
|
352
|
+
- geracao_imagem.quality_aliases.media: medium
|
|
353
|
+
- geracao_imagem.quality_aliases.média: medium
|
|
354
|
+
- geracao_imagem.quality_aliases.medio: medium
|
|
355
|
+
- geracao_imagem.quality_aliases.médio: medium
|
|
356
|
+
- geracao_imagem.quality_aliases.alta: high
|
|
357
|
+
- geracao_imagem.quality_aliases.alto: high
|
|
358
|
+
- geracao_imagem.quality_aliases.auto: auto
|
|
359
|
+
- geracao_imagem.format_options: png, jpeg, webp
|
|
360
|
+
- geracao_imagem.format_aliases.jpg: jpeg
|
|
361
|
+
- geracao_imagem.format_aliases.jpeg: jpeg
|
|
362
|
+
- geracao_imagem.format_aliases.png: png
|
|
363
|
+
- geracao_imagem.format_aliases.webp: webp
|
|
364
|
+
- geracao_imagem.background_options: auto, transparent, opaque
|
|
365
|
+
- geracao_imagem.background_aliases.auto: auto
|
|
366
|
+
- geracao_imagem.background_aliases.transparent: transparent
|
|
367
|
+
- geracao_imagem.background_aliases.transparente: transparent
|
|
368
|
+
- geracao_imagem.background_aliases.opaque: opaque
|
|
369
|
+
- geracao_imagem.background_aliases.opaco: opaque
|
|
370
|
+
- geracao_imagem.background_aliases.opaca: opaque
|
|
371
|
+
- geracao_imagem.flag_aliases.size: --size, --tamanho
|
|
372
|
+
- geracao_imagem.flag_aliases.quality: --quality, --qualidade
|
|
373
|
+
- geracao_imagem.flag_aliases.format: --format, --formato
|
|
374
|
+
- geracao_imagem.flag_aliases.background: --background, --fundo
|
|
375
|
+
- geracao_imagem.flag_aliases.compression: --compression, --compressao, --compressão
|
|
376
|
+
- geracao_imagem.compression.min: 0
|
|
377
|
+
- geracao_imagem.compression.max: 100
|
|
378
|
+
- observabilidade:
|
|
379
|
+
- event_name: command.executed
|
|
380
|
+
- analytics_event: whatsapp_command_catimg
|
|
381
|
+
- tags_log: whatsapp, command, aiModule, catimg
|
|
382
|
+
- nivel_log: info
|
|
383
|
+
- privacidade:
|
|
384
|
+
- dados_sensiveis:
|
|
385
|
+
- chat_identifier
|
|
386
|
+
- sender_identifier
|
|
387
|
+
- command_content
|
|
388
|
+
- retencao: standard_app_logs
|
|
389
|
+
- base_legal: service_execution_and_legitimate_interest
|
|
390
|
+
- docs:
|
|
391
|
+
- summary: Gera/edita imagem com IA por prompt.
|
|
392
|
+
- usage_examples: <prefix>iaimagem seu prompt, <prefix>iaimagem --size 1536x1024 seu prompt
|
|
393
|
+
- usage*variants.default: *<prefix>iaimagem* seu prompt, *<prefix>iaimagem* (responda uma imagem com legenda para editar), , Opções:, --size 1024x1024 | 1024x1536 | 1536x1024 | auto, --quality low | medium | high | auto, --format png | jpeg | webp, --background transparent | opaque | auto, --compression 0-100, , Exemplo:, *<prefix>iaimagem\_ --size 1536x1024 Um gato astronauta em aquarela.
|
|
394
|
+
- behavior:
|
|
395
|
+
- type: argument_driven
|
|
396
|
+
- allowed_actions: (nenhum)
|
|
397
|
+
- limits:
|
|
398
|
+
- usage_description: imagem de entrada ate OPENAI_MAX_IMAGE_MB (padrao 50 MB)
|
|
399
|
+
- rate_limit.max: null
|
|
400
|
+
- rate_limit.janela_ms: null
|
|
401
|
+
- rate_limit.escopo: sem_rate_limit_explicito
|
|
402
|
+
- access.somente_premium: true
|
|
403
|
+
- access.planos_permitidos: premium
|
|
404
|
+
- plan_limits.comum.max: 8
|
|
405
|
+
- plan_limits.comum.janela_ms: 300000
|
|
406
|
+
- plan_limits.comum.escopo: usuario
|
|
407
|
+
- plan_limits.premium.max: 40
|
|
408
|
+
- plan_limits.premium.janela_ms: 300000
|
|
409
|
+
- plan_limits.premium.escopo: usuario
|
|
410
|
+
- discovery:
|
|
411
|
+
- keywords: iaimagem, catimage, ia, privado, grupo
|
|
412
|
+
- faq_queries: como usar iaimagem, o que faz iaimagem, comando iaimagem
|
|
413
|
+
- user_phrasings: quero usar iaimagem, me ajuda com iaimagem, gera/edita imagem com ia
|
|
414
|
+
- suggestion_priority: 100
|
|
415
|
+
- handler:
|
|
416
|
+
- file: catCommand.js
|
|
417
|
+
- method: handleCatImageCommand
|
|
418
|
+
- command_case: iaimagem
|
|
419
|
+
|
|
420
|
+
### pergunteia
|
|
421
|
+
|
|
422
|
+
- id: ai.pergunteia
|
|
423
|
+
- aliases: iaprompt, promptia, catprompt
|
|
424
|
+
- enabled: true
|
|
425
|
+
- categoria: ia
|
|
426
|
+
- descricao: Define ou reseta o prompt personalizado da IA para o usuario.
|
|
427
|
+
- permissao_necessaria: usuario comum
|
|
428
|
+
- version: 1.0.0
|
|
429
|
+
- stability: stable
|
|
430
|
+
- deprecated: nao
|
|
431
|
+
- risk_level: low
|
|
432
|
+
- local_de_uso:
|
|
433
|
+
- privado
|
|
434
|
+
- grupo
|
|
435
|
+
- metodos_de_uso:
|
|
436
|
+
- <prefix>pergunteia novo prompt
|
|
437
|
+
- <prefix>pergunteia reset
|
|
438
|
+
- mensagens_uso (variantes):
|
|
439
|
+
- default:
|
|
440
|
+
- _<prefix>pergunteia_ seu novo prompt
|
|
441
|
+
- Para voltar ao padrão:
|
|
442
|
+
- _<prefix>pergunteia reset_
|
|
443
|
+
- subcomandos:
|
|
444
|
+
- reset
|
|
445
|
+
- argumentos:
|
|
446
|
+
- conteudo | tipo: string | obrigatorio | validacao: texto do prompt ou reset | default: null | posicao: 0
|
|
447
|
+
- pre_condicoes:
|
|
448
|
+
- requer_grupo: nao
|
|
449
|
+
- requer_admin: nao
|
|
450
|
+
- requer_admin_principal: nao
|
|
451
|
+
- requer_google_login: sim
|
|
452
|
+
- requer_nsfw: nao
|
|
453
|
+
- requer_midia: nao
|
|
454
|
+
- requer_mensagem_respondida: nao
|
|
455
|
+
- rate_limit:
|
|
456
|
+
- max: null
|
|
457
|
+
- janela_ms: null
|
|
458
|
+
- escopo: sem_rate_limit_explicito
|
|
459
|
+
- acesso:
|
|
460
|
+
- somente_premium: nao
|
|
461
|
+
- planos_permitidos: comum, premium
|
|
462
|
+
- limite_uso_por_plano:
|
|
463
|
+
- comum: max=8, janela_ms=300000, escopo=usuario
|
|
464
|
+
- premium: max=40, janela_ms=300000, escopo=usuario
|
|
465
|
+
- informacoes_coletadas:
|
|
466
|
+
- identificador do chat (remoteJid)
|
|
467
|
+
- identificador do remetente (senderJid)
|
|
468
|
+
- texto do comando e argumentos
|
|
469
|
+
- contexto da mensagem (citacao e mencoes, quando existir)
|
|
470
|
+
- prompt personalizado informado pelo usuario
|
|
471
|
+
- identidade do usuario para salvar/atualizar preferencia
|
|
472
|
+
- dependencias_externas:
|
|
473
|
+
- store interno de prompt de IA
|
|
474
|
+
- efeitos_colaterais:
|
|
475
|
+
- salva ou reseta prompt personalizado do usuário
|
|
476
|
+
- respostas_padrao:
|
|
477
|
+
- success: Comando executado com sucesso.
|
|
478
|
+
- usage_error: Formato de uso inválido. Consulte metodos_de_uso.
|
|
479
|
+
- permission_error: Permissão insuficiente para executar este comando.
|
|
480
|
+
- sucesso: Comando executado com sucesso.
|
|
481
|
+
- erro_uso: Formato de uso inválido. Consulte metodos_de_uso.
|
|
482
|
+
- erro_permissao: Permissão insuficiente para executar este comando.
|
|
483
|
+
- mensagens_sistema:
|
|
484
|
+
- premium*only: ⭐ \_Comando Premium*
|
|
485
|
+
|
|
486
|
+
Este comando é exclusivo para usuários premium.
|
|
487
|
+
Fale com o administrador para liberar o acesso.
|
|
488
|
+
|
|
489
|
+
- prompt_muito_longo: ⚠️ Prompt muito longo. Limite: {{max_chars}} caracteres.
|
|
490
|
+
- prompt_reset_sucesso: ✅ Prompt da IA restaurado para o padrão.
|
|
491
|
+
- prompt_update_sucesso: ✅ Prompt da IA atualizado para você.
|
|
492
|
+
- limites_operacionais:
|
|
493
|
+
- prompt_max_chars: 2000
|
|
494
|
+
- opcoes:
|
|
495
|
+
- toggle_on_off_status.type: toggle
|
|
496
|
+
- toggle_on_off_status.allowed_actions: on, off, status
|
|
497
|
+
- toggle_on_off_status.action_argument: acao
|
|
498
|
+
- add_remove_list.type: list_management
|
|
499
|
+
- add_remove_list.allowed_actions: add, remove, list
|
|
500
|
+
- add_remove_list.action_argument: acao
|
|
501
|
+
- approve_reject.type: moderation_decision
|
|
502
|
+
- approve_reject.allowed_actions: approve, reject
|
|
503
|
+
- approve_reject.action_argument: acao
|
|
504
|
+
- approve_reject.requires_targets: true
|
|
505
|
+
- set_status_reset.type: configuration_window
|
|
506
|
+
- set_status_reset.allowed_actions: set, status, reset
|
|
507
|
+
- set_status_reset.action_argument: valor
|
|
508
|
+
- observabilidade:
|
|
509
|
+
- event_name: command.executed
|
|
510
|
+
- analytics_event: whatsapp_command_catprompt
|
|
511
|
+
- tags_log: whatsapp, command, aiModule, catprompt
|
|
512
|
+
- nivel_log: info
|
|
513
|
+
- privacidade:
|
|
514
|
+
- dados_sensiveis:
|
|
515
|
+
- sender_identifier
|
|
516
|
+
- command_content
|
|
517
|
+
- retencao: standard_app_logs
|
|
518
|
+
- base_legal: service_execution_and_legitimate_interest
|
|
519
|
+
- docs:
|
|
520
|
+
- summary: Define ou reseta o prompt personalizado da IA para o usuario.
|
|
521
|
+
- usage_examples: <prefix>pergunteia novo prompt, <prefix>pergunteia reset
|
|
522
|
+
- usage*variants.default: *<prefix>pergunteia* seu novo prompt, , Para voltar ao padrão:, *<prefix>pergunteia reset\_
|
|
523
|
+
- behavior:
|
|
524
|
+
- type: subcommand
|
|
525
|
+
- allowed_actions: reset
|
|
526
|
+
- limits:
|
|
527
|
+
- usage_description: 1 prompt por usuario (atualizavel)
|
|
528
|
+
- rate_limit.max: null
|
|
529
|
+
- rate_limit.janela_ms: null
|
|
530
|
+
- rate_limit.escopo: sem_rate_limit_explicito
|
|
531
|
+
- access.somente_premium: false
|
|
532
|
+
- access.planos_permitidos: comum, premium
|
|
533
|
+
- plan_limits.comum.max: 8
|
|
534
|
+
- plan_limits.comum.janela_ms: 300000
|
|
535
|
+
- plan_limits.comum.escopo: usuario
|
|
536
|
+
- plan_limits.premium.max: 40
|
|
537
|
+
- plan_limits.premium.janela_ms: 300000
|
|
538
|
+
- plan_limits.premium.escopo: usuario
|
|
539
|
+
- discovery:
|
|
540
|
+
- keywords: pergunteia, iaprompt, promptia, ia, privado, grupo
|
|
541
|
+
- faq_queries: como usar pergunteia, o que faz pergunteia, comando pergunteia
|
|
542
|
+
- user_phrasings: quero usar pergunteia, me ajuda com pergunteia, define ou reseta o
|
|
543
|
+
- suggestion_priority: 100
|
|
544
|
+
- handler:
|
|
545
|
+
- file: catCommand.js
|
|
546
|
+
- method: handleCatPromptCommand
|
|
547
|
+
- command_case: pergunteia
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
import { createModuleAiHelpWrapper } from '../../services/ai/moduleAiHelpWrapperFactory.js';
|
|
4
|
+
|
|
5
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
6
|
+
const __dirname = path.dirname(__filename);
|
|
7
|
+
|
|
8
|
+
export const aiAiHelpWrapper = createModuleAiHelpWrapper({
|
|
9
|
+
moduleKey: 'ai',
|
|
10
|
+
moduleLabel: 'comandos de IA',
|
|
11
|
+
envPrefix: 'AI_AI_HELP',
|
|
12
|
+
moduleDirPath: __dirname,
|
|
13
|
+
moduleNameFallback: 'aiModule',
|
|
14
|
+
});
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
|
|
4
|
+
import { createModuleCommandConfigRuntime } from '../../services/ai/moduleCommandConfigRuntimeService.js';
|
|
5
|
+
|
|
6
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
7
|
+
const __dirname = path.dirname(__filename);
|
|
8
|
+
const CONFIG_PATH = path.join(__dirname, 'commandConfig.json');
|
|
9
|
+
|
|
10
|
+
const DEFAULT_TEXTS = {
|
|
11
|
+
usage_header: 'Use assim:',
|
|
12
|
+
premium_only: '⭐ *Comando Premium*\n\nEste comando é exclusivo para usuários premium.',
|
|
13
|
+
openai_not_configured: '⚠️ *OpenAI não configurada*\n\nDefina a variável *OPENAI_API_KEY* no `.env` para usar este comando.',
|
|
14
|
+
generic_error: '❌ *Erro ao falar com a IA*\nTente novamente em alguns instantes.',
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
const runtime = createModuleCommandConfigRuntime({
|
|
18
|
+
configPath: CONFIG_PATH,
|
|
19
|
+
fallbackConfig: {
|
|
20
|
+
module: 'aiModule',
|
|
21
|
+
commands: [],
|
|
22
|
+
textos: DEFAULT_TEXTS,
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
const normalizeText = (value) =>
|
|
27
|
+
String(value || '')
|
|
28
|
+
.trim()
|
|
29
|
+
.toLowerCase();
|
|
30
|
+
|
|
31
|
+
const renderUsageMethod = (method, commandPrefix) => String(method || '').replaceAll('<prefix>', String(commandPrefix || '/'));
|
|
32
|
+
|
|
33
|
+
const resolveUsageLines = (entry, variant) => {
|
|
34
|
+
if (!entry || typeof entry !== 'object') return [];
|
|
35
|
+
|
|
36
|
+
const usageMessages = entry?.mensagens_uso && typeof entry.mensagens_uso === 'object' ? entry.mensagens_uso : null;
|
|
37
|
+
|
|
38
|
+
if (usageMessages) {
|
|
39
|
+
const variantKey = typeof variant === 'string' ? variant.trim() : '';
|
|
40
|
+
const picked = (variantKey && usageMessages[variantKey]) || usageMessages.default || null;
|
|
41
|
+
if (Array.isArray(picked)) {
|
|
42
|
+
return picked.filter(Boolean).map((value) => String(value));
|
|
43
|
+
}
|
|
44
|
+
if (typeof picked === 'string' && picked.trim()) {
|
|
45
|
+
return [picked.trim()];
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const methods = Array.isArray(entry?.metodos_de_uso) ? entry.metodos_de_uso : [];
|
|
50
|
+
return methods.filter(Boolean).map((value) => String(value));
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
export const getAiModuleConfig = () => runtime.getModuleConfig();
|
|
54
|
+
|
|
55
|
+
export const resolveAiCommandName = (command) => runtime.resolveCommandName(command);
|
|
56
|
+
export const getAiCommandEntry = (command) => runtime.getCommandEntry(command);
|
|
57
|
+
export const listEnabledAiCommands = () => runtime.listEnabledCommands();
|
|
58
|
+
|
|
59
|
+
export const getAiTextConfig = () => {
|
|
60
|
+
const config = getAiModuleConfig();
|
|
61
|
+
const raw = config?.textos && typeof config.textos === 'object' ? config.textos : {};
|
|
62
|
+
return {
|
|
63
|
+
...DEFAULT_TEXTS,
|
|
64
|
+
...raw,
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
export const getAiUsageText = (command, { commandPrefix = '/', header, variant } = {}) => {
|
|
69
|
+
const entry = getAiCommandEntry(command);
|
|
70
|
+
const methods = resolveUsageLines(entry, variant);
|
|
71
|
+
if (!methods.length) return '';
|
|
72
|
+
|
|
73
|
+
const prefixHeader = typeof header === 'string' ? header : getAiTextConfig().usage_header || DEFAULT_TEXTS.usage_header;
|
|
74
|
+
const lines = methods.map((method) => renderUsageMethod(method, commandPrefix));
|
|
75
|
+
return [prefixHeader, ...lines].join('\n');
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
export const isAiCommandPremiumOnly = (command) => {
|
|
79
|
+
const entry = getAiCommandEntry(command);
|
|
80
|
+
return Boolean(entry?.acesso?.somente_premium);
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
export const getAiCommandSystemMessages = (command) => {
|
|
84
|
+
const entry = getAiCommandEntry(command);
|
|
85
|
+
const raw = entry?.mensagens_sistema && typeof entry.mensagens_sistema === 'object' ? entry.mensagens_sistema : {};
|
|
86
|
+
return raw;
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
export const getAiCommandOperationalLimits = (command) => {
|
|
90
|
+
const entry = getAiCommandEntry(command);
|
|
91
|
+
const raw = entry?.limites_operacionais && typeof entry.limites_operacionais === 'object' ? entry.limites_operacionais : {};
|
|
92
|
+
return raw;
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
const normalizeMapKeys = (value = {}) => {
|
|
96
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) return {};
|
|
97
|
+
const output = {};
|
|
98
|
+
for (const [key, mapValue] of Object.entries(value)) {
|
|
99
|
+
const normalizedKey = normalizeText(key);
|
|
100
|
+
if (!normalizedKey) continue;
|
|
101
|
+
output[normalizedKey] = String(mapValue ?? '').trim();
|
|
102
|
+
}
|
|
103
|
+
return output;
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
export const getAiCommandOptionConfig = (command) => {
|
|
107
|
+
const entry = getAiCommandEntry(command);
|
|
108
|
+
const options = entry?.opcoes && typeof entry.opcoes === 'object' ? entry.opcoes : {};
|
|
109
|
+
|
|
110
|
+
const parse = options?.parse && typeof options.parse === 'object' ? options.parse : {};
|
|
111
|
+
const generation = options?.geracao_imagem && typeof options.geracao_imagem === 'object' ? options.geracao_imagem : {};
|
|
112
|
+
|
|
113
|
+
return {
|
|
114
|
+
parse: {
|
|
115
|
+
audio_flags: Array.isArray(parse.audio_flags) ? parse.audio_flags.map((item) => String(item || '')).filter(Boolean) : [],
|
|
116
|
+
text_flags: Array.isArray(parse.text_flags) ? parse.text_flags.map((item) => String(item || '')).filter(Boolean) : [],
|
|
117
|
+
image_detail_aliases: normalizeMapKeys(parse.image_detail_aliases || {}),
|
|
118
|
+
},
|
|
119
|
+
geracao_imagem: {
|
|
120
|
+
size_options: Array.isArray(generation.size_options) ? generation.size_options.map((item) => normalizeText(item)).filter(Boolean) : [],
|
|
121
|
+
size_aliases: normalizeMapKeys(generation.size_aliases || {}),
|
|
122
|
+
quality_options: Array.isArray(generation.quality_options) ? generation.quality_options.map((item) => normalizeText(item)).filter(Boolean) : [],
|
|
123
|
+
quality_aliases: normalizeMapKeys(generation.quality_aliases || {}),
|
|
124
|
+
format_options: Array.isArray(generation.format_options) ? generation.format_options.map((item) => normalizeText(item)).filter(Boolean) : [],
|
|
125
|
+
format_aliases: normalizeMapKeys(generation.format_aliases || {}),
|
|
126
|
+
background_options: Array.isArray(generation.background_options) ? generation.background_options.map((item) => normalizeText(item)).filter(Boolean) : [],
|
|
127
|
+
background_aliases: normalizeMapKeys(generation.background_aliases || {}),
|
|
128
|
+
flag_aliases: generation.flag_aliases && typeof generation.flag_aliases === 'object' ? Object.fromEntries(Object.entries(generation.flag_aliases).map(([key, value]) => [normalizeText(key), Array.isArray(value) ? value.map((item) => normalizeText(item)).filter(Boolean) : []])) : {},
|
|
129
|
+
compression: {
|
|
130
|
+
min: Number(generation?.compression?.min ?? 0),
|
|
131
|
+
max: Number(generation?.compression?.max ?? 100),
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
};
|