bps-kit 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (368) hide show
  1. package/package.json +1 -1
  2. package/templates/.agents/agents/backend-specialist.md +263 -0
  3. package/templates/.agents/agents/code-archaeologist.md +106 -0
  4. package/templates/.agents/agents/database-architect.md +226 -0
  5. package/templates/.agents/agents/debugger.md +225 -0
  6. package/templates/.agents/agents/devops-engineer.md +242 -0
  7. package/templates/.agents/agents/documentation-writer.md +104 -0
  8. package/templates/.agents/agents/explorer-agent.md +73 -0
  9. package/templates/.agents/agents/frontend-specialist.md +593 -0
  10. package/templates/.agents/agents/game-developer.md +162 -0
  11. package/templates/.agents/agents/mobile-developer.md +377 -0
  12. package/templates/.agents/agents/orchestrator.md +416 -0
  13. package/templates/.agents/agents/penetration-tester.md +188 -0
  14. package/templates/.agents/agents/performance-optimizer.md +187 -0
  15. package/templates/.agents/agents/product-manager.md +112 -0
  16. package/templates/.agents/agents/product-owner.md +95 -0
  17. package/templates/.agents/agents/project-planner.md +406 -0
  18. package/templates/.agents/agents/qa-automation-engineer.md +103 -0
  19. package/templates/.agents/agents/security-auditor.md +170 -0
  20. package/templates/.agents/agents/seo-specialist.md +111 -0
  21. package/templates/.agents/agents/test-engineer.md +158 -0
  22. package/templates/.agents/rules/GEMINI.md +219 -0
  23. package/templates/.agents/scripts/auto_preview.py +148 -0
  24. package/templates/.agents/scripts/checklist.py +217 -0
  25. package/templates/.agents/scripts/session_manager.py +120 -0
  26. package/templates/.agents/scripts/verify_all.py +327 -0
  27. package/templates/.agents/workflows/brainstorm.md +113 -0
  28. package/templates/.agents/workflows/create.md +59 -0
  29. package/templates/.agents/workflows/debug.md +103 -0
  30. package/templates/.agents/workflows/deploy.md +176 -0
  31. package/templates/.agents/workflows/enhance.md +63 -0
  32. package/templates/.agents/workflows/orchestrate.md +237 -0
  33. package/templates/.agents/workflows/plan.md +89 -0
  34. package/templates/.agents/workflows/preview.md +81 -0
  35. package/templates/.agents/workflows/setup-brain.md +39 -0
  36. package/templates/.agents/workflows/status.md +86 -0
  37. package/templates/.agents/workflows/test.md +144 -0
  38. package/templates/.agents/workflows/ui-ux-pro-max.md +296 -0
  39. package/templates/skills_normal/api-patterns/scripts/api_validator.py +211 -0
  40. package/templates/skills_normal/database-design/scripts/schema_validator.py +172 -0
  41. package/templates/skills_normal/frontend-design/scripts/accessibility_checker.py +183 -0
  42. package/templates/skills_normal/frontend-design/scripts/ux_audit.py +722 -0
  43. package/templates/skills_normal/git-pushing/scripts/smart_commit.sh +19 -0
  44. package/templates/skills_normal/lint-and-validate/scripts/lint_runner.py +184 -0
  45. package/templates/skills_normal/lint-and-validate/scripts/type_coverage.py +173 -0
  46. package/templates/skills_normal/performance-profiling/scripts/lighthouse_audit.py +76 -0
  47. package/templates/skills_normal/senior-fullstack/scripts/code_quality_analyzer.py +114 -0
  48. package/templates/skills_normal/senior-fullstack/scripts/fullstack_scaffolder.py +114 -0
  49. package/templates/skills_normal/senior-fullstack/scripts/project_scaffolder.py +114 -0
  50. package/templates/skills_normal/seo-fundamentals/scripts/seo_checker.py +219 -0
  51. package/templates/skills_normal/testing-patterns/scripts/test_runner.py +219 -0
  52. package/templates/skills_normal/vulnerability-scanner/scripts/security_scan.py +458 -0
  53. package/templates/vault/007/scripts/config.py +472 -0
  54. package/templates/vault/007/scripts/full_audit.py +1306 -0
  55. package/templates/vault/007/scripts/quick_scan.py +481 -0
  56. package/templates/vault/007/scripts/requirements.txt +26 -0
  57. package/templates/vault/007/scripts/scanners/__init__.py +0 -0
  58. package/templates/vault/007/scripts/scanners/dependency_scanner.py +1305 -0
  59. package/templates/vault/007/scripts/scanners/injection_scanner.py +1104 -0
  60. package/templates/vault/007/scripts/scanners/secrets_scanner.py +1008 -0
  61. package/templates/vault/007/scripts/score_calculator.py +693 -0
  62. package/templates/vault/agent-orchestrator/scripts/match_skills.py +329 -0
  63. package/templates/vault/agent-orchestrator/scripts/orchestrate.py +304 -0
  64. package/templates/vault/agent-orchestrator/scripts/requirements.txt +1 -0
  65. package/templates/vault/agent-orchestrator/scripts/scan_registry.py +508 -0
  66. package/templates/vault/ai-studio-image/scripts/config.py +613 -0
  67. package/templates/vault/ai-studio-image/scripts/generate.py +630 -0
  68. package/templates/vault/ai-studio-image/scripts/prompt_engine.py +424 -0
  69. package/templates/vault/ai-studio-image/scripts/requirements.txt +4 -0
  70. package/templates/vault/ai-studio-image/scripts/templates.py +349 -0
  71. package/templates/vault/android_ui_verification/scripts/verify_ui.sh +32 -0
  72. package/templates/vault/apify-audience-analysis/reference/scripts/run_actor.js +363 -0
  73. package/templates/vault/apify-brand-reputation-monitoring/reference/scripts/run_actor.js +363 -0
  74. package/templates/vault/apify-competitor-intelligence/reference/scripts/run_actor.js +363 -0
  75. package/templates/vault/apify-content-analytics/reference/scripts/run_actor.js +363 -0
  76. package/templates/vault/apify-ecommerce/reference/scripts/package.json +3 -0
  77. package/templates/vault/apify-ecommerce/reference/scripts/run_actor.js +369 -0
  78. package/templates/vault/apify-influencer-discovery/reference/scripts/run_actor.js +363 -0
  79. package/templates/vault/apify-lead-generation/reference/scripts/run_actor.js +363 -0
  80. package/templates/vault/apify-market-research/reference/scripts/run_actor.js +363 -0
  81. package/templates/vault/apify-trend-analysis/reference/scripts/run_actor.js +363 -0
  82. package/templates/vault/apify-ultimate-scraper/reference/scripts/run_actor.js +363 -0
  83. package/templates/vault/audio-transcriber/scripts/install-requirements.sh +190 -0
  84. package/templates/vault/audio-transcriber/scripts/transcribe.py +486 -0
  85. package/templates/vault/claude-monitor/scripts/api_bench.py +240 -0
  86. package/templates/vault/claude-monitor/scripts/config.py +69 -0
  87. package/templates/vault/claude-monitor/scripts/health_check.py +362 -0
  88. package/templates/vault/claude-monitor/scripts/monitor.py +296 -0
  89. package/templates/vault/content-creator/scripts/brand_voice_analyzer.py +185 -0
  90. package/templates/vault/content-creator/scripts/seo_optimizer.py +419 -0
  91. package/templates/vault/context-agent/scripts/active_context.py +227 -0
  92. package/templates/vault/context-agent/scripts/compressor.py +149 -0
  93. package/templates/vault/context-agent/scripts/config.py +69 -0
  94. package/templates/vault/context-agent/scripts/context_loader.py +155 -0
  95. package/templates/vault/context-agent/scripts/context_manager.py +302 -0
  96. package/templates/vault/context-agent/scripts/models.py +103 -0
  97. package/templates/vault/context-agent/scripts/project_registry.py +132 -0
  98. package/templates/vault/context-agent/scripts/requirements.txt +6 -0
  99. package/templates/vault/context-agent/scripts/search.py +115 -0
  100. package/templates/vault/context-agent/scripts/session_parser.py +206 -0
  101. package/templates/vault/context-agent/scripts/session_summary.py +319 -0
  102. package/templates/vault/context-guardian/scripts/context_snapshot.py +229 -0
  103. package/templates/vault/docx/ooxml/scripts/pack.py +159 -0
  104. package/templates/vault/docx/ooxml/scripts/unpack.py +29 -0
  105. package/templates/vault/docx/ooxml/scripts/validate.py +69 -0
  106. package/templates/vault/docx/ooxml/scripts/validation/__init__.py +15 -0
  107. package/templates/vault/docx/ooxml/scripts/validation/base.py +951 -0
  108. package/templates/vault/docx/ooxml/scripts/validation/docx.py +274 -0
  109. package/templates/vault/docx/ooxml/scripts/validation/pptx.py +315 -0
  110. package/templates/vault/docx/ooxml/scripts/validation/redlining.py +279 -0
  111. package/templates/vault/docx/scripts/__init__.py +1 -0
  112. package/templates/vault/docx/scripts/document.py +1276 -0
  113. package/templates/vault/docx/scripts/templates/comments.xml +3 -0
  114. package/templates/vault/docx/scripts/templates/commentsExtended.xml +3 -0
  115. package/templates/vault/docx/scripts/templates/commentsExtensible.xml +3 -0
  116. package/templates/vault/docx/scripts/templates/commentsIds.xml +3 -0
  117. package/templates/vault/docx/scripts/templates/people.xml +3 -0
  118. package/templates/vault/docx/scripts/utilities.py +374 -0
  119. package/templates/vault/docx-official/ooxml/scripts/pack.py +159 -0
  120. package/templates/vault/docx-official/ooxml/scripts/unpack.py +29 -0
  121. package/templates/vault/docx-official/ooxml/scripts/validate.py +69 -0
  122. package/templates/vault/docx-official/ooxml/scripts/validation/__init__.py +15 -0
  123. package/templates/vault/docx-official/ooxml/scripts/validation/base.py +951 -0
  124. package/templates/vault/docx-official/ooxml/scripts/validation/docx.py +274 -0
  125. package/templates/vault/docx-official/ooxml/scripts/validation/pptx.py +315 -0
  126. package/templates/vault/docx-official/ooxml/scripts/validation/redlining.py +279 -0
  127. package/templates/vault/docx-official/scripts/__init__.py +1 -0
  128. package/templates/vault/docx-official/scripts/document.py +1276 -0
  129. package/templates/vault/docx-official/scripts/templates/comments.xml +3 -0
  130. package/templates/vault/docx-official/scripts/templates/commentsExtended.xml +3 -0
  131. package/templates/vault/docx-official/scripts/templates/commentsExtensible.xml +3 -0
  132. package/templates/vault/docx-official/scripts/templates/commentsIds.xml +3 -0
  133. package/templates/vault/docx-official/scripts/templates/people.xml +3 -0
  134. package/templates/vault/docx-official/scripts/utilities.py +374 -0
  135. package/templates/vault/geo-fundamentals/scripts/geo_checker.py +289 -0
  136. package/templates/vault/helm-chart-scaffolding/scripts/validate-chart.sh +244 -0
  137. package/templates/vault/i18n-localization/scripts/i18n_checker.py +241 -0
  138. package/templates/vault/instagram/scripts/account_setup.py +233 -0
  139. package/templates/vault/instagram/scripts/analyze.py +221 -0
  140. package/templates/vault/instagram/scripts/api_client.py +444 -0
  141. package/templates/vault/instagram/scripts/auth.py +411 -0
  142. package/templates/vault/instagram/scripts/comments.py +160 -0
  143. package/templates/vault/instagram/scripts/config.py +111 -0
  144. package/templates/vault/instagram/scripts/db.py +467 -0
  145. package/templates/vault/instagram/scripts/export.py +138 -0
  146. package/templates/vault/instagram/scripts/governance.py +233 -0
  147. package/templates/vault/instagram/scripts/hashtags.py +114 -0
  148. package/templates/vault/instagram/scripts/insights.py +170 -0
  149. package/templates/vault/instagram/scripts/media.py +65 -0
  150. package/templates/vault/instagram/scripts/messages.py +103 -0
  151. package/templates/vault/instagram/scripts/profile.py +58 -0
  152. package/templates/vault/instagram/scripts/publish.py +449 -0
  153. package/templates/vault/instagram/scripts/requirements.txt +5 -0
  154. package/templates/vault/instagram/scripts/run_all.py +189 -0
  155. package/templates/vault/instagram/scripts/schedule.py +189 -0
  156. package/templates/vault/instagram/scripts/serve_api.py +234 -0
  157. package/templates/vault/instagram/scripts/templates.py +155 -0
  158. package/templates/vault/junta-leiloeiros/scripts/db.py +216 -0
  159. package/templates/vault/junta-leiloeiros/scripts/export.py +137 -0
  160. package/templates/vault/junta-leiloeiros/scripts/requirements.txt +15 -0
  161. package/templates/vault/junta-leiloeiros/scripts/run_all.py +190 -0
  162. package/templates/vault/junta-leiloeiros/scripts/scraper/__init__.py +4 -0
  163. package/templates/vault/junta-leiloeiros/scripts/scraper/base_scraper.py +209 -0
  164. package/templates/vault/junta-leiloeiros/scripts/scraper/generic_scraper.py +110 -0
  165. package/templates/vault/junta-leiloeiros/scripts/scraper/jucap.py +110 -0
  166. package/templates/vault/junta-leiloeiros/scripts/scraper/juceac.py +72 -0
  167. package/templates/vault/junta-leiloeiros/scripts/scraper/juceal.py +72 -0
  168. package/templates/vault/junta-leiloeiros/scripts/scraper/juceb.py +68 -0
  169. package/templates/vault/junta-leiloeiros/scripts/scraper/jucec.py +63 -0
  170. package/templates/vault/junta-leiloeiros/scripts/scraper/jucema.py +211 -0
  171. package/templates/vault/junta-leiloeiros/scripts/scraper/jucemg.py +218 -0
  172. package/templates/vault/junta-leiloeiros/scripts/scraper/jucep.py +70 -0
  173. package/templates/vault/junta-leiloeiros/scripts/scraper/jucepa.py +74 -0
  174. package/templates/vault/junta-leiloeiros/scripts/scraper/jucepar.py +80 -0
  175. package/templates/vault/junta-leiloeiros/scripts/scraper/jucepe.py +78 -0
  176. package/templates/vault/junta-leiloeiros/scripts/scraper/jucepi.py +69 -0
  177. package/templates/vault/junta-leiloeiros/scripts/scraper/jucer.py +256 -0
  178. package/templates/vault/junta-leiloeiros/scripts/scraper/jucerja.py +170 -0
  179. package/templates/vault/junta-leiloeiros/scripts/scraper/jucern.py +71 -0
  180. package/templates/vault/junta-leiloeiros/scripts/scraper/jucesc.py +89 -0
  181. package/templates/vault/junta-leiloeiros/scripts/scraper/jucesp.py +233 -0
  182. package/templates/vault/junta-leiloeiros/scripts/scraper/jucetins.py +134 -0
  183. package/templates/vault/junta-leiloeiros/scripts/scraper/jucis_df.py +63 -0
  184. package/templates/vault/junta-leiloeiros/scripts/scraper/jucisrs.py +299 -0
  185. package/templates/vault/junta-leiloeiros/scripts/scraper/states.py +99 -0
  186. package/templates/vault/junta-leiloeiros/scripts/serve_api.py +164 -0
  187. package/templates/vault/junta-leiloeiros/scripts/web_scraper_fallback.py +233 -0
  188. package/templates/vault/last30days/scripts/last30days.py +521 -0
  189. package/templates/vault/last30days/scripts/lib/__init__.py +1 -0
  190. package/templates/vault/last30days/scripts/lib/cache.py +152 -0
  191. package/templates/vault/last30days/scripts/lib/dates.py +124 -0
  192. package/templates/vault/last30days/scripts/lib/dedupe.py +120 -0
  193. package/templates/vault/last30days/scripts/lib/env.py +149 -0
  194. package/templates/vault/last30days/scripts/lib/http.py +152 -0
  195. package/templates/vault/last30days/scripts/lib/models.py +175 -0
  196. package/templates/vault/last30days/scripts/lib/normalize.py +160 -0
  197. package/templates/vault/last30days/scripts/lib/openai_reddit.py +230 -0
  198. package/templates/vault/last30days/scripts/lib/reddit_enrich.py +232 -0
  199. package/templates/vault/last30days/scripts/lib/render.py +383 -0
  200. package/templates/vault/last30days/scripts/lib/schema.py +336 -0
  201. package/templates/vault/last30days/scripts/lib/score.py +311 -0
  202. package/templates/vault/last30days/scripts/lib/ui.py +324 -0
  203. package/templates/vault/last30days/scripts/lib/websearch.py +401 -0
  204. package/templates/vault/last30days/scripts/lib/xai_x.py +217 -0
  205. package/templates/vault/leiloeiro-avaliacao/scripts/governance.py +106 -0
  206. package/templates/vault/leiloeiro-avaliacao/scripts/requirements.txt +1 -0
  207. package/templates/vault/leiloeiro-edital/scripts/governance.py +106 -0
  208. package/templates/vault/leiloeiro-edital/scripts/requirements.txt +1 -0
  209. package/templates/vault/leiloeiro-ia/scripts/governance.py +106 -0
  210. package/templates/vault/leiloeiro-ia/scripts/requirements.txt +1 -0
  211. package/templates/vault/leiloeiro-juridico/scripts/governance.py +106 -0
  212. package/templates/vault/leiloeiro-juridico/scripts/requirements.txt +1 -0
  213. package/templates/vault/leiloeiro-mercado/scripts/governance.py +106 -0
  214. package/templates/vault/leiloeiro-mercado/scripts/requirements.txt +1 -0
  215. package/templates/vault/leiloeiro-risco/scripts/governance.py +106 -0
  216. package/templates/vault/leiloeiro-risco/scripts/requirements.txt +1 -0
  217. package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/db/database.ts +24 -0
  218. package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/db/db.ts +35 -0
  219. package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/db/index.ts +2 -0
  220. package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/db/migrations.ts +31 -0
  221. package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/db/schema.sql +8 -0
  222. package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/index.ts +44 -0
  223. package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/routes/todos.ts +155 -0
  224. package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/types/index.ts +35 -0
  225. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/App.css +384 -0
  226. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/App.tsx +81 -0
  227. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/api/todos.ts +57 -0
  228. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/components/ConfirmDialog.tsx +26 -0
  229. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/components/EmptyState.tsx +8 -0
  230. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/components/TodoForm.tsx +43 -0
  231. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/components/TodoItem.tsx +36 -0
  232. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/components/TodoList.tsx +27 -0
  233. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/hooks/useTodos.ts +81 -0
  234. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/index.css +48 -0
  235. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/main.tsx +10 -0
  236. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/vite-env.d.ts +1 -0
  237. package/templates/vault/loki-mode/scripts/export-to-vibe-kanban.sh +178 -0
  238. package/templates/vault/loki-mode/scripts/loki-wrapper.sh +281 -0
  239. package/templates/vault/loki-mode/scripts/take-screenshots.js +55 -0
  240. package/templates/vault/matematico-tao/scripts/complexity_analyzer.py +544 -0
  241. package/templates/vault/matematico-tao/scripts/dependency_graph.py +538 -0
  242. package/templates/vault/mcp-builder/scripts/connections.py +151 -0
  243. package/templates/vault/mcp-builder/scripts/evaluation.py +373 -0
  244. package/templates/vault/mcp-builder/scripts/example_evaluation.xml +22 -0
  245. package/templates/vault/mcp-builder/scripts/requirements.txt +2 -0
  246. package/templates/vault/mobile-design/scripts/mobile_audit.py +670 -0
  247. package/templates/vault/notebooklm/scripts/__init__.py +81 -0
  248. package/templates/vault/notebooklm/scripts/ask_question.py +256 -0
  249. package/templates/vault/notebooklm/scripts/auth_manager.py +358 -0
  250. package/templates/vault/notebooklm/scripts/browser_session.py +255 -0
  251. package/templates/vault/notebooklm/scripts/browser_utils.py +107 -0
  252. package/templates/vault/notebooklm/scripts/cleanup_manager.py +302 -0
  253. package/templates/vault/notebooklm/scripts/config.py +44 -0
  254. package/templates/vault/notebooklm/scripts/notebook_manager.py +410 -0
  255. package/templates/vault/notebooklm/scripts/run.py +102 -0
  256. package/templates/vault/notebooklm/scripts/setup_environment.py +204 -0
  257. package/templates/vault/pdf/scripts/check_bounding_boxes.py +70 -0
  258. package/templates/vault/pdf/scripts/check_bounding_boxes_test.py +226 -0
  259. package/templates/vault/pdf/scripts/check_fillable_fields.py +12 -0
  260. package/templates/vault/pdf/scripts/convert_pdf_to_images.py +35 -0
  261. package/templates/vault/pdf/scripts/create_validation_image.py +41 -0
  262. package/templates/vault/pdf/scripts/extract_form_field_info.py +152 -0
  263. package/templates/vault/pdf/scripts/fill_fillable_fields.py +114 -0
  264. package/templates/vault/pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
  265. package/templates/vault/pdf-official/scripts/check_bounding_boxes.py +70 -0
  266. package/templates/vault/pdf-official/scripts/check_bounding_boxes_test.py +226 -0
  267. package/templates/vault/pdf-official/scripts/check_fillable_fields.py +12 -0
  268. package/templates/vault/pdf-official/scripts/convert_pdf_to_images.py +35 -0
  269. package/templates/vault/pdf-official/scripts/create_validation_image.py +41 -0
  270. package/templates/vault/pdf-official/scripts/extract_form_field_info.py +152 -0
  271. package/templates/vault/pdf-official/scripts/fill_fillable_fields.py +114 -0
  272. package/templates/vault/pdf-official/scripts/fill_pdf_form_with_annotations.py +108 -0
  273. package/templates/vault/planning-with-files/scripts/check-complete.sh +44 -0
  274. package/templates/vault/planning-with-files/scripts/init-session.sh +120 -0
  275. package/templates/vault/pptx/ooxml/scripts/pack.py +159 -0
  276. package/templates/vault/pptx/ooxml/scripts/unpack.py +29 -0
  277. package/templates/vault/pptx/ooxml/scripts/validate.py +69 -0
  278. package/templates/vault/pptx/ooxml/scripts/validation/__init__.py +15 -0
  279. package/templates/vault/pptx/ooxml/scripts/validation/base.py +951 -0
  280. package/templates/vault/pptx/ooxml/scripts/validation/docx.py +274 -0
  281. package/templates/vault/pptx/ooxml/scripts/validation/pptx.py +315 -0
  282. package/templates/vault/pptx/ooxml/scripts/validation/redlining.py +279 -0
  283. package/templates/vault/pptx/scripts/html2pptx.js +979 -0
  284. package/templates/vault/pptx/scripts/inventory.py +1020 -0
  285. package/templates/vault/pptx/scripts/rearrange.py +231 -0
  286. package/templates/vault/pptx/scripts/replace.py +385 -0
  287. package/templates/vault/pptx/scripts/thumbnail.py +450 -0
  288. package/templates/vault/pptx-official/ooxml/scripts/pack.py +159 -0
  289. package/templates/vault/pptx-official/ooxml/scripts/unpack.py +29 -0
  290. package/templates/vault/pptx-official/ooxml/scripts/validate.py +69 -0
  291. package/templates/vault/pptx-official/ooxml/scripts/validation/__init__.py +15 -0
  292. package/templates/vault/pptx-official/ooxml/scripts/validation/base.py +951 -0
  293. package/templates/vault/pptx-official/ooxml/scripts/validation/docx.py +274 -0
  294. package/templates/vault/pptx-official/ooxml/scripts/validation/pptx.py +315 -0
  295. package/templates/vault/pptx-official/ooxml/scripts/validation/redlining.py +279 -0
  296. package/templates/vault/pptx-official/scripts/html2pptx.js +979 -0
  297. package/templates/vault/pptx-official/scripts/inventory.py +1020 -0
  298. package/templates/vault/pptx-official/scripts/rearrange.py +231 -0
  299. package/templates/vault/pptx-official/scripts/replace.py +385 -0
  300. package/templates/vault/pptx-official/scripts/thumbnail.py +450 -0
  301. package/templates/vault/product-manager-toolkit/scripts/customer_interview_analyzer.py +441 -0
  302. package/templates/vault/product-manager-toolkit/scripts/rice_prioritizer.py +296 -0
  303. package/templates/vault/prompt-engineering-patterns/scripts/optimize-prompt.py +279 -0
  304. package/templates/vault/scripts/.skill_cache.json +7538 -0
  305. package/templates/vault/scripts/skill_search.py +228 -0
  306. package/templates/vault/senior-architect/scripts/architecture_diagram_generator.py +114 -0
  307. package/templates/vault/senior-architect/scripts/dependency_analyzer.py +114 -0
  308. package/templates/vault/senior-architect/scripts/project_architect.py +114 -0
  309. package/templates/vault/shopify-development/scripts/requirements.txt +19 -0
  310. package/templates/vault/shopify-development/scripts/shopify_graphql.py +428 -0
  311. package/templates/vault/shopify-development/scripts/shopify_init.py +441 -0
  312. package/templates/vault/shopify-development/scripts/tests/test_shopify_init.py +379 -0
  313. package/templates/vault/skill-creator/scripts/init_skill.py +303 -0
  314. package/templates/vault/skill-creator/scripts/package_skill.py +110 -0
  315. package/templates/vault/skill-creator/scripts/quick_validate.py +95 -0
  316. package/templates/vault/skill-installer/scripts/detect_skills.py +318 -0
  317. package/templates/vault/skill-installer/scripts/install_skill.py +1708 -0
  318. package/templates/vault/skill-installer/scripts/package_skill.py +417 -0
  319. package/templates/vault/skill-installer/scripts/requirements.txt +1 -0
  320. package/templates/vault/skill-installer/scripts/validate_skill.py +430 -0
  321. package/templates/vault/skill-sentinel/scripts/analyzers/__init__.py +13 -0
  322. package/templates/vault/skill-sentinel/scripts/analyzers/code_quality.py +247 -0
  323. package/templates/vault/skill-sentinel/scripts/analyzers/cross_skill.py +134 -0
  324. package/templates/vault/skill-sentinel/scripts/analyzers/dependencies.py +121 -0
  325. package/templates/vault/skill-sentinel/scripts/analyzers/documentation.py +189 -0
  326. package/templates/vault/skill-sentinel/scripts/analyzers/governance_audit.py +153 -0
  327. package/templates/vault/skill-sentinel/scripts/analyzers/performance.py +164 -0
  328. package/templates/vault/skill-sentinel/scripts/analyzers/security.py +189 -0
  329. package/templates/vault/skill-sentinel/scripts/config.py +158 -0
  330. package/templates/vault/skill-sentinel/scripts/cost_optimizer.py +146 -0
  331. package/templates/vault/skill-sentinel/scripts/db.py +354 -0
  332. package/templates/vault/skill-sentinel/scripts/governance.py +58 -0
  333. package/templates/vault/skill-sentinel/scripts/recommender.py +228 -0
  334. package/templates/vault/skill-sentinel/scripts/report_generator.py +224 -0
  335. package/templates/vault/skill-sentinel/scripts/requirements.txt +1 -0
  336. package/templates/vault/skill-sentinel/scripts/run_audit.py +290 -0
  337. package/templates/vault/skill-sentinel/scripts/scanner.py +271 -0
  338. package/templates/vault/stability-ai/scripts/config.py +266 -0
  339. package/templates/vault/stability-ai/scripts/generate.py +687 -0
  340. package/templates/vault/stability-ai/scripts/requirements.txt +4 -0
  341. package/templates/vault/stability-ai/scripts/styles.py +174 -0
  342. package/templates/vault/telegram/assets/boilerplate/nodejs/src/bot-client.ts +86 -0
  343. package/templates/vault/telegram/assets/boilerplate/nodejs/src/handlers.ts +79 -0
  344. package/templates/vault/telegram/assets/boilerplate/nodejs/src/index.ts +32 -0
  345. package/templates/vault/telegram/scripts/send_message.py +143 -0
  346. package/templates/vault/telegram/scripts/setup_project.py +103 -0
  347. package/templates/vault/telegram/scripts/test_bot.py +144 -0
  348. package/templates/vault/typescript-expert/scripts/ts_diagnostic.py +203 -0
  349. package/templates/vault/ui-ux-pro-max/scripts/__pycache__/core.cpython-314.pyc +0 -0
  350. package/templates/vault/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-314.pyc +0 -0
  351. package/templates/vault/ui-ux-pro-max/scripts/core.py +257 -0
  352. package/templates/vault/ui-ux-pro-max/scripts/design_system.py +487 -0
  353. package/templates/vault/ui-ux-pro-max/scripts/search.py +76 -0
  354. package/templates/vault/videodb/scripts/ws_listener.py +204 -0
  355. package/templates/vault/web-artifacts-builder/scripts/bundle-artifact.sh +54 -0
  356. package/templates/vault/web-artifacts-builder/scripts/init-artifact.sh +322 -0
  357. package/templates/vault/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  358. package/templates/vault/webapp-testing/scripts/with_server.py +106 -0
  359. package/templates/vault/whatsapp-cloud-api/assets/boilerplate/nodejs/src/index.ts +125 -0
  360. package/templates/vault/whatsapp-cloud-api/assets/boilerplate/nodejs/src/template-manager.ts +67 -0
  361. package/templates/vault/whatsapp-cloud-api/assets/boilerplate/nodejs/src/types.ts +216 -0
  362. package/templates/vault/whatsapp-cloud-api/assets/boilerplate/nodejs/src/webhook-handler.ts +173 -0
  363. package/templates/vault/whatsapp-cloud-api/assets/boilerplate/nodejs/src/whatsapp-client.ts +193 -0
  364. package/templates/vault/whatsapp-cloud-api/scripts/send_test_message.py +137 -0
  365. package/templates/vault/whatsapp-cloud-api/scripts/setup_project.py +118 -0
  366. package/templates/vault/whatsapp-cloud-api/scripts/validate_config.py +190 -0
  367. package/templates/vault/youtube-summarizer/scripts/extract-transcript.py +65 -0
  368. package/templates/vault/youtube-summarizer/scripts/install-dependencies.sh +28 -0
@@ -0,0 +1,125 @@
1
+ import express from 'express';
2
+ import dotenv from 'dotenv';
3
+ import { WhatsAppClient } from './whatsapp-client';
4
+ import { TemplateManager } from './template-manager';
5
+ import {
6
+ validateHMAC,
7
+ rawBodyMiddleware,
8
+ handleWebhookVerification,
9
+ parseWebhookPayload,
10
+ extractMessageContent,
11
+ } from './webhook-handler';
12
+ import { WhatsAppConfig, IncomingMessage, StatusUpdate } from './types';
13
+
14
+ dotenv.config();
15
+
16
+ // === Configuration ===
17
+
18
+ const config: WhatsAppConfig = {
19
+ token: process.env.WHATSAPP_TOKEN!,
20
+ phoneNumberId: process.env.PHONE_NUMBER_ID!,
21
+ wabaId: process.env.WABA_ID!,
22
+ appSecret: process.env.APP_SECRET!,
23
+ verifyToken: process.env.VERIFY_TOKEN!,
24
+ };
25
+
26
+ const whatsapp = new WhatsAppClient(config);
27
+ const templates = new TemplateManager(config);
28
+
29
+ // === Express Setup ===
30
+
31
+ const app = express();
32
+ const PORT = process.env.PORT || 3000;
33
+
34
+ // Raw body capture MUST come before express.json()
35
+ app.use(express.json({ verify: rawBodyMiddleware }));
36
+
37
+ // === Webhook Routes ===
38
+
39
+ // GET - Webhook verification (Meta sends challenge)
40
+ app.get('/webhook', handleWebhookVerification(config.verifyToken));
41
+
42
+ // POST - Receive messages and status updates
43
+ app.post('/webhook', validateHMAC(config.appSecret), async (req, res) => {
44
+ // Respond 200 immediately (WhatsApp requires response within 5 seconds)
45
+ res.sendStatus(200);
46
+
47
+ try {
48
+ const { messages, statuses } = parseWebhookPayload(req.body);
49
+
50
+ for (const message of messages) {
51
+ await handleIncomingMessage(message);
52
+ }
53
+
54
+ for (const status of statuses) {
55
+ handleStatusUpdate(status);
56
+ }
57
+ } catch (error) {
58
+ console.error('Error processing webhook:', error);
59
+ }
60
+ });
61
+
62
+ // === Message Handler ===
63
+
64
+ async function handleIncomingMessage(message: IncomingMessage): Promise<void> {
65
+ const from = message.from;
66
+ const content = extractMessageContent(message);
67
+
68
+ console.log(`Message from ${from}: [${content.type}] ${content.text || content.buttonId || ''}`);
69
+
70
+ // Mark as read
71
+ await whatsapp.markAsRead(message.id);
72
+
73
+ // TODO: Implement your message handling logic here
74
+ // Example: Echo back the message
75
+ switch (content.type) {
76
+ case 'text':
77
+ await whatsapp.sendText(from, `Recebi sua mensagem: "${content.text}"`);
78
+ break;
79
+
80
+ case 'button':
81
+ await whatsapp.sendText(from, `Voce selecionou: ${content.text}`);
82
+ break;
83
+
84
+ case 'list':
85
+ await whatsapp.sendText(from, `Voce escolheu: ${content.text}`);
86
+ break;
87
+
88
+ case 'image':
89
+ case 'document':
90
+ case 'video':
91
+ case 'audio':
92
+ await whatsapp.sendText(from, `Recebi sua midia (${content.type}).`);
93
+ break;
94
+
95
+ default:
96
+ await whatsapp.sendText(from, 'Desculpe, nao entendi. Como posso ajudar?');
97
+ break;
98
+ }
99
+ }
100
+
101
+ // === Status Handler ===
102
+
103
+ function handleStatusUpdate(status: StatusUpdate): void {
104
+ console.log(`Status update: ${status.id} -> ${status.status}`);
105
+
106
+ if (status.status === 'failed') {
107
+ console.error(`Message delivery failed:`, status.errors);
108
+ }
109
+ }
110
+
111
+ // === Health Check ===
112
+
113
+ app.get('/health', (_req, res) => {
114
+ res.json({ status: 'ok', timestamp: new Date().toISOString() });
115
+ });
116
+
117
+ // === Start Server ===
118
+
119
+ app.listen(PORT, () => {
120
+ console.log(`WhatsApp webhook server running on port ${PORT}`);
121
+ console.log(`Webhook URL: http://localhost:${PORT}/webhook`);
122
+ console.log(`Health check: http://localhost:${PORT}/health`);
123
+ });
124
+
125
+ export { whatsapp, templates };
@@ -0,0 +1,67 @@
1
+ import axios, { AxiosInstance } from 'axios';
2
+ import { WhatsAppConfig, TemplateInfo } from './types';
3
+
4
+ export class TemplateManager {
5
+ private client: AxiosInstance;
6
+ private wabaId: string;
7
+
8
+ constructor(config: WhatsAppConfig) {
9
+ const version = config.graphApiVersion || 'v21.0';
10
+ this.wabaId = config.wabaId;
11
+
12
+ this.client = axios.create({
13
+ baseURL: `https://graph.facebook.com/${version}`,
14
+ headers: {
15
+ Authorization: `Bearer ${config.token}`,
16
+ 'Content-Type': 'application/json',
17
+ },
18
+ });
19
+ }
20
+
21
+ async listTemplates(status?: string): Promise<TemplateInfo[]> {
22
+ const params: Record<string, any> = { limit: 100 };
23
+ if (status) params.status = status;
24
+
25
+ const response = await this.client.get(`/${this.wabaId}/message_templates`, { params });
26
+ return response.data.data;
27
+ }
28
+
29
+ async createTemplate(
30
+ name: string,
31
+ category: 'MARKETING' | 'UTILITY' | 'AUTHENTICATION',
32
+ language: string,
33
+ components: Array<{
34
+ type: 'HEADER' | 'BODY' | 'FOOTER' | 'BUTTONS';
35
+ format?: string;
36
+ text?: string;
37
+ example?: Record<string, any>;
38
+ buttons?: Array<Record<string, any>>;
39
+ }>
40
+ ): Promise<{ id: string; status: string; category: string }> {
41
+ const response = await this.client.post(`/${this.wabaId}/message_templates`, {
42
+ name,
43
+ category,
44
+ language,
45
+ components,
46
+ });
47
+ return response.data;
48
+ }
49
+
50
+ async deleteTemplate(templateName: string): Promise<void> {
51
+ await this.client.delete(`/${this.wabaId}/message_templates`, {
52
+ data: { name: templateName },
53
+ });
54
+ }
55
+
56
+ async getApprovedTemplates(): Promise<TemplateInfo[]> {
57
+ return this.listTemplates('APPROVED');
58
+ }
59
+
60
+ async getPendingTemplates(): Promise<TemplateInfo[]> {
61
+ return this.listTemplates('PENDING');
62
+ }
63
+
64
+ async getRejectedTemplates(): Promise<TemplateInfo[]> {
65
+ return this.listTemplates('REJECTED');
66
+ }
67
+ }
@@ -0,0 +1,216 @@
1
+ // WhatsApp Cloud API TypeScript Types
2
+
3
+ // === Configuration ===
4
+
5
+ export interface WhatsAppConfig {
6
+ token: string;
7
+ phoneNumberId: string;
8
+ wabaId: string;
9
+ appSecret: string;
10
+ verifyToken: string;
11
+ graphApiVersion?: string;
12
+ }
13
+
14
+ // === Outgoing Messages ===
15
+
16
+ export interface SendMessagePayload {
17
+ messaging_product: 'whatsapp';
18
+ recipient_type?: 'individual';
19
+ to: string;
20
+ type: MessageType;
21
+ text?: { preview_url?: boolean; body: string };
22
+ template?: TemplatePayload;
23
+ image?: MediaPayload;
24
+ document?: DocumentPayload;
25
+ video?: MediaPayload;
26
+ audio?: MediaPayload;
27
+ location?: LocationPayload;
28
+ contacts?: ContactPayload[];
29
+ interactive?: InteractivePayload;
30
+ reaction?: ReactionPayload;
31
+ context?: { message_id: string };
32
+ }
33
+
34
+ export type MessageType =
35
+ | 'text' | 'template' | 'image' | 'document' | 'video'
36
+ | 'audio' | 'location' | 'contacts' | 'interactive'
37
+ | 'reaction' | 'sticker';
38
+
39
+ export interface TemplatePayload {
40
+ name: string;
41
+ language: { code: string };
42
+ components?: TemplateComponent[];
43
+ }
44
+
45
+ export interface TemplateComponent {
46
+ type: 'header' | 'body' | 'button';
47
+ sub_type?: 'url' | 'quick_reply';
48
+ index?: number;
49
+ parameters?: TemplateParameter[];
50
+ }
51
+
52
+ export interface TemplateParameter {
53
+ type: 'text' | 'image' | 'document' | 'video';
54
+ text?: string;
55
+ image?: { link: string };
56
+ document?: { link: string; filename?: string };
57
+ video?: { link: string };
58
+ }
59
+
60
+ export interface MediaPayload {
61
+ id?: string;
62
+ link?: string;
63
+ caption?: string;
64
+ }
65
+
66
+ export interface DocumentPayload extends MediaPayload {
67
+ filename?: string;
68
+ }
69
+
70
+ export interface LocationPayload {
71
+ longitude: number;
72
+ latitude: number;
73
+ name?: string;
74
+ address?: string;
75
+ }
76
+
77
+ export interface ContactPayload {
78
+ name: { formatted_name: string; first_name?: string; last_name?: string };
79
+ phones?: Array<{ phone: string; type?: string }>;
80
+ emails?: Array<{ email: string; type?: string }>;
81
+ }
82
+
83
+ export interface InteractivePayload {
84
+ type: 'button' | 'list' | 'product' | 'product_list' | 'flow';
85
+ header?: { type: 'text' | 'image' | 'video' | 'document'; text?: string };
86
+ body: { text: string };
87
+ footer?: { text: string };
88
+ action: InteractiveAction;
89
+ }
90
+
91
+ export interface InteractiveAction {
92
+ buttons?: Array<{
93
+ type: 'reply';
94
+ reply: { id: string; title: string };
95
+ }>;
96
+ button?: string;
97
+ sections?: Array<{
98
+ title: string;
99
+ rows: Array<{ id: string; title: string; description?: string }>;
100
+ }>;
101
+ catalog_id?: string;
102
+ product_retailer_id?: string;
103
+ name?: string;
104
+ parameters?: Record<string, any>;
105
+ }
106
+
107
+ export interface ReactionPayload {
108
+ message_id: string;
109
+ emoji: string;
110
+ }
111
+
112
+ // === API Responses ===
113
+
114
+ export interface SendMessageResponse {
115
+ messaging_product: string;
116
+ contacts: Array<{ input: string; wa_id: string }>;
117
+ messages: Array<{ id: string }>;
118
+ }
119
+
120
+ // === Webhook Events ===
121
+
122
+ export interface WebhookPayload {
123
+ object: string;
124
+ entry: WebhookEntry[];
125
+ }
126
+
127
+ export interface WebhookEntry {
128
+ id: string;
129
+ changes: WebhookChange[];
130
+ }
131
+
132
+ export interface WebhookChange {
133
+ value: WebhookValue;
134
+ field: string;
135
+ }
136
+
137
+ export interface WebhookValue {
138
+ messaging_product: string;
139
+ metadata: { display_phone_number: string; phone_number_id: string };
140
+ contacts?: Array<{ profile: { name: string }; wa_id: string }>;
141
+ messages?: IncomingMessage[];
142
+ statuses?: StatusUpdate[];
143
+ errors?: WebhookError[];
144
+ }
145
+
146
+ export interface IncomingMessage {
147
+ from: string;
148
+ id: string;
149
+ timestamp: string;
150
+ type: string;
151
+ text?: { body: string };
152
+ image?: { id: string; mime_type: string; sha256: string; caption?: string };
153
+ document?: { id: string; mime_type: string; filename: string; caption?: string };
154
+ video?: { id: string; mime_type: string; caption?: string };
155
+ audio?: { id: string; mime_type: string };
156
+ location?: { latitude: number; longitude: number; name?: string; address?: string };
157
+ contacts?: ContactPayload[];
158
+ interactive?: {
159
+ type: 'button_reply' | 'list_reply' | 'nfm_reply';
160
+ button_reply?: { id: string; title: string };
161
+ list_reply?: { id: string; title: string; description?: string };
162
+ nfm_reply?: { response_json: string };
163
+ };
164
+ reaction?: { message_id: string; emoji: string };
165
+ context?: { from: string; id: string };
166
+ referral?: {
167
+ source_url: string;
168
+ source_type: string;
169
+ source_id: string;
170
+ headline?: string;
171
+ body?: string;
172
+ ctwa_clid?: string;
173
+ };
174
+ }
175
+
176
+ export interface StatusUpdate {
177
+ id: string;
178
+ status: 'sent' | 'delivered' | 'read' | 'failed';
179
+ timestamp: string;
180
+ recipient_id: string;
181
+ conversation?: {
182
+ id: string;
183
+ origin: { type: string };
184
+ expiration_timestamp?: string;
185
+ };
186
+ pricing?: {
187
+ billable: boolean;
188
+ pricing_model: string;
189
+ category: string;
190
+ };
191
+ errors?: Array<{ code: number; title: string; message: string }>;
192
+ }
193
+
194
+ export interface WebhookError {
195
+ code: number;
196
+ title: string;
197
+ message: string;
198
+ error_data?: { details: string };
199
+ }
200
+
201
+ // === Template Management ===
202
+
203
+ export interface TemplateInfo {
204
+ name: string;
205
+ status: 'APPROVED' | 'PENDING' | 'REJECTED' | 'PAUSED' | 'DISABLED';
206
+ category: 'MARKETING' | 'UTILITY' | 'AUTHENTICATION';
207
+ language: string;
208
+ components: Array<{
209
+ type: string;
210
+ format?: string;
211
+ text?: string;
212
+ buttons?: Array<{ type: string; text: string; url?: string }>;
213
+ }>;
214
+ id: string;
215
+ rejected_reason?: string;
216
+ }
@@ -0,0 +1,173 @@
1
+ import crypto from 'crypto';
2
+ import { Request, Response, NextFunction } from 'express';
3
+ import { WebhookPayload, IncomingMessage, StatusUpdate } from './types';
4
+
5
+ /**
6
+ * Middleware para validar assinatura HMAC-SHA256 dos webhooks do WhatsApp.
7
+ *
8
+ * A Meta assina cada request com o App Secret. Validar esta assinatura
9
+ * previne que requests falsificados sejam processados. Usar comparacao
10
+ * constant-time previne timing attacks.
11
+ *
12
+ * IMPORTANTE: Este middleware deve ser aplicado ANTES de qualquer body parser
13
+ * que altere o raw body (express.json() por exemplo).
14
+ */
15
+ export function validateHMAC(appSecret: string) {
16
+ return (req: Request, res: Response, next: NextFunction): void => {
17
+ const signature = req.headers['x-hub-signature-256'] as string;
18
+
19
+ if (!signature) {
20
+ console.warn('Webhook request without signature header');
21
+ res.sendStatus(401);
22
+ return;
23
+ }
24
+
25
+ const rawBody = (req as any).rawBody;
26
+ if (!rawBody) {
27
+ console.error('Raw body not available. Ensure rawBody middleware is configured.');
28
+ res.sendStatus(500);
29
+ return;
30
+ }
31
+
32
+ const expectedSignature =
33
+ 'sha256=' +
34
+ crypto.createHmac('sha256', appSecret).update(rawBody).digest('hex');
35
+
36
+ const isValid = crypto.timingSafeEqual(
37
+ Buffer.from(signature),
38
+ Buffer.from(expectedSignature)
39
+ );
40
+
41
+ if (!isValid) {
42
+ console.warn('Invalid webhook signature');
43
+ res.sendStatus(401);
44
+ return;
45
+ }
46
+
47
+ next();
48
+ };
49
+ }
50
+
51
+ /**
52
+ * Middleware para capturar o raw body antes do JSON parse.
53
+ * Necessario para validacao HMAC.
54
+ */
55
+ export function rawBodyMiddleware(req: Request, _res: Response, buf: Buffer): void {
56
+ (req as any).rawBody = buf;
57
+ }
58
+
59
+ /**
60
+ * Handler de verificacao do webhook (GET).
61
+ * A Meta envia um challenge que deve ser retornado para confirmar o endpoint.
62
+ */
63
+ export function handleWebhookVerification(verifyToken: string) {
64
+ return (req: Request, res: Response): void => {
65
+ const mode = req.query['hub.mode'] as string;
66
+ const token = req.query['hub.verify_token'] as string;
67
+ const challenge = req.query['hub.challenge'] as string;
68
+
69
+ if (mode === 'subscribe' && token === verifyToken) {
70
+ console.log('Webhook verified successfully');
71
+ res.status(200).send(challenge);
72
+ } else {
73
+ console.warn('Webhook verification failed: invalid token');
74
+ res.sendStatus(403);
75
+ }
76
+ };
77
+ }
78
+
79
+ /**
80
+ * Extrai mensagens e status updates do payload do webhook.
81
+ */
82
+ export function parseWebhookPayload(payload: WebhookPayload): {
83
+ messages: IncomingMessage[];
84
+ statuses: StatusUpdate[];
85
+ } {
86
+ const messages: IncomingMessage[] = [];
87
+ const statuses: StatusUpdate[] = [];
88
+
89
+ for (const entry of payload.entry || []) {
90
+ for (const change of entry.changes || []) {
91
+ if (change.value.messages) {
92
+ messages.push(...change.value.messages);
93
+ }
94
+ if (change.value.statuses) {
95
+ statuses.push(...change.value.statuses);
96
+ }
97
+ }
98
+ }
99
+
100
+ return { messages, statuses };
101
+ }
102
+
103
+ /**
104
+ * Extrai o texto ou ID de selecao de uma mensagem recebida.
105
+ */
106
+ export function extractMessageContent(message: IncomingMessage): {
107
+ type: string;
108
+ text?: string;
109
+ buttonId?: string;
110
+ listId?: string;
111
+ mediaId?: string;
112
+ location?: { latitude: number; longitude: number };
113
+ reaction?: { emoji: string; messageId: string };
114
+ } {
115
+ switch (message.type) {
116
+ case 'text':
117
+ return { type: 'text', text: message.text?.body };
118
+
119
+ case 'interactive':
120
+ if (message.interactive?.type === 'button_reply') {
121
+ return {
122
+ type: 'button',
123
+ buttonId: message.interactive.button_reply?.id,
124
+ text: message.interactive.button_reply?.title,
125
+ };
126
+ }
127
+ if (message.interactive?.type === 'list_reply') {
128
+ return {
129
+ type: 'list',
130
+ listId: message.interactive.list_reply?.id,
131
+ text: message.interactive.list_reply?.title,
132
+ };
133
+ }
134
+ if (message.interactive?.type === 'nfm_reply') {
135
+ return {
136
+ type: 'flow',
137
+ text: message.interactive.nfm_reply?.response_json,
138
+ };
139
+ }
140
+ return { type: 'interactive' };
141
+
142
+ case 'image':
143
+ return { type: 'image', mediaId: message.image?.id };
144
+
145
+ case 'document':
146
+ return { type: 'document', mediaId: message.document?.id };
147
+
148
+ case 'video':
149
+ return { type: 'video', mediaId: message.video?.id };
150
+
151
+ case 'audio':
152
+ return { type: 'audio', mediaId: message.audio?.id };
153
+
154
+ case 'location':
155
+ return {
156
+ type: 'location',
157
+ location: message.location
158
+ ? { latitude: message.location.latitude, longitude: message.location.longitude }
159
+ : undefined,
160
+ };
161
+
162
+ case 'reaction':
163
+ return {
164
+ type: 'reaction',
165
+ reaction: message.reaction
166
+ ? { emoji: message.reaction.emoji, messageId: message.reaction.message_id }
167
+ : undefined,
168
+ };
169
+
170
+ default:
171
+ return { type: message.type };
172
+ }
173
+ }