@hed-hog/core 0.0.399 → 0.0.400
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 +4 -4
- package/dist/ai/ai.service.d.ts +35 -4
- package/dist/ai/ai.service.d.ts.map +1 -1
- package/dist/ai/ai.service.js +51 -137
- 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/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 +6 -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/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 +182 -6
- package/dist/file/file.service.d.ts.map +1 -1
- package/dist/file/file.service.js +386 -54
- 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 +75 -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 +17 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -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 +7 -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/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 +5 -1
- package/dist/mcp/mcp.module.js.map +1 -1
- 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 +115 -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.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.map +1 -1
- package/dist/oauth/providers/microsoft-entra-id.provider.js +6 -0
- 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/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/setting.controller.d.ts +5 -0
- package/dist/setting/setting.controller.d.ts.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 +46 -5
- 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 +6 -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 +140 -0
- package/hedhog/data/setting_group.yaml +137 -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 +183 -36
- package/hedhog/frontend/messages/pt.json +183 -36
- 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 +7 -5
- package/src/ai/ai-agent.sort.ts +21 -0
- package/src/ai/ai.service.spec.ts +173 -1
- package/src/ai/ai.service.ts +64 -193
- package/src/ai-instruction/ai-instruction.service.ts +32 -28
- package/src/ai-instruction/ai-instruction.sort.ts +32 -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 +6 -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/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 +94 -0
- package/src/file/file.service.ts +433 -53
- 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 +83 -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 +17 -0
- package/src/integration-profile/integration-profile.secrets.ts +7 -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/index.ts +2 -0
- package/src/integration-profile/testers/remaining.testers.spec.ts +79 -0
- package/src/integration-profile/testers/shipping.testers.ts +94 -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 +5 -1
- 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 +121 -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.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.ts +8 -1
- package/src/observability/monitored-cron.spec.ts +164 -31
- package/src/observability/monitored-cron.ts +154 -62
- 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/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 +112 -0
- package/src/whatsapp-sender/whatsapp-sender.service.ts +58 -5
- 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,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fragmento de schema e texto de descrição que toda tool MCP que recebe arquivo espalha
|
|
3
|
+
* no seu `inputSchema`.
|
|
4
|
+
*
|
|
5
|
+
* Fica num lugar só porque é ele que o modelo lê para decidir o caminho: se cada tool
|
|
6
|
+
* descrevesse as modalidades com palavras próprias, o agente escolheria diferente em cada
|
|
7
|
+
* uma, e a mais barata (`fileId`) perderia para a mais cara (`fileBase64`) por acidente
|
|
8
|
+
* de redação.
|
|
9
|
+
*/
|
|
10
|
+
/** As quatro origens, em ordem de preferência. */
|
|
11
|
+
export declare const FILE_SOURCE_FIELDS: readonly ["fileId", "uploadId", "fileUrl", "fileBase64"];
|
|
12
|
+
export type FileSourceModality = (typeof FILE_SOURCE_FIELDS)[number];
|
|
13
|
+
/**
|
|
14
|
+
* Propriedades para espalhar no `inputSchema` da tool.
|
|
15
|
+
*
|
|
16
|
+
* Nenhuma delas entra em `required`: a exigência é "exatamente uma", que JSON Schema
|
|
17
|
+
* expressaria com `oneOf` mas que nem todo cliente MCP avalia — a checagem de verdade
|
|
18
|
+
* está em `McpFileSourceService.detectModality`, e a descrição abaixo é o que faz o
|
|
19
|
+
* modelo acertar antes de chamar.
|
|
20
|
+
*/
|
|
21
|
+
export declare const FILE_SOURCE_SCHEMA_PROPERTIES: Record<string, any>;
|
|
22
|
+
/**
|
|
23
|
+
* Bloco anexado à descrição de cada tool.
|
|
24
|
+
*
|
|
25
|
+
* Diz o teto real — `storage-max-size`, 10 MB por padrão. A descrição antiga de
|
|
26
|
+
* `finance.titles.attachments.add` anunciava ~37 MB, número derivado do
|
|
27
|
+
* `api-body-size-limit`; ele nunca valeu, porque quem barra primeiro é o
|
|
28
|
+
* `storage-max-size`, e é ele que aparece na mensagem de erro.
|
|
29
|
+
*/
|
|
30
|
+
export declare const FILE_SOURCE_DESCRIPTION: string;
|
|
31
|
+
/** Junta a descrição própria da tool com o bloco comum. */
|
|
32
|
+
export declare const withFileSourceDescription: (description: string) => string;
|
|
33
|
+
//# sourceMappingURL=mcp-file-source.schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-file-source.schema.d.ts","sourceRoot":"","sources":["../../src/file/mcp-file-source.schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,kDAAkD;AAClD,eAAO,MAAM,kBAAkB,0DAKrB,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAErE;;;;;;;GAOG;AACH,eAAO,MAAM,6BAA6B,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAmC7D,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,QAKzB,CAAC;AAEZ,2DAA2D;AAC3D,eAAO,MAAM,yBAAyB,GAAI,aAAa,MAAM,KAAG,MACZ,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Fragmento de schema e texto de descrição que toda tool MCP que recebe arquivo espalha
|
|
4
|
+
* no seu `inputSchema`.
|
|
5
|
+
*
|
|
6
|
+
* Fica num lugar só porque é ele que o modelo lê para decidir o caminho: se cada tool
|
|
7
|
+
* descrevesse as modalidades com palavras próprias, o agente escolheria diferente em cada
|
|
8
|
+
* uma, e a mais barata (`fileId`) perderia para a mais cara (`fileBase64`) por acidente
|
|
9
|
+
* de redação.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.withFileSourceDescription = exports.FILE_SOURCE_DESCRIPTION = exports.FILE_SOURCE_SCHEMA_PROPERTIES = exports.FILE_SOURCE_FIELDS = void 0;
|
|
13
|
+
/** As quatro origens, em ordem de preferência. */
|
|
14
|
+
exports.FILE_SOURCE_FIELDS = [
|
|
15
|
+
'fileId',
|
|
16
|
+
'uploadId',
|
|
17
|
+
'fileUrl',
|
|
18
|
+
'fileBase64',
|
|
19
|
+
];
|
|
20
|
+
/**
|
|
21
|
+
* Propriedades para espalhar no `inputSchema` da tool.
|
|
22
|
+
*
|
|
23
|
+
* Nenhuma delas entra em `required`: a exigência é "exatamente uma", que JSON Schema
|
|
24
|
+
* expressaria com `oneOf` mas que nem todo cliente MCP avalia — a checagem de verdade
|
|
25
|
+
* está em `McpFileSourceService.detectModality`, e a descrição abaixo é o que faz o
|
|
26
|
+
* modelo acertar antes de chamar.
|
|
27
|
+
*/
|
|
28
|
+
exports.FILE_SOURCE_SCHEMA_PROPERTIES = {
|
|
29
|
+
fileId: {
|
|
30
|
+
type: 'number',
|
|
31
|
+
description: 'Preferred. ID of a file already in storage (from core.files.list, an attachments list, or core.files.upload.complete). Must have been uploaded by the caller, unless the caller is an administrator.',
|
|
32
|
+
},
|
|
33
|
+
uploadId: {
|
|
34
|
+
type: 'number',
|
|
35
|
+
description: 'ID returned by core.files.create-upload-url or core.files.upload.init, after the binary has been uploaded. Use this to send a file that is on disk without putting its bytes in the conversation.',
|
|
36
|
+
},
|
|
37
|
+
fileUrl: {
|
|
38
|
+
type: 'string',
|
|
39
|
+
description: 'Public http(s) URL the server downloads by itself. Private, loopback, link-local and cloud metadata addresses are rejected, redirects are limited, and the content type is checked against the actual bytes.',
|
|
40
|
+
},
|
|
41
|
+
fileBase64: {
|
|
42
|
+
type: 'string',
|
|
43
|
+
description: 'Base64-encoded content, sent inline. Only for small files (about 256kb): base64 of anything larger overflows the model output limit. Requires fileName and mimeType.',
|
|
44
|
+
},
|
|
45
|
+
fileName: {
|
|
46
|
+
type: 'string',
|
|
47
|
+
description: 'Original file name. Required with fileBase64; optional with fileUrl.',
|
|
48
|
+
},
|
|
49
|
+
mimeType: {
|
|
50
|
+
type: 'string',
|
|
51
|
+
description: 'MIME type, e.g. application/pdf. Required with fileBase64; optional with fileUrl. Must be allowed by the storage-accept-mimetype setting, and is verified against the real content.',
|
|
52
|
+
},
|
|
53
|
+
sha256: {
|
|
54
|
+
type: 'string',
|
|
55
|
+
description: 'Optional hex sha256 of the file. When present, content that does not hash to it is rejected.',
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Bloco anexado à descrição de cada tool.
|
|
60
|
+
*
|
|
61
|
+
* Diz o teto real — `storage-max-size`, 10 MB por padrão. A descrição antiga de
|
|
62
|
+
* `finance.titles.attachments.add` anunciava ~37 MB, número derivado do
|
|
63
|
+
* `api-body-size-limit`; ele nunca valeu, porque quem barra primeiro é o
|
|
64
|
+
* `storage-max-size`, e é ele que aparece na mensagem de erro.
|
|
65
|
+
*/
|
|
66
|
+
exports.FILE_SOURCE_DESCRIPTION = [
|
|
67
|
+
'Exactly one file source is required: fileId, uploadId, fileUrl or fileBase64.',
|
|
68
|
+
'Prefer fileId; use fileBase64 only for files of a few hundred kilobytes, since the encoded content has to fit in a single tool call.',
|
|
69
|
+
'To send a local file without putting it in the conversation, call core.files.create-upload-url, PUT the binary to the URL it returns, call core.files.upload.complete, and pass the resulting fileId here.',
|
|
70
|
+
'Every path enforces the storage-accept-mimetype and storage-max-size settings (10mb by default).',
|
|
71
|
+
].join(' ');
|
|
72
|
+
/** Junta a descrição própria da tool com o bloco comum. */
|
|
73
|
+
const withFileSourceDescription = (description) => `${description.trim()} ${exports.FILE_SOURCE_DESCRIPTION}`;
|
|
74
|
+
exports.withFileSourceDescription = withFileSourceDescription;
|
|
75
|
+
//# sourceMappingURL=mcp-file-source.schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-file-source.schema.js","sourceRoot":"","sources":["../../src/file/mcp-file-source.schema.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAEH,kDAAkD;AACrC,QAAA,kBAAkB,GAAG;IAChC,QAAQ;IACR,UAAU;IACV,SAAS;IACT,YAAY;CACJ,CAAC;AAIX;;;;;;;GAOG;AACU,QAAA,6BAA6B,GAAwB;IAChE,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,WAAW,EACT,sMAAsM;KACzM;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,QAAQ;QACd,WAAW,EACT,mMAAmM;KACtM;IACD,OAAO,EAAE;QACP,IAAI,EAAE,QAAQ;QACd,WAAW,EACT,8MAA8M;KACjN;IACD,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,WAAW,EACT,sKAAsK;KACzK;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,sEAAsE;KACpF;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,QAAQ;QACd,WAAW,EACT,qLAAqL;KACxL;IACD,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,WAAW,EACT,8FAA8F;KACjG;CACF,CAAC;AAEF;;;;;;;GAOG;AACU,QAAA,uBAAuB,GAAG;IACrC,+EAA+E;IAC/E,sIAAsI;IACtI,4MAA4M;IAC5M,kGAAkG;CACnG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEZ,2DAA2D;AACpD,MAAM,yBAAyB,GAAG,CAAC,WAAmB,EAAU,EAAE,CACvE,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,+BAAuB,EAAE,CAAC;AADxC,QAAA,yBAAyB,6BACe"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { PrismaService } from '@hed-hog/api-prisma';
|
|
2
|
+
import { SettingService } from '../setting/setting.service';
|
|
3
|
+
import { FileUploadTicketService } from './file-upload-ticket.service';
|
|
4
|
+
import { FileService } from './file.service';
|
|
5
|
+
import { FileSourceModality } from './mcp-file-source.schema';
|
|
6
|
+
/**
|
|
7
|
+
* Normaliza as quatro origens de arquivo que uma tool MCP pode receber.
|
|
8
|
+
*
|
|
9
|
+
* Existe para que validação, sniffing de mimetype, auditoria e idempotência morem num
|
|
10
|
+
* ponto só. A alternativa — cada tool tratando as quatro origens por conta — garantiria
|
|
11
|
+
* que mais cedo ou mais tarde um caminho novo escapasse do `storage-accept-mimetype` ou
|
|
12
|
+
* da checagem de dono, e ninguém perceberia até virar incidente.
|
|
13
|
+
*
|
|
14
|
+
* Duas portas de saída, porque as tools consomem o arquivo de formas diferentes:
|
|
15
|
+
*
|
|
16
|
+
* - `resolveFileId` para quem persiste o anexo e só precisa do id;
|
|
17
|
+
* - `resolveMulterFile` para quem quer os bytes e não guarda nada (importar extrato,
|
|
18
|
+
* extrair dados de uma nota com IA).
|
|
19
|
+
*/
|
|
20
|
+
export interface FileSourceArgs {
|
|
21
|
+
fileId?: number;
|
|
22
|
+
uploadId?: number;
|
|
23
|
+
fileUrl?: string;
|
|
24
|
+
fileBase64?: string;
|
|
25
|
+
fileName?: string;
|
|
26
|
+
mimeType?: string;
|
|
27
|
+
sha256?: string;
|
|
28
|
+
[key: string]: any;
|
|
29
|
+
}
|
|
30
|
+
export interface FileSourceContext {
|
|
31
|
+
userId: number;
|
|
32
|
+
toolName?: string;
|
|
33
|
+
}
|
|
34
|
+
export interface ResolveOptions {
|
|
35
|
+
/** Pasta no storage para as origens que ainda não têm arquivo gravado. */
|
|
36
|
+
destination: string;
|
|
37
|
+
isPrivate?: boolean;
|
|
38
|
+
/** `false` deixa a tool seguir sem arquivo (o extract-from-file aceita isso). */
|
|
39
|
+
required?: boolean;
|
|
40
|
+
}
|
|
41
|
+
export interface ResolvedFileSource {
|
|
42
|
+
fileId: number;
|
|
43
|
+
modality: FileSourceModality;
|
|
44
|
+
filename: string;
|
|
45
|
+
mimetype: string;
|
|
46
|
+
size: number;
|
|
47
|
+
}
|
|
48
|
+
export interface ResolvedFileContent {
|
|
49
|
+
file: MulterFile;
|
|
50
|
+
modality: FileSourceModality;
|
|
51
|
+
/** Preenchido quando a origem já era um arquivo armazenado. */
|
|
52
|
+
fileId?: number;
|
|
53
|
+
}
|
|
54
|
+
export declare class McpFileSourceService {
|
|
55
|
+
private readonly prismaService;
|
|
56
|
+
private readonly fileService;
|
|
57
|
+
private readonly uploadTickets;
|
|
58
|
+
private readonly settingService;
|
|
59
|
+
private readonly logger;
|
|
60
|
+
constructor(prismaService: PrismaService, fileService: FileService, uploadTickets: FileUploadTicketService, settingService: SettingService);
|
|
61
|
+
/**
|
|
62
|
+
* Qual origem veio, exigindo exatamente uma.
|
|
63
|
+
*
|
|
64
|
+
* Aceitar duas e escolher a "melhor" seria pior do que recusar: a chamada teria dois
|
|
65
|
+
* arquivos possíveis e o resultado dependeria de uma precedência que ninguém leu.
|
|
66
|
+
*/
|
|
67
|
+
detectModality(args: FileSourceArgs, required?: boolean): FileSourceModality | null;
|
|
68
|
+
private maxBytes;
|
|
69
|
+
private allowedUrlHosts;
|
|
70
|
+
/**
|
|
71
|
+
* Valida um buffer que ainda não está no storage: tamanho, tipo declarado, tipo real e
|
|
72
|
+
* sha256 quando informado.
|
|
73
|
+
*
|
|
74
|
+
* `acceptMimetypes` sozinho não basta — ele compara a string que o cliente mandou com a
|
|
75
|
+
* allowlist, então um executável declarado como `application/pdf` passaria. O sniff é o
|
|
76
|
+
* contraditório dessa declaração.
|
|
77
|
+
*/
|
|
78
|
+
private assertBufferAcceptable;
|
|
79
|
+
private toMulterFile;
|
|
80
|
+
private decodeBase64;
|
|
81
|
+
private fetchFromUrl;
|
|
82
|
+
/**
|
|
83
|
+
* Normaliza qualquer origem para um `fileId`.
|
|
84
|
+
*
|
|
85
|
+
* `fileId` e `uploadId` não regravam nada — o arquivo já está lá. `fileUrl` e
|
|
86
|
+
* `fileBase64` gravam, com o dono registrado, e é por isso que o `fileId` devolvido
|
|
87
|
+
* pode ser reaproveitado numa chamada seguinte sem novo upload.
|
|
88
|
+
*/
|
|
89
|
+
resolveFileId(args: FileSourceArgs, context: FileSourceContext, options: ResolveOptions & {
|
|
90
|
+
required?: true;
|
|
91
|
+
}): Promise<ResolvedFileSource>;
|
|
92
|
+
resolveFileId(args: FileSourceArgs, context: FileSourceContext, options: ResolveOptions & {
|
|
93
|
+
required: false;
|
|
94
|
+
}): Promise<ResolvedFileSource | null>;
|
|
95
|
+
/**
|
|
96
|
+
* Normaliza qualquer origem para os bytes, sem gravar quando não é preciso.
|
|
97
|
+
*
|
|
98
|
+
* `fileId`/`uploadId` leem do storage; `fileUrl`/`fileBase64` ficam em memória — a tool
|
|
99
|
+
* que só quer ler um extrato não deve encher o acervo de arquivos que ninguém mais vai
|
|
100
|
+
* abrir.
|
|
101
|
+
*/
|
|
102
|
+
resolveMulterFile(args: FileSourceArgs, context: FileSourceContext, options: Omit<ResolveOptions, 'destination'> & {
|
|
103
|
+
destination?: string;
|
|
104
|
+
required?: true;
|
|
105
|
+
}): Promise<ResolvedFileContent>;
|
|
106
|
+
resolveMulterFile(args: FileSourceArgs, context: FileSourceContext, options: Omit<ResolveOptions, 'destination'> & {
|
|
107
|
+
destination?: string;
|
|
108
|
+
required: false;
|
|
109
|
+
}): Promise<ResolvedFileContent | null>;
|
|
110
|
+
/**
|
|
111
|
+
* Registra a ingestão em `audit_log`, com a modalidade usada.
|
|
112
|
+
*
|
|
113
|
+
* `audit_log` é tabela global (só o finance escrevia nela até aqui, mas ela não é do
|
|
114
|
+
* finance), e `finance.audit-logs.list` já a lê sem filtrar por library — então a
|
|
115
|
+
* trilha das quatro modalidades fica visível por um caminho que já existe.
|
|
116
|
+
*
|
|
117
|
+
* Nunca derruba a operação: auditoria que falha e leva o anexo junto troca um problema
|
|
118
|
+
* de observabilidade por um de funcionamento.
|
|
119
|
+
*/
|
|
120
|
+
private recordIngest;
|
|
121
|
+
/** Quanto do arquivo basta para reconhecer o tipo — reexportado para os testes. */
|
|
122
|
+
static readonly SNIFF_BYTES = 4096;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=mcp-file-source.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-file-source.service.d.ts","sourceRoot":"","sources":["../../src/file/mcp-file-source.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
var McpFileSourceService_1;
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.McpFileSourceService = void 0;
|
|
17
|
+
const api_prisma_1 = require("@hed-hog/api-prisma");
|
|
18
|
+
const common_1 = require("@nestjs/common");
|
|
19
|
+
const crypto_1 = require("crypto");
|
|
20
|
+
const setting_service_1 = require("../setting/setting.service");
|
|
21
|
+
const file_upload_ticket_service_1 = require("./file-upload-ticket.service");
|
|
22
|
+
const file_service_1 = require("./file.service");
|
|
23
|
+
const mcp_file_source_schema_1 = require("./mcp-file-source.schema");
|
|
24
|
+
const mimetype_sniff_util_1 = require("./mimetype-sniff.util");
|
|
25
|
+
const remote_fetch_util_1 = require("./remote-fetch.util");
|
|
26
|
+
let McpFileSourceService = McpFileSourceService_1 = class McpFileSourceService {
|
|
27
|
+
constructor(prismaService, fileService, uploadTickets, settingService) {
|
|
28
|
+
this.prismaService = prismaService;
|
|
29
|
+
this.fileService = fileService;
|
|
30
|
+
this.uploadTickets = uploadTickets;
|
|
31
|
+
this.settingService = settingService;
|
|
32
|
+
this.logger = new common_1.Logger(McpFileSourceService_1.name);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Qual origem veio, exigindo exatamente uma.
|
|
36
|
+
*
|
|
37
|
+
* Aceitar duas e escolher a "melhor" seria pior do que recusar: a chamada teria dois
|
|
38
|
+
* arquivos possíveis e o resultado dependeria de uma precedência que ninguém leu.
|
|
39
|
+
*/
|
|
40
|
+
detectModality(args, required = true) {
|
|
41
|
+
const present = mcp_file_source_schema_1.FILE_SOURCE_FIELDS.filter((field) => {
|
|
42
|
+
const value = args === null || args === void 0 ? void 0 : args[field];
|
|
43
|
+
return value !== undefined && value !== null && value !== '';
|
|
44
|
+
});
|
|
45
|
+
if (present.length > 1) {
|
|
46
|
+
throw new common_1.BadRequestException(`Provide exactly one file source, got ${present.length}: ${present.join(', ')}`);
|
|
47
|
+
}
|
|
48
|
+
if (present.length === 0) {
|
|
49
|
+
if (required) {
|
|
50
|
+
throw new common_1.BadRequestException(`A file source is required: one of ${mcp_file_source_schema_1.FILE_SOURCE_FIELDS.join(', ')}`);
|
|
51
|
+
}
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
return present[0];
|
|
55
|
+
}
|
|
56
|
+
async maxBytes() {
|
|
57
|
+
const settings = await this.settingService.getSettingValues(['storage-max-size']);
|
|
58
|
+
return Number(settings['storage-max-size']) || 10485760;
|
|
59
|
+
}
|
|
60
|
+
async allowedUrlHosts() {
|
|
61
|
+
const settings = await this.settingService.getSettingValues([
|
|
62
|
+
'mcp-file-url-allowed-hosts',
|
|
63
|
+
]);
|
|
64
|
+
const raw = settings['mcp-file-url-allowed-hosts'];
|
|
65
|
+
return String(raw !== null && raw !== void 0 ? raw : '')
|
|
66
|
+
.split(',')
|
|
67
|
+
.map((host) => host.trim())
|
|
68
|
+
.filter(Boolean);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Valida um buffer que ainda não está no storage: tamanho, tipo declarado, tipo real e
|
|
72
|
+
* sha256 quando informado.
|
|
73
|
+
*
|
|
74
|
+
* `acceptMimetypes` sozinho não basta — ele compara a string que o cliente mandou com a
|
|
75
|
+
* allowlist, então um executável declarado como `application/pdf` passaria. O sniff é o
|
|
76
|
+
* contraditório dessa declaração.
|
|
77
|
+
*/
|
|
78
|
+
async assertBufferAcceptable(buffer, mimetype, expectedSha256) {
|
|
79
|
+
const maxBytes = await this.maxBytes();
|
|
80
|
+
if (buffer.length === 0) {
|
|
81
|
+
throw new common_1.BadRequestException(`File content is empty`);
|
|
82
|
+
}
|
|
83
|
+
if (buffer.length > maxBytes) {
|
|
84
|
+
throw new common_1.BadRequestException(`File too large: ${buffer.length} bytes. The storage-max-size setting allows ${maxBytes}.`);
|
|
85
|
+
}
|
|
86
|
+
if (!(await this.fileService.acceptMimetypes(mimetype))) {
|
|
87
|
+
throw new common_1.BadRequestException(`Invalid file type: ${mimetype}`);
|
|
88
|
+
}
|
|
89
|
+
const conflict = (0, mimetype_sniff_util_1.findMimetypeConflict)(mimetype, buffer);
|
|
90
|
+
if (conflict) {
|
|
91
|
+
throw new common_1.BadRequestException(`Declared mimeType ${mimetype} but the content is ${conflict}`);
|
|
92
|
+
}
|
|
93
|
+
if (expectedSha256) {
|
|
94
|
+
const actual = (0, crypto_1.createHash)('sha256').update(buffer).digest('hex');
|
|
95
|
+
if (actual.toLowerCase() !== expectedSha256.toLowerCase()) {
|
|
96
|
+
throw new common_1.BadRequestException(`sha256 mismatch: declared ${expectedSha256}, content hashes to ${actual}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
toMulterFile(buffer, filename, mimetype) {
|
|
101
|
+
return {
|
|
102
|
+
fieldname: 'file',
|
|
103
|
+
originalname: filename,
|
|
104
|
+
encoding: '7bit',
|
|
105
|
+
mimetype,
|
|
106
|
+
size: buffer.length,
|
|
107
|
+
destination: '',
|
|
108
|
+
filename,
|
|
109
|
+
path: '',
|
|
110
|
+
buffer,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
decodeBase64(args) {
|
|
114
|
+
if (!args.fileName || !args.mimeType) {
|
|
115
|
+
throw new common_1.BadRequestException(`fileBase64 requires fileName and mimeType`);
|
|
116
|
+
}
|
|
117
|
+
const buffer = Buffer.from(String(args.fileBase64), 'base64');
|
|
118
|
+
// `Buffer.from(x, 'base64')` nunca reclama: entrada inválida vira bytes truncados em
|
|
119
|
+
// silêncio. Reencodar e comparar é o que separa um base64 verdadeiro de um texto
|
|
120
|
+
// qualquer que o modelo tenha emitido no lugar.
|
|
121
|
+
if (buffer.length === 0) {
|
|
122
|
+
throw new common_1.BadRequestException(`fileBase64 decoded to zero bytes`);
|
|
123
|
+
}
|
|
124
|
+
const normalized = String(args.fileBase64).replace(/\s/g, '');
|
|
125
|
+
if (buffer.toString('base64').replace(/=+$/, '') !== normalized.replace(/=+$/, '')) {
|
|
126
|
+
throw new common_1.BadRequestException(`fileBase64 is not valid base64 (it may have been truncated in transit)`);
|
|
127
|
+
}
|
|
128
|
+
return { buffer, filename: args.fileName, mimetype: args.mimeType };
|
|
129
|
+
}
|
|
130
|
+
async fetchFromUrl(args) {
|
|
131
|
+
const result = await (0, remote_fetch_util_1.fetchRemoteFile)(String(args.fileUrl), {
|
|
132
|
+
maxBytes: await this.maxBytes(),
|
|
133
|
+
allowedHosts: await this.allowedUrlHosts(),
|
|
134
|
+
});
|
|
135
|
+
// Nome e tipo declarados ganham do que o servidor remoto disse: quem chama sabe o que
|
|
136
|
+
// pediu, e o `Content-Type` de um link de compartilhamento costuma vir genérico. O
|
|
137
|
+
// conteúdo real ainda é conferido depois, contra o que tiver sobrado aqui.
|
|
138
|
+
const fallbackName = decodeURIComponent(new URL(result.finalUrl).pathname.split('/').pop() || '') ||
|
|
139
|
+
'download';
|
|
140
|
+
return {
|
|
141
|
+
buffer: result.buffer,
|
|
142
|
+
filename: args.fileName || fallbackName,
|
|
143
|
+
mimetype: args.mimeType || result.contentType || 'application/octet-stream',
|
|
144
|
+
host: result.finalHost,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
async resolveFileId(args, context, options) {
|
|
148
|
+
var _a, _b;
|
|
149
|
+
const modality = this.detectModality(args, options.required !== false);
|
|
150
|
+
if (!modality) {
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
let file;
|
|
154
|
+
let sourceHost;
|
|
155
|
+
if (modality === 'fileId') {
|
|
156
|
+
file = await this.fileService.assertFileUsable(Number(args.fileId), context.userId);
|
|
157
|
+
}
|
|
158
|
+
else if (modality === 'uploadId') {
|
|
159
|
+
file = await this.uploadTickets.complete(Number(args.uploadId), context.userId);
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
const fetched = modality === 'fileUrl'
|
|
163
|
+
? await this.fetchFromUrl(args)
|
|
164
|
+
: this.decodeBase64(args);
|
|
165
|
+
sourceHost = fetched.host;
|
|
166
|
+
await this.assertBufferAcceptable(fetched.buffer, fetched.mimetype, args.sha256);
|
|
167
|
+
file = await this.fileService.upload(options.destination, this.toMulterFile(fetched.buffer, fetched.filename, fetched.mimetype), undefined, {
|
|
168
|
+
isPrivate: (_a = options.isPrivate) !== null && _a !== void 0 ? _a : false,
|
|
169
|
+
createdByUserId: context.userId,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
const resolved = {
|
|
173
|
+
fileId: file.id,
|
|
174
|
+
modality,
|
|
175
|
+
filename: file.filename,
|
|
176
|
+
mimetype: await this.fileService.mimetypeNameById(file.mimetype_id),
|
|
177
|
+
size: (_b = file.size) !== null && _b !== void 0 ? _b : 0,
|
|
178
|
+
};
|
|
179
|
+
await this.recordIngest(resolved, context, sourceHost);
|
|
180
|
+
return resolved;
|
|
181
|
+
}
|
|
182
|
+
async resolveMulterFile(args, context, options) {
|
|
183
|
+
const modality = this.detectModality(args, options.required !== false);
|
|
184
|
+
if (!modality) {
|
|
185
|
+
return null;
|
|
186
|
+
}
|
|
187
|
+
if (modality === 'fileId' || modality === 'uploadId') {
|
|
188
|
+
const stored = modality === 'fileId'
|
|
189
|
+
? await this.fileService.assertFileUsable(Number(args.fileId), context.userId)
|
|
190
|
+
: await this.uploadTickets.complete(Number(args.uploadId), context.userId);
|
|
191
|
+
const buffer = await this.fileService.bufferById(stored.id, await this.maxBytes());
|
|
192
|
+
const mimetype = await this.fileService.mimetypeNameById(stored.mimetype_id);
|
|
193
|
+
await this.recordIngest({
|
|
194
|
+
fileId: stored.id,
|
|
195
|
+
modality,
|
|
196
|
+
filename: stored.filename,
|
|
197
|
+
mimetype,
|
|
198
|
+
size: buffer.length,
|
|
199
|
+
}, context);
|
|
200
|
+
return {
|
|
201
|
+
file: this.toMulterFile(buffer, stored.filename, mimetype),
|
|
202
|
+
modality,
|
|
203
|
+
fileId: stored.id,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
const fetched = modality === 'fileUrl' ? await this.fetchFromUrl(args) : this.decodeBase64(args);
|
|
207
|
+
await this.assertBufferAcceptable(fetched.buffer, fetched.mimetype, args.sha256);
|
|
208
|
+
await this.recordIngest({
|
|
209
|
+
fileId: 0,
|
|
210
|
+
modality,
|
|
211
|
+
filename: fetched.filename,
|
|
212
|
+
mimetype: fetched.mimetype,
|
|
213
|
+
size: fetched.buffer.length,
|
|
214
|
+
}, context, fetched.host);
|
|
215
|
+
return {
|
|
216
|
+
file: this.toMulterFile(fetched.buffer, fetched.filename, fetched.mimetype),
|
|
217
|
+
modality,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Registra a ingestão em `audit_log`, com a modalidade usada.
|
|
222
|
+
*
|
|
223
|
+
* `audit_log` é tabela global (só o finance escrevia nela até aqui, mas ela não é do
|
|
224
|
+
* finance), e `finance.audit-logs.list` já a lê sem filtrar por library — então a
|
|
225
|
+
* trilha das quatro modalidades fica visível por um caminho que já existe.
|
|
226
|
+
*
|
|
227
|
+
* Nunca derruba a operação: auditoria que falha e leva o anexo junto troca um problema
|
|
228
|
+
* de observabilidade por um de funcionamento.
|
|
229
|
+
*/
|
|
230
|
+
async recordIngest(resolved, context, sourceHost) {
|
|
231
|
+
var _a;
|
|
232
|
+
try {
|
|
233
|
+
await this.prismaService.audit_log.create({
|
|
234
|
+
data: {
|
|
235
|
+
actor_user_id: context.userId || null,
|
|
236
|
+
action: 'MCP_FILE_INGEST',
|
|
237
|
+
entity_table: 'file',
|
|
238
|
+
entity_id: String(resolved.fileId || ''),
|
|
239
|
+
summary: `Ingested ${resolved.filename} via ${resolved.modality}${context.toolName ? ` for ${context.toolName}` : ''}`,
|
|
240
|
+
after_data: JSON.stringify(Object.assign({ modality: resolved.modality, tool: (_a = context.toolName) !== null && _a !== void 0 ? _a : null, file_id: resolved.fileId || null, filename: resolved.filename, mimetype: resolved.mimetype, bytes: resolved.size }, (sourceHost ? { source_host: sourceHost } : {}))),
|
|
241
|
+
},
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
catch (error) {
|
|
245
|
+
this.logger.warn(`Failed to record MCP file ingest: ${error.message}`);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
};
|
|
249
|
+
exports.McpFileSourceService = McpFileSourceService;
|
|
250
|
+
/** Quanto do arquivo basta para reconhecer o tipo — reexportado para os testes. */
|
|
251
|
+
McpFileSourceService.SNIFF_BYTES = mimetype_sniff_util_1.MIMETYPE_SNIFF_BYTES;
|
|
252
|
+
exports.McpFileSourceService = McpFileSourceService = McpFileSourceService_1 = __decorate([
|
|
253
|
+
(0, common_1.Injectable)(),
|
|
254
|
+
__param(1, (0, common_1.Inject)((0, common_1.forwardRef)(() => file_service_1.FileService))),
|
|
255
|
+
__param(2, (0, common_1.Inject)((0, common_1.forwardRef)(() => file_upload_ticket_service_1.FileUploadTicketService))),
|
|
256
|
+
__param(3, (0, common_1.Inject)((0, common_1.forwardRef)(() => setting_service_1.SettingService))),
|
|
257
|
+
__metadata("design:paramtypes", [api_prisma_1.PrismaService,
|
|
258
|
+
file_service_1.FileService,
|
|
259
|
+
file_upload_ticket_service_1.FileUploadTicketService,
|
|
260
|
+
setting_service_1.SettingService])
|
|
261
|
+
], McpFileSourceService);
|
|
262
|
+
//# sourceMappingURL=mcp-file-source.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-file-source.service.js","sourceRoot":"","sources":["../../src/file/mcp-file-source.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Identifica o tipo real de um arquivo pelos primeiros bytes, para que o mimetype
|
|
3
|
+
* declarado por quem envia não seja a única palavra sobre o que está sendo gravado.
|
|
4
|
+
*
|
|
5
|
+
* Hoje o `Content-Type` do multipart é a fonte de verdade sempre que vem concreto
|
|
6
|
+
* (`resolveEffectiveMimetype` no `FileService` só recorre ao conteúdo quando o caller
|
|
7
|
+
* manda vazio ou `application/octet-stream`), então um executável enviado como
|
|
8
|
+
* `image/png` passa direto pelo `storage-accept-mimetype`. Nas origens novas do MCP o
|
|
9
|
+
* cliente escolhe livremente o `mimeType`, o que tornaria essa brecha trivial de usar.
|
|
10
|
+
*
|
|
11
|
+
* Cobre o conjunto de opções do `storage-accept-mimetype` e nada além: a função não é
|
|
12
|
+
* um detector geral, é o contraditório do que foi declarado. Quando o formato não está
|
|
13
|
+
* nesta lista ela devolve `null`, e quem chama mantém o tipo declarado — recusar o que
|
|
14
|
+
* não se sabe reconhecer barraria CSV, OFX e afins, que são justamente o insumo do
|
|
15
|
+
* `statements.import`.
|
|
16
|
+
*
|
|
17
|
+
* Não usa `file-type`: da v19 em diante o pacote é ESM puro e quebraria o build CJS
|
|
18
|
+
* destas libraries. Os formatos aqui têm assinatura estável e curta.
|
|
19
|
+
*
|
|
20
|
+
* Existem dois primos, e a diferença entre eles e este é de política, não de descuido:
|
|
21
|
+
* `cms/src/form/cms-form-file-sniffer.ts` e
|
|
22
|
+
* `operations/src/task-intake/task-intake-file-sniffer.ts` usam allowlist **fechada** —
|
|
23
|
+
* o que não é reconhecido é recusado — porque servem endpoints anônimos, onde o mimetype
|
|
24
|
+
* declarado não vale nada e o conjunto aceito é estreito (print e vídeo do problema).
|
|
25
|
+
* Aqui a política é aberta: o caminho é autenticado e precisa continuar aceitando CSV e
|
|
26
|
+
* OFX, que não têm assinatura, para o `finance.statements.import`. Unificar os três
|
|
27
|
+
* significaria parametrizar essa política através de uma fronteira de segurança, e
|
|
28
|
+
* afrouxar por acidente o endpoint anônimo é o risco que isso carrega — é mudança
|
|
29
|
+
* própria, não carona nesta.
|
|
30
|
+
*/
|
|
31
|
+
/** Quanto do início do arquivo basta para todas as assinaturas abaixo. */
|
|
32
|
+
export declare const MIMETYPE_SNIFF_BYTES = 4096;
|
|
33
|
+
/**
|
|
34
|
+
* Tipo real do conteúdo, ou `null` quando a assinatura não é reconhecida.
|
|
35
|
+
*
|
|
36
|
+
* Só precisa dos primeiros bytes — passe o cabeçalho quando o arquivo for grande, e
|
|
37
|
+
* nunca o arquivo inteiro só para chamar esta função.
|
|
38
|
+
*/
|
|
39
|
+
export declare function detectMimetypeFromBytes(buffer: Buffer): string | null;
|
|
40
|
+
/**
|
|
41
|
+
* Confronta o tipo declarado com o que os bytes dizem.
|
|
42
|
+
*
|
|
43
|
+
* Devolve `null` quando não há conflito, ou uma descrição do que o conteúdo realmente é —
|
|
44
|
+
* é ela que a mensagem de erro mostra, porque "declarado X, conteúdo Y" é o que permite
|
|
45
|
+
* corrigir a chamada.
|
|
46
|
+
*
|
|
47
|
+
* A regra tem dois lados, e o segundo é o que fecha o buraco:
|
|
48
|
+
*
|
|
49
|
+
* 1. assinatura reconhecida que contradiz o declarado → conflito;
|
|
50
|
+
* 2. assinatura NÃO reconhecida, mas o tipo declarado é um dos verificáveis → também
|
|
51
|
+
* conflito. Sem isso, bastaria declarar `application/pdf` num executável para
|
|
52
|
+
* passar: ele não tem assinatura de PDF, mas também não tem nenhuma das que o
|
|
53
|
+
* sniffer conhece, e "desconhecido" seria lido como "sem objeção".
|
|
54
|
+
*
|
|
55
|
+
* Conteúdo sem assinatura declarado como `text/csv` continua passando, que é o caso do
|
|
56
|
+
* `finance.statements.import`.
|
|
57
|
+
*
|
|
58
|
+
* ZIP merece nota: um `.docx` declarado como `application/zip` não é conflito, já que ele
|
|
59
|
+
* é literalmente um zip. O contrário também não, pelo mesmo motivo.
|
|
60
|
+
*/
|
|
61
|
+
export declare function findMimetypeConflict(declared: string, buffer: Buffer): string | null;
|
|
62
|
+
//# sourceMappingURL=mimetype-sniff.util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mimetype-sniff.util.d.ts","sourceRoot":"","sources":["../../src/file/mimetype-sniff.util.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,0EAA0E;AAC1E,eAAO,MAAM,oBAAoB,OAAO,CAAC;AA+CzC;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA2DrE;AAkED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,MAAM,GAAG,IAAI,CA8Bf"}
|