@omnizap-system/omnizap 2.6.1 → 2.6.3

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 (172) hide show
  1. package/.env.example +78 -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 +6 -0
  6. package/app/configParts/adminIdentity.js +36 -7
  7. package/app/configParts/baileysConfig.js +343 -56
  8. package/app/configParts/groupUtils.js +226 -0
  9. package/app/configParts/loggerConfig.js +185 -0
  10. package/app/configParts/messagePersistenceService.js +307 -5
  11. package/app/configParts/sessionConfig.js +242 -0
  12. package/app/connection/baileysCompatibility.test.js +10 -1
  13. package/app/connection/baileysDbAuthState.js +205 -9
  14. package/app/connection/baileysLibsignalPatch.js +210 -0
  15. package/app/connection/groupOwnerWriteStateResolver.js +141 -0
  16. package/app/connection/socketController.js +694 -123
  17. package/app/connection/socketController.multiSession.test.js +128 -0
  18. package/app/controllers/messageController.js +1 -1
  19. package/app/controllers/messagePipeline/commandMiddleware.js +12 -10
  20. package/app/controllers/messagePipeline/conversationMiddleware.js +2 -1
  21. package/app/controllers/messagePipeline/messagePipelineMiddlewares.test.js +104 -0
  22. package/app/controllers/messagePipeline/preProcessingMiddlewares.js +96 -4
  23. package/app/controllers/messageProcessingPipeline.js +90 -9
  24. package/app/controllers/messageProcessingPipeline.test.js +202 -0
  25. package/app/modules/adminModule/AGENT.md +1 -1
  26. package/app/modules/adminModule/commandConfig.json +3318 -1347
  27. package/app/modules/adminModule/groupCommandHandlers.js +856 -14
  28. package/app/modules/adminModule/groupCommandHandlers.test.js +375 -9
  29. package/app/modules/adminModule/groupWarningRepository.js +152 -0
  30. package/app/modules/aiModule/AGENT.md +47 -30
  31. package/app/modules/aiModule/aiConfigRuntime.js +1 -0
  32. package/app/modules/aiModule/catCommand.js +132 -25
  33. package/app/modules/aiModule/commandConfig.json +114 -28
  34. package/app/modules/analyticsModule/messageAnalysisEventRepository.js +54 -6
  35. package/app/modules/gameModule/AGENT.md +1 -1
  36. package/app/modules/gameModule/commandConfig.json +29 -0
  37. package/app/modules/menuModule/AGENT.md +1 -1
  38. package/app/modules/menuModule/commandConfig.json +45 -10
  39. package/app/modules/menuModule/menuCatalogService.js +190 -0
  40. package/app/modules/menuModule/menuCommandUsageRepository.js +109 -0
  41. package/app/modules/menuModule/menuDynamicService.js +511 -0
  42. package/app/modules/menuModule/menuDynamicService.test.js +141 -0
  43. package/app/modules/menuModule/menus.js +36 -5
  44. package/app/modules/playModule/AGENT.md +10 -5
  45. package/app/modules/playModule/commandConfig.json +74 -16
  46. package/app/modules/playModule/playCommandConstants.js +13 -7
  47. package/app/modules/playModule/playCommandCore.js +4 -6
  48. package/app/modules/playModule/{playCommandYtDlpClient.js → playCommandMediaClient.js} +684 -332
  49. package/app/modules/playModule/playConfigRuntime.js +5 -6
  50. package/app/modules/playModule/playModuleCriticalFlows.test.js +44 -59
  51. package/app/modules/quoteModule/AGENT.md +1 -1
  52. package/app/modules/quoteModule/commandConfig.json +29 -0
  53. package/app/modules/rpgPokemonModule/AGENT.md +1 -1
  54. package/app/modules/rpgPokemonModule/commandConfig.json +29 -0
  55. package/app/modules/statsModule/AGENT.md +1 -1
  56. package/app/modules/statsModule/commandConfig.json +58 -0
  57. package/app/modules/stickerModule/AGENT.md +1 -1
  58. package/app/modules/stickerModule/commandConfig.json +145 -0
  59. package/app/modules/stickerPackModule/AGENT.md +1 -1
  60. package/app/modules/stickerPackModule/autoPackCollectorService.js +5 -1
  61. package/app/modules/stickerPackModule/commandConfig.json +29 -0
  62. package/app/modules/stickerPackModule/stickerAutoPackByTagsRuntime.js +1 -1
  63. package/app/modules/stickerPackModule/stickerPackCommandHandlers.js +78 -57
  64. package/app/modules/stickerPackModule/stickerPackService.js +13 -6
  65. package/app/modules/systemMetricsModule/AGENT.md +1 -1
  66. package/app/modules/systemMetricsModule/commandConfig.json +29 -0
  67. package/app/modules/tiktokModule/AGENT.md +1 -1
  68. package/app/modules/tiktokModule/commandConfig.json +29 -0
  69. package/app/modules/userModule/AGENT.md +1 -1
  70. package/app/modules/userModule/commandConfig.json +29 -0
  71. package/app/modules/waifuPicsModule/AGENT.md +57 -27
  72. package/app/modules/waifuPicsModule/commandConfig.json +87 -0
  73. package/app/observability/metrics.js +136 -0
  74. package/app/services/ai/commandConfigEnrichmentService.js +229 -47
  75. package/app/services/ai/geminiService.js +131 -7
  76. package/app/services/ai/geminiService.test.js +59 -2
  77. package/app/services/ai/moduleAiHelpCoreService.js +33 -4
  78. package/app/services/group/groupMetadataService.js +24 -1
  79. package/app/services/infra/dbWriteQueue.js +51 -21
  80. package/app/services/messaging/newsBroadcastService.js +843 -27
  81. package/app/services/multiSession/assignmentBalancerService.js +452 -0
  82. package/app/services/multiSession/groupOwnershipRepository.js +346 -0
  83. package/app/services/multiSession/groupOwnershipService.js +809 -0
  84. package/app/services/multiSession/groupOwnershipService.test.js +317 -0
  85. package/app/services/multiSession/sessionRegistryService.js +239 -0
  86. package/app/store/aiPromptStore.js +36 -19
  87. package/app/store/groupConfigStore.js +41 -5
  88. package/app/store/premiumUserStore.js +21 -7
  89. package/app/utils/antiLink/antiLinkModule.js +391 -25
  90. package/app/workers/aiHelperContinuousLearningWorker.js +512 -0
  91. package/database/index.js +6 -0
  92. package/database/migrations/20260307_d0_hardening_down.sql +1 -1
  93. package/database/migrations/20260314_d7_canonical_sender_down.sql +1 -1
  94. package/database/migrations/20260406_d30_security_analytics_down.sql +1 -1
  95. package/database/migrations/20260411_d35_group_community_metadata_down.sql +59 -0
  96. package/database/migrations/20260411_d35_group_community_metadata_up.sql +62 -0
  97. package/database/migrations/20260412_d36_system_config_tables_down.sql +32 -0
  98. package/database/migrations/20260412_d36_system_config_tables_up.sql +66 -0
  99. package/database/migrations/20260413_d37_group_user_warnings_down.sql +11 -0
  100. package/database/migrations/20260413_d37_group_user_warnings_up.sql +24 -0
  101. package/database/migrations/20260414_d38_multi_session_foundation_down.sql +72 -0
  102. package/database/migrations/20260414_d38_multi_session_foundation_up.sql +125 -0
  103. package/database/migrations/20260414_d39_multi_session_cutover_down.sql +103 -0
  104. package/database/migrations/20260414_d39_multi_session_cutover_up.sql +83 -0
  105. package/database/schema.sql +102 -1
  106. package/docker-compose.yml +4 -1
  107. package/docs/compliance/acceptable-use-policy-2026-03-07.md +1 -1
  108. package/docs/compliance/privacy-policy-2026-03-07.md +2 -2
  109. package/docs/security/dsar-lgpd-runbook-2026-03-07.md +1 -1
  110. package/docs/security/network-hardening-runbook-2026-03-07.md +53 -0
  111. package/docs/security/omnizap-static-security-headers.conf +25 -0
  112. package/ecosystem.prod.config.cjs +31 -11
  113. package/index.js +52 -18
  114. package/observability/alert-rules.yml +20 -0
  115. package/observability/grafana/dashboards/omnizap-system-admin.json +229 -0
  116. package/observability/mysql-setup.sql +4 -4
  117. package/observability/system-admin-observability.md +26 -0
  118. package/package.json +14 -6
  119. package/public/comandos/commands-catalog.json +2253 -78
  120. package/public/css/payments-react.css +478 -0
  121. package/public/js/apps/commandsReactApp.js +267 -87
  122. package/public/js/apps/createPackApp.js +3 -3
  123. package/public/js/apps/homeReactApp.js +2 -2
  124. package/public/js/apps/paymentsCancelReactApp.js +45 -0
  125. package/public/js/apps/paymentsReactApp.js +399 -0
  126. package/public/js/apps/paymentsSuccessReactApp.js +148 -0
  127. package/public/js/apps/stickersApp.js +255 -103
  128. package/public/js/apps/termsReactApp.js +57 -8
  129. package/public/js/apps/userPasswordResetReactApp.js +406 -0
  130. package/public/js/apps/userReactApp.js +96 -47
  131. package/public/js/apps/userSystemAdmReactApp.js +1506 -0
  132. package/public/pages/pagamentos-cancelado.html +21 -0
  133. package/public/pages/pagamentos-sucesso.html +21 -0
  134. package/public/pages/pagamentos.html +30 -0
  135. package/public/pages/politica-de-privacidade.html +1 -1
  136. package/public/pages/stickers.html +5 -5
  137. package/public/pages/termos-de-uso-texto-integral.html +1 -1
  138. package/public/pages/termos-de-uso.html +1 -1
  139. package/public/pages/user-password-reset.html +3 -4
  140. package/public/pages/user-systemadm.html +8 -462
  141. package/public/pages/user.html +1 -1
  142. package/scripts/clear-whatsapp-session.sh +123 -0
  143. package/scripts/core-ai-mode.mjs +163 -0
  144. package/scripts/deploy.sh +13 -0
  145. package/scripts/enrich-command-config-ux-openai.mjs +492 -0
  146. package/scripts/generate-commands-catalog.mjs +155 -0
  147. package/scripts/new-whatsapp-session.sh +564 -0
  148. package/scripts/security-web-surface-check.mjs +218 -0
  149. package/server/controllers/admin/adminPanelHandlers.js +253 -3
  150. package/server/controllers/admin/systemAdminController.js +254 -0
  151. package/server/controllers/payments/paymentsController.js +731 -0
  152. package/server/controllers/sticker/stickerCatalogController.js +9 -23
  153. package/server/controllers/system/contactController.js +9 -17
  154. package/server/controllers/system/stickerCatalogSystemContext.js +27 -6
  155. package/server/controllers/system/systemController.js +228 -1
  156. package/server/controllers/userController.js +6 -0
  157. package/server/email/emailAutomationRuntime.js +36 -1
  158. package/server/email/emailAutomationService.js +42 -1
  159. package/server/email/emailTemplateService.js +140 -33
  160. package/server/http/httpRequestUtils.js +18 -14
  161. package/server/http/httpServer.js +8 -4
  162. package/server/middleware/securityHeaders.js +35 -3
  163. package/server/routes/admin/systemAdminRouter.js +6 -0
  164. package/server/routes/indexRouter.js +50 -6
  165. package/server/routes/observability/grafanaProxyRouter.js +254 -0
  166. package/server/routes/payments/paymentsRouter.js +47 -0
  167. package/server/routes/static/staticPageRouter.js +30 -1
  168. package/server/utils/publicContact.js +31 -0
  169. package/utils/whatsapp/contactEnv.js +39 -0
  170. package/vite.config.mjs +5 -1
  171. package/app/modules/playModule/local/installYtDlp.js +0 -25
  172. package/app/modules/playModule/local/ytDlpInstaller.js +0 -28
package/.env.example CHANGED
@@ -10,8 +10,6 @@
10
10
  # ==============================
11
11
  # PRIORIDADE 1 - CRITICO (startup)
12
12
  # ==============================
13
- BOT_NUMBER=
14
- BOT_PHONE_NUMBER=
15
13
  COMMAND_PREFIX="#"
16
14
  COMMAND_REACT_EMOJI=🤖
17
15
  DB_HOST=localhost
@@ -35,8 +33,6 @@ NODE_ENV=development
35
33
  OPENAI_API_KEY=
36
34
  GEMINI_API_KEY=
37
35
  GEMINI_API_BASE_URL=https://generativelanguage.googleapis.com/v1beta
38
- OWNER_NUMBER=5511999999999
39
- PHONE_NUMBER=
40
36
  PM2_APP_NAME=omnizap
41
37
  SITE_ORIGIN=https://omnizap.shop
42
38
  STICKER_API_BASE_PATH=/api/sticker-packs
@@ -46,13 +42,22 @@ SYSTEM_ADMIN_API_BASE_PATH=/api/admin
46
42
  STICKER_STORAGE_DIR=./data/stickers
47
43
  STICKER_WEB_ORIGIN=https://omnizap.shop
48
44
  STICKER_WEB_PATH=/stickers
49
- USER_ADMIN=seu_jid_de_admin@s.whatsapp.net
50
45
  WHATSAPP_BOT_NUMBER=5511999999999
46
+ WHATSAPP_SUPPORT_NUMBER=5511999999999
47
+ WHATSAPP_ADMIN_NUMBER=5511999999999
48
+ WHATSAPP_ADMIN_JID=seu_jid_de_admin@s.whatsapp.net
51
49
  WHATSAPP_LOGIN_BASE_URL=https://omnizap.shop
52
50
  WHATSAPP_LOGIN_LINK_SECRET=troque_por_um_segredo_forte
53
51
  WHATSAPP_LOGIN_PATH=/login/
54
52
  WHATSAPP_LOGIN_TRIGGER=iniciar
55
- WHATSAPP_SUPPORT_NUMBER=5511999999999
53
+
54
+ # Legado (compatibilidade): mantenha vazio quando usar as variaveis canonicas acima
55
+ BOT_NUMBER=
56
+ BOT_PHONE_NUMBER=
57
+ OWNER_NUMBER=
58
+ PHONE_NUMBER=
59
+ USER_ADMIN=
60
+ WHATSAPP_PUBLIC_CONTACT_NUMBER=
56
61
 
57
62
  # ==============================
58
63
  # PRIORIDADE 2 - OPERACAO BASE
@@ -100,6 +105,7 @@ BAILEYS_GROUP_METADATA_CACHE_CHECKPERIOD_SECONDS=60
100
105
  BAILEYS_SEND_RETRY_ATTEMPTS=2
101
106
  BAILEYS_SEND_RETRY_BASE_DELAY_MS=600
102
107
  BAILEYS_SEND_MEDIA_UPLOAD_TIMEOUT_MS=0
108
+ BAILEYS_SEND_PREFER_PN_FOR_LID=true
103
109
  BAILEYS_VERSION=
104
110
  BAILEYS_FETCH_LATEST_VERSION=false
105
111
  BAILEYS_LOGGER_MODE=child
@@ -120,11 +126,20 @@ BAILEYS_REPLY_PRESENCE_BEFORE=composing
120
126
  BAILEYS_REPLY_PRESENCE_AFTER=paused
121
127
  BAILEYS_REPLY_PRESENCE_DELAY_MS=280
122
128
  BAILEYS_AUTH_SESSION_ID=default
129
+ BAILEYS_SESSION_IDS=default
130
+ BAILEYS_PRIMARY_SESSION_ID=default
131
+ BAILEYS_SESSION_WEIGHTS=default=1
132
+ BAILEYS_AUTH_KEYS_CACHE_ENABLED=true
123
133
  BAILEYS_AUTH_BOOTSTRAP_FROM_FILES=true
124
134
  BAILEYS_SINGLE_WRITER_LOCK_ENABLED=true
125
135
  BAILEYS_SINGLE_WRITER_LOCK_NAME=
126
136
  BAILEYS_SINGLE_WRITER_LOCK_TIMEOUT_SECONDS=2
127
137
  BAILEYS_SINGLE_WRITER_LOCK_RETRY_DELAY_MS=15000
138
+ BAILEYS_LIBSIGNAL_RUNTIME_PATCH_ENABLED=true
139
+ GROUP_OWNER_ENFORCEMENT_MODE=off
140
+ GROUP_OWNER_LEASE_MS=120000
141
+ GROUP_OWNER_HEARTBEAT_MS=30000
142
+ GROUP_BALANCER_ENABLED=false
128
143
  BAILEYS_EVENT_BATCH_SIZE=100
129
144
  BAILEYS_EVENT_QUEUE_MAX=4000
130
145
  BAILEYS_EVENT_JOURNAL_RETENTION_DAYS=14
@@ -160,6 +175,7 @@ HOME_MARKETPLACE_STATS_CACHE_SECONDS=45
160
175
  HOSTNAME=
161
176
  IMAGE_MENU=https://example.com/assets/omnizap-banner.png
162
177
  HELMET_CONTENT_SECURITY_POLICY_ENABLED=true
178
+ HELMET_CSP_FRAME_SRC_EXTRA=
163
179
  LID_BACKFILL_BATCH=50000
164
180
  LID_BACKFILL_ON_START=true
165
181
  COMMAND_CONFIG_VALIDATE_ON_BOOT=true
@@ -171,6 +187,7 @@ MESSAGE_REPLY_PRESENCE_BEFORE=composing
171
187
  MESSAGE_REPLY_PRESENCE_AFTER=paused
172
188
  MESSAGE_REPLY_PRESENCE_DELAY_MS=280
173
189
  MESSAGE_REPLY_PRESENCE_SUBSCRIBE=true
190
+ CONVERSATIONAL_AUTO_REPLY_ENABLED=false
174
191
  METRICS_ENABLED=true
175
192
  METRICS_ENDPOINT=
176
193
  METRICS_HOST=127.0.0.1
@@ -308,6 +325,7 @@ WEB_USER_PASSWORD_RECOVERY_HASH_SECRET=
308
325
  WEB_URL=https://omnizap.shop
309
326
  WEB_VISITOR_COOKIE_TTL_SECONDS=31536000
310
327
  WHATSAPP_COMMAND_REQUIRES_GOOGLE_LOGIN=true
328
+ WHATSAPP_ALLOW_SELF_COMMANDS_ON_APPEND=true
311
329
  WHATSAPP_GOOGLE_LINK_CHECK_CACHE_TTL_MS=60000
312
330
  WHATSAPP_LOGIN_LINK_TTL_SECONDS=900
313
331
  WHATSAPP_LOGIN_REQUIRE_SIGNATURE=true
@@ -320,6 +338,26 @@ FFMPEG_PATH=ffmpeg
320
338
  FFPROBE_PATH=ffprobe
321
339
  HTTP_SLO_TARGET_MS=750
322
340
  NEWS_API_URL=http://127.0.0.1:3001
341
+ NEWS_API_ARTICLES_PATH=/articles
342
+ NEWS_API_ARTICLE_BY_ID_PATH=/articles/:id
343
+ NEWS_API_ARTICLE_BY_SLUG_PATH=/articles/slug/:slug
344
+ NEWS_API_TRENDS_PATH=/trends
345
+ NEWS_API_FRANCHISES_PATH=/franchises
346
+ NEWS_API_FRANCHISE_BY_SLUG_PATH=/franchises/:slug
347
+ NEWS_API_SOURCES_PATH=/sources
348
+ NEWS_API_SOURCE_BY_ID_PATH=/sources/:sourceId
349
+ NEWS_API_SEO_ENTITIES_PATH=/seo/entities
350
+ NEWS_API_SEO_BY_TYPE_SLUG_PATH=/seo/:type/:slug
351
+ NEWS_API_LIMIT=120
352
+ NEWS_API_TIMEOUT_MS=15000
353
+ NEWS_API_DETAILS_TIMEOUT_MS=15000
354
+ NEWS_API_CONTEXT_TTL_MS=180000
355
+ NEWS_API_DETAILS_CACHE_TTL_MS=360000
356
+ NEWS_API_CONTEXT_TOP=40
357
+ NEWS_API_LEGACY_FALLBACK=true
358
+ NEWS_SMART_SELECTION_ENABLED=true
359
+ NEWS_SMART_SELECTION_WINDOW=80
360
+ NEWS_CAPTION_CONTEXT_ENABLED=true
323
361
  NEWS_SENT_IDS_LIMIT=500
324
362
  OMNIZAP_SOCIAL_METRICS=0
325
363
  OPENAI_IMAGE_MODEL=gpt-5-nano
@@ -774,23 +812,34 @@ GITHUB_REPOSITORY=Omnizap-System/omnizap
774
812
  GITHUB_TOKEN=
775
813
  GRAFANA_ADMIN_PASSWORD=admin
776
814
  GRAFANA_ADMIN_USER=admin
815
+ GRAFANA_ALLOW_EMBEDDING=true
777
816
  GRAFANA_DASHBOARDS_PATH=./observability/grafana/dashboards
778
817
  GRAFANA_IMAGE_TAG=10.4.3
779
818
  GRAFANA_BIND_HOST=127.0.0.1
780
819
  GRAFANA_PORT=3003
820
+ GRAFANA_PUBLIC_URL=https://omnizap.shop/api/grafana
781
821
  GRAFANA_PROVISIONING_PATH=./observability/grafana/provisioning
782
- GRAFANA_ROOT_URL=%(protocol)s://%(domain)s:%(http_port)s/
822
+ GRAFANA_ROOT_URL=https://omnizap.shop/api/grafana
823
+ GRAFANA_SERVE_FROM_SUB_PATH=true
824
+ GRAFANA_PROXY_BASE_PATH=/api/grafana
825
+ GRAFANA_PROXY_LEGACY_BASE_PATH=/grafana
826
+ GRAFANA_PROXY_TARGET_URL=http://127.0.0.1:3003
827
+ SYSTEM_ADMIN_GRAFANA_URL=https://omnizap.shop/api/grafana
828
+ SYSTEM_ADMIN_GRAFANA_DASHBOARDS=omnizap-system-admin|System Admin,omnizap-overview|Overview,omnizap-mysql|MySQL
829
+ SYSTEM_ADMIN_GRAFANA_TIME_FROM=now-6h
830
+ SYSTEM_ADMIN_GRAFANA_TIME_TO=now
831
+ SYSTEM_ADMIN_GRAFANA_REFRESH=10s
783
832
  GRAFANA_TIMEZONE=America/Boa_Vista
784
833
  LOKI_CONFIG_PATH=./observability/loki-config.yml
785
834
  LOKI_IMAGE_TAG=2.9.4
786
835
  LOKI_BIND_HOST=127.0.0.1
787
836
  LOKI_PORT=3100
788
837
  MYSQL_EXPORTER_CNF_PATH=./observability/mysql-exporter.cnf
789
- MYSQL_EXPORTER_DSN=exporter:exporter@(host.docker.internal:3306)/
838
+ MYSQL_EXPORTER_DSN=exporter:exporter@unix(/run/mysqld/mysqld.sock)/
790
839
  MYSQL_EXPORTER_IMAGE_TAG=v0.15.1
791
840
  MYSQL_EXPORTER_BIND_HOST=127.0.0.1
792
841
  MYSQL_EXPORTER_PORT=9104
793
- MYSQL_LOGS_PATH=/var/lib/mysql
842
+ MYSQL_LOGS_PATH=/var/log/mysql
794
843
  NODE_AUTH_TOKEN=
795
844
  NODE_EXPORTER_IMAGE_TAG=v1.7.0
796
845
  NODE_EXPORTER_BIND_HOST=127.0.0.1
@@ -860,6 +909,26 @@ WIKI_SYNC_SOURCE_DIR=./docs/wiki
860
909
  WIKI_SYNC_TMP_DIR=/tmp/omnizap-wiki-sync
861
910
  STACK_NAME=omnizap
862
911
 
912
+ # ==============================
913
+ # PAYMENTS (STRIPE CHECKOUT + WEBHOOK)
914
+ # ==============================
915
+ STRIPE_PAYMENTS_ENABLED=true
916
+ PAYMENTS_API_BASE_PATH=/api/payments
917
+ PAYMENTS_WEB_PATH=/pagamentos
918
+ STRIPE_SECRET_KEY=
919
+ STRIPE_WEBHOOK_SECRET=
920
+ STRIPE_PRICE_ID=
921
+ STRIPE_CHECKOUT_MODE=subscription
922
+ STRIPE_PLAN_NAME=Plano Premium
923
+ STRIPE_PLAN_PRICE_LABEL=Assinatura recorrente
924
+ STRIPE_CHECKOUT_SUCCESS_URL=https://omnizap.shop/pagamentos/sucesso?session_id={CHECKOUT_SESSION_ID}
925
+ STRIPE_CHECKOUT_CANCEL_URL=https://omnizap.shop/pagamentos/cancelado
926
+ STRIPE_API_BASE_URL=https://api.stripe.com/v1
927
+ STRIPE_API_TIMEOUT_MS=10000
928
+ STRIPE_ALLOW_PROMOTION_CODES=true
929
+ STRIPE_WEBHOOK_TOLERANCE_SECONDS=300
930
+ STRIPE_AUTO_REVOKE_ON_CANCELLATION=false
931
+
863
932
  # ==============================
864
933
  # EMAIL AUTOMATION (SMTP/OUTBOX)
865
934
  # ==============================
@@ -57,6 +57,9 @@ jobs:
57
57
  - name: Install dependencies
58
58
  run: npm ci
59
59
 
60
+ - name: DB bootstrap smoke test
61
+ run: npm run db:init
62
+
60
63
  - name: Check formatting
61
64
  run: npm run format:check
62
65
 
@@ -68,6 +71,3 @@ jobs:
68
71
 
69
72
  - name: Build
70
73
  run: npm run build
71
-
72
- - name: DB bootstrap smoke test
73
- run: npm run db:init
@@ -18,7 +18,7 @@ jobs:
18
18
  timeout-minutes: 10
19
19
  steps:
20
20
  - name: Harden runner
21
- uses: step-security/harden-runner@58077d3c7e43986b6b15fba718e8ea69e387dfcc
21
+ uses: step-security/harden-runner@fa2e9d605c4eeb9fcad4c99c224cee0c6c7f3594
22
22
  with:
23
23
  egress-policy: audit
24
24
 
@@ -39,5 +39,6 @@ jobs:
39
39
  with:
40
40
  target: ${{ env.TARGET_URL }}
41
41
  fail_action: false
42
+ artifact_name: zap-scan-full
42
43
  env:
43
44
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -1,4 +1,10 @@
1
+ /**
2
+ * Barrel de configuração da aplicação.
3
+ * Reexporta utilitários de Baileys, grupos, identidade admin, logger e sessão.
4
+ */
1
5
  export * from '../configParts/baileysConfig.js';
2
6
  export * from '../configParts/groupUtils.js';
3
7
  export * from '../configParts/adminIdentity.js';
4
8
  export * from '../configParts/loggerConfig.js';
9
+ export * from '../configParts/sessionConfig.js';
10
+ export * from '../../utils/whatsapp/contactEnv.js';
@@ -1,12 +1,18 @@
1
1
  import { encodeJid, getJidUser, isSameJidUser, normalizeJid } from './baileysConfig.js';
2
2
  import { extractUserIdInfo, resolveUserId, resolveUserIdCached } from './baileysConfig.js';
3
-
4
- const ADMIN_ENV_KEY = 'USER_ADMIN';
5
-
6
- const normalizePhoneDigits = (value) => String(value || '').replace(/\D+/g, '');
7
-
8
- export const getAdminRawValue = () => String(process.env[ADMIN_ENV_KEY] || '').trim();
9
-
3
+ import { normalizePhoneDigits, resolveAdminIdentityRawFromEnv, resolveAdminPhoneFromEnv } from '../../utils/whatsapp/contactEnv.js';
4
+
5
+ /**
6
+ * Retorna o valor bruto configurado para identidade de admin.
7
+ * @returns {string}
8
+ */
9
+ export const getAdminRawValue = () => resolveAdminIdentityRawFromEnv();
10
+
11
+ /**
12
+ * Resolve o JID do administrador com base no valor de ambiente.
13
+ * Aceita JID completo ou telefone numérico.
14
+ * @returns {string|null}
15
+ */
10
16
  export const getAdminJid = () => {
11
17
  const raw = getAdminRawValue();
12
18
  if (!raw) return null;
@@ -27,7 +33,15 @@ export const getAdminJid = () => {
27
33
  return normalizedResolved || candidate;
28
34
  };
29
35
 
36
+ /**
37
+ * Resolve o telefone do administrador.
38
+ * Prioriza `ADMIN_PHONE` explícito e faz fallback para JID/identidade.
39
+ * @returns {string|null}
40
+ */
30
41
  export const getAdminPhone = () => {
42
+ const explicitAdminPhone = resolveAdminPhoneFromEnv({ fallback: '' });
43
+ if (explicitAdminPhone) return explicitAdminPhone;
44
+
31
45
  const adminJid = getAdminJid();
32
46
  if (!adminJid) return null;
33
47
 
@@ -38,6 +52,10 @@ export const getAdminPhone = () => {
38
52
  return digits || null;
39
53
  };
40
54
 
55
+ /**
56
+ * Resolve o JID do admin consultando reconciliação LID/JID quando disponível.
57
+ * @returns {Promise<string|null>}
58
+ */
41
59
  export const resolveAdminJid = async () => {
42
60
  const cached = getAdminJid();
43
61
  if (!cached) return null;
@@ -50,6 +68,11 @@ export const resolveAdminJid = async () => {
50
68
  }
51
69
  };
52
70
 
71
+ /**
72
+ * Verifica se um JID de remetente corresponde ao administrador.
73
+ * @param {string|null|undefined} senderJid
74
+ * @returns {boolean}
75
+ */
53
76
  export const isAdminSender = (senderJid) => {
54
77
  const adminJid = getAdminJid();
55
78
  if (!adminJid || !senderJid) return false;
@@ -60,6 +83,12 @@ export const isAdminSender = (senderJid) => {
60
83
  return isSameJidUser(normalizedSender, adminJid) || normalizedSender === adminJid;
61
84
  };
62
85
 
86
+ /**
87
+ * Verifica se a identidade do remetente corresponde ao administrador.
88
+ * Considera candidatos `jid`, `lid`, `participantAlt` e resolução assíncrona.
89
+ * @param {unknown} senderIdentity
90
+ * @returns {Promise<boolean>}
91
+ */
63
92
  export const isAdminSenderAsync = async (senderIdentity) => {
64
93
  const senderInfo = extractUserIdInfo(senderIdentity);
65
94
  if (!senderInfo.raw && !senderInfo.jid && !senderInfo.lid && !senderInfo.participantAlt) return false;