@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
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Identifica o tipo real de um arquivo pelos primeiros bytes, para que o mimetype
|
|
4
|
+
* declarado por quem envia não seja a única palavra sobre o que está sendo gravado.
|
|
5
|
+
*
|
|
6
|
+
* Hoje o `Content-Type` do multipart é a fonte de verdade sempre que vem concreto
|
|
7
|
+
* (`resolveEffectiveMimetype` no `FileService` só recorre ao conteúdo quando o caller
|
|
8
|
+
* manda vazio ou `application/octet-stream`), então um executável enviado como
|
|
9
|
+
* `image/png` passa direto pelo `storage-accept-mimetype`. Nas origens novas do MCP o
|
|
10
|
+
* cliente escolhe livremente o `mimeType`, o que tornaria essa brecha trivial de usar.
|
|
11
|
+
*
|
|
12
|
+
* Cobre o conjunto de opções do `storage-accept-mimetype` e nada além: a função não é
|
|
13
|
+
* um detector geral, é o contraditório do que foi declarado. Quando o formato não está
|
|
14
|
+
* nesta lista ela devolve `null`, e quem chama mantém o tipo declarado — recusar o que
|
|
15
|
+
* não se sabe reconhecer barraria CSV, OFX e afins, que são justamente o insumo do
|
|
16
|
+
* `statements.import`.
|
|
17
|
+
*
|
|
18
|
+
* Não usa `file-type`: da v19 em diante o pacote é ESM puro e quebraria o build CJS
|
|
19
|
+
* destas libraries. Os formatos aqui têm assinatura estável e curta.
|
|
20
|
+
*
|
|
21
|
+
* Existem dois primos, e a diferença entre eles e este é de política, não de descuido:
|
|
22
|
+
* `cms/src/form/cms-form-file-sniffer.ts` e
|
|
23
|
+
* `operations/src/task-intake/task-intake-file-sniffer.ts` usam allowlist **fechada** —
|
|
24
|
+
* o que não é reconhecido é recusado — porque servem endpoints anônimos, onde o mimetype
|
|
25
|
+
* declarado não vale nada e o conjunto aceito é estreito (print e vídeo do problema).
|
|
26
|
+
* Aqui a política é aberta: o caminho é autenticado e precisa continuar aceitando CSV e
|
|
27
|
+
* OFX, que não têm assinatura, para o `finance.statements.import`. Unificar os três
|
|
28
|
+
* significaria parametrizar essa política através de uma fronteira de segurança, e
|
|
29
|
+
* afrouxar por acidente o endpoint anônimo é o risco que isso carrega — é mudança
|
|
30
|
+
* própria, não carona nesta.
|
|
31
|
+
*/
|
|
32
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
33
|
+
exports.MIMETYPE_SNIFF_BYTES = void 0;
|
|
34
|
+
exports.detectMimetypeFromBytes = detectMimetypeFromBytes;
|
|
35
|
+
exports.findMimetypeConflict = findMimetypeConflict;
|
|
36
|
+
/** Quanto do início do arquivo basta para todas as assinaturas abaixo. */
|
|
37
|
+
exports.MIMETYPE_SNIFF_BYTES = 4096;
|
|
38
|
+
const ascii = (buffer, offset, text) => buffer.length >= offset + text.length &&
|
|
39
|
+
buffer.toString('latin1', offset, offset + text.length) === text;
|
|
40
|
+
const bytes = (buffer, offset, ...expected) => {
|
|
41
|
+
if (buffer.length < offset + expected.length) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
return expected.every((byte, index) => buffer[offset + index] === byte);
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* ZIP é o container de docx/xlsx/pptx: os três começam com `PK\x03\x04` e só se
|
|
48
|
+
* distinguem pelo nome das entradas. O `[Content_Types].xml` de um OOXML declara o tipo
|
|
49
|
+
* do documento, e a primeira entrada costuma ser `word/`, `xl/` ou `ppt/` — procuramos
|
|
50
|
+
* essas marcas no cabeçalho lido, sem descompactar.
|
|
51
|
+
*/
|
|
52
|
+
const sniffZipFlavor = (buffer) => {
|
|
53
|
+
const head = buffer.toString('latin1', 0, Math.min(buffer.length, exports.MIMETYPE_SNIFF_BYTES));
|
|
54
|
+
if (head.includes('word/')) {
|
|
55
|
+
return 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';
|
|
56
|
+
}
|
|
57
|
+
if (head.includes('xl/')) {
|
|
58
|
+
return 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
|
|
59
|
+
}
|
|
60
|
+
if (head.includes('ppt/')) {
|
|
61
|
+
return 'application/vnd.openxmlformats-officedocument.presentationml.presentation';
|
|
62
|
+
}
|
|
63
|
+
return 'application/zip';
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* `ftyp` na posição 4 marca a família ISO-BMFF. A marca de quatro letras que segue diz
|
|
67
|
+
* se é vídeo ou áudio; `M4A ` é o único caso de áudio que interessa aqui.
|
|
68
|
+
*/
|
|
69
|
+
const sniffIsoBmff = (buffer) => {
|
|
70
|
+
const brand = buffer.toString('latin1', 8, 12);
|
|
71
|
+
return brand.startsWith('M4A') ? 'audio/mp4' : 'video/mp4';
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* Tipo real do conteúdo, ou `null` quando a assinatura não é reconhecida.
|
|
75
|
+
*
|
|
76
|
+
* Só precisa dos primeiros bytes — passe o cabeçalho quando o arquivo for grande, e
|
|
77
|
+
* nunca o arquivo inteiro só para chamar esta função.
|
|
78
|
+
*/
|
|
79
|
+
function detectMimetypeFromBytes(buffer) {
|
|
80
|
+
if (!buffer || buffer.length < 4) {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
if (ascii(buffer, 0, '%PDF-')) {
|
|
84
|
+
return 'application/pdf';
|
|
85
|
+
}
|
|
86
|
+
if (bytes(buffer, 0, 0xff, 0xd8, 0xff)) {
|
|
87
|
+
return 'image/jpeg';
|
|
88
|
+
}
|
|
89
|
+
if (bytes(buffer, 0, 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a)) {
|
|
90
|
+
return 'image/png';
|
|
91
|
+
}
|
|
92
|
+
if (ascii(buffer, 0, 'GIF87a') || ascii(buffer, 0, 'GIF89a')) {
|
|
93
|
+
return 'image/gif';
|
|
94
|
+
}
|
|
95
|
+
// RIFF é container: os bytes 8..11 dizem o que ele carrega.
|
|
96
|
+
if (ascii(buffer, 0, 'RIFF')) {
|
|
97
|
+
if (ascii(buffer, 8, 'WEBP')) {
|
|
98
|
+
return 'image/webp';
|
|
99
|
+
}
|
|
100
|
+
if (ascii(buffer, 8, 'WAVE')) {
|
|
101
|
+
return 'audio/wav';
|
|
102
|
+
}
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
if (ascii(buffer, 0, 'fLaC')) {
|
|
106
|
+
return 'audio/flac';
|
|
107
|
+
}
|
|
108
|
+
if (ascii(buffer, 0, 'OggS')) {
|
|
109
|
+
return 'audio/ogg';
|
|
110
|
+
}
|
|
111
|
+
// ID3 é a tag de metadados que antecede o quadro MPEG; 0xFF 0xFB/0xF3/0xF2 é o quadro
|
|
112
|
+
// cru, sem tag. `audio/mp3` e `audio/mpeg` são o mesmo formato com dois nomes, e a
|
|
113
|
+
// allowlist aceita os dois — devolvemos o nome canônico e o cotejo trata o sinônimo.
|
|
114
|
+
if (ascii(buffer, 0, 'ID3') || bytes(buffer, 0, 0xff, 0xfb) || bytes(buffer, 0, 0xff, 0xf3) || bytes(buffer, 0, 0xff, 0xf2)) {
|
|
115
|
+
return 'audio/mpeg';
|
|
116
|
+
}
|
|
117
|
+
if (ascii(buffer, 4, 'ftyp')) {
|
|
118
|
+
return sniffIsoBmff(buffer);
|
|
119
|
+
}
|
|
120
|
+
// `PK\x03\x04` é o arquivo; `PK\x05\x06` e `PK\x07\x08` são ZIP vazio e spanned.
|
|
121
|
+
if (bytes(buffer, 0, 0x50, 0x4b, 0x03, 0x04) || bytes(buffer, 0, 0x50, 0x4b, 0x05, 0x06) || bytes(buffer, 0, 0x50, 0x4b, 0x07, 0x08)) {
|
|
122
|
+
return sniffZipFlavor(buffer);
|
|
123
|
+
}
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Sinônimos que nomeiam o mesmo formato. Recusar um upload porque o cliente escreveu
|
|
128
|
+
* `audio/mp3` onde os bytes dizem `audio/mpeg` seria falso positivo puro.
|
|
129
|
+
*/
|
|
130
|
+
const EQUIVALENT_MIMETYPES = [
|
|
131
|
+
['audio/mp3', 'audio/mpeg'],
|
|
132
|
+
['audio/wav', 'audio/x-wav', 'audio/wave'],
|
|
133
|
+
['image/jpeg', 'image/jpg'],
|
|
134
|
+
['video/mp4', 'audio/mp4'],
|
|
135
|
+
];
|
|
136
|
+
const isEquivalent = (a, b) => EQUIVALENT_MIMETYPES.some((group) => group.includes(a) && group.includes(b));
|
|
137
|
+
const ZIP_FAMILY = [
|
|
138
|
+
'application/zip',
|
|
139
|
+
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
|
140
|
+
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
|
141
|
+
'application/vnd.openxmlformats-officedocument.presentationml.presentation',
|
|
142
|
+
];
|
|
143
|
+
/**
|
|
144
|
+
* Tipos que esta função sabe confirmar positivamente.
|
|
145
|
+
*
|
|
146
|
+
* Declarar um deles é assumir um formato com assinatura conhecida, então o conteúdo tem
|
|
147
|
+
* de exibi-la. Fora desta lista (CSV, OFX, texto solto) não há o que conferir, e a
|
|
148
|
+
* ausência de assinatura não é indício de nada.
|
|
149
|
+
*/
|
|
150
|
+
const VERIFIABLE_MIMETYPES = new Set([
|
|
151
|
+
'application/pdf',
|
|
152
|
+
'image/jpeg',
|
|
153
|
+
'image/jpg',
|
|
154
|
+
'image/png',
|
|
155
|
+
'image/gif',
|
|
156
|
+
'image/webp',
|
|
157
|
+
'audio/mp3',
|
|
158
|
+
'audio/mpeg',
|
|
159
|
+
'audio/wav',
|
|
160
|
+
'audio/x-wav',
|
|
161
|
+
'audio/wave',
|
|
162
|
+
'audio/flac',
|
|
163
|
+
'audio/ogg',
|
|
164
|
+
'audio/mp4',
|
|
165
|
+
'video/mp4',
|
|
166
|
+
...ZIP_FAMILY,
|
|
167
|
+
]);
|
|
168
|
+
/**
|
|
169
|
+
* Formatos que nunca estão na allowlist e que caracterizam conteúdo executável.
|
|
170
|
+
*
|
|
171
|
+
* Não são detectados para serem aceitos — são detectados para que a recusa diga o que o
|
|
172
|
+
* arquivo realmente é, em vez de um genérico "não confere".
|
|
173
|
+
*/
|
|
174
|
+
const EXECUTABLE_SIGNATURES = [
|
|
175
|
+
{ test: (b) => ascii(b, 0, 'MZ'), label: 'a Windows executable' },
|
|
176
|
+
{ test: (b) => bytes(b, 0, 0x7f, 0x45, 0x4c, 0x46), label: 'an ELF executable' },
|
|
177
|
+
{ test: (b) => bytes(b, 0, 0xcf, 0xfa, 0xed, 0xfe), label: 'a Mach-O executable' },
|
|
178
|
+
{ test: (b) => bytes(b, 0, 0xca, 0xfe, 0xba, 0xbe), label: 'a Java class or fat binary' },
|
|
179
|
+
{ test: (b) => ascii(b, 0, '#!'), label: 'a script with a shebang' },
|
|
180
|
+
];
|
|
181
|
+
const describeExecutable = (buffer) => { var _a, _b; return (_b = (_a = EXECUTABLE_SIGNATURES.find((entry) => entry.test(buffer))) === null || _a === void 0 ? void 0 : _a.label) !== null && _b !== void 0 ? _b : null; };
|
|
182
|
+
/**
|
|
183
|
+
* Confronta o tipo declarado com o que os bytes dizem.
|
|
184
|
+
*
|
|
185
|
+
* Devolve `null` quando não há conflito, ou uma descrição do que o conteúdo realmente é —
|
|
186
|
+
* é ela que a mensagem de erro mostra, porque "declarado X, conteúdo Y" é o que permite
|
|
187
|
+
* corrigir a chamada.
|
|
188
|
+
*
|
|
189
|
+
* A regra tem dois lados, e o segundo é o que fecha o buraco:
|
|
190
|
+
*
|
|
191
|
+
* 1. assinatura reconhecida que contradiz o declarado → conflito;
|
|
192
|
+
* 2. assinatura NÃO reconhecida, mas o tipo declarado é um dos verificáveis → também
|
|
193
|
+
* conflito. Sem isso, bastaria declarar `application/pdf` num executável para
|
|
194
|
+
* passar: ele não tem assinatura de PDF, mas também não tem nenhuma das que o
|
|
195
|
+
* sniffer conhece, e "desconhecido" seria lido como "sem objeção".
|
|
196
|
+
*
|
|
197
|
+
* Conteúdo sem assinatura declarado como `text/csv` continua passando, que é o caso do
|
|
198
|
+
* `finance.statements.import`.
|
|
199
|
+
*
|
|
200
|
+
* ZIP merece nota: um `.docx` declarado como `application/zip` não é conflito, já que ele
|
|
201
|
+
* é literalmente um zip. O contrário também não, pelo mesmo motivo.
|
|
202
|
+
*/
|
|
203
|
+
function findMimetypeConflict(declared, buffer) {
|
|
204
|
+
if (!declared) {
|
|
205
|
+
return null;
|
|
206
|
+
}
|
|
207
|
+
const detected = detectMimetypeFromBytes(buffer);
|
|
208
|
+
if (detected) {
|
|
209
|
+
if (detected === declared || isEquivalent(detected, declared)) {
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
212
|
+
if (ZIP_FAMILY.includes(detected) && ZIP_FAMILY.includes(declared)) {
|
|
213
|
+
return null;
|
|
214
|
+
}
|
|
215
|
+
return detected;
|
|
216
|
+
}
|
|
217
|
+
const executable = describeExecutable(buffer);
|
|
218
|
+
if (executable) {
|
|
219
|
+
return executable;
|
|
220
|
+
}
|
|
221
|
+
if (VERIFIABLE_MIMETYPES.has(declared)) {
|
|
222
|
+
return `not recognizable as ${declared}`;
|
|
223
|
+
}
|
|
224
|
+
return null;
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=mimetype-sniff.util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mimetype-sniff.util.js","sourceRoot":"","sources":["../../src/file/mimetype-sniff.util.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Motivo da recusa, ou `null` quando o endereço é público.
|
|
3
|
+
*
|
|
4
|
+
* IPv6 mapeado (`::ffff:169.254.169.254`) é desempacotado antes do cotejo: sem isso, o
|
|
5
|
+
* endpoint de metadados volta a ser alcançável pela notação de seis grupos.
|
|
6
|
+
*/
|
|
7
|
+
export declare function describeBlockedAddress(address: string): string | null;
|
|
8
|
+
export interface RemoteFetchOptions {
|
|
9
|
+
/** Teto de bytes; o download aborta assim que o passa, sem bufferizar o resto. */
|
|
10
|
+
maxBytes: number;
|
|
11
|
+
/** Hosts liberados. Vazio (o default) = qualquer host público. */
|
|
12
|
+
allowedHosts?: string[];
|
|
13
|
+
timeoutMs?: number;
|
|
14
|
+
maxRedirects?: number;
|
|
15
|
+
}
|
|
16
|
+
export interface RemoteFetchResult {
|
|
17
|
+
buffer: Buffer;
|
|
18
|
+
/** `Content-Type` da resposta, sem parâmetros. Informativo: quem manda é o conteúdo. */
|
|
19
|
+
contentType: string | null;
|
|
20
|
+
/** Host de onde o conteúdo veio de fato, depois de seguidos os redirects. */
|
|
21
|
+
finalHost: string;
|
|
22
|
+
finalUrl: string;
|
|
23
|
+
}
|
|
24
|
+
/** Valida esquema, credenciais e allowlist. Separada para poder ser testada sozinha. */
|
|
25
|
+
export declare function assertFetchableUrl(raw: string, allowedHosts?: string[]): URL;
|
|
26
|
+
/**
|
|
27
|
+
* Baixa a URL para memória, recusando destino privado e conteúdo acima do teto.
|
|
28
|
+
*
|
|
29
|
+
* Os redirects são seguidos à mão (`maxRedirects: 0` no axios) porque cada salto é um
|
|
30
|
+
* destino novo que precisa passar pela mesma validação — deixar o axios seguir sozinho
|
|
31
|
+
* entregaria o segundo salto sem conferência, que é justamente como se contorna uma
|
|
32
|
+
* allowlist que só olha a URL inicial.
|
|
33
|
+
*/
|
|
34
|
+
export declare function fetchRemoteFile(rawUrl: string, options: RemoteFetchOptions): Promise<RemoteFetchResult>;
|
|
35
|
+
//# sourceMappingURL=remote-fetch.util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-fetch.util.d.ts","sourceRoot":"","sources":["../../src/file/remote-fetch.util.ts"],"names":[],"mappings":"AAmDA;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAsCrE;AAsDD,MAAM,WAAW,kBAAkB;IACjC,kFAAkF;IAClF,QAAQ,EAAE,MAAM,CAAC;IACjB,kEAAkE;IAClE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,wFAAwF;IACxF,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,6EAA6E;IAC7E,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAKD,wFAAwF;AACxF,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,GAAG,CAqC5E;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,iBAAiB,CAAC,CA0E5B"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.describeBlockedAddress = describeBlockedAddress;
|
|
7
|
+
exports.assertFetchableUrl = assertFetchableUrl;
|
|
8
|
+
exports.fetchRemoteFile = fetchRemoteFile;
|
|
9
|
+
const common_1 = require("@nestjs/common");
|
|
10
|
+
const http_1 = require("http");
|
|
11
|
+
const https_1 = require("https");
|
|
12
|
+
const net_1 = require("net");
|
|
13
|
+
const dns_1 = require("dns");
|
|
14
|
+
const axios_1 = __importDefault(require("axios"));
|
|
15
|
+
/**
|
|
16
|
+
* Download de URL informada por quem chama a tool (`fileUrl`).
|
|
17
|
+
*
|
|
18
|
+
* É a única superfície do sistema em que um endereço escolhido pelo usuário vira uma
|
|
19
|
+
* requisição saindo de dentro do cluster, então a guarda de SSRF mora aqui. O repositório
|
|
20
|
+
* não tinha nada equivalente: a única util de URL existente (`assertHttpUrl`, em
|
|
21
|
+
* `integration-profile/testers/http-probe.ts`) **libera faixas privadas de propósito**,
|
|
22
|
+
* porque serve para Evolution e k8s auto-hospedados — usá-la aqui seria o oposto do que
|
|
23
|
+
* se precisa.
|
|
24
|
+
*
|
|
25
|
+
* O ponto não óbvio é *quando* validar o IP. Resolver o nome, aprovar e só então deixar o
|
|
26
|
+
* axios conectar abre uma janela: entre a checagem e a conexão o DNS pode responder outra
|
|
27
|
+
* coisa (rebinding), e quem conecta é o agente, não nós. Por isso a validação é instalada
|
|
28
|
+
* como o `lookup` do agente — ela roda no momento em que o socket é aberto, sobre o mesmo
|
|
29
|
+
* endereço que será usado. Cada redirect repete tudo, porque o destino muda.
|
|
30
|
+
*/
|
|
31
|
+
const PRIVATE_IPV4_RULES = [
|
|
32
|
+
{ cidr: '0.0.0.0/8', reason: 'this-network' },
|
|
33
|
+
{ cidr: '10.0.0.0/8', reason: 'private' },
|
|
34
|
+
{ cidr: '100.64.0.0/10', reason: 'carrier-grade NAT' },
|
|
35
|
+
{ cidr: '127.0.0.0/8', reason: 'loopback' },
|
|
36
|
+
{ cidr: '169.254.0.0/16', reason: 'link-local / cloud metadata' },
|
|
37
|
+
{ cidr: '172.16.0.0/12', reason: 'private' },
|
|
38
|
+
{ cidr: '192.0.0.0/24', reason: 'IETF protocol assignments' },
|
|
39
|
+
{ cidr: '192.0.2.0/24', reason: 'documentation' },
|
|
40
|
+
{ cidr: '192.168.0.0/16', reason: 'private' },
|
|
41
|
+
{ cidr: '198.18.0.0/15', reason: 'benchmarking' },
|
|
42
|
+
{ cidr: '198.51.100.0/24', reason: 'documentation' },
|
|
43
|
+
{ cidr: '203.0.113.0/24', reason: 'documentation' },
|
|
44
|
+
{ cidr: '224.0.0.0/4', reason: 'multicast' },
|
|
45
|
+
{ cidr: '240.0.0.0/4', reason: 'reserved' },
|
|
46
|
+
];
|
|
47
|
+
const ipv4ToInt = (ip) => ip.split('.').reduce((acc, part) => (acc << 8) + Number(part), 0) >>> 0;
|
|
48
|
+
const matchesCidr = (ip, cidr) => {
|
|
49
|
+
const [range, bitsRaw] = cidr.split('/');
|
|
50
|
+
const bits = Number(bitsRaw);
|
|
51
|
+
const mask = bits === 0 ? 0 : (0xffffffff << (32 - bits)) >>> 0;
|
|
52
|
+
return (ipv4ToInt(ip) & mask) === (ipv4ToInt(range) & mask);
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Motivo da recusa, ou `null` quando o endereço é público.
|
|
56
|
+
*
|
|
57
|
+
* IPv6 mapeado (`::ffff:169.254.169.254`) é desempacotado antes do cotejo: sem isso, o
|
|
58
|
+
* endpoint de metadados volta a ser alcançável pela notação de seis grupos.
|
|
59
|
+
*/
|
|
60
|
+
function describeBlockedAddress(address) {
|
|
61
|
+
const value = String(address || '').trim().toLowerCase();
|
|
62
|
+
if (!value) {
|
|
63
|
+
return 'empty address';
|
|
64
|
+
}
|
|
65
|
+
const mapped = value.match(/^::ffff:(\d+\.\d+\.\d+\.\d+)$/);
|
|
66
|
+
const candidate = mapped ? mapped[1] : value;
|
|
67
|
+
const version = (0, net_1.isIP)(candidate);
|
|
68
|
+
if (version === 4) {
|
|
69
|
+
const rule = PRIVATE_IPV4_RULES.find((entry) => matchesCidr(candidate, entry.cidr));
|
|
70
|
+
return rule ? `${rule.reason} address (${candidate})` : null;
|
|
71
|
+
}
|
|
72
|
+
if (version === 6) {
|
|
73
|
+
if (candidate === '::' || candidate === '::1') {
|
|
74
|
+
return `loopback address (${candidate})`;
|
|
75
|
+
}
|
|
76
|
+
// fc00::/7 (unique local) e fe80::/10 (link-local, onde vive fe80::a9fe:a9fe).
|
|
77
|
+
if (/^f[cd]/.test(candidate)) {
|
|
78
|
+
return `unique local address (${candidate})`;
|
|
79
|
+
}
|
|
80
|
+
if (/^fe[89ab]/.test(candidate)) {
|
|
81
|
+
return `link-local address (${candidate})`;
|
|
82
|
+
}
|
|
83
|
+
if (/^ff/.test(candidate)) {
|
|
84
|
+
return `multicast address (${candidate})`;
|
|
85
|
+
}
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
return `unresolvable address (${address})`;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* `lookup` compatível com o do Node que recusa antes de devolver o endereço ao agente.
|
|
92
|
+
*
|
|
93
|
+
* O agente chama isto para cada conexão, então é aqui que a decisão vale — e não numa
|
|
94
|
+
* checagem prévia que o DNS poderia contradizer depois.
|
|
95
|
+
*/
|
|
96
|
+
const guardedLookup = (hostname, options, callback) => {
|
|
97
|
+
const done = typeof options === 'function' ? options : callback;
|
|
98
|
+
const opts = typeof options === 'function' ? {} : options;
|
|
99
|
+
(0, dns_1.lookup)(hostname, Object.assign(Object.assign({}, opts), { all: true }), (err, addresses) => {
|
|
100
|
+
if (err) {
|
|
101
|
+
done(err);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
const list = Array.isArray(addresses) ? addresses : [addresses];
|
|
105
|
+
if (list.length === 0) {
|
|
106
|
+
done(Object.assign(new Error(`Host did not resolve: ${hostname}`), { code: 'ENOTFOUND' }));
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
// Basta um endereço proibido para recusar o host inteiro: aceitar os "bons" deixaria
|
|
110
|
+
// o resultado na mão de qual entrada o resolvedor devolve primeiro.
|
|
111
|
+
for (const entry of list) {
|
|
112
|
+
const blocked = describeBlockedAddress(entry.address);
|
|
113
|
+
if (blocked) {
|
|
114
|
+
done(Object.assign(new Error(`Blocked ${blocked} for host ${hostname}`), {
|
|
115
|
+
code: 'EBLOCKED',
|
|
116
|
+
}));
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
const first = list[0];
|
|
121
|
+
if (opts === null || opts === void 0 ? void 0 : opts.all) {
|
|
122
|
+
done(null, list);
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
done(null, first.address, first.family);
|
|
126
|
+
});
|
|
127
|
+
};
|
|
128
|
+
const DEFAULT_TIMEOUT_MS = 15000;
|
|
129
|
+
const DEFAULT_MAX_REDIRECTS = 3;
|
|
130
|
+
/** Valida esquema, credenciais e allowlist. Separada para poder ser testada sozinha. */
|
|
131
|
+
function assertFetchableUrl(raw, allowedHosts) {
|
|
132
|
+
let url;
|
|
133
|
+
try {
|
|
134
|
+
url = new URL(String(raw || '').trim());
|
|
135
|
+
}
|
|
136
|
+
catch (_a) {
|
|
137
|
+
throw new common_1.BadRequestException(`fileUrl is not a valid URL`);
|
|
138
|
+
}
|
|
139
|
+
if (url.protocol !== 'http:' && url.protocol !== 'https:') {
|
|
140
|
+
throw new common_1.BadRequestException(`fileUrl must use http or https, got ${url.protocol.replace(':', '') || 'none'}`);
|
|
141
|
+
}
|
|
142
|
+
// Credencial na URL viraria header de autenticação para um destino escolhido por quem
|
|
143
|
+
// chama — e apareceria no log de auditoria junto com o resto da entrada.
|
|
144
|
+
if (url.username || url.password) {
|
|
145
|
+
throw new common_1.BadRequestException(`fileUrl must not carry credentials`);
|
|
146
|
+
}
|
|
147
|
+
const allow = (allowedHosts || []).map((h) => h.trim().toLowerCase()).filter(Boolean);
|
|
148
|
+
if (allow.length > 0) {
|
|
149
|
+
const host = url.hostname.toLowerCase();
|
|
150
|
+
const permitted = allow.some((entry) => host === entry || host.endsWith(`.${entry}`));
|
|
151
|
+
if (!permitted) {
|
|
152
|
+
throw new common_1.BadRequestException(`fileUrl host is not allowed: ${host}. Allowed hosts come from the mcp-file-url-allowed-hosts setting.`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return url;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Baixa a URL para memória, recusando destino privado e conteúdo acima do teto.
|
|
159
|
+
*
|
|
160
|
+
* Os redirects são seguidos à mão (`maxRedirects: 0` no axios) porque cada salto é um
|
|
161
|
+
* destino novo que precisa passar pela mesma validação — deixar o axios seguir sozinho
|
|
162
|
+
* entregaria o segundo salto sem conferência, que é justamente como se contorna uma
|
|
163
|
+
* allowlist que só olha a URL inicial.
|
|
164
|
+
*/
|
|
165
|
+
async function fetchRemoteFile(rawUrl, options) {
|
|
166
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
167
|
+
const maxRedirects = (_a = options.maxRedirects) !== null && _a !== void 0 ? _a : DEFAULT_MAX_REDIRECTS;
|
|
168
|
+
const timeout = (_b = options.timeoutMs) !== null && _b !== void 0 ? _b : DEFAULT_TIMEOUT_MS;
|
|
169
|
+
let current = assertFetchableUrl(rawUrl, options.allowedHosts);
|
|
170
|
+
for (let hop = 0; hop <= maxRedirects; hop += 1) {
|
|
171
|
+
const isHttps = current.protocol === 'https:';
|
|
172
|
+
const AgentCtor = isHttps ? https_1.Agent : http_1.Agent;
|
|
173
|
+
const agent = new AgentCtor({ lookup: guardedLookup });
|
|
174
|
+
let response;
|
|
175
|
+
try {
|
|
176
|
+
response = await axios_1.default.get(current.toString(), Object.assign({ responseType: 'stream', timeout, maxRedirects: 0,
|
|
177
|
+
// Teto redundante com o contador abaixo, mas ele corta antes de o axios montar
|
|
178
|
+
// qualquer buffer quando o servidor declara o tamanho.
|
|
179
|
+
maxContentLength: options.maxBytes, maxBodyLength: options.maxBytes, decompress: true, validateStatus: (status) => status < 400 }, (isHttps ? { httpsAgent: agent } : { httpAgent: agent })));
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
if ((error === null || error === void 0 ? void 0 : error.code) === 'EBLOCKED') {
|
|
183
|
+
throw new common_1.BadRequestException(`fileUrl rejected: ${error.message}`);
|
|
184
|
+
}
|
|
185
|
+
if ((_c = error === null || error === void 0 ? void 0 : error.response) === null || _c === void 0 ? void 0 : _c.status) {
|
|
186
|
+
throw new common_1.BadRequestException(`fileUrl responded with HTTP ${error.response.status}`);
|
|
187
|
+
}
|
|
188
|
+
throw new common_1.BadRequestException(`fileUrl download failed: ${(error === null || error === void 0 ? void 0 : error.message) || error}`);
|
|
189
|
+
}
|
|
190
|
+
const status = Number(response.status);
|
|
191
|
+
if (status >= 300 && status < 400) {
|
|
192
|
+
const location = (_d = response.headers) === null || _d === void 0 ? void 0 : _d.location;
|
|
193
|
+
(_f = (_e = response.data) === null || _e === void 0 ? void 0 : _e.destroy) === null || _f === void 0 ? void 0 : _f.call(_e);
|
|
194
|
+
if (!location) {
|
|
195
|
+
throw new common_1.BadRequestException(`fileUrl redirected without a location header`);
|
|
196
|
+
}
|
|
197
|
+
if (hop === maxRedirects) {
|
|
198
|
+
throw new common_1.BadRequestException(`fileUrl exceeded the redirect limit of ${maxRedirects}`);
|
|
199
|
+
}
|
|
200
|
+
current = assertFetchableUrl(new URL(location, current).toString(), options.allowedHosts);
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
const buffer = await readStreamWithLimit(response.data, options.maxBytes);
|
|
204
|
+
return {
|
|
205
|
+
buffer,
|
|
206
|
+
contentType: String(((_g = response.headers) === null || _g === void 0 ? void 0 : _g['content-type']) || '').split(';')[0] || null,
|
|
207
|
+
finalHost: current.hostname,
|
|
208
|
+
finalUrl: current.toString(),
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
throw new common_1.BadRequestException(`fileUrl exceeded the redirect limit of ${maxRedirects}`);
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Acumula o stream até o teto e aborta na primeira parte que o ultrapassa.
|
|
215
|
+
*
|
|
216
|
+
* `maxContentLength` do axios só vale quando o servidor declara `Content-Length`; sem o
|
|
217
|
+
* contador, uma resposta sem tamanho declarado encheria a memória do pod.
|
|
218
|
+
*/
|
|
219
|
+
function readStreamWithLimit(stream, maxBytes) {
|
|
220
|
+
return new Promise((resolve, reject) => {
|
|
221
|
+
const chunks = [];
|
|
222
|
+
let total = 0;
|
|
223
|
+
stream.on('data', (chunk) => {
|
|
224
|
+
total += chunk.length;
|
|
225
|
+
if (total > maxBytes) {
|
|
226
|
+
stream.destroy();
|
|
227
|
+
reject(new common_1.BadRequestException(`fileUrl content exceeds the maximum of ${maxBytes} bytes`));
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
chunks.push(Buffer.from(chunk));
|
|
231
|
+
});
|
|
232
|
+
stream.on('end', () => resolve(Buffer.concat(chunks)));
|
|
233
|
+
stream.on('error', (error) => reject(new common_1.BadRequestException(`fileUrl download failed: ${(error === null || error === void 0 ? void 0 : error.message) || error}`)));
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=remote-fetch.util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-fetch.util.js","sourceRoot":"","sources":["../../src/file/remote-fetch.util.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
export declare class StartImpersonationDTO {
|
|
2
|
-
/**
|
|
2
|
+
/**
|
|
3
|
+
* Chave do app de destino em `app-urls`. Espelha
|
|
4
|
+
* `ImpersonationService.REDEEMABLE_APPS`: app novo entra nos dois lugares.
|
|
5
|
+
*/
|
|
3
6
|
app: string;
|
|
4
7
|
/** Justificativa livre do operador; vai para a trilha de auditoria. */
|
|
5
8
|
reason?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start-impersonation.dto.d.ts","sourceRoot":"","sources":["../../../src/impersonation/dto/start-impersonation.dto.ts"],"names":[],"mappings":"AAEA,qBAAa,qBAAqB;IAChC
|
|
1
|
+
{"version":3,"file":"start-impersonation.dto.d.ts","sourceRoot":"","sources":["../../../src/impersonation/dto/start-impersonation.dto.ts"],"names":[],"mappings":"AAEA,qBAAa,qBAAqB;IAChC;;;OAGG;IAEH,GAAG,EAAE,MAAM,CAAC;IAEZ,uEAAuE;IAIvE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
|
|
@@ -15,7 +15,7 @@ class StartImpersonationDTO {
|
|
|
15
15
|
}
|
|
16
16
|
exports.StartImpersonationDTO = StartImpersonationDTO;
|
|
17
17
|
__decorate([
|
|
18
|
-
(0, class_validator_1.IsIn)(['admin', 'class', 'partners']),
|
|
18
|
+
(0, class_validator_1.IsIn)(['admin', 'class', 'partners', 'training']),
|
|
19
19
|
__metadata("design:type", String)
|
|
20
20
|
], StartImpersonationDTO.prototype, "app", void 0);
|
|
21
21
|
__decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start-impersonation.dto.js","sourceRoot":"","sources":["../../../src/impersonation/dto/start-impersonation.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDAAwE;AAExE,MAAa,qBAAqB;
|
|
1
|
+
{"version":3,"file":"start-impersonation.dto.js","sourceRoot":"","sources":["../../../src/impersonation/dto/start-impersonation.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDAAwE;AAExE,MAAa,qBAAqB;CAajC;AAbD,sDAaC;AAPC;IADC,IAAA,sBAAI,EAAC,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;;kDACrC;AAMZ;IAHC,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;IACV,IAAA,2BAAS,EAAC,GAAG,CAAC;;qDACC"}
|
|
@@ -47,7 +47,7 @@ export declare class ImpersonationService {
|
|
|
47
47
|
private readonly logger;
|
|
48
48
|
/** Curto: o codigo so precisa sobreviver ao carregamento da aba nova. */
|
|
49
49
|
private readonly codeTtlMs;
|
|
50
|
-
/** Caminho da tela de resgate, igual
|
|
50
|
+
/** Caminho da tela de resgate, igual em todos os apps. */
|
|
51
51
|
static readonly REDEEM_PATH = "/simulacao";
|
|
52
52
|
/**
|
|
53
53
|
* Simular quem ja e administrador nao ajuda em nada no suporte e transformaria
|
|
@@ -55,8 +55,13 @@ export declare class ImpersonationService {
|
|
|
55
55
|
*/
|
|
56
56
|
private static readonly BLOCKED_TARGET_ROLES;
|
|
57
57
|
/**
|
|
58
|
-
* Apps com tela de resgate
|
|
59
|
-
* @hed-hog/next-app-provider
|
|
58
|
+
* Apps com tela de resgate em `/simulacao`. `training` nao usa o
|
|
59
|
+
* @hed-hog/next-app-provider — tem AuthProvider proprio —, entao a tela de
|
|
60
|
+
* resgate, a faixa e a trava de refresh dele sao codigo do proprio app.
|
|
61
|
+
*
|
|
62
|
+
* Esta lista e a que alimenta o select do operador; quem valida a entrada do
|
|
63
|
+
* `start` e o `@IsIn` do StartImpersonationDTO. As duas precisam andar juntas:
|
|
64
|
+
* so aqui, o app aparece no select e o `start` responde 400.
|
|
60
65
|
*/
|
|
61
66
|
private static readonly REDEEMABLE_APPS;
|
|
62
67
|
constructor(prisma: PrismaService, security: SecurityService, setting: SettingService, token: TokenService, session: SessionService, user: UserService, pagination: PaginationService);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"impersonation.service.d.ts","sourceRoot":"","sources":["../../src/impersonation/impersonation.service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAU,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAE5D,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAW3E,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,eAAe,EAAE,OAAO,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,KAAK,YAAY,GAAG;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAUF;;;;;;;;;;;;;;GAcG;AACH,qBACa,oBAAoB;
|
|
1
|
+
{"version":3,"file":"impersonation.service.d.ts","sourceRoot":"","sources":["../../src/impersonation/impersonation.service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAU,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAE5D,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAW3E,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,eAAe,EAAE,OAAO,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,KAAK,YAAY,GAAG;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAUF;;;;;;;;;;;;;;GAcG;AACH,qBACa,oBAAoB;IAiC7B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAEvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAEzB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAExB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAEtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAExB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAErB,OAAO,CAAC,QAAQ,CAAC,UAAU;IA5C7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyC;IAEhE,yEAAyE;IACzE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAU;IAEpC,0DAA0D;IAC1D,MAAM,CAAC,QAAQ,CAAC,WAAW,gBAAgB;IAE3C;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAoC;IAEhF;;;;;;;;OAQG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAKrC;gBAIiB,MAAM,EAAE,aAAa,EAErB,QAAQ,EAAE,eAAe,EAEzB,OAAO,EAAE,cAAc,EAEvB,KAAK,EAAE,YAAY,EAEnB,OAAO,EAAE,cAAc,EAEvB,IAAI,EAAE,WAAW,EAEjB,UAAU,EAAE,iBAAiB;IAO1C,KAAK,CAAC,MAAM,EAAE,WAAW;;;;IAyEzB,MAAM,CAAC,MAAM,EAAE,YAAY;;;;;;;;;;;;;;IA4GjC;;;OAGG;IACG,IAAI,CAAC,MAAM,EAAE;QACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,YAAY,EAAE,MAAM,CAAC;QACrB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB;;;IAoDD;;;OAGG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;;;;;;;;;;;;;;;;;;;IAkC7C,sDAAsD;IAChD,kBAAkB;;;;IASlB,OAAO,CAAC,gBAAgB,EAAE,aAAa,EAAE,OAAO,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE;;;;;;;;;;;;;;;;;;;;;;;;;;IAwDjF;;;OAGG;IAEG,YAAY;YAiBJ,sBAAsB;YA2CtB,gBAAgB;IA2B9B;;;OAGG;IACH,OAAO,CAAC,YAAY;YAgBN,WAAW;CAY1B"}
|
|
@@ -370,7 +370,7 @@ let ImpersonationService = ImpersonationService_1 = class ImpersonationService {
|
|
|
370
370
|
}
|
|
371
371
|
};
|
|
372
372
|
exports.ImpersonationService = ImpersonationService;
|
|
373
|
-
/** Caminho da tela de resgate, igual
|
|
373
|
+
/** Caminho da tela de resgate, igual em todos os apps. */
|
|
374
374
|
ImpersonationService.REDEEM_PATH = '/simulacao';
|
|
375
375
|
/**
|
|
376
376
|
* Simular quem ja e administrador nao ajuda em nada no suporte e transformaria
|
|
@@ -378,10 +378,20 @@ ImpersonationService.REDEEM_PATH = '/simulacao';
|
|
|
378
378
|
*/
|
|
379
379
|
ImpersonationService.BLOCKED_TARGET_ROLES = ['admin', 'admin-impersonation'];
|
|
380
380
|
/**
|
|
381
|
-
* Apps com tela de resgate
|
|
382
|
-
* @hed-hog/next-app-provider
|
|
381
|
+
* Apps com tela de resgate em `/simulacao`. `training` nao usa o
|
|
382
|
+
* @hed-hog/next-app-provider — tem AuthProvider proprio —, entao a tela de
|
|
383
|
+
* resgate, a faixa e a trava de refresh dele sao codigo do proprio app.
|
|
384
|
+
*
|
|
385
|
+
* Esta lista e a que alimenta o select do operador; quem valida a entrada do
|
|
386
|
+
* `start` e o `@IsIn` do StartImpersonationDTO. As duas precisam andar juntas:
|
|
387
|
+
* so aqui, o app aparece no select e o `start` responde 400.
|
|
383
388
|
*/
|
|
384
|
-
ImpersonationService.REDEEMABLE_APPS = [
|
|
389
|
+
ImpersonationService.REDEEMABLE_APPS = [
|
|
390
|
+
'admin',
|
|
391
|
+
'class',
|
|
392
|
+
'partners',
|
|
393
|
+
'training',
|
|
394
|
+
];
|
|
385
395
|
__decorate([
|
|
386
396
|
(0, schedule_1.Cron)(schedule_1.CronExpression.EVERY_DAY_AT_4AM),
|
|
387
397
|
__metadata("design:type", Function),
|