@hed-hog/core 0.0.387 → 0.0.393

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 (935) hide show
  1. package/README.md +51 -11
  2. package/dist/access-log/access-log.controller.d.ts.map +1 -1
  3. package/dist/access-log/access-log.controller.js +1 -1
  4. package/dist/access-log/access-log.controller.js.map +1 -1
  5. package/dist/access-log/access-log.interceptor.d.ts.map +1 -1
  6. package/dist/access-log/access-log.interceptor.js +11 -6
  7. package/dist/access-log/access-log.interceptor.js.map +1 -1
  8. package/dist/access-log/access-log.service.d.ts +4 -0
  9. package/dist/access-log/access-log.service.d.ts.map +1 -1
  10. package/dist/access-log/access-log.service.js +31 -4
  11. package/dist/access-log/access-log.service.js.map +1 -1
  12. package/dist/access-log/dto/query-access-log.dto.d.ts +2 -0
  13. package/dist/access-log/dto/query-access-log.dto.d.ts.map +1 -1
  14. package/dist/access-log/dto/query-access-log.dto.js +5 -0
  15. package/dist/access-log/dto/query-access-log.dto.js.map +1 -1
  16. package/dist/ai/ai-attachment.fragments.d.ts +23 -0
  17. package/dist/ai/ai-attachment.fragments.d.ts.map +1 -0
  18. package/dist/ai/ai-attachment.fragments.js +34 -0
  19. package/dist/ai/ai-attachment.fragments.js.map +1 -0
  20. package/dist/ai/ai.controller.d.ts +12 -17
  21. package/dist/ai/ai.controller.d.ts.map +1 -1
  22. package/dist/ai/ai.controller.js +17 -2
  23. package/dist/ai/ai.controller.js.map +1 -1
  24. package/dist/ai/ai.module.d.ts.map +1 -1
  25. package/dist/ai/ai.module.js +3 -2
  26. package/dist/ai/ai.module.js.map +1 -1
  27. package/dist/ai/ai.prompts.d.ts +16 -0
  28. package/dist/ai/ai.prompts.d.ts.map +1 -0
  29. package/dist/ai/ai.prompts.js +37 -0
  30. package/dist/ai/ai.prompts.js.map +1 -0
  31. package/dist/ai/ai.service.d.ts +92 -12
  32. package/dist/ai/ai.service.d.ts.map +1 -1
  33. package/dist/ai/ai.service.js +309 -88
  34. package/dist/ai/ai.service.js.map +1 -1
  35. package/dist/ai/dto/chat.dto.d.ts +4 -1
  36. package/dist/ai/dto/chat.dto.d.ts.map +1 -1
  37. package/dist/ai/dto/chat.dto.js +23 -1
  38. package/dist/ai/dto/chat.dto.js.map +1 -1
  39. package/dist/ai/dto/create-agent.dto.d.ts +1 -1
  40. package/dist/ai/dto/create-agent.dto.d.ts.map +1 -1
  41. package/dist/ai/dto/create-agent.dto.js +1 -1
  42. package/dist/ai/dto/create-agent.dto.js.map +1 -1
  43. package/dist/ai/dto/richtext-edit-html.dto.d.ts +5 -0
  44. package/dist/ai/dto/richtext-edit-html.dto.d.ts.map +1 -0
  45. package/dist/ai/dto/richtext-edit-html.dto.js +27 -0
  46. package/dist/ai/dto/richtext-edit-html.dto.js.map +1 -0
  47. package/dist/ai/dto/update-agent.dto.d.ts +1 -1
  48. package/dist/ai/dto/update-agent.dto.d.ts.map +1 -1
  49. package/dist/ai/dto/update-agent.dto.js +1 -1
  50. package/dist/ai/dto/update-agent.dto.js.map +1 -1
  51. package/dist/ai/richtext-ai.prompts.d.ts +5 -0
  52. package/dist/ai/richtext-ai.prompts.d.ts.map +1 -0
  53. package/dist/ai/richtext-ai.prompts.js +57 -0
  54. package/dist/ai/richtext-ai.prompts.js.map +1 -0
  55. package/dist/ai/richtext-ai.service.d.ts +34 -0
  56. package/dist/ai/richtext-ai.service.d.ts.map +1 -0
  57. package/dist/ai/richtext-ai.service.js +95 -0
  58. package/dist/ai/richtext-ai.service.js.map +1 -0
  59. package/dist/ai-instruction/ai-instruction.controller.d.ts +59 -5
  60. package/dist/ai-instruction/ai-instruction.controller.d.ts.map +1 -1
  61. package/dist/ai-instruction/ai-instruction.controller.js +63 -20
  62. package/dist/ai-instruction/ai-instruction.controller.js.map +1 -1
  63. package/dist/ai-instruction/ai-instruction.module.d.ts.map +1 -1
  64. package/dist/ai-instruction/ai-instruction.module.js +13 -2
  65. package/dist/ai-instruction/ai-instruction.module.js.map +1 -1
  66. package/dist/ai-instruction/ai-instruction.service.d.ts +131 -6
  67. package/dist/ai-instruction/ai-instruction.service.d.ts.map +1 -1
  68. package/dist/ai-instruction/ai-instruction.service.js +533 -60
  69. package/dist/ai-instruction/ai-instruction.service.js.map +1 -1
  70. package/dist/ai-instruction/ai-prompt-builder.service.d.ts +8 -0
  71. package/dist/ai-instruction/ai-prompt-builder.service.d.ts.map +1 -1
  72. package/dist/ai-instruction/ai-prompt-builder.service.js +10 -1
  73. package/dist/ai-instruction/ai-prompt-builder.service.js.map +1 -1
  74. package/dist/ai-instruction/ai-prompt-registry.d.ts +45 -0
  75. package/dist/ai-instruction/ai-prompt-registry.d.ts.map +1 -0
  76. package/dist/ai-instruction/ai-prompt-registry.js +49 -0
  77. package/dist/ai-instruction/ai-prompt-registry.js.map +1 -0
  78. package/dist/ai-instruction/ai-prompt-resolver.service.d.ts +89 -0
  79. package/dist/ai-instruction/ai-prompt-resolver.service.d.ts.map +1 -0
  80. package/dist/ai-instruction/ai-prompt-resolver.service.js +222 -0
  81. package/dist/ai-instruction/ai-prompt-resolver.service.js.map +1 -0
  82. package/dist/ai-instruction/ai-prompt-template.util.d.ts +70 -0
  83. package/dist/ai-instruction/ai-prompt-template.util.d.ts.map +1 -0
  84. package/dist/ai-instruction/ai-prompt-template.util.js +154 -0
  85. package/dist/ai-instruction/ai-prompt-template.util.js.map +1 -0
  86. package/dist/ai-instruction/dto/create-ai-instruction.dto.d.ts +5 -0
  87. package/dist/ai-instruction/dto/create-ai-instruction.dto.d.ts.map +1 -1
  88. package/dist/ai-instruction/dto/create-ai-instruction.dto.js +27 -1
  89. package/dist/ai-instruction/dto/create-ai-instruction.dto.js.map +1 -1
  90. package/dist/ai-instruction/dto/preview-ai-instruction.dto.d.ts +14 -0
  91. package/dist/ai-instruction/dto/preview-ai-instruction.dto.d.ts.map +1 -0
  92. package/dist/ai-instruction/dto/preview-ai-instruction.dto.js +42 -0
  93. package/dist/ai-instruction/dto/preview-ai-instruction.dto.js.map +1 -0
  94. package/dist/ai-instruction/dto/update-ai-instruction.dto.d.ts +11 -0
  95. package/dist/ai-instruction/dto/update-ai-instruction.dto.d.ts.map +1 -1
  96. package/dist/ai-instruction/dto/update-ai-instruction.dto.js +34 -0
  97. package/dist/ai-instruction/dto/update-ai-instruction.dto.js.map +1 -1
  98. package/dist/ai-instruction/types/ai-instruction.types.d.ts +13 -1
  99. package/dist/ai-instruction/types/ai-instruction.types.d.ts.map +1 -1
  100. package/dist/ai-instruction/types/ai-instruction.types.js +10 -0
  101. package/dist/ai-instruction/types/ai-instruction.types.js.map +1 -1
  102. package/dist/auth/auth.controller.d.ts +89 -15
  103. package/dist/auth/auth.controller.d.ts.map +1 -1
  104. package/dist/auth/auth.controller.js +116 -44
  105. package/dist/auth/auth.controller.js.map +1 -1
  106. package/dist/auth/auth.module.d.ts.map +1 -1
  107. package/dist/auth/auth.module.js +2 -0
  108. package/dist/auth/auth.module.js.map +1 -1
  109. package/dist/auth/auth.service.d.ts +169 -12
  110. package/dist/auth/auth.service.d.ts.map +1 -1
  111. package/dist/auth/auth.service.js +314 -67
  112. package/dist/auth/auth.service.js.map +1 -1
  113. package/dist/auth/dto/confirm-email.dto.d.ts +4 -0
  114. package/dist/auth/dto/confirm-email.dto.d.ts.map +1 -0
  115. package/dist/auth/dto/confirm-email.dto.js +22 -0
  116. package/dist/auth/dto/confirm-email.dto.js.map +1 -0
  117. package/dist/auth/dto/resend-confirmation.dto.d.ts +8 -0
  118. package/dist/auth/dto/resend-confirmation.dto.d.ts.map +1 -0
  119. package/dist/auth/dto/resend-confirmation.dto.js +36 -0
  120. package/dist/auth/dto/resend-confirmation.dto.js.map +1 -0
  121. package/dist/authorize/authorize.controller.d.ts +1 -1
  122. package/dist/authorize/authorize.controller.d.ts.map +1 -1
  123. package/dist/authorize/authorize.controller.js +4 -2
  124. package/dist/authorize/authorize.controller.js.map +1 -1
  125. package/dist/authorize/authorize.service.d.ts +7 -0
  126. package/dist/authorize/authorize.service.d.ts.map +1 -1
  127. package/dist/authorize/authorize.service.js +1 -1
  128. package/dist/authorize/authorize.service.js.map +1 -1
  129. package/dist/captcha/captcha.module.d.ts +3 -0
  130. package/dist/captcha/captcha.module.d.ts.map +1 -0
  131. package/dist/captcha/captcha.module.js +23 -0
  132. package/dist/captcha/captcha.module.js.map +1 -0
  133. package/dist/captcha/captcha.service.d.ts +38 -0
  134. package/dist/captcha/captcha.service.d.ts.map +1 -0
  135. package/dist/captcha/captcha.service.js +144 -0
  136. package/dist/captcha/captcha.service.js.map +1 -0
  137. package/dist/challenge/challenge.service.d.ts +31 -9
  138. package/dist/challenge/challenge.service.d.ts.map +1 -1
  139. package/dist/challenge/challenge.service.js +111 -16
  140. package/dist/challenge/challenge.service.js.map +1 -1
  141. package/dist/core.module.d.ts +3 -1
  142. package/dist/core.module.d.ts.map +1 -1
  143. package/dist/core.module.js +46 -2
  144. package/dist/core.module.js.map +1 -1
  145. package/dist/dashboard/dashboard/dashboard.controller.d.ts +21 -21
  146. package/dist/dashboard/dashboard/dashboard.service.d.ts +21 -21
  147. package/dist/dashboard/dashboard-component/dashboard-component.controller.d.ts +10 -10
  148. package/dist/dashboard/dashboard-component/dashboard-component.service.d.ts +10 -10
  149. package/dist/dashboard/dashboard-component-role/dashboard-component-role.controller.d.ts +20 -20
  150. package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.d.ts +20 -20
  151. package/dist/dashboard/dashboard-core/dashboard-core.controller.d.ts +3 -3
  152. package/dist/dashboard/dashboard-core/dashboard-core.service.d.ts +3 -3
  153. package/dist/dashboard/dashboard-item/dashboard-item.controller.d.ts +2 -2
  154. package/dist/dashboard/dashboard-item/dashboard-item.service.d.ts +2 -2
  155. package/dist/dashboard/dashboard-role/dashboard-role.controller.d.ts +13 -13
  156. package/dist/dashboard/dashboard-role/dashboard-role.service.d.ts +13 -13
  157. package/dist/file/file.controller.d.ts +8 -1
  158. package/dist/file/file.controller.d.ts.map +1 -1
  159. package/dist/file/file.controller.js +45 -7
  160. package/dist/file/file.controller.js.map +1 -1
  161. package/dist/file/file.service.d.ts +134 -1
  162. package/dist/file/file.service.d.ts.map +1 -1
  163. package/dist/file/file.service.js +363 -12
  164. package/dist/file/file.service.js.map +1 -1
  165. package/dist/file/image-optimization.service.d.ts +43 -0
  166. package/dist/file/image-optimization.service.d.ts.map +1 -1
  167. package/dist/file/image-optimization.service.js +154 -0
  168. package/dist/file/image-optimization.service.js.map +1 -1
  169. package/dist/file/provider/abstract.provider.d.ts +16 -0
  170. package/dist/file/provider/abstract.provider.d.ts.map +1 -1
  171. package/dist/file/provider/abstract.provider.js +4 -0
  172. package/dist/file/provider/abstract.provider.js.map +1 -1
  173. package/dist/file/provider/gcs.provider.d.ts +2 -0
  174. package/dist/file/provider/gcs.provider.d.ts.map +1 -1
  175. package/dist/file/provider/gcs.provider.js +10 -0
  176. package/dist/file/provider/gcs.provider.js.map +1 -1
  177. package/dist/file/provider/local.provider.d.ts +1 -0
  178. package/dist/file/provider/local.provider.d.ts.map +1 -1
  179. package/dist/file/provider/local.provider.js +13 -0
  180. package/dist/file/provider/local.provider.js.map +1 -1
  181. package/dist/file/provider/s3.provider.d.ts +5 -0
  182. package/dist/file/provider/s3.provider.d.ts.map +1 -1
  183. package/dist/file/provider/s3.provider.js +15 -0
  184. package/dist/file/provider/s3.provider.js.map +1 -1
  185. package/dist/file/provider/spaces.provider.d.ts +5 -0
  186. package/dist/file/provider/spaces.provider.d.ts.map +1 -1
  187. package/dist/file/provider/spaces.provider.js +16 -0
  188. package/dist/file/provider/spaces.provider.js.map +1 -1
  189. package/dist/impersonation/dto/redeem-impersonation.dto.d.ts +4 -0
  190. package/dist/impersonation/dto/redeem-impersonation.dto.d.ts.map +1 -0
  191. package/dist/impersonation/dto/redeem-impersonation.dto.js +23 -0
  192. package/dist/impersonation/dto/redeem-impersonation.dto.js.map +1 -0
  193. package/dist/impersonation/dto/start-impersonation.dto.d.ts +7 -0
  194. package/dist/impersonation/dto/start-impersonation.dto.d.ts.map +1 -0
  195. package/dist/impersonation/dto/start-impersonation.dto.js +27 -0
  196. package/dist/impersonation/dto/start-impersonation.dto.js.map +1 -0
  197. package/dist/impersonation/impersonation-restrictions.d.ts +26 -0
  198. package/dist/impersonation/impersonation-restrictions.d.ts.map +1 -0
  199. package/dist/impersonation/impersonation-restrictions.js +76 -0
  200. package/dist/impersonation/impersonation-restrictions.js.map +1 -0
  201. package/dist/impersonation/impersonation.controller.d.ts +90 -0
  202. package/dist/impersonation/impersonation.controller.d.ts.map +1 -0
  203. package/dist/impersonation/impersonation.controller.js +135 -0
  204. package/dist/impersonation/impersonation.controller.js.map +1 -0
  205. package/dist/impersonation/impersonation.module.d.ts +8 -0
  206. package/dist/impersonation/impersonation.module.d.ts.map +1 -0
  207. package/dist/impersonation/impersonation.module.js +44 -0
  208. package/dist/impersonation/impersonation.module.js.map +1 -0
  209. package/dist/impersonation/impersonation.service.d.ts +164 -0
  210. package/dist/impersonation/impersonation.service.d.ts.map +1 -0
  211. package/dist/impersonation/impersonation.service.js +408 -0
  212. package/dist/impersonation/impersonation.service.js.map +1 -0
  213. package/dist/incident/incident-notifier.service.d.ts +36 -0
  214. package/dist/incident/incident-notifier.service.d.ts.map +1 -0
  215. package/dist/incident/incident-notifier.service.js +208 -0
  216. package/dist/incident/incident-notifier.service.js.map +1 -0
  217. package/dist/incident/incident.controller.d.ts +23 -0
  218. package/dist/incident/incident.controller.d.ts.map +1 -0
  219. package/dist/incident/incident.controller.js +75 -0
  220. package/dist/incident/incident.controller.js.map +1 -0
  221. package/dist/incident/incident.module.d.ts +7 -0
  222. package/dist/incident/incident.module.d.ts.map +1 -0
  223. package/dist/incident/incident.module.js +32 -0
  224. package/dist/incident/incident.module.js.map +1 -0
  225. package/dist/incident/incident.service.d.ts +72 -0
  226. package/dist/incident/incident.service.d.ts.map +1 -0
  227. package/dist/incident/incident.service.js +184 -0
  228. package/dist/incident/incident.service.js.map +1 -0
  229. package/dist/index.d.ts +43 -0
  230. package/dist/index.d.ts.map +1 -1
  231. package/dist/index.js +49 -0
  232. package/dist/index.js.map +1 -1
  233. package/dist/integration/services/outbox-polling.coordinator.d.ts +2 -0
  234. package/dist/integration/services/outbox-polling.coordinator.d.ts.map +1 -1
  235. package/dist/integration/services/outbox-polling.coordinator.js +50 -30
  236. package/dist/integration/services/outbox-polling.coordinator.js.map +1 -1
  237. package/dist/integration/services/outbox.service.d.ts.map +1 -1
  238. package/dist/integration/services/outbox.service.js +5 -1
  239. package/dist/integration/services/outbox.service.js.map +1 -1
  240. package/dist/integration-profile/dto/test.dto.d.ts +13 -0
  241. package/dist/integration-profile/dto/test.dto.d.ts.map +1 -0
  242. package/dist/integration-profile/dto/test.dto.js +26 -0
  243. package/dist/integration-profile/dto/test.dto.js.map +1 -0
  244. package/dist/integration-profile/integration-profile.controller.d.ts +12 -1
  245. package/dist/integration-profile/integration-profile.controller.d.ts.map +1 -1
  246. package/dist/integration-profile/integration-profile.controller.js +9 -1
  247. package/dist/integration-profile/integration-profile.controller.js.map +1 -1
  248. package/dist/integration-profile/integration-profile.module.d.ts +6 -1
  249. package/dist/integration-profile/integration-profile.module.d.ts.map +1 -1
  250. package/dist/integration-profile/integration-profile.module.js +26 -3
  251. package/dist/integration-profile/integration-profile.module.js.map +1 -1
  252. package/dist/integration-profile/integration-profile.secrets.d.ts.map +1 -1
  253. package/dist/integration-profile/integration-profile.secrets.js +12 -1
  254. package/dist/integration-profile/integration-profile.secrets.js.map +1 -1
  255. package/dist/integration-profile/integration-profile.service.d.ts +26 -7
  256. package/dist/integration-profile/integration-profile.service.d.ts.map +1 -1
  257. package/dist/integration-profile/integration-profile.service.js +94 -91
  258. package/dist/integration-profile/integration-profile.service.js.map +1 -1
  259. package/dist/integration-profile/integration-profile.utils.d.ts +27 -1
  260. package/dist/integration-profile/integration-profile.utils.d.ts.map +1 -1
  261. package/dist/integration-profile/integration-profile.utils.js +46 -5
  262. package/dist/integration-profile/integration-profile.utils.js.map +1 -1
  263. package/dist/integration-profile/testers/ai.testers.d.ts +3 -0
  264. package/dist/integration-profile/testers/ai.testers.d.ts.map +1 -0
  265. package/dist/integration-profile/testers/ai.testers.js +125 -0
  266. package/dist/integration-profile/testers/ai.testers.js.map +1 -0
  267. package/dist/integration-profile/testers/captcha.testers.d.ts +3 -0
  268. package/dist/integration-profile/testers/captcha.testers.d.ts.map +1 -0
  269. package/dist/integration-profile/testers/captcha.testers.js +121 -0
  270. package/dist/integration-profile/testers/captcha.testers.js.map +1 -0
  271. package/dist/integration-profile/testers/email.testers.d.ts +3 -0
  272. package/dist/integration-profile/testers/email.testers.d.ts.map +1 -0
  273. package/dist/integration-profile/testers/email.testers.js +156 -0
  274. package/dist/integration-profile/testers/email.testers.js.map +1 -0
  275. package/dist/integration-profile/testers/http-probe.d.ts +57 -0
  276. package/dist/integration-profile/testers/http-probe.d.ts.map +1 -0
  277. package/dist/integration-profile/testers/http-probe.js +140 -0
  278. package/dist/integration-profile/testers/http-probe.js.map +1 -0
  279. package/dist/integration-profile/testers/index.d.ts +12 -0
  280. package/dist/integration-profile/testers/index.d.ts.map +1 -0
  281. package/dist/integration-profile/testers/index.js +45 -0
  282. package/dist/integration-profile/testers/index.js.map +1 -0
  283. package/dist/integration-profile/testers/infrastructure.testers.d.ts +3 -0
  284. package/dist/integration-profile/testers/infrastructure.testers.d.ts.map +1 -0
  285. package/dist/integration-profile/testers/infrastructure.testers.js +105 -0
  286. package/dist/integration-profile/testers/infrastructure.testers.js.map +1 -0
  287. package/dist/integration-profile/testers/integration-tester.registry.d.ts +17 -0
  288. package/dist/integration-profile/testers/integration-tester.registry.d.ts.map +1 -0
  289. package/dist/integration-profile/testers/integration-tester.registry.js +52 -0
  290. package/dist/integration-profile/testers/integration-tester.registry.js.map +1 -0
  291. package/dist/integration-profile/testers/integration-tester.types.d.ts +55 -0
  292. package/dist/integration-profile/testers/integration-tester.types.d.ts.map +1 -0
  293. package/dist/integration-profile/testers/integration-tester.types.js +16 -0
  294. package/dist/integration-profile/testers/integration-tester.types.js.map +1 -0
  295. package/dist/integration-profile/testers/messaging.testers.d.ts +3 -0
  296. package/dist/integration-profile/testers/messaging.testers.d.ts.map +1 -0
  297. package/dist/integration-profile/testers/messaging.testers.js +70 -0
  298. package/dist/integration-profile/testers/messaging.testers.js.map +1 -0
  299. package/dist/integration-profile/testers/oauth.testers.d.ts +3 -0
  300. package/dist/integration-profile/testers/oauth.testers.d.ts.map +1 -0
  301. package/dist/integration-profile/testers/oauth.testers.js +285 -0
  302. package/dist/integration-profile/testers/oauth.testers.js.map +1 -0
  303. package/dist/integration-profile/testers/payment.testers.d.ts +3 -0
  304. package/dist/integration-profile/testers/payment.testers.d.ts.map +1 -0
  305. package/dist/integration-profile/testers/payment.testers.js +169 -0
  306. package/dist/integration-profile/testers/payment.testers.js.map +1 -0
  307. package/dist/integration-profile/testers/storage.testers.d.ts +3 -0
  308. package/dist/integration-profile/testers/storage.testers.d.ts.map +1 -0
  309. package/dist/integration-profile/testers/storage.testers.js +208 -0
  310. package/dist/integration-profile/testers/storage.testers.js.map +1 -0
  311. package/dist/language/en.json +15 -2
  312. package/dist/language/pt.json +15 -2
  313. package/dist/leaked-password/leaked-password.controller.d.ts +24 -0
  314. package/dist/leaked-password/leaked-password.controller.d.ts.map +1 -0
  315. package/dist/leaked-password/leaked-password.controller.js +78 -0
  316. package/dist/leaked-password/leaked-password.controller.js.map +1 -0
  317. package/dist/leaked-password/leaked-password.module.d.ts +8 -0
  318. package/dist/leaked-password/leaked-password.module.d.ts.map +1 -0
  319. package/dist/leaked-password/leaked-password.module.js +31 -0
  320. package/dist/leaked-password/leaked-password.module.js.map +1 -0
  321. package/dist/leaked-password/leaked-password.service.d.ts +64 -0
  322. package/dist/leaked-password/leaked-password.service.d.ts.map +1 -0
  323. package/dist/leaked-password/leaked-password.service.js +218 -0
  324. package/dist/leaked-password/leaked-password.service.js.map +1 -0
  325. package/dist/locale/locale.controller.d.ts +1 -1
  326. package/dist/locale/locale.service.d.ts +1 -1
  327. package/dist/mail/dto/preview.dto.d.ts +18 -0
  328. package/dist/mail/dto/preview.dto.d.ts.map +1 -0
  329. package/dist/mail/dto/preview.dto.js +66 -0
  330. package/dist/mail/dto/preview.dto.js.map +1 -0
  331. package/dist/mail/dto/send.dto.d.ts +44 -0
  332. package/dist/mail/dto/send.dto.d.ts.map +1 -1
  333. package/dist/mail/dto/send.dto.js +20 -0
  334. package/dist/mail/dto/send.dto.js.map +1 -1
  335. package/dist/mail/mail.controller.d.ts +5 -0
  336. package/dist/mail/mail.controller.d.ts.map +1 -1
  337. package/dist/mail/mail.controller.js +16 -2
  338. package/dist/mail/mail.controller.js.map +1 -1
  339. package/dist/mail/mail.module.d.ts.map +1 -1
  340. package/dist/mail/mail.module.js +2 -0
  341. package/dist/mail/mail.module.js.map +1 -1
  342. package/dist/mail/mail.service.d.ts +69 -4
  343. package/dist/mail/mail.service.d.ts.map +1 -1
  344. package/dist/mail/mail.service.js +278 -37
  345. package/dist/mail/mail.service.js.map +1 -1
  346. package/dist/mail-delivery/mail-delivery-provision.service.d.ts +21 -0
  347. package/dist/mail-delivery/mail-delivery-provision.service.d.ts.map +1 -0
  348. package/dist/mail-delivery/mail-delivery-provision.service.js +64 -0
  349. package/dist/mail-delivery/mail-delivery-provision.service.js.map +1 -0
  350. package/dist/mail-delivery/mail-delivery.constants.d.ts +17 -0
  351. package/dist/mail-delivery/mail-delivery.constants.d.ts.map +1 -0
  352. package/dist/mail-delivery/mail-delivery.constants.js +31 -0
  353. package/dist/mail-delivery/mail-delivery.constants.js.map +1 -0
  354. package/dist/mail-delivery/mail-delivery.controller.d.ts +19 -0
  355. package/dist/mail-delivery/mail-delivery.controller.d.ts.map +1 -0
  356. package/dist/mail-delivery/mail-delivery.controller.js +53 -0
  357. package/dist/mail-delivery/mail-delivery.controller.js.map +1 -0
  358. package/dist/mail-delivery/mail-delivery.module.d.ts +7 -0
  359. package/dist/mail-delivery/mail-delivery.module.d.ts.map +1 -0
  360. package/dist/mail-delivery/mail-delivery.module.js +36 -0
  361. package/dist/mail-delivery/mail-delivery.module.js.map +1 -0
  362. package/dist/mail-delivery/mail-delivery.service.d.ts +38 -0
  363. package/dist/mail-delivery/mail-delivery.service.d.ts.map +1 -0
  364. package/dist/mail-delivery/mail-delivery.service.js +140 -0
  365. package/dist/mail-delivery/mail-delivery.service.js.map +1 -0
  366. package/dist/mail-delivery/ses-event.parser.d.ts +27 -0
  367. package/dist/mail-delivery/ses-event.parser.d.ts.map +1 -0
  368. package/dist/mail-delivery/ses-event.parser.js +131 -0
  369. package/dist/mail-delivery/ses-event.parser.js.map +1 -0
  370. package/dist/mail-delivery/ses-webhook.service.d.ts +58 -0
  371. package/dist/mail-delivery/ses-webhook.service.d.ts.map +1 -0
  372. package/dist/mail-delivery/ses-webhook.service.js +214 -0
  373. package/dist/mail-delivery/ses-webhook.service.js.map +1 -0
  374. package/dist/mail-delivery/sns-message.util.d.ts +38 -0
  375. package/dist/mail-delivery/sns-message.util.d.ts.map +1 -0
  376. package/dist/mail-delivery/sns-message.util.js +109 -0
  377. package/dist/mail-delivery/sns-message.util.js.map +1 -0
  378. package/dist/mail-layout/dto/update.dto.d.ts +17 -0
  379. package/dist/mail-layout/dto/update.dto.d.ts.map +1 -0
  380. package/dist/mail-layout/dto/update.dto.js +27 -0
  381. package/dist/mail-layout/dto/update.dto.js.map +1 -0
  382. package/dist/mail-layout/mail-layout.controller.d.ts +15 -0
  383. package/dist/mail-layout/mail-layout.controller.d.ts.map +1 -0
  384. package/dist/mail-layout/mail-layout.controller.js +71 -0
  385. package/dist/mail-layout/mail-layout.controller.js.map +1 -0
  386. package/dist/mail-layout/mail-layout.module.d.ts +3 -0
  387. package/dist/mail-layout/mail-layout.module.d.ts.map +1 -0
  388. package/dist/mail-layout/mail-layout.module.js +35 -0
  389. package/dist/mail-layout/mail-layout.module.js.map +1 -0
  390. package/dist/mail-layout/mail-layout.service.d.ts +27 -0
  391. package/dist/mail-layout/mail-layout.service.d.ts.map +1 -0
  392. package/dist/mail-layout/mail-layout.service.js +80 -0
  393. package/dist/mail-layout/mail-layout.service.js.map +1 -0
  394. package/dist/mail-sent/dto/query-mail-sent-list.dto.d.ts +5 -0
  395. package/dist/mail-sent/dto/query-mail-sent-list.dto.d.ts.map +1 -1
  396. package/dist/mail-sent/dto/query-mail-sent-list.dto.js +6 -0
  397. package/dist/mail-sent/dto/query-mail-sent-list.dto.js.map +1 -1
  398. package/dist/mail-sent/mail-sent.controller.d.ts +39 -0
  399. package/dist/mail-sent/mail-sent.controller.d.ts.map +1 -1
  400. package/dist/mail-sent/mail-sent.service.d.ts +39 -0
  401. package/dist/mail-sent/mail-sent.service.d.ts.map +1 -1
  402. package/dist/mail-sent/mail-sent.service.js +45 -4
  403. package/dist/mail-sent/mail-sent.service.js.map +1 -1
  404. package/dist/mailbox/mailbox-fetcher.registry.d.ts +100 -0
  405. package/dist/mailbox/mailbox-fetcher.registry.d.ts.map +1 -0
  406. package/dist/mailbox/mailbox-fetcher.registry.js +59 -0
  407. package/dist/mailbox/mailbox-fetcher.registry.js.map +1 -0
  408. package/dist/mailbox/mailbox.module.d.ts +8 -0
  409. package/dist/mailbox/mailbox.module.d.ts.map +1 -0
  410. package/dist/mailbox/mailbox.module.js +27 -0
  411. package/dist/mailbox/mailbox.module.js.map +1 -0
  412. package/dist/mcp-chat/mcp-chat.controller.d.ts +2 -2
  413. package/dist/mcp-chat/mcp-chat.service.d.ts +24 -2
  414. package/dist/mcp-chat/mcp-chat.service.d.ts.map +1 -1
  415. package/dist/mcp-chat/mcp-chat.service.js +80 -24
  416. package/dist/mcp-chat/mcp-chat.service.js.map +1 -1
  417. package/dist/meeting/meeting-provider.registry.d.ts +155 -0
  418. package/dist/meeting/meeting-provider.registry.d.ts.map +1 -0
  419. package/dist/meeting/meeting-provider.registry.js +53 -0
  420. package/dist/meeting/meeting-provider.registry.js.map +1 -0
  421. package/dist/meeting/meeting.constants.d.ts +47 -0
  422. package/dist/meeting/meeting.constants.d.ts.map +1 -0
  423. package/dist/meeting/meeting.constants.js +21 -0
  424. package/dist/meeting/meeting.constants.js.map +1 -0
  425. package/dist/meeting/meeting.module.d.ts +7 -0
  426. package/dist/meeting/meeting.module.d.ts.map +1 -0
  427. package/dist/meeting/meeting.module.js +26 -0
  428. package/dist/meeting/meeting.module.js.map +1 -0
  429. package/dist/menu/menu.controller.d.ts +3 -3
  430. package/dist/menu/menu.service.d.ts +3 -3
  431. package/dist/middlewares/locale-injection.middleware.d.ts +12 -0
  432. package/dist/middlewares/locale-injection.middleware.d.ts.map +1 -1
  433. package/dist/middlewares/locale-injection.middleware.js +20 -4
  434. package/dist/middlewares/locale-injection.middleware.js.map +1 -1
  435. package/dist/notification/notification.controller.d.ts +12 -12
  436. package/dist/notification/notification.service.d.ts +12 -12
  437. package/dist/oauth/oauth-token-broker.service.d.ts +72 -0
  438. package/dist/oauth/oauth-token-broker.service.d.ts.map +1 -0
  439. package/dist/oauth/oauth-token-broker.service.js +258 -0
  440. package/dist/oauth/oauth-token-broker.service.js.map +1 -0
  441. package/dist/oauth/oauth.module.d.ts.map +1 -1
  442. package/dist/oauth/oauth.module.js +3 -1
  443. package/dist/oauth/oauth.module.js.map +1 -1
  444. package/dist/oauth/oauth.service.d.ts +2 -0
  445. package/dist/oauth/oauth.service.d.ts.map +1 -1
  446. package/dist/oauth/oauth.service.js +6 -3
  447. package/dist/oauth/oauth.service.js.map +1 -1
  448. package/dist/oauth/providers/google.provider.d.ts +7 -0
  449. package/dist/oauth/providers/google.provider.d.ts.map +1 -1
  450. package/dist/oauth/providers/google.provider.js +43 -13
  451. package/dist/oauth/providers/google.provider.js.map +1 -1
  452. package/dist/observability/monitored-cron.d.ts +34 -0
  453. package/dist/observability/monitored-cron.d.ts.map +1 -0
  454. package/dist/observability/monitored-cron.js +118 -0
  455. package/dist/observability/monitored-cron.js.map +1 -0
  456. package/dist/pairing/dto/approve-reverse-pairing.dto.d.ts +12 -0
  457. package/dist/pairing/dto/approve-reverse-pairing.dto.d.ts.map +1 -0
  458. package/dist/pairing/dto/approve-reverse-pairing.dto.js +30 -0
  459. package/dist/pairing/dto/approve-reverse-pairing.dto.js.map +1 -0
  460. package/dist/pairing/dto/claim-pairing.dto.d.ts +11 -0
  461. package/dist/pairing/dto/claim-pairing.dto.d.ts.map +1 -0
  462. package/dist/pairing/dto/claim-pairing.dto.js +35 -0
  463. package/dist/pairing/dto/claim-pairing.dto.js.map +1 -0
  464. package/dist/pairing/dto/confirm-pairing.dto.d.ts +10 -0
  465. package/dist/pairing/dto/confirm-pairing.dto.d.ts.map +1 -0
  466. package/dist/pairing/dto/confirm-pairing.dto.js +24 -0
  467. package/dist/pairing/dto/confirm-pairing.dto.js.map +1 -0
  468. package/dist/pairing/dto/poll-reverse-pairing.dto.d.ts +5 -0
  469. package/dist/pairing/dto/poll-reverse-pairing.dto.d.ts.map +1 -0
  470. package/dist/pairing/dto/poll-reverse-pairing.dto.js +24 -0
  471. package/dist/pairing/dto/poll-reverse-pairing.dto.js.map +1 -0
  472. package/dist/pairing/dto/start-pairing.dto.d.ts +11 -0
  473. package/dist/pairing/dto/start-pairing.dto.d.ts.map +1 -0
  474. package/dist/pairing/dto/start-pairing.dto.js +30 -0
  475. package/dist/pairing/dto/start-pairing.dto.js.map +1 -0
  476. package/dist/pairing/dto/start-reverse-pairing.dto.d.ts +24 -0
  477. package/dist/pairing/dto/start-reverse-pairing.dto.d.ts.map +1 -0
  478. package/dist/pairing/dto/start-reverse-pairing.dto.js +47 -0
  479. package/dist/pairing/dto/start-reverse-pairing.dto.js.map +1 -0
  480. package/dist/pairing/pairing.controller.d.ts +118 -0
  481. package/dist/pairing/pairing.controller.d.ts.map +1 -0
  482. package/dist/pairing/pairing.controller.js +296 -0
  483. package/dist/pairing/pairing.controller.js.map +1 -0
  484. package/dist/pairing/pairing.module.d.ts +10 -0
  485. package/dist/pairing/pairing.module.d.ts.map +1 -0
  486. package/dist/pairing/pairing.module.js +40 -0
  487. package/dist/pairing/pairing.module.js.map +1 -0
  488. package/dist/pairing/pairing.service.d.ts +238 -0
  489. package/dist/pairing/pairing.service.d.ts.map +1 -0
  490. package/dist/pairing/pairing.service.js +495 -0
  491. package/dist/pairing/pairing.service.js.map +1 -0
  492. package/dist/pdf/pdf.service.d.ts +11 -6
  493. package/dist/pdf/pdf.service.d.ts.map +1 -1
  494. package/dist/pdf/pdf.service.js +60 -20
  495. package/dist/pdf/pdf.service.js.map +1 -1
  496. package/dist/presence/presence.controller.d.ts +16 -0
  497. package/dist/presence/presence.controller.d.ts.map +1 -0
  498. package/dist/presence/presence.controller.js +60 -0
  499. package/dist/presence/presence.controller.js.map +1 -0
  500. package/dist/presence/presence.listener.d.ts +29 -0
  501. package/dist/presence/presence.listener.d.ts.map +1 -0
  502. package/dist/presence/presence.listener.js +82 -0
  503. package/dist/presence/presence.listener.js.map +1 -0
  504. package/dist/presence/presence.module.d.ts +3 -0
  505. package/dist/presence/presence.module.d.ts.map +1 -0
  506. package/dist/presence/presence.module.js +32 -0
  507. package/dist/presence/presence.module.js.map +1 -0
  508. package/dist/presence/presence.service.d.ts +42 -0
  509. package/dist/presence/presence.service.d.ts.map +1 -0
  510. package/dist/presence/presence.service.js +147 -0
  511. package/dist/presence/presence.service.js.map +1 -0
  512. package/dist/profile/dto/delete-account.dto.d.ts +8 -0
  513. package/dist/profile/dto/delete-account.dto.d.ts.map +1 -0
  514. package/dist/profile/dto/delete-account.dto.js +22 -0
  515. package/dist/profile/dto/delete-account.dto.js.map +1 -0
  516. package/dist/profile/events/profile-account-deleted.event.d.ts +12 -0
  517. package/dist/profile/events/profile-account-deleted.event.d.ts.map +1 -0
  518. package/dist/profile/events/profile-account-deleted.event.js +17 -0
  519. package/dist/profile/events/profile-account-deleted.event.js.map +1 -0
  520. package/dist/profile/profile.controller.d.ts +32 -15
  521. package/dist/profile/profile.controller.d.ts.map +1 -1
  522. package/dist/profile/profile.controller.js +75 -46
  523. package/dist/profile/profile.controller.js.map +1 -1
  524. package/dist/profile/profile.service.d.ts +41 -18
  525. package/dist/profile/profile.service.d.ts.map +1 -1
  526. package/dist/profile/profile.service.js +133 -48
  527. package/dist/profile/profile.service.js.map +1 -1
  528. package/dist/realtime/realtime.gateway.d.ts +48 -0
  529. package/dist/realtime/realtime.gateway.d.ts.map +1 -0
  530. package/dist/realtime/realtime.gateway.js +156 -0
  531. package/dist/realtime/realtime.gateway.js.map +1 -0
  532. package/dist/realtime/realtime.module.d.ts +8 -0
  533. package/dist/realtime/realtime.module.d.ts.map +1 -0
  534. package/dist/realtime/realtime.module.js +29 -0
  535. package/dist/realtime/realtime.module.js.map +1 -0
  536. package/dist/realtime/realtime.service.d.ts +51 -0
  537. package/dist/realtime/realtime.service.d.ts.map +1 -0
  538. package/dist/realtime/realtime.service.js +177 -0
  539. package/dist/realtime/realtime.service.js.map +1 -0
  540. package/dist/redis/redis-pubsub.d.ts +27 -0
  541. package/dist/redis/redis-pubsub.d.ts.map +1 -0
  542. package/dist/redis/redis-pubsub.js +184 -0
  543. package/dist/redis/redis-pubsub.js.map +1 -0
  544. package/dist/role/guards/role.guard.d.ts +5 -0
  545. package/dist/role/guards/role.guard.d.ts.map +1 -1
  546. package/dist/role/guards/role.guard.js +41 -39
  547. package/dist/role/guards/role.guard.js.map +1 -1
  548. package/dist/role/role.controller.d.ts +3 -3
  549. package/dist/role/role.service.d.ts +3 -3
  550. package/dist/session/session.controller.d.ts +2 -0
  551. package/dist/session/session.controller.d.ts.map +1 -1
  552. package/dist/session/session.service.d.ts +39 -0
  553. package/dist/session/session.service.d.ts.map +1 -1
  554. package/dist/session/session.service.js +91 -8
  555. package/dist/session/session.service.js.map +1 -1
  556. package/dist/setting/brand-asset.service.d.ts +48 -0
  557. package/dist/setting/brand-asset.service.d.ts.map +1 -0
  558. package/dist/setting/brand-asset.service.js +130 -0
  559. package/dist/setting/brand-asset.service.js.map +1 -0
  560. package/dist/setting/dto/create.dto.d.ts.map +1 -1
  561. package/dist/setting/dto/create.dto.js +9 -2
  562. package/dist/setting/dto/create.dto.js.map +1 -1
  563. package/dist/setting/setting.controller.d.ts +5 -5
  564. package/dist/setting/setting.module.d.ts.map +1 -1
  565. package/dist/setting/setting.module.js +3 -2
  566. package/dist/setting/setting.module.js.map +1 -1
  567. package/dist/setting/setting.service.d.ts +41 -5
  568. package/dist/setting/setting.service.d.ts.map +1 -1
  569. package/dist/setting/setting.service.js +113 -1
  570. package/dist/setting/setting.service.js.map +1 -1
  571. package/dist/token/token.service.d.ts +23 -2
  572. package/dist/token/token.service.d.ts.map +1 -1
  573. package/dist/token/token.service.js +39 -4
  574. package/dist/token/token.service.js.map +1 -1
  575. package/dist/user/dto/create-with-email-and-password.dto.d.ts +2 -0
  576. package/dist/user/dto/create-with-email-and-password.dto.d.ts.map +1 -1
  577. package/dist/user/dto/create-with-email-and-password.dto.js +5 -0
  578. package/dist/user/dto/create-with-email-and-password.dto.js.map +1 -1
  579. package/dist/user/dto/query-user-mail-list.dto.d.ts +5 -0
  580. package/dist/user/dto/query-user-mail-list.dto.d.ts.map +1 -0
  581. package/dist/user/dto/query-user-mail-list.dto.js +25 -0
  582. package/dist/user/dto/query-user-mail-list.dto.js.map +1 -0
  583. package/dist/user/user-credential.util.d.ts +19 -0
  584. package/dist/user/user-credential.util.d.ts.map +1 -0
  585. package/dist/user/user-credential.util.js +32 -0
  586. package/dist/user/user-credential.util.js.map +1 -0
  587. package/dist/user/user.controller.d.ts +24 -26
  588. package/dist/user/user.controller.d.ts.map +1 -1
  589. package/dist/user/user.controller.js +18 -3
  590. package/dist/user/user.controller.js.map +1 -1
  591. package/dist/user/user.service.d.ts +71 -29
  592. package/dist/user/user.service.d.ts.map +1 -1
  593. package/dist/user/user.service.js +291 -17
  594. package/dist/user/user.service.js.map +1 -1
  595. package/dist/user-device/user-device.controller.d.ts +54 -0
  596. package/dist/user-device/user-device.controller.d.ts.map +1 -0
  597. package/dist/user-device/user-device.controller.js +103 -0
  598. package/dist/user-device/user-device.controller.js.map +1 -0
  599. package/dist/user-device/user-device.module.d.ts +3 -0
  600. package/dist/user-device/user-device.module.d.ts.map +1 -0
  601. package/dist/user-device/user-device.module.js +26 -0
  602. package/dist/user-device/user-device.module.js.map +1 -0
  603. package/dist/user-device/user-device.service.d.ts +71 -0
  604. package/dist/user-device/user-device.service.d.ts.map +1 -0
  605. package/dist/user-device/user-device.service.js +158 -0
  606. package/dist/user-device/user-device.service.js.map +1 -0
  607. package/dist/utils/device-key.d.ts +23 -0
  608. package/dist/utils/device-key.d.ts.map +1 -0
  609. package/dist/utils/device-key.js +31 -0
  610. package/dist/utils/device-key.js.map +1 -0
  611. package/dist/utils/geo-ip.d.ts +38 -0
  612. package/dist/utils/geo-ip.d.ts.map +1 -0
  613. package/dist/utils/geo-ip.js +122 -0
  614. package/dist/utils/geo-ip.js.map +1 -0
  615. package/dist/utils/locale-context.d.ts +10 -7
  616. package/dist/utils/locale-context.d.ts.map +1 -1
  617. package/dist/utils/locale-context.js +14 -8
  618. package/dist/utils/locale-context.js.map +1 -1
  619. package/dist/utils/security-event-vars.d.ts +56 -0
  620. package/dist/utils/security-event-vars.d.ts.map +1 -0
  621. package/dist/utils/security-event-vars.js +109 -0
  622. package/dist/utils/security-event-vars.js.map +1 -0
  623. package/dist/utils/user-agent.d.ts +19 -0
  624. package/dist/utils/user-agent.d.ts.map +1 -0
  625. package/dist/utils/user-agent.js +36 -0
  626. package/dist/utils/user-agent.js.map +1 -0
  627. package/dist/validators/is-strong-password-with-settings.validator.d.ts.map +1 -1
  628. package/dist/validators/is-strong-password-with-settings.validator.js +11 -0
  629. package/dist/validators/is-strong-password-with-settings.validator.js.map +1 -1
  630. package/dist/validators/service-locator.d.ts +9 -0
  631. package/dist/validators/service-locator.d.ts.map +1 -1
  632. package/dist/validators/service-locator.js +12 -0
  633. package/dist/validators/service-locator.js.map +1 -1
  634. package/dist/webhook-integration/webhook-integration.service.d.ts +5 -0
  635. package/dist/webhook-integration/webhook-integration.service.d.ts.map +1 -1
  636. package/dist/webhook-integration/webhook-integration.service.js +50 -4
  637. package/dist/webhook-integration/webhook-integration.service.js.map +1 -1
  638. package/dist/webhook-integration/webhook-protocol.registry.d.ts +6 -0
  639. package/dist/webhook-integration/webhook-protocol.registry.d.ts.map +1 -1
  640. package/dist/webhook-integration/webhook-protocol.registry.js.map +1 -1
  641. package/dist/whatsapp-sender/whatsapp-sender.module.d.ts +3 -0
  642. package/dist/whatsapp-sender/whatsapp-sender.module.d.ts.map +1 -0
  643. package/dist/whatsapp-sender/whatsapp-sender.module.js +23 -0
  644. package/dist/whatsapp-sender/whatsapp-sender.module.js.map +1 -0
  645. package/dist/whatsapp-sender/whatsapp-sender.service.d.ts +50 -0
  646. package/dist/whatsapp-sender/whatsapp-sender.service.d.ts.map +1 -0
  647. package/dist/whatsapp-sender/whatsapp-sender.service.js +224 -0
  648. package/dist/whatsapp-sender/whatsapp-sender.service.js.map +1 -0
  649. package/hedhog/data/integration_provider.yaml +25 -0
  650. package/hedhog/data/mail.yaml +275 -112
  651. package/hedhog/data/mail_layout.yaml +198 -0
  652. package/hedhog/data/menu.yaml +69 -3
  653. package/hedhog/data/role.yaml +16 -0
  654. package/hedhog/data/route.yaml +307 -3
  655. package/hedhog/data/setting_group.yaml +315 -1
  656. package/hedhog/data/setting_subgroup.yaml +8 -0
  657. package/hedhog/frontend/app/_lib/hooks/use-core-access.test.tsx.ejs +125 -0
  658. package/hedhog/frontend/app/_lib/hooks/use-core-access.ts.ejs +29 -0
  659. package/hedhog/frontend/app/_lib/hooks/use-impersonation-access.test.ts.ejs +71 -0
  660. package/hedhog/frontend/app/_lib/hooks/use-impersonation-access.ts.ejs +32 -0
  661. package/hedhog/frontend/app/access-log/page.tsx.ejs +96 -22
  662. package/hedhog/frontend/app/account/components/active-sessions.tsx.ejs +17 -1
  663. package/hedhog/frontend/app/account/components/known-devices.tsx.ejs +89 -0
  664. package/hedhog/frontend/app/account/components/mfa-setup-dialog.tsx.ejs +36 -0
  665. package/hedhog/frontend/app/account/components/profile-form.tsx.ejs +2 -1
  666. package/hedhog/frontend/app/account/components/two-factor-auth.tsx.ejs +2 -0
  667. package/hedhog/frontend/app/account/components/user-devices-list.tsx.ejs +186 -0
  668. package/hedhog/frontend/app/account/devices/page.tsx.ejs +5 -0
  669. package/hedhog/frontend/app/account/hooks/use-mfa-setup.ts.ejs +10 -7
  670. package/hedhog/frontend/app/account/layout.tsx.ejs +2 -0
  671. package/hedhog/frontend/app/ai_agent/page.tsx.ejs +7 -4
  672. package/hedhog/frontend/app/ai_instruction/_components/ai-instruction-form.tsx.ejs +580 -0
  673. package/hedhog/frontend/app/ai_instruction/_components/ai-instruction-preview.tsx.ejs +150 -0
  674. package/hedhog/frontend/app/ai_instruction/_components/ai-instruction-versions.tsx.ejs +199 -0
  675. package/hedhog/frontend/app/ai_instruction/_components/prompt-diff.tsx.ejs +63 -0
  676. package/hedhog/frontend/app/ai_instruction/_lib/line-diff.spec.ts.ejs +59 -0
  677. package/hedhog/frontend/app/ai_instruction/_lib/line-diff.ts.ejs +72 -0
  678. package/hedhog/frontend/app/ai_instruction/_lib/prompt-template.spec.ts.ejs +170 -0
  679. package/hedhog/frontend/app/ai_instruction/_lib/prompt-template.ts.ejs +167 -0
  680. package/hedhog/frontend/app/ai_instruction/_lib/types.ts.ejs +99 -0
  681. package/hedhog/frontend/app/ai_instruction/page.tsx.ejs +422 -0
  682. package/hedhog/frontend/app/configurations/[slug]/components/setting-field.test.tsx.ejs +298 -0
  683. package/hedhog/frontend/app/configurations/[slug]/components/setting-field.tsx.ejs +410 -1223
  684. package/hedhog/frontend/app/incidents/page.tsx.ejs +400 -0
  685. package/hedhog/frontend/app/integration/profiles/page.tsx.ejs +153 -84
  686. package/hedhog/frontend/app/mail/layout/page.tsx.ejs +344 -0
  687. package/hedhog/frontend/app/mail/log/page.tsx.ejs +210 -3
  688. package/hedhog/frontend/app/mail/template/page.tsx.ejs +292 -200
  689. package/hedhog/frontend/app/mcp_chat/page.tsx.ejs +129 -17
  690. package/hedhog/frontend/app/pages/_components/page-delete-dialog.tsx.ejs +343 -0
  691. package/hedhog/frontend/app/pages/_components/page-detail-sheet.tsx.ejs +438 -0
  692. package/hedhog/frontend/app/pages/_components/page-wizard-sheet.tsx.ejs +1009 -0
  693. package/hedhog/frontend/app/pages/_components/system-page-types.ts.ejs +56 -0
  694. package/hedhog/frontend/app/pages/_components/use-system-pages.ts.ejs +171 -0
  695. package/hedhog/frontend/app/pages/page.tsx.ejs +514 -0
  696. package/hedhog/frontend/app/users/active-session.tsx.ejs +58 -11
  697. package/hedhog/frontend/app/users/page.tsx.ejs +186 -21
  698. package/hedhog/frontend/app/users/simulate-access-dialog.test.tsx.ejs +202 -0
  699. package/hedhog/frontend/app/users/simulate-access-dialog.tsx.ejs +170 -0
  700. package/hedhog/frontend/app/users/user-activity-timeline.tsx.ejs +250 -0
  701. package/hedhog/frontend/app/users/user-devices.tsx.ejs +89 -0
  702. package/hedhog/frontend/app/users/user-logs.tsx.ejs +13 -1
  703. package/hedhog/frontend/app/users/user-mails.tsx.ejs +399 -0
  704. package/hedhog/frontend/app/users/user-sheet.tsx.ejs +106 -99
  705. package/hedhog/frontend/messages/en.json +643 -49
  706. package/hedhog/frontend/messages/pt.json +643 -49
  707. package/hedhog/table/access_log.yaml +7 -0
  708. package/hedhog/table/ai_agent.yaml +1 -0
  709. package/hedhog/table/ai_instruction.yaml +15 -0
  710. package/hedhog/table/file.yaml +8 -0
  711. package/hedhog/table/leaked_password.yaml +18 -0
  712. package/hedhog/table/mail_delivery_event.yaml +76 -0
  713. package/hedhog/table/mail_layout.yaml +35 -0
  714. package/hedhog/table/mail_sent.yaml +23 -0
  715. package/hedhog/table/mail_var.yaml +4 -0
  716. package/hedhog/table/setting.yaml +1 -0
  717. package/hedhog/table/system_incident.yaml +59 -0
  718. package/hedhog/table/user_activity.yaml +9 -0
  719. package/hedhog/table/user_device.yaml +52 -0
  720. package/hedhog/table/user_presence.yaml +36 -0
  721. package/hedhog/table/user_session.yaml +20 -1
  722. package/package.json +7 -2
  723. package/src/access-log/access-log.controller.ts +1 -0
  724. package/src/access-log/access-log.interceptor.ts +9 -3
  725. package/src/access-log/access-log.service.spec.ts +33 -2
  726. package/src/access-log/access-log.service.ts +38 -0
  727. package/src/access-log/dto/query-access-log.dto.ts +5 -0
  728. package/src/ai/ai-attachment.fragments.spec.ts +319 -0
  729. package/src/ai/ai-attachment.fragments.ts +35 -0
  730. package/src/ai/ai.controller.ts +9 -0
  731. package/src/ai/ai.module.ts +3 -2
  732. package/src/ai/ai.prompts.ts +38 -0
  733. package/src/ai/ai.service.spec.ts +280 -0
  734. package/src/ai/ai.service.ts +475 -82
  735. package/src/ai/dto/chat.dto.ts +33 -3
  736. package/src/ai/dto/create-agent.dto.ts +2 -2
  737. package/src/ai/dto/richtext-edit-html.dto.ts +11 -0
  738. package/src/ai/dto/update-agent.dto.ts +2 -2
  739. package/src/ai/richtext-ai.prompts.ts +57 -0
  740. package/src/ai/richtext-ai.service.ts +109 -0
  741. package/src/ai-instruction/ai-instruction.controller.ts +40 -9
  742. package/src/ai-instruction/ai-instruction.module.ts +13 -2
  743. package/src/ai-instruction/ai-instruction.service.spec.ts +658 -0
  744. package/src/ai-instruction/ai-instruction.service.ts +661 -62
  745. package/src/ai-instruction/ai-prompt-builder.service.ts +10 -1
  746. package/src/ai-instruction/ai-prompt-registry.ts +87 -0
  747. package/src/ai-instruction/ai-prompt-resolver.service.spec.ts +375 -0
  748. package/src/ai-instruction/ai-prompt-resolver.service.ts +295 -0
  749. package/src/ai-instruction/ai-prompt-template.util.spec.ts +162 -0
  750. package/src/ai-instruction/ai-prompt-template.util.ts +199 -0
  751. package/src/ai-instruction/dto/create-ai-instruction.dto.ts +39 -3
  752. package/src/ai-instruction/dto/preview-ai-instruction.dto.ts +26 -0
  753. package/src/ai-instruction/dto/update-ai-instruction.dto.ts +42 -1
  754. package/src/ai-instruction/types/ai-instruction.types.ts +24 -1
  755. package/src/auth/auth.controller.ts +78 -13
  756. package/src/auth/auth.module.ts +2 -0
  757. package/src/auth/auth.service.spec.ts +386 -7
  758. package/src/auth/auth.service.ts +435 -81
  759. package/src/auth/dto/confirm-email.dto.ts +7 -0
  760. package/src/auth/dto/resend-confirmation.dto.ts +20 -0
  761. package/src/authorize/authorize.controller.ts +2 -0
  762. package/src/authorize/authorize.service.spec.ts +23 -0
  763. package/src/authorize/authorize.service.ts +8 -0
  764. package/src/captcha/captcha.module.ts +10 -0
  765. package/src/captcha/captcha.service.spec.ts +210 -0
  766. package/src/captcha/captcha.service.ts +191 -0
  767. package/src/challenge/challenge.service.spec.ts +112 -4
  768. package/src/challenge/challenge.service.ts +131 -17
  769. package/src/core.module.ts +46 -1
  770. package/src/file/file.controller.ts +54 -4
  771. package/src/file/file.service.spec.ts +275 -0
  772. package/src/file/file.service.ts +468 -16
  773. package/src/file/image-optimization.service.spec.ts +92 -0
  774. package/src/file/image-optimization.service.ts +202 -0
  775. package/src/file/provider/abstract.provider.ts +23 -0
  776. package/src/file/provider/gcs.provider.ts +17 -0
  777. package/src/file/provider/local.provider.ts +21 -0
  778. package/src/file/provider/s3.provider.ts +25 -0
  779. package/src/file/provider/spaces.provider.ts +26 -0
  780. package/src/impersonation/dto/redeem-impersonation.dto.ts +8 -0
  781. package/src/impersonation/dto/start-impersonation.dto.ts +13 -0
  782. package/src/impersonation/impersonation-restrictions.ts +84 -0
  783. package/src/impersonation/impersonation.controller.ts +109 -0
  784. package/src/impersonation/impersonation.module.ts +31 -0
  785. package/src/impersonation/impersonation.service.spec.ts +427 -0
  786. package/src/impersonation/impersonation.service.ts +577 -0
  787. package/src/incident/incident-notifier.service.spec.ts +205 -0
  788. package/src/incident/incident-notifier.service.ts +241 -0
  789. package/src/incident/incident.controller.ts +38 -0
  790. package/src/incident/incident.module.ts +19 -0
  791. package/src/incident/incident.service.spec.ts +150 -0
  792. package/src/incident/incident.service.ts +209 -0
  793. package/src/index.ts +58 -0
  794. package/src/integration/services/outbox-polling.coordinator.spec.ts +90 -0
  795. package/src/integration/services/outbox-polling.coordinator.ts +62 -40
  796. package/src/integration/services/outbox.service.spec.ts +8 -0
  797. package/src/integration/services/outbox.service.ts +19 -13
  798. package/src/integration-profile/dto/test.dto.ts +19 -0
  799. package/src/integration-profile/integration-profile.controller.ts +10 -1
  800. package/src/integration-profile/integration-profile.module.spec.ts +51 -0
  801. package/src/integration-profile/integration-profile.module.ts +23 -4
  802. package/src/integration-profile/integration-profile.secrets.ts +12 -1
  803. package/src/integration-profile/integration-profile.service.spec.ts +279 -0
  804. package/src/integration-profile/integration-profile.service.ts +120 -124
  805. package/src/integration-profile/integration-profile.utils.spec.ts +22 -0
  806. package/src/integration-profile/integration-profile.utils.ts +78 -3
  807. package/src/integration-profile/testers/ai.testers.ts +165 -0
  808. package/src/integration-profile/testers/captcha.testers.spec.ts +92 -0
  809. package/src/integration-profile/testers/captcha.testers.ts +139 -0
  810. package/src/integration-profile/testers/email.testers.ts +194 -0
  811. package/src/integration-profile/testers/http-probe.spec.ts +153 -0
  812. package/src/integration-profile/testers/http-probe.ts +171 -0
  813. package/src/integration-profile/testers/index.ts +30 -0
  814. package/src/integration-profile/testers/infrastructure.testers.ts +122 -0
  815. package/src/integration-profile/testers/integration-tester.registry.spec.ts +75 -0
  816. package/src/integration-profile/testers/integration-tester.registry.ts +43 -0
  817. package/src/integration-profile/testers/integration-tester.types.ts +61 -0
  818. package/src/integration-profile/testers/messaging.testers.ts +102 -0
  819. package/src/integration-profile/testers/oauth.testers.spec.ts +220 -0
  820. package/src/integration-profile/testers/oauth.testers.ts +305 -0
  821. package/src/integration-profile/testers/payment.testers.ts +185 -0
  822. package/src/integration-profile/testers/remaining.testers.spec.ts +401 -0
  823. package/src/integration-profile/testers/storage.testers.spec.ts +185 -0
  824. package/src/integration-profile/testers/storage.testers.ts +226 -0
  825. package/src/integration-profile/testers/tester-coverage.spec.ts +58 -0
  826. package/src/language/en.json +15 -2
  827. package/src/language/pt.json +15 -2
  828. package/src/leaked-password/README.md +83 -0
  829. package/src/leaked-password/leaked-password.controller.ts +52 -0
  830. package/src/leaked-password/leaked-password.module.ts +18 -0
  831. package/src/leaked-password/leaked-password.service.ts +242 -0
  832. package/src/leaked-password/seed/build-seed-sql.mjs +180 -0
  833. package/src/leaked-password/seed/common-passwords.txt +335 -0
  834. package/src/mail/dto/preview.dto.ts +50 -0
  835. package/src/mail/dto/send.dto.ts +58 -1
  836. package/src/mail/mail-template.spec.ts +274 -0
  837. package/src/mail/mail.controller.ts +9 -2
  838. package/src/mail/mail.module.ts +2 -0
  839. package/src/mail/mail.service.spec.ts +422 -6
  840. package/src/mail/mail.service.ts +337 -34
  841. package/src/mail-delivery/mail-delivery-provision.service.ts +66 -0
  842. package/src/mail-delivery/mail-delivery.constants.ts +31 -0
  843. package/src/mail-delivery/mail-delivery.controller.ts +38 -0
  844. package/src/mail-delivery/mail-delivery.module.ts +23 -0
  845. package/src/mail-delivery/mail-delivery.service.spec.ts +136 -0
  846. package/src/mail-delivery/mail-delivery.service.ts +152 -0
  847. package/src/mail-delivery/ses-event.parser.spec.ts +140 -0
  848. package/src/mail-delivery/ses-event.parser.ts +191 -0
  849. package/src/mail-delivery/ses-webhook.service.spec.ts +170 -0
  850. package/src/mail-delivery/ses-webhook.service.ts +240 -0
  851. package/src/mail-delivery/sns-message.util.spec.ts +163 -0
  852. package/src/mail-delivery/sns-message.util.ts +125 -0
  853. package/src/mail-layout/dto/update.dto.ts +19 -0
  854. package/src/mail-layout/mail-layout.controller.ts +47 -0
  855. package/src/mail-layout/mail-layout.module.ts +22 -0
  856. package/src/mail-layout/mail-layout.service.ts +94 -0
  857. package/src/mail-sent/dto/query-mail-sent-list.dto.ts +15 -0
  858. package/src/mail-sent/mail-sent.service.ts +46 -2
  859. package/src/mailbox/mailbox-fetcher.registry.ts +132 -0
  860. package/src/mailbox/mailbox.module.ts +14 -0
  861. package/src/mcp-chat/mcp-chat.service.spec.ts +236 -0
  862. package/src/mcp-chat/mcp-chat.service.ts +122 -26
  863. package/src/meeting/meeting-provider.registry.ts +193 -0
  864. package/src/meeting/meeting.constants.ts +53 -0
  865. package/src/meeting/meeting.module.ts +13 -0
  866. package/src/middlewares/locale-injection.middleware.ts +25 -6
  867. package/src/oauth/oauth-token-broker.service.spec.ts +172 -0
  868. package/src/oauth/oauth-token-broker.service.ts +363 -0
  869. package/src/oauth/oauth.module.ts +3 -1
  870. package/src/oauth/oauth.service.ts +8 -2
  871. package/src/oauth/providers/google.provider.ts +49 -15
  872. package/src/observability/monitored-cron.spec.ts +102 -0
  873. package/src/observability/monitored-cron.ts +110 -0
  874. package/src/pairing/dto/approve-reverse-pairing.dto.ts +20 -0
  875. package/src/pairing/dto/claim-pairing.dto.ts +19 -0
  876. package/src/pairing/dto/confirm-pairing.dto.ts +14 -0
  877. package/src/pairing/dto/poll-reverse-pairing.dto.ts +9 -0
  878. package/src/pairing/dto/start-pairing.dto.ts +19 -0
  879. package/src/pairing/dto/start-reverse-pairing.dto.ts +45 -0
  880. package/src/pairing/pairing.controller.ts +246 -0
  881. package/src/pairing/pairing.module.ts +27 -0
  882. package/src/pairing/pairing.service.spec.ts +462 -0
  883. package/src/pairing/pairing.service.ts +614 -0
  884. package/src/pdf/pdf.service.ts +81 -24
  885. package/src/presence/presence.controller.ts +29 -0
  886. package/src/presence/presence.listener.ts +53 -0
  887. package/src/presence/presence.module.ts +19 -0
  888. package/src/presence/presence.service.spec.ts +97 -0
  889. package/src/presence/presence.service.ts +160 -0
  890. package/src/profile/dto/delete-account.dto.ts +11 -0
  891. package/src/profile/events/profile-account-deleted.event.ts +13 -0
  892. package/src/profile/profile.controller.ts +46 -34
  893. package/src/profile/profile.service.ts +164 -46
  894. package/src/realtime/realtime.gateway.ts +138 -0
  895. package/src/realtime/realtime.module.ts +16 -0
  896. package/src/realtime/realtime.service.spec.ts +50 -0
  897. package/src/realtime/realtime.service.ts +187 -0
  898. package/src/redis/redis-pubsub.ts +190 -0
  899. package/src/role/guards/role.guard.spec.ts +75 -0
  900. package/src/role/guards/role.guard.ts +64 -46
  901. package/src/session/session.service.spec.ts +81 -0
  902. package/src/session/session.service.ts +93 -6
  903. package/src/setting/brand-asset.service.ts +137 -0
  904. package/src/setting/dto/create.dto.ts +13 -2
  905. package/src/setting/setting.module.ts +3 -2
  906. package/src/setting/setting.service.spec.ts +135 -1
  907. package/src/setting/setting.service.ts +138 -2
  908. package/src/token/token.service.spec.ts +62 -0
  909. package/src/token/token.service.ts +57 -3
  910. package/src/user/dto/create-with-email-and-password.dto.ts +6 -1
  911. package/src/user/dto/query-user-mail-list.dto.ts +10 -0
  912. package/src/user/user-credential.util.ts +35 -0
  913. package/src/user/user.controller.ts +17 -2
  914. package/src/user/user.service.spec.ts +186 -2
  915. package/src/user/user.service.ts +361 -16
  916. package/src/user-device/user-device.controller.ts +77 -0
  917. package/src/user-device/user-device.module.ts +13 -0
  918. package/src/user-device/user-device.service.spec.ts +234 -0
  919. package/src/user-device/user-device.service.ts +168 -0
  920. package/src/utils/device-key.spec.ts +57 -0
  921. package/src/utils/device-key.ts +32 -0
  922. package/src/utils/geo-ip.spec.ts +134 -0
  923. package/src/utils/geo-ip.ts +93 -0
  924. package/src/utils/locale-context.spec.ts +27 -1
  925. package/src/utils/locale-context.ts +15 -12
  926. package/src/utils/security-event-vars.spec.ts +161 -0
  927. package/src/utils/security-event-vars.ts +153 -0
  928. package/src/utils/user-agent.spec.ts +37 -0
  929. package/src/utils/user-agent.ts +46 -0
  930. package/src/validators/is-strong-password-with-settings.validator.ts +12 -0
  931. package/src/validators/service-locator.ts +15 -0
  932. package/src/webhook-integration/webhook-integration.service.ts +57 -3
  933. package/src/webhook-integration/webhook-protocol.registry.ts +6 -0
  934. package/src/whatsapp-sender/whatsapp-sender.module.ts +10 -0
  935. package/src/whatsapp-sender/whatsapp-sender.service.ts +313 -0
@@ -13,16 +13,71 @@ import axios from 'axios';
13
13
  import { createHash } from 'crypto';
14
14
  import pdfParse from 'pdf-parse';
15
15
  import { AiExecutionService } from '../ai-instruction/ai-execution.service';
16
+ import {
17
+ AiPromptResolverService,
18
+ applyGeminiModelParams,
19
+ applyOpenAiModelParams,
20
+ mergeModelParams,
21
+ type PromptSource,
22
+ } from '../ai-instruction/ai-prompt-resolver.service';
23
+ import type { TemplateVars } from '../ai-instruction/ai-prompt-template.util';
16
24
  import { DeleteDTO } from '../dto/delete.dto';
17
25
  import { FileService } from '../file/file.service';
18
- import { buildAiConfigFromIntegration } from '../integration-profile/integration-profile.utils';
26
+ import {
27
+ buildAiConfigFromIntegration,
28
+ DEEPSEEK_API_BASE_URL,
29
+ DEEPSEEK_DEFAULT_MODEL,
30
+ } from '../integration-profile/integration-profile.utils';
19
31
  import { SettingService } from '../setting/setting.service';
32
+ import {
33
+ attachedFileBlock,
34
+ binaryAttachmentMarker,
35
+ unreadablePdfMarker,
36
+ } from './ai-attachment.fragments';
37
+ import { CORE_AI_PROMPT_SLUGS } from './ai.prompts';
20
38
  import { ChatAgentDTO } from './dto/chat-agent.dto';
21
39
  import { ChatDTO } from './dto/chat.dto';
22
40
  import { CreateAgentDTO } from './dto/create-agent.dto';
23
41
  import { UpdateAgentDTO } from './dto/update-agent.dto';
24
42
 
25
- type AiProvider = 'openai' | 'gemini';
43
+ type AiProvider = 'openai' | 'gemini' | 'deepseek' | 'claude';
44
+
45
+ /** Fallback call timeout when the active AI integration profile doesn't set `timeout_ms`. */
46
+ const DEFAULT_AI_CALL_TIMEOUT_MS = 120_000;
47
+
48
+ /** Setting (Settings → AI) que guarda o perfil de integração de cada provider. */
49
+ const AI_PROFILE_SETTING: Record<AiProvider, string> = {
50
+ openai: 'ai-openai-profile-id',
51
+ gemini: 'ai-gemini-profile-id',
52
+ deepseek: 'ai-deepseek-profile-id',
53
+ claude: 'ai-claude-profile-id',
54
+ };
55
+
56
+ /**
57
+ * Slug do provider de integração -> provider do chat.
58
+ *
59
+ * Usado quando o chamador escolhe um PERFIL (e não um provider): o provider sai
60
+ * do perfil, não do setting global.
61
+ */
62
+ const PROVIDER_BY_INTEGRATION_SLUG: Record<string, AiProvider> = {
63
+ openai: 'openai',
64
+ gemini: 'gemini',
65
+ deepseek: 'deepseek',
66
+ claude: 'claude',
67
+ };
68
+
69
+ /**
70
+ * Optional per-call model tuning.
71
+ *
72
+ * These are only sent to the provider when a value is present: the request
73
+ * bodies must stay byte-identical to what they were before this existed, since
74
+ * some newer models reject `temperature` / `max_tokens` outright.
75
+ */
76
+ export type AiChatModelParams = {
77
+ temperature?: number | null;
78
+ maxTokens?: number | null;
79
+ responseFormat?: 'text' | 'json_object';
80
+ };
26
81
 
27
82
  type AiAgentRecord = {
28
83
  id: number;
@@ -41,6 +96,14 @@ type AiAttachment = {
41
96
  buffer: Buffer;
42
97
  };
43
98
 
99
+ type AiProfileCredentials = {
100
+ apiKey: string;
101
+ organization?: string;
102
+ model?: string;
103
+ timeoutMs?: number;
104
+ baseUrl?: string;
105
+ };
106
+
44
107
  @Injectable()
45
108
  export class AiService implements OnModuleInit {
46
109
  private readonly logger = new Logger(AiService.name);
@@ -54,68 +117,155 @@ export class AiService implements OnModuleInit {
54
117
  private readonly fileService: FileService,
55
118
  @Inject(forwardRef(() => AiExecutionService))
56
119
  private readonly aiExecution: AiExecutionService,
120
+ @Inject(forwardRef(() => AiPromptResolverService))
121
+ private readonly promptResolver: AiPromptResolverService,
57
122
  ) {}
58
123
 
59
124
  async onModuleInit() {
60
125
  try {
61
- const s = await this.settingService.getSettingValues([
62
- 'ai-openai-profile-id',
63
- 'ai-gemini-profile-id',
64
- ]);
65
- if (
66
- !String(s['ai-openai-profile-id'] ?? '').trim() &&
67
- !String(s['ai-gemini-profile-id'] ?? '').trim()
68
- ) {
126
+ const slugs = Object.values(AI_PROFILE_SETTING);
127
+ const s = await this.settingService.getSettingValues(slugs);
128
+ if (slugs.every((slug) => !String(s[slug] ?? '').trim())) {
69
129
  this.logger.warn('No AI profiles configured. Set profiles in Settings → AI.');
70
130
  }
71
131
  } catch { /* settings not available yet */ }
72
132
  }
73
133
 
74
134
  async chat(data: ChatDTO, file?: MulterFile) {
75
- const provider = data.provider || 'openai';
135
+ const provider = data.provider || (await this.getDefaultProvider());
76
136
  const attachment = await this.resolveAttachment(file, data.file_id);
137
+ const aiProfile = await this.getAiProfile(provider);
138
+ const model = data.model || aiProfile.model || this.getDefaultModel(provider);
139
+ const timeoutMs = aiProfile.timeoutMs ?? DEFAULT_AI_CALL_TIMEOUT_MS;
140
+ const params: AiChatModelParams = {
141
+ temperature: data.temperature,
142
+ maxTokens: data.max_tokens,
143
+ responseFormat: data.response_format,
144
+ };
77
145
 
78
146
  const executionId = await this.aiExecution.start({ trigger: 'api', contextSlug: 'ai-chat' });
79
147
  const stepStart = Date.now();
80
148
 
81
149
  try {
82
- if (provider === 'openai') {
83
- const model = data.model || 'gpt-4o-mini';
84
- const { content, usage } = await this.chatWithOpenAi({
150
+ const { content, usage } = await this.withTimeout(
151
+ this.chatWithProvider(provider, {
85
152
  message: data.message,
86
153
  model,
87
154
  systemPrompt: data.systemPrompt,
88
155
  attachment,
89
- });
90
-
91
- await this.aiExecution.recordStep({
92
- executionId,
93
- stepOrder: 0,
94
- type: 'output',
95
- provider: 'openai',
96
- model,
97
- durationMs: Date.now() - stepStart,
98
- usage,
99
- outputSummary: content.slice(0, 200),
100
- });
101
- await this.aiExecution.finish(executionId, 'completed');
102
-
103
- return { provider, model, content };
104
- }
156
+ apiKey: aiProfile.apiKey,
157
+ baseUrl: aiProfile.baseUrl,
158
+ params,
159
+ }),
160
+ timeoutMs,
161
+ );
105
162
 
106
- const model = data.model || 'gemini-1.5-flash';
107
- const { content, usage } = await this.chatWithGemini({
108
- message: data.message,
163
+ await this.aiExecution.recordStep({
164
+ executionId,
165
+ stepOrder: 0,
166
+ type: 'output',
167
+ provider,
109
168
  model,
110
- systemPrompt: data.systemPrompt,
111
- attachment,
169
+ durationMs: Date.now() - stepStart,
170
+ usage,
171
+ outputSummary: content.slice(0, 200),
112
172
  });
173
+ await this.aiExecution.finish(executionId, 'completed');
174
+
175
+ return { provider, model, content };
176
+ } catch (err) {
177
+ await this.aiExecution.finish(executionId, 'failed', String(err));
178
+ throw err;
179
+ }
180
+ }
181
+
182
+ /**
183
+ * Chat driven by prompts stored in `ai_instruction`.
184
+ *
185
+ * Resolves the system and user prompts by slug in one query, applies whatever
186
+ * model params the records declare (falling back to `params` and then to the
187
+ * provider defaults), and reports back where each prompt came from so callers
188
+ * can log a fallback.
189
+ */
190
+ async chatWithPrompt(input: {
191
+ systemPromptSlug?: string;
192
+ userPromptSlug: string;
193
+ variables?: TemplateVars;
194
+ provider?: AiProvider;
195
+ /**
196
+ * Perfil de integração a usar, no lugar do setting global por provider.
197
+ *
198
+ * Quando presente, o provider vem do perfil — é o que permite um módulo
199
+ * (o SAC, por exemplo) ter o próprio perfil de IA sem afetar o resto do
200
+ * sistema. Mesmo padrão que `sendTemplatedMail` já usa para e-mail.
201
+ */
202
+ profileSlug?: string;
203
+ params?: AiChatModelParams;
204
+ contextSlug?: string;
205
+ }): Promise<{
206
+ provider: AiProvider;
207
+ model: string;
208
+ content: string;
209
+ promptSources: Record<string, PromptSource>;
210
+ }> {
211
+ const slugs = input.systemPromptSlug
212
+ ? [input.systemPromptSlug, input.userPromptSlug]
213
+ : [input.userPromptSlug];
214
+
215
+ const resolved = await this.promptResolver.resolveMany(
216
+ slugs.map((slug) => ({ slug, variables: input.variables })),
217
+ );
218
+
219
+ const systemPrompt = input.systemPromptSlug
220
+ ? resolved[input.systemPromptSlug]
221
+ : undefined;
222
+ const userPrompt = resolved[input.userPromptSlug];
223
+
224
+ // The system prompt represents the call, so its params win over the user one.
225
+ const stored = mergeModelParams(systemPrompt, userPrompt);
226
+
227
+ // Um perfil explícito manda no provider: pedir "openai" e apontar um perfil
228
+ // Claude bateria na API errada com a chave errada.
229
+ const target = await this.resolveProviderAndProfile(
230
+ input.provider,
231
+ input.profileSlug,
232
+ );
233
+ const provider = target.provider;
234
+ const aiProfile = target.profile;
235
+ const model =
236
+ stored.model || aiProfile.model || this.getDefaultModel(provider);
237
+ const timeoutMs = aiProfile.timeoutMs ?? DEFAULT_AI_CALL_TIMEOUT_MS;
238
+
239
+ const params: AiChatModelParams = {
240
+ temperature: stored.temperature ?? input.params?.temperature,
241
+ maxTokens: stored.maxTokens ?? input.params?.maxTokens,
242
+ responseFormat: input.params?.responseFormat,
243
+ };
244
+
245
+ const executionId = await this.aiExecution.start({
246
+ trigger: 'api',
247
+ contextSlug: input.contextSlug || input.userPromptSlug,
248
+ });
249
+ const stepStart = Date.now();
250
+
251
+ try {
252
+ const { content, usage } = await this.withTimeout(
253
+ this.chatWithProvider(provider, {
254
+ message: userPrompt.content,
255
+ model,
256
+ systemPrompt: systemPrompt?.content || undefined,
257
+ apiKey: aiProfile.apiKey,
258
+ baseUrl: aiProfile.baseUrl,
259
+ params,
260
+ }),
261
+ timeoutMs,
262
+ );
113
263
 
114
264
  await this.aiExecution.recordStep({
115
265
  executionId,
116
266
  stepOrder: 0,
117
267
  type: 'output',
118
- provider: 'gemini',
268
+ provider,
119
269
  model,
120
270
  durationMs: Date.now() - stepStart,
121
271
  usage,
@@ -123,7 +273,11 @@ export class AiService implements OnModuleInit {
123
273
  });
124
274
  await this.aiExecution.finish(executionId, 'completed');
125
275
 
126
- return { provider, model, content };
276
+ const promptSources = Object.fromEntries(
277
+ Object.entries(resolved).map(([slug, prompt]) => [slug, prompt.source]),
278
+ );
279
+
280
+ return { provider, model, content, promptSources };
127
281
  } catch (err) {
128
282
  await this.aiExecution.finish(executionId, 'failed', String(err));
129
283
  throw err;
@@ -155,7 +309,7 @@ export class AiService implements OnModuleInit {
155
309
  INSERT INTO ai_agent (slug, provider, model, instructions, external_agent_id)
156
310
  VALUES (
157
311
  ${slug},
158
- CAST(${provider} AS ai_agent_provider_enum),
312
+ CAST(${provider} AS ai_agent_provider_7cb93b1143_enum),
159
313
  ${model},
160
314
  ${instructions},
161
315
  ${externalAgentId}
@@ -165,6 +319,39 @@ export class AiService implements OnModuleInit {
165
319
  return this.findAgentBySlug(slug);
166
320
  }
167
321
 
322
+ /**
323
+ * Creates the agent, or updates it when its stored instructions/model drifted
324
+ * from what the caller now wants.
325
+ *
326
+ * `createAgent` returns the existing row untouched, so a caller that passes
327
+ * instructions on every request would keep whatever the very first call
328
+ * persisted. That silently defeats an editable prompt: the admin would save a
329
+ * change and the agent would go on using the original text.
330
+ */
331
+ async upsertAgent(data: CreateAgentDTO) {
332
+ const existing = await this.findAgentBySlug(data.slug.trim());
333
+
334
+ if (!existing) {
335
+ return this.createAgent(data);
336
+ }
337
+
338
+ const instructions = data.instructions?.trim() || null;
339
+ const model = data.model || existing.model;
340
+
341
+ const unchanged =
342
+ (instructions === null || instructions === existing.instructions) &&
343
+ model === existing.model;
344
+
345
+ if (unchanged) {
346
+ return existing;
347
+ }
348
+
349
+ return this.updateAgent(existing.id, {
350
+ instructions: instructions ?? undefined,
351
+ model: model ?? undefined,
352
+ });
353
+ }
354
+
168
355
  async listAgents(paginationParams: PaginationDTO) {
169
356
  const page = Math.max(Number(paginationParams?.page || 1), 1);
170
357
  const pageSize = Math.min(
@@ -248,7 +435,7 @@ export class AiService implements OnModuleInit {
248
435
  await this.prismaService.$executeRaw`
249
436
  UPDATE ai_agent
250
437
  SET slug = ${slug},
251
- provider = CAST(${provider} AS ai_agent_provider_enum),
438
+ provider = CAST(${provider} AS ai_agent_provider_7cb93b1143_enum),
252
439
  model = ${model},
253
440
  instructions = ${instructions},
254
441
  external_agent_id = ${externalAgentId},
@@ -292,27 +479,11 @@ export class AiService implements OnModuleInit {
292
479
  throw new NotFoundException(`AI agent with slug "${slug}" was not found.`);
293
480
  }
294
481
 
295
- if (agent.provider === 'openai') {
296
- if (agent.external_agent_id && !attachment) {
297
- const content = await this.chatWithOpenAiAssistant(
298
- agent.external_agent_id,
299
- data.message,
300
- );
301
-
302
- return {
303
- slug: agent.slug,
304
- provider: agent.provider,
305
- model: agent.model,
306
- content,
307
- };
308
- }
309
-
310
- const { content } = await this.chatWithOpenAi({
311
- message: data.message,
312
- model: agent.model || this.getDefaultModel('openai'),
313
- systemPrompt: agent.instructions || undefined,
314
- attachment,
315
- });
482
+ if (agent.provider === 'openai' && agent.external_agent_id && !attachment) {
483
+ const content = await this.chatWithOpenAiAssistant(
484
+ agent.external_agent_id,
485
+ data.message,
486
+ );
316
487
 
317
488
  return {
318
489
  slug: agent.slug,
@@ -322,11 +493,15 @@ export class AiService implements OnModuleInit {
322
493
  };
323
494
  }
324
495
 
325
- const { content } = await this.chatWithGemini({
496
+ const aiProfile = await this.getAiProfile(agent.provider);
497
+
498
+ const { content } = await this.chatWithProvider(agent.provider, {
326
499
  message: data.message,
327
- model: agent.model || this.getDefaultModel('gemini'),
500
+ model: agent.model || this.getDefaultModel(agent.provider),
328
501
  systemPrompt: agent.instructions || undefined,
329
502
  attachment,
503
+ apiKey: aiProfile.apiKey,
504
+ baseUrl: aiProfile.baseUrl,
330
505
  });
331
506
 
332
507
  return {
@@ -435,15 +610,108 @@ export class AiService implements OnModuleInit {
435
610
  }
436
611
 
437
612
  private getDefaultModel(provider: AiProvider): string {
438
- if (provider === 'openai') {
439
- return 'gpt-4o-mini';
613
+ if (provider === 'gemini') {
614
+ return 'gemini-1.5-flash';
440
615
  }
441
616
 
442
- return 'gemini-1.5-flash';
617
+ if (provider === 'deepseek') {
618
+ return DEEPSEEK_DEFAULT_MODEL;
619
+ }
620
+
621
+ if (provider === 'claude') {
622
+ return 'claude-sonnet-4-5';
623
+ }
624
+
625
+ return 'gpt-4o-mini';
626
+ }
627
+
628
+ /** Default AI provider used when a caller doesn't specify one (Settings → AI). */
629
+ private async getDefaultProvider(): Promise<AiProvider> {
630
+ const settings = await this.settingService.getSettingValues(['ai-default-provider']);
631
+ const value = String(settings['ai-default-provider'] ?? '').trim();
632
+ return value in AI_PROFILE_SETTING ? (value as AiProvider) : 'openai';
633
+ }
634
+
635
+ /**
636
+ * Envia o chat ao provider certo.
637
+ *
638
+ * O DeepSeek expõe a mesma API de `/chat/completions` da OpenAI, então reusa o
639
+ * caminho da OpenAI trocando a base URL — só não aceita imagens, porque os
640
+ * modelos `deepseek-chat`/`deepseek-reasoner` não têm visão.
641
+ */
642
+ private chatWithProvider(
643
+ provider: AiProvider,
644
+ input: {
645
+ message: string;
646
+ model: string;
647
+ systemPrompt?: string;
648
+ attachment?: AiAttachment | null;
649
+ apiKey?: string;
650
+ baseUrl?: string;
651
+ params?: AiChatModelParams;
652
+ },
653
+ ) {
654
+ if (provider === 'gemini') {
655
+ return this.chatWithGemini(input);
656
+ }
657
+
658
+ if (provider === 'claude') {
659
+ return this.chatWithClaude(input);
660
+ }
661
+
662
+ if (provider === 'deepseek') {
663
+ return this.chatWithOpenAi({
664
+ ...input,
665
+ provider,
666
+ baseUrl: input.baseUrl || DEEPSEEK_API_BASE_URL,
667
+ supportsImages: false,
668
+ });
669
+ }
670
+
671
+ return this.chatWithOpenAi(input);
443
672
  }
444
673
 
445
674
  private async getAiApiKey(provider: AiProvider): Promise<string> {
446
- const slug = provider === 'openai' ? 'ai-openai-profile-id' : 'ai-gemini-profile-id';
675
+ return (await this.getAiProfile(provider)).apiKey;
676
+ }
677
+
678
+ /**
679
+ * Resolve provider e credenciais juntos.
680
+ *
681
+ * Com `profileSlug`, o provider vem do perfil — o chamador escolheu uma conta
682
+ * concreta, e o setting global do provider não tem nada a dizer sobre ela.
683
+ */
684
+ private async resolveProviderAndProfile(
685
+ provider?: AiProvider,
686
+ profileSlug?: string,
687
+ ): Promise<{ provider: AiProvider; profile: AiProfileCredentials }> {
688
+ const slug = String(profileSlug ?? '').trim();
689
+
690
+ if (!slug) {
691
+ const resolvedProvider = provider || (await this.getDefaultProvider());
692
+ return {
693
+ provider: resolvedProvider,
694
+ profile: await this.getAiProfile(resolvedProvider),
695
+ };
696
+ }
697
+
698
+ const profile = await this.loadAiProfileBySlug(slug);
699
+ const providerSlug = profile.providerSlug;
700
+ const mapped = PROVIDER_BY_INTEGRATION_SLUG[providerSlug];
701
+
702
+ if (!mapped) {
703
+ throw new BadRequestException(
704
+ `AI profile "${slug}" uses provider "${providerSlug}", which is not supported for chat. ` +
705
+ `Use one of: ${Object.keys(PROVIDER_BY_INTEGRATION_SLUG).join(', ')}.`,
706
+ );
707
+ }
708
+
709
+ return { provider: mapped, profile: profile.config };
710
+ }
711
+
712
+ /** Resolves the active AI integration profile's credentials plus its optional model/timeout overrides. */
713
+ private async getAiProfile(provider: AiProvider): Promise<AiProfileCredentials> {
714
+ const slug = AI_PROFILE_SETTING[provider] ?? AI_PROFILE_SETTING.openai;
447
715
  const settings = await this.settingService.getSettingValues([slug]);
448
716
  const profileSlug = String(settings[slug] ?? '').trim();
449
717
 
@@ -453,6 +721,13 @@ export class AiService implements OnModuleInit {
453
721
  );
454
722
  }
455
723
 
724
+ return (await this.loadAiProfileBySlug(profileSlug)).config;
725
+ }
726
+
727
+ private async loadAiProfileBySlug(profileSlug: string): Promise<{
728
+ providerSlug: string;
729
+ config: AiProfileCredentials;
730
+ }> {
456
731
  const profile = await this.prismaService.integration_profile.findUnique({
457
732
  where: { slug: profileSlug },
458
733
  include: { integration_provider: { select: { slug: true } } },
@@ -462,16 +737,33 @@ export class AiService implements OnModuleInit {
462
737
  throw new BadRequestException(`AI profile "${profileSlug}" not found.`);
463
738
  }
464
739
 
465
- const { apiKey } = buildAiConfigFromIntegration(
740
+ const aiConfig = buildAiConfigFromIntegration(
466
741
  profile.integration_provider.slug,
467
742
  profile.config,
468
743
  );
469
744
 
470
- if (!apiKey) {
745
+ if (!aiConfig.apiKey) {
471
746
  throw new BadRequestException(`AI profile "${profileSlug}" has no API key configured.`);
472
747
  }
473
748
 
474
- return apiKey;
749
+ return { providerSlug: profile.integration_provider.slug, config: aiConfig };
750
+ }
751
+
752
+ /** Rejects with a timeout error if `promise` doesn't settle within `ms`. */
753
+ private withTimeout<T>(promise: Promise<T>, ms: number): Promise<T> {
754
+ return new Promise<T>((resolve, reject) => {
755
+ const timer = setTimeout(() => reject(new Error(`AI call timed out after ${ms}ms`)), ms);
756
+ promise.then(
757
+ (value) => {
758
+ clearTimeout(timer);
759
+ resolve(value);
760
+ },
761
+ (error) => {
762
+ clearTimeout(timer);
763
+ reject(error);
764
+ },
765
+ );
766
+ });
475
767
  }
476
768
 
477
769
  private async chatWithOpenAi({
@@ -479,13 +771,24 @@ export class AiService implements OnModuleInit {
479
771
  model,
480
772
  systemPrompt,
481
773
  attachment,
774
+ apiKey,
775
+ params,
776
+ provider = 'openai',
777
+ baseUrl = 'https://api.openai.com/v1',
778
+ supportsImages = true,
482
779
  }: {
483
780
  message: string;
484
781
  model: string;
485
782
  systemPrompt?: string;
486
783
  attachment?: AiAttachment | null;
784
+ apiKey?: string;
785
+ params?: AiChatModelParams;
786
+ /** Provider dono da chave — o DeepSeek usa este mesmo formato de requisição. */
787
+ provider?: AiProvider;
788
+ baseUrl?: string;
789
+ supportsImages?: boolean;
487
790
  }): Promise<{ content: string; usage?: { input: number; output: number; total: number } }> {
488
- const openai = await this.getAiApiKey('openai');
791
+ const openai = apiKey ?? (await this.getAiApiKey(provider));
489
792
 
490
793
  const messages: Array<any> = [];
491
794
 
@@ -493,12 +796,22 @@ export class AiService implements OnModuleInit {
493
796
  messages.push({ role: 'system', content: systemPrompt });
494
797
  }
495
798
 
496
- const userContent = await this.buildOpenAiUserContent(message, attachment);
799
+ const userContent = await this.buildOpenAiUserContent(
800
+ message,
801
+ attachment,
802
+ supportsImages,
803
+ );
497
804
  messages.push({ role: 'user', content: userContent });
498
805
 
806
+ const body = applyOpenAiModelParams(
807
+ { messages },
808
+ { model: null, temperature: params?.temperature ?? null, maxTokens: params?.maxTokens ?? null },
809
+ { model, jsonObject: params?.responseFormat === 'json_object' },
810
+ );
811
+
499
812
  const response = await axios.post(
500
- 'https://api.openai.com/v1/chat/completions',
501
- { model, messages },
813
+ `${baseUrl.replace(/\/+$/, '')}/chat/completions`,
814
+ body,
502
815
  {
503
816
  headers: {
504
817
  Authorization: `Bearer ${openai}`,
@@ -514,6 +827,66 @@ export class AiService implements OnModuleInit {
514
827
  };
515
828
  }
516
829
 
830
+ /**
831
+ * Anthropic (Claude).
832
+ *
833
+ * A API é diferente da da OpenAI em três pontos que quebram se reusarmos
834
+ * aquele caminho: autentica por `x-api-key` (não Bearer), exige o header de
835
+ * versão, e o system prompt é um campo à parte em vez de uma mensagem com
836
+ * `role: system`. `max_tokens` é obrigatório — sem ele a requisição é
837
+ * recusada, daí o padrão.
838
+ *
839
+ * Anexo não é suportado aqui: a Anthropic recebe imagem como bloco base64, e
840
+ * nenhum chamador do SAC manda anexo para o modelo.
841
+ */
842
+ private async chatWithClaude({
843
+ message,
844
+ model,
845
+ systemPrompt,
846
+ apiKey,
847
+ params,
848
+ }: {
849
+ message: string;
850
+ model: string;
851
+ systemPrompt?: string;
852
+ apiKey?: string;
853
+ params?: AiChatModelParams;
854
+ }): Promise<{ content: string; usage?: { input: number; output: number; total: number } }> {
855
+ const key = apiKey ?? (await this.getAiApiKey('claude'));
856
+
857
+ const body: Record<string, unknown> = {
858
+ model,
859
+ max_tokens: params?.maxTokens ?? 4096,
860
+ messages: [{ role: 'user', content: message }],
861
+ };
862
+ if (systemPrompt) body.system = systemPrompt;
863
+ if (params?.temperature !== undefined && params?.temperature !== null) {
864
+ body.temperature = params.temperature;
865
+ }
866
+
867
+ const response = await axios.post('https://api.anthropic.com/v1/messages', body, {
868
+ headers: {
869
+ 'x-api-key': key,
870
+ 'anthropic-version': '2023-06-01',
871
+ 'Content-Type': 'application/json',
872
+ },
873
+ });
874
+
875
+ const content = response.data?.content?.[0]?.text ?? '';
876
+ const u = response.data?.usage;
877
+
878
+ return {
879
+ content,
880
+ usage: u
881
+ ? {
882
+ input: u.input_tokens ?? 0,
883
+ output: u.output_tokens ?? 0,
884
+ total: (u.input_tokens ?? 0) + (u.output_tokens ?? 0),
885
+ }
886
+ : undefined,
887
+ };
888
+ }
889
+
517
890
  private async createOpenAiAssistant({
518
891
  slug,
519
892
  model,
@@ -525,12 +898,17 @@ export class AiService implements OnModuleInit {
525
898
  }): Promise<string> {
526
899
  const openai = await this.getAiApiKey('openai');
527
900
 
901
+ const defaultInstructions = await this.promptResolver.resolve({
902
+ slug: CORE_AI_PROMPT_SLUGS.agentDefaultInstructions,
903
+ variables: { slug },
904
+ });
905
+
528
906
  const response = await axios.post(
529
907
  'https://api.openai.com/v1/assistants',
530
908
  {
531
909
  name: slug,
532
910
  model,
533
- instructions: instructions || `You are the assistant identified by slug ${slug}.`,
911
+ instructions: instructions || defaultInstructions.content,
534
912
  },
535
913
  {
536
914
  headers: {
@@ -646,13 +1024,17 @@ export class AiService implements OnModuleInit {
646
1024
  model,
647
1025
  systemPrompt,
648
1026
  attachment,
1027
+ apiKey,
1028
+ params,
649
1029
  }: {
650
1030
  message: string;
651
1031
  model: string;
652
1032
  systemPrompt?: string;
653
1033
  attachment?: AiAttachment | null;
1034
+ apiKey?: string;
1035
+ params?: AiChatModelParams;
654
1036
  }): Promise<{ content: string; usage?: { input: number; output: number; total: number } }> {
655
- const gemini = await this.getAiApiKey('gemini');
1037
+ const gemini = apiKey ?? (await this.getAiApiKey('gemini'));
656
1038
 
657
1039
  const url = `https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent?key=${gemini}`;
658
1040
 
@@ -661,13 +1043,13 @@ export class AiService implements OnModuleInit {
661
1043
  if (attachment) {
662
1044
  if (this.isTextMime(attachment.mimeType)) {
663
1045
  userParts.push({
664
- text: `\n\n[Attached file: ${attachment.filename}]\n${this.toUtf8Text(attachment.buffer)}`,
1046
+ text: attachedFileBlock(attachment.filename, this.toUtf8Text(attachment.buffer)),
665
1047
  });
666
1048
  } else if (this.isPdfMime(attachment.mimeType)) {
667
1049
  const pdfText = await this.extractPdfText(attachment.buffer);
668
1050
  if (pdfText) {
669
1051
  userParts.push({
670
- text: `\n\n[Attached file: ${attachment.filename}]\n${pdfText}`,
1052
+ text: attachedFileBlock(attachment.filename, pdfText),
671
1053
  });
672
1054
  } else {
673
1055
  userParts.push({
@@ -687,7 +1069,7 @@ export class AiService implements OnModuleInit {
687
1069
  }
688
1070
  }
689
1071
 
690
- const payload: any = {
1072
+ let payload: any = {
691
1073
  contents: [{ parts: userParts }],
692
1074
  };
693
1075
 
@@ -697,6 +1079,12 @@ export class AiService implements OnModuleInit {
697
1079
  };
698
1080
  }
699
1081
 
1082
+ payload = applyGeminiModelParams(
1083
+ payload,
1084
+ { model: null, temperature: params?.temperature ?? null, maxTokens: params?.maxTokens ?? null },
1085
+ { jsonObject: params?.responseFormat === 'json_object' },
1086
+ );
1087
+
700
1088
  const response = await axios.post(url, payload, {
701
1089
  headers: {
702
1090
  'Content-Type': 'application/json',
@@ -751,12 +1139,13 @@ export class AiService implements OnModuleInit {
751
1139
  private async buildOpenAiUserContent(
752
1140
  message: string,
753
1141
  attachment?: AiAttachment | null,
1142
+ supportsImages = true,
754
1143
  ) {
755
1144
  if (!attachment) {
756
1145
  return message;
757
1146
  }
758
1147
 
759
- if (this.isImageMime(attachment.mimeType)) {
1148
+ if (supportsImages && this.isImageMime(attachment.mimeType)) {
760
1149
  const dataUri = `data:${attachment.mimeType};base64,${attachment.buffer.toString('base64')}`;
761
1150
  return [
762
1151
  { type: 'text', text: message },
@@ -771,12 +1160,16 @@ export class AiService implements OnModuleInit {
771
1160
  } else if (this.isPdfMime(attachment.mimeType)) {
772
1161
  text =
773
1162
  (await this.extractPdfText(attachment.buffer)) ||
774
- `[PDF attachment with unreadable text: ${attachment.filename}]`;
1163
+ unreadablePdfMarker(attachment.filename);
775
1164
  } else {
776
- text = `[Binary attachment: ${attachment.filename} | ${attachment.mimeType} | ${attachment.buffer.length} bytes]`;
1165
+ text = binaryAttachmentMarker(
1166
+ attachment.filename,
1167
+ attachment.mimeType,
1168
+ attachment.buffer.length,
1169
+ );
777
1170
  }
778
1171
 
779
- return `${message}\n\n[Attached file: ${attachment.filename}]\n${text}`;
1172
+ return `${message}${attachedFileBlock(attachment.filename, text)}`;
780
1173
  }
781
1174
 
782
1175
  private isImageMime(mimeType: string) {