@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
package/dist/ai/ai.service.js
CHANGED
|
@@ -16,7 +16,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
16
16
|
};
|
|
17
17
|
var AiService_1;
|
|
18
18
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
-
exports.AiService = void 0;
|
|
19
|
+
exports.AiService = exports.AiProfileProviderMismatchError = void 0;
|
|
20
|
+
exports.isAttachmentDeliveredToModel = isAttachmentDeliveredToModel;
|
|
21
|
+
exports.isAttachmentDeliveredAsPixels = isAttachmentDeliveredAsPixels;
|
|
20
22
|
const api_prisma_1 = require("@hed-hog/api-prisma");
|
|
21
23
|
const common_1 = require("@nestjs/common");
|
|
22
24
|
const axios_1 = __importDefault(require("axios"));
|
|
@@ -27,6 +29,7 @@ const ai_prompt_resolver_service_1 = require("../ai-instruction/ai-prompt-resolv
|
|
|
27
29
|
const file_service_1 = require("../file/file.service");
|
|
28
30
|
const integration_profile_utils_1 = require("../integration-profile/integration-profile.utils");
|
|
29
31
|
const setting_service_1 = require("../setting/setting.service");
|
|
32
|
+
const ai_agent_sort_1 = require("./ai-agent.sort");
|
|
30
33
|
const ai_attachment_fragments_1 = require("./ai-attachment.fragments");
|
|
31
34
|
const ai_prompts_1 = require("./ai.prompts");
|
|
32
35
|
/** Fallback call timeout when the active AI integration profile doesn't set `timeout_ms`. */
|
|
@@ -50,6 +53,44 @@ const PROVIDER_BY_INTEGRATION_SLUG = {
|
|
|
50
53
|
deepseek: 'deepseek',
|
|
51
54
|
claude: 'claude',
|
|
52
55
|
};
|
|
56
|
+
/** Anexo que o modelo realmente leu, em vez de um marcador dizendo que não deu. */
|
|
57
|
+
const DELIVERED_TO_MODEL = new Set([
|
|
58
|
+
'image',
|
|
59
|
+
'pdf-document',
|
|
60
|
+
'pdf-text',
|
|
61
|
+
'text',
|
|
62
|
+
]);
|
|
63
|
+
/** Entregas em que o modelo enxergou os pixels da página, não só texto. */
|
|
64
|
+
const DELIVERED_AS_PIXELS = new Set([
|
|
65
|
+
'image',
|
|
66
|
+
'pdf-document',
|
|
67
|
+
]);
|
|
68
|
+
function isAttachmentDeliveredToModel(delivery) {
|
|
69
|
+
return !!delivery && DELIVERED_TO_MODEL.has(delivery);
|
|
70
|
+
}
|
|
71
|
+
function isAttachmentDeliveredAsPixels(delivery) {
|
|
72
|
+
return !!delivery && DELIVERED_AS_PIXELS.has(delivery);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* O setting de um provider aponta para o perfil de outro provider.
|
|
76
|
+
*
|
|
77
|
+
* Classe própria, e não um `BadRequestException` solto, para uma escada de
|
|
78
|
+
* fallback conseguir parar antes de disparar chamadas que vão dar 4xx com
|
|
79
|
+
* certeza — era o que o extrator de notas fiscais fazia oito vezes por upload,
|
|
80
|
+
* engolindo cada uma delas.
|
|
81
|
+
*/
|
|
82
|
+
class AiProfileProviderMismatchError extends common_1.BadRequestException {
|
|
83
|
+
constructor(requestedProvider, profileSlug, profileProviderSlug, settingSlug) {
|
|
84
|
+
super(`AI profile "${profileSlug}" (setting "${settingSlug}") belongs to provider ` +
|
|
85
|
+
`"${profileProviderSlug}", not "${requestedProvider}". ` +
|
|
86
|
+
`Point Settings → AI → "${settingSlug}" at a ${requestedProvider} profile, or leave it empty.`);
|
|
87
|
+
this.requestedProvider = requestedProvider;
|
|
88
|
+
this.profileSlug = profileSlug;
|
|
89
|
+
this.profileProviderSlug = profileProviderSlug;
|
|
90
|
+
this.settingSlug = settingSlug;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
exports.AiProfileProviderMismatchError = AiProfileProviderMismatchError;
|
|
53
94
|
let AiService = AiService_1 = class AiService {
|
|
54
95
|
constructor(prismaService, settingService, fileService, aiExecution, promptResolver) {
|
|
55
96
|
this.prismaService = prismaService;
|
|
@@ -84,7 +125,7 @@ let AiService = AiService_1 = class AiService {
|
|
|
84
125
|
const executionId = await this.aiExecution.start({ trigger: 'api', contextSlug: 'ai-chat' });
|
|
85
126
|
const stepStart = Date.now();
|
|
86
127
|
try {
|
|
87
|
-
const { content, usage } = await this.withTimeout(this.chatWithProvider(provider, {
|
|
128
|
+
const { content, usage, delivery } = await this.withTimeout(this.chatWithProvider(provider, {
|
|
88
129
|
message: data.message,
|
|
89
130
|
model,
|
|
90
131
|
systemPrompt: data.systemPrompt,
|
|
@@ -92,6 +133,7 @@ let AiService = AiService_1 = class AiService {
|
|
|
92
133
|
apiKey: aiProfile.apiKey,
|
|
93
134
|
baseUrl: aiProfile.baseUrl,
|
|
94
135
|
params,
|
|
136
|
+
timeoutMs,
|
|
95
137
|
}), timeoutMs);
|
|
96
138
|
await this.aiExecution.recordStep({
|
|
97
139
|
executionId,
|
|
@@ -104,7 +146,12 @@ let AiService = AiService_1 = class AiService {
|
|
|
104
146
|
outputSummary: content.slice(0, 200),
|
|
105
147
|
});
|
|
106
148
|
await this.aiExecution.finish(executionId, 'completed');
|
|
107
|
-
return {
|
|
149
|
+
return {
|
|
150
|
+
provider,
|
|
151
|
+
model,
|
|
152
|
+
content,
|
|
153
|
+
attachmentDelivery: delivery !== null && delivery !== void 0 ? delivery : 'none',
|
|
154
|
+
};
|
|
108
155
|
}
|
|
109
156
|
catch (err) {
|
|
110
157
|
await this.aiExecution.finish(executionId, 'failed', String(err));
|
|
@@ -120,7 +167,7 @@ let AiService = AiService_1 = class AiService {
|
|
|
120
167
|
* can log a fallback.
|
|
121
168
|
*/
|
|
122
169
|
async chatWithPrompt(input) {
|
|
123
|
-
var _a, _b, _c, _d, _e, _f;
|
|
170
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
124
171
|
const slugs = input.systemPromptSlug
|
|
125
172
|
? [input.systemPromptSlug, input.userPromptSlug]
|
|
126
173
|
: [input.userPromptSlug];
|
|
@@ -136,12 +183,15 @@ let AiService = AiService_1 = class AiService {
|
|
|
136
183
|
const target = await this.resolveProviderAndProfile(input.provider, input.profileSlug);
|
|
137
184
|
const provider = target.provider;
|
|
138
185
|
const aiProfile = target.profile;
|
|
139
|
-
const model =
|
|
140
|
-
|
|
186
|
+
const model = ((_a = input.model) === null || _a === void 0 ? void 0 : _a.trim()) ||
|
|
187
|
+
stored.model ||
|
|
188
|
+
aiProfile.model ||
|
|
189
|
+
this.getDefaultModel(provider);
|
|
190
|
+
const timeoutMs = (_b = aiProfile.timeoutMs) !== null && _b !== void 0 ? _b : DEFAULT_AI_CALL_TIMEOUT_MS;
|
|
141
191
|
const params = {
|
|
142
|
-
temperature: (
|
|
143
|
-
maxTokens: (
|
|
144
|
-
responseFormat: (
|
|
192
|
+
temperature: (_c = stored.temperature) !== null && _c !== void 0 ? _c : (_d = input.params) === null || _d === void 0 ? void 0 : _d.temperature,
|
|
193
|
+
maxTokens: (_e = stored.maxTokens) !== null && _e !== void 0 ? _e : (_f = input.params) === null || _f === void 0 ? void 0 : _f.maxTokens,
|
|
194
|
+
responseFormat: (_g = input.params) === null || _g === void 0 ? void 0 : _g.responseFormat,
|
|
145
195
|
};
|
|
146
196
|
const executionId = await this.aiExecution.start({
|
|
147
197
|
trigger: 'api',
|
|
@@ -169,30 +219,41 @@ let AiService = AiService_1 = class AiService {
|
|
|
169
219
|
});
|
|
170
220
|
await this.aiExecution.finish(executionId, 'completed');
|
|
171
221
|
const promptSources = Object.fromEntries(Object.entries(resolved).map(([slug, prompt]) => [slug, prompt.source]));
|
|
172
|
-
|
|
222
|
+
// `executionId || null`: `start` devolve 0 quando não conseguiu abrir a
|
|
223
|
+
// linha, e quem guarda esse id (o SAC, em `ai_execution_id`) ficaria
|
|
224
|
+
// apontando para uma execução inexistente — a coluna não tem FK para
|
|
225
|
+
// barrar isso.
|
|
226
|
+
return { provider, model, content, promptSources, executionId: executionId || null };
|
|
173
227
|
}
|
|
174
228
|
catch (err) {
|
|
175
229
|
await this.aiExecution.finish(executionId, 'failed', String(err));
|
|
176
230
|
throw err;
|
|
177
231
|
}
|
|
178
232
|
}
|
|
233
|
+
/**
|
|
234
|
+
* `external_agent_id` nasce nulo: a Assistants API da OpenAI, que devolvia o
|
|
235
|
+
* `asst_...` guardado nessa coluna, foi desligada em 26/08/2026 e todo
|
|
236
|
+
* `POST /v1/assistants` passou a responder 404. As instruções do agente viram
|
|
237
|
+
* system prompt do `chat/completions` em `chatWithAgent`, então elas precisam
|
|
238
|
+
* estar na linha — daí resolver aqui a instrução padrão que antes ia embutida
|
|
239
|
+
* no assistant remoto, em vez de deixar o agente sem prompt nenhum.
|
|
240
|
+
*/
|
|
179
241
|
async createAgent(data) {
|
|
180
242
|
var _a;
|
|
181
243
|
const slug = data.slug.trim();
|
|
182
244
|
const provider = data.provider || 'openai';
|
|
183
245
|
const model = data.model || this.getDefaultModel(provider);
|
|
184
|
-
const instructions = ((_a = data.instructions) === null || _a === void 0 ? void 0 : _a.trim()) || null;
|
|
185
246
|
const existing = await this.findAgentBySlug(slug);
|
|
186
247
|
if (existing) {
|
|
187
248
|
return existing;
|
|
188
249
|
}
|
|
189
|
-
let
|
|
190
|
-
if (
|
|
191
|
-
|
|
192
|
-
slug,
|
|
193
|
-
|
|
194
|
-
instructions,
|
|
250
|
+
let instructions = ((_a = data.instructions) === null || _a === void 0 ? void 0 : _a.trim()) || null;
|
|
251
|
+
if (!instructions) {
|
|
252
|
+
const defaultInstructions = await this.promptResolver.resolve({
|
|
253
|
+
slug: ai_prompts_1.CORE_AI_PROMPT_SLUGS.agentDefaultInstructions,
|
|
254
|
+
variables: { slug },
|
|
195
255
|
});
|
|
256
|
+
instructions = defaultInstructions.content;
|
|
196
257
|
}
|
|
197
258
|
await this.prismaService.$executeRaw `
|
|
198
259
|
INSERT INTO ai_agent (slug, provider, model, instructions, external_agent_id)
|
|
@@ -201,7 +262,7 @@ let AiService = AiService_1 = class AiService {
|
|
|
201
262
|
CAST(${provider} AS ai_agent_provider_7cb93b1143_enum),
|
|
202
263
|
${model},
|
|
203
264
|
${instructions},
|
|
204
|
-
|
|
265
|
+
NULL
|
|
205
266
|
)
|
|
206
267
|
`;
|
|
207
268
|
return this.findAgentBySlug(slug);
|
|
@@ -234,28 +295,22 @@ let AiService = AiService_1 = class AiService {
|
|
|
234
295
|
});
|
|
235
296
|
}
|
|
236
297
|
async listAgents(paginationParams) {
|
|
237
|
-
var _a;
|
|
238
298
|
const page = Math.max(Number((paginationParams === null || paginationParams === void 0 ? void 0 : paginationParams.page) || 1), 1);
|
|
239
299
|
const pageSize = Math.min(Math.max(Number((paginationParams === null || paginationParams === void 0 ? void 0 : paginationParams.pageSize) || 10), 1), 100);
|
|
240
|
-
const
|
|
300
|
+
const skip = (page - 1) * pageSize;
|
|
241
301
|
const search = String((paginationParams === null || paginationParams === void 0 ? void 0 : paginationParams.search) || '').trim();
|
|
242
|
-
const
|
|
243
|
-
?
|
|
244
|
-
:
|
|
245
|
-
const data = await
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
SELECT COUNT(*) AS total
|
|
255
|
-
FROM ai_agent
|
|
256
|
-
${whereClause}
|
|
257
|
-
`);
|
|
258
|
-
const total = Number(((_a = totalResult === null || totalResult === void 0 ? void 0 : totalResult[0]) === null || _a === void 0 ? void 0 : _a.total) || 0);
|
|
302
|
+
const where = search
|
|
303
|
+
? { slug: { contains: search, mode: 'insensitive' } }
|
|
304
|
+
: {};
|
|
305
|
+
const [data, total] = await Promise.all([
|
|
306
|
+
this.prismaService.ai_agent.findMany({
|
|
307
|
+
where,
|
|
308
|
+
orderBy: ai_agent_sort_1.AI_AGENT_SORT.toPrismaOrderBy(paginationParams),
|
|
309
|
+
skip,
|
|
310
|
+
take: pageSize,
|
|
311
|
+
}),
|
|
312
|
+
this.prismaService.ai_agent.count({ where }),
|
|
313
|
+
]);
|
|
259
314
|
return {
|
|
260
315
|
data,
|
|
261
316
|
total,
|
|
@@ -287,24 +342,15 @@ let AiService = AiService_1 = class AiService {
|
|
|
287
342
|
throw new common_1.BadRequestException(`AI agent with slug "${slug}" already exists.`);
|
|
288
343
|
}
|
|
289
344
|
}
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
externalAgentId = null;
|
|
293
|
-
}
|
|
294
|
-
else if (!externalAgentId) {
|
|
295
|
-
externalAgentId = await this.createOpenAiAssistant({
|
|
296
|
-
slug,
|
|
297
|
-
model,
|
|
298
|
-
instructions,
|
|
299
|
-
});
|
|
300
|
-
}
|
|
345
|
+
// Zera o `asst_...` legado: a coluna deixou de ser alimentada quando a
|
|
346
|
+
// Assistants API foi desligada, e valor antigo aqui não tem mais para onde ir.
|
|
301
347
|
await this.prismaService.$executeRaw `
|
|
302
348
|
UPDATE ai_agent
|
|
303
349
|
SET slug = ${slug},
|
|
304
350
|
provider = CAST(${provider} AS ai_agent_provider_7cb93b1143_enum),
|
|
305
351
|
model = ${model},
|
|
306
352
|
instructions = ${instructions},
|
|
307
|
-
external_agent_id =
|
|
353
|
+
external_agent_id = NULL,
|
|
308
354
|
updated_at = NOW()
|
|
309
355
|
WHERE id = ${agentId}
|
|
310
356
|
`;
|
|
@@ -330,34 +376,37 @@ let AiService = AiService_1 = class AiService {
|
|
|
330
376
|
};
|
|
331
377
|
}
|
|
332
378
|
async chatWithAgent(slug, data, file) {
|
|
379
|
+
var _a;
|
|
333
380
|
const agent = await this.findAgentBySlug(slug);
|
|
334
381
|
const attachment = await this.resolveAttachment(file, data.file_id);
|
|
335
382
|
if (!agent) {
|
|
336
383
|
throw new common_1.NotFoundException(`AI agent with slug "${slug}" was not found.`);
|
|
337
384
|
}
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
model: agent.model,
|
|
344
|
-
content,
|
|
345
|
-
};
|
|
346
|
-
}
|
|
385
|
+
// Um único caminho para todo agente, com ou sem anexo: as instruções da
|
|
386
|
+
// linha viram system prompt do provider. Até 26/08/2026 o agente da OpenAI
|
|
387
|
+
// com `external_agent_id` e sem anexo era atendido por thread + run da
|
|
388
|
+
// Assistants API — que a OpenAI desligou, e que já ignorava model e
|
|
389
|
+
// instructions do banco porque só mandava o `assistant_id`.
|
|
347
390
|
const aiProfile = await this.getAiProfile(agent.provider);
|
|
348
|
-
const
|
|
391
|
+
const timeoutMs = (_a = aiProfile.timeoutMs) !== null && _a !== void 0 ? _a : DEFAULT_AI_CALL_TIMEOUT_MS;
|
|
392
|
+
// Sem o `withTimeout` este era o único ponto público sem prazo nenhum: uma
|
|
393
|
+
// chamada travada no provider segurava a requisição HTTP de quem chamou
|
|
394
|
+
// indefinidamente.
|
|
395
|
+
const { content, delivery } = await this.withTimeout(this.chatWithProvider(agent.provider, {
|
|
349
396
|
message: data.message,
|
|
350
397
|
model: agent.model || this.getDefaultModel(agent.provider),
|
|
351
398
|
systemPrompt: agent.instructions || undefined,
|
|
352
399
|
attachment,
|
|
353
400
|
apiKey: aiProfile.apiKey,
|
|
354
401
|
baseUrl: aiProfile.baseUrl,
|
|
355
|
-
|
|
402
|
+
timeoutMs,
|
|
403
|
+
}), timeoutMs);
|
|
356
404
|
return {
|
|
357
405
|
slug: agent.slug,
|
|
358
406
|
provider: agent.provider,
|
|
359
407
|
model: agent.model,
|
|
360
408
|
content,
|
|
409
|
+
attachmentDelivery: delivery !== null && delivery !== void 0 ? delivery : 'none',
|
|
361
410
|
};
|
|
362
411
|
}
|
|
363
412
|
async getAgentBySlug(slug) {
|
|
@@ -417,7 +466,7 @@ let AiService = AiService_1 = class AiService {
|
|
|
417
466
|
textSample: extractedText.slice(0, 600),
|
|
418
467
|
sha256: (0, crypto_1.createHash)('sha256').update(attachment.buffer).digest('hex'),
|
|
419
468
|
};
|
|
420
|
-
this.logger.
|
|
469
|
+
this.logger.debug(`[AI-ATTACHMENT-DEBUG] fileId=${fileId || 'upload'} filename="${result.filename}" mime=${result.mimeType} mode=${result.mode} bytes=${result.bytes} textLength=${result.textLength}`);
|
|
421
470
|
return result;
|
|
422
471
|
}
|
|
423
472
|
async findAgentBySlug(slug) {
|
|
@@ -512,7 +561,38 @@ let AiService = AiService_1 = class AiService {
|
|
|
512
561
|
if (!profileSlug) {
|
|
513
562
|
throw new common_1.BadRequestException(`No ${provider} AI profile configured. Set one in Settings → AI.`);
|
|
514
563
|
}
|
|
515
|
-
|
|
564
|
+
const loaded = await this.loadAiProfileBySlug(profileSlug);
|
|
565
|
+
const mapped = PROVIDER_BY_INTEGRATION_SLUG[loaded.providerSlug];
|
|
566
|
+
// `resolveProviderAndProfile` já protegia o caminho do perfil explícito
|
|
567
|
+
// ("pedir openai e apontar um perfil Claude bateria na API errada com a
|
|
568
|
+
// chave errada"); o caminho do setting global ficara de fora. Sem isso, um
|
|
569
|
+
// perfil OpenAI no campo do Gemini fazia o serviço postar a chave da OpenAI
|
|
570
|
+
// no endpoint do Google e engolir o 4xx de cada modelo tentado.
|
|
571
|
+
if (mapped !== provider) {
|
|
572
|
+
this.logger.error(`[AI-PROFILE] "${slug}" = "${profileSlug}" é um perfil ${loaded.providerSlug}, ` +
|
|
573
|
+
`mas ${provider} foi pedido.`);
|
|
574
|
+
throw new AiProfileProviderMismatchError(provider, profileSlug, loaded.providerSlug, slug);
|
|
575
|
+
}
|
|
576
|
+
return loaded.config;
|
|
577
|
+
}
|
|
578
|
+
/**
|
|
579
|
+
* "Este provider dá para usar?", sem lançar.
|
|
580
|
+
*
|
|
581
|
+
* Existe para uma escada de fallback perguntar antes de tentar, em vez de
|
|
582
|
+
* gastar uma requisição HTTP por modelo só para descobrir que a credencial
|
|
583
|
+
* nem é daquele provider.
|
|
584
|
+
*/
|
|
585
|
+
async isProviderConfigured(provider) {
|
|
586
|
+
try {
|
|
587
|
+
await this.getAiProfile(provider);
|
|
588
|
+
return { ok: true };
|
|
589
|
+
}
|
|
590
|
+
catch (error) {
|
|
591
|
+
return {
|
|
592
|
+
ok: false,
|
|
593
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
594
|
+
};
|
|
595
|
+
}
|
|
516
596
|
}
|
|
517
597
|
async loadAiProfileBySlug(profileSlug) {
|
|
518
598
|
const profile = await this.prismaService.integration_profile.findUnique({
|
|
@@ -541,26 +621,176 @@ let AiService = AiService_1 = class AiService {
|
|
|
541
621
|
});
|
|
542
622
|
});
|
|
543
623
|
}
|
|
544
|
-
async chatWithOpenAi({ message, model, systemPrompt, attachment, apiKey, params, provider = 'openai', baseUrl = 'https://api.openai.com/v1', supportsImages = true, }) {
|
|
545
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
624
|
+
async chatWithOpenAi({ message, model, systemPrompt, attachment, apiKey, params, provider = 'openai', baseUrl = 'https://api.openai.com/v1', supportsImages = true, timeoutMs, }) {
|
|
625
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q;
|
|
546
626
|
const openai = apiKey !== null && apiKey !== void 0 ? apiKey : (await this.getAiApiKey(provider));
|
|
627
|
+
if (this.shouldUseOpenAiResponses({ provider, baseUrl, model, attachment })) {
|
|
628
|
+
try {
|
|
629
|
+
return await this.chatWithOpenAiResponses({
|
|
630
|
+
message,
|
|
631
|
+
model,
|
|
632
|
+
systemPrompt,
|
|
633
|
+
attachment: attachment,
|
|
634
|
+
apiKey: openai,
|
|
635
|
+
baseUrl,
|
|
636
|
+
params,
|
|
637
|
+
timeoutMs,
|
|
638
|
+
});
|
|
639
|
+
}
|
|
640
|
+
catch (error) {
|
|
641
|
+
const status = Number((_a = error === null || error === void 0 ? void 0 : error.response) === null || _a === void 0 ? void 0 : _a.status);
|
|
642
|
+
// 400/404/422 = este modelo ou esta conta não aceita `input_file`;
|
|
643
|
+
// cair para o chat/completions é melhor que falhar. Qualquer outra
|
|
644
|
+
// coisa (401, 429, 5xx, timeout) é falha de verdade e não pode ser
|
|
645
|
+
// mascarada por uma segunda chamada mais fraca, que só reproduziria o
|
|
646
|
+
// marcador de PDF ilegível e devolveria "não achei nada".
|
|
647
|
+
if (![400, 404, 422].includes(status))
|
|
648
|
+
throw error;
|
|
649
|
+
this.logger.warn(`[AI-RESPONSES] /v1/responses recusou (status=${status}); usando chat/completions. ` +
|
|
650
|
+
`apiError=${(_e = (_d = (_c = (_b = error === null || error === void 0 ? void 0 : error.response) === null || _b === void 0 ? void 0 : _b.data) === null || _c === void 0 ? void 0 : _c.error) === null || _d === void 0 ? void 0 : _d.message) !== null && _e !== void 0 ? _e : 'n/a'}`);
|
|
651
|
+
}
|
|
652
|
+
}
|
|
547
653
|
const messages = [];
|
|
548
654
|
if (systemPrompt) {
|
|
549
655
|
messages.push({ role: 'system', content: systemPrompt });
|
|
550
656
|
}
|
|
551
|
-
const userContent = await this.buildOpenAiUserContent(message, attachment, supportsImages);
|
|
657
|
+
const { content: userContent, delivery } = await this.buildOpenAiUserContent(message, attachment, supportsImages);
|
|
552
658
|
messages.push({ role: 'user', content: userContent });
|
|
553
|
-
const body = (0, ai_prompt_resolver_service_1.applyOpenAiModelParams)({ messages }, { model: null, temperature: (
|
|
659
|
+
const body = (0, ai_prompt_resolver_service_1.applyOpenAiModelParams)({ messages }, { model: null, temperature: (_f = params === null || params === void 0 ? void 0 : params.temperature) !== null && _f !== void 0 ? _f : null, maxTokens: (_g = params === null || params === void 0 ? void 0 : params.maxTokens) !== null && _g !== void 0 ? _g : null }, { model, jsonObject: (params === null || params === void 0 ? void 0 : params.responseFormat) === 'json_object' });
|
|
554
660
|
const response = await axios_1.default.post(`${baseUrl.replace(/\/+$/, '')}/chat/completions`, body, {
|
|
555
661
|
headers: {
|
|
556
662
|
Authorization: `Bearer ${openai}`,
|
|
557
663
|
'Content-Type': 'application/json',
|
|
558
664
|
},
|
|
559
665
|
});
|
|
560
|
-
const u = (
|
|
666
|
+
const u = (_h = response.data) === null || _h === void 0 ? void 0 : _h.usage;
|
|
561
667
|
return {
|
|
562
|
-
content: ((
|
|
563
|
-
|
|
668
|
+
content: ((_m = (_l = (_k = (_j = response.data) === null || _j === void 0 ? void 0 : _j.choices) === null || _k === void 0 ? void 0 : _k[0]) === null || _l === void 0 ? void 0 : _l.message) === null || _m === void 0 ? void 0 : _m.content) || '',
|
|
669
|
+
delivery,
|
|
670
|
+
usage: u ? { input: (_o = u.prompt_tokens) !== null && _o !== void 0 ? _o : 0, output: (_p = u.completion_tokens) !== null && _p !== void 0 ? _p : 0, total: (_q = u.total_tokens) !== null && _q !== void 0 ? _q : 0 } : undefined,
|
|
671
|
+
};
|
|
672
|
+
}
|
|
673
|
+
shouldUseOpenAiResponses(input) {
|
|
674
|
+
// O DeepSeek reusa o formato da OpenAI, mas não tem /v1/responses; e um
|
|
675
|
+
// gateway apontado por `base_url` pode simplesmente não repassar a rota.
|
|
676
|
+
if (input.provider !== 'openai')
|
|
677
|
+
return false;
|
|
678
|
+
if (!input.baseUrl.startsWith('https://api.openai.com'))
|
|
679
|
+
return false;
|
|
680
|
+
if (!input.attachment)
|
|
681
|
+
return false;
|
|
682
|
+
// Imagem já funciona pelo bloco de visão do chat/completions.
|
|
683
|
+
if (!this.isPdfMime(input.attachment.mimeType))
|
|
684
|
+
return false;
|
|
685
|
+
if (input.attachment.buffer.length > AiService_1.OPENAI_RESPONSES_MAX_PDF_BYTES) {
|
|
686
|
+
return false;
|
|
687
|
+
}
|
|
688
|
+
return AiService_1.OPENAI_DOCUMENT_MODEL_RE.test(input.model);
|
|
689
|
+
}
|
|
690
|
+
buildOpenAiResponsesBody(input) {
|
|
691
|
+
var _a, _b, _c, _d, _e;
|
|
692
|
+
const base64 = input.attachment.buffer.toString('base64');
|
|
693
|
+
// Arquivo antes da instrução, como no exemplo da própria OpenAI: o modelo
|
|
694
|
+
// lê o documento antes de saber o que tirar dele.
|
|
695
|
+
const body = {
|
|
696
|
+
input: [
|
|
697
|
+
{
|
|
698
|
+
role: 'user',
|
|
699
|
+
content: [
|
|
700
|
+
{
|
|
701
|
+
type: 'input_file',
|
|
702
|
+
filename: input.attachment.filename,
|
|
703
|
+
file_data: `data:${input.attachment.mimeType};base64,${base64}`,
|
|
704
|
+
},
|
|
705
|
+
{ type: 'input_text', text: input.message },
|
|
706
|
+
],
|
|
707
|
+
},
|
|
708
|
+
],
|
|
709
|
+
};
|
|
710
|
+
// `instructions` é o equivalente do `messages[0].role === 'system'`.
|
|
711
|
+
if (input.systemPrompt)
|
|
712
|
+
body.instructions = input.systemPrompt;
|
|
713
|
+
return (0, ai_prompt_resolver_service_1.applyOpenAiResponsesParams)(body, {
|
|
714
|
+
model: null,
|
|
715
|
+
temperature: (_b = (_a = input.params) === null || _a === void 0 ? void 0 : _a.temperature) !== null && _b !== void 0 ? _b : null,
|
|
716
|
+
maxTokens: (_d = (_c = input.params) === null || _c === void 0 ? void 0 : _c.maxTokens) !== null && _d !== void 0 ? _d : null,
|
|
717
|
+
}, {
|
|
718
|
+
model: input.model,
|
|
719
|
+
jsonObject: ((_e = input.params) === null || _e === void 0 ? void 0 : _e.responseFormat) === 'json_object',
|
|
720
|
+
});
|
|
721
|
+
}
|
|
722
|
+
/**
|
|
723
|
+
* Texto da resposta da Responses API.
|
|
724
|
+
*
|
|
725
|
+
* `output_text` é conveniência do SDK — o JSON HTTP cru normalmente não traz.
|
|
726
|
+
* O texto mora no array `output`, ao lado de itens `reasoning` que não têm
|
|
727
|
+
* `content` nenhum. Percorrer o array é o caminho real; o atalho pelo
|
|
728
|
+
* `output_text` só vale para quando o campo por acaso estiver lá.
|
|
729
|
+
*/
|
|
730
|
+
readOpenAiResponsesText(data) {
|
|
731
|
+
var _a;
|
|
732
|
+
if (typeof (data === null || data === void 0 ? void 0 : data.output_text) === 'string' && data.output_text.trim()) {
|
|
733
|
+
return data.output_text;
|
|
734
|
+
}
|
|
735
|
+
const output = Array.isArray(data === null || data === void 0 ? void 0 : data.output) ? data.output : [];
|
|
736
|
+
const chunks = [];
|
|
737
|
+
for (const item of output) {
|
|
738
|
+
if ((item === null || item === void 0 ? void 0 : item.type) && item.type !== 'message')
|
|
739
|
+
continue;
|
|
740
|
+
for (const part of (_a = item === null || item === void 0 ? void 0 : item.content) !== null && _a !== void 0 ? _a : []) {
|
|
741
|
+
if ((part === null || part === void 0 ? void 0 : part.type) === 'output_text' && typeof part.text === 'string') {
|
|
742
|
+
chunks.push(part.text);
|
|
743
|
+
}
|
|
744
|
+
else if ((part === null || part === void 0 ? void 0 : part.type) === 'refusal' && typeof part.refusal === 'string') {
|
|
745
|
+
this.logger.warn(`[AI-RESPONSES] modelo recusou: ${part.refusal.slice(0, 200)}`);
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
}
|
|
749
|
+
return chunks.join('');
|
|
750
|
+
}
|
|
751
|
+
/**
|
|
752
|
+
* PDF como documento, via `POST /v1/responses`.
|
|
753
|
+
*
|
|
754
|
+
* É o único caminho em que um PDF escaneado chega ao modelo: para modelos com
|
|
755
|
+
* visão a API extrai o texto e renderiza cada página como imagem. O
|
|
756
|
+
* chat/completions, mesmo aceitando um content part de PDF, só extrai texto —
|
|
757
|
+
* não serviria para um scan.
|
|
758
|
+
*/
|
|
759
|
+
async chatWithOpenAiResponses(input) {
|
|
760
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
|
|
761
|
+
const pages = await this.countPdfPages(input.attachment.buffer);
|
|
762
|
+
if (pages > AiService_1.OPENAI_RESPONSES_MAX_PDF_PAGES) {
|
|
763
|
+
this.logger.warn(`[AI-RESPONSES] "${input.attachment.filename}" tem ${pages} páginas ` +
|
|
764
|
+
`(máx. ${AiService_1.OPENAI_RESPONSES_MAX_PDF_PAGES}); usando chat/completions.`);
|
|
765
|
+
// 422 é o status que o chamador trata como "degrade", e não como falha.
|
|
766
|
+
throw Object.assign(new Error('PDF acima do limite de páginas'), {
|
|
767
|
+
response: { status: 422, data: { error: { message: 'too many pages' } } },
|
|
768
|
+
});
|
|
769
|
+
}
|
|
770
|
+
const response = await axios_1.default.post(`${input.baseUrl.replace(/\/+$/, '')}/responses`, this.buildOpenAiResponsesBody(input), {
|
|
771
|
+
headers: {
|
|
772
|
+
Authorization: `Bearer ${input.apiKey}`,
|
|
773
|
+
'Content-Type': 'application/json',
|
|
774
|
+
},
|
|
775
|
+
// O corpo é o PDF em base64, na casa dos megabytes, e a renderização
|
|
776
|
+
// das páginas é lenta: com os padrões do axios isso trunca ou trava.
|
|
777
|
+
timeout: (_a = input.timeoutMs) !== null && _a !== void 0 ? _a : DEFAULT_AI_CALL_TIMEOUT_MS,
|
|
778
|
+
maxBodyLength: Infinity,
|
|
779
|
+
maxContentLength: Infinity,
|
|
780
|
+
});
|
|
781
|
+
if (((_b = response.data) === null || _b === void 0 ? void 0 : _b.status) && response.data.status !== 'completed') {
|
|
782
|
+
this.logger.warn(`[AI-RESPONSES] status=${response.data.status} ` +
|
|
783
|
+
`reason=${(_e = (_d = (_c = response.data) === null || _c === void 0 ? void 0 : _c.incomplete_details) === null || _d === void 0 ? void 0 : _d.reason) !== null && _e !== void 0 ? _e : 'n/a'} ` +
|
|
784
|
+
`model=${input.model} file="${input.attachment.filename}"`);
|
|
785
|
+
}
|
|
786
|
+
const u = (_f = response.data) === null || _f === void 0 ? void 0 : _f.usage;
|
|
787
|
+
return {
|
|
788
|
+
content: this.readOpenAiResponsesText(response.data),
|
|
789
|
+
delivery: 'pdf-document',
|
|
790
|
+
usage: u
|
|
791
|
+
? Object.assign({ input: (_g = u.input_tokens) !== null && _g !== void 0 ? _g : 0, output: (_h = u.output_tokens) !== null && _h !== void 0 ? _h : 0, total: (_j = u.total_tokens) !== null && _j !== void 0 ? _j : ((_k = u.input_tokens) !== null && _k !== void 0 ? _k : 0) + ((_l = u.output_tokens) !== null && _l !== void 0 ? _l : 0) }, (((_m = u.input_tokens_details) === null || _m === void 0 ? void 0 : _m.cached_tokens)
|
|
792
|
+
? { cached: u.input_tokens_details.cached_tokens }
|
|
793
|
+
: {})) : undefined,
|
|
564
794
|
};
|
|
565
795
|
}
|
|
566
796
|
/**
|
|
@@ -608,95 +838,18 @@ let AiService = AiService_1 = class AiService {
|
|
|
608
838
|
: undefined,
|
|
609
839
|
};
|
|
610
840
|
}
|
|
611
|
-
async createOpenAiAssistant({ slug, model, instructions, }) {
|
|
612
|
-
var _a;
|
|
613
|
-
const openai = await this.getAiApiKey('openai');
|
|
614
|
-
const defaultInstructions = await this.promptResolver.resolve({
|
|
615
|
-
slug: ai_prompts_1.CORE_AI_PROMPT_SLUGS.agentDefaultInstructions,
|
|
616
|
-
variables: { slug },
|
|
617
|
-
});
|
|
618
|
-
const response = await axios_1.default.post('https://api.openai.com/v1/assistants', {
|
|
619
|
-
name: slug,
|
|
620
|
-
model,
|
|
621
|
-
instructions: instructions || defaultInstructions.content,
|
|
622
|
-
}, {
|
|
623
|
-
headers: {
|
|
624
|
-
Authorization: `Bearer ${openai}`,
|
|
625
|
-
'Content-Type': 'application/json',
|
|
626
|
-
'OpenAI-Beta': 'assistants=v2',
|
|
627
|
-
},
|
|
628
|
-
});
|
|
629
|
-
const assistantId = (_a = response.data) === null || _a === void 0 ? void 0 : _a.id;
|
|
630
|
-
if (!assistantId) {
|
|
631
|
-
throw new common_1.BadRequestException('OpenAI assistant creation failed.');
|
|
632
|
-
}
|
|
633
|
-
return assistantId;
|
|
634
|
-
}
|
|
635
|
-
async chatWithOpenAiAssistant(assistantId, message) {
|
|
636
|
-
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
637
|
-
const openai = await this.getAiApiKey('openai');
|
|
638
|
-
const threadResponse = await axios_1.default.post('https://api.openai.com/v1/threads', {
|
|
639
|
-
messages: [{ role: 'user', content: message }],
|
|
640
|
-
}, {
|
|
641
|
-
headers: {
|
|
642
|
-
Authorization: `Bearer ${openai}`,
|
|
643
|
-
'Content-Type': 'application/json',
|
|
644
|
-
'OpenAI-Beta': 'assistants=v2',
|
|
645
|
-
},
|
|
646
|
-
});
|
|
647
|
-
const threadId = (_a = threadResponse.data) === null || _a === void 0 ? void 0 : _a.id;
|
|
648
|
-
if (!threadId) {
|
|
649
|
-
throw new common_1.BadRequestException('OpenAI thread creation failed.');
|
|
650
|
-
}
|
|
651
|
-
const runResponse = await axios_1.default.post(`https://api.openai.com/v1/threads/${threadId}/runs`, {
|
|
652
|
-
assistant_id: assistantId,
|
|
653
|
-
}, {
|
|
654
|
-
headers: {
|
|
655
|
-
Authorization: `Bearer ${openai}`,
|
|
656
|
-
'Content-Type': 'application/json',
|
|
657
|
-
'OpenAI-Beta': 'assistants=v2',
|
|
658
|
-
},
|
|
659
|
-
});
|
|
660
|
-
const runId = (_b = runResponse.data) === null || _b === void 0 ? void 0 : _b.id;
|
|
661
|
-
if (!runId) {
|
|
662
|
-
throw new common_1.BadRequestException('OpenAI assistant run failed to start.');
|
|
663
|
-
}
|
|
664
|
-
for (let i = 0; i < 30; i++) {
|
|
665
|
-
const runStatusResponse = await axios_1.default.get(`https://api.openai.com/v1/threads/${threadId}/runs/${runId}`, {
|
|
666
|
-
headers: {
|
|
667
|
-
Authorization: `Bearer ${openai}`,
|
|
668
|
-
'OpenAI-Beta': 'assistants=v2',
|
|
669
|
-
},
|
|
670
|
-
});
|
|
671
|
-
const status = (_c = runStatusResponse.data) === null || _c === void 0 ? void 0 : _c.status;
|
|
672
|
-
if (status === 'completed') {
|
|
673
|
-
break;
|
|
674
|
-
}
|
|
675
|
-
if (['cancelled', 'failed', 'expired'].includes(status)) {
|
|
676
|
-
throw new common_1.BadRequestException(`OpenAI assistant run did not complete successfully (status: ${status}).`);
|
|
677
|
-
}
|
|
678
|
-
await this.sleep(1000);
|
|
679
|
-
}
|
|
680
|
-
const messagesResponse = await axios_1.default.get(`https://api.openai.com/v1/threads/${threadId}/messages`, {
|
|
681
|
-
headers: {
|
|
682
|
-
Authorization: `Bearer ${openai}`,
|
|
683
|
-
'OpenAI-Beta': 'assistants=v2',
|
|
684
|
-
},
|
|
685
|
-
});
|
|
686
|
-
const assistantMessage = (_e = (_d = messagesResponse.data) === null || _d === void 0 ? void 0 : _d.data) === null || _e === void 0 ? void 0 : _e.find((item) => item.role === 'assistant');
|
|
687
|
-
const output = (_h = (_g = (_f = assistantMessage === null || assistantMessage === void 0 ? void 0 : assistantMessage.content) === null || _f === void 0 ? void 0 : _f[0]) === null || _g === void 0 ? void 0 : _g.text) === null || _h === void 0 ? void 0 : _h.value;
|
|
688
|
-
return output || '';
|
|
689
|
-
}
|
|
690
841
|
async chatWithGemini({ message, model, systemPrompt, attachment, apiKey, params, }) {
|
|
691
842
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
692
843
|
const gemini = apiKey !== null && apiKey !== void 0 ? apiKey : (await this.getAiApiKey('gemini'));
|
|
693
844
|
const url = `https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent?key=${gemini}`;
|
|
694
845
|
const userParts = [{ text: message }];
|
|
846
|
+
let delivery = 'none';
|
|
695
847
|
if (attachment) {
|
|
696
848
|
if (this.isTextMime(attachment.mimeType)) {
|
|
697
849
|
userParts.push({
|
|
698
850
|
text: (0, ai_attachment_fragments_1.attachedFileBlock)(attachment.filename, this.toUtf8Text(attachment.buffer)),
|
|
699
851
|
});
|
|
852
|
+
delivery = 'text';
|
|
700
853
|
}
|
|
701
854
|
else if (this.isPdfMime(attachment.mimeType)) {
|
|
702
855
|
const pdfText = await this.extractPdfText(attachment.buffer);
|
|
@@ -704,6 +857,7 @@ let AiService = AiService_1 = class AiService {
|
|
|
704
857
|
userParts.push({
|
|
705
858
|
text: (0, ai_attachment_fragments_1.attachedFileBlock)(attachment.filename, pdfText),
|
|
706
859
|
});
|
|
860
|
+
delivery = 'pdf-text';
|
|
707
861
|
}
|
|
708
862
|
else {
|
|
709
863
|
userParts.push({
|
|
@@ -712,6 +866,7 @@ let AiService = AiService_1 = class AiService {
|
|
|
712
866
|
data: attachment.buffer.toString('base64'),
|
|
713
867
|
},
|
|
714
868
|
});
|
|
869
|
+
delivery = 'pdf-document';
|
|
715
870
|
}
|
|
716
871
|
}
|
|
717
872
|
else {
|
|
@@ -721,6 +876,7 @@ let AiService = AiService_1 = class AiService {
|
|
|
721
876
|
data: attachment.buffer.toString('base64'),
|
|
722
877
|
},
|
|
723
878
|
});
|
|
879
|
+
delivery = this.isImageMime(attachment.mimeType) ? 'image' : 'binary';
|
|
724
880
|
}
|
|
725
881
|
}
|
|
726
882
|
let payload = {
|
|
@@ -742,12 +898,10 @@ let AiService = AiService_1 = class AiService {
|
|
|
742
898
|
const u = (_g = response.data) === null || _g === void 0 ? void 0 : _g.usageMetadata;
|
|
743
899
|
return {
|
|
744
900
|
content,
|
|
901
|
+
delivery,
|
|
745
902
|
usage: u ? { input: (_h = u.promptTokenCount) !== null && _h !== void 0 ? _h : 0, output: (_j = u.candidatesTokenCount) !== null && _j !== void 0 ? _j : 0, total: (_k = u.totalTokenCount) !== null && _k !== void 0 ? _k : 0 } : undefined,
|
|
746
903
|
};
|
|
747
904
|
}
|
|
748
|
-
async sleep(ms) {
|
|
749
|
-
await new Promise((resolve) => setTimeout(resolve, ms));
|
|
750
|
-
}
|
|
751
905
|
async resolveAttachment(uploadFile, fileId) {
|
|
752
906
|
var _a;
|
|
753
907
|
if (uploadFile) {
|
|
@@ -769,30 +923,46 @@ let AiService = AiService_1 = class AiService {
|
|
|
769
923
|
}
|
|
770
924
|
return null;
|
|
771
925
|
}
|
|
926
|
+
/**
|
|
927
|
+
* Conteúdo da mensagem do usuário no chat/completions, mais como o anexo foi
|
|
928
|
+
* parar lá dentro.
|
|
929
|
+
*
|
|
930
|
+
* O `delivery` sai daqui porque é aqui que a decisão acontece: um PDF sem
|
|
931
|
+
* camada de texto vira o marcador de ilegível, e só este método sabe disso.
|
|
932
|
+
*/
|
|
772
933
|
async buildOpenAiUserContent(message, attachment, supportsImages = true) {
|
|
773
934
|
if (!attachment) {
|
|
774
|
-
return message;
|
|
935
|
+
return { content: message, delivery: 'none' };
|
|
775
936
|
}
|
|
776
937
|
if (supportsImages && this.isImageMime(attachment.mimeType)) {
|
|
777
938
|
const dataUri = `data:${attachment.mimeType};base64,${attachment.buffer.toString('base64')}`;
|
|
778
|
-
return
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
939
|
+
return {
|
|
940
|
+
content: [
|
|
941
|
+
{ type: 'text', text: message },
|
|
942
|
+
{ type: 'image_url', image_url: { url: dataUri } },
|
|
943
|
+
],
|
|
944
|
+
delivery: 'image',
|
|
945
|
+
};
|
|
782
946
|
}
|
|
783
947
|
let text;
|
|
948
|
+
let delivery;
|
|
784
949
|
if (this.isTextMime(attachment.mimeType)) {
|
|
785
950
|
text = this.toUtf8Text(attachment.buffer);
|
|
951
|
+
delivery = 'text';
|
|
786
952
|
}
|
|
787
953
|
else if (this.isPdfMime(attachment.mimeType)) {
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
954
|
+
const pdfText = await this.extractPdfText(attachment.buffer);
|
|
955
|
+
text = pdfText || (0, ai_attachment_fragments_1.unreadablePdfMarker)(attachment.filename);
|
|
956
|
+
delivery = pdfText ? 'pdf-text' : 'unreadable-pdf';
|
|
791
957
|
}
|
|
792
958
|
else {
|
|
793
959
|
text = (0, ai_attachment_fragments_1.binaryAttachmentMarker)(attachment.filename, attachment.mimeType, attachment.buffer.length);
|
|
960
|
+
delivery = 'binary';
|
|
794
961
|
}
|
|
795
|
-
return
|
|
962
|
+
return {
|
|
963
|
+
content: `${message}${(0, ai_attachment_fragments_1.attachedFileBlock)(attachment.filename, text)}`,
|
|
964
|
+
delivery,
|
|
965
|
+
};
|
|
796
966
|
}
|
|
797
967
|
isImageMime(mimeType) {
|
|
798
968
|
return mimeType.startsWith('image/');
|
|
@@ -846,11 +1016,36 @@ let AiService = AiService_1 = class AiService {
|
|
|
846
1016
|
return '';
|
|
847
1017
|
}
|
|
848
1018
|
}
|
|
1019
|
+
/** Páginas do PDF, ou 0 quando ele não abre — nesse caso o teto não barra. */
|
|
1020
|
+
async countPdfPages(buffer) {
|
|
1021
|
+
var _a, _b;
|
|
1022
|
+
try {
|
|
1023
|
+
return (_b = (_a = (await (0, pdf_parse_1.default)(buffer))) === null || _a === void 0 ? void 0 : _a.numpages) !== null && _b !== void 0 ? _b : 0;
|
|
1024
|
+
}
|
|
1025
|
+
catch (_c) {
|
|
1026
|
+
return 0;
|
|
1027
|
+
}
|
|
1028
|
+
}
|
|
849
1029
|
toUtf8Text(buffer) {
|
|
850
1030
|
return buffer.toString('utf8');
|
|
851
1031
|
}
|
|
852
1032
|
};
|
|
853
1033
|
exports.AiService = AiService;
|
|
1034
|
+
/**
|
|
1035
|
+
* Bytes crus de PDF acima disto não vão inline: base64 infla ~1,37x e a
|
|
1036
|
+
* OpenAI limita a requisição a 50 MB.
|
|
1037
|
+
*/
|
|
1038
|
+
AiService.OPENAI_RESPONSES_MAX_PDF_BYTES = 20 * 1024 * 1024;
|
|
1039
|
+
/** Acima disto a conta de tokens das páginas renderizadas deixa de compensar. */
|
|
1040
|
+
AiService.OPENAI_RESPONSES_MAX_PDF_PAGES = 20;
|
|
1041
|
+
/**
|
|
1042
|
+
* Modelos que renderizam as páginas do PDF como imagem na Responses API.
|
|
1043
|
+
*
|
|
1044
|
+
* Um modelo sem visão recebendo `input_file` só recebe a camada de texto de
|
|
1045
|
+
* volta — o mesmo nada do chat/completions, num endpoint diferente. Deixá-lo
|
|
1046
|
+
* no caminho antigo mantém a falha conhecida em vez de criar uma nova.
|
|
1047
|
+
*/
|
|
1048
|
+
AiService.OPENAI_DOCUMENT_MODEL_RE = /^(gpt-4o|gpt-4\.1|gpt-4-turbo|gpt-5|o3|o4)/i;
|
|
854
1049
|
exports.AiService = AiService = AiService_1 = __decorate([
|
|
855
1050
|
(0, common_1.Injectable)(),
|
|
856
1051
|
__param(0, (0, common_1.Inject)((0, common_1.forwardRef)(() => api_prisma_1.PrismaService))),
|