@hed-hog/core 0.0.400 → 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 (203) hide show
  1. package/dist/ai/ai.controller.d.ts +2 -0
  2. package/dist/ai/ai.controller.d.ts.map +1 -1
  3. package/dist/ai/ai.service.d.ts +86 -2
  4. package/dist/ai/ai.service.d.ts.map +1 -1
  5. package/dist/ai/ai.service.js +304 -23
  6. package/dist/ai/ai.service.js.map +1 -1
  7. package/dist/ai-instruction/ai-prompt-resolver.service.d.ts +12 -0
  8. package/dist/ai-instruction/ai-prompt-resolver.service.d.ts.map +1 -1
  9. package/dist/ai-instruction/ai-prompt-resolver.service.js +26 -0
  10. package/dist/ai-instruction/ai-prompt-resolver.service.js.map +1 -1
  11. package/dist/core.module.d.ts.map +1 -1
  12. package/dist/core.module.js +3 -0
  13. package/dist/core.module.js.map +1 -1
  14. package/dist/document-kit/document-kit.module.d.ts +3 -0
  15. package/dist/document-kit/document-kit.module.d.ts.map +1 -0
  16. package/dist/document-kit/document-kit.module.js +24 -0
  17. package/dist/document-kit/document-kit.module.js.map +1 -0
  18. package/dist/document-kit/document-kit.registry.d.ts +55 -0
  19. package/dist/document-kit/document-kit.registry.d.ts.map +1 -0
  20. package/dist/document-kit/document-kit.registry.js +91 -0
  21. package/dist/document-kit/document-kit.registry.js.map +1 -0
  22. package/dist/document-kit/document-kit.service.d.ts +49 -0
  23. package/dist/document-kit/document-kit.service.d.ts.map +1 -0
  24. package/dist/document-kit/document-kit.service.js +135 -0
  25. package/dist/document-kit/document-kit.service.js.map +1 -0
  26. package/dist/file/file.service.d.ts +15 -1
  27. package/dist/file/file.service.d.ts.map +1 -1
  28. package/dist/file/file.service.js +52 -24
  29. package/dist/file/file.service.js.map +1 -1
  30. package/dist/file/mcp-file-source.schema.d.ts.map +1 -1
  31. package/dist/file/mcp-file-source.schema.js +8 -5
  32. package/dist/file/mcp-file-source.schema.js.map +1 -1
  33. package/dist/index.d.ts +5 -0
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +5 -0
  36. package/dist/index.js.map +1 -1
  37. package/dist/integration-profile/integration-profile.secrets.d.ts.map +1 -1
  38. package/dist/integration-profile/integration-profile.secrets.js +21 -0
  39. package/dist/integration-profile/integration-profile.secrets.js.map +1 -1
  40. package/dist/integration-profile/testers/ai.testers.d.ts.map +1 -1
  41. package/dist/integration-profile/testers/ai.testers.js +46 -8
  42. package/dist/integration-profile/testers/ai.testers.js.map +1 -1
  43. package/dist/mcp/mcp.module.d.ts.map +1 -1
  44. package/dist/mcp/mcp.module.js +2 -0
  45. package/dist/mcp/mcp.module.js.map +1 -1
  46. package/dist/mcp/tools/core-access-log.mcp-tools.d.ts +17 -0
  47. package/dist/mcp/tools/core-access-log.mcp-tools.d.ts.map +1 -0
  48. package/dist/mcp/tools/core-access-log.mcp-tools.js +74 -0
  49. package/dist/mcp/tools/core-access-log.mcp-tools.js.map +1 -0
  50. package/dist/mcp/tools/core-files.mcp-tools.js +4 -4
  51. package/dist/mcp/tools/core-files.mcp-tools.js.map +1 -1
  52. package/dist/meeting/meeting-provider.registry.d.ts +72 -0
  53. package/dist/meeting/meeting-provider.registry.d.ts.map +1 -1
  54. package/dist/meeting/meeting-provider.registry.js.map +1 -1
  55. package/dist/oauth/oauth-token-broker.service.d.ts +50 -1
  56. package/dist/oauth/oauth-token-broker.service.d.ts.map +1 -1
  57. package/dist/oauth/oauth-token-broker.service.js +105 -3
  58. package/dist/oauth/oauth-token-broker.service.js.map +1 -1
  59. package/dist/oauth/providers/microsoft-entra-id.provider.d.ts +6 -0
  60. package/dist/oauth/providers/microsoft-entra-id.provider.d.ts.map +1 -1
  61. package/dist/oauth/providers/microsoft-entra-id.provider.js +30 -4
  62. package/dist/oauth/providers/microsoft-entra-id.provider.js.map +1 -1
  63. package/dist/pdf/document/charts/chart-bar.d.ts +24 -0
  64. package/dist/pdf/document/charts/chart-bar.d.ts.map +1 -0
  65. package/dist/pdf/document/charts/chart-bar.js +117 -0
  66. package/dist/pdf/document/charts/chart-bar.js.map +1 -0
  67. package/dist/pdf/document/charts/chart-donut.d.ts +16 -0
  68. package/dist/pdf/document/charts/chart-donut.d.ts.map +1 -0
  69. package/dist/pdf/document/charts/chart-donut.js +89 -0
  70. package/dist/pdf/document/charts/chart-donut.js.map +1 -0
  71. package/dist/pdf/document/charts/chart-gauge.d.ts +15 -0
  72. package/dist/pdf/document/charts/chart-gauge.d.ts.map +1 -0
  73. package/dist/pdf/document/charts/chart-gauge.js +60 -0
  74. package/dist/pdf/document/charts/chart-gauge.js.map +1 -0
  75. package/dist/pdf/document/charts/chart-line.d.ts +29 -0
  76. package/dist/pdf/document/charts/chart-line.d.ts.map +1 -0
  77. package/dist/pdf/document/charts/chart-line.js +89 -0
  78. package/dist/pdf/document/charts/chart-line.js.map +1 -0
  79. package/dist/pdf/document/charts/chart-primitives.d.ts +64 -0
  80. package/dist/pdf/document/charts/chart-primitives.d.ts.map +1 -0
  81. package/dist/pdf/document/charts/chart-primitives.js +110 -0
  82. package/dist/pdf/document/charts/chart-primitives.js.map +1 -0
  83. package/dist/pdf/document/charts/chart-radar.d.ts +13 -0
  84. package/dist/pdf/document/charts/chart-radar.d.ts.map +1 -0
  85. package/dist/pdf/document/charts/chart-radar.js +83 -0
  86. package/dist/pdf/document/charts/chart-radar.js.map +1 -0
  87. package/dist/pdf/document/charts/chart-scale.d.ts +39 -0
  88. package/dist/pdf/document/charts/chart-scale.d.ts.map +1 -0
  89. package/dist/pdf/document/charts/chart-scale.js +118 -0
  90. package/dist/pdf/document/charts/chart-scale.js.map +1 -0
  91. package/dist/pdf/document/charts/index.d.ts +8 -0
  92. package/dist/pdf/document/charts/index.d.ts.map +1 -0
  93. package/dist/pdf/document/charts/index.js +24 -0
  94. package/dist/pdf/document/charts/index.js.map +1 -0
  95. package/dist/pdf/document/index.d.ts +8 -0
  96. package/dist/pdf/document/index.d.ts.map +1 -0
  97. package/dist/pdf/document/index.js +24 -0
  98. package/dist/pdf/document/index.js.map +1 -0
  99. package/dist/pdf/document/pdf-document.chrome.d.ts +20 -0
  100. package/dist/pdf/document/pdf-document.chrome.d.ts.map +1 -0
  101. package/dist/pdf/document/pdf-document.chrome.js +36 -0
  102. package/dist/pdf/document/pdf-document.chrome.js.map +1 -0
  103. package/dist/pdf/document/pdf-document.css.d.ts +20 -0
  104. package/dist/pdf/document/pdf-document.css.d.ts.map +1 -0
  105. package/dist/pdf/document/pdf-document.css.js +239 -0
  106. package/dist/pdf/document/pdf-document.css.js.map +1 -0
  107. package/dist/pdf/document/pdf-document.renderer.d.ts +10 -0
  108. package/dist/pdf/document/pdf-document.renderer.d.ts.map +1 -0
  109. package/dist/pdf/document/pdf-document.renderer.js +153 -0
  110. package/dist/pdf/document/pdf-document.renderer.js.map +1 -0
  111. package/dist/pdf/document/pdf-document.service.d.ts +27 -0
  112. package/dist/pdf/document/pdf-document.service.d.ts.map +1 -0
  113. package/dist/pdf/document/pdf-document.service.js +81 -0
  114. package/dist/pdf/document/pdf-document.service.js.map +1 -0
  115. package/dist/pdf/document/pdf-document.theme.d.ts +41 -0
  116. package/dist/pdf/document/pdf-document.theme.d.ts.map +1 -0
  117. package/dist/pdf/document/pdf-document.theme.js +105 -0
  118. package/dist/pdf/document/pdf-document.theme.js.map +1 -0
  119. package/dist/pdf/document/pdf-document.types.d.ts +108 -0
  120. package/dist/pdf/document/pdf-document.types.d.ts.map +1 -0
  121. package/dist/pdf/document/pdf-document.types.js +18 -0
  122. package/dist/pdf/document/pdf-document.types.js.map +1 -0
  123. package/dist/pdf/pdf.module.d.ts.map +1 -1
  124. package/dist/pdf/pdf.module.js +3 -2
  125. package/dist/pdf/pdf.module.js.map +1 -1
  126. package/dist/pdf/pdf.service.d.ts +69 -1
  127. package/dist/pdf/pdf.service.d.ts.map +1 -1
  128. package/dist/pdf/pdf.service.js +164 -63
  129. package/dist/pdf/pdf.service.js.map +1 -1
  130. package/dist/pdf/templates/commercial-proposal.template.d.ts +96 -0
  131. package/dist/pdf/templates/commercial-proposal.template.d.ts.map +1 -0
  132. package/dist/pdf/templates/commercial-proposal.template.js +276 -0
  133. package/dist/pdf/templates/commercial-proposal.template.js.map +1 -0
  134. package/dist/setting/favicon.controller.d.ts +26 -0
  135. package/dist/setting/favicon.controller.d.ts.map +1 -0
  136. package/dist/setting/favicon.controller.js +130 -0
  137. package/dist/setting/favicon.controller.js.map +1 -0
  138. package/dist/setting/setting.module.d.ts.map +1 -1
  139. package/dist/setting/setting.module.js +2 -1
  140. package/dist/setting/setting.module.js.map +1 -1
  141. package/dist/whatsapp-sender/whatsapp-sender.service.d.ts.map +1 -1
  142. package/dist/whatsapp-sender/whatsapp-sender.service.js +25 -2
  143. package/dist/whatsapp-sender/whatsapp-sender.service.js.map +1 -1
  144. package/hedhog/data/integration_type.yaml +6 -0
  145. package/hedhog/data/route.yaml +8 -0
  146. package/hedhog/data/setting_group.yaml +52 -0
  147. package/hedhog/frontend/messages/en.json +54 -1
  148. package/hedhog/frontend/messages/pt.json +54 -1
  149. package/package.json +4 -4
  150. package/src/ai/ai-attachment.fragments.spec.ts +56 -3
  151. package/src/ai/ai.service.responses.spec.ts +429 -0
  152. package/src/ai/ai.service.ts +409 -27
  153. package/src/ai-instruction/ai-prompt-resolver.service.spec.ts +44 -0
  154. package/src/ai-instruction/ai-prompt-resolver.service.ts +29 -0
  155. package/src/core.module.ts +3 -0
  156. package/src/document-kit/document-kit.module.ts +12 -0
  157. package/src/document-kit/document-kit.registry.ts +125 -0
  158. package/src/document-kit/document-kit.service.spec.ts +156 -0
  159. package/src/document-kit/document-kit.service.ts +173 -0
  160. package/src/file/file.service.spec.ts +168 -1
  161. package/src/file/file.service.ts +72 -34
  162. package/src/file/mcp-file-source.schema.ts +8 -5
  163. package/src/index.ts +5 -0
  164. package/src/integration-profile/integration-profile.secrets.ts +21 -0
  165. package/src/integration-profile/testers/ai.testers.ts +70 -5
  166. package/src/integration-profile/testers/remaining.testers.spec.ts +65 -1
  167. package/src/integration-profile/testers/tester-coverage.spec.ts +10 -0
  168. package/src/mcp/mcp.module.ts +2 -0
  169. package/src/mcp/tools/core-access-log.mcp-tools.ts +66 -0
  170. package/src/mcp/tools/core-files.mcp-tools.ts +4 -4
  171. package/src/meeting/meeting-provider.registry.ts +80 -0
  172. package/src/oauth/oauth-token-broker.service.spec.ts +108 -0
  173. package/src/oauth/oauth-token-broker.service.ts +129 -2
  174. package/src/oauth/providers/microsoft-entra-id.provider.spec.ts +133 -0
  175. package/src/oauth/providers/microsoft-entra-id.provider.ts +29 -2
  176. package/src/pdf/document/charts/chart-bar.ts +217 -0
  177. package/src/pdf/document/charts/chart-donut.ts +163 -0
  178. package/src/pdf/document/charts/chart-gauge.ts +94 -0
  179. package/src/pdf/document/charts/chart-line.ts +159 -0
  180. package/src/pdf/document/charts/chart-primitives.ts +188 -0
  181. package/src/pdf/document/charts/chart-radar.ts +136 -0
  182. package/src/pdf/document/charts/chart-scale.spec.ts +93 -0
  183. package/src/pdf/document/charts/chart-scale.ts +141 -0
  184. package/src/pdf/document/charts/charts.spec.ts +157 -0
  185. package/src/pdf/document/charts/index.ts +7 -0
  186. package/src/pdf/document/index.ts +7 -0
  187. package/src/pdf/document/pdf-document.chrome.ts +38 -0
  188. package/src/pdf/document/pdf-document.css.ts +238 -0
  189. package/src/pdf/document/pdf-document.renderer.spec.ts +129 -0
  190. package/src/pdf/document/pdf-document.renderer.ts +215 -0
  191. package/src/pdf/document/pdf-document.service.ts +77 -0
  192. package/src/pdf/document/pdf-document.theme.ts +146 -0
  193. package/src/pdf/document/pdf-document.types.ts +97 -0
  194. package/src/pdf/pdf.module.ts +3 -2
  195. package/src/pdf/pdf.service.spec.ts +131 -0
  196. package/src/pdf/pdf.service.ts +245 -82
  197. package/src/pdf/templates/commercial-proposal.template.spec.ts +177 -0
  198. package/src/pdf/templates/commercial-proposal.template.ts +400 -0
  199. package/src/setting/favicon.controller.spec.ts +92 -0
  200. package/src/setting/favicon.controller.ts +135 -0
  201. package/src/setting/setting.module.ts +2 -1
  202. package/src/whatsapp-sender/whatsapp-sender.service.spec.ts +73 -0
  203. package/src/whatsapp-sender/whatsapp-sender.service.ts +32 -2
@@ -329,6 +329,7 @@
329
329
  component: entity-picker
330
330
  entity_filter:
331
331
  typeSlug: ai
332
+ providerSlug: openai
332
333
  name:
333
334
  en: OpenAI Profile
334
335
  pt: Perfil OpenAI
@@ -345,6 +346,7 @@
345
346
  component: entity-picker
346
347
  entity_filter:
347
348
  typeSlug: ai
349
+ providerSlug: gemini
348
350
  name:
349
351
  en: Gemini Profile
350
352
  pt: Perfil Gemini
@@ -361,6 +363,7 @@
361
363
  component: entity-picker
362
364
  entity_filter:
363
365
  typeSlug: ai
366
+ providerSlug: deepseek
364
367
  name:
365
368
  en: DeepSeek Profile
366
369
  pt: Perfil DeepSeek
@@ -1213,6 +1216,11 @@
1213
1216
  # para o arquivo original em vez do arquivo em si.
1214
1217
  - value: Files.Read.All
1215
1218
  order: 15
1219
+ # Necessario para o sistema PUBLICAR no chat da reuniao (o convite da
1220
+ # chamada por codigo). E o unico escopo de ESCRITA em chat que
1221
+ # usamos, e so a conta de servico precisa dele.
1222
+ - value: Chat.ReadWrite
1223
+ order: 16
1216
1224
  subgroup_id:
1217
1225
  where:
1218
1226
  slug: microsoft-entra-id
@@ -2658,4 +2666,48 @@
2658
2666
  pt: Cor hexadecimal principal para PDFs da área Research (padrão #9400B5)
2659
2667
  value: '#9400B5'
2660
2668
  user_override: false
2669
+ - slug: pdf-legal-footer
2670
+ type: string
2671
+ component: input-text
2672
+ name:
2673
+ en: Legal Footer
2674
+ pt: Rodapé Legal
2675
+ description:
2676
+ en: Line repeated in the footer of commercial documents, such as legal name, tax ID and address. Leave empty to show the company name.
2677
+ pt: Linha repetida no rodapé dos documentos comerciais, como razão social, CNPJ e endereço. Deixe vazio para mostrar o nome da empresa.
2678
+ value: ''
2679
+ user_override: false
2680
+ - slug: pdf-partner-line
2681
+ type: string
2682
+ component: input-text
2683
+ name:
2684
+ en: Partner Line
2685
+ pt: Linha de Parceiros
2686
+ description:
2687
+ en: Short line printed on the cover of commercial proposals, such as partnerships or certifications. Leave empty to hide it.
2688
+ pt: Linha curta impressa na capa das propostas comerciais, como parcerias ou certificações. Deixe vazio para ocultar.
2689
+ value: ''
2690
+ user_override: false
2691
+ - slug: pdf-font-family
2692
+ type: string
2693
+ component: input-text
2694
+ name:
2695
+ en: Document Font
2696
+ pt: Fonte dos Documentos
2697
+ description:
2698
+ en: CSS font stack for the body and titles of commercial documents.
2699
+ pt: Pilha de fontes CSS para o corpo e os títulos dos documentos comerciais.
2700
+ value: "'Inter', sans-serif"
2701
+ user_override: false
2702
+ - slug: pdf-font-mono
2703
+ type: string
2704
+ component: input-text
2705
+ name:
2706
+ en: Label Font
2707
+ pt: Fonte dos Rótulos
2708
+ description:
2709
+ en: Monospace CSS font stack for labels, section numbers and the footer of commercial documents.
2710
+ pt: Pilha de fontes CSS monoespaçada para rótulos, números de seção e rodapé dos documentos comerciais.
2711
+ value: "'JetBrains Mono', monospace"
2712
+ user_override: false
2661
2713
 
@@ -2666,9 +2666,12 @@
2666
2666
  "fieldBusinessId": "Business ID",
2667
2667
  "fieldAppId": "Meta App ID",
2668
2668
  "fieldAppSecret": "Meta App Secret",
2669
+ "fieldInstagramAppId": "Instagram App ID (Instagram > API setup with Instagram login)",
2670
+ "fieldInstagramAppSecret": "Instagram App Secret (Instagram > API setup with Instagram login)",
2669
2671
  "fieldWabaId": "WhatsApp Business Account ID (WABA)",
2670
2672
  "fieldVerifyToken": "Webhook Verify Token",
2671
2673
  "fieldGraphApiVersion": "Graph API Version",
2674
+ "fieldLinkedInApiVersion": "LinkedIn API version (YYYYMM)",
2672
2675
  "fieldEnvironmentTest": "Test",
2673
2676
  "fieldEnvironmentProduction": "Production",
2674
2677
  "copiedToClipboard": "Copied to clipboard",
@@ -2832,7 +2835,57 @@
2832
2835
  "fileStored": "A file is stored and encrypted. Click to replace it.",
2833
2836
  "fileSelected": "New file selected. It will be encrypted on save.",
2834
2837
  "fieldRtdnServiceAccount": "Notifications Service Account (RTDN)",
2835
- "fieldRtdnAudience": "Notifications Audience (RTDN)"
2838
+ "fieldRtdnAudience": "Notifications Audience (RTDN)",
2839
+ "fieldLoginConfigId": "Login Configuration ID (Facebook Login for Business)",
2840
+ "metaSocialSectionTitle": "Social network connection",
2841
+ "metaSocialDescription": "This profile is the HedHog app on Meta. Pages and Instagram accounts are connected per brand, under Social → Brands → Channels.",
2842
+ "metaSocialRedirectUriLabel": "OAuth redirect URI",
2843
+ "metaSocialRedirectUriUnavailable": "Set NEXT_PUBLIC_API_BASE_URL to show the URI",
2844
+ "metaSocialStepsTitle": "How to configure it in the Meta dashboard",
2845
+ "metaSocialStep1": "Create a Business app and add Facebook Login for Business and the Instagram API with Facebook Login.",
2846
+ "metaSocialStep2": "Create a Login Configuration of type \"User access token\" with the publishing permissions and paste its ID above.",
2847
+ "metaSocialStep3": "Add the URI above to \"Valid OAuth Redirect URIs\".",
2848
+ "metaSocialStep4": "Until App Review is approved, use Sandbox mode or only the app administrators and testers.",
2849
+ "instagramSocialSectionTitle": "Instagram connection",
2850
+ "instagramSocialDescription": "This profile is the HedHog app on the Instagram API with Instagram Login. Professional Instagram accounts (Business or Creator) are connected per brand, under Social → Brands → Channels, with or without a Facebook Page.",
2851
+ "instagramSocialRedirectUriLabel": "OAuth redirect URI",
2852
+ "instagramSocialRedirectUriUnavailable": "Set NEXT_PUBLIC_API_BASE_URL to show the URI",
2853
+ "instagramSocialStepsTitle": "How to configure it in the Meta dashboard",
2854
+ "instagramSocialStep1": "In the Meta app, add the Instagram product and open \"API setup with Instagram login\".",
2855
+ "instagramSocialStep2": "Copy the Instagram app ID and Instagram app secret shown there and paste them above. They are not the Meta app ID and secret.",
2856
+ "instagramSocialStep3": "Under \"Set up Instagram business login\" > Business login settings, add the URI above to \"OAuth redirect URIs\" exactly as shown, with no trailing slash.",
2857
+ "instagramSocialStep4": "In the same settings, fill in the Deauthorize callback URL and the Data deletion request URL with the page of your privacy instructions.",
2858
+ "instagramSocialStep5": "Until App Review is approved, add the accounts you will connect as Instagram testers of the app, or use Sandbox mode.",
2859
+ "linkedinSocialSectionTitle": "LinkedIn connection",
2860
+ "linkedinSocialDescription": "This profile is the HedHog app on the LinkedIn Community Management API. Company pages are connected per brand, under Social → Brands → Channels, by a member who is an administrator or content administrator of the page.",
2861
+ "linkedinSocialRedirectUriLabel": "Authorized redirect URL",
2862
+ "linkedinSocialRedirectUriUnavailable": "Set NEXT_PUBLIC_API_BASE_URL to show the URL",
2863
+ "linkedinSocialStepsTitle": "How to configure it in the LinkedIn Developer Portal",
2864
+ "linkedinSocialStep1": "Create a dedicated app, with no other products, linked to the company page and verified by a super admin of that LinkedIn Page.",
2865
+ "linkedinSocialStep2": "In the Products tab, request the Community Management API. Access starts in the Development tier.",
2866
+ "linkedinSocialStep3": "In the Auth tab, add the URL above to \"Authorized redirect URLs for your app\" exactly as shown, then copy the Client ID and Primary Client Secret and paste them above.",
2867
+ "linkedinSocialStep4": "Before going to production, request the Standard tier, which requires a screencast of each use case of the app.",
2868
+ "linkedinSocialStep5": "Until the Standard tier is approved, use Sandbox mode.",
2869
+ "fieldOauthAppStatus": "OAuth consent screen status",
2870
+ "fieldOauthAppStatusTesting": "Testing (the refresh token expires in 7 days and the channel must be reconnected)",
2871
+ "fieldOauthAppStatusProduction": "In production (the refresh token does not expire in 7 days)",
2872
+ "googleSocialSectionTitle": "Google connection",
2873
+ "youtubeSocialDescription": "This profile is the HedHog project on Google Cloud for YouTube. Channels are connected per brand, under Social → Brands → Channels.",
2874
+ "googleBusinessSocialDescription": "This profile is the HedHog project on Google Cloud for Google Business Profile. Locations are connected per brand, under Social → Brands → Channels.",
2875
+ "googleSocialRedirectUriLabel": "OAuth authorized redirect URI",
2876
+ "googleSocialRedirectUriUnavailable": "Set NEXT_PUBLIC_API_BASE_URL to show the URI",
2877
+ "googleSocialStepsTitle": "How to configure it in the Google Cloud Console",
2878
+ "youtubeSocialStep1": "Create a Google Cloud project just for YouTube and enable the YouTube Data API v3.",
2879
+ "youtubeSocialStep2": "Configure the OAuth consent screen with the youtube.upload and youtube.readonly scopes. Since they are sensitive scopes, the app must pass Google verification before it is published.",
2880
+ "youtubeSocialStep3": "Create an OAuth client ID of type \"Web application\", add the URI above to \"Authorized redirect URIs\" and paste the Client ID and Client Secret above.",
2881
+ "youtubeSocialStep4": "Request the YouTube API compliance audit: until it is approved, every video uploaded by the project stays private.",
2882
+ "youtubeSocialStep5": "The default project quota allows about 100 video uploads per day. When it runs out, publishing is rescheduled for after the reset (midnight Pacific Time).",
2883
+ "googleBusinessSocialStep1": "The Business Profile must have been verified for more than 60 days and have a website.",
2884
+ "googleBusinessSocialStep2": "Create a Google Cloud project just for Business Profile and request Basic API Access, providing that project number.",
2885
+ "googleBusinessSocialStep3": "Enable the My Business Account Management API, the My Business Business Information API and the Google My Business API. Until access is approved the quota is 0 and every call fails.",
2886
+ "googleBusinessSocialStep4": "Configure the OAuth consent screen with the business.manage scope.",
2887
+ "googleBusinessSocialStep5": "Create an OAuth client ID of type \"Web application\", add the URI above to \"Authorized redirect URIs\" and paste the Client ID and Client Secret above.",
2888
+ "googleSocialTestingStep": "While the consent screen is in \"Testing\", choose \"Testing\" in the status above and use Sandbox mode to develop without waiting for Google approvals."
2836
2889
  },
2837
2890
  "SystemPagesPage": {
2838
2891
  "title": "Pages",
@@ -2721,9 +2721,12 @@
2721
2721
  "fieldBusinessId": "Business ID",
2722
2722
  "fieldAppId": "Meta App ID",
2723
2723
  "fieldAppSecret": "Meta App Secret",
2724
+ "fieldInstagramAppId": "ID do app do Instagram (Instagram > API setup with Instagram login)",
2725
+ "fieldInstagramAppSecret": "Chave secreta do app do Instagram (Instagram > API setup with Instagram login)",
2724
2726
  "fieldWabaId": "ID da Conta do WhatsApp Business (WABA)",
2725
2727
  "fieldVerifyToken": "Verify Token do Webhook",
2726
2728
  "fieldGraphApiVersion": "Versão da Graph API",
2729
+ "fieldLinkedInApiVersion": "Versão da API do LinkedIn (AAAAMM)",
2727
2730
  "fieldEnvironmentTest": "Teste",
2728
2731
  "fieldEnvironmentProduction": "Produção",
2729
2732
  "copiedToClipboard": "Copiado para a área de transferência",
@@ -2887,7 +2890,57 @@
2887
2890
  "fileStored": "Arquivo armazenado e cifrado. Clique para substituir.",
2888
2891
  "fileSelected": "Novo arquivo selecionado. Será cifrado ao salvar.",
2889
2892
  "fieldRtdnServiceAccount": "Conta de Serviço das Notificações (RTDN)",
2890
- "fieldRtdnAudience": "Audience das Notificações (RTDN)"
2893
+ "fieldRtdnAudience": "Audience das Notificações (RTDN)",
2894
+ "fieldLoginConfigId": "Login Configuration ID (Facebook Login for Business)",
2895
+ "metaSocialSectionTitle": "Conexão das redes sociais",
2896
+ "metaSocialDescription": "Este perfil é o app do HedHog na Meta. As Páginas e contas Instagram são conectadas por marca, em Social → Marcas → Canais.",
2897
+ "metaSocialRedirectUriLabel": "URI de redirecionamento do OAuth",
2898
+ "metaSocialRedirectUriUnavailable": "Defina NEXT_PUBLIC_API_BASE_URL para exibir a URI",
2899
+ "metaSocialStepsTitle": "Como configurar no painel da Meta",
2900
+ "metaSocialStep1": "Crie um app do tipo Business e adicione o Facebook Login for Business e a API do Instagram com login do Facebook.",
2901
+ "metaSocialStep2": "Crie uma Login Configuration do tipo \"User access token\" com as permissões de publicação e cole o ID dela acima.",
2902
+ "metaSocialStep3": "Cadastre a URI acima em \"Valid OAuth Redirect URIs\".",
2903
+ "metaSocialStep4": "Até o App Review ser aprovado, use o modo Sandbox ou só contas de administradores e testadores do app.",
2904
+ "instagramSocialSectionTitle": "Conexão com o Instagram",
2905
+ "instagramSocialDescription": "Este perfil é o app do HedHog na API do Instagram com login do Instagram. As contas profissionais do Instagram (Empresa ou Criador de conteúdo) são conectadas por marca, em Social → Marcas → Canais, com ou sem Página do Facebook.",
2906
+ "instagramSocialRedirectUriLabel": "URI de redirecionamento do OAuth",
2907
+ "instagramSocialRedirectUriUnavailable": "Defina NEXT_PUBLIC_API_BASE_URL para exibir a URI",
2908
+ "instagramSocialStepsTitle": "Como configurar no painel da Meta",
2909
+ "instagramSocialStep1": "No app da Meta, adicione o produto Instagram e abra \"API setup with Instagram login\".",
2910
+ "instagramSocialStep2": "Copie o ID do app do Instagram e a chave secreta do app do Instagram exibidos ali e cole acima. Eles não são o ID e a chave do app da Meta.",
2911
+ "instagramSocialStep3": "Em \"Set up Instagram business login\" > Business login settings, cadastre a URI acima em \"OAuth redirect URIs\" exatamente como aparece, sem barra no final.",
2912
+ "instagramSocialStep4": "Nas mesmas configurações, preencha a Deauthorize callback URL e a Data deletion request URL com a página das suas instruções de privacidade.",
2913
+ "instagramSocialStep5": "Até o App Review ser aprovado, adicione as contas que serão conectadas como testadoras do Instagram no app, ou use o modo Sandbox.",
2914
+ "linkedinSocialSectionTitle": "Conexão com o LinkedIn",
2915
+ "linkedinSocialDescription": "Este perfil é o app do HedHog na Community Management API do LinkedIn. As páginas de empresa são conectadas por marca, em Social → Marcas → Canais, por um membro que seja administrador ou administrador de conteúdo da página.",
2916
+ "linkedinSocialRedirectUriLabel": "URL de redirecionamento autorizada",
2917
+ "linkedinSocialRedirectUriUnavailable": "Defina NEXT_PUBLIC_API_BASE_URL para exibir a URL",
2918
+ "linkedinSocialStepsTitle": "Como configurar no LinkedIn Developer Portal",
2919
+ "linkedinSocialStep1": "Crie um app dedicado, sem outros produtos, vinculado à página da empresa e verificado por um superadministrador dessa Página do LinkedIn.",
2920
+ "linkedinSocialStep2": "Na aba Products, solicite a Community Management API. O acesso começa no nível Development.",
2921
+ "linkedinSocialStep3": "Na aba Auth, cadastre a URL acima em \"Authorized redirect URLs for your app\" exatamente como aparece e copie o Client ID e o Primary Client Secret para os campos acima.",
2922
+ "linkedinSocialStep4": "Antes de ir para produção, solicite o nível Standard, que exige um screencast de cada caso de uso do app.",
2923
+ "linkedinSocialStep5": "Até o nível Standard ser aprovado, use o modo Sandbox.",
2924
+ "fieldOauthAppStatus": "Status da tela de consentimento OAuth",
2925
+ "fieldOauthAppStatusTesting": "Em teste (o token de atualização expira em 7 dias e o canal precisa ser reconectado)",
2926
+ "fieldOauthAppStatusProduction": "Em produção (o token de atualização não expira em 7 dias)",
2927
+ "googleSocialSectionTitle": "Conexão com o Google",
2928
+ "youtubeSocialDescription": "Este perfil é o projeto do HedHog no Google Cloud para o YouTube. Os canais são conectados por marca, em Social → Marcas → Canais.",
2929
+ "googleBusinessSocialDescription": "Este perfil é o projeto do HedHog no Google Cloud para o Perfil da Empresa no Google. Os locais são conectados por marca, em Social → Marcas → Canais.",
2930
+ "googleSocialRedirectUriLabel": "URI de redirecionamento autorizado do OAuth",
2931
+ "googleSocialRedirectUriUnavailable": "Defina NEXT_PUBLIC_API_BASE_URL para exibir a URI",
2932
+ "googleSocialStepsTitle": "Como configurar no Google Cloud Console",
2933
+ "youtubeSocialStep1": "Crie um projeto no Google Cloud só para o YouTube e ative a YouTube Data API v3.",
2934
+ "youtubeSocialStep2": "Configure a tela de consentimento OAuth com os escopos youtube.upload e youtube.readonly. Por serem escopos sensíveis, o app precisa passar pela verificação do Google antes de ser publicado.",
2935
+ "youtubeSocialStep3": "Crie um ID do cliente OAuth do tipo \"Aplicativo da Web\", cadastre a URI acima em \"URIs de redirecionamento autorizados\" e cole o Client ID e o Client Secret acima.",
2936
+ "youtubeSocialStep4": "Solicite a auditoria de conformidade da API do YouTube: até ela ser aprovada, todo vídeo enviado pelo projeto fica privado.",
2937
+ "youtubeSocialStep5": "A cota padrão do projeto permite cerca de 100 envios de vídeo por dia. Ao esgotar, a publicação é reagendada para depois do reset (meia-noite no horário do Pacífico).",
2938
+ "googleBusinessSocialStep1": "O Perfil da Empresa precisa estar verificado há mais de 60 dias e ter um site cadastrado.",
2939
+ "googleBusinessSocialStep2": "Crie um projeto no Google Cloud só para o Perfil da Empresa e solicite o acesso básico à API (Basic API Access) informando o número desse projeto.",
2940
+ "googleBusinessSocialStep3": "Ative a My Business Account Management API, a My Business Business Information API e a Google My Business API. Até o acesso ser aprovado a cota é 0 e toda chamada falha.",
2941
+ "googleBusinessSocialStep4": "Configure a tela de consentimento OAuth com o escopo business.manage.",
2942
+ "googleBusinessSocialStep5": "Crie um ID do cliente OAuth do tipo \"Aplicativo da Web\", cadastre a URI acima em \"URIs de redirecionamento autorizados\" e cole o Client ID e o Client Secret acima.",
2943
+ "googleSocialTestingStep": "Enquanto a tela de consentimento estiver em \"Teste\", escolha \"Em teste\" no status acima e use o modo Sandbox para desenvolver sem depender das aprovações do Google."
2891
2944
  },
2892
2945
  "SystemPagesPage": {
2893
2946
  "title": "Páginas",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hed-hog/core",
3
- "version": "0.0.400",
3
+ "version": "0.0.401",
4
4
  "license": "MIT",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -48,12 +48,12 @@
48
48
  "ua-parser-js": "^2.0.10",
49
49
  "uuid": "^11.1.0",
50
50
  "@hed-hog/api-prisma": "0.0.7",
51
- "@hed-hog/api-locale": "0.0.15",
52
51
  "@hed-hog/api-mail": "0.0.11",
52
+ "@hed-hog/api-locale": "0.0.15",
53
53
  "@hed-hog/vault-crypto": "0.0.1",
54
- "@hed-hog/api": "0.0.9",
54
+ "@hed-hog/api-types": "0.0.2",
55
55
  "@hed-hog/api-pagination": "0.0.8",
56
- "@hed-hog/api-types": "0.0.2"
56
+ "@hed-hog/api": "0.0.9"
57
57
  },
58
58
  "exports": {
59
59
  ".": {
@@ -179,6 +179,10 @@ describe('AiService — anexos no fio', () => {
179
179
  return mockedAxios.post.mock.calls.at(-1)?.[1] as Record<string, any>;
180
180
  }
181
181
 
182
+ function lastUrl(): string {
183
+ return mockedAxios.post.mock.calls.at(-1)?.[0] as string;
184
+ }
185
+
182
186
  describe('Gemini', () => {
183
187
  it('embrulha anexo de texto exatamente como o código original', async () => {
184
188
  useAttachment(TEXT_ATTACHMENT);
@@ -248,23 +252,72 @@ describe('AiService — anexos no fio', () => {
248
252
  );
249
253
  });
250
254
 
251
- it('embrulha PDF com texto extraído exatamente como o código original', async () => {
255
+ // Num modelo com visão o PDF deixou de ser achatado em texto: ele vai
256
+ // inteiro para a Responses API, que renderiza as páginas. Era isso que
257
+ // faltava para uma nota fiscal escaneada — sem camada de texto, o caminho
258
+ // antigo mandava ao modelo a frase dizendo que o PDF é ilegível.
259
+ it('PDF vai como documento para a Responses API, não achatado em texto', async () => {
252
260
  const pdfText = 'Cláusula 1ª — objeto do contrato.';
253
261
  useAttachment(PDF_ATTACHMENT);
254
262
  jest.spyOn(service as any, 'extractPdfText').mockResolvedValue(pdfText);
263
+ jest.spyOn(service as any, 'countPdfPages').mockResolvedValue(1);
255
264
 
256
265
  await service.chat({ message: 'Resuma.', provider: 'openai' } as any);
257
266
 
267
+ expect(lastUrl()).toBe('https://api.openai.com/v1/responses');
268
+ expect(lastBody().messages).toBeUndefined();
269
+
270
+ const [file, text] = lastBody().input[0].content;
271
+ expect(file.type).toBe('input_file');
272
+ expect(file.filename).toBe(PDF_ATTACHMENT.filename);
273
+ expect(file.file_data).toBe(
274
+ `data:application/pdf;base64,${PDF_ATTACHMENT.buffer.toString('base64')}`,
275
+ );
276
+ expect(text).toEqual({ type: 'input_text', text: 'Resuma.' });
277
+ });
278
+
279
+ it('PDF ilegível também vai como documento, sem marcador nenhum', async () => {
280
+ useAttachment(PDF_ATTACHMENT);
281
+ jest.spyOn(service as any, 'extractPdfText').mockResolvedValue('');
282
+ jest.spyOn(service as any, 'countPdfPages').mockResolvedValue(1);
283
+
284
+ await service.chat({ message: 'Resuma.', provider: 'openai' } as any);
285
+
286
+ expect(lastUrl()).toBe('https://api.openai.com/v1/responses');
287
+ expect(JSON.stringify(lastBody())).not.toContain(
288
+ legacyUnreadablePdf(PDF_ATTACHMENT),
289
+ );
290
+ });
291
+
292
+ // O marcador continua valendo onde a Responses API não ajuda: modelo sem
293
+ // visão só receberia a camada de texto de volta, o mesmo nada num endpoint
294
+ // diferente. Então esses dois casos guardam a fidelidade byte a byte.
295
+ it('em modelo sem visão, PDF com texto continua no bloco de arquivo legado', async () => {
296
+ const pdfText = 'Cláusula 1ª — objeto do contrato.';
297
+ useAttachment(PDF_ATTACHMENT);
298
+ jest.spyOn(service as any, 'extractPdfText').mockResolvedValue(pdfText);
299
+
300
+ await service.chat({
301
+ message: 'Resuma.',
302
+ provider: 'openai',
303
+ model: 'gpt-3.5-turbo',
304
+ } as any);
305
+
306
+ expect(lastUrl()).toBe('https://api.openai.com/v1/chat/completions');
258
307
  expect(lastBody().messages[0].content).toBe(
259
308
  legacyOpenAiReturn('Resuma.', PDF_ATTACHMENT, pdfText),
260
309
  );
261
310
  });
262
311
 
263
- it('PDF ilegível cai no marcador de PDF, dentro do bloco de arquivo', async () => {
312
+ it('em modelo sem visão, PDF ilegível cai no marcador de PDF', async () => {
264
313
  useAttachment(PDF_ATTACHMENT);
265
314
  jest.spyOn(service as any, 'extractPdfText').mockResolvedValue('');
266
315
 
267
- await service.chat({ message: 'Resuma.', provider: 'openai' } as any);
316
+ await service.chat({
317
+ message: 'Resuma.',
318
+ provider: 'openai',
319
+ model: 'gpt-3.5-turbo',
320
+ } as any);
268
321
 
269
322
  expect(lastBody().messages[0].content).toBe(
270
323
  legacyOpenAiReturn('Resuma.', PDF_ATTACHMENT, legacyUnreadablePdf(PDF_ATTACHMENT)),