@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.
- package/dist/ai/ai.controller.d.ts +2 -0
- package/dist/ai/ai.controller.d.ts.map +1 -1
- package/dist/ai/ai.service.d.ts +86 -2
- package/dist/ai/ai.service.d.ts.map +1 -1
- package/dist/ai/ai.service.js +304 -23
- package/dist/ai/ai.service.js.map +1 -1
- package/dist/ai-instruction/ai-prompt-resolver.service.d.ts +12 -0
- package/dist/ai-instruction/ai-prompt-resolver.service.d.ts.map +1 -1
- package/dist/ai-instruction/ai-prompt-resolver.service.js +26 -0
- package/dist/ai-instruction/ai-prompt-resolver.service.js.map +1 -1
- package/dist/core.module.d.ts.map +1 -1
- package/dist/core.module.js +3 -0
- package/dist/core.module.js.map +1 -1
- package/dist/document-kit/document-kit.module.d.ts +3 -0
- package/dist/document-kit/document-kit.module.d.ts.map +1 -0
- package/dist/document-kit/document-kit.module.js +24 -0
- package/dist/document-kit/document-kit.module.js.map +1 -0
- package/dist/document-kit/document-kit.registry.d.ts +55 -0
- package/dist/document-kit/document-kit.registry.d.ts.map +1 -0
- package/dist/document-kit/document-kit.registry.js +91 -0
- package/dist/document-kit/document-kit.registry.js.map +1 -0
- package/dist/document-kit/document-kit.service.d.ts +49 -0
- package/dist/document-kit/document-kit.service.d.ts.map +1 -0
- package/dist/document-kit/document-kit.service.js +135 -0
- package/dist/document-kit/document-kit.service.js.map +1 -0
- package/dist/file/file.service.d.ts +15 -1
- package/dist/file/file.service.d.ts.map +1 -1
- package/dist/file/file.service.js +52 -24
- package/dist/file/file.service.js.map +1 -1
- package/dist/file/mcp-file-source.schema.d.ts.map +1 -1
- package/dist/file/mcp-file-source.schema.js +8 -5
- package/dist/file/mcp-file-source.schema.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/integration-profile/integration-profile.secrets.d.ts.map +1 -1
- package/dist/integration-profile/integration-profile.secrets.js +21 -0
- package/dist/integration-profile/integration-profile.secrets.js.map +1 -1
- package/dist/integration-profile/testers/ai.testers.d.ts.map +1 -1
- package/dist/integration-profile/testers/ai.testers.js +46 -8
- package/dist/integration-profile/testers/ai.testers.js.map +1 -1
- package/dist/mcp/mcp.module.d.ts.map +1 -1
- package/dist/mcp/mcp.module.js +2 -0
- package/dist/mcp/mcp.module.js.map +1 -1
- package/dist/mcp/tools/core-access-log.mcp-tools.d.ts +17 -0
- package/dist/mcp/tools/core-access-log.mcp-tools.d.ts.map +1 -0
- package/dist/mcp/tools/core-access-log.mcp-tools.js +74 -0
- package/dist/mcp/tools/core-access-log.mcp-tools.js.map +1 -0
- package/dist/mcp/tools/core-files.mcp-tools.js +4 -4
- package/dist/mcp/tools/core-files.mcp-tools.js.map +1 -1
- package/dist/meeting/meeting-provider.registry.d.ts +72 -0
- package/dist/meeting/meeting-provider.registry.d.ts.map +1 -1
- package/dist/meeting/meeting-provider.registry.js.map +1 -1
- package/dist/oauth/oauth-token-broker.service.d.ts +50 -1
- package/dist/oauth/oauth-token-broker.service.d.ts.map +1 -1
- package/dist/oauth/oauth-token-broker.service.js +105 -3
- package/dist/oauth/oauth-token-broker.service.js.map +1 -1
- package/dist/oauth/providers/microsoft-entra-id.provider.d.ts +6 -0
- package/dist/oauth/providers/microsoft-entra-id.provider.d.ts.map +1 -1
- package/dist/oauth/providers/microsoft-entra-id.provider.js +30 -4
- package/dist/oauth/providers/microsoft-entra-id.provider.js.map +1 -1
- package/dist/pdf/document/charts/chart-bar.d.ts +24 -0
- package/dist/pdf/document/charts/chart-bar.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-bar.js +117 -0
- package/dist/pdf/document/charts/chart-bar.js.map +1 -0
- package/dist/pdf/document/charts/chart-donut.d.ts +16 -0
- package/dist/pdf/document/charts/chart-donut.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-donut.js +89 -0
- package/dist/pdf/document/charts/chart-donut.js.map +1 -0
- package/dist/pdf/document/charts/chart-gauge.d.ts +15 -0
- package/dist/pdf/document/charts/chart-gauge.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-gauge.js +60 -0
- package/dist/pdf/document/charts/chart-gauge.js.map +1 -0
- package/dist/pdf/document/charts/chart-line.d.ts +29 -0
- package/dist/pdf/document/charts/chart-line.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-line.js +89 -0
- package/dist/pdf/document/charts/chart-line.js.map +1 -0
- package/dist/pdf/document/charts/chart-primitives.d.ts +64 -0
- package/dist/pdf/document/charts/chart-primitives.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-primitives.js +110 -0
- package/dist/pdf/document/charts/chart-primitives.js.map +1 -0
- package/dist/pdf/document/charts/chart-radar.d.ts +13 -0
- package/dist/pdf/document/charts/chart-radar.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-radar.js +83 -0
- package/dist/pdf/document/charts/chart-radar.js.map +1 -0
- package/dist/pdf/document/charts/chart-scale.d.ts +39 -0
- package/dist/pdf/document/charts/chart-scale.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-scale.js +118 -0
- package/dist/pdf/document/charts/chart-scale.js.map +1 -0
- package/dist/pdf/document/charts/index.d.ts +8 -0
- package/dist/pdf/document/charts/index.d.ts.map +1 -0
- package/dist/pdf/document/charts/index.js +24 -0
- package/dist/pdf/document/charts/index.js.map +1 -0
- package/dist/pdf/document/index.d.ts +8 -0
- package/dist/pdf/document/index.d.ts.map +1 -0
- package/dist/pdf/document/index.js +24 -0
- package/dist/pdf/document/index.js.map +1 -0
- package/dist/pdf/document/pdf-document.chrome.d.ts +20 -0
- package/dist/pdf/document/pdf-document.chrome.d.ts.map +1 -0
- package/dist/pdf/document/pdf-document.chrome.js +36 -0
- package/dist/pdf/document/pdf-document.chrome.js.map +1 -0
- package/dist/pdf/document/pdf-document.css.d.ts +20 -0
- package/dist/pdf/document/pdf-document.css.d.ts.map +1 -0
- package/dist/pdf/document/pdf-document.css.js +239 -0
- package/dist/pdf/document/pdf-document.css.js.map +1 -0
- package/dist/pdf/document/pdf-document.renderer.d.ts +10 -0
- package/dist/pdf/document/pdf-document.renderer.d.ts.map +1 -0
- package/dist/pdf/document/pdf-document.renderer.js +153 -0
- package/dist/pdf/document/pdf-document.renderer.js.map +1 -0
- package/dist/pdf/document/pdf-document.service.d.ts +27 -0
- package/dist/pdf/document/pdf-document.service.d.ts.map +1 -0
- package/dist/pdf/document/pdf-document.service.js +81 -0
- package/dist/pdf/document/pdf-document.service.js.map +1 -0
- package/dist/pdf/document/pdf-document.theme.d.ts +41 -0
- package/dist/pdf/document/pdf-document.theme.d.ts.map +1 -0
- package/dist/pdf/document/pdf-document.theme.js +105 -0
- package/dist/pdf/document/pdf-document.theme.js.map +1 -0
- package/dist/pdf/document/pdf-document.types.d.ts +108 -0
- package/dist/pdf/document/pdf-document.types.d.ts.map +1 -0
- package/dist/pdf/document/pdf-document.types.js +18 -0
- package/dist/pdf/document/pdf-document.types.js.map +1 -0
- package/dist/pdf/pdf.module.d.ts.map +1 -1
- package/dist/pdf/pdf.module.js +3 -2
- package/dist/pdf/pdf.module.js.map +1 -1
- package/dist/pdf/pdf.service.d.ts +69 -1
- package/dist/pdf/pdf.service.d.ts.map +1 -1
- package/dist/pdf/pdf.service.js +164 -63
- package/dist/pdf/pdf.service.js.map +1 -1
- package/dist/pdf/templates/commercial-proposal.template.d.ts +96 -0
- package/dist/pdf/templates/commercial-proposal.template.d.ts.map +1 -0
- package/dist/pdf/templates/commercial-proposal.template.js +276 -0
- package/dist/pdf/templates/commercial-proposal.template.js.map +1 -0
- package/dist/setting/favicon.controller.d.ts +26 -0
- package/dist/setting/favicon.controller.d.ts.map +1 -0
- package/dist/setting/favicon.controller.js +130 -0
- package/dist/setting/favicon.controller.js.map +1 -0
- package/dist/setting/setting.module.d.ts.map +1 -1
- package/dist/setting/setting.module.js +2 -1
- package/dist/setting/setting.module.js.map +1 -1
- package/dist/whatsapp-sender/whatsapp-sender.service.d.ts.map +1 -1
- package/dist/whatsapp-sender/whatsapp-sender.service.js +25 -2
- package/dist/whatsapp-sender/whatsapp-sender.service.js.map +1 -1
- package/hedhog/data/integration_type.yaml +6 -0
- package/hedhog/data/route.yaml +8 -0
- package/hedhog/data/setting_group.yaml +52 -0
- package/hedhog/frontend/messages/en.json +54 -1
- package/hedhog/frontend/messages/pt.json +54 -1
- package/package.json +4 -4
- package/src/ai/ai-attachment.fragments.spec.ts +56 -3
- package/src/ai/ai.service.responses.spec.ts +429 -0
- package/src/ai/ai.service.ts +409 -27
- package/src/ai-instruction/ai-prompt-resolver.service.spec.ts +44 -0
- package/src/ai-instruction/ai-prompt-resolver.service.ts +29 -0
- package/src/core.module.ts +3 -0
- package/src/document-kit/document-kit.module.ts +12 -0
- package/src/document-kit/document-kit.registry.ts +125 -0
- package/src/document-kit/document-kit.service.spec.ts +156 -0
- package/src/document-kit/document-kit.service.ts +173 -0
- package/src/file/file.service.spec.ts +168 -1
- package/src/file/file.service.ts +72 -34
- package/src/file/mcp-file-source.schema.ts +8 -5
- package/src/index.ts +5 -0
- package/src/integration-profile/integration-profile.secrets.ts +21 -0
- package/src/integration-profile/testers/ai.testers.ts +70 -5
- package/src/integration-profile/testers/remaining.testers.spec.ts +65 -1
- package/src/integration-profile/testers/tester-coverage.spec.ts +10 -0
- package/src/mcp/mcp.module.ts +2 -0
- package/src/mcp/tools/core-access-log.mcp-tools.ts +66 -0
- package/src/mcp/tools/core-files.mcp-tools.ts +4 -4
- package/src/meeting/meeting-provider.registry.ts +80 -0
- package/src/oauth/oauth-token-broker.service.spec.ts +108 -0
- package/src/oauth/oauth-token-broker.service.ts +129 -2
- package/src/oauth/providers/microsoft-entra-id.provider.spec.ts +133 -0
- package/src/oauth/providers/microsoft-entra-id.provider.ts +29 -2
- package/src/pdf/document/charts/chart-bar.ts +217 -0
- package/src/pdf/document/charts/chart-donut.ts +163 -0
- package/src/pdf/document/charts/chart-gauge.ts +94 -0
- package/src/pdf/document/charts/chart-line.ts +159 -0
- package/src/pdf/document/charts/chart-primitives.ts +188 -0
- package/src/pdf/document/charts/chart-radar.ts +136 -0
- package/src/pdf/document/charts/chart-scale.spec.ts +93 -0
- package/src/pdf/document/charts/chart-scale.ts +141 -0
- package/src/pdf/document/charts/charts.spec.ts +157 -0
- package/src/pdf/document/charts/index.ts +7 -0
- package/src/pdf/document/index.ts +7 -0
- package/src/pdf/document/pdf-document.chrome.ts +38 -0
- package/src/pdf/document/pdf-document.css.ts +238 -0
- package/src/pdf/document/pdf-document.renderer.spec.ts +129 -0
- package/src/pdf/document/pdf-document.renderer.ts +215 -0
- package/src/pdf/document/pdf-document.service.ts +77 -0
- package/src/pdf/document/pdf-document.theme.ts +146 -0
- package/src/pdf/document/pdf-document.types.ts +97 -0
- package/src/pdf/pdf.module.ts +3 -2
- package/src/pdf/pdf.service.spec.ts +131 -0
- package/src/pdf/pdf.service.ts +245 -82
- package/src/pdf/templates/commercial-proposal.template.spec.ts +177 -0
- package/src/pdf/templates/commercial-proposal.template.ts +400 -0
- package/src/setting/favicon.controller.spec.ts +92 -0
- package/src/setting/favicon.controller.ts +135 -0
- package/src/setting/setting.module.ts +2 -1
- package/src/whatsapp-sender/whatsapp-sender.service.spec.ts +73 -0
- package/src/whatsapp-sender/whatsapp-sender.service.ts +32 -2
|
@@ -109,4 +109,77 @@ describe('WhatsappSenderService', () => {
|
|
|
109
109
|
expect(JSON.parse(init.body).number).toBe('120363430651137530@g.us');
|
|
110
110
|
});
|
|
111
111
|
});
|
|
112
|
+
|
|
113
|
+
// O worker so insiste quando a recusa pode mudar; numero sem WhatsApp e dado
|
|
114
|
+
// de cadastro e reprocessaria o job tres vezes a toa.
|
|
115
|
+
describe('recusa da Evolution', () => {
|
|
116
|
+
let fetchSpy: jest.SpyInstance;
|
|
117
|
+
|
|
118
|
+
const buildEvolution = () => {
|
|
119
|
+
const built = buildService('evolution-api');
|
|
120
|
+
built.prisma.integration_profile.findUnique.mockResolvedValue({
|
|
121
|
+
id: 2,
|
|
122
|
+
slug: 'hcode',
|
|
123
|
+
config: {
|
|
124
|
+
host: 'https://evolution.hcode.com.br',
|
|
125
|
+
token: 'apikey',
|
|
126
|
+
instance_name: 'hcode',
|
|
127
|
+
},
|
|
128
|
+
integration_provider: { slug: 'evolution-api' },
|
|
129
|
+
integration_type: { slug: 'whatsapp' },
|
|
130
|
+
});
|
|
131
|
+
return built.service;
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
const respond = (status: number, body: unknown) =>
|
|
135
|
+
fetchSpy.mockResolvedValue({
|
|
136
|
+
ok: false,
|
|
137
|
+
status,
|
|
138
|
+
text: async () => JSON.stringify(body),
|
|
139
|
+
} as any);
|
|
140
|
+
|
|
141
|
+
const sendAndCatch = () =>
|
|
142
|
+
buildEvolution()
|
|
143
|
+
.send({ profileSlug: 'hcode', to: '5515991103304', text: 'Oi' })
|
|
144
|
+
.catch((thrown) => thrown);
|
|
145
|
+
|
|
146
|
+
beforeEach(() => {
|
|
147
|
+
fetchSpy = jest.spyOn(global, 'fetch' as any);
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
afterEach(() => fetchSpy.mockRestore());
|
|
151
|
+
|
|
152
|
+
it('numero sem WhatsApp e recusa permanente com mensagem legivel', async () => {
|
|
153
|
+
respond(400, {
|
|
154
|
+
status: 400,
|
|
155
|
+
error: 'Bad Request',
|
|
156
|
+
response: {
|
|
157
|
+
message: [{ jid: '5515991103304@s.whatsapp.net', exists: false, number: '5515991103304' }],
|
|
158
|
+
},
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
const error = await sendAndCatch();
|
|
162
|
+
|
|
163
|
+
expect(error).toBeInstanceOf(WhatsappSendError);
|
|
164
|
+
expect(error.retryable).toBe(false);
|
|
165
|
+
expect(error.message).toMatch(/5515991103304 não tem WhatsApp/);
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
it('outro 4xx tambem e permanente', async () => {
|
|
169
|
+
respond(400, { response: { message: ['text is required'] } });
|
|
170
|
+
|
|
171
|
+
const error = await sendAndCatch();
|
|
172
|
+
|
|
173
|
+
expect(error.retryable).toBe(false);
|
|
174
|
+
expect(error.message).toMatch(/HTTP 400/);
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
it('5xx e 429 podem ser tentados de novo', async () => {
|
|
178
|
+
respond(502, {});
|
|
179
|
+
expect((await sendAndCatch()).retryable).toBe(true);
|
|
180
|
+
|
|
181
|
+
respond(429, {});
|
|
182
|
+
expect((await sendAndCatch()).retryable).toBe(true);
|
|
183
|
+
});
|
|
184
|
+
});
|
|
112
185
|
});
|
|
@@ -242,13 +242,27 @@ export class WhatsappSenderService {
|
|
|
242
242
|
const detail = await response.text().catch(() => '');
|
|
243
243
|
|
|
244
244
|
if (response.status === 401) {
|
|
245
|
-
throw new
|
|
245
|
+
throw new WhatsappSendError(
|
|
246
246
|
`Credenciais do WhatsApp inválidas (401). Verifique o token do perfil "${profile.slug}".`,
|
|
247
|
+
false,
|
|
247
248
|
);
|
|
248
249
|
}
|
|
249
250
|
|
|
250
|
-
|
|
251
|
+
// Número sem conta no WhatsApp: a Evolution responde 400 com
|
|
252
|
+
// `exists: false`. É dado do cadastro, não instabilidade — reenviar não
|
|
253
|
+
// muda nada, e o chamador precisa saber disso para não insistir.
|
|
254
|
+
if (isEvolutionNumberMissing(detail)) {
|
|
255
|
+
throw new WhatsappSendError(
|
|
256
|
+
`O número ${target} não tem WhatsApp (Evolution: exists=false).`,
|
|
257
|
+
false,
|
|
258
|
+
);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// Mesmo critério do provider oficial: 4xx é recusa estrutural, 5xx e
|
|
262
|
+
// 429 podem passar numa próxima tentativa.
|
|
263
|
+
throw new WhatsappSendError(
|
|
251
264
|
`Evolution API recusou o envio (HTTP ${response.status}): ${detail.slice(0, 300)}`,
|
|
265
|
+
response.status >= 500 || response.status === 429,
|
|
252
266
|
);
|
|
253
267
|
}
|
|
254
268
|
}
|
|
@@ -359,6 +373,22 @@ export class WhatsappSenderService {
|
|
|
359
373
|
}
|
|
360
374
|
}
|
|
361
375
|
|
|
376
|
+
/**
|
|
377
|
+
* Reconhece o 400 da Evolution para destino inexistente:
|
|
378
|
+
* `{"response":{"message":[{"exists":false,"number":"55..."}]}}`.
|
|
379
|
+
*/
|
|
380
|
+
function isEvolutionNumberMissing(detail: string): boolean {
|
|
381
|
+
try {
|
|
382
|
+
const messages = JSON.parse(detail)?.response?.message;
|
|
383
|
+
return (
|
|
384
|
+
Array.isArray(messages) &&
|
|
385
|
+
messages.some((item) => item && typeof item === 'object' && item.exists === false)
|
|
386
|
+
);
|
|
387
|
+
} catch {
|
|
388
|
+
return false;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
|
|
362
392
|
/** Evolution espera base64 puro; um data URL vindo do chamador quebraria o envio. */
|
|
363
393
|
function stripDataUrlPrefix(image: string): string {
|
|
364
394
|
const match = /^data:[^;]+;base64,(.*)$/i.exec(image);
|