@hed-hog/core 0.0.387 → 0.0.393
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +51 -11
- package/dist/access-log/access-log.controller.d.ts.map +1 -1
- package/dist/access-log/access-log.controller.js +1 -1
- package/dist/access-log/access-log.controller.js.map +1 -1
- package/dist/access-log/access-log.interceptor.d.ts.map +1 -1
- package/dist/access-log/access-log.interceptor.js +11 -6
- package/dist/access-log/access-log.interceptor.js.map +1 -1
- package/dist/access-log/access-log.service.d.ts +4 -0
- package/dist/access-log/access-log.service.d.ts.map +1 -1
- package/dist/access-log/access-log.service.js +31 -4
- package/dist/access-log/access-log.service.js.map +1 -1
- package/dist/access-log/dto/query-access-log.dto.d.ts +2 -0
- package/dist/access-log/dto/query-access-log.dto.d.ts.map +1 -1
- package/dist/access-log/dto/query-access-log.dto.js +5 -0
- package/dist/access-log/dto/query-access-log.dto.js.map +1 -1
- package/dist/ai/ai-attachment.fragments.d.ts +23 -0
- package/dist/ai/ai-attachment.fragments.d.ts.map +1 -0
- package/dist/ai/ai-attachment.fragments.js +34 -0
- package/dist/ai/ai-attachment.fragments.js.map +1 -0
- package/dist/ai/ai.controller.d.ts +12 -17
- package/dist/ai/ai.controller.d.ts.map +1 -1
- package/dist/ai/ai.controller.js +17 -2
- package/dist/ai/ai.controller.js.map +1 -1
- package/dist/ai/ai.module.d.ts.map +1 -1
- package/dist/ai/ai.module.js +3 -2
- package/dist/ai/ai.module.js.map +1 -1
- package/dist/ai/ai.prompts.d.ts +16 -0
- package/dist/ai/ai.prompts.d.ts.map +1 -0
- package/dist/ai/ai.prompts.js +37 -0
- package/dist/ai/ai.prompts.js.map +1 -0
- package/dist/ai/ai.service.d.ts +92 -12
- package/dist/ai/ai.service.d.ts.map +1 -1
- package/dist/ai/ai.service.js +309 -88
- package/dist/ai/ai.service.js.map +1 -1
- package/dist/ai/dto/chat.dto.d.ts +4 -1
- package/dist/ai/dto/chat.dto.d.ts.map +1 -1
- package/dist/ai/dto/chat.dto.js +23 -1
- package/dist/ai/dto/chat.dto.js.map +1 -1
- package/dist/ai/dto/create-agent.dto.d.ts +1 -1
- package/dist/ai/dto/create-agent.dto.d.ts.map +1 -1
- package/dist/ai/dto/create-agent.dto.js +1 -1
- package/dist/ai/dto/create-agent.dto.js.map +1 -1
- package/dist/ai/dto/richtext-edit-html.dto.d.ts +5 -0
- package/dist/ai/dto/richtext-edit-html.dto.d.ts.map +1 -0
- package/dist/ai/dto/richtext-edit-html.dto.js +27 -0
- package/dist/ai/dto/richtext-edit-html.dto.js.map +1 -0
- package/dist/ai/dto/update-agent.dto.d.ts +1 -1
- package/dist/ai/dto/update-agent.dto.d.ts.map +1 -1
- package/dist/ai/dto/update-agent.dto.js +1 -1
- package/dist/ai/dto/update-agent.dto.js.map +1 -1
- package/dist/ai/richtext-ai.prompts.d.ts +5 -0
- package/dist/ai/richtext-ai.prompts.d.ts.map +1 -0
- package/dist/ai/richtext-ai.prompts.js +57 -0
- package/dist/ai/richtext-ai.prompts.js.map +1 -0
- package/dist/ai/richtext-ai.service.d.ts +34 -0
- package/dist/ai/richtext-ai.service.d.ts.map +1 -0
- package/dist/ai/richtext-ai.service.js +95 -0
- package/dist/ai/richtext-ai.service.js.map +1 -0
- package/dist/ai-instruction/ai-instruction.controller.d.ts +59 -5
- package/dist/ai-instruction/ai-instruction.controller.d.ts.map +1 -1
- package/dist/ai-instruction/ai-instruction.controller.js +63 -20
- package/dist/ai-instruction/ai-instruction.controller.js.map +1 -1
- package/dist/ai-instruction/ai-instruction.module.d.ts.map +1 -1
- package/dist/ai-instruction/ai-instruction.module.js +13 -2
- package/dist/ai-instruction/ai-instruction.module.js.map +1 -1
- package/dist/ai-instruction/ai-instruction.service.d.ts +131 -6
- package/dist/ai-instruction/ai-instruction.service.d.ts.map +1 -1
- package/dist/ai-instruction/ai-instruction.service.js +533 -60
- package/dist/ai-instruction/ai-instruction.service.js.map +1 -1
- package/dist/ai-instruction/ai-prompt-builder.service.d.ts +8 -0
- package/dist/ai-instruction/ai-prompt-builder.service.d.ts.map +1 -1
- package/dist/ai-instruction/ai-prompt-builder.service.js +10 -1
- package/dist/ai-instruction/ai-prompt-builder.service.js.map +1 -1
- package/dist/ai-instruction/ai-prompt-registry.d.ts +45 -0
- package/dist/ai-instruction/ai-prompt-registry.d.ts.map +1 -0
- package/dist/ai-instruction/ai-prompt-registry.js +49 -0
- package/dist/ai-instruction/ai-prompt-registry.js.map +1 -0
- package/dist/ai-instruction/ai-prompt-resolver.service.d.ts +89 -0
- package/dist/ai-instruction/ai-prompt-resolver.service.d.ts.map +1 -0
- package/dist/ai-instruction/ai-prompt-resolver.service.js +222 -0
- package/dist/ai-instruction/ai-prompt-resolver.service.js.map +1 -0
- package/dist/ai-instruction/ai-prompt-template.util.d.ts +70 -0
- package/dist/ai-instruction/ai-prompt-template.util.d.ts.map +1 -0
- package/dist/ai-instruction/ai-prompt-template.util.js +154 -0
- package/dist/ai-instruction/ai-prompt-template.util.js.map +1 -0
- package/dist/ai-instruction/dto/create-ai-instruction.dto.d.ts +5 -0
- package/dist/ai-instruction/dto/create-ai-instruction.dto.d.ts.map +1 -1
- package/dist/ai-instruction/dto/create-ai-instruction.dto.js +27 -1
- package/dist/ai-instruction/dto/create-ai-instruction.dto.js.map +1 -1
- package/dist/ai-instruction/dto/preview-ai-instruction.dto.d.ts +14 -0
- package/dist/ai-instruction/dto/preview-ai-instruction.dto.d.ts.map +1 -0
- package/dist/ai-instruction/dto/preview-ai-instruction.dto.js +42 -0
- package/dist/ai-instruction/dto/preview-ai-instruction.dto.js.map +1 -0
- package/dist/ai-instruction/dto/update-ai-instruction.dto.d.ts +11 -0
- package/dist/ai-instruction/dto/update-ai-instruction.dto.d.ts.map +1 -1
- package/dist/ai-instruction/dto/update-ai-instruction.dto.js +34 -0
- package/dist/ai-instruction/dto/update-ai-instruction.dto.js.map +1 -1
- package/dist/ai-instruction/types/ai-instruction.types.d.ts +13 -1
- package/dist/ai-instruction/types/ai-instruction.types.d.ts.map +1 -1
- package/dist/ai-instruction/types/ai-instruction.types.js +10 -0
- package/dist/ai-instruction/types/ai-instruction.types.js.map +1 -1
- package/dist/auth/auth.controller.d.ts +89 -15
- package/dist/auth/auth.controller.d.ts.map +1 -1
- package/dist/auth/auth.controller.js +116 -44
- package/dist/auth/auth.controller.js.map +1 -1
- package/dist/auth/auth.module.d.ts.map +1 -1
- package/dist/auth/auth.module.js +2 -0
- package/dist/auth/auth.module.js.map +1 -1
- package/dist/auth/auth.service.d.ts +169 -12
- package/dist/auth/auth.service.d.ts.map +1 -1
- package/dist/auth/auth.service.js +314 -67
- package/dist/auth/auth.service.js.map +1 -1
- package/dist/auth/dto/confirm-email.dto.d.ts +4 -0
- package/dist/auth/dto/confirm-email.dto.d.ts.map +1 -0
- package/dist/auth/dto/confirm-email.dto.js +22 -0
- package/dist/auth/dto/confirm-email.dto.js.map +1 -0
- package/dist/auth/dto/resend-confirmation.dto.d.ts +8 -0
- package/dist/auth/dto/resend-confirmation.dto.d.ts.map +1 -0
- package/dist/auth/dto/resend-confirmation.dto.js +36 -0
- package/dist/auth/dto/resend-confirmation.dto.js.map +1 -0
- package/dist/authorize/authorize.controller.d.ts +1 -1
- package/dist/authorize/authorize.controller.d.ts.map +1 -1
- package/dist/authorize/authorize.controller.js +4 -2
- package/dist/authorize/authorize.controller.js.map +1 -1
- package/dist/authorize/authorize.service.d.ts +7 -0
- package/dist/authorize/authorize.service.d.ts.map +1 -1
- package/dist/authorize/authorize.service.js +1 -1
- package/dist/authorize/authorize.service.js.map +1 -1
- package/dist/captcha/captcha.module.d.ts +3 -0
- package/dist/captcha/captcha.module.d.ts.map +1 -0
- package/dist/captcha/captcha.module.js +23 -0
- package/dist/captcha/captcha.module.js.map +1 -0
- package/dist/captcha/captcha.service.d.ts +38 -0
- package/dist/captcha/captcha.service.d.ts.map +1 -0
- package/dist/captcha/captcha.service.js +144 -0
- package/dist/captcha/captcha.service.js.map +1 -0
- package/dist/challenge/challenge.service.d.ts +31 -9
- package/dist/challenge/challenge.service.d.ts.map +1 -1
- package/dist/challenge/challenge.service.js +111 -16
- package/dist/challenge/challenge.service.js.map +1 -1
- package/dist/core.module.d.ts +3 -1
- package/dist/core.module.d.ts.map +1 -1
- package/dist/core.module.js +46 -2
- package/dist/core.module.js.map +1 -1
- package/dist/dashboard/dashboard/dashboard.controller.d.ts +21 -21
- package/dist/dashboard/dashboard/dashboard.service.d.ts +21 -21
- package/dist/dashboard/dashboard-component/dashboard-component.controller.d.ts +10 -10
- package/dist/dashboard/dashboard-component/dashboard-component.service.d.ts +10 -10
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.controller.d.ts +20 -20
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.d.ts +20 -20
- package/dist/dashboard/dashboard-core/dashboard-core.controller.d.ts +3 -3
- package/dist/dashboard/dashboard-core/dashboard-core.service.d.ts +3 -3
- package/dist/dashboard/dashboard-item/dashboard-item.controller.d.ts +2 -2
- package/dist/dashboard/dashboard-item/dashboard-item.service.d.ts +2 -2
- package/dist/dashboard/dashboard-role/dashboard-role.controller.d.ts +13 -13
- package/dist/dashboard/dashboard-role/dashboard-role.service.d.ts +13 -13
- package/dist/file/file.controller.d.ts +8 -1
- package/dist/file/file.controller.d.ts.map +1 -1
- package/dist/file/file.controller.js +45 -7
- package/dist/file/file.controller.js.map +1 -1
- package/dist/file/file.service.d.ts +134 -1
- package/dist/file/file.service.d.ts.map +1 -1
- package/dist/file/file.service.js +363 -12
- package/dist/file/file.service.js.map +1 -1
- package/dist/file/image-optimization.service.d.ts +43 -0
- package/dist/file/image-optimization.service.d.ts.map +1 -1
- package/dist/file/image-optimization.service.js +154 -0
- package/dist/file/image-optimization.service.js.map +1 -1
- package/dist/file/provider/abstract.provider.d.ts +16 -0
- package/dist/file/provider/abstract.provider.d.ts.map +1 -1
- package/dist/file/provider/abstract.provider.js +4 -0
- package/dist/file/provider/abstract.provider.js.map +1 -1
- package/dist/file/provider/gcs.provider.d.ts +2 -0
- package/dist/file/provider/gcs.provider.d.ts.map +1 -1
- package/dist/file/provider/gcs.provider.js +10 -0
- package/dist/file/provider/gcs.provider.js.map +1 -1
- package/dist/file/provider/local.provider.d.ts +1 -0
- package/dist/file/provider/local.provider.d.ts.map +1 -1
- package/dist/file/provider/local.provider.js +13 -0
- package/dist/file/provider/local.provider.js.map +1 -1
- package/dist/file/provider/s3.provider.d.ts +5 -0
- package/dist/file/provider/s3.provider.d.ts.map +1 -1
- package/dist/file/provider/s3.provider.js +15 -0
- package/dist/file/provider/s3.provider.js.map +1 -1
- package/dist/file/provider/spaces.provider.d.ts +5 -0
- package/dist/file/provider/spaces.provider.d.ts.map +1 -1
- package/dist/file/provider/spaces.provider.js +16 -0
- package/dist/file/provider/spaces.provider.js.map +1 -1
- package/dist/impersonation/dto/redeem-impersonation.dto.d.ts +4 -0
- package/dist/impersonation/dto/redeem-impersonation.dto.d.ts.map +1 -0
- package/dist/impersonation/dto/redeem-impersonation.dto.js +23 -0
- package/dist/impersonation/dto/redeem-impersonation.dto.js.map +1 -0
- package/dist/impersonation/dto/start-impersonation.dto.d.ts +7 -0
- package/dist/impersonation/dto/start-impersonation.dto.d.ts.map +1 -0
- package/dist/impersonation/dto/start-impersonation.dto.js +27 -0
- package/dist/impersonation/dto/start-impersonation.dto.js.map +1 -0
- package/dist/impersonation/impersonation-restrictions.d.ts +26 -0
- package/dist/impersonation/impersonation-restrictions.d.ts.map +1 -0
- package/dist/impersonation/impersonation-restrictions.js +76 -0
- package/dist/impersonation/impersonation-restrictions.js.map +1 -0
- package/dist/impersonation/impersonation.controller.d.ts +90 -0
- package/dist/impersonation/impersonation.controller.d.ts.map +1 -0
- package/dist/impersonation/impersonation.controller.js +135 -0
- package/dist/impersonation/impersonation.controller.js.map +1 -0
- package/dist/impersonation/impersonation.module.d.ts +8 -0
- package/dist/impersonation/impersonation.module.d.ts.map +1 -0
- package/dist/impersonation/impersonation.module.js +44 -0
- package/dist/impersonation/impersonation.module.js.map +1 -0
- package/dist/impersonation/impersonation.service.d.ts +164 -0
- package/dist/impersonation/impersonation.service.d.ts.map +1 -0
- package/dist/impersonation/impersonation.service.js +408 -0
- package/dist/impersonation/impersonation.service.js.map +1 -0
- package/dist/incident/incident-notifier.service.d.ts +36 -0
- package/dist/incident/incident-notifier.service.d.ts.map +1 -0
- package/dist/incident/incident-notifier.service.js +208 -0
- package/dist/incident/incident-notifier.service.js.map +1 -0
- package/dist/incident/incident.controller.d.ts +23 -0
- package/dist/incident/incident.controller.d.ts.map +1 -0
- package/dist/incident/incident.controller.js +75 -0
- package/dist/incident/incident.controller.js.map +1 -0
- package/dist/incident/incident.module.d.ts +7 -0
- package/dist/incident/incident.module.d.ts.map +1 -0
- package/dist/incident/incident.module.js +32 -0
- package/dist/incident/incident.module.js.map +1 -0
- package/dist/incident/incident.service.d.ts +72 -0
- package/dist/incident/incident.service.d.ts.map +1 -0
- package/dist/incident/incident.service.js +184 -0
- package/dist/incident/incident.service.js.map +1 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -1
- package/dist/integration/services/outbox-polling.coordinator.d.ts +2 -0
- package/dist/integration/services/outbox-polling.coordinator.d.ts.map +1 -1
- package/dist/integration/services/outbox-polling.coordinator.js +50 -30
- package/dist/integration/services/outbox-polling.coordinator.js.map +1 -1
- package/dist/integration/services/outbox.service.d.ts.map +1 -1
- package/dist/integration/services/outbox.service.js +5 -1
- package/dist/integration/services/outbox.service.js.map +1 -1
- package/dist/integration-profile/dto/test.dto.d.ts +13 -0
- package/dist/integration-profile/dto/test.dto.d.ts.map +1 -0
- package/dist/integration-profile/dto/test.dto.js +26 -0
- package/dist/integration-profile/dto/test.dto.js.map +1 -0
- package/dist/integration-profile/integration-profile.controller.d.ts +12 -1
- package/dist/integration-profile/integration-profile.controller.d.ts.map +1 -1
- package/dist/integration-profile/integration-profile.controller.js +9 -1
- package/dist/integration-profile/integration-profile.controller.js.map +1 -1
- package/dist/integration-profile/integration-profile.module.d.ts +6 -1
- package/dist/integration-profile/integration-profile.module.d.ts.map +1 -1
- package/dist/integration-profile/integration-profile.module.js +26 -3
- package/dist/integration-profile/integration-profile.module.js.map +1 -1
- package/dist/integration-profile/integration-profile.secrets.d.ts.map +1 -1
- package/dist/integration-profile/integration-profile.secrets.js +12 -1
- package/dist/integration-profile/integration-profile.secrets.js.map +1 -1
- package/dist/integration-profile/integration-profile.service.d.ts +26 -7
- package/dist/integration-profile/integration-profile.service.d.ts.map +1 -1
- package/dist/integration-profile/integration-profile.service.js +94 -91
- package/dist/integration-profile/integration-profile.service.js.map +1 -1
- package/dist/integration-profile/integration-profile.utils.d.ts +27 -1
- package/dist/integration-profile/integration-profile.utils.d.ts.map +1 -1
- package/dist/integration-profile/integration-profile.utils.js +46 -5
- package/dist/integration-profile/integration-profile.utils.js.map +1 -1
- package/dist/integration-profile/testers/ai.testers.d.ts +3 -0
- package/dist/integration-profile/testers/ai.testers.d.ts.map +1 -0
- package/dist/integration-profile/testers/ai.testers.js +125 -0
- package/dist/integration-profile/testers/ai.testers.js.map +1 -0
- package/dist/integration-profile/testers/captcha.testers.d.ts +3 -0
- package/dist/integration-profile/testers/captcha.testers.d.ts.map +1 -0
- package/dist/integration-profile/testers/captcha.testers.js +121 -0
- package/dist/integration-profile/testers/captcha.testers.js.map +1 -0
- package/dist/integration-profile/testers/email.testers.d.ts +3 -0
- package/dist/integration-profile/testers/email.testers.d.ts.map +1 -0
- package/dist/integration-profile/testers/email.testers.js +156 -0
- package/dist/integration-profile/testers/email.testers.js.map +1 -0
- package/dist/integration-profile/testers/http-probe.d.ts +57 -0
- package/dist/integration-profile/testers/http-probe.d.ts.map +1 -0
- package/dist/integration-profile/testers/http-probe.js +140 -0
- package/dist/integration-profile/testers/http-probe.js.map +1 -0
- package/dist/integration-profile/testers/index.d.ts +12 -0
- package/dist/integration-profile/testers/index.d.ts.map +1 -0
- package/dist/integration-profile/testers/index.js +45 -0
- package/dist/integration-profile/testers/index.js.map +1 -0
- package/dist/integration-profile/testers/infrastructure.testers.d.ts +3 -0
- package/dist/integration-profile/testers/infrastructure.testers.d.ts.map +1 -0
- package/dist/integration-profile/testers/infrastructure.testers.js +105 -0
- package/dist/integration-profile/testers/infrastructure.testers.js.map +1 -0
- package/dist/integration-profile/testers/integration-tester.registry.d.ts +17 -0
- package/dist/integration-profile/testers/integration-tester.registry.d.ts.map +1 -0
- package/dist/integration-profile/testers/integration-tester.registry.js +52 -0
- package/dist/integration-profile/testers/integration-tester.registry.js.map +1 -0
- package/dist/integration-profile/testers/integration-tester.types.d.ts +55 -0
- package/dist/integration-profile/testers/integration-tester.types.d.ts.map +1 -0
- package/dist/integration-profile/testers/integration-tester.types.js +16 -0
- package/dist/integration-profile/testers/integration-tester.types.js.map +1 -0
- package/dist/integration-profile/testers/messaging.testers.d.ts +3 -0
- package/dist/integration-profile/testers/messaging.testers.d.ts.map +1 -0
- package/dist/integration-profile/testers/messaging.testers.js +70 -0
- package/dist/integration-profile/testers/messaging.testers.js.map +1 -0
- package/dist/integration-profile/testers/oauth.testers.d.ts +3 -0
- package/dist/integration-profile/testers/oauth.testers.d.ts.map +1 -0
- package/dist/integration-profile/testers/oauth.testers.js +285 -0
- package/dist/integration-profile/testers/oauth.testers.js.map +1 -0
- package/dist/integration-profile/testers/payment.testers.d.ts +3 -0
- package/dist/integration-profile/testers/payment.testers.d.ts.map +1 -0
- package/dist/integration-profile/testers/payment.testers.js +169 -0
- package/dist/integration-profile/testers/payment.testers.js.map +1 -0
- package/dist/integration-profile/testers/storage.testers.d.ts +3 -0
- package/dist/integration-profile/testers/storage.testers.d.ts.map +1 -0
- package/dist/integration-profile/testers/storage.testers.js +208 -0
- package/dist/integration-profile/testers/storage.testers.js.map +1 -0
- package/dist/language/en.json +15 -2
- package/dist/language/pt.json +15 -2
- package/dist/leaked-password/leaked-password.controller.d.ts +24 -0
- package/dist/leaked-password/leaked-password.controller.d.ts.map +1 -0
- package/dist/leaked-password/leaked-password.controller.js +78 -0
- package/dist/leaked-password/leaked-password.controller.js.map +1 -0
- package/dist/leaked-password/leaked-password.module.d.ts +8 -0
- package/dist/leaked-password/leaked-password.module.d.ts.map +1 -0
- package/dist/leaked-password/leaked-password.module.js +31 -0
- package/dist/leaked-password/leaked-password.module.js.map +1 -0
- package/dist/leaked-password/leaked-password.service.d.ts +64 -0
- package/dist/leaked-password/leaked-password.service.d.ts.map +1 -0
- package/dist/leaked-password/leaked-password.service.js +218 -0
- package/dist/leaked-password/leaked-password.service.js.map +1 -0
- package/dist/locale/locale.controller.d.ts +1 -1
- package/dist/locale/locale.service.d.ts +1 -1
- package/dist/mail/dto/preview.dto.d.ts +18 -0
- package/dist/mail/dto/preview.dto.d.ts.map +1 -0
- package/dist/mail/dto/preview.dto.js +66 -0
- package/dist/mail/dto/preview.dto.js.map +1 -0
- package/dist/mail/dto/send.dto.d.ts +44 -0
- package/dist/mail/dto/send.dto.d.ts.map +1 -1
- package/dist/mail/dto/send.dto.js +20 -0
- package/dist/mail/dto/send.dto.js.map +1 -1
- package/dist/mail/mail.controller.d.ts +5 -0
- package/dist/mail/mail.controller.d.ts.map +1 -1
- package/dist/mail/mail.controller.js +16 -2
- package/dist/mail/mail.controller.js.map +1 -1
- package/dist/mail/mail.module.d.ts.map +1 -1
- package/dist/mail/mail.module.js +2 -0
- package/dist/mail/mail.module.js.map +1 -1
- package/dist/mail/mail.service.d.ts +69 -4
- package/dist/mail/mail.service.d.ts.map +1 -1
- package/dist/mail/mail.service.js +278 -37
- package/dist/mail/mail.service.js.map +1 -1
- package/dist/mail-delivery/mail-delivery-provision.service.d.ts +21 -0
- package/dist/mail-delivery/mail-delivery-provision.service.d.ts.map +1 -0
- package/dist/mail-delivery/mail-delivery-provision.service.js +64 -0
- package/dist/mail-delivery/mail-delivery-provision.service.js.map +1 -0
- package/dist/mail-delivery/mail-delivery.constants.d.ts +17 -0
- package/dist/mail-delivery/mail-delivery.constants.d.ts.map +1 -0
- package/dist/mail-delivery/mail-delivery.constants.js +31 -0
- package/dist/mail-delivery/mail-delivery.constants.js.map +1 -0
- package/dist/mail-delivery/mail-delivery.controller.d.ts +19 -0
- package/dist/mail-delivery/mail-delivery.controller.d.ts.map +1 -0
- package/dist/mail-delivery/mail-delivery.controller.js +53 -0
- package/dist/mail-delivery/mail-delivery.controller.js.map +1 -0
- package/dist/mail-delivery/mail-delivery.module.d.ts +7 -0
- package/dist/mail-delivery/mail-delivery.module.d.ts.map +1 -0
- package/dist/mail-delivery/mail-delivery.module.js +36 -0
- package/dist/mail-delivery/mail-delivery.module.js.map +1 -0
- package/dist/mail-delivery/mail-delivery.service.d.ts +38 -0
- package/dist/mail-delivery/mail-delivery.service.d.ts.map +1 -0
- package/dist/mail-delivery/mail-delivery.service.js +140 -0
- package/dist/mail-delivery/mail-delivery.service.js.map +1 -0
- package/dist/mail-delivery/ses-event.parser.d.ts +27 -0
- package/dist/mail-delivery/ses-event.parser.d.ts.map +1 -0
- package/dist/mail-delivery/ses-event.parser.js +131 -0
- package/dist/mail-delivery/ses-event.parser.js.map +1 -0
- package/dist/mail-delivery/ses-webhook.service.d.ts +58 -0
- package/dist/mail-delivery/ses-webhook.service.d.ts.map +1 -0
- package/dist/mail-delivery/ses-webhook.service.js +214 -0
- package/dist/mail-delivery/ses-webhook.service.js.map +1 -0
- package/dist/mail-delivery/sns-message.util.d.ts +38 -0
- package/dist/mail-delivery/sns-message.util.d.ts.map +1 -0
- package/dist/mail-delivery/sns-message.util.js +109 -0
- package/dist/mail-delivery/sns-message.util.js.map +1 -0
- package/dist/mail-layout/dto/update.dto.d.ts +17 -0
- package/dist/mail-layout/dto/update.dto.d.ts.map +1 -0
- package/dist/mail-layout/dto/update.dto.js +27 -0
- package/dist/mail-layout/dto/update.dto.js.map +1 -0
- package/dist/mail-layout/mail-layout.controller.d.ts +15 -0
- package/dist/mail-layout/mail-layout.controller.d.ts.map +1 -0
- package/dist/mail-layout/mail-layout.controller.js +71 -0
- package/dist/mail-layout/mail-layout.controller.js.map +1 -0
- package/dist/mail-layout/mail-layout.module.d.ts +3 -0
- package/dist/mail-layout/mail-layout.module.d.ts.map +1 -0
- package/dist/mail-layout/mail-layout.module.js +35 -0
- package/dist/mail-layout/mail-layout.module.js.map +1 -0
- package/dist/mail-layout/mail-layout.service.d.ts +27 -0
- package/dist/mail-layout/mail-layout.service.d.ts.map +1 -0
- package/dist/mail-layout/mail-layout.service.js +80 -0
- package/dist/mail-layout/mail-layout.service.js.map +1 -0
- package/dist/mail-sent/dto/query-mail-sent-list.dto.d.ts +5 -0
- package/dist/mail-sent/dto/query-mail-sent-list.dto.d.ts.map +1 -1
- package/dist/mail-sent/dto/query-mail-sent-list.dto.js +6 -0
- package/dist/mail-sent/dto/query-mail-sent-list.dto.js.map +1 -1
- package/dist/mail-sent/mail-sent.controller.d.ts +39 -0
- package/dist/mail-sent/mail-sent.controller.d.ts.map +1 -1
- package/dist/mail-sent/mail-sent.service.d.ts +39 -0
- package/dist/mail-sent/mail-sent.service.d.ts.map +1 -1
- package/dist/mail-sent/mail-sent.service.js +45 -4
- package/dist/mail-sent/mail-sent.service.js.map +1 -1
- package/dist/mailbox/mailbox-fetcher.registry.d.ts +100 -0
- package/dist/mailbox/mailbox-fetcher.registry.d.ts.map +1 -0
- package/dist/mailbox/mailbox-fetcher.registry.js +59 -0
- package/dist/mailbox/mailbox-fetcher.registry.js.map +1 -0
- package/dist/mailbox/mailbox.module.d.ts +8 -0
- package/dist/mailbox/mailbox.module.d.ts.map +1 -0
- package/dist/mailbox/mailbox.module.js +27 -0
- package/dist/mailbox/mailbox.module.js.map +1 -0
- package/dist/mcp-chat/mcp-chat.controller.d.ts +2 -2
- package/dist/mcp-chat/mcp-chat.service.d.ts +24 -2
- package/dist/mcp-chat/mcp-chat.service.d.ts.map +1 -1
- package/dist/mcp-chat/mcp-chat.service.js +80 -24
- package/dist/mcp-chat/mcp-chat.service.js.map +1 -1
- package/dist/meeting/meeting-provider.registry.d.ts +155 -0
- package/dist/meeting/meeting-provider.registry.d.ts.map +1 -0
- package/dist/meeting/meeting-provider.registry.js +53 -0
- package/dist/meeting/meeting-provider.registry.js.map +1 -0
- package/dist/meeting/meeting.constants.d.ts +47 -0
- package/dist/meeting/meeting.constants.d.ts.map +1 -0
- package/dist/meeting/meeting.constants.js +21 -0
- package/dist/meeting/meeting.constants.js.map +1 -0
- package/dist/meeting/meeting.module.d.ts +7 -0
- package/dist/meeting/meeting.module.d.ts.map +1 -0
- package/dist/meeting/meeting.module.js +26 -0
- package/dist/meeting/meeting.module.js.map +1 -0
- package/dist/menu/menu.controller.d.ts +3 -3
- package/dist/menu/menu.service.d.ts +3 -3
- package/dist/middlewares/locale-injection.middleware.d.ts +12 -0
- package/dist/middlewares/locale-injection.middleware.d.ts.map +1 -1
- package/dist/middlewares/locale-injection.middleware.js +20 -4
- package/dist/middlewares/locale-injection.middleware.js.map +1 -1
- package/dist/notification/notification.controller.d.ts +12 -12
- package/dist/notification/notification.service.d.ts +12 -12
- package/dist/oauth/oauth-token-broker.service.d.ts +72 -0
- package/dist/oauth/oauth-token-broker.service.d.ts.map +1 -0
- package/dist/oauth/oauth-token-broker.service.js +258 -0
- package/dist/oauth/oauth-token-broker.service.js.map +1 -0
- package/dist/oauth/oauth.module.d.ts.map +1 -1
- package/dist/oauth/oauth.module.js +3 -1
- package/dist/oauth/oauth.module.js.map +1 -1
- package/dist/oauth/oauth.service.d.ts +2 -0
- package/dist/oauth/oauth.service.d.ts.map +1 -1
- package/dist/oauth/oauth.service.js +6 -3
- package/dist/oauth/oauth.service.js.map +1 -1
- package/dist/oauth/providers/google.provider.d.ts +7 -0
- package/dist/oauth/providers/google.provider.d.ts.map +1 -1
- package/dist/oauth/providers/google.provider.js +43 -13
- package/dist/oauth/providers/google.provider.js.map +1 -1
- package/dist/observability/monitored-cron.d.ts +34 -0
- package/dist/observability/monitored-cron.d.ts.map +1 -0
- package/dist/observability/monitored-cron.js +118 -0
- package/dist/observability/monitored-cron.js.map +1 -0
- package/dist/pairing/dto/approve-reverse-pairing.dto.d.ts +12 -0
- package/dist/pairing/dto/approve-reverse-pairing.dto.d.ts.map +1 -0
- package/dist/pairing/dto/approve-reverse-pairing.dto.js +30 -0
- package/dist/pairing/dto/approve-reverse-pairing.dto.js.map +1 -0
- package/dist/pairing/dto/claim-pairing.dto.d.ts +11 -0
- package/dist/pairing/dto/claim-pairing.dto.d.ts.map +1 -0
- package/dist/pairing/dto/claim-pairing.dto.js +35 -0
- package/dist/pairing/dto/claim-pairing.dto.js.map +1 -0
- package/dist/pairing/dto/confirm-pairing.dto.d.ts +10 -0
- package/dist/pairing/dto/confirm-pairing.dto.d.ts.map +1 -0
- package/dist/pairing/dto/confirm-pairing.dto.js +24 -0
- package/dist/pairing/dto/confirm-pairing.dto.js.map +1 -0
- package/dist/pairing/dto/poll-reverse-pairing.dto.d.ts +5 -0
- package/dist/pairing/dto/poll-reverse-pairing.dto.d.ts.map +1 -0
- package/dist/pairing/dto/poll-reverse-pairing.dto.js +24 -0
- package/dist/pairing/dto/poll-reverse-pairing.dto.js.map +1 -0
- package/dist/pairing/dto/start-pairing.dto.d.ts +11 -0
- package/dist/pairing/dto/start-pairing.dto.d.ts.map +1 -0
- package/dist/pairing/dto/start-pairing.dto.js +30 -0
- package/dist/pairing/dto/start-pairing.dto.js.map +1 -0
- package/dist/pairing/dto/start-reverse-pairing.dto.d.ts +24 -0
- package/dist/pairing/dto/start-reverse-pairing.dto.d.ts.map +1 -0
- package/dist/pairing/dto/start-reverse-pairing.dto.js +47 -0
- package/dist/pairing/dto/start-reverse-pairing.dto.js.map +1 -0
- package/dist/pairing/pairing.controller.d.ts +118 -0
- package/dist/pairing/pairing.controller.d.ts.map +1 -0
- package/dist/pairing/pairing.controller.js +296 -0
- package/dist/pairing/pairing.controller.js.map +1 -0
- package/dist/pairing/pairing.module.d.ts +10 -0
- package/dist/pairing/pairing.module.d.ts.map +1 -0
- package/dist/pairing/pairing.module.js +40 -0
- package/dist/pairing/pairing.module.js.map +1 -0
- package/dist/pairing/pairing.service.d.ts +238 -0
- package/dist/pairing/pairing.service.d.ts.map +1 -0
- package/dist/pairing/pairing.service.js +495 -0
- package/dist/pairing/pairing.service.js.map +1 -0
- package/dist/pdf/pdf.service.d.ts +11 -6
- package/dist/pdf/pdf.service.d.ts.map +1 -1
- package/dist/pdf/pdf.service.js +60 -20
- package/dist/pdf/pdf.service.js.map +1 -1
- package/dist/presence/presence.controller.d.ts +16 -0
- package/dist/presence/presence.controller.d.ts.map +1 -0
- package/dist/presence/presence.controller.js +60 -0
- package/dist/presence/presence.controller.js.map +1 -0
- package/dist/presence/presence.listener.d.ts +29 -0
- package/dist/presence/presence.listener.d.ts.map +1 -0
- package/dist/presence/presence.listener.js +82 -0
- package/dist/presence/presence.listener.js.map +1 -0
- package/dist/presence/presence.module.d.ts +3 -0
- package/dist/presence/presence.module.d.ts.map +1 -0
- package/dist/presence/presence.module.js +32 -0
- package/dist/presence/presence.module.js.map +1 -0
- package/dist/presence/presence.service.d.ts +42 -0
- package/dist/presence/presence.service.d.ts.map +1 -0
- package/dist/presence/presence.service.js +147 -0
- package/dist/presence/presence.service.js.map +1 -0
- package/dist/profile/dto/delete-account.dto.d.ts +8 -0
- package/dist/profile/dto/delete-account.dto.d.ts.map +1 -0
- package/dist/profile/dto/delete-account.dto.js +22 -0
- package/dist/profile/dto/delete-account.dto.js.map +1 -0
- package/dist/profile/events/profile-account-deleted.event.d.ts +12 -0
- package/dist/profile/events/profile-account-deleted.event.d.ts.map +1 -0
- package/dist/profile/events/profile-account-deleted.event.js +17 -0
- package/dist/profile/events/profile-account-deleted.event.js.map +1 -0
- package/dist/profile/profile.controller.d.ts +32 -15
- package/dist/profile/profile.controller.d.ts.map +1 -1
- package/dist/profile/profile.controller.js +75 -46
- package/dist/profile/profile.controller.js.map +1 -1
- package/dist/profile/profile.service.d.ts +41 -18
- package/dist/profile/profile.service.d.ts.map +1 -1
- package/dist/profile/profile.service.js +133 -48
- package/dist/profile/profile.service.js.map +1 -1
- package/dist/realtime/realtime.gateway.d.ts +48 -0
- package/dist/realtime/realtime.gateway.d.ts.map +1 -0
- package/dist/realtime/realtime.gateway.js +156 -0
- package/dist/realtime/realtime.gateway.js.map +1 -0
- package/dist/realtime/realtime.module.d.ts +8 -0
- package/dist/realtime/realtime.module.d.ts.map +1 -0
- package/dist/realtime/realtime.module.js +29 -0
- package/dist/realtime/realtime.module.js.map +1 -0
- package/dist/realtime/realtime.service.d.ts +51 -0
- package/dist/realtime/realtime.service.d.ts.map +1 -0
- package/dist/realtime/realtime.service.js +177 -0
- package/dist/realtime/realtime.service.js.map +1 -0
- package/dist/redis/redis-pubsub.d.ts +27 -0
- package/dist/redis/redis-pubsub.d.ts.map +1 -0
- package/dist/redis/redis-pubsub.js +184 -0
- package/dist/redis/redis-pubsub.js.map +1 -0
- package/dist/role/guards/role.guard.d.ts +5 -0
- package/dist/role/guards/role.guard.d.ts.map +1 -1
- package/dist/role/guards/role.guard.js +41 -39
- package/dist/role/guards/role.guard.js.map +1 -1
- package/dist/role/role.controller.d.ts +3 -3
- package/dist/role/role.service.d.ts +3 -3
- package/dist/session/session.controller.d.ts +2 -0
- package/dist/session/session.controller.d.ts.map +1 -1
- package/dist/session/session.service.d.ts +39 -0
- package/dist/session/session.service.d.ts.map +1 -1
- package/dist/session/session.service.js +91 -8
- package/dist/session/session.service.js.map +1 -1
- package/dist/setting/brand-asset.service.d.ts +48 -0
- package/dist/setting/brand-asset.service.d.ts.map +1 -0
- package/dist/setting/brand-asset.service.js +130 -0
- package/dist/setting/brand-asset.service.js.map +1 -0
- package/dist/setting/dto/create.dto.d.ts.map +1 -1
- package/dist/setting/dto/create.dto.js +9 -2
- package/dist/setting/dto/create.dto.js.map +1 -1
- package/dist/setting/setting.controller.d.ts +5 -5
- package/dist/setting/setting.module.d.ts.map +1 -1
- package/dist/setting/setting.module.js +3 -2
- package/dist/setting/setting.module.js.map +1 -1
- package/dist/setting/setting.service.d.ts +41 -5
- package/dist/setting/setting.service.d.ts.map +1 -1
- package/dist/setting/setting.service.js +113 -1
- package/dist/setting/setting.service.js.map +1 -1
- package/dist/token/token.service.d.ts +23 -2
- package/dist/token/token.service.d.ts.map +1 -1
- package/dist/token/token.service.js +39 -4
- package/dist/token/token.service.js.map +1 -1
- package/dist/user/dto/create-with-email-and-password.dto.d.ts +2 -0
- package/dist/user/dto/create-with-email-and-password.dto.d.ts.map +1 -1
- package/dist/user/dto/create-with-email-and-password.dto.js +5 -0
- package/dist/user/dto/create-with-email-and-password.dto.js.map +1 -1
- package/dist/user/dto/query-user-mail-list.dto.d.ts +5 -0
- package/dist/user/dto/query-user-mail-list.dto.d.ts.map +1 -0
- package/dist/user/dto/query-user-mail-list.dto.js +25 -0
- package/dist/user/dto/query-user-mail-list.dto.js.map +1 -0
- package/dist/user/user-credential.util.d.ts +19 -0
- package/dist/user/user-credential.util.d.ts.map +1 -0
- package/dist/user/user-credential.util.js +32 -0
- package/dist/user/user-credential.util.js.map +1 -0
- package/dist/user/user.controller.d.ts +24 -26
- package/dist/user/user.controller.d.ts.map +1 -1
- package/dist/user/user.controller.js +18 -3
- package/dist/user/user.controller.js.map +1 -1
- package/dist/user/user.service.d.ts +71 -29
- package/dist/user/user.service.d.ts.map +1 -1
- package/dist/user/user.service.js +291 -17
- package/dist/user/user.service.js.map +1 -1
- package/dist/user-device/user-device.controller.d.ts +54 -0
- package/dist/user-device/user-device.controller.d.ts.map +1 -0
- package/dist/user-device/user-device.controller.js +103 -0
- package/dist/user-device/user-device.controller.js.map +1 -0
- package/dist/user-device/user-device.module.d.ts +3 -0
- package/dist/user-device/user-device.module.d.ts.map +1 -0
- package/dist/user-device/user-device.module.js +26 -0
- package/dist/user-device/user-device.module.js.map +1 -0
- package/dist/user-device/user-device.service.d.ts +71 -0
- package/dist/user-device/user-device.service.d.ts.map +1 -0
- package/dist/user-device/user-device.service.js +158 -0
- package/dist/user-device/user-device.service.js.map +1 -0
- package/dist/utils/device-key.d.ts +23 -0
- package/dist/utils/device-key.d.ts.map +1 -0
- package/dist/utils/device-key.js +31 -0
- package/dist/utils/device-key.js.map +1 -0
- package/dist/utils/geo-ip.d.ts +38 -0
- package/dist/utils/geo-ip.d.ts.map +1 -0
- package/dist/utils/geo-ip.js +122 -0
- package/dist/utils/geo-ip.js.map +1 -0
- package/dist/utils/locale-context.d.ts +10 -7
- package/dist/utils/locale-context.d.ts.map +1 -1
- package/dist/utils/locale-context.js +14 -8
- package/dist/utils/locale-context.js.map +1 -1
- package/dist/utils/security-event-vars.d.ts +56 -0
- package/dist/utils/security-event-vars.d.ts.map +1 -0
- package/dist/utils/security-event-vars.js +109 -0
- package/dist/utils/security-event-vars.js.map +1 -0
- package/dist/utils/user-agent.d.ts +19 -0
- package/dist/utils/user-agent.d.ts.map +1 -0
- package/dist/utils/user-agent.js +36 -0
- package/dist/utils/user-agent.js.map +1 -0
- package/dist/validators/is-strong-password-with-settings.validator.d.ts.map +1 -1
- package/dist/validators/is-strong-password-with-settings.validator.js +11 -0
- package/dist/validators/is-strong-password-with-settings.validator.js.map +1 -1
- package/dist/validators/service-locator.d.ts +9 -0
- package/dist/validators/service-locator.d.ts.map +1 -1
- package/dist/validators/service-locator.js +12 -0
- package/dist/validators/service-locator.js.map +1 -1
- package/dist/webhook-integration/webhook-integration.service.d.ts +5 -0
- package/dist/webhook-integration/webhook-integration.service.d.ts.map +1 -1
- package/dist/webhook-integration/webhook-integration.service.js +50 -4
- package/dist/webhook-integration/webhook-integration.service.js.map +1 -1
- package/dist/webhook-integration/webhook-protocol.registry.d.ts +6 -0
- package/dist/webhook-integration/webhook-protocol.registry.d.ts.map +1 -1
- package/dist/webhook-integration/webhook-protocol.registry.js.map +1 -1
- package/dist/whatsapp-sender/whatsapp-sender.module.d.ts +3 -0
- package/dist/whatsapp-sender/whatsapp-sender.module.d.ts.map +1 -0
- package/dist/whatsapp-sender/whatsapp-sender.module.js +23 -0
- package/dist/whatsapp-sender/whatsapp-sender.module.js.map +1 -0
- package/dist/whatsapp-sender/whatsapp-sender.service.d.ts +50 -0
- package/dist/whatsapp-sender/whatsapp-sender.service.d.ts.map +1 -0
- package/dist/whatsapp-sender/whatsapp-sender.service.js +224 -0
- package/dist/whatsapp-sender/whatsapp-sender.service.js.map +1 -0
- package/hedhog/data/integration_provider.yaml +25 -0
- package/hedhog/data/mail.yaml +275 -112
- package/hedhog/data/mail_layout.yaml +198 -0
- package/hedhog/data/menu.yaml +69 -3
- package/hedhog/data/role.yaml +16 -0
- package/hedhog/data/route.yaml +307 -3
- package/hedhog/data/setting_group.yaml +315 -1
- package/hedhog/data/setting_subgroup.yaml +8 -0
- package/hedhog/frontend/app/_lib/hooks/use-core-access.test.tsx.ejs +125 -0
- package/hedhog/frontend/app/_lib/hooks/use-core-access.ts.ejs +29 -0
- package/hedhog/frontend/app/_lib/hooks/use-impersonation-access.test.ts.ejs +71 -0
- package/hedhog/frontend/app/_lib/hooks/use-impersonation-access.ts.ejs +32 -0
- package/hedhog/frontend/app/access-log/page.tsx.ejs +96 -22
- package/hedhog/frontend/app/account/components/active-sessions.tsx.ejs +17 -1
- package/hedhog/frontend/app/account/components/known-devices.tsx.ejs +89 -0
- package/hedhog/frontend/app/account/components/mfa-setup-dialog.tsx.ejs +36 -0
- package/hedhog/frontend/app/account/components/profile-form.tsx.ejs +2 -1
- package/hedhog/frontend/app/account/components/two-factor-auth.tsx.ejs +2 -0
- package/hedhog/frontend/app/account/components/user-devices-list.tsx.ejs +186 -0
- package/hedhog/frontend/app/account/devices/page.tsx.ejs +5 -0
- package/hedhog/frontend/app/account/hooks/use-mfa-setup.ts.ejs +10 -7
- package/hedhog/frontend/app/account/layout.tsx.ejs +2 -0
- package/hedhog/frontend/app/ai_agent/page.tsx.ejs +7 -4
- package/hedhog/frontend/app/ai_instruction/_components/ai-instruction-form.tsx.ejs +580 -0
- package/hedhog/frontend/app/ai_instruction/_components/ai-instruction-preview.tsx.ejs +150 -0
- package/hedhog/frontend/app/ai_instruction/_components/ai-instruction-versions.tsx.ejs +199 -0
- package/hedhog/frontend/app/ai_instruction/_components/prompt-diff.tsx.ejs +63 -0
- package/hedhog/frontend/app/ai_instruction/_lib/line-diff.spec.ts.ejs +59 -0
- package/hedhog/frontend/app/ai_instruction/_lib/line-diff.ts.ejs +72 -0
- package/hedhog/frontend/app/ai_instruction/_lib/prompt-template.spec.ts.ejs +170 -0
- package/hedhog/frontend/app/ai_instruction/_lib/prompt-template.ts.ejs +167 -0
- package/hedhog/frontend/app/ai_instruction/_lib/types.ts.ejs +99 -0
- package/hedhog/frontend/app/ai_instruction/page.tsx.ejs +422 -0
- package/hedhog/frontend/app/configurations/[slug]/components/setting-field.test.tsx.ejs +298 -0
- package/hedhog/frontend/app/configurations/[slug]/components/setting-field.tsx.ejs +410 -1223
- package/hedhog/frontend/app/incidents/page.tsx.ejs +400 -0
- package/hedhog/frontend/app/integration/profiles/page.tsx.ejs +153 -84
- package/hedhog/frontend/app/mail/layout/page.tsx.ejs +344 -0
- package/hedhog/frontend/app/mail/log/page.tsx.ejs +210 -3
- package/hedhog/frontend/app/mail/template/page.tsx.ejs +292 -200
- package/hedhog/frontend/app/mcp_chat/page.tsx.ejs +129 -17
- package/hedhog/frontend/app/pages/_components/page-delete-dialog.tsx.ejs +343 -0
- package/hedhog/frontend/app/pages/_components/page-detail-sheet.tsx.ejs +438 -0
- package/hedhog/frontend/app/pages/_components/page-wizard-sheet.tsx.ejs +1009 -0
- package/hedhog/frontend/app/pages/_components/system-page-types.ts.ejs +56 -0
- package/hedhog/frontend/app/pages/_components/use-system-pages.ts.ejs +171 -0
- package/hedhog/frontend/app/pages/page.tsx.ejs +514 -0
- package/hedhog/frontend/app/users/active-session.tsx.ejs +58 -11
- package/hedhog/frontend/app/users/page.tsx.ejs +186 -21
- package/hedhog/frontend/app/users/simulate-access-dialog.test.tsx.ejs +202 -0
- package/hedhog/frontend/app/users/simulate-access-dialog.tsx.ejs +170 -0
- package/hedhog/frontend/app/users/user-activity-timeline.tsx.ejs +250 -0
- package/hedhog/frontend/app/users/user-devices.tsx.ejs +89 -0
- package/hedhog/frontend/app/users/user-logs.tsx.ejs +13 -1
- package/hedhog/frontend/app/users/user-mails.tsx.ejs +399 -0
- package/hedhog/frontend/app/users/user-sheet.tsx.ejs +106 -99
- package/hedhog/frontend/messages/en.json +643 -49
- package/hedhog/frontend/messages/pt.json +643 -49
- package/hedhog/table/access_log.yaml +7 -0
- package/hedhog/table/ai_agent.yaml +1 -0
- package/hedhog/table/ai_instruction.yaml +15 -0
- package/hedhog/table/file.yaml +8 -0
- package/hedhog/table/leaked_password.yaml +18 -0
- package/hedhog/table/mail_delivery_event.yaml +76 -0
- package/hedhog/table/mail_layout.yaml +35 -0
- package/hedhog/table/mail_sent.yaml +23 -0
- package/hedhog/table/mail_var.yaml +4 -0
- package/hedhog/table/setting.yaml +1 -0
- package/hedhog/table/system_incident.yaml +59 -0
- package/hedhog/table/user_activity.yaml +9 -0
- package/hedhog/table/user_device.yaml +52 -0
- package/hedhog/table/user_presence.yaml +36 -0
- package/hedhog/table/user_session.yaml +20 -1
- package/package.json +7 -2
- package/src/access-log/access-log.controller.ts +1 -0
- package/src/access-log/access-log.interceptor.ts +9 -3
- package/src/access-log/access-log.service.spec.ts +33 -2
- package/src/access-log/access-log.service.ts +38 -0
- package/src/access-log/dto/query-access-log.dto.ts +5 -0
- package/src/ai/ai-attachment.fragments.spec.ts +319 -0
- package/src/ai/ai-attachment.fragments.ts +35 -0
- package/src/ai/ai.controller.ts +9 -0
- package/src/ai/ai.module.ts +3 -2
- package/src/ai/ai.prompts.ts +38 -0
- package/src/ai/ai.service.spec.ts +280 -0
- package/src/ai/ai.service.ts +475 -82
- package/src/ai/dto/chat.dto.ts +33 -3
- package/src/ai/dto/create-agent.dto.ts +2 -2
- package/src/ai/dto/richtext-edit-html.dto.ts +11 -0
- package/src/ai/dto/update-agent.dto.ts +2 -2
- package/src/ai/richtext-ai.prompts.ts +57 -0
- package/src/ai/richtext-ai.service.ts +109 -0
- package/src/ai-instruction/ai-instruction.controller.ts +40 -9
- package/src/ai-instruction/ai-instruction.module.ts +13 -2
- package/src/ai-instruction/ai-instruction.service.spec.ts +658 -0
- package/src/ai-instruction/ai-instruction.service.ts +661 -62
- package/src/ai-instruction/ai-prompt-builder.service.ts +10 -1
- package/src/ai-instruction/ai-prompt-registry.ts +87 -0
- package/src/ai-instruction/ai-prompt-resolver.service.spec.ts +375 -0
- package/src/ai-instruction/ai-prompt-resolver.service.ts +295 -0
- package/src/ai-instruction/ai-prompt-template.util.spec.ts +162 -0
- package/src/ai-instruction/ai-prompt-template.util.ts +199 -0
- package/src/ai-instruction/dto/create-ai-instruction.dto.ts +39 -3
- package/src/ai-instruction/dto/preview-ai-instruction.dto.ts +26 -0
- package/src/ai-instruction/dto/update-ai-instruction.dto.ts +42 -1
- package/src/ai-instruction/types/ai-instruction.types.ts +24 -1
- package/src/auth/auth.controller.ts +78 -13
- package/src/auth/auth.module.ts +2 -0
- package/src/auth/auth.service.spec.ts +386 -7
- package/src/auth/auth.service.ts +435 -81
- package/src/auth/dto/confirm-email.dto.ts +7 -0
- package/src/auth/dto/resend-confirmation.dto.ts +20 -0
- package/src/authorize/authorize.controller.ts +2 -0
- package/src/authorize/authorize.service.spec.ts +23 -0
- package/src/authorize/authorize.service.ts +8 -0
- package/src/captcha/captcha.module.ts +10 -0
- package/src/captcha/captcha.service.spec.ts +210 -0
- package/src/captcha/captcha.service.ts +191 -0
- package/src/challenge/challenge.service.spec.ts +112 -4
- package/src/challenge/challenge.service.ts +131 -17
- package/src/core.module.ts +46 -1
- package/src/file/file.controller.ts +54 -4
- package/src/file/file.service.spec.ts +275 -0
- package/src/file/file.service.ts +468 -16
- package/src/file/image-optimization.service.spec.ts +92 -0
- package/src/file/image-optimization.service.ts +202 -0
- package/src/file/provider/abstract.provider.ts +23 -0
- package/src/file/provider/gcs.provider.ts +17 -0
- package/src/file/provider/local.provider.ts +21 -0
- package/src/file/provider/s3.provider.ts +25 -0
- package/src/file/provider/spaces.provider.ts +26 -0
- package/src/impersonation/dto/redeem-impersonation.dto.ts +8 -0
- package/src/impersonation/dto/start-impersonation.dto.ts +13 -0
- package/src/impersonation/impersonation-restrictions.ts +84 -0
- package/src/impersonation/impersonation.controller.ts +109 -0
- package/src/impersonation/impersonation.module.ts +31 -0
- package/src/impersonation/impersonation.service.spec.ts +427 -0
- package/src/impersonation/impersonation.service.ts +577 -0
- package/src/incident/incident-notifier.service.spec.ts +205 -0
- package/src/incident/incident-notifier.service.ts +241 -0
- package/src/incident/incident.controller.ts +38 -0
- package/src/incident/incident.module.ts +19 -0
- package/src/incident/incident.service.spec.ts +150 -0
- package/src/incident/incident.service.ts +209 -0
- package/src/index.ts +58 -0
- package/src/integration/services/outbox-polling.coordinator.spec.ts +90 -0
- package/src/integration/services/outbox-polling.coordinator.ts +62 -40
- package/src/integration/services/outbox.service.spec.ts +8 -0
- package/src/integration/services/outbox.service.ts +19 -13
- package/src/integration-profile/dto/test.dto.ts +19 -0
- package/src/integration-profile/integration-profile.controller.ts +10 -1
- package/src/integration-profile/integration-profile.module.spec.ts +51 -0
- package/src/integration-profile/integration-profile.module.ts +23 -4
- package/src/integration-profile/integration-profile.secrets.ts +12 -1
- package/src/integration-profile/integration-profile.service.spec.ts +279 -0
- package/src/integration-profile/integration-profile.service.ts +120 -124
- package/src/integration-profile/integration-profile.utils.spec.ts +22 -0
- package/src/integration-profile/integration-profile.utils.ts +78 -3
- package/src/integration-profile/testers/ai.testers.ts +165 -0
- package/src/integration-profile/testers/captcha.testers.spec.ts +92 -0
- package/src/integration-profile/testers/captcha.testers.ts +139 -0
- package/src/integration-profile/testers/email.testers.ts +194 -0
- package/src/integration-profile/testers/http-probe.spec.ts +153 -0
- package/src/integration-profile/testers/http-probe.ts +171 -0
- package/src/integration-profile/testers/index.ts +30 -0
- package/src/integration-profile/testers/infrastructure.testers.ts +122 -0
- package/src/integration-profile/testers/integration-tester.registry.spec.ts +75 -0
- package/src/integration-profile/testers/integration-tester.registry.ts +43 -0
- package/src/integration-profile/testers/integration-tester.types.ts +61 -0
- package/src/integration-profile/testers/messaging.testers.ts +102 -0
- package/src/integration-profile/testers/oauth.testers.spec.ts +220 -0
- package/src/integration-profile/testers/oauth.testers.ts +305 -0
- package/src/integration-profile/testers/payment.testers.ts +185 -0
- package/src/integration-profile/testers/remaining.testers.spec.ts +401 -0
- package/src/integration-profile/testers/storage.testers.spec.ts +185 -0
- package/src/integration-profile/testers/storage.testers.ts +226 -0
- package/src/integration-profile/testers/tester-coverage.spec.ts +58 -0
- package/src/language/en.json +15 -2
- package/src/language/pt.json +15 -2
- package/src/leaked-password/README.md +83 -0
- package/src/leaked-password/leaked-password.controller.ts +52 -0
- package/src/leaked-password/leaked-password.module.ts +18 -0
- package/src/leaked-password/leaked-password.service.ts +242 -0
- package/src/leaked-password/seed/build-seed-sql.mjs +180 -0
- package/src/leaked-password/seed/common-passwords.txt +335 -0
- package/src/mail/dto/preview.dto.ts +50 -0
- package/src/mail/dto/send.dto.ts +58 -1
- package/src/mail/mail-template.spec.ts +274 -0
- package/src/mail/mail.controller.ts +9 -2
- package/src/mail/mail.module.ts +2 -0
- package/src/mail/mail.service.spec.ts +422 -6
- package/src/mail/mail.service.ts +337 -34
- package/src/mail-delivery/mail-delivery-provision.service.ts +66 -0
- package/src/mail-delivery/mail-delivery.constants.ts +31 -0
- package/src/mail-delivery/mail-delivery.controller.ts +38 -0
- package/src/mail-delivery/mail-delivery.module.ts +23 -0
- package/src/mail-delivery/mail-delivery.service.spec.ts +136 -0
- package/src/mail-delivery/mail-delivery.service.ts +152 -0
- package/src/mail-delivery/ses-event.parser.spec.ts +140 -0
- package/src/mail-delivery/ses-event.parser.ts +191 -0
- package/src/mail-delivery/ses-webhook.service.spec.ts +170 -0
- package/src/mail-delivery/ses-webhook.service.ts +240 -0
- package/src/mail-delivery/sns-message.util.spec.ts +163 -0
- package/src/mail-delivery/sns-message.util.ts +125 -0
- package/src/mail-layout/dto/update.dto.ts +19 -0
- package/src/mail-layout/mail-layout.controller.ts +47 -0
- package/src/mail-layout/mail-layout.module.ts +22 -0
- package/src/mail-layout/mail-layout.service.ts +94 -0
- package/src/mail-sent/dto/query-mail-sent-list.dto.ts +15 -0
- package/src/mail-sent/mail-sent.service.ts +46 -2
- package/src/mailbox/mailbox-fetcher.registry.ts +132 -0
- package/src/mailbox/mailbox.module.ts +14 -0
- package/src/mcp-chat/mcp-chat.service.spec.ts +236 -0
- package/src/mcp-chat/mcp-chat.service.ts +122 -26
- package/src/meeting/meeting-provider.registry.ts +193 -0
- package/src/meeting/meeting.constants.ts +53 -0
- package/src/meeting/meeting.module.ts +13 -0
- package/src/middlewares/locale-injection.middleware.ts +25 -6
- package/src/oauth/oauth-token-broker.service.spec.ts +172 -0
- package/src/oauth/oauth-token-broker.service.ts +363 -0
- package/src/oauth/oauth.module.ts +3 -1
- package/src/oauth/oauth.service.ts +8 -2
- package/src/oauth/providers/google.provider.ts +49 -15
- package/src/observability/monitored-cron.spec.ts +102 -0
- package/src/observability/monitored-cron.ts +110 -0
- package/src/pairing/dto/approve-reverse-pairing.dto.ts +20 -0
- package/src/pairing/dto/claim-pairing.dto.ts +19 -0
- package/src/pairing/dto/confirm-pairing.dto.ts +14 -0
- package/src/pairing/dto/poll-reverse-pairing.dto.ts +9 -0
- package/src/pairing/dto/start-pairing.dto.ts +19 -0
- package/src/pairing/dto/start-reverse-pairing.dto.ts +45 -0
- package/src/pairing/pairing.controller.ts +246 -0
- package/src/pairing/pairing.module.ts +27 -0
- package/src/pairing/pairing.service.spec.ts +462 -0
- package/src/pairing/pairing.service.ts +614 -0
- package/src/pdf/pdf.service.ts +81 -24
- package/src/presence/presence.controller.ts +29 -0
- package/src/presence/presence.listener.ts +53 -0
- package/src/presence/presence.module.ts +19 -0
- package/src/presence/presence.service.spec.ts +97 -0
- package/src/presence/presence.service.ts +160 -0
- package/src/profile/dto/delete-account.dto.ts +11 -0
- package/src/profile/events/profile-account-deleted.event.ts +13 -0
- package/src/profile/profile.controller.ts +46 -34
- package/src/profile/profile.service.ts +164 -46
- package/src/realtime/realtime.gateway.ts +138 -0
- package/src/realtime/realtime.module.ts +16 -0
- package/src/realtime/realtime.service.spec.ts +50 -0
- package/src/realtime/realtime.service.ts +187 -0
- package/src/redis/redis-pubsub.ts +190 -0
- package/src/role/guards/role.guard.spec.ts +75 -0
- package/src/role/guards/role.guard.ts +64 -46
- package/src/session/session.service.spec.ts +81 -0
- package/src/session/session.service.ts +93 -6
- package/src/setting/brand-asset.service.ts +137 -0
- package/src/setting/dto/create.dto.ts +13 -2
- package/src/setting/setting.module.ts +3 -2
- package/src/setting/setting.service.spec.ts +135 -1
- package/src/setting/setting.service.ts +138 -2
- package/src/token/token.service.spec.ts +62 -0
- package/src/token/token.service.ts +57 -3
- package/src/user/dto/create-with-email-and-password.dto.ts +6 -1
- package/src/user/dto/query-user-mail-list.dto.ts +10 -0
- package/src/user/user-credential.util.ts +35 -0
- package/src/user/user.controller.ts +17 -2
- package/src/user/user.service.spec.ts +186 -2
- package/src/user/user.service.ts +361 -16
- package/src/user-device/user-device.controller.ts +77 -0
- package/src/user-device/user-device.module.ts +13 -0
- package/src/user-device/user-device.service.spec.ts +234 -0
- package/src/user-device/user-device.service.ts +168 -0
- package/src/utils/device-key.spec.ts +57 -0
- package/src/utils/device-key.ts +32 -0
- package/src/utils/geo-ip.spec.ts +134 -0
- package/src/utils/geo-ip.ts +93 -0
- package/src/utils/locale-context.spec.ts +27 -1
- package/src/utils/locale-context.ts +15 -12
- package/src/utils/security-event-vars.spec.ts +161 -0
- package/src/utils/security-event-vars.ts +153 -0
- package/src/utils/user-agent.spec.ts +37 -0
- package/src/utils/user-agent.ts +46 -0
- package/src/validators/is-strong-password-with-settings.validator.ts +12 -0
- package/src/validators/service-locator.ts +15 -0
- package/src/webhook-integration/webhook-integration.service.ts +57 -3
- package/src/webhook-integration/webhook-protocol.registry.ts +6 -0
- package/src/whatsapp-sender/whatsapp-sender.module.ts +10 -0
- package/src/whatsapp-sender/whatsapp-sender.service.ts +313 -0
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utilidades compartilhadas pelos testadores de conexão.
|
|
3
|
+
*
|
|
4
|
+
* Concentra as três coisas que todo tester precisa acertar e que são fáceis de errar
|
|
5
|
+
* caso a caso: respeitar o timeout, não vazar segredo na mensagem de erro e traduzir
|
|
6
|
+
* falha de rede em texto que o operador entenda.
|
|
7
|
+
*/
|
|
8
|
+
import { IntegrationTestOutcome } from './integration-tester.types';
|
|
9
|
+
|
|
10
|
+
/** Tamanho máximo de uma mensagem devolvida à UI (ela também é persistida no config). */
|
|
11
|
+
const MAX_ERROR_LENGTH = 300;
|
|
12
|
+
|
|
13
|
+
/** Atalho para um veredito de sucesso. */
|
|
14
|
+
export function pass(info?: string, warning?: string): IntegrationTestOutcome {
|
|
15
|
+
return { ok: true, ...(info ? { info } : {}), ...(warning ? { warning } : {}) };
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** Atalho para um veredito de falha. */
|
|
19
|
+
export function fail(error: string): IntegrationTestOutcome {
|
|
20
|
+
return { ok: false, error };
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Exige que um campo esteja preenchido. Devolve `null` quando está tudo certo, ou o
|
|
25
|
+
* veredito de falha pronto — evita repetir o mesmo `if` em 31 testers.
|
|
26
|
+
*/
|
|
27
|
+
export function requireFields(
|
|
28
|
+
config: Record<string, unknown>,
|
|
29
|
+
fields: Array<[key: string, label: string]>,
|
|
30
|
+
): IntegrationTestOutcome | null {
|
|
31
|
+
for (const [key, label] of fields) {
|
|
32
|
+
if (!String(config[key] ?? '').trim()) {
|
|
33
|
+
return fail(`${label} is required.`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** Lê uma chave do config como string já trimada. */
|
|
40
|
+
export function str(config: Record<string, unknown>, key: string): string {
|
|
41
|
+
return String(config[key] ?? '').trim();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Valida uma URL fornecida pelo usuário (host do Evolution, api_server do k8s,
|
|
46
|
+
* endpoint S3-compatible, base da ADN).
|
|
47
|
+
*
|
|
48
|
+
* Ranges privados são PERMITIDOS de propósito: k8s e Evolution self-hosted vivem em
|
|
49
|
+
* rede interna, e bloqueá-los quebraria o caso de uso principal. O que barramos são
|
|
50
|
+
* esquemas fora de http/https (file:, gopher:, etc.).
|
|
51
|
+
*/
|
|
52
|
+
export function assertHttpUrl(raw: string, field: string): URL {
|
|
53
|
+
let url: URL;
|
|
54
|
+
try {
|
|
55
|
+
url = new URL(raw);
|
|
56
|
+
} catch {
|
|
57
|
+
throw new Error(`${field} is not a valid URL.`);
|
|
58
|
+
}
|
|
59
|
+
if (url.protocol !== 'http:' && url.protocol !== 'https:') {
|
|
60
|
+
throw new Error(`${field} must use http or https.`);
|
|
61
|
+
}
|
|
62
|
+
return url;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export type ProbeResult = {
|
|
66
|
+
ok: boolean;
|
|
67
|
+
status: number;
|
|
68
|
+
/** Corpo parseado como JSON, ou `{}` quando a resposta não é JSON. */
|
|
69
|
+
body: any;
|
|
70
|
+
/** Corpo cru (truncado), útil quando a API responde texto puro. */
|
|
71
|
+
text: string;
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* `fetch` que não lança em status != 2xx — o status faz parte do veredito na maioria
|
|
76
|
+
* dos testers (401 vs 404 vs 403 dizem coisas diferentes).
|
|
77
|
+
*/
|
|
78
|
+
export async function probeJson(
|
|
79
|
+
url: string,
|
|
80
|
+
init: RequestInit,
|
|
81
|
+
signal: AbortSignal,
|
|
82
|
+
): Promise<ProbeResult> {
|
|
83
|
+
const response = await fetch(url, { ...init, signal });
|
|
84
|
+
const text = (await response.text().catch(() => '')).slice(0, 2_000);
|
|
85
|
+
|
|
86
|
+
let body: any = {};
|
|
87
|
+
try {
|
|
88
|
+
body = text ? JSON.parse(text) : {};
|
|
89
|
+
} catch {
|
|
90
|
+
body = {};
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return { ok: response.ok, status: response.status, body, text };
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/** Remove qualquer ocorrência dos segredos do texto. */
|
|
97
|
+
export function redactSecrets(text: string, secretValues: string[]): string {
|
|
98
|
+
let out = text;
|
|
99
|
+
for (const secret of secretValues) {
|
|
100
|
+
// Segredos muito curtos (ex.: uma senha de 3 letras) casariam com palavras comuns
|
|
101
|
+
// e transformariam a mensagem em ruído; o risco real está nos tokens longos.
|
|
102
|
+
if (secret && secret.length >= 6) {
|
|
103
|
+
out = out.split(secret).join('***');
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return out;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Converte qualquer erro em mensagem segura para a UI e para o config do perfil.
|
|
111
|
+
*
|
|
112
|
+
* Ordem importa: timeout e falha de DNS/conexão precisam de texto PRÓPRIO, senão o
|
|
113
|
+
* operador de um cluster sem saída para a internet lê "não foi possível validar" e
|
|
114
|
+
* conclui que a credencial está errada.
|
|
115
|
+
*/
|
|
116
|
+
export function sanitizeTesterError(
|
|
117
|
+
error: unknown,
|
|
118
|
+
secretValues: string[],
|
|
119
|
+
host?: string,
|
|
120
|
+
): string {
|
|
121
|
+
const target = host ? ` (${host})` : '';
|
|
122
|
+
const name = (error as { name?: string })?.name ?? '';
|
|
123
|
+
const code = String((error as { code?: string })?.code ?? '');
|
|
124
|
+
const raw = error instanceof Error ? error.message : String(error ?? '');
|
|
125
|
+
|
|
126
|
+
if (name === 'AbortError' || name === 'TimeoutError' || code === 'ABORT_ERR') {
|
|
127
|
+
return `Timed out while contacting the provider${target}. Check the server's outbound network access.`;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const networkCode = [code, raw].join(' ');
|
|
131
|
+
if (/ENOTFOUND|EAI_AGAIN/.test(networkCode)) {
|
|
132
|
+
return `Host not found${target}. Check the address you typed.`;
|
|
133
|
+
}
|
|
134
|
+
if (/ECONNREFUSED/.test(networkCode)) {
|
|
135
|
+
return `Connection refused${target}. Check the address, the port and the firewall.`;
|
|
136
|
+
}
|
|
137
|
+
if (/ECONNRESET|EPIPE|ETIMEDOUT/.test(networkCode)) {
|
|
138
|
+
return `Connection interrupted${target}. Check the server's outbound network access.`;
|
|
139
|
+
}
|
|
140
|
+
if (/CERT_HAS_EXPIRED/.test(networkCode)) {
|
|
141
|
+
return `The provider's TLS certificate has expired${target}.`;
|
|
142
|
+
}
|
|
143
|
+
if (/DEPTH_ZERO_SELF_SIGNED_CERT|SELF_SIGNED_CERT_IN_CHAIN|UNABLE_TO_VERIFY_LEAF_SIGNATURE/.test(networkCode)) {
|
|
144
|
+
return `The provider's TLS certificate could not be verified${target}.`;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Só a mensagem — nunca o objeto de erro inteiro nem o stack.
|
|
148
|
+
const message = redactSecrets(raw || 'Unexpected error.', secretValues).trim();
|
|
149
|
+
return message.length > MAX_ERROR_LENGTH
|
|
150
|
+
? `${message.slice(0, MAX_ERROR_LENGTH - 1)}…`
|
|
151
|
+
: message;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Mensagem curta a partir de uma resposta HTTP de erro, procurando o campo de mensagem
|
|
156
|
+
* nos formatos mais comuns (`error.message`, `error_description`, `message`, `error`).
|
|
157
|
+
*/
|
|
158
|
+
export function describeHttpError(result: ProbeResult, fallback: string): string {
|
|
159
|
+
const body = result.body ?? {};
|
|
160
|
+
const candidate =
|
|
161
|
+
body?.error?.message ??
|
|
162
|
+
body?.error_description ??
|
|
163
|
+
body?.message ??
|
|
164
|
+
(typeof body?.error === 'string' ? body.error : null) ??
|
|
165
|
+
body?.error?.error_user_msg;
|
|
166
|
+
|
|
167
|
+
const message = String(candidate ?? '').trim();
|
|
168
|
+
if (message) return message;
|
|
169
|
+
|
|
170
|
+
return `${fallback} (HTTP ${result.status})`;
|
|
171
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { AI_TESTERS } from './ai.testers';
|
|
2
|
+
import { CAPTCHA_TESTERS } from './captcha.testers';
|
|
3
|
+
import { EMAIL_TESTERS } from './email.testers';
|
|
4
|
+
import { INFRASTRUCTURE_TESTERS } from './infrastructure.testers';
|
|
5
|
+
import { IntegrationTester } from './integration-tester.types';
|
|
6
|
+
import { MESSAGING_TESTERS } from './messaging.testers';
|
|
7
|
+
import { OAUTH_TESTERS } from './oauth.testers';
|
|
8
|
+
import { PAYMENT_TESTERS } from './payment.testers';
|
|
9
|
+
import { STORAGE_TESTERS } from './storage.testers';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Testadores que o core registra sozinho no boot.
|
|
13
|
+
*
|
|
14
|
+
* Providers de outras libraries (nfse-national, da `fiscal`) se registram no próprio
|
|
15
|
+
* módulo, via IntegrationTesterRegistry.
|
|
16
|
+
*/
|
|
17
|
+
export const BUILTIN_INTEGRATION_TESTERS: IntegrationTester[] = [
|
|
18
|
+
...EMAIL_TESTERS,
|
|
19
|
+
...MESSAGING_TESTERS,
|
|
20
|
+
...STORAGE_TESTERS,
|
|
21
|
+
...AI_TESTERS,
|
|
22
|
+
...OAUTH_TESTERS,
|
|
23
|
+
...PAYMENT_TESTERS,
|
|
24
|
+
...CAPTCHA_TESTERS,
|
|
25
|
+
...INFRASTRUCTURE_TESTERS,
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
export * from './http-probe';
|
|
29
|
+
export * from './integration-tester.registry';
|
|
30
|
+
export * from './integration-tester.types';
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
import { Agent } from 'node:https';
|
|
3
|
+
import {
|
|
4
|
+
assertHttpUrl,
|
|
5
|
+
describeHttpError,
|
|
6
|
+
fail,
|
|
7
|
+
pass,
|
|
8
|
+
probeJson,
|
|
9
|
+
requireFields,
|
|
10
|
+
str,
|
|
11
|
+
} from './http-probe';
|
|
12
|
+
import { IntegrationTester } from './integration-tester.types';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Testadores dos providers de infraestrutura (autoscaling).
|
|
16
|
+
*
|
|
17
|
+
* DUPLICAÇÃO INTENCIONAL: `libraries/queue/src/scaling/{digital-ocean,kubernetes-scaler}
|
|
18
|
+
* .service.ts` têm um `testCredentials` equivalente, batendo nos mesmos endpoints.
|
|
19
|
+
* Não dá para reaproveitar: `@hed-hog-pro/queue` depende do core, então o core não pode
|
|
20
|
+
* importá-lo de volta — e os providers `digitalocean`/`kubernetes` são semeados por uma
|
|
21
|
+
* migration do core, existindo mesmo em instalações sem o pacote da fila. Registrar o
|
|
22
|
+
* tester pela queue deixaria o botão quebrado nessas instalações. Se mudar um endpoint
|
|
23
|
+
* aqui, olhe o outro lado também.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
const digitalOceanTester: IntegrationTester = {
|
|
27
|
+
providerSlug: 'digitalocean',
|
|
28
|
+
test: async (config, ctx) => {
|
|
29
|
+
const missing = requireFields(config, [
|
|
30
|
+
['api_token', 'API token'],
|
|
31
|
+
['cluster_id', 'Cluster ID'],
|
|
32
|
+
]);
|
|
33
|
+
if (missing) return missing;
|
|
34
|
+
|
|
35
|
+
const token = String(config.api_token ?? '');
|
|
36
|
+
const clusterId = str(config, 'cluster_id');
|
|
37
|
+
const result = await probeJson(
|
|
38
|
+
`https://api.digitalocean.com/v2/kubernetes/clusters/${encodeURIComponent(clusterId)}`,
|
|
39
|
+
{ headers: { Authorization: `Bearer ${token}` } },
|
|
40
|
+
ctx.signal,
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
if (result.status === 401) return fail('Invalid DigitalOcean API token.');
|
|
44
|
+
if (result.status === 403) {
|
|
45
|
+
return fail('This token has no permission to read Kubernetes clusters.');
|
|
46
|
+
}
|
|
47
|
+
if (result.status === 404) {
|
|
48
|
+
return fail(`Cluster "${clusterId}" was not found in this account.`);
|
|
49
|
+
}
|
|
50
|
+
if (!result.ok) {
|
|
51
|
+
return fail(describeHttpError(result, 'DigitalOcean rejected the request.'));
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const cluster = result.body?.kubernetes_cluster ?? {};
|
|
55
|
+
const label = `${cluster.name ?? clusterId} (${cluster.region ?? str(config, 'region')})`;
|
|
56
|
+
|
|
57
|
+
// O pool de vídeo é escolhido por nome; se ele sumiu do cluster, o autoscaling
|
|
58
|
+
// falha silenciosamente depois — melhor avisar agora.
|
|
59
|
+
const poolName = str(config, 'video_node_pool_name');
|
|
60
|
+
if (poolName) {
|
|
61
|
+
const pools: Array<{ name?: string }> = Array.isArray(cluster.node_pools)
|
|
62
|
+
? cluster.node_pools
|
|
63
|
+
: [];
|
|
64
|
+
if (pools.length > 0 && !pools.some((pool) => pool.name === poolName)) {
|
|
65
|
+
return pass(label, `The node pool "${poolName}" no longer exists in this cluster.`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return pass(label);
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
const kubernetesTester: IntegrationTester = {
|
|
73
|
+
providerSlug: 'kubernetes',
|
|
74
|
+
test: async (config, ctx) => {
|
|
75
|
+
const missing = requireFields(config, [
|
|
76
|
+
['api_server', 'API server'],
|
|
77
|
+
['token', 'Token'],
|
|
78
|
+
]);
|
|
79
|
+
if (missing) return missing;
|
|
80
|
+
|
|
81
|
+
const apiServer = assertHttpUrl(str(config, 'api_server'), 'API server');
|
|
82
|
+
const caCert = String(config.ca_cert ?? '').trim();
|
|
83
|
+
|
|
84
|
+
// Não usamos `fetch` aqui: o CA do cluster é quase sempre privado e a API de fetch
|
|
85
|
+
// não aceita um contexto TLS customizado.
|
|
86
|
+
const httpsAgent = new Agent(
|
|
87
|
+
caCert ? { ca: caCert } : { rejectUnauthorized: false },
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
try {
|
|
91
|
+
const response = await axios.get(`${apiServer.origin}/version`, {
|
|
92
|
+
headers: { Authorization: `Bearer ${String(config.token ?? '')}` },
|
|
93
|
+
httpsAgent,
|
|
94
|
+
signal: ctx.signal,
|
|
95
|
+
validateStatus: () => true,
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
if (response.status === 401) return fail('The Kubernetes token was rejected.');
|
|
99
|
+
if (response.status === 403) {
|
|
100
|
+
return fail('This token has no permission to read the cluster version.');
|
|
101
|
+
}
|
|
102
|
+
if (response.status >= 400) {
|
|
103
|
+
return fail(`The Kubernetes API returned HTTP ${response.status}.`);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const version = String(response.data?.gitVersion ?? '').trim();
|
|
107
|
+
return caCert
|
|
108
|
+
? pass(`${apiServer.host}${version ? ` — ${version}` : ''}`)
|
|
109
|
+
: pass(
|
|
110
|
+
`${apiServer.host}${version ? ` — ${version}` : ''}`,
|
|
111
|
+
'No CA certificate provided: the TLS certificate was not verified.',
|
|
112
|
+
);
|
|
113
|
+
} finally {
|
|
114
|
+
httpsAgent.destroy();
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
export const INFRASTRUCTURE_TESTERS: IntegrationTester[] = [
|
|
120
|
+
digitalOceanTester,
|
|
121
|
+
kubernetesTester,
|
|
122
|
+
];
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { describe, expect, it, jest } from '@jest/globals';
|
|
2
|
+
import { IntegrationTesterRegistry } from './integration-tester.registry';
|
|
3
|
+
import { IntegrationTester } from './integration-tester.types';
|
|
4
|
+
|
|
5
|
+
function makeTester(providerSlug: string, info = 'ok'): IntegrationTester {
|
|
6
|
+
return {
|
|
7
|
+
providerSlug,
|
|
8
|
+
test: async () => ({ ok: true, info }),
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
describe('IntegrationTesterRegistry', () => {
|
|
13
|
+
it('registra e recupera um tester pelo slug do provider', () => {
|
|
14
|
+
const registry = new IntegrationTesterRegistry();
|
|
15
|
+
const tester = makeTester('smtp');
|
|
16
|
+
|
|
17
|
+
registry.register(tester);
|
|
18
|
+
|
|
19
|
+
expect(registry.find('smtp')).toBe(tester);
|
|
20
|
+
expect(registry.has('smtp')).toBe(true);
|
|
21
|
+
expect(registry.list()).toEqual(['smtp']);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it('normaliza o slug (case e espaços) na escrita e na leitura', () => {
|
|
25
|
+
const registry = new IntegrationTesterRegistry();
|
|
26
|
+
registry.register(makeTester(' S3-Compatible '));
|
|
27
|
+
|
|
28
|
+
expect(registry.find('s3-compatible')).not.toBeNull();
|
|
29
|
+
expect(registry.find('S3-COMPATIBLE')).not.toBeNull();
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it('devolve null para provider desconhecido, nulo ou vazio', () => {
|
|
33
|
+
const registry = new IntegrationTesterRegistry();
|
|
34
|
+
|
|
35
|
+
expect(registry.find('inexistente')).toBeNull();
|
|
36
|
+
expect(registry.find(null)).toBeNull();
|
|
37
|
+
expect(registry.find(undefined)).toBeNull();
|
|
38
|
+
expect(registry.find('')).toBeNull();
|
|
39
|
+
expect(registry.has('inexistente')).toBe(false);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it('avisa ao sobrescrever um tester já registrado, mas aceita a substituição', () => {
|
|
43
|
+
const registry = new IntegrationTesterRegistry();
|
|
44
|
+
const warn = jest
|
|
45
|
+
.spyOn((registry as any).logger, 'warn')
|
|
46
|
+
.mockImplementation(() => undefined);
|
|
47
|
+
|
|
48
|
+
const first = makeTester('stripe', 'primeiro');
|
|
49
|
+
const second = makeTester('stripe', 'segundo');
|
|
50
|
+
registry.register(first);
|
|
51
|
+
registry.register(second);
|
|
52
|
+
|
|
53
|
+
expect(warn).toHaveBeenCalledWith(
|
|
54
|
+
'Integration tester for provider "stripe" was overwritten.',
|
|
55
|
+
);
|
|
56
|
+
expect(registry.find('stripe')).toBe(second);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it('recusa um tester sem providerSlug', () => {
|
|
60
|
+
const registry = new IntegrationTesterRegistry();
|
|
61
|
+
|
|
62
|
+
expect(() => registry.register({} as IntegrationTester)).toThrow(
|
|
63
|
+
'Integration tester requires a providerSlug.',
|
|
64
|
+
);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it('lista os providers registrados em ordem alfabética', () => {
|
|
68
|
+
const registry = new IntegrationTesterRegistry();
|
|
69
|
+
['stripe', 'azure-blob', 'openai'].forEach((slug) =>
|
|
70
|
+
registry.register(makeTester(slug)),
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
expect(registry.list()).toEqual(['azure-blob', 'openai', 'stripe']);
|
|
74
|
+
});
|
|
75
|
+
});
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Injectable, Logger } from '@nestjs/common';
|
|
2
|
+
import { IntegrationTester } from './integration-tester.types';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Registro dos testadores de conexão, no mesmo padrão do WebhookProtocolRegistry e do
|
|
6
|
+
* FiscalProviderRegistry: os testers embutidos entram no boot do IntegrationProfileModule
|
|
7
|
+
* e libraries externas registram os seus (é assim que a `fiscal` pluga o nfse-national,
|
|
8
|
+
* que precisa abrir o certificado A1 — código que não pode viver no core).
|
|
9
|
+
*/
|
|
10
|
+
@Injectable()
|
|
11
|
+
export class IntegrationTesterRegistry {
|
|
12
|
+
private readonly logger = new Logger(IntegrationTesterRegistry.name);
|
|
13
|
+
private readonly testers = new Map<string, IntegrationTester>();
|
|
14
|
+
|
|
15
|
+
register(tester: IntegrationTester): void {
|
|
16
|
+
const key = normalizeSlug(tester?.providerSlug);
|
|
17
|
+
if (!key) throw new Error('Integration tester requires a providerSlug.');
|
|
18
|
+
|
|
19
|
+
if (this.testers.has(key)) {
|
|
20
|
+
this.logger.warn(`Integration tester for provider "${key}" was overwritten.`);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
this.testers.set(key, tester);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
find(providerSlug: string | null | undefined): IntegrationTester | null {
|
|
27
|
+
const key = normalizeSlug(providerSlug);
|
|
28
|
+
return key ? (this.testers.get(key) ?? null) : null;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
has(providerSlug: string | null | undefined): boolean {
|
|
32
|
+
return this.find(providerSlug) !== null;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** Providers com teste disponível (para a UI decidir se mostra o botão). */
|
|
36
|
+
list(): string[] {
|
|
37
|
+
return [...this.testers.keys()].sort();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function normalizeSlug(slug: string | null | undefined): string {
|
|
42
|
+
return String(slug ?? '').trim().toLowerCase();
|
|
43
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contrato dos testadores de conexão dos Perfis de Integração.
|
|
3
|
+
*
|
|
4
|
+
* Cada provider (smtp, s3, stripe, google-oauth, …) implementa um `IntegrationTester`
|
|
5
|
+
* que faz uma chamada verificável contra o serviço real e devolve um veredito. O
|
|
6
|
+
* `IntegrationProfileService.test()` só despacha; nenhum `if (provider === 'x')` sobra lá.
|
|
7
|
+
*
|
|
8
|
+
* Os testers são objetos literais sem estado (mesmo estilo de integration-profile.utils.ts),
|
|
9
|
+
* não providers do Nest: assim cada spec é um teste puro de função com `fetch` mockado.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/** Timeout padrão de um teste de conexão. */
|
|
13
|
+
export const INTEGRATION_TEST_TIMEOUT_MS = 10_000;
|
|
14
|
+
|
|
15
|
+
export type IntegrationTestOutcome = {
|
|
16
|
+
ok: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Evidência legível do que foi verificado (nome do bucket, da conta, do cluster…).
|
|
19
|
+
* NUNCA pode conter segredo: vai para a UI e é gravada no config do perfil.
|
|
20
|
+
*/
|
|
21
|
+
info?: string;
|
|
22
|
+
/** Motivo legível da falha. NUNCA contém segredo nem stack trace. */
|
|
23
|
+
error?: string;
|
|
24
|
+
/**
|
|
25
|
+
* Credencial válida, mas algo secundário não pôde ser comprovado (domínio não
|
|
26
|
+
* verificado, service account sem acesso ao app, pool inexistente). Não reprova.
|
|
27
|
+
*/
|
|
28
|
+
warning?: string;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export type IntegrationTestContext = {
|
|
32
|
+
/** Já combinado com o timeout do tester. Repassar a TODA chamada de rede. */
|
|
33
|
+
signal: AbortSignal;
|
|
34
|
+
/** Slug do integration_type (email, storage, oauth, …). */
|
|
35
|
+
typeSlug: string;
|
|
36
|
+
/** Slug do provider sendo testado. */
|
|
37
|
+
providerSlug: string;
|
|
38
|
+
/**
|
|
39
|
+
* Valores dos segredos deste perfil, usados só para redigir mensagens de erro
|
|
40
|
+
* (algumas APIs ecoam a entrada de volta). Nunca logar nem devolver.
|
|
41
|
+
*/
|
|
42
|
+
secretValues: string[];
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export interface IntegrationTester {
|
|
46
|
+
/** Slug do integration_provider que esta implementação atende. */
|
|
47
|
+
readonly providerSlug: string;
|
|
48
|
+
/** Timeout específico deste provider (default INTEGRATION_TEST_TIMEOUT_MS). */
|
|
49
|
+
readonly timeoutMs?: number;
|
|
50
|
+
/**
|
|
51
|
+
* `config` chega DECIFRADO e já mesclado com os segredos armazenados
|
|
52
|
+
* ("deixe em branco para manter"), então o tester nunca vê a máscara.
|
|
53
|
+
*
|
|
54
|
+
* Não deve lançar: devolve `{ ok: false, error }`. Exceções que escaparem viram
|
|
55
|
+
* `ok: false` com a mensagem sanitizada no dispatcher.
|
|
56
|
+
*/
|
|
57
|
+
test(
|
|
58
|
+
config: Record<string, unknown>,
|
|
59
|
+
ctx: IntegrationTestContext,
|
|
60
|
+
): Promise<IntegrationTestOutcome>;
|
|
61
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { buildWhatsappOfficialConfigFromIntegration } from '../integration-profile.utils';
|
|
2
|
+
import {
|
|
3
|
+
assertHttpUrl,
|
|
4
|
+
describeHttpError,
|
|
5
|
+
fail,
|
|
6
|
+
pass,
|
|
7
|
+
probeJson,
|
|
8
|
+
requireFields,
|
|
9
|
+
str,
|
|
10
|
+
} from './http-probe';
|
|
11
|
+
import { IntegrationTester } from './integration-tester.types';
|
|
12
|
+
|
|
13
|
+
const evolutionApiTester: IntegrationTester = {
|
|
14
|
+
providerSlug: 'evolution-api',
|
|
15
|
+
test: async (config, ctx) => {
|
|
16
|
+
const missing = requireFields(config, [
|
|
17
|
+
['host', 'Evolution API host'],
|
|
18
|
+
['token', 'Evolution API token'],
|
|
19
|
+
['instance_name', 'Instance name'],
|
|
20
|
+
]);
|
|
21
|
+
if (missing) return missing;
|
|
22
|
+
|
|
23
|
+
const base = assertHttpUrl(str(config, 'host'), 'Evolution API host');
|
|
24
|
+
const instance = str(config, 'instance_name');
|
|
25
|
+
const url = `${base.origin}/instance/connectionState/${encodeURIComponent(instance)}`;
|
|
26
|
+
|
|
27
|
+
const result = await probeJson(
|
|
28
|
+
url,
|
|
29
|
+
{ headers: { apikey: String(config.token ?? '') } },
|
|
30
|
+
ctx.signal,
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
if (result.status === 401 || result.status === 403) {
|
|
34
|
+
return fail('Invalid Evolution API token.');
|
|
35
|
+
}
|
|
36
|
+
if (result.status === 404) {
|
|
37
|
+
return fail(`Instance "${instance}" was not found on this Evolution API server.`);
|
|
38
|
+
}
|
|
39
|
+
if (!result.ok) {
|
|
40
|
+
return fail(describeHttpError(result, 'Evolution API rejected the request.'));
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const state = String(
|
|
44
|
+
result.body?.instance?.state ?? result.body?.state ?? '',
|
|
45
|
+
).trim();
|
|
46
|
+
|
|
47
|
+
// Credencial válida mas sessão desconectada: o perfil está certo e o QR code é
|
|
48
|
+
// outro problema — avisar sem reprovar.
|
|
49
|
+
if (state && state !== 'open') {
|
|
50
|
+
return pass(
|
|
51
|
+
`${instance} — ${state}`,
|
|
52
|
+
`The instance is not connected (state: ${state}). Scan the QR code in Evolution API.`,
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
return pass(`${instance}${state ? ` — ${state}` : ''}`);
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Valida um perfil whatsapp-official contra a Graph API (lê o WABA com o token).
|
|
61
|
+
* Nunca devolve o token/secret na resposta.
|
|
62
|
+
*/
|
|
63
|
+
const whatsappOfficialTester: IntegrationTester = {
|
|
64
|
+
providerSlug: 'whatsapp-official',
|
|
65
|
+
test: async (config, ctx) => {
|
|
66
|
+
const cfg = buildWhatsappOfficialConfigFromIntegration(config);
|
|
67
|
+
|
|
68
|
+
if (!cfg.accessToken) return fail('WhatsApp access token is required.');
|
|
69
|
+
if (!cfg.wabaId) return fail('WhatsApp Business Account ID is required.');
|
|
70
|
+
if (!cfg.appSecret) {
|
|
71
|
+
return fail('Meta App Secret is required to validate webhook signatures.');
|
|
72
|
+
}
|
|
73
|
+
if (!cfg.verifyToken) return fail('Webhook verify token is required.');
|
|
74
|
+
|
|
75
|
+
const url = `https://graph.facebook.com/${cfg.graphApiVersion}/${encodeURIComponent(
|
|
76
|
+
cfg.wabaId,
|
|
77
|
+
)}?fields=id,name`;
|
|
78
|
+
|
|
79
|
+
const result = await probeJson(
|
|
80
|
+
url,
|
|
81
|
+
{ headers: { Authorization: `Bearer ${cfg.accessToken}` } },
|
|
82
|
+
ctx.signal,
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
if (!result.ok) {
|
|
86
|
+
// A mensagem da Meta não contém o token; ainda assim só propagamos o texto dela.
|
|
87
|
+
return fail(
|
|
88
|
+
`WhatsApp validation failed: ${describeHttpError(
|
|
89
|
+
result,
|
|
90
|
+
'Graph API rejected the request.',
|
|
91
|
+
)}`,
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return pass(String(result.body?.name ?? '') || cfg.wabaId);
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
export const MESSAGING_TESTERS: IntegrationTester[] = [
|
|
100
|
+
evolutionApiTester,
|
|
101
|
+
whatsappOfficialTester,
|
|
102
|
+
];
|