@omnizap-system/omnizap 2.5.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (425) hide show
  1. package/.clusterfuzzlite/Dockerfile +10 -0
  2. package/.env.example +907 -0
  3. package/.github/codeql/codeql-config.yml +10 -0
  4. package/.github/dependabot.yml +35 -0
  5. package/.github/workflows/ci.yml +73 -0
  6. package/.github/workflows/codeql.yml +106 -0
  7. package/.github/workflows/db-migration-check.yml +98 -0
  8. package/.github/workflows/dependency-review.yml +22 -0
  9. package/.github/workflows/deploy.yml +95 -0
  10. package/.github/workflows/release.yml +106 -0
  11. package/.github/workflows/security-attest-provenance.yml +51 -0
  12. package/.github/workflows/security-gitleaks.yml +34 -0
  13. package/.github/workflows/security-runner-hardening.yml +31 -0
  14. package/.github/workflows/security-scorecard.yml +44 -0
  15. package/.github/workflows/security-zap-baseline.yml +44 -0
  16. package/.github/workflows/security-zap-full-scan.yml +43 -0
  17. package/.github/workflows/security-zizmor.yml +36 -0
  18. package/.github/workflows/wiki-sync.yml +44 -0
  19. package/.gitleaks.toml +15 -0
  20. package/.prettierrc +34 -0
  21. package/CODE_OF_CONDUCT.md +114 -0
  22. package/LICENSE +56 -0
  23. package/README.md +110 -0
  24. package/SECURITY.md +110 -0
  25. package/app/config/index.js +4 -0
  26. package/app/configParts/adminIdentity.js +92 -0
  27. package/app/configParts/baileysConfig.js +1818 -0
  28. package/app/configParts/groupUtils.js +692 -0
  29. package/app/configParts/loggerConfig.js +394 -0
  30. package/app/configParts/messagePersistenceService.js +305 -0
  31. package/app/connection/baileysCompatibility.test.js +40 -0
  32. package/app/connection/baileysDbAuthState.js +344 -0
  33. package/app/connection/socketController.js +2243 -0
  34. package/app/controllers/messageController.js +7 -0
  35. package/app/controllers/messagePipeline/commandMiddleware.js +146 -0
  36. package/app/controllers/messagePipeline/conversationMiddleware.js +183 -0
  37. package/app/controllers/messagePipeline/messagePipelineMiddlewares.test.js +522 -0
  38. package/app/controllers/messagePipeline/postProcessingMiddleware.js +41 -0
  39. package/app/controllers/messagePipeline/preProcessingMiddlewares.js +166 -0
  40. package/app/controllers/messageProcessingPipeline.js +699 -0
  41. package/app/modules/adminModule/AGENT.md +4056 -0
  42. package/app/modules/adminModule/adminAiHelpService.js +56 -0
  43. package/app/modules/adminModule/adminConfigRuntime.js +177 -0
  44. package/app/modules/adminModule/commandConfig.json +7122 -0
  45. package/app/modules/adminModule/groupCommandHandlers.js +1823 -0
  46. package/app/modules/adminModule/groupCommandHandlers.test.js +350 -0
  47. package/app/modules/adminModule/groupEventHandlers.js +399 -0
  48. package/app/modules/aiModule/AGENT.md +547 -0
  49. package/app/modules/aiModule/aiAiHelpService.js +14 -0
  50. package/app/modules/aiModule/aiConfigRuntime.js +135 -0
  51. package/app/modules/aiModule/catCommand.js +967 -0
  52. package/app/modules/aiModule/commandConfig.json +981 -0
  53. package/app/modules/analyticsModule/messageAnalysisEventRepository.js +83 -0
  54. package/app/modules/gameModule/AGENT.md +196 -0
  55. package/app/modules/gameModule/commandConfig.json +366 -0
  56. package/app/modules/gameModule/diceCommand.js +42 -0
  57. package/app/modules/gameModule/gameAiHelpService.js +14 -0
  58. package/app/modules/gameModule/gameConfigRuntime.js +68 -0
  59. package/app/modules/menuModule/AGENT.md +205 -0
  60. package/app/modules/menuModule/commandConfig.json +366 -0
  61. package/app/modules/menuModule/common.js +316 -0
  62. package/app/modules/menuModule/menuAiHelpService.js +14 -0
  63. package/app/modules/menuModule/menuConfigRuntime.js +68 -0
  64. package/app/modules/menuModule/menus.js +66 -0
  65. package/app/modules/playModule/AGENT.md +321 -0
  66. package/app/modules/playModule/commandConfig.json +584 -0
  67. package/app/modules/playModule/playAiHelpService.js +14 -0
  68. package/app/modules/playModule/playCommand.js +1417 -0
  69. package/app/modules/playModule/playConfigRuntime.js +68 -0
  70. package/app/modules/quoteModule/AGENT.md +199 -0
  71. package/app/modules/quoteModule/commandConfig.json +366 -0
  72. package/app/modules/quoteModule/quoteAiHelpService.js +14 -0
  73. package/app/modules/quoteModule/quoteCommand.js +842 -0
  74. package/app/modules/quoteModule/quoteConfigRuntime.js +68 -0
  75. package/app/modules/rpgPokemonModule/AGENT.md +229 -0
  76. package/app/modules/rpgPokemonModule/commandConfig.json +386 -0
  77. package/app/modules/rpgPokemonModule/rpgBattleCanvasRenderer.js +795 -0
  78. package/app/modules/rpgPokemonModule/rpgBattleService.js +2110 -0
  79. package/app/modules/rpgPokemonModule/rpgBattleService.test.js +770 -0
  80. package/app/modules/rpgPokemonModule/rpgEvolutionUtils.js +22 -0
  81. package/app/modules/rpgPokemonModule/rpgPokemonAiHelpService.js +14 -0
  82. package/app/modules/rpgPokemonModule/rpgPokemonCommand.js +174 -0
  83. package/app/modules/rpgPokemonModule/rpgPokemonConfigRuntime.js +68 -0
  84. package/app/modules/rpgPokemonModule/rpgPokemonDomain.js +192 -0
  85. package/app/modules/rpgPokemonModule/rpgPokemonDomain.test.js +93 -0
  86. package/app/modules/rpgPokemonModule/rpgPokemonEvolution.test.js +46 -0
  87. package/app/modules/rpgPokemonModule/rpgPokemonMessages.js +746 -0
  88. package/app/modules/rpgPokemonModule/rpgPokemonRepository.js +1847 -0
  89. package/app/modules/rpgPokemonModule/rpgPokemonService.js +6839 -0
  90. package/app/modules/rpgPokemonModule/rpgProfileCanvasRenderer.js +354 -0
  91. package/app/modules/statsModule/AGENT.md +320 -0
  92. package/app/modules/statsModule/commandConfig.json +540 -0
  93. package/app/modules/statsModule/globalRankingCommand.js +64 -0
  94. package/app/modules/statsModule/rankingCommand.js +41 -0
  95. package/app/modules/statsModule/rankingCommon.js +1305 -0
  96. package/app/modules/statsModule/statsAiHelpService.js +14 -0
  97. package/app/modules/statsModule/statsConfigRuntime.js +68 -0
  98. package/app/modules/stickerModule/AGENT.md +692 -0
  99. package/app/modules/stickerModule/addStickerMetadata.js +239 -0
  100. package/app/modules/stickerModule/commandConfig.json +1216 -0
  101. package/app/modules/stickerModule/convertToWebp.js +367 -0
  102. package/app/modules/stickerModule/stickerAiHelpService.js +14 -0
  103. package/app/modules/stickerModule/stickerCommand.js +446 -0
  104. package/app/modules/stickerModule/stickerConfigRuntime.js +68 -0
  105. package/app/modules/stickerModule/stickerConvertCommand.js +159 -0
  106. package/app/modules/stickerModule/stickerTextCommand.js +653 -0
  107. package/app/modules/stickerPackModule/AGENT.md +215 -0
  108. package/app/modules/stickerPackModule/autoPackCollectorRuntime.js +20 -0
  109. package/app/modules/stickerPackModule/autoPackCollectorService.js +357 -0
  110. package/app/modules/stickerPackModule/commandConfig.json +387 -0
  111. package/app/modules/stickerPackModule/domainEventOutboxRepository.js +227 -0
  112. package/app/modules/stickerPackModule/domainEvents.js +52 -0
  113. package/app/modules/stickerPackModule/semanticReclassificationEngine.js +429 -0
  114. package/app/modules/stickerPackModule/semanticReclassificationEngine.test.js +75 -0
  115. package/app/modules/stickerPackModule/semanticThemeClusterService.js +544 -0
  116. package/app/modules/stickerPackModule/stickerAssetClassificationRepository.js +400 -0
  117. package/app/modules/stickerPackModule/stickerAssetRepository.js +400 -0
  118. package/app/modules/stickerPackModule/stickerAssetReprocessQueueRepository.js +175 -0
  119. package/app/modules/stickerPackModule/stickerAutoPackByTagsRuntime.js +3702 -0
  120. package/app/modules/stickerPackModule/stickerClassificationBackgroundRuntime.js +559 -0
  121. package/app/modules/stickerPackModule/stickerClassificationService.js +557 -0
  122. package/app/modules/stickerPackModule/stickerDedicatedTaskWorkerRuntime.js +249 -0
  123. package/app/modules/stickerPackModule/stickerDomainEventBus.js +65 -0
  124. package/app/modules/stickerPackModule/stickerDomainEventConsumerRuntime.js +208 -0
  125. package/app/modules/stickerPackModule/stickerMarketplaceDriftService.js +99 -0
  126. package/app/modules/stickerPackModule/stickerObjectStorageService.js +285 -0
  127. package/app/modules/stickerPackModule/stickerPackAiHelpService.js +14 -0
  128. package/app/modules/stickerPackModule/stickerPackCommandHandlers.js +1148 -0
  129. package/app/modules/stickerPackModule/stickerPackConfigRuntime.js +68 -0
  130. package/app/modules/stickerPackModule/stickerPackEngagementRepository.js +152 -0
  131. package/app/modules/stickerPackModule/stickerPackErrors.js +30 -0
  132. package/app/modules/stickerPackModule/stickerPackInteractionEventRepository.js +101 -0
  133. package/app/modules/stickerPackModule/stickerPackItemRepository.js +432 -0
  134. package/app/modules/stickerPackModule/stickerPackMarketplaceService.js +313 -0
  135. package/app/modules/stickerPackModule/stickerPackMessageService.js +268 -0
  136. package/app/modules/stickerPackModule/stickerPackRepository.js +450 -0
  137. package/app/modules/stickerPackModule/stickerPackScoreSnapshotRepository.js +179 -0
  138. package/app/modules/stickerPackModule/stickerPackScoreSnapshotRuntime.js +271 -0
  139. package/app/modules/stickerPackModule/stickerPackService.js +733 -0
  140. package/app/modules/stickerPackModule/stickerPackServiceRuntime.js +32 -0
  141. package/app/modules/stickerPackModule/stickerPackUtils.js +107 -0
  142. package/app/modules/stickerPackModule/stickerStorageService.js +559 -0
  143. package/app/modules/stickerPackModule/stickerWorkerPipelineRuntime.js +242 -0
  144. package/app/modules/stickerPackModule/stickerWorkerTaskQueueRepository.js +242 -0
  145. package/app/modules/systemMetricsModule/AGENT.md +193 -0
  146. package/app/modules/systemMetricsModule/commandConfig.json +344 -0
  147. package/app/modules/systemMetricsModule/pingCommand.js +399 -0
  148. package/app/modules/systemMetricsModule/systemMetricsAiHelpService.js +14 -0
  149. package/app/modules/systemMetricsModule/systemMetricsConfigRuntime.js +68 -0
  150. package/app/modules/tiktokModule/AGENT.md +196 -0
  151. package/app/modules/tiktokModule/commandConfig.json +366 -0
  152. package/app/modules/tiktokModule/tiktokAiHelpService.js +14 -0
  153. package/app/modules/tiktokModule/tiktokCommand.js +716 -0
  154. package/app/modules/tiktokModule/tiktokConfigRuntime.js +68 -0
  155. package/app/modules/userModule/AGENT.md +200 -0
  156. package/app/modules/userModule/commandConfig.json +386 -0
  157. package/app/modules/userModule/userAiHelpService.js +14 -0
  158. package/app/modules/userModule/userCommand.js +1155 -0
  159. package/app/modules/userModule/userConfigRuntime.js +68 -0
  160. package/app/modules/waifuPicsModule/AGENT.md +431 -0
  161. package/app/modules/waifuPicsModule/commandConfig.json +780 -0
  162. package/app/modules/waifuPicsModule/waifuPicsAiHelpService.js +14 -0
  163. package/app/modules/waifuPicsModule/waifuPicsCommand.js +586 -0
  164. package/app/modules/waifuPicsModule/waifuPicsConfigRuntime.js +68 -0
  165. package/app/observability/metrics.js +766 -0
  166. package/app/services/ai/aiHelpResponseCacheRepository.js +280 -0
  167. package/app/services/ai/aiLearningRepository.js +400 -0
  168. package/app/services/ai/commandConfigEnrichmentRepository.js +769 -0
  169. package/app/services/ai/commandConfigEnrichmentService.js +452 -0
  170. package/app/services/ai/commandConfigValidationService.js +443 -0
  171. package/app/services/ai/commandToolBuilderService.js +192 -0
  172. package/app/services/ai/conversationRouterService.js +516 -0
  173. package/app/services/ai/geminiService.js +115 -0
  174. package/app/services/ai/geminiService.test.js +87 -0
  175. package/app/services/ai/globalModuleAiHelpService.js +1412 -0
  176. package/app/services/ai/globalToolCallingService.js +203 -0
  177. package/app/services/ai/messageCommandExecutionService.js +391 -0
  178. package/app/services/ai/moduleAiHelpCoreService.js +1099 -0
  179. package/app/services/ai/moduleAiHelpWrapperFactory.js +65 -0
  180. package/app/services/ai/moduleCommandConfigRuntimeService.js +113 -0
  181. package/app/services/ai/moduleToolExecutorService.js +464 -0
  182. package/app/services/ai/moduleToolRegistryService.js +178 -0
  183. package/app/services/ai/toolCandidateSelectorService.js +781 -0
  184. package/app/services/auth/googleWebLinkService.js +80 -0
  185. package/app/services/auth/whatsappLoginLinkService.js +230 -0
  186. package/app/services/external/pokeApiService.js +398 -0
  187. package/app/services/group/groupMetadataService.js +311 -0
  188. package/app/services/infra/dbWriteQueue.js +874 -0
  189. package/app/services/infra/featureFlagService.js +131 -0
  190. package/app/services/infra/queueUtils.js +55 -0
  191. package/app/services/messaging/captchaService.js +491 -0
  192. package/app/services/messaging/messagePersistenceService.js +1 -0
  193. package/app/services/messaging/newsBroadcastService.js +347 -0
  194. package/app/services/sticker/stickerFocusService.js +347 -0
  195. package/app/services/sticker/stickerFocusService.test.js +43 -0
  196. package/app/store/aiPromptStore.js +38 -0
  197. package/app/store/conversationSessionStore.js +131 -0
  198. package/app/store/groupConfigStore.js +58 -0
  199. package/app/store/premiumUserStore.js +54 -0
  200. package/app/utils/antiLink/antiLinkModule.js +700 -0
  201. package/app/utils/http/getImageBufferModule.js +18 -0
  202. package/app/utils/json/jsonSanitizer.js +113 -0
  203. package/app/utils/json/jsonSanitizer.test.js +40 -0
  204. package/app/utils/systemMetrics/systemMetricsModule.js +88 -0
  205. package/app/workers/aiLearningWorker.js +605 -0
  206. package/app/workers/commandConfigEnrichmentWorker.js +242 -0
  207. package/database/index.js +2075 -0
  208. package/database/init.js +151 -0
  209. package/database/migrations/.gitkeep +0 -0
  210. package/database/migrations/20260307_d0_hardening_down.sql +64 -0
  211. package/database/migrations/20260307_d0_hardening_up.sql +79 -0
  212. package/database/migrations/20260307_d1_terms_acceptance_down.sql +11 -0
  213. package/database/migrations/20260307_d1_terms_acceptance_up.sql +37 -0
  214. package/database/migrations/20260307_d2_auth_hardening_down.sql +75 -0
  215. package/database/migrations/20260307_d2_auth_hardening_up.sql +100 -0
  216. package/database/migrations/20260314_d7_canonical_sender_down.sql +53 -0
  217. package/database/migrations/20260314_d7_canonical_sender_up.sql +114 -0
  218. package/database/migrations/20260406_d30_security_analytics_down.sql +95 -0
  219. package/database/migrations/20260406_d30_security_analytics_up.sql +292 -0
  220. package/database/migrations/20260407_d31_web_google_session_token_hardening_down.sql +2 -0
  221. package/database/migrations/20260407_d31_web_google_session_token_hardening_up.sql +17 -0
  222. package/database/migrations/20260408_d32_ai_help_response_cache_down.sql +1 -0
  223. package/database/migrations/20260408_d32_ai_help_response_cache_up.sql +22 -0
  224. package/database/migrations/20260409_d33_ai_learning_tables_down.sql +4 -0
  225. package/database/migrations/20260409_d33_ai_learning_tables_up.sql +52 -0
  226. package/database/migrations/20260410_d34_command_config_enrichment_down.sql +3 -0
  227. package/database/migrations/20260410_d34_command_config_enrichment_up.sql +48 -0
  228. package/database/schema.sql +1186 -0
  229. package/docker-compose.yml +104 -0
  230. package/docs/audits/stickerCatalogController-out-of-scope.md +103 -0
  231. package/docs/audits/stickerCatalogController-symbols.md +58 -0
  232. package/docs/compliance/acceptable-use-policy-2026-03-07.md +35 -0
  233. package/docs/compliance/dpa-b2b-standard-2026-03-07.md +80 -0
  234. package/docs/compliance/monthly-compliance-checklist-2026-03-07.md +88 -0
  235. package/docs/compliance/notice-and-takedown-policy-2026-03-07.md +34 -0
  236. package/docs/compliance/privacy-policy-2026-03-07.md +75 -0
  237. package/docs/compliance/subprocessors-inventory-2026-03-07.md +16 -0
  238. package/docs/database/production-db-evolution-runbook-2026q1.md +365 -0
  239. package/docs/security/dsar-lgpd-runbook-2026-03-07.md +86 -0
  240. package/docs/security/incident-response-lgpd-anpd-runbook-2026-03-07.md +77 -0
  241. package/docs/security/network-hardening-runbook-2026-03-07.md +137 -0
  242. package/docs/seo/omnizap-seo-playbook-br-2026-02-28.md +238 -0
  243. package/docs/seo/satellite-page-template.md +116 -0
  244. package/docs/seo/satellite-pages-phase1.json +364 -0
  245. package/docs/wiki/Home.md +120 -0
  246. package/docs/wiki/pair-extraordinaire-2026-03-08.md +3 -0
  247. package/docs/wiki/recent-changes-2026-03-08.md +47 -0
  248. package/ecosystem.prod.config.cjs +135 -0
  249. package/eslint.config.js +89 -0
  250. package/index.js +488 -0
  251. package/ml/clip_classifier/Dockerfile +18 -0
  252. package/ml/clip_classifier/README.md +118 -0
  253. package/ml/clip_classifier/adaptive_scoring.py +40 -0
  254. package/ml/clip_classifier/classifier.py +654 -0
  255. package/ml/clip_classifier/embedding_store.py +481 -0
  256. package/ml/clip_classifier/env_loader.py +15 -0
  257. package/ml/clip_classifier/llm_label_expander.py +144 -0
  258. package/ml/clip_classifier/main.py +213 -0
  259. package/ml/clip_classifier/requirements.txt +10 -0
  260. package/ml/clip_classifier/similarity_engine.py +74 -0
  261. package/new-logo.png +0 -0
  262. package/observability/alert-rules.yml +60 -0
  263. package/observability/grafana/dashboards/omnizap-mysql.json +136 -0
  264. package/observability/grafana/dashboards/omnizap-overview.json +170 -0
  265. package/observability/grafana/provisioning/dashboards/dashboards.yml +11 -0
  266. package/observability/grafana/provisioning/datasources/datasources.yml +15 -0
  267. package/observability/loki-config.yml +38 -0
  268. package/observability/mysql-setup.sql +46 -0
  269. package/observability/prometheus.yml +35 -0
  270. package/observability/promtail-config.yml +84 -0
  271. package/observability/sticker-catalog-slo.md +83 -0
  272. package/observability/sticker-scale-hardening-rollout.md +128 -0
  273. package/package.json +144 -0
  274. package/public/apple-touch-icon.png +0 -0
  275. package/public/assets/css/commands-react.input.css +71 -0
  276. package/public/assets/css/create-pack-react.input.css +31 -0
  277. package/public/assets/css/home-react.input.css +106 -0
  278. package/public/assets/css/login-react.input.css +58 -0
  279. package/public/assets/css/stickers-react.input.css +18 -0
  280. package/public/assets/css/terms-react.input.css +115 -0
  281. package/public/assets/css/user-react.input.css +57 -0
  282. package/public/assets/images/brand-icon-192.png +0 -0
  283. package/public/assets/images/brand-logo-128.webp +0 -0
  284. package/public/assets/images/hero-banner-1280.jpg +0 -0
  285. package/public/comandos/commands-catalog.json +4517 -0
  286. package/public/css/api-docs.css +161 -0
  287. package/public/css/stickers-admin.css +1288 -0
  288. package/public/css/styles.css +679 -0
  289. package/public/css/systemadm/admin.css +474 -0
  290. package/public/css/systemadm/base.css +73 -0
  291. package/public/css/systemadm/components.css +662 -0
  292. package/public/css/systemadm/layout.css +229 -0
  293. package/public/css/systemadm/tokens.css +56 -0
  294. package/public/favicon-16x16.png +0 -0
  295. package/public/favicon-32x32.png +0 -0
  296. package/public/favicon.ico +0 -0
  297. package/public/js/apps/apiDocsApp.js +235 -0
  298. package/public/js/apps/commandsReactApp.js +528 -0
  299. package/public/js/apps/createPackApp.js +1646 -0
  300. package/public/js/apps/homeReactApp.js +942 -0
  301. package/public/js/apps/loginReactApp.js +496 -0
  302. package/public/js/apps/stickersAdminApp.js +1753 -0
  303. package/public/js/apps/stickersApp.js +3797 -0
  304. package/public/js/apps/termsReactApp.js +528 -0
  305. package/public/js/apps/userApp.js +2540 -0
  306. package/public/js/apps/userProfile/actions.js +66 -0
  307. package/public/js/apps/userReactApp.js +547 -0
  308. package/public/js/catalog.js +950 -0
  309. package/public/pages/api-docs.html +40 -0
  310. package/public/pages/aup.html +158 -0
  311. package/public/pages/comandos.html +41 -0
  312. package/public/pages/dpa.html +227 -0
  313. package/public/pages/home.html +45 -0
  314. package/public/pages/licenca.html +182 -0
  315. package/public/pages/login.html +40 -0
  316. package/public/pages/notice-and-takedown.html +234 -0
  317. package/public/pages/politica-de-privacidade.html +251 -0
  318. package/public/pages/seo-bot-whatsapp-para-grupo.html +350 -0
  319. package/public/pages/seo-bot-whatsapp-sem-programar.html +350 -0
  320. package/public/pages/seo-como-automatizar-avisos-no-whatsapp.html +350 -0
  321. package/public/pages/seo-como-criar-comandos-whatsapp.html +350 -0
  322. package/public/pages/seo-como-evitar-spam-no-whatsapp.html +350 -0
  323. package/public/pages/seo-como-moderar-grupo-whatsapp.html +350 -0
  324. package/public/pages/seo-como-organizar-comunidade-whatsapp.html +350 -0
  325. package/public/pages/seo-melhor-bot-whatsapp-para-grupos.html +350 -0
  326. package/public/pages/stickers-admin.html +31 -0
  327. package/public/pages/stickers-create.html +41 -0
  328. package/public/pages/stickers.html +45 -0
  329. package/public/pages/suboperadores.html +237 -0
  330. package/public/pages/termos-de-uso-texto-integral.html +241 -0
  331. package/public/pages/termos-de-uso.html +41 -0
  332. package/public/pages/user-password-reset.html +32 -0
  333. package/public/pages/user-systemadm.html +508 -0
  334. package/public/pages/user.html +39 -0
  335. package/public/robots.txt +9 -0
  336. package/public/site.webmanifest +24 -0
  337. package/public/sitemap.xml +98 -0
  338. package/schemas/command-config.schema.json +582 -0
  339. package/scripts/baileys-compat-smoke.mjs +12 -0
  340. package/scripts/cache-bust.mjs +142 -0
  341. package/scripts/deploy.sh +916 -0
  342. package/scripts/email-broadcast-terms-update.mjs +170 -0
  343. package/scripts/enrich-command-discovery-fields.mjs +286 -0
  344. package/scripts/generate-command-config-schema.mjs +273 -0
  345. package/scripts/generate-commands-catalog.mjs +308 -0
  346. package/scripts/generate-module-agents.mjs +631 -0
  347. package/scripts/generate-seo-satellite-pages.mjs +400 -0
  348. package/scripts/github-deploy-notify.mjs +174 -0
  349. package/scripts/github-release-notify.mjs +219 -0
  350. package/scripts/release.sh +599 -0
  351. package/scripts/run-codeql-local.sh +116 -0
  352. package/scripts/run-prettier-all.mjs +25 -0
  353. package/scripts/security-smoketest.mjs +581 -0
  354. package/scripts/sticker-catalog-loadtest.mjs +210 -0
  355. package/scripts/sticker-worker-task.mjs +119 -0
  356. package/scripts/sync-readme-snapshot.mjs +133 -0
  357. package/scripts/validate-command-config-schema.mjs +130 -0
  358. package/scripts/validate-command-configs.mjs +15 -0
  359. package/scripts/wiki-sync.sh +191 -0
  360. package/server/auth/googleWebAuth/googleWebAuthRuntime.js +62 -0
  361. package/server/auth/googleWebAuth/googleWebAuthService.js +807 -0
  362. package/server/auth/jwt/webJwtService.js +147 -0
  363. package/server/auth/stickerCatalogAuthContext.js +165 -0
  364. package/server/auth/termsAcceptance/termsAcceptanceHandler.js +189 -0
  365. package/server/auth/userPassword/index.js +14 -0
  366. package/server/auth/userPassword/userPasswordAuthService.js +422 -0
  367. package/server/auth/userPassword/userPasswordCrypto.js +199 -0
  368. package/server/auth/userPassword/userPasswordCrypto.test.js +76 -0
  369. package/server/auth/userPassword/userPasswordRecoveryService.js +728 -0
  370. package/server/auth/validation/authSchemas.js +236 -0
  371. package/server/auth/webAccount/webAccountHandlers.js +1434 -0
  372. package/server/controllers/admin/adminBanService.js +138 -0
  373. package/server/controllers/admin/adminPanelHandlers.js +2083 -0
  374. package/server/controllers/admin/stickerCatalogAdminContext.js +17 -0
  375. package/server/controllers/admin/systemAdminController.js +201 -0
  376. package/server/controllers/email/emailAutomationController.js +239 -0
  377. package/server/controllers/metricsController.js +21 -0
  378. package/server/controllers/seo/stickerCatalogSeoContext.js +514 -0
  379. package/server/controllers/sticker/nonCatalogHandlers.js +303 -0
  380. package/server/controllers/sticker/stickerCatalogController.js +4700 -0
  381. package/server/controllers/system/contactController.js +115 -0
  382. package/server/controllers/system/githubController.js +137 -0
  383. package/server/controllers/system/stickerCatalogSystemContext.js +758 -0
  384. package/server/controllers/system/storageController.js +154 -0
  385. package/server/controllers/system/systemController.js +135 -0
  386. package/server/controllers/system/systemMetricsController.js +156 -0
  387. package/server/controllers/system/visitController.js +90 -0
  388. package/server/controllers/userController.js +145 -0
  389. package/server/email/emailAutomationRuntime.js +225 -0
  390. package/server/email/emailAutomationService.js +125 -0
  391. package/server/email/emailOutboxRepository.js +282 -0
  392. package/server/email/emailTemplateService.js +480 -0
  393. package/server/email/emailTransportService.js +156 -0
  394. package/server/http/clientIp.js +95 -0
  395. package/server/http/httpRequestUtils.js +262 -0
  396. package/server/http/httpRequestUtils.test.js +80 -0
  397. package/server/http/httpServer.js +180 -0
  398. package/server/http/requestContext.js +20 -0
  399. package/server/http/siteRoutingUtils.js +87 -0
  400. package/server/index.js +1 -0
  401. package/server/middleware/cachePolicy.js +26 -0
  402. package/server/middleware/cachePolicyHelpers.js +1 -0
  403. package/server/middleware/endpointRateLimit.js +181 -0
  404. package/server/middleware/rateLimit.js +70 -0
  405. package/server/middleware/requireAdminAuth.js +48 -0
  406. package/server/middleware/securityHeaders.js +97 -0
  407. package/server/routes/admin/systemAdminRouter.js +64 -0
  408. package/server/routes/email/emailAutomationRouter.js +46 -0
  409. package/server/routes/health/healthRouter.js +41 -0
  410. package/server/routes/indexRouter.js +234 -0
  411. package/server/routes/metrics/metricsRouter.js +58 -0
  412. package/server/routes/static/staticPageRouter.js +134 -0
  413. package/server/routes/sticker/catalogHandlers/catalogAdminHttp.js +105 -0
  414. package/server/routes/sticker/catalogHandlers/catalogAuthHttp.js +77 -0
  415. package/server/routes/sticker/catalogHandlers/catalogPublicHttp.js +120 -0
  416. package/server/routes/sticker/catalogHandlers/catalogUploadHttp.js +83 -0
  417. package/server/routes/sticker/catalogRouter.js +77 -0
  418. package/server/routes/sticker/stickerApiRouter.js +84 -0
  419. package/server/routes/sticker/stickerDataRouter.js +145 -0
  420. package/server/routes/sticker/stickerSiteRouter.js +43 -0
  421. package/server/routes/user/userApiPaths.js +66 -0
  422. package/server/routes/user/userRouter.js +65 -0
  423. package/server/utils/safePath.js +26 -0
  424. package/utils/logger/loggerModule.js +35 -0
  425. package/vite.config.mjs +38 -0
@@ -0,0 +1,10 @@
1
+ name: CodeQL Config
2
+
3
+ paths-ignore:
4
+ - node_modules/**
5
+ - public/assets/**
6
+ - .tmp_tools/**
7
+ - .artifacts/**
8
+ - logs/**
9
+ - temp/**
10
+ - backups/**
@@ -0,0 +1,35 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: "npm"
4
+ directory: "/"
5
+ schedule:
6
+ interval: "weekly"
7
+ day: "monday"
8
+ time: "06:00"
9
+ timezone: "UTC"
10
+ cooldown:
11
+ default-days: 7
12
+ semver-major-days: 14
13
+ semver-minor-days: 7
14
+ semver-patch-days: 7
15
+ open-pull-requests-limit: 10
16
+ labels:
17
+ - "dependencies"
18
+ commit-message:
19
+ prefix: "chore(deps)"
20
+
21
+ - package-ecosystem: "github-actions"
22
+ directory: "/"
23
+ schedule:
24
+ interval: "weekly"
25
+ day: "monday"
26
+ time: "06:30"
27
+ timezone: "UTC"
28
+ cooldown:
29
+ default-days: 7
30
+ open-pull-requests-limit: 10
31
+ labels:
32
+ - "dependencies"
33
+ - "github-actions"
34
+ commit-message:
35
+ prefix: "chore(ci)"
@@ -0,0 +1,73 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ pull_request:
8
+
9
+ concurrency:
10
+ group: ci-${{ github.workflow }}-${{ github.ref }}
11
+ cancel-in-progress: true
12
+
13
+ permissions:
14
+ contents: read
15
+
16
+ jobs:
17
+ quality:
18
+ name: Lint, Test, Build, DB Init
19
+ runs-on: ubuntu-latest
20
+ timeout-minutes: 30
21
+ services:
22
+ mysql:
23
+ image: mysql:8.0
24
+ ports:
25
+ - 3306:3306
26
+ env:
27
+ MYSQL_ROOT_PASSWORD: root
28
+ options: >-
29
+ --health-cmd="mysqladmin ping -h 127.0.0.1 -uroot -proot"
30
+ --health-interval=10s
31
+ --health-timeout=5s
32
+ --health-retries=12
33
+ env:
34
+ NODE_ENV: test
35
+ DB_HOST: 127.0.0.1
36
+ DB_USER: root
37
+ DB_PASSWORD: root
38
+ DB_NAME: omnizap_ci
39
+ DB_POOL_LIMIT: 5
40
+ steps:
41
+ - name: Checkout
42
+ uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5
43
+ with:
44
+ persist-credentials: false
45
+
46
+ - name: Setup Node.js
47
+ uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020
48
+ with:
49
+ node-version: 20
50
+ cache: npm
51
+
52
+ - name: Rewrite GitHub SSH URLs to HTTPS
53
+ run: |
54
+ git config --global url."https://github.com/".insteadOf "ssh://git@github.com/"
55
+ git config --global url."https://github.com/".insteadOf "git@github.com:"
56
+
57
+ - name: Install dependencies
58
+ run: npm ci
59
+
60
+ - name: Check formatting
61
+ run: npm run format:check
62
+
63
+ - name: Lint
64
+ run: npm run lint
65
+
66
+ - name: Test
67
+ run: npm test
68
+
69
+ - name: Build
70
+ run: npm run build
71
+
72
+ - name: DB bootstrap smoke test
73
+ run: npm run db:init
@@ -0,0 +1,106 @@
1
+ # For most projects, this workflow file will not need changing; you simply need
2
+ # to commit it to your repository.
3
+ #
4
+ # You may wish to alter this file to override the set of languages analyzed,
5
+ # or to provide custom queries or build logic.
6
+ #
7
+ # ******** NOTE ********
8
+ # We have attempted to detect the languages in your repository. Please check
9
+ # the `language` matrix defined below to confirm you have the correct set of
10
+ # supported CodeQL languages.
11
+ #
12
+ name: "CodeQL Advanced"
13
+
14
+ on:
15
+ push:
16
+ branches: ["main"]
17
+ pull_request:
18
+ branches: ["main"]
19
+ schedule:
20
+ - cron: "19 14 * * 5"
21
+
22
+ permissions: read-all
23
+
24
+ jobs:
25
+ analyze:
26
+ name: Analyze (${{ matrix.language }})
27
+ # Runner size impacts CodeQL analysis time. To learn more, please see:
28
+ # - https://gh.io/recommended-hardware-resources-for-running-codeql
29
+ # - https://gh.io/supported-runners-and-hardware-resources
30
+ # - https://gh.io/using-larger-runners (GitHub.com only)
31
+ # Consider using larger runners or machines with greater resources for possible analysis time improvements.
32
+ runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }}
33
+ permissions:
34
+ # required for all workflows
35
+ security-events: write
36
+
37
+ # required to fetch internal or private CodeQL packs
38
+ packages: read
39
+
40
+ # only required for workflows in private repositories
41
+ actions: read
42
+ contents: read
43
+
44
+ strategy:
45
+ fail-fast: false
46
+ matrix:
47
+ include:
48
+ - language: javascript-typescript
49
+ build-mode: none
50
+ - language: python
51
+ build-mode: none
52
+ # CodeQL supports the following values keywords for 'language': 'actions', 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'rust', 'swift'
53
+ # Use `c-cpp` to analyze code written in C, C++ or both
54
+ # Use 'java-kotlin' to analyze code written in Java, Kotlin or both
55
+ # Use 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both
56
+ # To learn more about changing the languages that are analyzed or customizing the build mode for your analysis,
57
+ # see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning.
58
+ # If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how
59
+ # your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages
60
+ steps:
61
+ - name: Checkout repository
62
+ uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5
63
+ with:
64
+ persist-credentials: false
65
+
66
+ # Add any setup steps before running the `github/codeql-action/init` action.
67
+ # This includes steps like installing compilers or runtimes (`actions/setup-node`
68
+ # or others). This is typically only required for manual builds.
69
+ # - name: Setup runtime (example)
70
+ # uses: actions/setup-example@v1
71
+
72
+ # Initializes the CodeQL tools for scanning.
73
+ - name: Initialize CodeQL
74
+ uses: github/codeql-action/init@0d579ffd059c29b07949a3cce3983f0780820c98
75
+ with:
76
+ languages: ${{ matrix.language }}
77
+ build-mode: ${{ matrix.build-mode }}
78
+ config-file: ./.github/codeql/codeql-config.yml
79
+ # If you wish to specify custom queries, you can do so here or in a config file.
80
+ # By default, queries listed here will override any specified in a config file.
81
+ # Prefix the list here with "+" to use these queries and those in the config file.
82
+
83
+ # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
84
+ # queries: security-extended,security-and-quality
85
+
86
+ # If the analyze step fails for one of the languages you are analyzing with
87
+ # "We were unable to automatically build your code", modify the matrix above
88
+ # to set the build mode to "manual" for that language. Then modify this step
89
+ # to build your code.
90
+ # ℹ️ Command-line programs to run using the OS shell.
91
+ # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
92
+ - name: Run manual build steps
93
+ if: matrix.build-mode == 'manual'
94
+ shell: bash
95
+ run: |
96
+ echo 'If you are using a "manual" build mode for one or more of the' \
97
+ 'languages you are analyzing, replace this with the commands to build' \
98
+ 'your code, for example:'
99
+ echo ' make bootstrap'
100
+ echo ' make release'
101
+ exit 1
102
+
103
+ - name: Perform CodeQL Analysis
104
+ uses: github/codeql-action/analyze@0d579ffd059c29b07949a3cce3983f0780820c98
105
+ with:
106
+ category: "/language:${{matrix.language}}"
@@ -0,0 +1,98 @@
1
+ name: DB Migration Check
2
+
3
+ on:
4
+ pull_request:
5
+ paths:
6
+ - "database/**"
7
+ - "docs/database/**"
8
+ workflow_dispatch:
9
+
10
+ concurrency:
11
+ group: db-migration-${{ github.workflow }}-${{ github.ref }}
12
+ cancel-in-progress: true
13
+
14
+ permissions:
15
+ contents: read
16
+
17
+ jobs:
18
+ migrations:
19
+ name: Validate schema + migrations
20
+ runs-on: ubuntu-latest
21
+ timeout-minutes: 30
22
+ services:
23
+ mysql:
24
+ image: mysql:8.0
25
+ ports:
26
+ - 3306:3306
27
+ env:
28
+ MYSQL_ROOT_PASSWORD: root
29
+ options: >-
30
+ --health-cmd="mysqladmin ping -h 127.0.0.1 -uroot -proot"
31
+ --health-interval=10s
32
+ --health-timeout=5s
33
+ --health-retries=12
34
+ env:
35
+ NODE_ENV: test
36
+ DB_HOST: 127.0.0.1
37
+ DB_USER: root
38
+ DB_PASSWORD: root
39
+ DB_NAME: omnizap_migration_dev
40
+ DB_POOL_LIMIT: 5
41
+ steps:
42
+ - name: Checkout
43
+ uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5
44
+ with:
45
+ persist-credentials: false
46
+
47
+ - name: Setup Node.js
48
+ uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020
49
+ with:
50
+ node-version: 20
51
+ cache: npm
52
+
53
+ - name: Rewrite GitHub SSH URLs to HTTPS
54
+ run: |
55
+ git config --global url."https://github.com/".insteadOf "ssh://git@github.com/"
56
+ git config --global url."https://github.com/".insteadOf "git@github.com:"
57
+
58
+ - name: Install dependencies
59
+ run: npm ci
60
+
61
+ - name: Install MySQL client
62
+ run: |
63
+ sudo apt-get update
64
+ sudo apt-get install -y mysql-client
65
+
66
+ - name: Initialize database from consolidated schema
67
+ run: npm run db:init
68
+
69
+ - name: Apply migrations (D0 -> D+7 -> D+30)
70
+ run: |
71
+ mysql -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" < database/migrations/20260307_d0_hardening_up.sql
72
+ mysql -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" < database/migrations/20260314_d7_canonical_sender_up.sql
73
+ mysql -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" < database/migrations/20260406_d30_security_analytics_up.sql
74
+
75
+ - name: Validate migration log
76
+ run: |
77
+ mysql -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" -e "
78
+ SELECT migration_key, phase, status
79
+ FROM schema_change_log
80
+ WHERE migration_key IN (
81
+ '20260307_d0_hardening',
82
+ '20260314_d7_canonical_sender',
83
+ '20260406_d30_security_analytics'
84
+ )
85
+ ORDER BY migration_key;
86
+ "
87
+
88
+ - name: Rollback migrations (D+30 -> D+7 -> D0)
89
+ run: |
90
+ mysql -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" < database/migrations/20260406_d30_security_analytics_down.sql
91
+ mysql -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" < database/migrations/20260314_d7_canonical_sender_down.sql
92
+ mysql -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" < database/migrations/20260307_d0_hardening_down.sql
93
+
94
+ - name: Re-apply migrations after rollback
95
+ run: |
96
+ mysql -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" < database/migrations/20260307_d0_hardening_up.sql
97
+ mysql -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" < database/migrations/20260314_d7_canonical_sender_up.sql
98
+ mysql -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" < database/migrations/20260406_d30_security_analytics_up.sql
@@ -0,0 +1,22 @@
1
+ name: Dependency Review
2
+
3
+ on:
4
+ pull_request:
5
+
6
+ permissions:
7
+ contents: read
8
+ pull-requests: read
9
+
10
+ jobs:
11
+ dependency-review:
12
+ runs-on: ubuntu-latest
13
+ steps:
14
+ - name: Checkout
15
+ uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5
16
+ with:
17
+ persist-credentials: false
18
+
19
+ - name: Review dependencies in PR
20
+ uses: actions/dependency-review-action@2031cfc080254a8a887f58cffee85186f0e49e48
21
+ with:
22
+ fail-on-severity: high
@@ -0,0 +1,95 @@
1
+ name: Deploy
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ dry_run:
7
+ description: "Run deploy in dry-run mode"
8
+ required: true
9
+ default: true
10
+ type: boolean
11
+ environment_name:
12
+ description: "Deployment environment label"
13
+ required: true
14
+ default: production
15
+ type: choice
16
+ options:
17
+ - production
18
+ - staging
19
+ verify_url:
20
+ description: "Post-deploy health URL"
21
+ required: true
22
+ default: https://omnizap.shop/
23
+ type: string
24
+ target_dir:
25
+ description: "Optional DEPLOY_TARGET_DIR override"
26
+ required: false
27
+ default: ""
28
+ type: string
29
+ pm2_app_name:
30
+ description: "Optional DEPLOY_PM2_APP_NAME override"
31
+ required: false
32
+ default: ""
33
+ type: string
34
+ publish_secondary:
35
+ description: "Publish package to secondary registry (npmjs)"
36
+ required: true
37
+ default: false
38
+ type: boolean
39
+
40
+ concurrency:
41
+ group: deploy-${{ inputs.environment_name }}
42
+ cancel-in-progress: false
43
+
44
+ permissions:
45
+ contents: read
46
+
47
+ jobs:
48
+ deploy:
49
+ name: Run deploy.sh
50
+ runs-on:
51
+ - self-hosted
52
+ - linux
53
+ - x64
54
+ timeout-minutes: 60
55
+ environment: ${{ inputs.environment_name }}
56
+ permissions:
57
+ contents: read
58
+ deployments: write
59
+ packages: write
60
+ steps:
61
+ - name: Checkout
62
+ uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5
63
+ with:
64
+ fetch-depth: 0
65
+ persist-credentials: false
66
+
67
+ - name: Setup Node.js
68
+ uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020
69
+ with:
70
+ node-version: 20
71
+ cache: npm
72
+
73
+ - name: Rewrite GitHub SSH URLs to HTTPS
74
+ run: |
75
+ git config --global url."https://github.com/".insteadOf "ssh://git@github.com/"
76
+ git config --global url."https://github.com/".insteadOf "git@github.com:"
77
+
78
+ - name: Install dependencies
79
+ run: npm ci
80
+
81
+ - name: Execute deploy pipeline
82
+ env:
83
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
84
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
85
+ DEPLOY_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
86
+ DEPLOY_PACKAGE_TOKEN: ${{ secrets.DEPLOY_PACKAGE_TOKEN }}
87
+ DEPLOY_PACKAGE_SECONDARY_TOKEN: ${{ secrets.NPM_TOKEN }}
88
+ NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
89
+ DEPLOY_DRY_RUN: ${{ inputs.dry_run && '1' || '0' }}
90
+ DEPLOY_GITHUB_ENVIRONMENT: ${{ inputs.environment_name }}
91
+ DEPLOY_VERIFY_URL: ${{ inputs.verify_url }}
92
+ DEPLOY_TARGET_DIR: ${{ inputs.target_dir }}
93
+ DEPLOY_PM2_APP_NAME: ${{ inputs.pm2_app_name }}
94
+ DEPLOY_PACKAGE_PUBLISH_SECONDARY: ${{ inputs.publish_secondary && '1' || '0' }}
95
+ run: npm run deploy
@@ -0,0 +1,106 @@
1
+ name: Release
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ release_type:
7
+ description: "Semver release type"
8
+ required: true
9
+ default: patch
10
+ type: choice
11
+ options:
12
+ - patch
13
+ - minor
14
+ - major
15
+ - prepatch
16
+ - preminor
17
+ - premajor
18
+ - prerelease
19
+ force_version:
20
+ description: "Optional forced version (e.g. 2.5.0)"
21
+ required: false
22
+ default: ""
23
+ type: string
24
+ release_branch:
25
+ description: "Git branch for commit/tag push"
26
+ required: true
27
+ default: main
28
+ type: string
29
+ publish_secondary:
30
+ description: "Publish to secondary registry (npmjs)"
31
+ required: true
32
+ default: false
33
+ type: boolean
34
+ require_dual_publish:
35
+ description: "Fail if both registries are not published"
36
+ required: true
37
+ default: false
38
+ type: boolean
39
+ skip_wiki_sync:
40
+ description: "Skip docs/wiki sync during release"
41
+ required: true
42
+ default: false
43
+ type: boolean
44
+
45
+ concurrency:
46
+ group: release-${{ github.ref_name }}
47
+ cancel-in-progress: false
48
+
49
+ permissions:
50
+ contents: read
51
+
52
+ jobs:
53
+ release:
54
+ name: Run release.sh
55
+ runs-on:
56
+ - self-hosted
57
+ - linux
58
+ - x64
59
+ timeout-minutes: 90
60
+ environment: production
61
+ permissions:
62
+ contents: write
63
+ packages: write
64
+ steps:
65
+ - name: Checkout
66
+ uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5
67
+ with:
68
+ fetch-depth: 0
69
+ persist-credentials: false
70
+
71
+ - name: Setup Node.js
72
+ uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020
73
+ with:
74
+ node-version: 20
75
+ cache: npm
76
+
77
+ - name: Configure git identity
78
+ run: |
79
+ git config user.name "github-actions[bot]"
80
+ git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
81
+
82
+ - name: Rewrite GitHub SSH URLs to HTTPS
83
+ run: |
84
+ git config --global url."https://github.com/".insteadOf "ssh://git@github.com/"
85
+ git config --global url."https://github.com/".insteadOf "git@github.com:"
86
+
87
+ - name: Install dependencies
88
+ run: npm ci
89
+
90
+ - name: Execute release pipeline
91
+ env:
92
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
93
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
94
+ RELEASE_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
95
+ DEPLOY_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
96
+ DEPLOY_PACKAGE_TOKEN: ${{ secrets.DEPLOY_PACKAGE_TOKEN }}
97
+ DEPLOY_PACKAGE_SECONDARY_TOKEN: ${{ secrets.NPM_TOKEN }}
98
+ NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
99
+ RELEASE_TYPE: ${{ inputs.release_type }}
100
+ RELEASE_FORCE_VERSION: ${{ inputs.force_version }}
101
+ RELEASE_GIT_BRANCH: ${{ inputs.release_branch }}
102
+ DEPLOY_PACKAGE_PUBLISH_SECONDARY: ${{ inputs.publish_secondary && '1' || '0' }}
103
+ RELEASE_REQUIRE_DUAL_PUBLISH: ${{ inputs.require_dual_publish && '1' || '0' }}
104
+ RELEASE_VERIFY_UNIFIED_VERSION: ${{ inputs.publish_secondary && '1' || '0' }}
105
+ RELEASE_WIKI_SYNC: ${{ inputs.skip_wiki_sync && '0' || '1' }}
106
+ run: npm run release
@@ -0,0 +1,51 @@
1
+ name: Security - Build Provenance
2
+
3
+ on:
4
+ release:
5
+ types:
6
+ - published
7
+ workflow_dispatch:
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ concurrency:
13
+ group: security-attest-${{ github.workflow }}-${{ github.ref }}
14
+ cancel-in-progress: true
15
+
16
+ jobs:
17
+ attest:
18
+ name: Attest NPM Package Provenance
19
+ runs-on: ubuntu-latest
20
+ timeout-minutes: 20
21
+ permissions:
22
+ contents: read
23
+ attestations: write
24
+ id-token: write
25
+ steps:
26
+ - name: Checkout
27
+ uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5
28
+ with:
29
+ persist-credentials: false
30
+
31
+ - name: Setup Node.js
32
+ uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020
33
+ with:
34
+ node-version: 20
35
+
36
+ - name: Pack npm artifact
37
+ id: pack
38
+ run: |
39
+ PACKAGE_FILE="$(npm pack --ignore-scripts --silent)"
40
+ echo "package_file=$PACKAGE_FILE" >> "$GITHUB_OUTPUT"
41
+
42
+ - name: Upload package artifact
43
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
44
+ with:
45
+ name: npm-package
46
+ path: ${{ steps.pack.outputs.package_file }}
47
+
48
+ - name: Generate build provenance attestation
49
+ uses: actions/attest-build-provenance@a2bbfa25375fe432b6a289bc6b6cd05ecd0c4c32
50
+ with:
51
+ subject-path: ${{ steps.pack.outputs.package_file }}
@@ -0,0 +1,34 @@
1
+ name: Security - Gitleaks
2
+
3
+ on:
4
+ pull_request:
5
+ push:
6
+ branches:
7
+ - main
8
+ schedule:
9
+ - cron: "0 4 * * 1"
10
+ workflow_dispatch:
11
+
12
+ permissions:
13
+ contents: read
14
+
15
+ concurrency:
16
+ group: security-gitleaks-${{ github.workflow }}-${{ github.ref }}
17
+ cancel-in-progress: true
18
+
19
+ jobs:
20
+ scan:
21
+ name: Secret Leak Scan
22
+ runs-on: ubuntu-latest
23
+ timeout-minutes: 20
24
+ steps:
25
+ - name: Checkout
26
+ uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5
27
+ with:
28
+ fetch-depth: 0
29
+ persist-credentials: false
30
+
31
+ - name: Run Gitleaks
32
+ uses: gitleaks/gitleaks-action@ff98106e4c7b2bc287b24eaf42907196329070c7
33
+ env:
34
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -0,0 +1,31 @@
1
+ name: Security - Runner Hardening
2
+
3
+ on:
4
+ pull_request:
5
+ workflow_dispatch:
6
+
7
+ permissions:
8
+ contents: read
9
+
10
+ concurrency:
11
+ group: security-runner-hardening-${{ github.workflow }}-${{ github.ref }}
12
+ cancel-in-progress: true
13
+
14
+ jobs:
15
+ audit:
16
+ name: Harden Runner Audit
17
+ runs-on: ubuntu-latest
18
+ timeout-minutes: 10
19
+ steps:
20
+ - name: Harden runner
21
+ uses: step-security/harden-runner@58077d3c7e43986b6b15fba718e8ea69e387dfcc
22
+ with:
23
+ egress-policy: audit
24
+
25
+ - name: Checkout
26
+ uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5
27
+ with:
28
+ persist-credentials: false
29
+
30
+ - name: Runner audit heartbeat
31
+ run: echo "Runner hardening audit completed."