@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.
Files changed (815) hide show
  1. package/dist/ai/ai-agent.sort.d.ts +6 -0
  2. package/dist/ai/ai-agent.sort.d.ts.map +1 -0
  3. package/dist/ai/ai-agent.sort.js +21 -0
  4. package/dist/ai/ai-agent.sort.js.map +1 -0
  5. package/dist/ai/ai.controller.d.ts +6 -4
  6. package/dist/ai/ai.controller.d.ts.map +1 -1
  7. package/dist/ai/ai.service.d.ts +121 -6
  8. package/dist/ai/ai.service.d.ts.map +1 -1
  9. package/dist/ai/ai.service.js +355 -160
  10. package/dist/ai/ai.service.js.map +1 -1
  11. package/dist/ai-instruction/ai-instruction.service.d.ts.map +1 -1
  12. package/dist/ai-instruction/ai-instruction.service.js +26 -23
  13. package/dist/ai-instruction/ai-instruction.service.js.map +1 -1
  14. package/dist/ai-instruction/ai-instruction.sort.d.ts +16 -0
  15. package/dist/ai-instruction/ai-instruction.sort.d.ts.map +1 -0
  16. package/dist/ai-instruction/ai-instruction.sort.js +32 -0
  17. package/dist/ai-instruction/ai-instruction.sort.js.map +1 -0
  18. package/dist/ai-instruction/ai-prompt-resolver.service.d.ts +12 -0
  19. package/dist/ai-instruction/ai-prompt-resolver.service.d.ts.map +1 -1
  20. package/dist/ai-instruction/ai-prompt-resolver.service.js +26 -0
  21. package/dist/ai-instruction/ai-prompt-resolver.service.js.map +1 -1
  22. package/dist/auth/auth.controller.d.ts +24 -8
  23. package/dist/auth/auth.controller.d.ts.map +1 -1
  24. package/dist/auth/auth.module.d.ts.map +1 -1
  25. package/dist/auth/auth.module.js +8 -1
  26. package/dist/auth/auth.module.js.map +1 -1
  27. package/dist/auth/auth.service.d.ts +72 -25
  28. package/dist/auth/auth.service.d.ts.map +1 -1
  29. package/dist/auth/auth.service.js +41 -4
  30. package/dist/auth/auth.service.js.map +1 -1
  31. package/dist/auth/guards/auth.guard.d.ts +3 -1
  32. package/dist/auth/guards/auth.guard.d.ts.map +1 -1
  33. package/dist/auth/guards/auth.guard.js +12 -3
  34. package/dist/auth/guards/auth.guard.js.map +1 -1
  35. package/dist/authorize/authorize.controller.d.ts +29 -5
  36. package/dist/authorize/authorize.controller.d.ts.map +1 -1
  37. package/dist/authorize/authorize.controller.js +120 -13
  38. package/dist/authorize/authorize.controller.js.map +1 -1
  39. package/dist/authorize/authorize.errors.d.ts +34 -0
  40. package/dist/authorize/authorize.errors.d.ts.map +1 -0
  41. package/dist/authorize/authorize.errors.js +37 -0
  42. package/dist/authorize/authorize.errors.js.map +1 -0
  43. package/dist/authorize/authorize.module.d.ts.map +1 -1
  44. package/dist/authorize/authorize.module.js +6 -1
  45. package/dist/authorize/authorize.module.js.map +1 -1
  46. package/dist/authorize/authorize.service.d.ts +77 -3
  47. package/dist/authorize/authorize.service.d.ts.map +1 -1
  48. package/dist/authorize/authorize.service.js +212 -21
  49. package/dist/authorize/authorize.service.js.map +1 -1
  50. package/dist/authorize/dto/authorize-info.dto.d.ts +10 -1
  51. package/dist/authorize/dto/authorize-info.dto.d.ts.map +1 -1
  52. package/dist/authorize/dto/authorize-info.dto.js +16 -1
  53. package/dist/authorize/dto/authorize-info.dto.js.map +1 -1
  54. package/dist/authorize/dto/consent.dto.d.ts +10 -1
  55. package/dist/authorize/dto/consent.dto.d.ts.map +1 -1
  56. package/dist/authorize/dto/consent.dto.js +16 -1
  57. package/dist/authorize/dto/consent.dto.js.map +1 -1
  58. package/dist/authorize/dto/token.dto.d.ts +12 -0
  59. package/dist/authorize/dto/token.dto.d.ts.map +1 -1
  60. package/dist/authorize/dto/token.dto.js +21 -1
  61. package/dist/authorize/dto/token.dto.js.map +1 -1
  62. package/dist/authorize/oauth-exception.filter.d.ts +17 -0
  63. package/dist/authorize/oauth-exception.filter.d.ts.map +1 -0
  64. package/dist/authorize/oauth-exception.filter.js +54 -0
  65. package/dist/authorize/oauth-exception.filter.js.map +1 -0
  66. package/dist/authorize/oauth-metadata.service.d.ts +39 -0
  67. package/dist/authorize/oauth-metadata.service.d.ts.map +1 -0
  68. package/dist/authorize/oauth-metadata.service.js +81 -0
  69. package/dist/authorize/oauth-metadata.service.js.map +1 -0
  70. package/dist/authorize/well-known.controller.d.ts +67 -0
  71. package/dist/authorize/well-known.controller.d.ts.map +1 -0
  72. package/dist/authorize/well-known.controller.js +126 -0
  73. package/dist/authorize/well-known.controller.js.map +1 -0
  74. package/dist/captcha/captcha.service.d.ts +32 -2
  75. package/dist/captcha/captcha.service.d.ts.map +1 -1
  76. package/dist/captcha/captcha.service.js +85 -12
  77. package/dist/captcha/captcha.service.js.map +1 -1
  78. package/dist/challenge/challenge.service.d.ts +2 -2
  79. package/dist/core.module.d.ts.map +1 -1
  80. package/dist/core.module.js +9 -0
  81. package/dist/core.module.js.map +1 -1
  82. package/dist/dashboard/dashboard/dashboard.controller.d.ts +9 -9
  83. package/dist/dashboard/dashboard/dashboard.service.d.ts +9 -9
  84. package/dist/dashboard/dashboard-component/dashboard-component.controller.d.ts +3 -3
  85. package/dist/dashboard/dashboard-component/dashboard-component.service.d.ts +3 -3
  86. package/dist/dashboard/dashboard-component-role/dashboard-component-role.controller.d.ts +3 -3
  87. package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.d.ts +3 -3
  88. package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.d.ts.map +1 -1
  89. package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.js +2 -4
  90. package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.js.map +1 -1
  91. package/dist/dashboard/dashboard-component-role/dashboard-component-role.sort.d.ts +8 -0
  92. package/dist/dashboard/dashboard-component-role/dashboard-component-role.sort.d.ts.map +1 -0
  93. package/dist/dashboard/dashboard-component-role/dashboard-component-role.sort.js +18 -0
  94. package/dist/dashboard/dashboard-component-role/dashboard-component-role.sort.js.map +1 -0
  95. package/dist/dashboard/dashboard-item/dashboard-item.service.d.ts.map +1 -1
  96. package/dist/dashboard/dashboard-item/dashboard-item.service.js +2 -4
  97. package/dist/dashboard/dashboard-item/dashboard-item.service.js.map +1 -1
  98. package/dist/dashboard/dashboard-item/dashboard-item.sort.d.ts +9 -0
  99. package/dist/dashboard/dashboard-item/dashboard-item.sort.d.ts.map +1 -0
  100. package/dist/dashboard/dashboard-item/dashboard-item.sort.js +19 -0
  101. package/dist/dashboard/dashboard-item/dashboard-item.sort.js.map +1 -0
  102. package/dist/dashboard/dashboard-role/dashboard-role.controller.d.ts +3 -3
  103. package/dist/dashboard/dashboard-role/dashboard-role.service.d.ts +3 -3
  104. package/dist/dashboard/dashboard-role/dashboard-role.service.d.ts.map +1 -1
  105. package/dist/dashboard/dashboard-role/dashboard-role.service.js +2 -4
  106. package/dist/dashboard/dashboard-role/dashboard-role.service.js.map +1 -1
  107. package/dist/dashboard/dashboard-role/dashboard-role.sort.d.ts +8 -0
  108. package/dist/dashboard/dashboard-role/dashboard-role.sort.d.ts.map +1 -0
  109. package/dist/dashboard/dashboard-role/dashboard-role.sort.js +16 -0
  110. package/dist/dashboard/dashboard-role/dashboard-role.sort.js.map +1 -0
  111. package/dist/document-kit/document-kit.module.d.ts +3 -0
  112. package/dist/document-kit/document-kit.module.d.ts.map +1 -0
  113. package/dist/document-kit/document-kit.module.js +24 -0
  114. package/dist/document-kit/document-kit.module.js.map +1 -0
  115. package/dist/document-kit/document-kit.registry.d.ts +55 -0
  116. package/dist/document-kit/document-kit.registry.d.ts.map +1 -0
  117. package/dist/document-kit/document-kit.registry.js +91 -0
  118. package/dist/document-kit/document-kit.registry.js.map +1 -0
  119. package/dist/document-kit/document-kit.service.d.ts +49 -0
  120. package/dist/document-kit/document-kit.service.d.ts.map +1 -0
  121. package/dist/document-kit/document-kit.service.js +135 -0
  122. package/dist/document-kit/document-kit.service.js.map +1 -0
  123. package/dist/file/file-upload-ticket.service.d.ts +160 -0
  124. package/dist/file/file-upload-ticket.service.d.ts.map +1 -0
  125. package/dist/file/file-upload-ticket.service.js +382 -0
  126. package/dist/file/file-upload-ticket.service.js.map +1 -0
  127. package/dist/file/file.controller.d.ts +24 -1
  128. package/dist/file/file.controller.d.ts.map +1 -1
  129. package/dist/file/file.controller.js +63 -2
  130. package/dist/file/file.controller.js.map +1 -1
  131. package/dist/file/file.module.d.ts.map +1 -1
  132. package/dist/file/file.module.js +14 -2
  133. package/dist/file/file.module.js.map +1 -1
  134. package/dist/file/file.service.d.ts +197 -7
  135. package/dist/file/file.service.d.ts.map +1 -1
  136. package/dist/file/file.service.js +438 -78
  137. package/dist/file/file.service.js.map +1 -1
  138. package/dist/file/filename-encoding.util.d.ts +24 -0
  139. package/dist/file/filename-encoding.util.d.ts.map +1 -0
  140. package/dist/file/filename-encoding.util.js +63 -0
  141. package/dist/file/filename-encoding.util.js.map +1 -0
  142. package/dist/file/image-optimization.service.d.ts +27 -0
  143. package/dist/file/image-optimization.service.d.ts.map +1 -1
  144. package/dist/file/image-optimization.service.js +63 -14
  145. package/dist/file/image-optimization.service.js.map +1 -1
  146. package/dist/file/mcp-file-source.schema.d.ts +33 -0
  147. package/dist/file/mcp-file-source.schema.d.ts.map +1 -0
  148. package/dist/file/mcp-file-source.schema.js +78 -0
  149. package/dist/file/mcp-file-source.schema.js.map +1 -0
  150. package/dist/file/mcp-file-source.service.d.ts +124 -0
  151. package/dist/file/mcp-file-source.service.d.ts.map +1 -0
  152. package/dist/file/mcp-file-source.service.js +262 -0
  153. package/dist/file/mcp-file-source.service.js.map +1 -0
  154. package/dist/file/mimetype-sniff.util.d.ts +62 -0
  155. package/dist/file/mimetype-sniff.util.d.ts.map +1 -0
  156. package/dist/file/mimetype-sniff.util.js +226 -0
  157. package/dist/file/mimetype-sniff.util.js.map +1 -0
  158. package/dist/file/remote-fetch.util.d.ts +35 -0
  159. package/dist/file/remote-fetch.util.d.ts.map +1 -0
  160. package/dist/file/remote-fetch.util.js +236 -0
  161. package/dist/file/remote-fetch.util.js.map +1 -0
  162. package/dist/impersonation/dto/start-impersonation.dto.d.ts +4 -1
  163. package/dist/impersonation/dto/start-impersonation.dto.d.ts.map +1 -1
  164. package/dist/impersonation/dto/start-impersonation.dto.js +1 -1
  165. package/dist/impersonation/dto/start-impersonation.dto.js.map +1 -1
  166. package/dist/impersonation/impersonation.service.d.ts +8 -3
  167. package/dist/impersonation/impersonation.service.d.ts.map +1 -1
  168. package/dist/impersonation/impersonation.service.js +14 -4
  169. package/dist/impersonation/impersonation.service.js.map +1 -1
  170. package/dist/incident/incident.controller.d.ts +2 -1
  171. package/dist/incident/incident.controller.d.ts.map +1 -1
  172. package/dist/incident/incident.controller.js +10 -6
  173. package/dist/incident/incident.controller.js.map +1 -1
  174. package/dist/incident/incident.service.d.ts +2 -0
  175. package/dist/incident/incident.service.d.ts.map +1 -1
  176. package/dist/incident/incident.service.js +4 -0
  177. package/dist/incident/incident.service.js.map +1 -1
  178. package/dist/index.d.ts +22 -0
  179. package/dist/index.d.ts.map +1 -1
  180. package/dist/index.js +22 -0
  181. package/dist/index.js.map +1 -1
  182. package/dist/integration-profile/integration-profile.secrets.d.ts.map +1 -1
  183. package/dist/integration-profile/integration-profile.secrets.js +28 -0
  184. package/dist/integration-profile/integration-profile.secrets.js.map +1 -1
  185. package/dist/integration-profile/integration-profile.service.d.ts +0 -13
  186. package/dist/integration-profile/integration-profile.service.d.ts.map +1 -1
  187. package/dist/integration-profile/integration-profile.service.js +5 -40
  188. package/dist/integration-profile/integration-profile.service.js.map +1 -1
  189. package/dist/integration-profile/integration-profile.utils.js +5 -5
  190. package/dist/integration-profile/integration-profile.utils.js.map +1 -1
  191. package/dist/integration-profile/testers/ai.testers.d.ts.map +1 -1
  192. package/dist/integration-profile/testers/ai.testers.js +46 -8
  193. package/dist/integration-profile/testers/ai.testers.js.map +1 -1
  194. package/dist/integration-profile/testers/index.d.ts.map +1 -1
  195. package/dist/integration-profile/testers/index.js +2 -0
  196. package/dist/integration-profile/testers/index.js.map +1 -1
  197. package/dist/integration-profile/testers/shipping.testers.d.ts +3 -0
  198. package/dist/integration-profile/testers/shipping.testers.d.ts.map +1 -0
  199. package/dist/integration-profile/testers/shipping.testers.js +71 -0
  200. package/dist/integration-profile/testers/shipping.testers.js.map +1 -0
  201. package/dist/locale/locale.controller.d.ts +1 -1
  202. package/dist/locale/locale.service.d.ts +1 -1
  203. package/dist/mail/dto/send.dto.d.ts +6 -1
  204. package/dist/mail/dto/send.dto.d.ts.map +1 -1
  205. package/dist/mail/dto/send.dto.js.map +1 -1
  206. package/dist/mail/mail.service.d.ts +9 -0
  207. package/dist/mail/mail.service.d.ts.map +1 -1
  208. package/dist/mail/mail.service.js +34 -14
  209. package/dist/mail/mail.service.js.map +1 -1
  210. package/dist/mail-sent/mail-sent.controller.d.ts +1 -1
  211. package/dist/mail-sent/mail-sent.service.d.ts +1 -1
  212. package/dist/mail-sent/mail-sent.service.d.ts.map +1 -1
  213. package/dist/mail-sent/mail-sent.service.js +2 -1
  214. package/dist/mail-sent/mail-sent.service.js.map +1 -1
  215. package/dist/mail-sent/mail-sent.sort.d.ts +9 -0
  216. package/dist/mail-sent/mail-sent.sort.d.ts.map +1 -0
  217. package/dist/mail-sent/mail-sent.sort.js +19 -0
  218. package/dist/mail-sent/mail-sent.sort.js.map +1 -0
  219. package/dist/mcp/filters/mcp-challenge.filter.d.ts +20 -0
  220. package/dist/mcp/filters/mcp-challenge.filter.d.ts.map +1 -0
  221. package/dist/mcp/filters/mcp-challenge.filter.js +69 -0
  222. package/dist/mcp/filters/mcp-challenge.filter.js.map +1 -0
  223. package/dist/mcp/guards/mcp-auth.guard.d.ts +4 -1
  224. package/dist/mcp/guards/mcp-auth.guard.d.ts.map +1 -1
  225. package/dist/mcp/guards/mcp-auth.guard.js +19 -5
  226. package/dist/mcp/guards/mcp-auth.guard.js.map +1 -1
  227. package/dist/mcp/guards/mcp-permission.guard.d.ts +25 -3
  228. package/dist/mcp/guards/mcp-permission.guard.d.ts.map +1 -1
  229. package/dist/mcp/guards/mcp-permission.guard.js +46 -26
  230. package/dist/mcp/guards/mcp-permission.guard.js.map +1 -1
  231. package/dist/mcp/mcp-audit.service.d.ts +17 -0
  232. package/dist/mcp/mcp-audit.service.d.ts.map +1 -1
  233. package/dist/mcp/mcp-audit.service.js +32 -3
  234. package/dist/mcp/mcp-audit.service.js.map +1 -1
  235. package/dist/mcp/mcp-permission.service.d.ts +64 -0
  236. package/dist/mcp/mcp-permission.service.d.ts.map +1 -0
  237. package/dist/mcp/mcp-permission.service.js +178 -0
  238. package/dist/mcp/mcp-permission.service.js.map +1 -0
  239. package/dist/mcp/mcp-server.service.d.ts +3 -1
  240. package/dist/mcp/mcp-server.service.d.ts.map +1 -1
  241. package/dist/mcp/mcp-server.service.js +36 -15
  242. package/dist/mcp/mcp-server.service.js.map +1 -1
  243. package/dist/mcp/mcp.controller.d.ts.map +1 -1
  244. package/dist/mcp/mcp.controller.js +10 -2
  245. package/dist/mcp/mcp.controller.js.map +1 -1
  246. package/dist/mcp/mcp.module.d.ts.map +1 -1
  247. package/dist/mcp/mcp.module.js +7 -1
  248. package/dist/mcp/mcp.module.js.map +1 -1
  249. package/dist/mcp/tools/core-access-log.mcp-tools.d.ts +17 -0
  250. package/dist/mcp/tools/core-access-log.mcp-tools.d.ts.map +1 -0
  251. package/dist/mcp/tools/core-access-log.mcp-tools.js +74 -0
  252. package/dist/mcp/tools/core-access-log.mcp-tools.js.map +1 -0
  253. package/dist/mcp/tools/core-ai.mcp-tools.js +2 -9
  254. package/dist/mcp/tools/core-ai.mcp-tools.js.map +1 -1
  255. package/dist/mcp/tools/core-dashboard-items.mcp-tools.js +1 -1
  256. package/dist/mcp/tools/core-dashboard-items.mcp-tools.js.map +1 -1
  257. package/dist/mcp/tools/core-dashboard.mcp-tools.js +2 -9
  258. package/dist/mcp/tools/core-dashboard.mcp-tools.js.map +1 -1
  259. package/dist/mcp/tools/core-event-webhooks.mcp-tools.d.ts.map +1 -1
  260. package/dist/mcp/tools/core-event-webhooks.mcp-tools.js +2 -10
  261. package/dist/mcp/tools/core-event-webhooks.mcp-tools.js.map +1 -1
  262. package/dist/mcp/tools/core-files.mcp-tools.d.ts +17 -5
  263. package/dist/mcp/tools/core-files.mcp-tools.d.ts.map +1 -1
  264. package/dist/mcp/tools/core-files.mcp-tools.js +186 -24
  265. package/dist/mcp/tools/core-files.mcp-tools.js.map +1 -1
  266. package/dist/mcp/tools/core-integration-events.mcp-tools.js +2 -9
  267. package/dist/mcp/tools/core-integration-events.mcp-tools.js.map +1 -1
  268. package/dist/mcp/tools/core-mail-sent.mcp-tools.js +2 -14
  269. package/dist/mcp/tools/core-mail-sent.mcp-tools.js.map +1 -1
  270. package/dist/mcp/tools/core-mail.mcp-tools.js +2 -9
  271. package/dist/mcp/tools/core-mail.mcp-tools.js.map +1 -1
  272. package/dist/mcp/tools/core-menus.mcp-tools.d.ts.map +1 -1
  273. package/dist/mcp/tools/core-menus.mcp-tools.js +2 -10
  274. package/dist/mcp/tools/core-menus.mcp-tools.js.map +1 -1
  275. package/dist/mcp/tools/core-notifications.mcp-tools.d.ts.map +1 -1
  276. package/dist/mcp/tools/core-notifications.mcp-tools.js +0 -1
  277. package/dist/mcp/tools/core-notifications.mcp-tools.js.map +1 -1
  278. package/dist/mcp/tools/core-roles.mcp-tools.d.ts.map +1 -1
  279. package/dist/mcp/tools/core-roles.mcp-tools.js +2 -13
  280. package/dist/mcp/tools/core-roles.mcp-tools.js.map +1 -1
  281. package/dist/mcp/tools/core-routes.mcp-tools.d.ts.map +1 -1
  282. package/dist/mcp/tools/core-routes.mcp-tools.js +2 -11
  283. package/dist/mcp/tools/core-routes.mcp-tools.js.map +1 -1
  284. package/dist/mcp/tools/core-screens.mcp-tools.d.ts.map +1 -1
  285. package/dist/mcp/tools/core-screens.mcp-tools.js +2 -11
  286. package/dist/mcp/tools/core-screens.mcp-tools.js.map +1 -1
  287. package/dist/mcp/tools/core-sessions.mcp-tools.d.ts.map +1 -1
  288. package/dist/mcp/tools/core-sessions.mcp-tools.js +0 -2
  289. package/dist/mcp/tools/core-sessions.mcp-tools.js.map +1 -1
  290. package/dist/mcp/tools/core-settings.mcp-tools.d.ts.map +1 -1
  291. package/dist/mcp/tools/core-settings.mcp-tools.js +2 -10
  292. package/dist/mcp/tools/core-settings.mcp-tools.js.map +1 -1
  293. package/dist/mcp/tools/core-users.mcp-tools.js +2 -9
  294. package/dist/mcp/tools/core-users.mcp-tools.js.map +1 -1
  295. package/dist/mcp/tools/core-webhooks.mcp-tools.d.ts.map +1 -1
  296. package/dist/mcp/tools/core-webhooks.mcp-tools.js +2 -10
  297. package/dist/mcp/tools/core-webhooks.mcp-tools.js.map +1 -1
  298. package/dist/mcp/types/mcp-context.type.d.ts +9 -0
  299. package/dist/mcp/types/mcp-context.type.d.ts.map +1 -1
  300. package/dist/mcp-chat/mcp-chat.service.d.ts.map +1 -1
  301. package/dist/mcp-chat/mcp-chat.service.js +8 -0
  302. package/dist/mcp-chat/mcp-chat.service.js.map +1 -1
  303. package/dist/meeting/meeting-provider.registry.d.ts +187 -0
  304. package/dist/meeting/meeting-provider.registry.d.ts.map +1 -1
  305. package/dist/meeting/meeting-provider.registry.js.map +1 -1
  306. package/dist/meeting/meeting.constants.d.ts +70 -0
  307. package/dist/meeting/meeting.constants.d.ts.map +1 -1
  308. package/dist/meeting/meeting.constants.js +9 -1
  309. package/dist/meeting/meeting.constants.js.map +1 -1
  310. package/dist/menu/menu.service.d.ts.map +1 -1
  311. package/dist/menu/menu.service.js +29 -9
  312. package/dist/menu/menu.service.js.map +1 -1
  313. package/dist/message-template/dto/update-message-template.dto.d.ts +18 -0
  314. package/dist/message-template/dto/update-message-template.dto.d.ts.map +1 -0
  315. package/dist/message-template/dto/update-message-template.dto.js +38 -0
  316. package/dist/message-template/dto/update-message-template.dto.js.map +1 -0
  317. package/dist/message-template/message-template-admin.service.d.ts +70 -0
  318. package/dist/message-template/message-template-admin.service.d.ts.map +1 -0
  319. package/dist/message-template/message-template-admin.service.js +226 -0
  320. package/dist/message-template/message-template-admin.service.js.map +1 -0
  321. package/dist/message-template/message-template.controller.d.ts +29 -0
  322. package/dist/message-template/message-template.controller.d.ts.map +1 -0
  323. package/dist/message-template/message-template.controller.js +101 -0
  324. package/dist/message-template/message-template.controller.js.map +1 -0
  325. package/dist/message-template/message-template.module.d.ts +10 -0
  326. package/dist/message-template/message-template.module.d.ts.map +1 -0
  327. package/dist/message-template/message-template.module.js +33 -0
  328. package/dist/message-template/message-template.module.js.map +1 -0
  329. package/dist/message-template/message-template.registry.d.ts +55 -0
  330. package/dist/message-template/message-template.registry.d.ts.map +1 -0
  331. package/dist/message-template/message-template.registry.js +64 -0
  332. package/dist/message-template/message-template.registry.js.map +1 -0
  333. package/dist/message-template/message-template.service.d.ts +59 -0
  334. package/dist/message-template/message-template.service.d.ts.map +1 -0
  335. package/dist/message-template/message-template.service.js +166 -0
  336. package/dist/message-template/message-template.service.js.map +1 -0
  337. package/dist/notification/notification.constants.d.ts +11 -0
  338. package/dist/notification/notification.constants.d.ts.map +1 -0
  339. package/dist/notification/notification.constants.js +14 -0
  340. package/dist/notification/notification.constants.js.map +1 -0
  341. package/dist/notification/notification.controller.d.ts +20 -20
  342. package/dist/notification/notification.module.d.ts.map +1 -1
  343. package/dist/notification/notification.module.js +3 -0
  344. package/dist/notification/notification.module.js.map +1 -1
  345. package/dist/notification/notification.service.d.ts +33 -21
  346. package/dist/notification/notification.service.d.ts.map +1 -1
  347. package/dist/notification/notification.service.js +36 -2
  348. package/dist/notification/notification.service.js.map +1 -1
  349. package/dist/oauth/oauth-token-broker.service.d.ts +50 -1
  350. package/dist/oauth/oauth-token-broker.service.d.ts.map +1 -1
  351. package/dist/oauth/oauth-token-broker.service.js +105 -3
  352. package/dist/oauth/oauth-token-broker.service.js.map +1 -1
  353. package/dist/oauth/oauth.controller.d.ts +4 -6
  354. package/dist/oauth/oauth.controller.d.ts.map +1 -1
  355. package/dist/oauth/oauth.controller.js +0 -1
  356. package/dist/oauth/oauth.controller.js.map +1 -1
  357. package/dist/oauth/oauth.errors.d.ts +15 -1
  358. package/dist/oauth/oauth.errors.d.ts.map +1 -1
  359. package/dist/oauth/oauth.errors.js +9 -1
  360. package/dist/oauth/oauth.errors.js.map +1 -1
  361. package/dist/oauth/oauth.module.d.ts.map +1 -1
  362. package/dist/oauth/oauth.module.js +6 -1
  363. package/dist/oauth/oauth.module.js.map +1 -1
  364. package/dist/oauth/oauth.service.d.ts +25 -5
  365. package/dist/oauth/oauth.service.d.ts.map +1 -1
  366. package/dist/oauth/oauth.service.js +63 -27
  367. package/dist/oauth/oauth.service.js.map +1 -1
  368. package/dist/oauth/providers/abstract.provider.d.ts +10 -0
  369. package/dist/oauth/providers/abstract.provider.d.ts.map +1 -1
  370. package/dist/oauth/providers/abstract.provider.js +39 -12
  371. package/dist/oauth/providers/abstract.provider.js.map +1 -1
  372. package/dist/oauth/providers/github.provider.d.ts +1 -1
  373. package/dist/oauth/providers/github.provider.d.ts.map +1 -1
  374. package/dist/oauth/providers/github.provider.js +48 -22
  375. package/dist/oauth/providers/github.provider.js.map +1 -1
  376. package/dist/oauth/providers/microsoft-entra-id.provider.d.ts +6 -0
  377. package/dist/oauth/providers/microsoft-entra-id.provider.d.ts.map +1 -1
  378. package/dist/oauth/providers/microsoft-entra-id.provider.js +36 -4
  379. package/dist/oauth/providers/microsoft-entra-id.provider.js.map +1 -1
  380. package/dist/observability/monitored-cron.d.ts +29 -12
  381. package/dist/observability/monitored-cron.d.ts.map +1 -1
  382. package/dist/observability/monitored-cron.js +131 -46
  383. package/dist/observability/monitored-cron.js.map +1 -1
  384. package/dist/pairing/pairing.service.d.ts +6 -2
  385. package/dist/pairing/pairing.service.d.ts.map +1 -1
  386. package/dist/pdf/document/charts/chart-bar.d.ts +24 -0
  387. package/dist/pdf/document/charts/chart-bar.d.ts.map +1 -0
  388. package/dist/pdf/document/charts/chart-bar.js +117 -0
  389. package/dist/pdf/document/charts/chart-bar.js.map +1 -0
  390. package/dist/pdf/document/charts/chart-donut.d.ts +16 -0
  391. package/dist/pdf/document/charts/chart-donut.d.ts.map +1 -0
  392. package/dist/pdf/document/charts/chart-donut.js +89 -0
  393. package/dist/pdf/document/charts/chart-donut.js.map +1 -0
  394. package/dist/pdf/document/charts/chart-gauge.d.ts +15 -0
  395. package/dist/pdf/document/charts/chart-gauge.d.ts.map +1 -0
  396. package/dist/pdf/document/charts/chart-gauge.js +60 -0
  397. package/dist/pdf/document/charts/chart-gauge.js.map +1 -0
  398. package/dist/pdf/document/charts/chart-line.d.ts +29 -0
  399. package/dist/pdf/document/charts/chart-line.d.ts.map +1 -0
  400. package/dist/pdf/document/charts/chart-line.js +89 -0
  401. package/dist/pdf/document/charts/chart-line.js.map +1 -0
  402. package/dist/pdf/document/charts/chart-primitives.d.ts +64 -0
  403. package/dist/pdf/document/charts/chart-primitives.d.ts.map +1 -0
  404. package/dist/pdf/document/charts/chart-primitives.js +110 -0
  405. package/dist/pdf/document/charts/chart-primitives.js.map +1 -0
  406. package/dist/pdf/document/charts/chart-radar.d.ts +13 -0
  407. package/dist/pdf/document/charts/chart-radar.d.ts.map +1 -0
  408. package/dist/pdf/document/charts/chart-radar.js +83 -0
  409. package/dist/pdf/document/charts/chart-radar.js.map +1 -0
  410. package/dist/pdf/document/charts/chart-scale.d.ts +39 -0
  411. package/dist/pdf/document/charts/chart-scale.d.ts.map +1 -0
  412. package/dist/pdf/document/charts/chart-scale.js +118 -0
  413. package/dist/pdf/document/charts/chart-scale.js.map +1 -0
  414. package/dist/pdf/document/charts/index.d.ts +8 -0
  415. package/dist/pdf/document/charts/index.d.ts.map +1 -0
  416. package/dist/pdf/document/charts/index.js +24 -0
  417. package/dist/pdf/document/charts/index.js.map +1 -0
  418. package/dist/pdf/document/index.d.ts +8 -0
  419. package/dist/pdf/document/index.d.ts.map +1 -0
  420. package/dist/pdf/document/index.js +24 -0
  421. package/dist/pdf/document/index.js.map +1 -0
  422. package/dist/pdf/document/pdf-document.chrome.d.ts +20 -0
  423. package/dist/pdf/document/pdf-document.chrome.d.ts.map +1 -0
  424. package/dist/pdf/document/pdf-document.chrome.js +36 -0
  425. package/dist/pdf/document/pdf-document.chrome.js.map +1 -0
  426. package/dist/pdf/document/pdf-document.css.d.ts +20 -0
  427. package/dist/pdf/document/pdf-document.css.d.ts.map +1 -0
  428. package/dist/pdf/document/pdf-document.css.js +239 -0
  429. package/dist/pdf/document/pdf-document.css.js.map +1 -0
  430. package/dist/pdf/document/pdf-document.renderer.d.ts +10 -0
  431. package/dist/pdf/document/pdf-document.renderer.d.ts.map +1 -0
  432. package/dist/pdf/document/pdf-document.renderer.js +153 -0
  433. package/dist/pdf/document/pdf-document.renderer.js.map +1 -0
  434. package/dist/pdf/document/pdf-document.service.d.ts +27 -0
  435. package/dist/pdf/document/pdf-document.service.d.ts.map +1 -0
  436. package/dist/pdf/document/pdf-document.service.js +81 -0
  437. package/dist/pdf/document/pdf-document.service.js.map +1 -0
  438. package/dist/pdf/document/pdf-document.theme.d.ts +41 -0
  439. package/dist/pdf/document/pdf-document.theme.d.ts.map +1 -0
  440. package/dist/pdf/document/pdf-document.theme.js +105 -0
  441. package/dist/pdf/document/pdf-document.theme.js.map +1 -0
  442. package/dist/pdf/document/pdf-document.types.d.ts +108 -0
  443. package/dist/pdf/document/pdf-document.types.d.ts.map +1 -0
  444. package/dist/pdf/document/pdf-document.types.js +18 -0
  445. package/dist/pdf/document/pdf-document.types.js.map +1 -0
  446. package/dist/pdf/pdf.module.d.ts.map +1 -1
  447. package/dist/pdf/pdf.module.js +3 -2
  448. package/dist/pdf/pdf.module.js.map +1 -1
  449. package/dist/pdf/pdf.service.d.ts +69 -1
  450. package/dist/pdf/pdf.service.d.ts.map +1 -1
  451. package/dist/pdf/pdf.service.js +164 -63
  452. package/dist/pdf/pdf.service.js.map +1 -1
  453. package/dist/pdf/templates/commercial-proposal.template.d.ts +96 -0
  454. package/dist/pdf/templates/commercial-proposal.template.d.ts.map +1 -0
  455. package/dist/pdf/templates/commercial-proposal.template.js +276 -0
  456. package/dist/pdf/templates/commercial-proposal.template.js.map +1 -0
  457. package/dist/profile/dto/change-password.dto.d.ts.map +1 -1
  458. package/dist/profile/dto/change-password.dto.js +4 -6
  459. package/dist/profile/dto/change-password.dto.js.map +1 -1
  460. package/dist/profile/profile.controller.d.ts +1 -1
  461. package/dist/profile/profile.service.d.ts +1 -1
  462. package/dist/profile/profile.service.d.ts.map +1 -1
  463. package/dist/profile/profile.service.js +9 -3
  464. package/dist/profile/profile.service.js.map +1 -1
  465. package/dist/realtime/realtime-tick.coalescer.d.ts +34 -0
  466. package/dist/realtime/realtime-tick.coalescer.d.ts.map +1 -0
  467. package/dist/realtime/realtime-tick.coalescer.js +60 -0
  468. package/dist/realtime/realtime-tick.coalescer.js.map +1 -0
  469. package/dist/realtime/realtime.service.d.ts +2 -0
  470. package/dist/realtime/realtime.service.d.ts.map +1 -1
  471. package/dist/realtime/realtime.service.js +22 -2
  472. package/dist/realtime/realtime.service.js.map +1 -1
  473. package/dist/redis/redis-kv.service.d.ts +90 -0
  474. package/dist/redis/redis-kv.service.d.ts.map +1 -0
  475. package/dist/redis/redis-kv.service.js +247 -0
  476. package/dist/redis/redis-kv.service.js.map +1 -0
  477. package/dist/redis/redis-master.d.ts +29 -0
  478. package/dist/redis/redis-master.d.ts.map +1 -0
  479. package/dist/redis/redis-master.js +81 -0
  480. package/dist/redis/redis-master.js.map +1 -0
  481. package/dist/redis/redis-pubsub.d.ts +12 -0
  482. package/dist/redis/redis-pubsub.d.ts.map +1 -1
  483. package/dist/redis/redis-pubsub.js +25 -2
  484. package/dist/redis/redis-pubsub.js.map +1 -1
  485. package/dist/redis/redis.module.d.ts +11 -0
  486. package/dist/redis/redis.module.d.ts.map +1 -0
  487. package/dist/redis/redis.module.js +30 -0
  488. package/dist/redis/redis.module.js.map +1 -0
  489. package/dist/session/session.controller.d.ts +6 -2
  490. package/dist/session/session.controller.d.ts.map +1 -1
  491. package/dist/session/session.service.d.ts +118 -15
  492. package/dist/session/session.service.d.ts.map +1 -1
  493. package/dist/session/session.service.js +251 -77
  494. package/dist/session/session.service.js.map +1 -1
  495. package/dist/setting/favicon.controller.d.ts +26 -0
  496. package/dist/setting/favicon.controller.d.ts.map +1 -0
  497. package/dist/setting/favicon.controller.js +130 -0
  498. package/dist/setting/favicon.controller.js.map +1 -0
  499. package/dist/setting/setting.controller.d.ts +5 -0
  500. package/dist/setting/setting.controller.d.ts.map +1 -1
  501. package/dist/setting/setting.module.d.ts.map +1 -1
  502. package/dist/setting/setting.module.js +2 -1
  503. package/dist/setting/setting.module.js.map +1 -1
  504. package/dist/setting/setting.service.d.ts +7 -0
  505. package/dist/setting/setting.service.d.ts.map +1 -1
  506. package/dist/setting/setting.service.js +38 -3
  507. package/dist/setting/setting.service.js.map +1 -1
  508. package/dist/task/task.service.d.ts +17 -0
  509. package/dist/task/task.service.d.ts.map +1 -1
  510. package/dist/task/task.service.js +48 -13
  511. package/dist/task/task.service.js.map +1 -1
  512. package/dist/token/token.service.d.ts +19 -1
  513. package/dist/token/token.service.d.ts.map +1 -1
  514. package/dist/token/token.service.js +39 -2
  515. package/dist/token/token.service.js.map +1 -1
  516. package/dist/user/user-credential.util.d.ts +10 -0
  517. package/dist/user/user-credential.util.d.ts.map +1 -1
  518. package/dist/user/user-credential.util.js +14 -1
  519. package/dist/user/user-credential.util.js.map +1 -1
  520. package/dist/user/user.service.d.ts +12 -4
  521. package/dist/user/user.service.d.ts.map +1 -1
  522. package/dist/user/user.service.js +2 -11
  523. package/dist/user/user.service.js.map +1 -1
  524. package/dist/user/user.sort.d.ts +16 -0
  525. package/dist/user/user.sort.d.ts.map +1 -0
  526. package/dist/user/user.sort.js +25 -0
  527. package/dist/user/user.sort.js.map +1 -0
  528. package/dist/utils/abbreviate-name.d.ts +13 -0
  529. package/dist/utils/abbreviate-name.d.ts.map +1 -0
  530. package/dist/utils/abbreviate-name.js +42 -0
  531. package/dist/utils/abbreviate-name.js.map +1 -0
  532. package/dist/utils/date-range-query.dto.d.ts +11 -0
  533. package/dist/utils/date-range-query.dto.d.ts.map +1 -0
  534. package/dist/utils/date-range-query.dto.js +63 -0
  535. package/dist/utils/date-range-query.dto.js.map +1 -0
  536. package/dist/utils/date-range.d.ts +96 -0
  537. package/dist/utils/date-range.d.ts.map +1 -0
  538. package/dist/utils/date-range.js +172 -0
  539. package/dist/utils/date-range.js.map +1 -0
  540. package/dist/webhook-integration/webhook-utils.d.ts.map +1 -1
  541. package/dist/webhook-integration/webhook-utils.js +24 -0
  542. package/dist/webhook-integration/webhook-utils.js.map +1 -1
  543. package/dist/whatsapp-sender/whatsapp-recipients.d.ts +49 -0
  544. package/dist/whatsapp-sender/whatsapp-recipients.d.ts.map +1 -0
  545. package/dist/whatsapp-sender/whatsapp-recipients.js +66 -0
  546. package/dist/whatsapp-sender/whatsapp-recipients.js.map +1 -0
  547. package/dist/whatsapp-sender/whatsapp-sender.service.d.ts +25 -0
  548. package/dist/whatsapp-sender/whatsapp-sender.service.d.ts.map +1 -1
  549. package/dist/whatsapp-sender/whatsapp-sender.service.js +71 -7
  550. package/dist/whatsapp-sender/whatsapp-sender.service.js.map +1 -1
  551. package/hedhog/data/integration_provider.yaml +9 -0
  552. package/hedhog/data/integration_type.yaml +12 -0
  553. package/hedhog/data/locale.yaml +0 -1
  554. package/hedhog/data/mail.yaml +2 -2
  555. package/hedhog/data/mail_layout.yaml +6 -3
  556. package/hedhog/data/menu.yaml +25 -5
  557. package/hedhog/data/route.yaml +148 -0
  558. package/hedhog/data/setting_group.yaml +189 -3
  559. package/hedhog/frontend/app/access-log/page.tsx.ejs +47 -53
  560. package/hedhog/frontend/app/account/components/active-sessions.tsx.ejs +33 -8
  561. package/hedhog/frontend/app/account/components/mcp-tokens.tsx.ejs +54 -13
  562. package/hedhog/frontend/app/account/components/mfa-method-card.tsx.ejs +7 -1
  563. package/hedhog/frontend/app/account/components/recovery-codes-dialog.tsx.ejs +1 -0
  564. package/hedhog/frontend/app/account/components/tokens.tsx.ejs +47 -17
  565. package/hedhog/frontend/app/ai_agent/page.tsx.ejs +46 -5
  566. package/hedhog/frontend/app/ai_instruction/_components/ai-instruction-form.tsx.ejs +101 -30
  567. package/hedhog/frontend/app/ai_instruction/_components/ai-instruction-versions.tsx.ejs +24 -8
  568. package/hedhog/frontend/app/ai_instruction/page.tsx.ejs +80 -15
  569. package/hedhog/frontend/app/configurations/[slug]/components/image-optimization-action.tsx.ejs +166 -0
  570. package/hedhog/frontend/app/configurations/[slug]/components/setting-field.test.tsx.ejs +145 -45
  571. package/hedhog/frontend/app/configurations/[slug]/components/setting-field.tsx.ejs +99 -219
  572. package/hedhog/frontend/app/configurations/[slug]/page.tsx.ejs +19 -1
  573. package/hedhog/frontend/app/configurations/layout.tsx.ejs +19 -5
  574. package/hedhog/frontend/app/dashboard/[slug]/widget-renderer.tsx.ejs +2 -8
  575. package/hedhog/frontend/app/dashboard/components/dynamic-widget.tsx.ejs +3 -0
  576. package/hedhog/frontend/app/dashboard/components/widget-wrapper.tsx.ejs +4 -0
  577. package/hedhog/frontend/app/dashboard/dashboard-home-tabs.tsx.ejs +43 -44
  578. package/hedhog/frontend/app/dashboard/management/tabs/component-roles-tab.tsx.ejs +41 -3
  579. package/hedhog/frontend/app/dashboard/management/tabs/components-tab.tsx.ejs +42 -2
  580. package/hedhog/frontend/app/dashboard/management/tabs/dashboard-roles-tab.tsx.ejs +41 -3
  581. package/hedhog/frontend/app/dashboard/management/tabs/dashboards-tab.tsx.ejs +39 -4
  582. package/hedhog/frontend/app/dashboard/management/tabs/items-tab.tsx.ejs +42 -3
  583. package/hedhog/frontend/app/incidents/page.tsx.ejs +60 -31
  584. package/hedhog/frontend/app/integration/profiles/page.tsx.ejs +45 -5
  585. package/hedhog/frontend/app/integrations-webhooks/page.tsx.ejs +92 -15
  586. package/hedhog/frontend/app/mail/log/page.tsx.ejs +109 -61
  587. package/hedhog/frontend/app/mail/template/page.tsx.ejs +125 -23
  588. package/hedhog/frontend/app/mcp_chat/chat-components.tsx.ejs +13 -15
  589. package/hedhog/frontend/app/mcp_chat/page.tsx.ejs +116 -110
  590. package/hedhog/frontend/app/message-templates/_components/message-template-sheet.tsx.ejs +245 -0
  591. package/hedhog/frontend/app/message-templates/_lib/types.ts.ejs +24 -0
  592. package/hedhog/frontend/app/message-templates/page.tsx.ejs +182 -0
  593. package/hedhog/frontend/app/pages/_components/page-wizard-sheet.tsx.ejs +1 -0
  594. package/hedhog/frontend/app/pages/page.tsx.ejs +94 -9
  595. package/hedhog/frontend/app/roles/menus.tsx.ejs +4 -4
  596. package/hedhog/frontend/app/roles/routes.tsx.ejs +4 -4
  597. package/hedhog/frontend/app/roles/users.tsx.ejs +4 -4
  598. package/hedhog/frontend/app/setting-list/page.tsx.ejs +71 -9
  599. package/hedhog/frontend/app/users/page.tsx.ejs +77 -67
  600. package/hedhog/frontend/messages/en.json +237 -37
  601. package/hedhog/frontend/messages/pt.json +237 -37
  602. package/hedhog/table/cron_lock.yaml +17 -0
  603. package/hedhog/table/file.yaml +13 -1
  604. package/hedhog/table/file_upload_chunk.yaml +23 -0
  605. package/hedhog/table/file_upload_ticket.yaml +67 -0
  606. package/hedhog/table/mcp_tool_call_log.yaml +30 -22
  607. package/hedhog/table/message_template.yaml +33 -0
  608. package/hedhog/table/setting.yaml +8 -0
  609. package/hedhog/table/user_session.yaml +36 -1
  610. package/package.json +5 -3
  611. package/src/ai/ai-agent.sort.ts +21 -0
  612. package/src/ai/ai-attachment.fragments.spec.ts +56 -3
  613. package/src/ai/ai.service.responses.spec.ts +429 -0
  614. package/src/ai/ai.service.spec.ts +173 -1
  615. package/src/ai/ai.service.ts +473 -220
  616. package/src/ai-instruction/ai-instruction.service.ts +32 -28
  617. package/src/ai-instruction/ai-instruction.sort.ts +32 -0
  618. package/src/ai-instruction/ai-prompt-resolver.service.spec.ts +44 -0
  619. package/src/ai-instruction/ai-prompt-resolver.service.ts +29 -0
  620. package/src/auth/auth.module.ts +8 -1
  621. package/src/auth/auth.service.spec.ts +108 -1
  622. package/src/auth/auth.service.ts +59 -5
  623. package/src/auth/guards/auth.guard.ts +9 -1
  624. package/src/authorize/authorize.controller.ts +126 -11
  625. package/src/authorize/authorize.errors.ts +55 -0
  626. package/src/authorize/authorize.module.ts +6 -1
  627. package/src/authorize/authorize.service.spec.ts +379 -7
  628. package/src/authorize/authorize.service.ts +309 -23
  629. package/src/authorize/dto/authorize-info.dto.ts +21 -3
  630. package/src/authorize/dto/consent.dto.ts +21 -3
  631. package/src/authorize/dto/token.dto.ts +24 -2
  632. package/src/authorize/oauth-exception.filter.ts +58 -0
  633. package/src/authorize/oauth-metadata.service.ts +67 -0
  634. package/src/authorize/well-known.controller.spec.ts +84 -0
  635. package/src/authorize/well-known.controller.ts +96 -0
  636. package/src/captcha/captcha.service.spec.ts +211 -4
  637. package/src/captcha/captcha.service.ts +127 -10
  638. package/src/core.module.ts +9 -0
  639. package/src/dashboard/dashboard-component-role/dashboard-component-role.service.ts +2 -3
  640. package/src/dashboard/dashboard-component-role/dashboard-component-role.sort.ts +18 -0
  641. package/src/dashboard/dashboard-item/dashboard-item.service.ts +2 -3
  642. package/src/dashboard/dashboard-item/dashboard-item.sort.ts +19 -0
  643. package/src/dashboard/dashboard-role/dashboard-role.service.ts +2 -3
  644. package/src/dashboard/dashboard-role/dashboard-role.sort.ts +16 -0
  645. package/src/document-kit/document-kit.module.ts +12 -0
  646. package/src/document-kit/document-kit.registry.ts +125 -0
  647. package/src/document-kit/document-kit.service.spec.ts +156 -0
  648. package/src/document-kit/document-kit.service.ts +173 -0
  649. package/src/file/file-upload-ticket.service.spec.ts +422 -0
  650. package/src/file/file-upload-ticket.service.ts +513 -0
  651. package/src/file/file.controller.ts +65 -0
  652. package/src/file/file.module.ts +14 -2
  653. package/src/file/file.service.spec.ts +262 -1
  654. package/src/file/file.service.ts +505 -87
  655. package/src/file/filename-encoding.util.spec.ts +54 -0
  656. package/src/file/filename-encoding.util.ts +67 -0
  657. package/src/file/image-optimization.service.spec.ts +156 -19
  658. package/src/file/image-optimization.service.ts +106 -21
  659. package/src/file/mcp-file-source.schema.ts +86 -0
  660. package/src/file/mcp-file-source.service.spec.ts +473 -0
  661. package/src/file/mcp-file-source.service.ts +445 -0
  662. package/src/file/mimetype-sniff.util.spec.ts +126 -0
  663. package/src/file/mimetype-sniff.util.ts +265 -0
  664. package/src/file/remote-fetch.util.spec.ts +117 -0
  665. package/src/file/remote-fetch.util.ts +330 -0
  666. package/src/impersonation/dto/start-impersonation.dto.ts +5 -2
  667. package/src/impersonation/impersonation.service.spec.ts +24 -1
  668. package/src/impersonation/impersonation.service.ts +14 -4
  669. package/src/incident/incident.controller.ts +9 -1
  670. package/src/incident/incident.service.ts +7 -0
  671. package/src/index.ts +23 -1
  672. package/src/integration-profile/integration-profile.secrets.ts +28 -0
  673. package/src/integration-profile/integration-profile.service.ts +7 -64
  674. package/src/integration-profile/integration-profile.utils.spec.ts +9 -0
  675. package/src/integration-profile/integration-profile.utils.ts +5 -5
  676. package/src/integration-profile/testers/ai.testers.ts +70 -5
  677. package/src/integration-profile/testers/index.ts +2 -0
  678. package/src/integration-profile/testers/remaining.testers.spec.ts +144 -1
  679. package/src/integration-profile/testers/shipping.testers.ts +94 -0
  680. package/src/integration-profile/testers/tester-coverage.spec.ts +10 -0
  681. package/src/mail/dto/send.dto.ts +6 -1
  682. package/src/mail/mail-template.spec.ts +58 -1
  683. package/src/mail/mail.service.spec.ts +112 -0
  684. package/src/mail/mail.service.ts +42 -4
  685. package/src/mail-sent/mail-sent.service.ts +3 -0
  686. package/src/mail-sent/mail-sent.sort.ts +19 -0
  687. package/src/mcp/filters/mcp-challenge.filter.spec.ts +76 -0
  688. package/src/mcp/filters/mcp-challenge.filter.ts +70 -0
  689. package/src/mcp/guards/mcp-auth.guard.spec.ts +51 -2
  690. package/src/mcp/guards/mcp-auth.guard.ts +24 -1
  691. package/src/mcp/guards/mcp-permission.guard.spec.ts +109 -15
  692. package/src/mcp/guards/mcp-permission.guard.ts +76 -51
  693. package/src/mcp/mcp-audit.service.spec.ts +107 -0
  694. package/src/mcp/mcp-audit.service.ts +37 -1
  695. package/src/mcp/mcp-permission.service.spec.ts +197 -0
  696. package/src/mcp/mcp-permission.service.ts +184 -0
  697. package/src/mcp/mcp-server.service.spec.ts +84 -2
  698. package/src/mcp/mcp-server.service.ts +111 -87
  699. package/src/mcp/mcp.controller.ts +8 -1
  700. package/src/mcp/mcp.module.ts +7 -1
  701. package/src/mcp/tools/core-access-log.mcp-tools.ts +66 -0
  702. package/src/mcp/tools/core-ai.mcp-tools.ts +1 -1
  703. package/src/mcp/tools/core-dashboard-items.mcp-tools.ts +1 -1
  704. package/src/mcp/tools/core-dashboard.mcp-tools.ts +1 -1
  705. package/src/mcp/tools/core-event-webhooks.mcp-tools.ts +1 -2
  706. package/src/mcp/tools/core-files.mcp-tools.ts +202 -22
  707. package/src/mcp/tools/core-integration-events.mcp-tools.ts +1 -1
  708. package/src/mcp/tools/core-mail-sent.mcp-tools.ts +1 -1
  709. package/src/mcp/tools/core-mail.mcp-tools.ts +1 -1
  710. package/src/mcp/tools/core-menus.mcp-tools.ts +1 -2
  711. package/src/mcp/tools/core-notifications.mcp-tools.ts +0 -1
  712. package/src/mcp/tools/core-roles.mcp-tools.ts +1 -5
  713. package/src/mcp/tools/core-routes.mcp-tools.ts +1 -3
  714. package/src/mcp/tools/core-screens.mcp-tools.ts +1 -3
  715. package/src/mcp/tools/core-sessions.mcp-tools.ts +0 -2
  716. package/src/mcp/tools/core-settings.mcp-tools.ts +1 -2
  717. package/src/mcp/tools/core-users.mcp-tools.ts +1 -1
  718. package/src/mcp/tools/core-webhooks.mcp-tools.ts +1 -2
  719. package/src/mcp/types/mcp-context.type.ts +15 -6
  720. package/src/mcp-chat/mcp-chat.service.ts +8 -0
  721. package/src/meeting/meeting-provider.registry.ts +201 -0
  722. package/src/meeting/meeting.constants.ts +74 -0
  723. package/src/menu/menu.service.spec.ts +89 -0
  724. package/src/menu/menu.service.ts +29 -11
  725. package/src/message-template/dto/update-message-template.dto.ts +22 -0
  726. package/src/message-template/message-template-admin.service.spec.ts +163 -0
  727. package/src/message-template/message-template-admin.service.ts +239 -0
  728. package/src/message-template/message-template.controller.ts +52 -0
  729. package/src/message-template/message-template.module.ts +21 -0
  730. package/src/message-template/message-template.registry.spec.ts +62 -0
  731. package/src/message-template/message-template.registry.ts +125 -0
  732. package/src/message-template/message-template.service.spec.ts +149 -0
  733. package/src/message-template/message-template.service.ts +149 -0
  734. package/src/notification/notification.constants.ts +10 -0
  735. package/src/notification/notification.module.ts +3 -0
  736. package/src/notification/notification.service.spec.ts +75 -1
  737. package/src/notification/notification.service.ts +39 -1
  738. package/src/oauth/oauth-token-broker.service.spec.ts +108 -0
  739. package/src/oauth/oauth-token-broker.service.ts +129 -2
  740. package/src/oauth/oauth.controller.ts +0 -1
  741. package/src/oauth/oauth.errors.ts +7 -0
  742. package/src/oauth/oauth.module.ts +6 -1
  743. package/src/oauth/oauth.service.spec.ts +58 -7
  744. package/src/oauth/oauth.service.ts +71 -32
  745. package/src/oauth/providers/abstract.provider.spec.ts +192 -0
  746. package/src/oauth/providers/abstract.provider.ts +46 -14
  747. package/src/oauth/providers/github.provider.ts +57 -34
  748. package/src/oauth/providers/microsoft-entra-id.provider.spec.ts +133 -0
  749. package/src/oauth/providers/microsoft-entra-id.provider.ts +37 -3
  750. package/src/observability/monitored-cron.spec.ts +164 -31
  751. package/src/observability/monitored-cron.ts +154 -62
  752. package/src/pdf/document/charts/chart-bar.ts +217 -0
  753. package/src/pdf/document/charts/chart-donut.ts +163 -0
  754. package/src/pdf/document/charts/chart-gauge.ts +94 -0
  755. package/src/pdf/document/charts/chart-line.ts +159 -0
  756. package/src/pdf/document/charts/chart-primitives.ts +188 -0
  757. package/src/pdf/document/charts/chart-radar.ts +136 -0
  758. package/src/pdf/document/charts/chart-scale.spec.ts +93 -0
  759. package/src/pdf/document/charts/chart-scale.ts +141 -0
  760. package/src/pdf/document/charts/charts.spec.ts +157 -0
  761. package/src/pdf/document/charts/index.ts +7 -0
  762. package/src/pdf/document/index.ts +7 -0
  763. package/src/pdf/document/pdf-document.chrome.ts +38 -0
  764. package/src/pdf/document/pdf-document.css.ts +238 -0
  765. package/src/pdf/document/pdf-document.renderer.spec.ts +129 -0
  766. package/src/pdf/document/pdf-document.renderer.ts +215 -0
  767. package/src/pdf/document/pdf-document.service.ts +77 -0
  768. package/src/pdf/document/pdf-document.theme.ts +146 -0
  769. package/src/pdf/document/pdf-document.types.ts +97 -0
  770. package/src/pdf/pdf.module.ts +3 -2
  771. package/src/pdf/pdf.service.spec.ts +131 -0
  772. package/src/pdf/pdf.service.ts +245 -82
  773. package/src/pdf/templates/commercial-proposal.template.spec.ts +177 -0
  774. package/src/pdf/templates/commercial-proposal.template.ts +400 -0
  775. package/src/profile/dto/change-password.dto.ts +25 -7
  776. package/src/profile/profile.service.spec.ts +97 -0
  777. package/src/profile/profile.service.ts +9 -3
  778. package/src/realtime/realtime-tick.coalescer.spec.ts +92 -0
  779. package/src/realtime/realtime-tick.coalescer.ts +60 -0
  780. package/src/realtime/realtime.service.spec.ts +33 -0
  781. package/src/realtime/realtime.service.ts +28 -2
  782. package/src/redis/redis-kv.service.ts +261 -0
  783. package/src/redis/redis-master.spec.ts +111 -0
  784. package/src/redis/redis-master.ts +86 -0
  785. package/src/redis/redis-pubsub.ts +27 -3
  786. package/src/redis/redis.module.ts +17 -0
  787. package/src/session/session.service.spec.ts +121 -42
  788. package/src/session/session.service.ts +279 -82
  789. package/src/setting/favicon.controller.spec.ts +92 -0
  790. package/src/setting/favicon.controller.ts +135 -0
  791. package/src/setting/setting.module.ts +2 -1
  792. package/src/setting/setting.service.ts +44 -3
  793. package/src/task/task.service.spec.ts +41 -0
  794. package/src/task/task.service.ts +53 -13
  795. package/src/token/token.service.spec.ts +90 -0
  796. package/src/token/token.service.ts +48 -2
  797. package/src/user/user-credential.util.ts +14 -5
  798. package/src/user/user.service.ts +2 -12
  799. package/src/user/user.sort.ts +25 -0
  800. package/src/utils/abbreviate-name.spec.ts +50 -0
  801. package/src/utils/abbreviate-name.ts +44 -0
  802. package/src/utils/date-range-query.dto.ts +56 -0
  803. package/src/utils/date-range.spec.ts +175 -0
  804. package/src/utils/date-range.ts +246 -0
  805. package/src/webhook-integration/webhook-utils.spec.ts +67 -0
  806. package/src/webhook-integration/webhook-utils.ts +26 -0
  807. package/src/whatsapp-sender/whatsapp-recipients.spec.ts +89 -0
  808. package/src/whatsapp-sender/whatsapp-recipients.ts +83 -0
  809. package/src/whatsapp-sender/whatsapp-sender.service.spec.ts +185 -0
  810. package/src/whatsapp-sender/whatsapp-sender.service.ts +90 -7
  811. package/hedhog/query/device_pairing_request.sql +0 -46
  812. package/hedhog/query/impersonation_grant.sql +0 -71
  813. package/hedhog/query/oauth_authorize_pkce.sql +0 -58
  814. package/hedhog/query/oauth_mobile_state_token.sql +0 -30
  815. package/hedhog/query/oauth_web_ref_token.sql +0 -25
@@ -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 { provider, model, content };
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 = stored.model || aiProfile.model || this.getDefaultModel(provider);
140
- const timeoutMs = (_a = aiProfile.timeoutMs) !== null && _a !== void 0 ? _a : DEFAULT_AI_CALL_TIMEOUT_MS;
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: (_b = stored.temperature) !== null && _b !== void 0 ? _b : (_c = input.params) === null || _c === void 0 ? void 0 : _c.temperature,
143
- maxTokens: (_d = stored.maxTokens) !== null && _d !== void 0 ? _d : (_e = input.params) === null || _e === void 0 ? void 0 : _e.maxTokens,
144
- responseFormat: (_f = input.params) === null || _f === void 0 ? void 0 : _f.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
- return { provider, model, content, promptSources };
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 externalAgentId = null;
190
- if (provider === 'openai') {
191
- externalAgentId = await this.createOpenAiAssistant({
192
- slug,
193
- model,
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
- ${externalAgentId}
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 offset = (page - 1) * pageSize;
300
+ const skip = (page - 1) * pageSize;
241
301
  const search = String((paginationParams === null || paginationParams === void 0 ? void 0 : paginationParams.search) || '').trim();
242
- const whereClause = search
243
- ? api_prisma_1.Prisma.sql `WHERE LOWER(slug) LIKE LOWER(${`%${search}%`})`
244
- : api_prisma_1.Prisma.empty;
245
- const data = await this.prismaService.$queryRaw(api_prisma_1.Prisma.sql `
246
- SELECT id, slug, provider, model, instructions, external_agent_id, created_at, updated_at
247
- FROM ai_agent
248
- ${whereClause}
249
- ORDER BY id DESC
250
- LIMIT ${pageSize}
251
- OFFSET ${offset}
252
- `);
253
- const totalResult = await this.prismaService.$queryRaw(api_prisma_1.Prisma.sql `
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
- let externalAgentId = currentAgent.external_agent_id;
291
- if (provider !== 'openai') {
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 = ${externalAgentId},
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
- if (agent.provider === 'openai' && agent.external_agent_id && !attachment) {
339
- const content = await this.chatWithOpenAiAssistant(agent.external_agent_id, data.message);
340
- return {
341
- slug: agent.slug,
342
- provider: agent.provider,
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 { content } = await this.chatWithProvider(agent.provider, {
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.warn(`[AI-ATTACHMENT-DEBUG] fileId=${fileId || 'upload'} filename="${result.filename}" mime=${result.mimeType} mode=${result.mode} bytes=${result.bytes} textLength=${result.textLength}`);
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
- return (await this.loadAiProfileBySlug(profileSlug)).config;
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: (_a = params === null || params === void 0 ? void 0 : params.temperature) !== null && _a !== void 0 ? _a : null, maxTokens: (_b = params === null || params === void 0 ? void 0 : params.maxTokens) !== null && _b !== void 0 ? _b : null }, { model, jsonObject: (params === null || params === void 0 ? void 0 : params.responseFormat) === 'json_object' });
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 = (_c = response.data) === null || _c === void 0 ? void 0 : _c.usage;
666
+ const u = (_h = response.data) === null || _h === void 0 ? void 0 : _h.usage;
561
667
  return {
562
- content: ((_g = (_f = (_e = (_d = response.data) === null || _d === void 0 ? void 0 : _d.choices) === null || _e === void 0 ? void 0 : _e[0]) === null || _f === void 0 ? void 0 : _f.message) === null || _g === void 0 ? void 0 : _g.content) || '',
563
- usage: u ? { input: (_h = u.prompt_tokens) !== null && _h !== void 0 ? _h : 0, output: (_j = u.completion_tokens) !== null && _j !== void 0 ? _j : 0, total: (_k = u.total_tokens) !== null && _k !== void 0 ? _k : 0 } : undefined,
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
- { type: 'text', text: message },
780
- { type: 'image_url', image_url: { url: dataUri } },
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
- text =
789
- (await this.extractPdfText(attachment.buffer)) ||
790
- (0, ai_attachment_fragments_1.unreadablePdfMarker)(attachment.filename);
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 `${message}${(0, ai_attachment_fragments_1.attachedFileBlock)(attachment.filename, text)}`;
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))),