@hed-hog/core 0.0.387 → 0.0.390
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 +12 -11
- package/dist/access-log/access-log.interceptor.d.ts.map +1 -1
- package/dist/access-log/access-log.interceptor.js +4 -2
- package/dist/access-log/access-log.interceptor.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 +7 -16
- package/dist/ai/ai.controller.d.ts.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 +63 -12
- package/dist/ai/ai.service.d.ts.map +1 -1
- package/dist/ai/ai.service.js +215 -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/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-instruction/ai-instruction.controller.d.ts +61 -7
- 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 +24 -9
- package/dist/auth/auth.controller.d.ts.map +1 -1
- package/dist/auth/auth.controller.js +49 -21
- package/dist/auth/auth.controller.js.map +1 -1
- package/dist/auth/auth.service.d.ts +33 -8
- package/dist/auth/auth.service.d.ts.map +1 -1
- package/dist/auth/auth.service.js +78 -29
- package/dist/auth/auth.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 +16 -7
- package/dist/challenge/challenge.service.d.ts.map +1 -1
- package/dist/challenge/challenge.service.js +64 -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 +29 -2
- package/dist/core.module.js.map +1 -1
- package/dist/dashboard/dashboard/dashboard.controller.d.ts +15 -15
- package/dist/dashboard/dashboard/dashboard.service.d.ts +15 -15
- package/dist/dashboard/dashboard-component/dashboard-component.controller.d.ts +6 -6
- package/dist/dashboard/dashboard-component/dashboard-component.service.d.ts +6 -6
- 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 +1 -1
- package/dist/dashboard/dashboard-core/dashboard-core.service.d.ts +1 -1
- 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.service.d.ts +6 -0
- package/dist/file/file.service.d.ts.map +1 -1
- package/dist/file/file.service.js +44 -4
- package/dist/file/file.service.js.map +1 -1
- 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 +26 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +30 -0
- package/dist/index.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 +9 -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 +13 -1
- package/dist/integration-profile/integration-profile.utils.d.ts.map +1 -1
- package/dist/integration-profile/integration-profile.utils.js +20 -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 +128 -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 +4 -2
- package/dist/language/pt.json +4 -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 +7 -0
- package/dist/mail/dto/send.dto.d.ts.map +1 -1
- package/dist/mail/dto/send.dto.js +10 -0
- package/dist/mail/dto/send.dto.js.map +1 -1
- package/dist/mail/mail.controller.d.ts +4 -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.service.d.ts +23 -2
- package/dist/mail/mail.service.d.ts.map +1 -1
- package/dist/mail/mail.service.js +102 -13
- package/dist/mail/mail.service.js.map +1 -1
- 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/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/menu/menu.controller.d.ts +3 -3
- package/dist/menu/menu.service.d.ts +3 -3
- 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/pdf/pdf.service.d.ts +8 -0
- package/dist/pdf/pdf.service.d.ts.map +1 -1
- package/dist/pdf/pdf.service.js +52 -0
- 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 +21 -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 +30 -18
- package/dist/profile/profile.service.d.ts.map +1 -1
- package/dist/profile/profile.service.js +113 -37
- 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 +140 -0
- package/dist/redis/redis-pubsub.js.map +1 -0
- package/dist/role/role.controller.d.ts +3 -3
- package/dist/role/role.service.d.ts +3 -3
- 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.service.d.ts +8 -5
- package/dist/setting/setting.service.d.ts.map +1 -1
- package/dist/setting/setting.service.js +25 -1
- package/dist/setting/setting.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 +17 -5
- 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 +28 -6
- package/dist/user/user.service.d.ts.map +1 -1
- package/dist/user/user.service.js +204 -13
- package/dist/user/user.service.js.map +1 -1
- 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/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 +16 -0
- package/hedhog/data/mail.yaml +88 -61
- package/hedhog/data/mail_layout.yaml +188 -0
- package/hedhog/data/menu.yaml +67 -3
- package/hedhog/data/route.yaml +135 -0
- package/hedhog/data/setting_group.yaml +139 -1
- package/hedhog/frontend/app/account/components/mfa-setup-dialog.tsx.ejs +36 -0
- package/hedhog/frontend/app/account/components/two-factor-auth.tsx.ejs +2 -0
- package/hedhog/frontend/app/account/hooks/use-mfa-setup.ts.ejs +10 -7
- 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.tsx.ejs +51 -4
- 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/template/page.tsx.ejs +155 -121
- 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/page.tsx.ejs +119 -13
- package/hedhog/frontend/app/users/user-activity-timeline.tsx.ejs +231 -0
- package/hedhog/frontend/app/users/user-mails.tsx.ejs +399 -0
- package/hedhog/frontend/app/users/user-sheet.tsx.ejs +60 -75
- package/hedhog/frontend/messages/en.json +499 -3
- package/hedhog/frontend/messages/pt.json +499 -3
- package/hedhog/table/ai_agent.yaml +1 -0
- package/hedhog/table/ai_instruction.yaml +15 -0
- package/hedhog/table/leaked_password.yaml +18 -0
- package/hedhog/table/mail_layout.yaml +35 -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_presence.yaml +36 -0
- package/package.json +8 -4
- package/src/access-log/access-log.interceptor.ts +4 -2
- package/src/ai/ai-attachment.fragments.spec.ts +319 -0
- package/src/ai/ai-attachment.fragments.ts +35 -0
- package/src/ai/ai.prompts.ts +38 -0
- package/src/ai/ai.service.spec.ts +280 -0
- package/src/ai/ai.service.ts +338 -82
- package/src/ai/dto/chat.dto.ts +33 -3
- package/src/ai/dto/create-agent.dto.ts +2 -2
- package/src/ai/dto/update-agent.dto.ts +2 -2
- 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 +31 -5
- package/src/auth/auth.service.spec.ts +3 -1
- package/src/auth/auth.service.ts +101 -36
- 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 +39 -4
- package/src/challenge/challenge.service.ts +72 -17
- package/src/core.module.ts +27 -1
- package/src/file/file.service.spec.ts +105 -0
- package/src/file/file.service.ts +60 -3
- 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 +37 -0
- 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 +9 -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 +40 -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 +161 -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 +4 -2
- package/src/language/pt.json +4 -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 +14 -1
- package/src/mail/mail-template.spec.ts +197 -0
- package/src/mail/mail.controller.ts +9 -2
- package/src/mail/mail.service.spec.ts +116 -1
- package/src/mail/mail.service.ts +118 -12
- 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/mcp-chat/mcp-chat.service.spec.ts +236 -0
- package/src/mcp-chat/mcp-chat.service.ts +122 -26
- 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/pdf/pdf.service.ts +75 -0
- 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 +138 -38
- 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 +179 -0
- package/src/setting/dto/create.dto.ts +13 -2
- package/src/setting/setting.service.spec.ts +56 -0
- package/src/setting/setting.service.ts +29 -1
- 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 +153 -0
- package/src/user/user.service.ts +255 -12
- package/src/validators/is-strong-password-with-settings.validator.ts +12 -0
- package/src/validators/service-locator.ts +15 -0
- package/src/whatsapp-sender/whatsapp-sender.module.ts +10 -0
- package/src/whatsapp-sender/whatsapp-sender.service.ts +313 -0
|
@@ -1,12 +1,26 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import {
|
|
2
|
+
IsBoolean,
|
|
3
|
+
IsIn,
|
|
4
|
+
IsInt,
|
|
5
|
+
IsNumber,
|
|
6
|
+
IsObject,
|
|
7
|
+
IsOptional,
|
|
8
|
+
IsString,
|
|
9
|
+
Max,
|
|
10
|
+
MaxLength,
|
|
11
|
+
Min,
|
|
12
|
+
} from 'class-validator';
|
|
13
|
+
import {
|
|
14
|
+
AI_INSTRUCTION_LAYERS,
|
|
15
|
+
AiInstructionLayer,
|
|
16
|
+
} from '../types/ai-instruction.types';
|
|
3
17
|
|
|
4
18
|
export class CreateAiInstructionDTO {
|
|
5
19
|
@IsString()
|
|
6
20
|
@MaxLength(255)
|
|
7
21
|
slug: string;
|
|
8
22
|
|
|
9
|
-
@
|
|
23
|
+
@IsIn(AI_INSTRUCTION_LAYERS)
|
|
10
24
|
layer: AiInstructionLayer;
|
|
11
25
|
|
|
12
26
|
@IsString()
|
|
@@ -33,4 +47,26 @@ export class CreateAiInstructionDTO {
|
|
|
33
47
|
@IsOptional()
|
|
34
48
|
@IsBoolean()
|
|
35
49
|
is_active?: boolean;
|
|
50
|
+
|
|
51
|
+
@IsOptional()
|
|
52
|
+
@IsString()
|
|
53
|
+
@MaxLength(100)
|
|
54
|
+
model?: string | null;
|
|
55
|
+
|
|
56
|
+
@IsOptional()
|
|
57
|
+
@IsNumber()
|
|
58
|
+
@Min(0)
|
|
59
|
+
@Max(2)
|
|
60
|
+
temperature?: number | null;
|
|
61
|
+
|
|
62
|
+
@IsOptional()
|
|
63
|
+
@IsInt()
|
|
64
|
+
@Min(1)
|
|
65
|
+
@Max(200000)
|
|
66
|
+
max_tokens?: number | null;
|
|
67
|
+
|
|
68
|
+
/** Save even when required variables are missing from the content. */
|
|
69
|
+
@IsOptional()
|
|
70
|
+
@IsBoolean()
|
|
71
|
+
allow_missing_variables?: boolean;
|
|
36
72
|
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { IsObject, IsOptional, IsString, MaxLength } from 'class-validator';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Stateless render of a draft. The admin sends the content currently in the
|
|
5
|
+
* textarea — unsaved — so the editor can see the interpolated result before
|
|
6
|
+
* committing to it.
|
|
7
|
+
*/
|
|
8
|
+
export class PreviewAiInstructionDTO {
|
|
9
|
+
@IsString()
|
|
10
|
+
content: string;
|
|
11
|
+
|
|
12
|
+
/** Only used to look up the registry definition (guard phrases, variables). */
|
|
13
|
+
@IsOptional()
|
|
14
|
+
@IsString()
|
|
15
|
+
@MaxLength(255)
|
|
16
|
+
slug?: string;
|
|
17
|
+
|
|
18
|
+
/** Fallback when the slug is not registered in code. */
|
|
19
|
+
@IsOptional()
|
|
20
|
+
@IsObject()
|
|
21
|
+
variables_schema?: Record<string, any>;
|
|
22
|
+
|
|
23
|
+
@IsOptional()
|
|
24
|
+
@IsObject()
|
|
25
|
+
variables?: Record<string, string | number | boolean>;
|
|
26
|
+
}
|
|
@@ -1,5 +1,19 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
IsBoolean,
|
|
3
|
+
IsInt,
|
|
4
|
+
IsNumber,
|
|
5
|
+
IsObject,
|
|
6
|
+
IsOptional,
|
|
7
|
+
IsString,
|
|
8
|
+
Max,
|
|
9
|
+
MaxLength,
|
|
10
|
+
Min,
|
|
11
|
+
} from 'class-validator';
|
|
2
12
|
|
|
13
|
+
/**
|
|
14
|
+
* `slug` and `layer` are intentionally absent — they are immutable after
|
|
15
|
+
* creation, since the calling code resolves prompts by slug.
|
|
16
|
+
*/
|
|
3
17
|
export class UpdateAiInstructionDTO {
|
|
4
18
|
@IsOptional()
|
|
5
19
|
@IsString()
|
|
@@ -32,4 +46,31 @@ export class UpdateAiInstructionDTO {
|
|
|
32
46
|
@IsString()
|
|
33
47
|
@MaxLength(500)
|
|
34
48
|
change_note?: string;
|
|
49
|
+
|
|
50
|
+
@IsOptional()
|
|
51
|
+
@IsString()
|
|
52
|
+
@MaxLength(100)
|
|
53
|
+
model?: string | null;
|
|
54
|
+
|
|
55
|
+
@IsOptional()
|
|
56
|
+
@IsNumber()
|
|
57
|
+
@Min(0)
|
|
58
|
+
@Max(2)
|
|
59
|
+
temperature?: number | null;
|
|
60
|
+
|
|
61
|
+
@IsOptional()
|
|
62
|
+
@IsInt()
|
|
63
|
+
@Min(1)
|
|
64
|
+
@Max(200000)
|
|
65
|
+
max_tokens?: number | null;
|
|
66
|
+
|
|
67
|
+
/** Save even when required variables are missing from the content. */
|
|
68
|
+
@IsOptional()
|
|
69
|
+
@IsBoolean()
|
|
70
|
+
allow_missing_variables?: boolean;
|
|
71
|
+
|
|
72
|
+
/** Required to edit a record flagged `is_locked` (security-sensitive prompt). */
|
|
73
|
+
@IsOptional()
|
|
74
|
+
@IsBoolean()
|
|
75
|
+
acknowledge_security_review?: boolean;
|
|
35
76
|
}
|
|
@@ -4,7 +4,18 @@ export type AiInstructionLayer =
|
|
|
4
4
|
| 'module'
|
|
5
5
|
| 'agent'
|
|
6
6
|
| 'tool'
|
|
7
|
-
| 'output'
|
|
7
|
+
| 'output'
|
|
8
|
+
| 'task';
|
|
9
|
+
|
|
10
|
+
export const AI_INSTRUCTION_LAYERS: AiInstructionLayer[] = [
|
|
11
|
+
'system',
|
|
12
|
+
'product',
|
|
13
|
+
'module',
|
|
14
|
+
'agent',
|
|
15
|
+
'tool',
|
|
16
|
+
'output',
|
|
17
|
+
'task',
|
|
18
|
+
];
|
|
8
19
|
|
|
9
20
|
export type AiInstructionRecord = {
|
|
10
21
|
id: number;
|
|
@@ -17,10 +28,22 @@ export type AiInstructionRecord = {
|
|
|
17
28
|
module_slug: string | null;
|
|
18
29
|
is_active: boolean;
|
|
19
30
|
version: number;
|
|
31
|
+
/** NULL means "keep whatever the calling code already uses". */
|
|
32
|
+
model: string | null;
|
|
33
|
+
temperature: number | null;
|
|
34
|
+
max_tokens: number | null;
|
|
35
|
+
/** Editing requires an explicit acknowledgement (security-sensitive prompt). */
|
|
36
|
+
is_locked: boolean;
|
|
20
37
|
created_at: Date;
|
|
21
38
|
updated_at: Date;
|
|
22
39
|
};
|
|
23
40
|
|
|
41
|
+
export type AiInstructionListFilters = {
|
|
42
|
+
layer?: AiInstructionLayer;
|
|
43
|
+
module_slug?: string;
|
|
44
|
+
is_active?: boolean;
|
|
45
|
+
};
|
|
46
|
+
|
|
24
47
|
export type AiExecutionTrigger = 'manual' | 'webhook' | 'schedule' | 'tool' | 'api';
|
|
25
48
|
export type AiExecutionStatus = 'running' | 'completed' | 'failed' | 'cancelled';
|
|
26
49
|
export type AiExecutionStepType = 'prompt' | 'tool_call' | 'tool_result' | 'output' | 'error';
|
|
@@ -103,9 +103,10 @@ export class AuthController {
|
|
|
103
103
|
@Ip() ipAddress: string,
|
|
104
104
|
@Headers('user-agent') userAgent: string,
|
|
105
105
|
@Headers('x-browser-id') browserId: string,
|
|
106
|
+
@Headers('origin') origin: string,
|
|
106
107
|
@Res({ passthrough: true }) res,
|
|
107
108
|
) {
|
|
108
|
-
return this.service.loginWithEmailAndPassword(res, locale, ipAddress, userAgent, data, browserId || null);
|
|
109
|
+
return this.service.loginWithEmailAndPassword(res, locale, ipAddress, userAgent, data, browserId || null, origin);
|
|
109
110
|
}
|
|
110
111
|
|
|
111
112
|
@Public()
|
|
@@ -118,18 +119,22 @@ export class AuthController {
|
|
|
118
119
|
@Ip() ipAddress: string,
|
|
119
120
|
@Headers('user-agent') userAgent: string,
|
|
120
121
|
@Headers('x-browser-id') browserId: string,
|
|
122
|
+
@Headers('origin') origin: string,
|
|
121
123
|
@Res({ passthrough: true }) res,
|
|
122
124
|
) {
|
|
123
|
-
return this.service.emailVerificationLogin(locale, token, code, ipAddress, userAgent, res, browserId || null);
|
|
125
|
+
return this.service.emailVerificationLogin(locale, token, code, ipAddress, userAgent, res, browserId || null, origin);
|
|
124
126
|
}
|
|
125
127
|
|
|
126
128
|
@Public()
|
|
129
|
+
@UseGuards(ThrottlerGuard)
|
|
130
|
+
@Throttle({ default: { limit: 10, ttl: 60_000 } })
|
|
127
131
|
@Post('login-email-verification-resend')
|
|
128
132
|
async emailVerificationLoginResend(
|
|
129
133
|
@Locale() locale: string,
|
|
130
134
|
@Body() {token}: LoginEmailVerificationResendDTO,
|
|
135
|
+
@Headers('origin') origin: string,
|
|
131
136
|
) {
|
|
132
|
-
return this.service.emailVerificationLoginResend(locale, token);
|
|
137
|
+
return this.service.emailVerificationLoginResend(locale, token, origin);
|
|
133
138
|
}
|
|
134
139
|
|
|
135
140
|
@Public()
|
|
@@ -151,6 +156,7 @@ export class AuthController {
|
|
|
151
156
|
@Ip() ipAddress: string,
|
|
152
157
|
@Headers('user-agent') userAgent: string,
|
|
153
158
|
@Headers('x-browser-id') browserId: string,
|
|
159
|
+
@Headers('origin') origin: string,
|
|
154
160
|
@Res({ passthrough: true }) res,
|
|
155
161
|
) {
|
|
156
162
|
const { accessToken, refreshToken, session, requiresPasswordReset } = await this.service.verifyMfaCode(
|
|
@@ -161,6 +167,7 @@ export class AuthController {
|
|
|
161
167
|
userAgent,
|
|
162
168
|
methodType,
|
|
163
169
|
browserId || null,
|
|
170
|
+
origin,
|
|
164
171
|
);
|
|
165
172
|
|
|
166
173
|
await this.token.setRefreshTokenCookie(locale, res, refreshToken, session.expires_at);
|
|
@@ -193,15 +200,20 @@ export class AuthController {
|
|
|
193
200
|
}
|
|
194
201
|
|
|
195
202
|
@Public()
|
|
203
|
+
@UseGuards(ThrottlerGuard)
|
|
204
|
+
@Throttle({ default: { limit: 10, ttl: 60_000 } })
|
|
196
205
|
@Post('resend-mfa-code')
|
|
197
206
|
async resendMfaCode(
|
|
198
207
|
@Locale() locale: string,
|
|
199
208
|
@Body() { token }: ResendMfaCodeDTO,
|
|
209
|
+
@Headers('origin') origin: string,
|
|
200
210
|
) {
|
|
201
|
-
return this.service.resendMfaCode(locale, token);
|
|
211
|
+
return this.service.resendMfaCode(locale, token, origin);
|
|
202
212
|
}
|
|
203
213
|
|
|
204
214
|
@Public()
|
|
215
|
+
@UseGuards(ThrottlerGuard)
|
|
216
|
+
@Throttle({ default: { limit: 10, ttl: 60_000 } })
|
|
205
217
|
@Post('webauthn/generate')
|
|
206
218
|
async generateWebAuthnOptions(
|
|
207
219
|
@Locale() locale: string,
|
|
@@ -212,6 +224,8 @@ export class AuthController {
|
|
|
212
224
|
}
|
|
213
225
|
|
|
214
226
|
@Public()
|
|
227
|
+
@UseGuards(ThrottlerGuard)
|
|
228
|
+
@Throttle({ default: { limit: 10, ttl: 60_000 } })
|
|
215
229
|
@Post('webauthn/verify')
|
|
216
230
|
async verifyWebAuthn(
|
|
217
231
|
@Locale() locale: string,
|
|
@@ -268,8 +282,9 @@ export class AuthController {
|
|
|
268
282
|
@Body() { password, code }: ResetDTO,
|
|
269
283
|
@Ip() ipAddress: string,
|
|
270
284
|
@Headers('user-agent') userAgent: string,
|
|
285
|
+
@Headers('origin') origin: string,
|
|
271
286
|
) {
|
|
272
|
-
return this.service.forgotResetPassword(locale, password, code, ipAddress, userAgent);
|
|
287
|
+
return this.service.forgotResetPassword(locale, password, code, ipAddress, userAgent, origin);
|
|
273
288
|
}
|
|
274
289
|
|
|
275
290
|
@Public()
|
|
@@ -291,4 +306,15 @@ export class AuthController {
|
|
|
291
306
|
) {
|
|
292
307
|
return this.service.completeAccount(locale, { password, code, name }, ipAddress, userAgent);
|
|
293
308
|
}
|
|
309
|
+
|
|
310
|
+
@Public()
|
|
311
|
+
@Post('complete-account/authorize')
|
|
312
|
+
async authorizeAccountInvite(
|
|
313
|
+
@Locale() locale: string,
|
|
314
|
+
@Body() { code }: VerifyAccountInviteDTO,
|
|
315
|
+
@Ip() ipAddress: string,
|
|
316
|
+
@Headers('user-agent') userAgent: string,
|
|
317
|
+
) {
|
|
318
|
+
return this.service.authorizeAccountInvite(locale, code, ipAddress, userAgent);
|
|
319
|
+
}
|
|
294
320
|
}
|
|
@@ -62,6 +62,7 @@ const makeDeps = () => {
|
|
|
62
62
|
forgotEmail: jest.fn(),
|
|
63
63
|
verifyCodePassword: jest.fn(),
|
|
64
64
|
verifyMfaEmailCode: jest.fn(),
|
|
65
|
+
resolveAppKeyFromOrigin: jest.fn().mockResolvedValue(undefined),
|
|
65
66
|
};
|
|
66
67
|
return { prisma, mail, setting, security, token, session, user, challenge };
|
|
67
68
|
};
|
|
@@ -203,6 +204,7 @@ describe('AuthService', () => {
|
|
|
203
204
|
'pt-BR',
|
|
204
205
|
1,
|
|
205
206
|
['mfa@b.com'],
|
|
207
|
+
undefined,
|
|
206
208
|
);
|
|
207
209
|
expect(result).toEqual({
|
|
208
210
|
requiresMfa: true,
|
|
@@ -655,7 +657,7 @@ describe('AuthService', () => {
|
|
|
655
657
|
|
|
656
658
|
const result = await service.resendMfaCode('pt-BR', 'mfa-token');
|
|
657
659
|
|
|
658
|
-
expect(deps.challenge.sendMfaCodeByEmail).toHaveBeenCalledWith('pt-BR', 1, 'a@b.com');
|
|
660
|
+
expect(deps.challenge.sendMfaCodeByEmail).toHaveBeenCalledWith('pt-BR', 1, 'a@b.com', undefined);
|
|
659
661
|
expect(result).toEqual({ success: true, hasEmailMfa: true });
|
|
660
662
|
});
|
|
661
663
|
});
|
package/src/auth/auth.service.ts
CHANGED
|
@@ -17,6 +17,7 @@ import { SecurityService } from '../security/security.service';
|
|
|
17
17
|
import { SessionService } from '../session/session.service';
|
|
18
18
|
import { SettingService } from '../setting/setting.service';
|
|
19
19
|
import { TokenService } from '../token/token.service';
|
|
20
|
+
import { hasPendingPasswordReset } from '../user/user-credential.util';
|
|
20
21
|
import { UserService } from '../user/user.service';
|
|
21
22
|
import { resolveWebAuthnOrigin } from '../utils/webauthn-origin';
|
|
22
23
|
import { ForgetDTO } from './dto/forget.dto';
|
|
@@ -66,14 +67,7 @@ export class AuthService {
|
|
|
66
67
|
}
|
|
67
68
|
|
|
68
69
|
private hasPendingPasswordReset(user: User | any) {
|
|
69
|
-
return
|
|
70
|
-
user?.user_credential?.some(
|
|
71
|
-
(credential) =>
|
|
72
|
-
credential.type === 'password' &&
|
|
73
|
-
credential.requires_reset === true &&
|
|
74
|
-
!credential.revoked_at,
|
|
75
|
-
),
|
|
76
|
-
);
|
|
70
|
+
return hasPendingPasswordReset(user);
|
|
77
71
|
}
|
|
78
72
|
|
|
79
73
|
private async getRequiresPasswordResetByUserId(userId: number) {
|
|
@@ -90,7 +84,7 @@ export class AuthService {
|
|
|
90
84
|
return Boolean(credential?.id);
|
|
91
85
|
}
|
|
92
86
|
|
|
93
|
-
async requiresMfaForLogin(locale: string, email: string, user: any) {
|
|
87
|
+
async requiresMfaForLogin(locale: string, email: string, user: any, origin?: string) {
|
|
94
88
|
|
|
95
89
|
const settings = await this.setting.getSettingValues([
|
|
96
90
|
'require-mfa',
|
|
@@ -160,7 +154,8 @@ export class AuthService {
|
|
|
160
154
|
variables: {
|
|
161
155
|
code,
|
|
162
156
|
name: user.name,
|
|
163
|
-
}
|
|
157
|
+
},
|
|
158
|
+
app: await this.challenge.resolveAppKeyFromOrigin(origin),
|
|
164
159
|
}
|
|
165
160
|
);
|
|
166
161
|
|
|
@@ -173,7 +168,7 @@ export class AuthService {
|
|
|
173
168
|
}
|
|
174
169
|
}
|
|
175
170
|
|
|
176
|
-
async requiresEmailVerificationForLogin(locale: string, email: string, user: any) {
|
|
171
|
+
async requiresEmailVerificationForLogin(locale: string, email: string, user: any, origin?: string) {
|
|
177
172
|
|
|
178
173
|
const settings = await this.setting.getSettingValues([
|
|
179
174
|
'require-mfa',
|
|
@@ -217,7 +212,8 @@ export class AuthService {
|
|
|
217
212
|
variables: {
|
|
218
213
|
code,
|
|
219
214
|
name: user.name,
|
|
220
|
-
}
|
|
215
|
+
},
|
|
216
|
+
app: await this.challenge.resolveAppKeyFromOrigin(origin),
|
|
221
217
|
}
|
|
222
218
|
);
|
|
223
219
|
|
|
@@ -231,7 +227,7 @@ export class AuthService {
|
|
|
231
227
|
|
|
232
228
|
}
|
|
233
229
|
|
|
234
|
-
async emailVerificationLoginResend(locale: string, token: string) {
|
|
230
|
+
async emailVerificationLoginResend(locale: string, token: string, origin?: string) {
|
|
235
231
|
|
|
236
232
|
try {
|
|
237
233
|
const payload = await this.token.verify(locale, token);
|
|
@@ -253,25 +249,25 @@ export class AuthService {
|
|
|
253
249
|
|
|
254
250
|
const user = await this.user.findUserById(locale, challenge.user_identifier.user_id);
|
|
255
251
|
|
|
256
|
-
return await this.requiresEmailVerificationForLogin(locale, payload.email, user);
|
|
252
|
+
return await this.requiresEmailVerificationForLogin(locale, payload.email, user, origin);
|
|
257
253
|
|
|
258
254
|
} catch (error: any) {
|
|
259
255
|
if (error.message?.includes('jwt expired') || error.name === 'TokenExpiredError') {
|
|
260
|
-
|
|
256
|
+
|
|
261
257
|
const expiredPayload = await this.token.decodeExpiredToken(token);
|
|
262
258
|
const newToken = await this.token.createAccessToken({
|
|
263
259
|
challengeIdentifierId: expiredPayload.challengeIdentifierId,
|
|
264
260
|
email: expiredPayload.email
|
|
265
261
|
});
|
|
266
262
|
|
|
267
|
-
return this.emailVerificationLoginResend(locale, newToken);
|
|
263
|
+
return this.emailVerificationLoginResend(locale, newToken, origin);
|
|
268
264
|
}
|
|
269
|
-
|
|
265
|
+
|
|
270
266
|
throw error;
|
|
271
267
|
}
|
|
272
268
|
}
|
|
273
269
|
|
|
274
|
-
async emailVerificationLogin(locale: string, token: string, code: string, ipAddress: string, userAgent: string, res: any, browserId?: string | null) {
|
|
270
|
+
async emailVerificationLogin(locale: string, token: string, code: string, ipAddress: string, userAgent: string, res: any, browserId?: string | null, origin?: string) {
|
|
275
271
|
|
|
276
272
|
try {
|
|
277
273
|
const payload = await this.token.verify(locale, token);
|
|
@@ -324,14 +320,25 @@ export class AuthService {
|
|
|
324
320
|
|
|
325
321
|
const user = await this.user.findUserById(locale, challenge.user_identifier.user_id);
|
|
326
322
|
|
|
327
|
-
return this.login(locale, user as unknown as User, ipAddress, userAgent, res, browserId);
|
|
323
|
+
return this.login(locale, user as unknown as User, ipAddress, userAgent, res, browserId, origin);
|
|
328
324
|
|
|
329
325
|
} catch (error) {
|
|
330
326
|
throw error;
|
|
331
327
|
}
|
|
332
328
|
}
|
|
333
329
|
|
|
334
|
-
private async login(locale: string, user: User, ipAddress: string, userAgent: string, res: any, browserId?: string | null) {
|
|
330
|
+
private async login(locale: string, user: User, ipAddress: string, userAgent: string, res: any, browserId?: string | null, origin?: string) {
|
|
331
|
+
|
|
332
|
+
// Conta excluída pelo próprio usuário: os identificadores já foram
|
|
333
|
+
// anonimizados, mas a checagem fecha qualquer caminho remanescente.
|
|
334
|
+
const account = await this.prisma.user.findUnique({
|
|
335
|
+
where: { id: user.id },
|
|
336
|
+
select: { deactivated_at: true },
|
|
337
|
+
});
|
|
338
|
+
|
|
339
|
+
if (account?.deactivated_at) {
|
|
340
|
+
throw new BadRequestException(getLocaleText('accessDenied', locale, 'Access denied.'));
|
|
341
|
+
}
|
|
335
342
|
|
|
336
343
|
const emails = await this.prisma.user_identifier.findMany({
|
|
337
344
|
where: {
|
|
@@ -353,6 +360,8 @@ export class AuthService {
|
|
|
353
360
|
browserId,
|
|
354
361
|
);
|
|
355
362
|
|
|
363
|
+
const app = await this.challenge.resolveAppKeyFromOrigin(origin);
|
|
364
|
+
|
|
356
365
|
for (const emailObj of emails) {
|
|
357
366
|
|
|
358
367
|
this.mail.sendTemplatedMail(
|
|
@@ -365,7 +374,8 @@ export class AuthService {
|
|
|
365
374
|
ipAddress,
|
|
366
375
|
userAgent,
|
|
367
376
|
location: 'Unknown',
|
|
368
|
-
}
|
|
377
|
+
},
|
|
378
|
+
app,
|
|
369
379
|
}
|
|
370
380
|
);
|
|
371
381
|
|
|
@@ -391,6 +401,7 @@ export class AuthService {
|
|
|
391
401
|
userAgent: string,
|
|
392
402
|
{ email, password }: LoginDTO,
|
|
393
403
|
browserId?: string | null,
|
|
404
|
+
origin?: string,
|
|
394
405
|
) {
|
|
395
406
|
|
|
396
407
|
const user = await this.user.findUserByEmail(locale, email);
|
|
@@ -428,11 +439,11 @@ export class AuthService {
|
|
|
428
439
|
|
|
429
440
|
if (emailMfas.length > 0) {
|
|
430
441
|
const emails = emailMfas.map(mfa => mfa.user_mfa_email[0].email);
|
|
431
|
-
await this.challenge.sendMfaCodeToMultipleEmails(locale, user.id, emails);
|
|
442
|
+
await this.challenge.sendMfaCodeToMultipleEmails(locale, user.id, emails, origin);
|
|
432
443
|
}
|
|
433
444
|
|
|
434
|
-
return {
|
|
435
|
-
requiresMfa: true,
|
|
445
|
+
return {
|
|
446
|
+
requiresMfa: true,
|
|
436
447
|
mfaToken,
|
|
437
448
|
mfaMethods: mfaMethods.map(m => ({ type: m.type, id: m.id }))
|
|
438
449
|
};
|
|
@@ -447,15 +458,15 @@ export class AuthService {
|
|
|
447
458
|
|
|
448
459
|
if (settings['require-mfa'] === true && mfaMethods.length === 0) {
|
|
449
460
|
|
|
450
|
-
return this.requiresMfaForLogin(locale, email, user);
|
|
461
|
+
return this.requiresMfaForLogin(locale, email, user, origin);
|
|
451
462
|
|
|
452
463
|
} else if (settings['require-email-verification'] === true && identifier?.verified_at === null) {
|
|
453
464
|
|
|
454
|
-
return this.requiresEmailVerificationForLogin(locale, email, user);
|
|
465
|
+
return this.requiresEmailVerificationForLogin(locale, email, user, origin);
|
|
455
466
|
|
|
456
467
|
}
|
|
457
468
|
|
|
458
|
-
return this.login(locale, user as unknown as User, ipAddress, userAgent, res, browserId);
|
|
469
|
+
return this.login(locale, user as unknown as User, ipAddress, userAgent, res, browserId, origin);
|
|
459
470
|
}
|
|
460
471
|
|
|
461
472
|
async verifyRoles(_locale: string, userId: number) {
|
|
@@ -530,7 +541,7 @@ export class AuthService {
|
|
|
530
541
|
return { success: true };
|
|
531
542
|
}
|
|
532
543
|
|
|
533
|
-
async forgotResetPassword(locale: string, password: string, code: string, ipAddress: string, userAgent: string) {
|
|
544
|
+
async forgotResetPassword(locale: string, password: string, code: string, ipAddress: string, userAgent: string, origin?: string) {
|
|
534
545
|
const challenge = await this.challenge.verifyCodePassword(locale, code);
|
|
535
546
|
const userIdentifier = challenge.user_identifier;
|
|
536
547
|
const passwordHash = await this.security.hashArgon2(password);
|
|
@@ -550,12 +561,13 @@ export class AuthService {
|
|
|
550
561
|
slug: 'auth-forget-password-confirmation',
|
|
551
562
|
variables: {
|
|
552
563
|
name: userIdentifier.user.name,
|
|
553
|
-
}
|
|
564
|
+
},
|
|
565
|
+
app: await this.challenge.resolveAppKeyFromOrigin(origin),
|
|
554
566
|
}
|
|
555
567
|
);
|
|
556
568
|
|
|
557
569
|
const { accessToken, refreshToken, session } = await this.getAuthenticationPayload(locale, userIdentifier.user_id, ipAddress, userAgent);
|
|
558
|
-
await this.user.registerUserActivity(userIdentifier.
|
|
570
|
+
await this.user.registerUserActivity(userIdentifier.user_id, "resetPassword")
|
|
559
571
|
return { accessToken, refreshToken, session }
|
|
560
572
|
}
|
|
561
573
|
|
|
@@ -619,16 +631,67 @@ export class AuthService {
|
|
|
619
631
|
/**
|
|
620
632
|
* Valida (sem consumir) um token de convite de criação de conta e retorna os
|
|
621
633
|
* dados básicos para pré-preencher o formulário no app de treinamentos.
|
|
634
|
+
* `hasAccount` diz se esse usuário já tem um jeito de entrar (senha ativa ou
|
|
635
|
+
* provedor externo vinculado) — usado pelo app para decidir entre mostrar o
|
|
636
|
+
* formulário de criação de conta ou uma tela de autorização de acesso.
|
|
622
637
|
*/
|
|
623
638
|
async verifyAccountInvite(locale: string, code: string) {
|
|
624
639
|
const challenge = await this.challenge.verifyCodePassword(locale, code);
|
|
640
|
+
const userId = challenge.user_identifier.user_id;
|
|
641
|
+
|
|
642
|
+
const [passwordCount, oauthCount] = await Promise.all([
|
|
643
|
+
this.prisma.user_credential.count({
|
|
644
|
+
where: { user_id: userId, type: 'password', revoked_at: null },
|
|
645
|
+
}),
|
|
646
|
+
this.prisma.user_account.count({ where: { user_id: userId } }),
|
|
647
|
+
]);
|
|
648
|
+
|
|
625
649
|
return {
|
|
626
650
|
valid: true,
|
|
627
651
|
name: challenge.user_identifier.user?.name ?? null,
|
|
628
652
|
email: challenge.user_identifier.value,
|
|
653
|
+
hasAccount: passwordCount > 0 || oauthCount > 0,
|
|
629
654
|
};
|
|
630
655
|
}
|
|
631
656
|
|
|
657
|
+
/**
|
|
658
|
+
* Conclui um convite de acesso para quem já tem conta (senha ou provedor
|
|
659
|
+
* externo): não define senha nenhuma, só prova controle do e-mail (mesmo
|
|
660
|
+
* nível de confiança do link de reset de senha) e autentica o usuário.
|
|
661
|
+
*/
|
|
662
|
+
async authorizeAccountInvite(
|
|
663
|
+
locale: string,
|
|
664
|
+
code: string,
|
|
665
|
+
ipAddress: string,
|
|
666
|
+
userAgent: string,
|
|
667
|
+
) {
|
|
668
|
+
const challenge = await this.challenge.verifyCodePassword(locale, code);
|
|
669
|
+
const userIdentifier = challenge.user_identifier;
|
|
670
|
+
|
|
671
|
+
if (!userIdentifier.verified_at || !userIdentifier.enabled) {
|
|
672
|
+
await this.prisma.user_identifier.update({
|
|
673
|
+
where: { id: userIdentifier.id },
|
|
674
|
+
data: { verified_at: userIdentifier.verified_at ?? new Date(), enabled: true },
|
|
675
|
+
});
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
// Consome o challenge para impedir reuso do link.
|
|
679
|
+
await this.prisma.user_identifier_challenge.updateMany({
|
|
680
|
+
where: { id: challenge.id },
|
|
681
|
+
data: { verified_at: new Date(), expires_at: new Date() },
|
|
682
|
+
});
|
|
683
|
+
|
|
684
|
+
const { accessToken, refreshToken, session } =
|
|
685
|
+
await this.getAuthenticationPayload(
|
|
686
|
+
locale,
|
|
687
|
+
userIdentifier.user_id,
|
|
688
|
+
ipAddress,
|
|
689
|
+
userAgent,
|
|
690
|
+
);
|
|
691
|
+
await this.user.registerUserActivity(userIdentifier.user_id, 'authorizeAccountInvite');
|
|
692
|
+
return { accessToken, refreshToken, session };
|
|
693
|
+
}
|
|
694
|
+
|
|
632
695
|
/**
|
|
633
696
|
* Conclui a criação de conta a partir de um token de convite: cria/atualiza a
|
|
634
697
|
* credencial de senha, marca o identificador como verificado, atualiza o nome
|
|
@@ -688,11 +751,11 @@ export class AuthService {
|
|
|
688
751
|
ipAddress,
|
|
689
752
|
userAgent,
|
|
690
753
|
);
|
|
691
|
-
await this.user.registerUserActivity(userIdentifier.
|
|
754
|
+
await this.user.registerUserActivity(userIdentifier.user_id, 'completeAccount');
|
|
692
755
|
return { accessToken, refreshToken, session };
|
|
693
756
|
}
|
|
694
757
|
|
|
695
|
-
async verifyMfaCode(locale: string, mfaToken: string, code: string, ipAddress: string, userAgent: string, methodType?: 'totp' | 'email' | 'recovery', browserId?: string | null) {
|
|
758
|
+
async verifyMfaCode(locale: string, mfaToken: string, code: string, ipAddress: string, userAgent: string, methodType?: 'totp' | 'email' | 'recovery', browserId?: string | null, origin?: string) {
|
|
696
759
|
const payload = await this.token.verifyMfaChallengeToken(mfaToken);
|
|
697
760
|
const user = await this.prisma.user.findUnique({
|
|
698
761
|
where: { id: payload.userId },
|
|
@@ -806,7 +869,8 @@ export class AuthService {
|
|
|
806
869
|
ipAddress,
|
|
807
870
|
userAgent,
|
|
808
871
|
location: 'Unknown',
|
|
809
|
-
}
|
|
872
|
+
},
|
|
873
|
+
app: await this.challenge.resolveAppKeyFromOrigin(origin),
|
|
810
874
|
}
|
|
811
875
|
);
|
|
812
876
|
|
|
@@ -860,7 +924,7 @@ export class AuthService {
|
|
|
860
924
|
return { accessToken, refreshToken, session, requiresPasswordReset };
|
|
861
925
|
}
|
|
862
926
|
|
|
863
|
-
async resendMfaCode(locale: string, mfaToken: string) {
|
|
927
|
+
async resendMfaCode(locale: string, mfaToken: string, origin?: string) {
|
|
864
928
|
const payload = await this.token.verifyMfaChallengeToken(mfaToken);
|
|
865
929
|
|
|
866
930
|
const mfaMethods = await this.prisma.user_mfa.findMany({
|
|
@@ -883,7 +947,7 @@ export class AuthService {
|
|
|
883
947
|
throw new BadRequestException(getLocaleText('noEmailMfaFound', locale, 'No email MFA method found for this user.'));
|
|
884
948
|
}
|
|
885
949
|
|
|
886
|
-
await this.challenge.sendMfaCodeByEmail(locale, payload.userId, emailMfa.user_mfa_email[0].email);
|
|
950
|
+
await this.challenge.sendMfaCodeByEmail(locale, payload.userId, emailMfa.user_mfa_email[0].email, origin);
|
|
887
951
|
|
|
888
952
|
return {
|
|
889
953
|
success: true,
|
|
@@ -1013,7 +1077,8 @@ export class AuthService {
|
|
|
1013
1077
|
ipAddress,
|
|
1014
1078
|
userAgent,
|
|
1015
1079
|
location: 'Unknown',
|
|
1016
|
-
}
|
|
1080
|
+
},
|
|
1081
|
+
app: await this.challenge.resolveAppKeyFromOrigin(requestOrigin),
|
|
1017
1082
|
}
|
|
1018
1083
|
);
|
|
1019
1084
|
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { PrismaModule } from '@hed-hog/api-prisma';
|
|
2
|
+
import { Module, forwardRef } from '@nestjs/common';
|
|
3
|
+
import { CaptchaService } from './captcha.service';
|
|
4
|
+
|
|
5
|
+
@Module({
|
|
6
|
+
imports: [forwardRef(() => PrismaModule)],
|
|
7
|
+
providers: [CaptchaService],
|
|
8
|
+
exports: [CaptchaService],
|
|
9
|
+
})
|
|
10
|
+
export class CaptchaModule {}
|