@hed-hog/core 0.0.399 → 0.0.401
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/dist/ai/ai-agent.sort.d.ts +6 -0
- package/dist/ai/ai-agent.sort.d.ts.map +1 -0
- package/dist/ai/ai-agent.sort.js +21 -0
- package/dist/ai/ai-agent.sort.js.map +1 -0
- package/dist/ai/ai.controller.d.ts +6 -4
- package/dist/ai/ai.controller.d.ts.map +1 -1
- package/dist/ai/ai.service.d.ts +121 -6
- package/dist/ai/ai.service.d.ts.map +1 -1
- package/dist/ai/ai.service.js +355 -160
- package/dist/ai/ai.service.js.map +1 -1
- package/dist/ai-instruction/ai-instruction.service.d.ts.map +1 -1
- package/dist/ai-instruction/ai-instruction.service.js +26 -23
- package/dist/ai-instruction/ai-instruction.service.js.map +1 -1
- package/dist/ai-instruction/ai-instruction.sort.d.ts +16 -0
- package/dist/ai-instruction/ai-instruction.sort.d.ts.map +1 -0
- package/dist/ai-instruction/ai-instruction.sort.js +32 -0
- package/dist/ai-instruction/ai-instruction.sort.js.map +1 -0
- package/dist/ai-instruction/ai-prompt-resolver.service.d.ts +12 -0
- package/dist/ai-instruction/ai-prompt-resolver.service.d.ts.map +1 -1
- package/dist/ai-instruction/ai-prompt-resolver.service.js +26 -0
- package/dist/ai-instruction/ai-prompt-resolver.service.js.map +1 -1
- package/dist/auth/auth.controller.d.ts +24 -8
- package/dist/auth/auth.controller.d.ts.map +1 -1
- package/dist/auth/auth.module.d.ts.map +1 -1
- package/dist/auth/auth.module.js +8 -1
- package/dist/auth/auth.module.js.map +1 -1
- package/dist/auth/auth.service.d.ts +72 -25
- package/dist/auth/auth.service.d.ts.map +1 -1
- package/dist/auth/auth.service.js +41 -4
- package/dist/auth/auth.service.js.map +1 -1
- package/dist/auth/guards/auth.guard.d.ts +3 -1
- package/dist/auth/guards/auth.guard.d.ts.map +1 -1
- package/dist/auth/guards/auth.guard.js +12 -3
- package/dist/auth/guards/auth.guard.js.map +1 -1
- package/dist/authorize/authorize.controller.d.ts +29 -5
- package/dist/authorize/authorize.controller.d.ts.map +1 -1
- package/dist/authorize/authorize.controller.js +120 -13
- package/dist/authorize/authorize.controller.js.map +1 -1
- package/dist/authorize/authorize.errors.d.ts +34 -0
- package/dist/authorize/authorize.errors.d.ts.map +1 -0
- package/dist/authorize/authorize.errors.js +37 -0
- package/dist/authorize/authorize.errors.js.map +1 -0
- package/dist/authorize/authorize.module.d.ts.map +1 -1
- package/dist/authorize/authorize.module.js +6 -1
- package/dist/authorize/authorize.module.js.map +1 -1
- package/dist/authorize/authorize.service.d.ts +77 -3
- package/dist/authorize/authorize.service.d.ts.map +1 -1
- package/dist/authorize/authorize.service.js +212 -21
- package/dist/authorize/authorize.service.js.map +1 -1
- package/dist/authorize/dto/authorize-info.dto.d.ts +10 -1
- package/dist/authorize/dto/authorize-info.dto.d.ts.map +1 -1
- package/dist/authorize/dto/authorize-info.dto.js +16 -1
- package/dist/authorize/dto/authorize-info.dto.js.map +1 -1
- package/dist/authorize/dto/consent.dto.d.ts +10 -1
- package/dist/authorize/dto/consent.dto.d.ts.map +1 -1
- package/dist/authorize/dto/consent.dto.js +16 -1
- package/dist/authorize/dto/consent.dto.js.map +1 -1
- package/dist/authorize/dto/token.dto.d.ts +12 -0
- package/dist/authorize/dto/token.dto.d.ts.map +1 -1
- package/dist/authorize/dto/token.dto.js +21 -1
- package/dist/authorize/dto/token.dto.js.map +1 -1
- package/dist/authorize/oauth-exception.filter.d.ts +17 -0
- package/dist/authorize/oauth-exception.filter.d.ts.map +1 -0
- package/dist/authorize/oauth-exception.filter.js +54 -0
- package/dist/authorize/oauth-exception.filter.js.map +1 -0
- package/dist/authorize/oauth-metadata.service.d.ts +39 -0
- package/dist/authorize/oauth-metadata.service.d.ts.map +1 -0
- package/dist/authorize/oauth-metadata.service.js +81 -0
- package/dist/authorize/oauth-metadata.service.js.map +1 -0
- package/dist/authorize/well-known.controller.d.ts +67 -0
- package/dist/authorize/well-known.controller.d.ts.map +1 -0
- package/dist/authorize/well-known.controller.js +126 -0
- package/dist/authorize/well-known.controller.js.map +1 -0
- package/dist/captcha/captcha.service.d.ts +32 -2
- package/dist/captcha/captcha.service.d.ts.map +1 -1
- package/dist/captcha/captcha.service.js +85 -12
- package/dist/captcha/captcha.service.js.map +1 -1
- package/dist/challenge/challenge.service.d.ts +2 -2
- package/dist/core.module.d.ts.map +1 -1
- package/dist/core.module.js +9 -0
- package/dist/core.module.js.map +1 -1
- package/dist/dashboard/dashboard/dashboard.controller.d.ts +9 -9
- package/dist/dashboard/dashboard/dashboard.service.d.ts +9 -9
- package/dist/dashboard/dashboard-component/dashboard-component.controller.d.ts +3 -3
- package/dist/dashboard/dashboard-component/dashboard-component.service.d.ts +3 -3
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.controller.d.ts +3 -3
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.d.ts +3 -3
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.d.ts.map +1 -1
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.js +2 -4
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.js.map +1 -1
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.sort.d.ts +8 -0
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.sort.d.ts.map +1 -0
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.sort.js +18 -0
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.sort.js.map +1 -0
- package/dist/dashboard/dashboard-item/dashboard-item.service.d.ts.map +1 -1
- package/dist/dashboard/dashboard-item/dashboard-item.service.js +2 -4
- package/dist/dashboard/dashboard-item/dashboard-item.service.js.map +1 -1
- package/dist/dashboard/dashboard-item/dashboard-item.sort.d.ts +9 -0
- package/dist/dashboard/dashboard-item/dashboard-item.sort.d.ts.map +1 -0
- package/dist/dashboard/dashboard-item/dashboard-item.sort.js +19 -0
- package/dist/dashboard/dashboard-item/dashboard-item.sort.js.map +1 -0
- package/dist/dashboard/dashboard-role/dashboard-role.controller.d.ts +3 -3
- package/dist/dashboard/dashboard-role/dashboard-role.service.d.ts +3 -3
- package/dist/dashboard/dashboard-role/dashboard-role.service.d.ts.map +1 -1
- package/dist/dashboard/dashboard-role/dashboard-role.service.js +2 -4
- package/dist/dashboard/dashboard-role/dashboard-role.service.js.map +1 -1
- package/dist/dashboard/dashboard-role/dashboard-role.sort.d.ts +8 -0
- package/dist/dashboard/dashboard-role/dashboard-role.sort.d.ts.map +1 -0
- package/dist/dashboard/dashboard-role/dashboard-role.sort.js +16 -0
- package/dist/dashboard/dashboard-role/dashboard-role.sort.js.map +1 -0
- package/dist/document-kit/document-kit.module.d.ts +3 -0
- package/dist/document-kit/document-kit.module.d.ts.map +1 -0
- package/dist/document-kit/document-kit.module.js +24 -0
- package/dist/document-kit/document-kit.module.js.map +1 -0
- package/dist/document-kit/document-kit.registry.d.ts +55 -0
- package/dist/document-kit/document-kit.registry.d.ts.map +1 -0
- package/dist/document-kit/document-kit.registry.js +91 -0
- package/dist/document-kit/document-kit.registry.js.map +1 -0
- package/dist/document-kit/document-kit.service.d.ts +49 -0
- package/dist/document-kit/document-kit.service.d.ts.map +1 -0
- package/dist/document-kit/document-kit.service.js +135 -0
- package/dist/document-kit/document-kit.service.js.map +1 -0
- package/dist/file/file-upload-ticket.service.d.ts +160 -0
- package/dist/file/file-upload-ticket.service.d.ts.map +1 -0
- package/dist/file/file-upload-ticket.service.js +382 -0
- package/dist/file/file-upload-ticket.service.js.map +1 -0
- package/dist/file/file.controller.d.ts +24 -1
- package/dist/file/file.controller.d.ts.map +1 -1
- package/dist/file/file.controller.js +63 -2
- package/dist/file/file.controller.js.map +1 -1
- package/dist/file/file.module.d.ts.map +1 -1
- package/dist/file/file.module.js +14 -2
- package/dist/file/file.module.js.map +1 -1
- package/dist/file/file.service.d.ts +197 -7
- package/dist/file/file.service.d.ts.map +1 -1
- package/dist/file/file.service.js +438 -78
- package/dist/file/file.service.js.map +1 -1
- package/dist/file/filename-encoding.util.d.ts +24 -0
- package/dist/file/filename-encoding.util.d.ts.map +1 -0
- package/dist/file/filename-encoding.util.js +63 -0
- package/dist/file/filename-encoding.util.js.map +1 -0
- package/dist/file/image-optimization.service.d.ts +27 -0
- package/dist/file/image-optimization.service.d.ts.map +1 -1
- package/dist/file/image-optimization.service.js +63 -14
- package/dist/file/image-optimization.service.js.map +1 -1
- package/dist/file/mcp-file-source.schema.d.ts +33 -0
- package/dist/file/mcp-file-source.schema.d.ts.map +1 -0
- package/dist/file/mcp-file-source.schema.js +78 -0
- package/dist/file/mcp-file-source.schema.js.map +1 -0
- package/dist/file/mcp-file-source.service.d.ts +124 -0
- package/dist/file/mcp-file-source.service.d.ts.map +1 -0
- package/dist/file/mcp-file-source.service.js +262 -0
- package/dist/file/mcp-file-source.service.js.map +1 -0
- package/dist/file/mimetype-sniff.util.d.ts +62 -0
- package/dist/file/mimetype-sniff.util.d.ts.map +1 -0
- package/dist/file/mimetype-sniff.util.js +226 -0
- package/dist/file/mimetype-sniff.util.js.map +1 -0
- package/dist/file/remote-fetch.util.d.ts +35 -0
- package/dist/file/remote-fetch.util.d.ts.map +1 -0
- package/dist/file/remote-fetch.util.js +236 -0
- package/dist/file/remote-fetch.util.js.map +1 -0
- package/dist/impersonation/dto/start-impersonation.dto.d.ts +4 -1
- package/dist/impersonation/dto/start-impersonation.dto.d.ts.map +1 -1
- package/dist/impersonation/dto/start-impersonation.dto.js +1 -1
- package/dist/impersonation/dto/start-impersonation.dto.js.map +1 -1
- package/dist/impersonation/impersonation.service.d.ts +8 -3
- package/dist/impersonation/impersonation.service.d.ts.map +1 -1
- package/dist/impersonation/impersonation.service.js +14 -4
- package/dist/impersonation/impersonation.service.js.map +1 -1
- package/dist/incident/incident.controller.d.ts +2 -1
- package/dist/incident/incident.controller.d.ts.map +1 -1
- package/dist/incident/incident.controller.js +10 -6
- package/dist/incident/incident.controller.js.map +1 -1
- package/dist/incident/incident.service.d.ts +2 -0
- package/dist/incident/incident.service.d.ts.map +1 -1
- package/dist/incident/incident.service.js +4 -0
- package/dist/incident/incident.service.js.map +1 -1
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -1
- package/dist/integration-profile/integration-profile.secrets.d.ts.map +1 -1
- package/dist/integration-profile/integration-profile.secrets.js +28 -0
- package/dist/integration-profile/integration-profile.secrets.js.map +1 -1
- package/dist/integration-profile/integration-profile.service.d.ts +0 -13
- package/dist/integration-profile/integration-profile.service.d.ts.map +1 -1
- package/dist/integration-profile/integration-profile.service.js +5 -40
- package/dist/integration-profile/integration-profile.service.js.map +1 -1
- package/dist/integration-profile/integration-profile.utils.js +5 -5
- package/dist/integration-profile/integration-profile.utils.js.map +1 -1
- package/dist/integration-profile/testers/ai.testers.d.ts.map +1 -1
- package/dist/integration-profile/testers/ai.testers.js +46 -8
- package/dist/integration-profile/testers/ai.testers.js.map +1 -1
- package/dist/integration-profile/testers/index.d.ts.map +1 -1
- package/dist/integration-profile/testers/index.js +2 -0
- package/dist/integration-profile/testers/index.js.map +1 -1
- package/dist/integration-profile/testers/shipping.testers.d.ts +3 -0
- package/dist/integration-profile/testers/shipping.testers.d.ts.map +1 -0
- package/dist/integration-profile/testers/shipping.testers.js +71 -0
- package/dist/integration-profile/testers/shipping.testers.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/send.dto.d.ts +6 -1
- package/dist/mail/dto/send.dto.d.ts.map +1 -1
- package/dist/mail/dto/send.dto.js.map +1 -1
- package/dist/mail/mail.service.d.ts +9 -0
- package/dist/mail/mail.service.d.ts.map +1 -1
- package/dist/mail/mail.service.js +34 -14
- package/dist/mail/mail.service.js.map +1 -1
- package/dist/mail-sent/mail-sent.controller.d.ts +1 -1
- package/dist/mail-sent/mail-sent.service.d.ts +1 -1
- package/dist/mail-sent/mail-sent.service.d.ts.map +1 -1
- package/dist/mail-sent/mail-sent.service.js +2 -1
- package/dist/mail-sent/mail-sent.service.js.map +1 -1
- package/dist/mail-sent/mail-sent.sort.d.ts +9 -0
- package/dist/mail-sent/mail-sent.sort.d.ts.map +1 -0
- package/dist/mail-sent/mail-sent.sort.js +19 -0
- package/dist/mail-sent/mail-sent.sort.js.map +1 -0
- package/dist/mcp/filters/mcp-challenge.filter.d.ts +20 -0
- package/dist/mcp/filters/mcp-challenge.filter.d.ts.map +1 -0
- package/dist/mcp/filters/mcp-challenge.filter.js +69 -0
- package/dist/mcp/filters/mcp-challenge.filter.js.map +1 -0
- package/dist/mcp/guards/mcp-auth.guard.d.ts +4 -1
- package/dist/mcp/guards/mcp-auth.guard.d.ts.map +1 -1
- package/dist/mcp/guards/mcp-auth.guard.js +19 -5
- package/dist/mcp/guards/mcp-auth.guard.js.map +1 -1
- package/dist/mcp/guards/mcp-permission.guard.d.ts +25 -3
- package/dist/mcp/guards/mcp-permission.guard.d.ts.map +1 -1
- package/dist/mcp/guards/mcp-permission.guard.js +46 -26
- package/dist/mcp/guards/mcp-permission.guard.js.map +1 -1
- package/dist/mcp/mcp-audit.service.d.ts +17 -0
- package/dist/mcp/mcp-audit.service.d.ts.map +1 -1
- package/dist/mcp/mcp-audit.service.js +32 -3
- package/dist/mcp/mcp-audit.service.js.map +1 -1
- package/dist/mcp/mcp-permission.service.d.ts +64 -0
- package/dist/mcp/mcp-permission.service.d.ts.map +1 -0
- package/dist/mcp/mcp-permission.service.js +178 -0
- package/dist/mcp/mcp-permission.service.js.map +1 -0
- package/dist/mcp/mcp-server.service.d.ts +3 -1
- package/dist/mcp/mcp-server.service.d.ts.map +1 -1
- package/dist/mcp/mcp-server.service.js +36 -15
- package/dist/mcp/mcp-server.service.js.map +1 -1
- package/dist/mcp/mcp.controller.d.ts.map +1 -1
- package/dist/mcp/mcp.controller.js +10 -2
- package/dist/mcp/mcp.controller.js.map +1 -1
- package/dist/mcp/mcp.module.d.ts.map +1 -1
- package/dist/mcp/mcp.module.js +7 -1
- package/dist/mcp/mcp.module.js.map +1 -1
- package/dist/mcp/tools/core-access-log.mcp-tools.d.ts +17 -0
- package/dist/mcp/tools/core-access-log.mcp-tools.d.ts.map +1 -0
- package/dist/mcp/tools/core-access-log.mcp-tools.js +74 -0
- package/dist/mcp/tools/core-access-log.mcp-tools.js.map +1 -0
- package/dist/mcp/tools/core-ai.mcp-tools.js +2 -9
- package/dist/mcp/tools/core-ai.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-dashboard-items.mcp-tools.js +1 -1
- package/dist/mcp/tools/core-dashboard-items.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-dashboard.mcp-tools.js +2 -9
- package/dist/mcp/tools/core-dashboard.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-event-webhooks.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-event-webhooks.mcp-tools.js +2 -10
- package/dist/mcp/tools/core-event-webhooks.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-files.mcp-tools.d.ts +17 -5
- package/dist/mcp/tools/core-files.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-files.mcp-tools.js +186 -24
- package/dist/mcp/tools/core-files.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-integration-events.mcp-tools.js +2 -9
- package/dist/mcp/tools/core-integration-events.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-mail-sent.mcp-tools.js +2 -14
- package/dist/mcp/tools/core-mail-sent.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-mail.mcp-tools.js +2 -9
- package/dist/mcp/tools/core-mail.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-menus.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-menus.mcp-tools.js +2 -10
- package/dist/mcp/tools/core-menus.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-notifications.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-notifications.mcp-tools.js +0 -1
- package/dist/mcp/tools/core-notifications.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-roles.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-roles.mcp-tools.js +2 -13
- package/dist/mcp/tools/core-roles.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-routes.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-routes.mcp-tools.js +2 -11
- package/dist/mcp/tools/core-routes.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-screens.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-screens.mcp-tools.js +2 -11
- package/dist/mcp/tools/core-screens.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-sessions.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-sessions.mcp-tools.js +0 -2
- package/dist/mcp/tools/core-sessions.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-settings.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-settings.mcp-tools.js +2 -10
- package/dist/mcp/tools/core-settings.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-users.mcp-tools.js +2 -9
- package/dist/mcp/tools/core-users.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-webhooks.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-webhooks.mcp-tools.js +2 -10
- package/dist/mcp/tools/core-webhooks.mcp-tools.js.map +1 -1
- package/dist/mcp/types/mcp-context.type.d.ts +9 -0
- package/dist/mcp/types/mcp-context.type.d.ts.map +1 -1
- package/dist/mcp-chat/mcp-chat.service.d.ts.map +1 -1
- package/dist/mcp-chat/mcp-chat.service.js +8 -0
- package/dist/mcp-chat/mcp-chat.service.js.map +1 -1
- package/dist/meeting/meeting-provider.registry.d.ts +187 -0
- package/dist/meeting/meeting-provider.registry.d.ts.map +1 -1
- package/dist/meeting/meeting-provider.registry.js.map +1 -1
- package/dist/meeting/meeting.constants.d.ts +70 -0
- package/dist/meeting/meeting.constants.d.ts.map +1 -1
- package/dist/meeting/meeting.constants.js +9 -1
- package/dist/meeting/meeting.constants.js.map +1 -1
- package/dist/menu/menu.service.d.ts.map +1 -1
- package/dist/menu/menu.service.js +29 -9
- package/dist/menu/menu.service.js.map +1 -1
- package/dist/message-template/dto/update-message-template.dto.d.ts +18 -0
- package/dist/message-template/dto/update-message-template.dto.d.ts.map +1 -0
- package/dist/message-template/dto/update-message-template.dto.js +38 -0
- package/dist/message-template/dto/update-message-template.dto.js.map +1 -0
- package/dist/message-template/message-template-admin.service.d.ts +70 -0
- package/dist/message-template/message-template-admin.service.d.ts.map +1 -0
- package/dist/message-template/message-template-admin.service.js +226 -0
- package/dist/message-template/message-template-admin.service.js.map +1 -0
- package/dist/message-template/message-template.controller.d.ts +29 -0
- package/dist/message-template/message-template.controller.d.ts.map +1 -0
- package/dist/message-template/message-template.controller.js +101 -0
- package/dist/message-template/message-template.controller.js.map +1 -0
- package/dist/message-template/message-template.module.d.ts +10 -0
- package/dist/message-template/message-template.module.d.ts.map +1 -0
- package/dist/message-template/message-template.module.js +33 -0
- package/dist/message-template/message-template.module.js.map +1 -0
- package/dist/message-template/message-template.registry.d.ts +55 -0
- package/dist/message-template/message-template.registry.d.ts.map +1 -0
- package/dist/message-template/message-template.registry.js +64 -0
- package/dist/message-template/message-template.registry.js.map +1 -0
- package/dist/message-template/message-template.service.d.ts +59 -0
- package/dist/message-template/message-template.service.d.ts.map +1 -0
- package/dist/message-template/message-template.service.js +166 -0
- package/dist/message-template/message-template.service.js.map +1 -0
- package/dist/notification/notification.constants.d.ts +11 -0
- package/dist/notification/notification.constants.d.ts.map +1 -0
- package/dist/notification/notification.constants.js +14 -0
- package/dist/notification/notification.constants.js.map +1 -0
- package/dist/notification/notification.controller.d.ts +20 -20
- package/dist/notification/notification.module.d.ts.map +1 -1
- package/dist/notification/notification.module.js +3 -0
- package/dist/notification/notification.module.js.map +1 -1
- package/dist/notification/notification.service.d.ts +33 -21
- package/dist/notification/notification.service.d.ts.map +1 -1
- package/dist/notification/notification.service.js +36 -2
- package/dist/notification/notification.service.js.map +1 -1
- package/dist/oauth/oauth-token-broker.service.d.ts +50 -1
- package/dist/oauth/oauth-token-broker.service.d.ts.map +1 -1
- package/dist/oauth/oauth-token-broker.service.js +105 -3
- package/dist/oauth/oauth-token-broker.service.js.map +1 -1
- package/dist/oauth/oauth.controller.d.ts +4 -6
- package/dist/oauth/oauth.controller.d.ts.map +1 -1
- package/dist/oauth/oauth.controller.js +0 -1
- package/dist/oauth/oauth.controller.js.map +1 -1
- package/dist/oauth/oauth.errors.d.ts +15 -1
- package/dist/oauth/oauth.errors.d.ts.map +1 -1
- package/dist/oauth/oauth.errors.js +9 -1
- package/dist/oauth/oauth.errors.js.map +1 -1
- package/dist/oauth/oauth.module.d.ts.map +1 -1
- package/dist/oauth/oauth.module.js +6 -1
- package/dist/oauth/oauth.module.js.map +1 -1
- package/dist/oauth/oauth.service.d.ts +25 -5
- package/dist/oauth/oauth.service.d.ts.map +1 -1
- package/dist/oauth/oauth.service.js +63 -27
- package/dist/oauth/oauth.service.js.map +1 -1
- package/dist/oauth/providers/abstract.provider.d.ts +10 -0
- package/dist/oauth/providers/abstract.provider.d.ts.map +1 -1
- package/dist/oauth/providers/abstract.provider.js +39 -12
- package/dist/oauth/providers/abstract.provider.js.map +1 -1
- package/dist/oauth/providers/github.provider.d.ts +1 -1
- package/dist/oauth/providers/github.provider.d.ts.map +1 -1
- package/dist/oauth/providers/github.provider.js +48 -22
- package/dist/oauth/providers/github.provider.js.map +1 -1
- package/dist/oauth/providers/microsoft-entra-id.provider.d.ts +6 -0
- package/dist/oauth/providers/microsoft-entra-id.provider.d.ts.map +1 -1
- package/dist/oauth/providers/microsoft-entra-id.provider.js +36 -4
- package/dist/oauth/providers/microsoft-entra-id.provider.js.map +1 -1
- package/dist/observability/monitored-cron.d.ts +29 -12
- package/dist/observability/monitored-cron.d.ts.map +1 -1
- package/dist/observability/monitored-cron.js +131 -46
- package/dist/observability/monitored-cron.js.map +1 -1
- package/dist/pairing/pairing.service.d.ts +6 -2
- package/dist/pairing/pairing.service.d.ts.map +1 -1
- package/dist/pdf/document/charts/chart-bar.d.ts +24 -0
- package/dist/pdf/document/charts/chart-bar.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-bar.js +117 -0
- package/dist/pdf/document/charts/chart-bar.js.map +1 -0
- package/dist/pdf/document/charts/chart-donut.d.ts +16 -0
- package/dist/pdf/document/charts/chart-donut.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-donut.js +89 -0
- package/dist/pdf/document/charts/chart-donut.js.map +1 -0
- package/dist/pdf/document/charts/chart-gauge.d.ts +15 -0
- package/dist/pdf/document/charts/chart-gauge.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-gauge.js +60 -0
- package/dist/pdf/document/charts/chart-gauge.js.map +1 -0
- package/dist/pdf/document/charts/chart-line.d.ts +29 -0
- package/dist/pdf/document/charts/chart-line.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-line.js +89 -0
- package/dist/pdf/document/charts/chart-line.js.map +1 -0
- package/dist/pdf/document/charts/chart-primitives.d.ts +64 -0
- package/dist/pdf/document/charts/chart-primitives.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-primitives.js +110 -0
- package/dist/pdf/document/charts/chart-primitives.js.map +1 -0
- package/dist/pdf/document/charts/chart-radar.d.ts +13 -0
- package/dist/pdf/document/charts/chart-radar.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-radar.js +83 -0
- package/dist/pdf/document/charts/chart-radar.js.map +1 -0
- package/dist/pdf/document/charts/chart-scale.d.ts +39 -0
- package/dist/pdf/document/charts/chart-scale.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-scale.js +118 -0
- package/dist/pdf/document/charts/chart-scale.js.map +1 -0
- package/dist/pdf/document/charts/index.d.ts +8 -0
- package/dist/pdf/document/charts/index.d.ts.map +1 -0
- package/dist/pdf/document/charts/index.js +24 -0
- package/dist/pdf/document/charts/index.js.map +1 -0
- package/dist/pdf/document/index.d.ts +8 -0
- package/dist/pdf/document/index.d.ts.map +1 -0
- package/dist/pdf/document/index.js +24 -0
- package/dist/pdf/document/index.js.map +1 -0
- package/dist/pdf/document/pdf-document.chrome.d.ts +20 -0
- package/dist/pdf/document/pdf-document.chrome.d.ts.map +1 -0
- package/dist/pdf/document/pdf-document.chrome.js +36 -0
- package/dist/pdf/document/pdf-document.chrome.js.map +1 -0
- package/dist/pdf/document/pdf-document.css.d.ts +20 -0
- package/dist/pdf/document/pdf-document.css.d.ts.map +1 -0
- package/dist/pdf/document/pdf-document.css.js +239 -0
- package/dist/pdf/document/pdf-document.css.js.map +1 -0
- package/dist/pdf/document/pdf-document.renderer.d.ts +10 -0
- package/dist/pdf/document/pdf-document.renderer.d.ts.map +1 -0
- package/dist/pdf/document/pdf-document.renderer.js +153 -0
- package/dist/pdf/document/pdf-document.renderer.js.map +1 -0
- package/dist/pdf/document/pdf-document.service.d.ts +27 -0
- package/dist/pdf/document/pdf-document.service.d.ts.map +1 -0
- package/dist/pdf/document/pdf-document.service.js +81 -0
- package/dist/pdf/document/pdf-document.service.js.map +1 -0
- package/dist/pdf/document/pdf-document.theme.d.ts +41 -0
- package/dist/pdf/document/pdf-document.theme.d.ts.map +1 -0
- package/dist/pdf/document/pdf-document.theme.js +105 -0
- package/dist/pdf/document/pdf-document.theme.js.map +1 -0
- package/dist/pdf/document/pdf-document.types.d.ts +108 -0
- package/dist/pdf/document/pdf-document.types.d.ts.map +1 -0
- package/dist/pdf/document/pdf-document.types.js +18 -0
- package/dist/pdf/document/pdf-document.types.js.map +1 -0
- package/dist/pdf/pdf.module.d.ts.map +1 -1
- package/dist/pdf/pdf.module.js +3 -2
- package/dist/pdf/pdf.module.js.map +1 -1
- package/dist/pdf/pdf.service.d.ts +69 -1
- package/dist/pdf/pdf.service.d.ts.map +1 -1
- package/dist/pdf/pdf.service.js +164 -63
- package/dist/pdf/pdf.service.js.map +1 -1
- package/dist/pdf/templates/commercial-proposal.template.d.ts +96 -0
- package/dist/pdf/templates/commercial-proposal.template.d.ts.map +1 -0
- package/dist/pdf/templates/commercial-proposal.template.js +276 -0
- package/dist/pdf/templates/commercial-proposal.template.js.map +1 -0
- package/dist/profile/dto/change-password.dto.d.ts.map +1 -1
- package/dist/profile/dto/change-password.dto.js +4 -6
- package/dist/profile/dto/change-password.dto.js.map +1 -1
- package/dist/profile/profile.controller.d.ts +1 -1
- package/dist/profile/profile.service.d.ts +1 -1
- package/dist/profile/profile.service.d.ts.map +1 -1
- package/dist/profile/profile.service.js +9 -3
- package/dist/profile/profile.service.js.map +1 -1
- package/dist/realtime/realtime-tick.coalescer.d.ts +34 -0
- package/dist/realtime/realtime-tick.coalescer.d.ts.map +1 -0
- package/dist/realtime/realtime-tick.coalescer.js +60 -0
- package/dist/realtime/realtime-tick.coalescer.js.map +1 -0
- package/dist/realtime/realtime.service.d.ts +2 -0
- package/dist/realtime/realtime.service.d.ts.map +1 -1
- package/dist/realtime/realtime.service.js +22 -2
- package/dist/realtime/realtime.service.js.map +1 -1
- package/dist/redis/redis-kv.service.d.ts +90 -0
- package/dist/redis/redis-kv.service.d.ts.map +1 -0
- package/dist/redis/redis-kv.service.js +247 -0
- package/dist/redis/redis-kv.service.js.map +1 -0
- package/dist/redis/redis-master.d.ts +29 -0
- package/dist/redis/redis-master.d.ts.map +1 -0
- package/dist/redis/redis-master.js +81 -0
- package/dist/redis/redis-master.js.map +1 -0
- package/dist/redis/redis-pubsub.d.ts +12 -0
- package/dist/redis/redis-pubsub.d.ts.map +1 -1
- package/dist/redis/redis-pubsub.js +25 -2
- package/dist/redis/redis-pubsub.js.map +1 -1
- package/dist/redis/redis.module.d.ts +11 -0
- package/dist/redis/redis.module.d.ts.map +1 -0
- package/dist/redis/redis.module.js +30 -0
- package/dist/redis/redis.module.js.map +1 -0
- package/dist/session/session.controller.d.ts +6 -2
- package/dist/session/session.controller.d.ts.map +1 -1
- package/dist/session/session.service.d.ts +118 -15
- package/dist/session/session.service.d.ts.map +1 -1
- package/dist/session/session.service.js +251 -77
- package/dist/session/session.service.js.map +1 -1
- package/dist/setting/favicon.controller.d.ts +26 -0
- package/dist/setting/favicon.controller.d.ts.map +1 -0
- package/dist/setting/favicon.controller.js +130 -0
- package/dist/setting/favicon.controller.js.map +1 -0
- package/dist/setting/setting.controller.d.ts +5 -0
- package/dist/setting/setting.controller.d.ts.map +1 -1
- package/dist/setting/setting.module.d.ts.map +1 -1
- package/dist/setting/setting.module.js +2 -1
- package/dist/setting/setting.module.js.map +1 -1
- package/dist/setting/setting.service.d.ts +7 -0
- package/dist/setting/setting.service.d.ts.map +1 -1
- package/dist/setting/setting.service.js +38 -3
- package/dist/setting/setting.service.js.map +1 -1
- package/dist/task/task.service.d.ts +17 -0
- package/dist/task/task.service.d.ts.map +1 -1
- package/dist/task/task.service.js +48 -13
- package/dist/task/task.service.js.map +1 -1
- package/dist/token/token.service.d.ts +19 -1
- package/dist/token/token.service.d.ts.map +1 -1
- package/dist/token/token.service.js +39 -2
- package/dist/token/token.service.js.map +1 -1
- package/dist/user/user-credential.util.d.ts +10 -0
- package/dist/user/user-credential.util.d.ts.map +1 -1
- package/dist/user/user-credential.util.js +14 -1
- package/dist/user/user-credential.util.js.map +1 -1
- package/dist/user/user.service.d.ts +12 -4
- package/dist/user/user.service.d.ts.map +1 -1
- package/dist/user/user.service.js +2 -11
- package/dist/user/user.service.js.map +1 -1
- package/dist/user/user.sort.d.ts +16 -0
- package/dist/user/user.sort.d.ts.map +1 -0
- package/dist/user/user.sort.js +25 -0
- package/dist/user/user.sort.js.map +1 -0
- package/dist/utils/abbreviate-name.d.ts +13 -0
- package/dist/utils/abbreviate-name.d.ts.map +1 -0
- package/dist/utils/abbreviate-name.js +42 -0
- package/dist/utils/abbreviate-name.js.map +1 -0
- package/dist/utils/date-range-query.dto.d.ts +11 -0
- package/dist/utils/date-range-query.dto.d.ts.map +1 -0
- package/dist/utils/date-range-query.dto.js +63 -0
- package/dist/utils/date-range-query.dto.js.map +1 -0
- package/dist/utils/date-range.d.ts +96 -0
- package/dist/utils/date-range.d.ts.map +1 -0
- package/dist/utils/date-range.js +172 -0
- package/dist/utils/date-range.js.map +1 -0
- package/dist/webhook-integration/webhook-utils.d.ts.map +1 -1
- package/dist/webhook-integration/webhook-utils.js +24 -0
- package/dist/webhook-integration/webhook-utils.js.map +1 -1
- package/dist/whatsapp-sender/whatsapp-recipients.d.ts +49 -0
- package/dist/whatsapp-sender/whatsapp-recipients.d.ts.map +1 -0
- package/dist/whatsapp-sender/whatsapp-recipients.js +66 -0
- package/dist/whatsapp-sender/whatsapp-recipients.js.map +1 -0
- package/dist/whatsapp-sender/whatsapp-sender.service.d.ts +25 -0
- package/dist/whatsapp-sender/whatsapp-sender.service.d.ts.map +1 -1
- package/dist/whatsapp-sender/whatsapp-sender.service.js +71 -7
- package/dist/whatsapp-sender/whatsapp-sender.service.js.map +1 -1
- package/hedhog/data/integration_provider.yaml +9 -0
- package/hedhog/data/integration_type.yaml +12 -0
- package/hedhog/data/locale.yaml +0 -1
- package/hedhog/data/mail.yaml +2 -2
- package/hedhog/data/mail_layout.yaml +6 -3
- package/hedhog/data/menu.yaml +25 -5
- package/hedhog/data/route.yaml +148 -0
- package/hedhog/data/setting_group.yaml +189 -3
- package/hedhog/frontend/app/access-log/page.tsx.ejs +47 -53
- package/hedhog/frontend/app/account/components/active-sessions.tsx.ejs +33 -8
- package/hedhog/frontend/app/account/components/mcp-tokens.tsx.ejs +54 -13
- package/hedhog/frontend/app/account/components/mfa-method-card.tsx.ejs +7 -1
- package/hedhog/frontend/app/account/components/recovery-codes-dialog.tsx.ejs +1 -0
- package/hedhog/frontend/app/account/components/tokens.tsx.ejs +47 -17
- package/hedhog/frontend/app/ai_agent/page.tsx.ejs +46 -5
- package/hedhog/frontend/app/ai_instruction/_components/ai-instruction-form.tsx.ejs +101 -30
- package/hedhog/frontend/app/ai_instruction/_components/ai-instruction-versions.tsx.ejs +24 -8
- package/hedhog/frontend/app/ai_instruction/page.tsx.ejs +80 -15
- package/hedhog/frontend/app/configurations/[slug]/components/image-optimization-action.tsx.ejs +166 -0
- package/hedhog/frontend/app/configurations/[slug]/components/setting-field.test.tsx.ejs +145 -45
- package/hedhog/frontend/app/configurations/[slug]/components/setting-field.tsx.ejs +99 -219
- package/hedhog/frontend/app/configurations/[slug]/page.tsx.ejs +19 -1
- package/hedhog/frontend/app/configurations/layout.tsx.ejs +19 -5
- package/hedhog/frontend/app/dashboard/[slug]/widget-renderer.tsx.ejs +2 -8
- package/hedhog/frontend/app/dashboard/components/dynamic-widget.tsx.ejs +3 -0
- package/hedhog/frontend/app/dashboard/components/widget-wrapper.tsx.ejs +4 -0
- package/hedhog/frontend/app/dashboard/dashboard-home-tabs.tsx.ejs +43 -44
- package/hedhog/frontend/app/dashboard/management/tabs/component-roles-tab.tsx.ejs +41 -3
- package/hedhog/frontend/app/dashboard/management/tabs/components-tab.tsx.ejs +42 -2
- package/hedhog/frontend/app/dashboard/management/tabs/dashboard-roles-tab.tsx.ejs +41 -3
- package/hedhog/frontend/app/dashboard/management/tabs/dashboards-tab.tsx.ejs +39 -4
- package/hedhog/frontend/app/dashboard/management/tabs/items-tab.tsx.ejs +42 -3
- package/hedhog/frontend/app/incidents/page.tsx.ejs +60 -31
- package/hedhog/frontend/app/integration/profiles/page.tsx.ejs +45 -5
- package/hedhog/frontend/app/integrations-webhooks/page.tsx.ejs +92 -15
- package/hedhog/frontend/app/mail/log/page.tsx.ejs +109 -61
- package/hedhog/frontend/app/mail/template/page.tsx.ejs +125 -23
- package/hedhog/frontend/app/mcp_chat/chat-components.tsx.ejs +13 -15
- package/hedhog/frontend/app/mcp_chat/page.tsx.ejs +116 -110
- package/hedhog/frontend/app/message-templates/_components/message-template-sheet.tsx.ejs +245 -0
- package/hedhog/frontend/app/message-templates/_lib/types.ts.ejs +24 -0
- package/hedhog/frontend/app/message-templates/page.tsx.ejs +182 -0
- package/hedhog/frontend/app/pages/_components/page-wizard-sheet.tsx.ejs +1 -0
- package/hedhog/frontend/app/pages/page.tsx.ejs +94 -9
- package/hedhog/frontend/app/roles/menus.tsx.ejs +4 -4
- package/hedhog/frontend/app/roles/routes.tsx.ejs +4 -4
- package/hedhog/frontend/app/roles/users.tsx.ejs +4 -4
- package/hedhog/frontend/app/setting-list/page.tsx.ejs +71 -9
- package/hedhog/frontend/app/users/page.tsx.ejs +77 -67
- package/hedhog/frontend/messages/en.json +237 -37
- package/hedhog/frontend/messages/pt.json +237 -37
- package/hedhog/table/cron_lock.yaml +17 -0
- package/hedhog/table/file.yaml +13 -1
- package/hedhog/table/file_upload_chunk.yaml +23 -0
- package/hedhog/table/file_upload_ticket.yaml +67 -0
- package/hedhog/table/mcp_tool_call_log.yaml +30 -22
- package/hedhog/table/message_template.yaml +33 -0
- package/hedhog/table/setting.yaml +8 -0
- package/hedhog/table/user_session.yaml +36 -1
- package/package.json +5 -3
- package/src/ai/ai-agent.sort.ts +21 -0
- package/src/ai/ai-attachment.fragments.spec.ts +56 -3
- package/src/ai/ai.service.responses.spec.ts +429 -0
- package/src/ai/ai.service.spec.ts +173 -1
- package/src/ai/ai.service.ts +473 -220
- package/src/ai-instruction/ai-instruction.service.ts +32 -28
- package/src/ai-instruction/ai-instruction.sort.ts +32 -0
- package/src/ai-instruction/ai-prompt-resolver.service.spec.ts +44 -0
- package/src/ai-instruction/ai-prompt-resolver.service.ts +29 -0
- package/src/auth/auth.module.ts +8 -1
- package/src/auth/auth.service.spec.ts +108 -1
- package/src/auth/auth.service.ts +59 -5
- package/src/auth/guards/auth.guard.ts +9 -1
- package/src/authorize/authorize.controller.ts +126 -11
- package/src/authorize/authorize.errors.ts +55 -0
- package/src/authorize/authorize.module.ts +6 -1
- package/src/authorize/authorize.service.spec.ts +379 -7
- package/src/authorize/authorize.service.ts +309 -23
- package/src/authorize/dto/authorize-info.dto.ts +21 -3
- package/src/authorize/dto/consent.dto.ts +21 -3
- package/src/authorize/dto/token.dto.ts +24 -2
- package/src/authorize/oauth-exception.filter.ts +58 -0
- package/src/authorize/oauth-metadata.service.ts +67 -0
- package/src/authorize/well-known.controller.spec.ts +84 -0
- package/src/authorize/well-known.controller.ts +96 -0
- package/src/captcha/captcha.service.spec.ts +211 -4
- package/src/captcha/captcha.service.ts +127 -10
- package/src/core.module.ts +9 -0
- package/src/dashboard/dashboard-component-role/dashboard-component-role.service.ts +2 -3
- package/src/dashboard/dashboard-component-role/dashboard-component-role.sort.ts +18 -0
- package/src/dashboard/dashboard-item/dashboard-item.service.ts +2 -3
- package/src/dashboard/dashboard-item/dashboard-item.sort.ts +19 -0
- package/src/dashboard/dashboard-role/dashboard-role.service.ts +2 -3
- package/src/dashboard/dashboard-role/dashboard-role.sort.ts +16 -0
- package/src/document-kit/document-kit.module.ts +12 -0
- package/src/document-kit/document-kit.registry.ts +125 -0
- package/src/document-kit/document-kit.service.spec.ts +156 -0
- package/src/document-kit/document-kit.service.ts +173 -0
- package/src/file/file-upload-ticket.service.spec.ts +422 -0
- package/src/file/file-upload-ticket.service.ts +513 -0
- package/src/file/file.controller.ts +65 -0
- package/src/file/file.module.ts +14 -2
- package/src/file/file.service.spec.ts +262 -1
- package/src/file/file.service.ts +505 -87
- package/src/file/filename-encoding.util.spec.ts +54 -0
- package/src/file/filename-encoding.util.ts +67 -0
- package/src/file/image-optimization.service.spec.ts +156 -19
- package/src/file/image-optimization.service.ts +106 -21
- package/src/file/mcp-file-source.schema.ts +86 -0
- package/src/file/mcp-file-source.service.spec.ts +473 -0
- package/src/file/mcp-file-source.service.ts +445 -0
- package/src/file/mimetype-sniff.util.spec.ts +126 -0
- package/src/file/mimetype-sniff.util.ts +265 -0
- package/src/file/remote-fetch.util.spec.ts +117 -0
- package/src/file/remote-fetch.util.ts +330 -0
- package/src/impersonation/dto/start-impersonation.dto.ts +5 -2
- package/src/impersonation/impersonation.service.spec.ts +24 -1
- package/src/impersonation/impersonation.service.ts +14 -4
- package/src/incident/incident.controller.ts +9 -1
- package/src/incident/incident.service.ts +7 -0
- package/src/index.ts +23 -1
- package/src/integration-profile/integration-profile.secrets.ts +28 -0
- package/src/integration-profile/integration-profile.service.ts +7 -64
- package/src/integration-profile/integration-profile.utils.spec.ts +9 -0
- package/src/integration-profile/integration-profile.utils.ts +5 -5
- package/src/integration-profile/testers/ai.testers.ts +70 -5
- package/src/integration-profile/testers/index.ts +2 -0
- package/src/integration-profile/testers/remaining.testers.spec.ts +144 -1
- package/src/integration-profile/testers/shipping.testers.ts +94 -0
- package/src/integration-profile/testers/tester-coverage.spec.ts +10 -0
- package/src/mail/dto/send.dto.ts +6 -1
- package/src/mail/mail-template.spec.ts +58 -1
- package/src/mail/mail.service.spec.ts +112 -0
- package/src/mail/mail.service.ts +42 -4
- package/src/mail-sent/mail-sent.service.ts +3 -0
- package/src/mail-sent/mail-sent.sort.ts +19 -0
- package/src/mcp/filters/mcp-challenge.filter.spec.ts +76 -0
- package/src/mcp/filters/mcp-challenge.filter.ts +70 -0
- package/src/mcp/guards/mcp-auth.guard.spec.ts +51 -2
- package/src/mcp/guards/mcp-auth.guard.ts +24 -1
- package/src/mcp/guards/mcp-permission.guard.spec.ts +109 -15
- package/src/mcp/guards/mcp-permission.guard.ts +76 -51
- package/src/mcp/mcp-audit.service.spec.ts +107 -0
- package/src/mcp/mcp-audit.service.ts +37 -1
- package/src/mcp/mcp-permission.service.spec.ts +197 -0
- package/src/mcp/mcp-permission.service.ts +184 -0
- package/src/mcp/mcp-server.service.spec.ts +84 -2
- package/src/mcp/mcp-server.service.ts +111 -87
- package/src/mcp/mcp.controller.ts +8 -1
- package/src/mcp/mcp.module.ts +7 -1
- package/src/mcp/tools/core-access-log.mcp-tools.ts +66 -0
- package/src/mcp/tools/core-ai.mcp-tools.ts +1 -1
- package/src/mcp/tools/core-dashboard-items.mcp-tools.ts +1 -1
- package/src/mcp/tools/core-dashboard.mcp-tools.ts +1 -1
- package/src/mcp/tools/core-event-webhooks.mcp-tools.ts +1 -2
- package/src/mcp/tools/core-files.mcp-tools.ts +202 -22
- package/src/mcp/tools/core-integration-events.mcp-tools.ts +1 -1
- package/src/mcp/tools/core-mail-sent.mcp-tools.ts +1 -1
- package/src/mcp/tools/core-mail.mcp-tools.ts +1 -1
- package/src/mcp/tools/core-menus.mcp-tools.ts +1 -2
- package/src/mcp/tools/core-notifications.mcp-tools.ts +0 -1
- package/src/mcp/tools/core-roles.mcp-tools.ts +1 -5
- package/src/mcp/tools/core-routes.mcp-tools.ts +1 -3
- package/src/mcp/tools/core-screens.mcp-tools.ts +1 -3
- package/src/mcp/tools/core-sessions.mcp-tools.ts +0 -2
- package/src/mcp/tools/core-settings.mcp-tools.ts +1 -2
- package/src/mcp/tools/core-users.mcp-tools.ts +1 -1
- package/src/mcp/tools/core-webhooks.mcp-tools.ts +1 -2
- package/src/mcp/types/mcp-context.type.ts +15 -6
- package/src/mcp-chat/mcp-chat.service.ts +8 -0
- package/src/meeting/meeting-provider.registry.ts +201 -0
- package/src/meeting/meeting.constants.ts +74 -0
- package/src/menu/menu.service.spec.ts +89 -0
- package/src/menu/menu.service.ts +29 -11
- package/src/message-template/dto/update-message-template.dto.ts +22 -0
- package/src/message-template/message-template-admin.service.spec.ts +163 -0
- package/src/message-template/message-template-admin.service.ts +239 -0
- package/src/message-template/message-template.controller.ts +52 -0
- package/src/message-template/message-template.module.ts +21 -0
- package/src/message-template/message-template.registry.spec.ts +62 -0
- package/src/message-template/message-template.registry.ts +125 -0
- package/src/message-template/message-template.service.spec.ts +149 -0
- package/src/message-template/message-template.service.ts +149 -0
- package/src/notification/notification.constants.ts +10 -0
- package/src/notification/notification.module.ts +3 -0
- package/src/notification/notification.service.spec.ts +75 -1
- package/src/notification/notification.service.ts +39 -1
- package/src/oauth/oauth-token-broker.service.spec.ts +108 -0
- package/src/oauth/oauth-token-broker.service.ts +129 -2
- package/src/oauth/oauth.controller.ts +0 -1
- package/src/oauth/oauth.errors.ts +7 -0
- package/src/oauth/oauth.module.ts +6 -1
- package/src/oauth/oauth.service.spec.ts +58 -7
- package/src/oauth/oauth.service.ts +71 -32
- package/src/oauth/providers/abstract.provider.spec.ts +192 -0
- package/src/oauth/providers/abstract.provider.ts +46 -14
- package/src/oauth/providers/github.provider.ts +57 -34
- package/src/oauth/providers/microsoft-entra-id.provider.spec.ts +133 -0
- package/src/oauth/providers/microsoft-entra-id.provider.ts +37 -3
- package/src/observability/monitored-cron.spec.ts +164 -31
- package/src/observability/monitored-cron.ts +154 -62
- package/src/pdf/document/charts/chart-bar.ts +217 -0
- package/src/pdf/document/charts/chart-donut.ts +163 -0
- package/src/pdf/document/charts/chart-gauge.ts +94 -0
- package/src/pdf/document/charts/chart-line.ts +159 -0
- package/src/pdf/document/charts/chart-primitives.ts +188 -0
- package/src/pdf/document/charts/chart-radar.ts +136 -0
- package/src/pdf/document/charts/chart-scale.spec.ts +93 -0
- package/src/pdf/document/charts/chart-scale.ts +141 -0
- package/src/pdf/document/charts/charts.spec.ts +157 -0
- package/src/pdf/document/charts/index.ts +7 -0
- package/src/pdf/document/index.ts +7 -0
- package/src/pdf/document/pdf-document.chrome.ts +38 -0
- package/src/pdf/document/pdf-document.css.ts +238 -0
- package/src/pdf/document/pdf-document.renderer.spec.ts +129 -0
- package/src/pdf/document/pdf-document.renderer.ts +215 -0
- package/src/pdf/document/pdf-document.service.ts +77 -0
- package/src/pdf/document/pdf-document.theme.ts +146 -0
- package/src/pdf/document/pdf-document.types.ts +97 -0
- package/src/pdf/pdf.module.ts +3 -2
- package/src/pdf/pdf.service.spec.ts +131 -0
- package/src/pdf/pdf.service.ts +245 -82
- package/src/pdf/templates/commercial-proposal.template.spec.ts +177 -0
- package/src/pdf/templates/commercial-proposal.template.ts +400 -0
- package/src/profile/dto/change-password.dto.ts +25 -7
- package/src/profile/profile.service.spec.ts +97 -0
- package/src/profile/profile.service.ts +9 -3
- package/src/realtime/realtime-tick.coalescer.spec.ts +92 -0
- package/src/realtime/realtime-tick.coalescer.ts +60 -0
- package/src/realtime/realtime.service.spec.ts +33 -0
- package/src/realtime/realtime.service.ts +28 -2
- package/src/redis/redis-kv.service.ts +261 -0
- package/src/redis/redis-master.spec.ts +111 -0
- package/src/redis/redis-master.ts +86 -0
- package/src/redis/redis-pubsub.ts +27 -3
- package/src/redis/redis.module.ts +17 -0
- package/src/session/session.service.spec.ts +121 -42
- package/src/session/session.service.ts +279 -82
- package/src/setting/favicon.controller.spec.ts +92 -0
- package/src/setting/favicon.controller.ts +135 -0
- package/src/setting/setting.module.ts +2 -1
- package/src/setting/setting.service.ts +44 -3
- package/src/task/task.service.spec.ts +41 -0
- package/src/task/task.service.ts +53 -13
- package/src/token/token.service.spec.ts +90 -0
- package/src/token/token.service.ts +48 -2
- package/src/user/user-credential.util.ts +14 -5
- package/src/user/user.service.ts +2 -12
- package/src/user/user.sort.ts +25 -0
- package/src/utils/abbreviate-name.spec.ts +50 -0
- package/src/utils/abbreviate-name.ts +44 -0
- package/src/utils/date-range-query.dto.ts +56 -0
- package/src/utils/date-range.spec.ts +175 -0
- package/src/utils/date-range.ts +246 -0
- package/src/webhook-integration/webhook-utils.spec.ts +67 -0
- package/src/webhook-integration/webhook-utils.ts +26 -0
- package/src/whatsapp-sender/whatsapp-recipients.spec.ts +89 -0
- package/src/whatsapp-sender/whatsapp-recipients.ts +83 -0
- package/src/whatsapp-sender/whatsapp-sender.service.spec.ts +185 -0
- package/src/whatsapp-sender/whatsapp-sender.service.ts +90 -7
- package/hedhog/query/device_pairing_request.sql +0 -46
- package/hedhog/query/impersonation_grant.sql +0 -71
- package/hedhog/query/oauth_authorize_pkce.sql +0 -58
- package/hedhog/query/oauth_mobile_state_token.sql +0 -30
- package/hedhog/query/oauth_web_ref_token.sql +0 -25
|
@@ -76,52 +76,75 @@ export class GithubProvider extends BaseOAuthProvider {
|
|
|
76
76
|
const redirectURI = redirectUri?.trim()
|
|
77
77
|
? redirectUri.trim()
|
|
78
78
|
: new URL(fixedCallbackPath, apiUrl.replace(':3200', ':3100')).toString();
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
79
|
+
// Este provider não usa os helpers da base (fala com o axios direto), então
|
|
80
|
+
// precisa do mesmo tratamento de erro que eles aplicam — sem isso o AxiosError
|
|
81
|
+
// cru chega ao OAuthService e vira 503 genérico.
|
|
82
|
+
let tokenResponse: any;
|
|
83
|
+
try {
|
|
84
|
+
tokenResponse = await this.http.axiosRef.post(
|
|
85
|
+
'https://github.com/login/oauth/access_token',
|
|
86
|
+
{
|
|
87
|
+
client_id: clientId,
|
|
88
|
+
client_secret: clientSecret,
|
|
89
|
+
code,
|
|
90
|
+
redirect_uri: redirectURI,
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
headers: {
|
|
94
|
+
Accept: 'application/json',
|
|
95
|
+
},
|
|
90
96
|
},
|
|
91
|
-
},
|
|
92
|
-
);
|
|
93
|
-
|
|
94
|
-
const { access_token, error, error_description } = tokenResponse.data;
|
|
95
|
-
if (error || !access_token) {
|
|
96
|
-
throw new Error(
|
|
97
|
-
`GitHub OAuth error: ${error_description || error || 'No access token received'}`,
|
|
98
97
|
);
|
|
98
|
+
} catch (error) {
|
|
99
|
+
throw this.mapProviderError(this.getProviderType(), error);
|
|
99
100
|
}
|
|
100
101
|
|
|
101
|
-
const
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
102
|
+
const { access_token, error, error_description } = tokenResponse.data;
|
|
103
|
+
if (error || !access_token) {
|
|
104
|
+
// O GitHub responde 200 com o erro no corpo, então não há AxiosError para
|
|
105
|
+
// capturar: monta-se a mesma forma que o mapeador lê.
|
|
106
|
+
throw this.mapProviderError(this.getProviderType(), {
|
|
107
|
+
response: {
|
|
108
|
+
status: tokenResponse.status,
|
|
109
|
+
data: {
|
|
110
|
+
error: error || 'no_access_token',
|
|
111
|
+
error_description:
|
|
112
|
+
error_description || 'No access token received from GitHub.',
|
|
113
|
+
},
|
|
106
114
|
},
|
|
107
|
-
}
|
|
108
|
-
|
|
115
|
+
});
|
|
116
|
+
}
|
|
109
117
|
|
|
110
|
-
|
|
111
|
-
let email
|
|
112
|
-
|
|
113
|
-
const
|
|
114
|
-
'https://api.github.com/user
|
|
118
|
+
let profile: any;
|
|
119
|
+
let email: string | null;
|
|
120
|
+
try {
|
|
121
|
+
const profileResponse = await this.http.axiosRef.get(
|
|
122
|
+
'https://api.github.com/user',
|
|
115
123
|
{
|
|
116
124
|
headers: {
|
|
117
125
|
Authorization: `Bearer ${access_token}`,
|
|
118
126
|
},
|
|
119
127
|
},
|
|
120
128
|
);
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
129
|
+
|
|
130
|
+
profile = profileResponse.data;
|
|
131
|
+
email = profile.email;
|
|
132
|
+
if (!email) {
|
|
133
|
+
const emailResponse = await this.http.axiosRef.get(
|
|
134
|
+
'https://api.github.com/user/emails',
|
|
135
|
+
{
|
|
136
|
+
headers: {
|
|
137
|
+
Authorization: `Bearer ${access_token}`,
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
);
|
|
141
|
+
const primaryEmail = emailResponse.data.find(
|
|
142
|
+
(e: any) => e.primary && e.verified,
|
|
143
|
+
);
|
|
144
|
+
email = primaryEmail?.email || null;
|
|
145
|
+
}
|
|
146
|
+
} catch (error) {
|
|
147
|
+
throw this.mapProviderError(this.getProviderType(), error);
|
|
125
148
|
}
|
|
126
149
|
|
|
127
150
|
return {
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { describe, expect, it, jest } from '@jest/globals';
|
|
2
|
+
import { HttpService } from '@nestjs/axios';
|
|
3
|
+
import { of } from 'rxjs';
|
|
4
|
+
import { MicrosoftEntraIdProvider } from './microsoft-entra-id.provider';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* O que estes testes protegem: `user_account.scopes` tem que registrar o que a
|
|
8
|
+
* Microsoft CONCEDEU, não o que a setting pede.
|
|
9
|
+
*
|
|
10
|
+
* Gravar a setting quebrava toda a integração delegada de um jeito que não dava
|
|
11
|
+
* pista nenhuma. O `OAuthTokenBrokerService` monta o `scope` do refresh a partir
|
|
12
|
+
* dessa coluna; se ela promete um escopo que o consentimento não cobre, a
|
|
13
|
+
* Microsoft recusa o grant com `invalid_grant`, o broker traduz para "reconecte
|
|
14
|
+
* a conta" — e reconectar pelo login regrava a mesma setting, então o usuário
|
|
15
|
+
* reconecta, falha, reconecta, falha.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
const SCOPES_CONFIGURADOS = [
|
|
19
|
+
'openid',
|
|
20
|
+
'profile',
|
|
21
|
+
'email',
|
|
22
|
+
'User.Read',
|
|
23
|
+
'offline_access',
|
|
24
|
+
'Chat.Read',
|
|
25
|
+
'Files.Read.All',
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
const makeProvider = (tokenResponse: Record<string, unknown>) => {
|
|
29
|
+
const http = {
|
|
30
|
+
post: jest.fn(() => of({ data: tokenResponse })),
|
|
31
|
+
get: jest.fn(() => of({ data: { id: 'graph-id', mail: 'alguem@exemplo.test', displayName: 'Alguém' } })),
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
const setting = {
|
|
35
|
+
getSettingValues: jest.fn(async (slugs: string[]) => {
|
|
36
|
+
const values: Record<string, unknown> = {
|
|
37
|
+
'oauth-microsoft-entra-id-profile-id': 'perfil-entra',
|
|
38
|
+
'oauth-microsoft-entra-id-scopes': SCOPES_CONFIGURADOS,
|
|
39
|
+
url: 'https://app.exemplo.test',
|
|
40
|
+
'api-url': 'https://api.exemplo.test',
|
|
41
|
+
};
|
|
42
|
+
return Object.fromEntries(slugs.map((slug) => [slug, values[slug]]));
|
|
43
|
+
}),
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const prisma = {
|
|
47
|
+
integration_profile: {
|
|
48
|
+
findUnique: jest.fn(async () => ({
|
|
49
|
+
slug: 'perfil-entra',
|
|
50
|
+
config: { client_id: 'CID', client_secret: 'SECRET', tenant_id: 'TENANT' },
|
|
51
|
+
integration_provider: { slug: 'microsoft-entra-id-oauth' },
|
|
52
|
+
})),
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
return new MicrosoftEntraIdProvider(
|
|
57
|
+
http as unknown as HttpService,
|
|
58
|
+
setting as any,
|
|
59
|
+
prisma as any,
|
|
60
|
+
);
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
const parse = (profile: any) => String(profile.oauth_scopes).split(',');
|
|
64
|
+
|
|
65
|
+
describe('MicrosoftEntraIdProvider.getProfile — escopos', () => {
|
|
66
|
+
it('grava o que a Microsoft concedeu, não o que a setting pede', async () => {
|
|
67
|
+
// Consentimento antigo: nem Chat.Read nem Files.Read.All foram aprovados.
|
|
68
|
+
const provider = makeProvider({
|
|
69
|
+
access_token: 'ACCESS',
|
|
70
|
+
refresh_token: 'REFRESH',
|
|
71
|
+
expires_in: 3600,
|
|
72
|
+
scope: 'openid profile email User.Read',
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
const scopes = parse(await provider.getProfile('CODE', 'login'));
|
|
76
|
+
|
|
77
|
+
expect(scopes).not.toContain('Chat.Read');
|
|
78
|
+
expect(scopes).not.toContain('Files.Read.All');
|
|
79
|
+
expect(scopes).toContain('User.Read');
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it('mantém offline_access quando veio refresh token, mesmo fora do scope', async () => {
|
|
83
|
+
// A Microsoft não repete `offline_access` em `token.scope`. Perdê-lo faria
|
|
84
|
+
// o broker tratar a conta como sem acesso offline.
|
|
85
|
+
const provider = makeProvider({
|
|
86
|
+
access_token: 'ACCESS',
|
|
87
|
+
refresh_token: 'REFRESH',
|
|
88
|
+
expires_in: 3600,
|
|
89
|
+
scope: 'openid profile email User.Read',
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
expect(parse(await provider.getProfile('CODE', 'login'))).toContain(
|
|
93
|
+
'offline_access',
|
|
94
|
+
);
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it('não inventa offline_access quando não houve refresh token', async () => {
|
|
98
|
+
const provider = makeProvider({
|
|
99
|
+
access_token: 'ACCESS',
|
|
100
|
+
expires_in: 3600,
|
|
101
|
+
scope: 'openid profile email',
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
expect(parse(await provider.getProfile('CODE', 'login'))).not.toContain(
|
|
105
|
+
'offline_access',
|
|
106
|
+
);
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
it('cai para os escopos pedidos só quando a Microsoft não informa nenhum', async () => {
|
|
110
|
+
// Ausência de `scope` é omissão do provedor; lista vazia seria resposta.
|
|
111
|
+
const provider = makeProvider({
|
|
112
|
+
access_token: 'ACCESS',
|
|
113
|
+
refresh_token: 'REFRESH',
|
|
114
|
+
expires_in: 3600,
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
const scopes = parse(await provider.getProfile('CODE', 'login'));
|
|
118
|
+
|
|
119
|
+
expect(scopes).toEqual(expect.arrayContaining(SCOPES_CONFIGURADOS));
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
it('registra escopo concedido vazio como vazio, sem assumir o pedido', async () => {
|
|
123
|
+
const provider = makeProvider({
|
|
124
|
+
access_token: 'ACCESS',
|
|
125
|
+
expires_in: 3600,
|
|
126
|
+
scope: ' ',
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
expect(parse(await provider.getProfile('CODE', 'login'))).not.toContain(
|
|
130
|
+
'Files.Read.All',
|
|
131
|
+
);
|
|
132
|
+
});
|
|
133
|
+
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { PrismaService } from '@hed-hog/api-prisma';
|
|
2
2
|
import { HttpService } from '@nestjs/axios';
|
|
3
|
-
import { BadRequestException, forwardRef, Inject, Injectable, Logger } from '@nestjs/common';
|
|
3
|
+
import { BadRequestException, forwardRef, HttpException, Inject, Injectable, Logger } from '@nestjs/common';
|
|
4
4
|
import { buildOAuthConfigFromIntegration } from '../../integration-profile/integration-profile.utils';
|
|
5
5
|
import { SettingService } from '../../setting/setting.service';
|
|
6
6
|
import { BaseOAuthProvider } from './abstract.provider';
|
|
@@ -77,6 +77,19 @@ export class MicrosoftEntraIdProvider extends BaseOAuthProvider {
|
|
|
77
77
|
};
|
|
78
78
|
}
|
|
79
79
|
|
|
80
|
+
/**
|
|
81
|
+
* Escopos que a Microsoft devolveu no token, ou `null` quando ela não
|
|
82
|
+
* informou — só nesse caso vale cair de volta para os escopos pedidos.
|
|
83
|
+
* Uma lista vazia é resposta legítima e não pode virar "assume o pedido".
|
|
84
|
+
*/
|
|
85
|
+
private parseGrantedScopes(scope: unknown): string[] | null {
|
|
86
|
+
if (typeof scope !== 'string') return null;
|
|
87
|
+
return scope
|
|
88
|
+
.split(/[\s,]+/)
|
|
89
|
+
.map((item) => item.trim())
|
|
90
|
+
.filter(Boolean);
|
|
91
|
+
}
|
|
92
|
+
|
|
80
93
|
/** Absolute redirect URI the web flow registers/exchanges against (the API). */
|
|
81
94
|
private buildApiRedirectUri(apiUrl: string) {
|
|
82
95
|
if (!String(apiUrl).trim()) {
|
|
@@ -155,8 +168,22 @@ export class MicrosoftEntraIdProvider extends BaseOAuthProvider {
|
|
|
155
168
|
'https://graph.microsoft.com/v1.0/me',
|
|
156
169
|
);
|
|
157
170
|
|
|
171
|
+
// `token.scope` é o que a Microsoft de fato consentiu, que pode ser MENOS
|
|
172
|
+
// do que a setting pede — consentimento antigo do usuário, ou escopo novo
|
|
173
|
+
// ainda sem aprovação do admin. Gravar a setting como se fosse o concedido
|
|
174
|
+
// faz o refresh seguinte pedir escopo que o grant não cobre, e aí a
|
|
175
|
+
// resposta é `invalid_grant`: a UI diz "reconecte a conta", e reconectar
|
|
176
|
+
// pelo login regrava a mesma setting, então nunca sai do lugar.
|
|
177
|
+
const grantedScopes = this.parseGrantedScopes(token.scope) ?? scopes;
|
|
178
|
+
// A Microsoft não repete `offline_access` em `token.scope`, mas ter
|
|
179
|
+
// devolvido um refresh token é prova de que foi concedido.
|
|
180
|
+
if (token.refresh_token && !grantedScopes.includes('offline_access')) {
|
|
181
|
+
grantedScopes.push('offline_access');
|
|
182
|
+
}
|
|
183
|
+
const missing = scopes.filter((scope) => !grantedScopes.includes(scope));
|
|
184
|
+
|
|
158
185
|
this.logger.log(
|
|
159
|
-
`OAuth profile fetched: provider=MICROSOFT-ENTRA-ID type=${type} profileIdPresent=${profile?.id ? 'yes' : 'no'} emailPresent=${profile?.mail || profile?.userPrincipalName ? 'yes' : 'no'}`,
|
|
186
|
+
`OAuth profile fetched: provider=MICROSOFT-ENTRA-ID type=${type} profileIdPresent=${profile?.id ? 'yes' : 'no'} emailPresent=${profile?.mail || profile?.userPrincipalName ? 'yes' : 'no'} scopesGranted=${grantedScopes.length}/${scopes.length}${missing.length ? ` missing=${missing.join(' ')}` : ''}`,
|
|
160
187
|
);
|
|
161
188
|
|
|
162
189
|
const pictureUrl = 'https://graph.microsoft.com/v1.0/me/photo/$value';
|
|
@@ -165,7 +192,7 @@ export class MicrosoftEntraIdProvider extends BaseOAuthProvider {
|
|
|
165
192
|
email: profile.mail || profile.userPrincipalName,
|
|
166
193
|
name: profile.displayName,
|
|
167
194
|
picture: pictureUrl,
|
|
168
|
-
oauth_scopes:
|
|
195
|
+
oauth_scopes: grantedScopes.join(','),
|
|
169
196
|
oauth_tokens: {
|
|
170
197
|
access_token: token.access_token,
|
|
171
198
|
refresh_token: token.refresh_token,
|
|
@@ -174,6 +201,13 @@ export class MicrosoftEntraIdProvider extends BaseOAuthProvider {
|
|
|
174
201
|
},
|
|
175
202
|
};
|
|
176
203
|
} catch (error: any) {
|
|
204
|
+
// O try acima cobre também o `loadConfig`, que sinaliza perfil ausente com
|
|
205
|
+
// uma HttpException — mapeá-la transformaria um 400 de configuração em um
|
|
206
|
+
// 503 de indisponibilidade.
|
|
207
|
+
if (error instanceof HttpException) {
|
|
208
|
+
throw error;
|
|
209
|
+
}
|
|
210
|
+
|
|
177
211
|
const mappedError = this.mapProviderError('Microsoft Entra ID', error);
|
|
178
212
|
|
|
179
213
|
this.logger.warn(
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { describe, it, expect, jest, beforeEach } from '@jest/globals';
|
|
1
|
+
import { describe, it, expect, jest, beforeEach, afterEach } from '@jest/globals';
|
|
2
2
|
|
|
3
3
|
const withMonitor = jest.fn((_slug: string, callback: () => any) => callback());
|
|
4
4
|
const startSpan = jest.fn((_opts: any, callback: () => any) => callback());
|
|
5
|
+
const startNewTrace = jest.fn((callback: () => any) => callback());
|
|
5
6
|
const captureException = jest.fn();
|
|
6
7
|
const withScope = jest.fn((cb: (scope: any) => void) => {
|
|
7
8
|
const scope = { setTag: jest.fn() };
|
|
@@ -9,41 +10,83 @@ const withScope = jest.fn((cb: (scope: any) => void) => {
|
|
|
9
10
|
return scope;
|
|
10
11
|
});
|
|
11
12
|
|
|
12
|
-
jest.mock('@sentry/nestjs', () => ({
|
|
13
|
+
jest.mock('@sentry/nestjs', () => ({
|
|
14
|
+
withMonitor,
|
|
15
|
+
startSpan,
|
|
16
|
+
startNewTrace,
|
|
17
|
+
captureException,
|
|
18
|
+
withScope,
|
|
19
|
+
}));
|
|
13
20
|
|
|
14
21
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
15
22
|
const { runMonitoredCron } = require('./monitored-cron');
|
|
16
23
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
24
|
+
type FakeOptions = {
|
|
25
|
+
/** `false` simula outro pod segurando a lease (nenhuma linha devolvida). */
|
|
26
|
+
won?: boolean;
|
|
27
|
+
claimThrows?: boolean;
|
|
28
|
+
releaseThrows?: boolean;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* O Prisma chama a tagged template como `$queryRaw(strings, ...values)`, então os
|
|
33
|
+
* parâmetros do SQL chegam aqui na ordem em que aparecem na query: o claim manda
|
|
34
|
+
* [slug, holder, leaseSeconds] e o release manda [slug, holder].
|
|
35
|
+
*/
|
|
36
|
+
function fakePrisma(options: FakeOptions = {}) {
|
|
37
|
+
const claims: any[][] = [];
|
|
38
|
+
const releases: any[][] = [];
|
|
39
|
+
|
|
40
|
+
const $queryRaw = jest.fn(async (_strings: any, ...values: any[]) => {
|
|
41
|
+
claims.push(values);
|
|
42
|
+
if (options.claimThrows) throw new Error('Unable to start a transaction in the given time.');
|
|
43
|
+
return options.won === false ? [] : [{ won: 1 }];
|
|
22
44
|
});
|
|
23
|
-
|
|
45
|
+
|
|
46
|
+
const $executeRaw = jest.fn(async (_strings: any, ...values: any[]) => {
|
|
47
|
+
releases.push(values);
|
|
48
|
+
if (options.releaseThrows) throw new Error('release falhou');
|
|
49
|
+
return 1;
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
return { $queryRaw, $executeRaw, claims, releases };
|
|
24
53
|
}
|
|
25
54
|
|
|
55
|
+
const BASE = { slug: 'meu-cron', schedule: '* * * * *' };
|
|
56
|
+
|
|
26
57
|
describe('runMonitoredCron', () => {
|
|
58
|
+
const originalSlugs = process.env.SENTRY_CRON_MONITOR_SLUGS;
|
|
59
|
+
|
|
27
60
|
beforeEach(() => {
|
|
28
61
|
jest.clearAllMocks();
|
|
62
|
+
// O default de produção libera check-in só para um slug; os casos abaixo
|
|
63
|
+
// descrevem o comportamento com o monitor ligado, então valem para todos.
|
|
64
|
+
process.env.SENTRY_CRON_MONITOR_SLUGS = '*';
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
afterEach(() => {
|
|
68
|
+
if (originalSlugs === undefined) delete process.env.SENTRY_CRON_MONITOR_SLUGS;
|
|
69
|
+
else process.env.SENTRY_CRON_MONITOR_SLUGS = originalSlugs;
|
|
29
70
|
});
|
|
30
71
|
|
|
31
72
|
it('retorna undefined sem executar work() quando outro pod já ganhou o tick', async () => {
|
|
32
|
-
const prisma = fakePrisma(false);
|
|
73
|
+
const prisma = fakePrisma({ won: false });
|
|
33
74
|
const work = jest.fn();
|
|
34
75
|
|
|
35
|
-
const result = await runMonitoredCron(prisma,
|
|
76
|
+
const result = await runMonitoredCron(prisma, BASE, work);
|
|
36
77
|
|
|
37
78
|
expect(result).toBeUndefined();
|
|
38
79
|
expect(work).not.toHaveBeenCalled();
|
|
39
80
|
expect(withMonitor).not.toHaveBeenCalled();
|
|
81
|
+
// Perder o tick não pode mexer na lease de quem venceu.
|
|
82
|
+
expect(prisma.$executeRaw).not.toHaveBeenCalled();
|
|
40
83
|
});
|
|
41
84
|
|
|
42
85
|
it('executa work() e devolve o resultado quando ganha o tick', async () => {
|
|
43
|
-
const prisma = fakePrisma(
|
|
86
|
+
const prisma = fakePrisma();
|
|
44
87
|
const work = jest.fn().mockResolvedValue({ ok: true });
|
|
45
88
|
|
|
46
|
-
const result = await runMonitoredCron(prisma,
|
|
89
|
+
const result = await runMonitoredCron(prisma, BASE, work);
|
|
47
90
|
|
|
48
91
|
expect(work).toHaveBeenCalledTimes(1);
|
|
49
92
|
expect(withMonitor).toHaveBeenCalledWith(
|
|
@@ -54,44 +97,61 @@ describe('runMonitoredCron', () => {
|
|
|
54
97
|
expect(result).toEqual({ ok: true });
|
|
55
98
|
});
|
|
56
99
|
|
|
57
|
-
it('
|
|
58
|
-
const prisma = fakePrisma(
|
|
100
|
+
it('libera a lease com o MESMO holder que a tomou', async () => {
|
|
101
|
+
const prisma = fakePrisma();
|
|
102
|
+
|
|
103
|
+
await runMonitoredCron(prisma, BASE, jest.fn().mockResolvedValue(undefined));
|
|
104
|
+
|
|
105
|
+
const [claimSlug, claimHolder] = prisma.claims[0];
|
|
106
|
+
const [releaseSlug, releaseHolder] = prisma.releases[0];
|
|
107
|
+
|
|
108
|
+
expect(claimSlug).toBe('meu-cron');
|
|
109
|
+
expect(releaseSlug).toBe('meu-cron');
|
|
110
|
+
expect(releaseHolder).toBe(claimHolder);
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
it('usa um holder diferente a cada execução, para um release atrasado não apagar a lease do tick seguinte', async () => {
|
|
114
|
+
const prisma = fakePrisma();
|
|
115
|
+
const work = jest.fn().mockResolvedValue(undefined);
|
|
116
|
+
|
|
117
|
+
await runMonitoredCron(prisma, BASE, work);
|
|
118
|
+
await runMonitoredCron(prisma, BASE, work);
|
|
119
|
+
|
|
120
|
+
expect(prisma.claims[0][1]).not.toBe(prisma.claims[1][1]);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
it('NUNCA relança quando work() falha — captura no Sentry, libera a lease e retorna undefined', async () => {
|
|
124
|
+
const prisma = fakePrisma();
|
|
59
125
|
const boom = new Error('cron falhou');
|
|
60
126
|
const work = jest.fn().mockRejectedValue(boom);
|
|
61
127
|
|
|
62
|
-
await expect(
|
|
63
|
-
runMonitoredCron(prisma, { slug: 'meu-cron', schedule: '* * * * *' }, work),
|
|
64
|
-
).resolves.toBeUndefined();
|
|
128
|
+
await expect(runMonitoredCron(prisma, BASE, work)).resolves.toBeUndefined();
|
|
65
129
|
|
|
66
130
|
expect(captureException).toHaveBeenCalledWith(
|
|
67
131
|
boom,
|
|
68
132
|
expect.objectContaining({ mechanism: { handled: true, type: 'hedhog.cron' } }),
|
|
69
133
|
);
|
|
134
|
+
// A lease não pode ficar presa até vencer só porque o trabalho deu erro.
|
|
135
|
+
expect(prisma.$executeRaw).toHaveBeenCalledTimes(1);
|
|
70
136
|
});
|
|
71
137
|
|
|
72
|
-
it('dimensiona
|
|
73
|
-
const prisma = fakePrisma(
|
|
74
|
-
const work = jest.fn().mockResolvedValue(undefined);
|
|
138
|
+
it('dimensiona a validade da lease a partir de maxRuntimeMinutes', async () => {
|
|
139
|
+
const prisma = fakePrisma();
|
|
75
140
|
|
|
76
141
|
await runMonitoredCron(
|
|
77
142
|
prisma,
|
|
78
|
-
{
|
|
79
|
-
|
|
143
|
+
{ ...BASE, maxRuntimeMinutes: 2 },
|
|
144
|
+
jest.fn().mockResolvedValue(undefined),
|
|
80
145
|
);
|
|
81
146
|
|
|
82
|
-
expect(prisma
|
|
83
|
-
expect.any(Function),
|
|
84
|
-
{ timeout: 2 * 60_000 + 30_000, maxWait: 20_000 },
|
|
85
|
-
);
|
|
147
|
+
expect(prisma.claims[0][2]).toBe(2 * 60 + 30);
|
|
86
148
|
});
|
|
87
149
|
|
|
88
|
-
it('NUNCA relança quando a
|
|
89
|
-
const prisma = fakePrisma(
|
|
150
|
+
it('NUNCA relança quando a eleição falha (ex.: banco indisponível) — captura no Sentry', async () => {
|
|
151
|
+
const prisma = fakePrisma({ claimThrows: true });
|
|
90
152
|
const work = jest.fn();
|
|
91
153
|
|
|
92
|
-
await expect(
|
|
93
|
-
runMonitoredCron(prisma, { slug: 'meu-cron', schedule: '* * * * *' }, work),
|
|
94
|
-
).resolves.toBeUndefined();
|
|
154
|
+
await expect(runMonitoredCron(prisma, BASE, work)).resolves.toBeUndefined();
|
|
95
155
|
|
|
96
156
|
expect(work).not.toHaveBeenCalled();
|
|
97
157
|
expect(captureException).toHaveBeenCalledWith(
|
|
@@ -99,4 +159,77 @@ describe('runMonitoredCron', () => {
|
|
|
99
159
|
expect.objectContaining({ mechanism: { handled: true, type: 'hedhog.cron' } }),
|
|
100
160
|
);
|
|
101
161
|
});
|
|
162
|
+
|
|
163
|
+
it('falha ao liberar a lease não derruba o cron nem mascara o resultado de work()', async () => {
|
|
164
|
+
const prisma = fakePrisma({ releaseThrows: true });
|
|
165
|
+
const work = jest.fn().mockResolvedValue({ ok: true });
|
|
166
|
+
|
|
167
|
+
await expect(runMonitoredCron(prisma, BASE, work)).resolves.toEqual({ ok: true });
|
|
168
|
+
|
|
169
|
+
expect(captureException).not.toHaveBeenCalled();
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* O plano do Sentry cobre UM monitor de cron e o projeto tem cinco. Check-in de
|
|
174
|
+
* slug sem cota é descartado na entrada, então o que se protege aqui é que a
|
|
175
|
+
* ausência dele não leve junto o trabalho, o span nem o relato de erro.
|
|
176
|
+
*/
|
|
177
|
+
describe('allowlist de check-in (SENTRY_CRON_MONITOR_SLUGS)', () => {
|
|
178
|
+
it('emite check-in para slug listado', async () => {
|
|
179
|
+
process.env.SENTRY_CRON_MONITOR_SLUGS = 'outro-cron,meu-cron';
|
|
180
|
+
const prisma = fakePrisma();
|
|
181
|
+
|
|
182
|
+
await runMonitoredCron(prisma, BASE, jest.fn().mockResolvedValue({ ok: true }));
|
|
183
|
+
|
|
184
|
+
expect(withMonitor).toHaveBeenCalledTimes(1);
|
|
185
|
+
expect(startNewTrace).not.toHaveBeenCalled();
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
it('slug fora da lista roda work() e o span, sem check-in', async () => {
|
|
189
|
+
process.env.SENTRY_CRON_MONITOR_SLUGS = 'outro-cron';
|
|
190
|
+
const prisma = fakePrisma();
|
|
191
|
+
const work = jest.fn().mockResolvedValue({ ok: true });
|
|
192
|
+
|
|
193
|
+
const result = await runMonitoredCron(prisma, BASE, work);
|
|
194
|
+
|
|
195
|
+
expect(result).toEqual({ ok: true });
|
|
196
|
+
expect(work).toHaveBeenCalledTimes(1);
|
|
197
|
+
expect(withMonitor).not.toHaveBeenCalled();
|
|
198
|
+
// O trace continua isolado por execução, papel que o `isolateTrace` do
|
|
199
|
+
// withMonitor cumpre no outro ramo.
|
|
200
|
+
expect(startNewTrace).toHaveBeenCalledTimes(1);
|
|
201
|
+
expect(startSpan).toHaveBeenCalledWith(
|
|
202
|
+
expect.objectContaining({ name: 'meu-cron', op: 'cron.hedhog' }),
|
|
203
|
+
expect.any(Function),
|
|
204
|
+
);
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
it('slug fora da lista continua liberando a lease e reportando erro', async () => {
|
|
208
|
+
process.env.SENTRY_CRON_MONITOR_SLUGS = 'outro-cron';
|
|
209
|
+
const prisma = fakePrisma();
|
|
210
|
+
const boom = new Error('cron falhou');
|
|
211
|
+
|
|
212
|
+
await expect(
|
|
213
|
+
runMonitoredCron(prisma, BASE, jest.fn().mockRejectedValue(boom)),
|
|
214
|
+
).resolves.toBeUndefined();
|
|
215
|
+
|
|
216
|
+
expect(captureException).toHaveBeenCalledWith(
|
|
217
|
+
boom,
|
|
218
|
+
expect.objectContaining({ mechanism: { handled: true, type: 'hedhog.cron' } }),
|
|
219
|
+
);
|
|
220
|
+
expect(prisma.$executeRaw).toHaveBeenCalledTimes(1);
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
it('sem a env, o default deixa passar só o sac-mailbox-poller', async () => {
|
|
224
|
+
delete process.env.SENTRY_CRON_MONITOR_SLUGS;
|
|
225
|
+
const work = jest.fn().mockResolvedValue(undefined);
|
|
226
|
+
|
|
227
|
+
await runMonitoredCron(fakePrisma(), { ...BASE, slug: 'sac-mailbox-poller' }, work);
|
|
228
|
+
expect(withMonitor).toHaveBeenCalledTimes(1);
|
|
229
|
+
|
|
230
|
+
await runMonitoredCron(fakePrisma(), BASE, work);
|
|
231
|
+
expect(withMonitor).toHaveBeenCalledTimes(1);
|
|
232
|
+
expect(work).toHaveBeenCalledTimes(2);
|
|
233
|
+
});
|
|
234
|
+
});
|
|
102
235
|
});
|