cdp-edge 2.5.1 → 2.5.3
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/README.md +23 -3
- package/contracts/agent-versions.json +383 -83
- package/extracted-skill/tracking-events-generator/agents/ab-ltv-agent.md +1 -1
- package/extracted-skill/tracking-events-generator/agents/ab-testing-agent.md +1 -1
- package/extracted-skill/tracking-events-generator/agents/attribution-agent.md +18 -18
- package/extracted-skill/tracking-events-generator/agents/bidding-agent.md +1 -1
- package/extracted-skill/tracking-events-generator/agents/bing-agent.md +1 -1
- package/extracted-skill/tracking-events-generator/agents/code-guardian-agent.md +1 -1
- package/extracted-skill/tracking-events-generator/agents/compliance-agent.md +5 -5
- package/extracted-skill/tracking-events-generator/agents/crm-integration-agent.md +10 -10
- package/extracted-skill/tracking-events-generator/agents/dashboard-agent.md +3 -3
- package/extracted-skill/tracking-events-generator/agents/database-agent.md +17 -25
- package/extracted-skill/tracking-events-generator/agents/debug-agent.md +9 -9
- package/extracted-skill/tracking-events-generator/agents/devops-agent.md +18 -1
- package/extracted-skill/tracking-events-generator/agents/domain-setup-agent.md +5 -5
- package/extracted-skill/tracking-events-generator/agents/email-agent.md +3 -3
- package/extracted-skill/tracking-events-generator/agents/fingerprint-agent.md +4 -4
- package/extracted-skill/tracking-events-generator/agents/fraud-detection-agent.md +2 -0
- package/extracted-skill/tracking-events-generator/agents/google-agent.md +2 -2
- package/extracted-skill/tracking-events-generator/agents/intelligence-agent.md +23 -29
- package/extracted-skill/tracking-events-generator/agents/linkedin-agent.md +3 -3
- package/extracted-skill/tracking-events-generator/agents/localization-agent.md +1 -1
- package/extracted-skill/tracking-events-generator/agents/ltv-predictor-agent.md +1 -1
- package/extracted-skill/tracking-events-generator/agents/master-feedback-loop.md +16 -16
- package/extracted-skill/tracking-events-generator/agents/master-orchestrator.md +13 -13
- package/extracted-skill/tracking-events-generator/agents/memory-agent.md +14 -14
- package/extracted-skill/tracking-events-generator/agents/meta-agent.md +2 -2
- package/extracted-skill/tracking-events-generator/agents/ml-clustering-agent.md +9 -9
- package/extracted-skill/tracking-events-generator/agents/page-analyzer.md +1 -0
- package/extracted-skill/tracking-events-generator/agents/performance-agent.md +12 -12
- package/extracted-skill/tracking-events-generator/agents/performance-optimization-agent.md +7 -7
- package/extracted-skill/tracking-events-generator/agents/pinterest-agent.md +6 -6
- package/extracted-skill/tracking-events-generator/agents/premium-tracking-intelligence-agent.md +3 -3
- package/extracted-skill/tracking-events-generator/agents/r2-setup-agent.md +8 -8
- package/extracted-skill/tracking-events-generator/agents/reddit-agent.md +7 -7
- package/extracted-skill/tracking-events-generator/agents/security-enterprise-agent.md +21 -21
- package/extracted-skill/tracking-events-generator/agents/server-tracking.md +15 -15
- package/extracted-skill/tracking-events-generator/agents/spotify-agent.md +6 -6
- package/extracted-skill/tracking-events-generator/agents/tiktok-agent.md +3 -3
- package/extracted-skill/tracking-events-generator/agents/tracking-plan-agent.md +5 -5
- package/extracted-skill/tracking-events-generator/agents/validator-agent.md +9 -9
- package/extracted-skill/tracking-events-generator/agents/webhook-agent.md +4 -4
- package/extracted-skill/tracking-events-generator/agents/whatsapp-agent.md +1 -1
- package/extracted-skill/tracking-events-generator/agents/whatsapp-ctwa-setup-agent.md +3 -3
- package/extracted-skill/tracking-events-generator/agents/youtube-agent.md +9 -9
- package/package.json +10 -10
- package/server-edge-tracker/.client.env +5 -0
- package/server-edge-tracker/modules/dispatch/whatsapp.ts +15 -15
- package/server-edge-tracker/schema-utm.sql +5 -3
- package/server-edge-tracker/wrangler.toml +1 -1
- package/extracted-skill/tracking-events-generator/agents/intelligence-scheduling.md +0 -10
- /package/server-edge-tracker/{deploy-client.js → deploy-client.cjs} +0 -0
|
@@ -23,7 +23,7 @@ Especialista exclusivo em TikTok Pixel (browser via cdpTrack) + TikTok Events AP
|
|
|
23
23
|
|
|
24
24
|
### PASSO 0 — Ler Versões Atuais
|
|
25
25
|
|
|
26
|
-
```
|
|
26
|
+
```typescript
|
|
27
27
|
// Ler versões do arquivo centralizado
|
|
28
28
|
const apiVersions = await readJSON('contracts/api-versions.json');
|
|
29
29
|
const tiktokVersion = apiVersions.tiktok;
|
|
@@ -85,7 +85,7 @@ Conforme `contracts/api-versions.json`, a TikTok Events API tem limites estritos
|
|
|
85
85
|
|
|
86
86
|
### Implementação de Throttling no Worker
|
|
87
87
|
|
|
88
|
-
```
|
|
88
|
+
```typescript
|
|
89
89
|
// Rate limit KV key: 'tiktok_rate_{pixel_id}_{minute}'
|
|
90
90
|
async function dispatchTikTokWithRateLimit(env, events, pixelId, accessToken) {
|
|
91
91
|
const now = new Date();
|
|
@@ -161,7 +161,7 @@ async function dispatchTikTokWithRateLimit(env, events, pixelId, accessToken) {
|
|
|
161
161
|
{
|
|
162
162
|
"arquivos_gerados": {
|
|
163
163
|
"browser": "cdpTrack.js (eventos TikTok injetados)",
|
|
164
|
-
"server": "
|
|
164
|
+
"server": "modules/dispatch/tiktok.ts"
|
|
165
165
|
},
|
|
166
166
|
"versao_api": "v1.3",
|
|
167
167
|
"endpoint": "/open_api/v1.3/event/track/",
|
|
@@ -28,7 +28,7 @@ Gerar um tracking plan **validado e verificável** que elimine:
|
|
|
28
28
|
|
|
29
29
|
### 1.1 Verificar Cobertura de Eventos
|
|
30
30
|
|
|
31
|
-
```
|
|
31
|
+
```typescript
|
|
32
32
|
// Comparar eventos do Page Analyzer com outputs dos agentes
|
|
33
33
|
function validateEventCoverage(pageAnalysis, agentOutputs) {
|
|
34
34
|
const pageEvents = new Set();
|
|
@@ -89,7 +89,7 @@ function validateEventCoverage(pageAnalysis, agentOutputs) {
|
|
|
89
89
|
|
|
90
90
|
### 1.2 Verificar Consistência de Parâmetros
|
|
91
91
|
|
|
92
|
-
```
|
|
92
|
+
```typescript
|
|
93
93
|
// Verificar se eventos de conversão têm todos os campos críticos
|
|
94
94
|
function validateConversionParameters(events, apiVersions) {
|
|
95
95
|
const criticalFields = ['value', 'currency', 'content_ids', 'transaction_id'];
|
|
@@ -118,7 +118,7 @@ function validateConversionParameters(events, apiVersions) {
|
|
|
118
118
|
|
|
119
119
|
### 1.3 Verificar Seletores Implementados
|
|
120
120
|
|
|
121
|
-
```
|
|
121
|
+
```typescript
|
|
122
122
|
// Verificar se seletores no tracking plan existem no código
|
|
123
123
|
function validateSelectorsExist(trackingPlan, pageAnalysis) {
|
|
124
124
|
const missingSelectors = [];
|
|
@@ -158,7 +158,7 @@ function validateSelectorsExist(trackingPlan, pageAnalysis) {
|
|
|
158
158
|
|
|
159
159
|
### 1.4 Verificar Versões de API
|
|
160
160
|
|
|
161
|
-
```
|
|
161
|
+
```typescript
|
|
162
162
|
// Ler api-versions.json e verificar consistência
|
|
163
163
|
async function validateApiVersions(trackingPlan) {
|
|
164
164
|
const apiVersions = await readJSON('contracts/api-versions.json');
|
|
@@ -200,7 +200,7 @@ async function validateApiVersions(trackingPlan) {
|
|
|
200
200
|
|
|
201
201
|
### 1.5 Validação Cruzada Completa (runFullValidation)
|
|
202
202
|
|
|
203
|
-
```
|
|
203
|
+
```typescript
|
|
204
204
|
/**
|
|
205
205
|
* Ponto de entrada principal — executa TODAS as validações em sequência
|
|
206
206
|
* e retorna um relatório consolidado com status PASS | WARN | BLOCK
|
|
@@ -78,7 +78,7 @@ Quando detectar erro, emitir bloco `CORRECTION_ROUTE` com formato:
|
|
|
78
78
|
"test_url": "https://graph.facebook.com/v22.0/{PIXEL_ID}/events",
|
|
79
79
|
"response_expected": "200 OK com payload válido"
|
|
80
80
|
},
|
|
81
|
-
"files_affected": ["
|
|
81
|
+
"files_affected": ["index.ts", "modules/dispatch/meta.ts"],
|
|
82
82
|
"auto_fix_available": true,
|
|
83
83
|
"user_action_required": false
|
|
84
84
|
},
|
|
@@ -95,7 +95,7 @@ Quando detectar erro, emitir bloco `CORRECTION_ROUTE` com formato:
|
|
|
95
95
|
"fallback": "gerar novo UUID se não existir",
|
|
96
96
|
"required_for_events": ["purchase", "initiate_checkout"]
|
|
97
97
|
},
|
|
98
|
-
"files_affected": ["ga4
|
|
98
|
+
"files_affected": ["modules/dispatch/ga4.ts", "index.ts"],
|
|
99
99
|
"auto_fix_available": false,
|
|
100
100
|
"user_action_required": true,
|
|
101
101
|
"user_instruction": "Verificar se o D1 está persistindo corretamente o ga_client_id nos cookies do visitante"
|
|
@@ -123,7 +123,7 @@ Para correções com `auto_fix_available: true`, o Validator Agent DEVE:
|
|
|
123
123
|
|
|
124
124
|
#### PASSO 1 — Executar Fix Automático
|
|
125
125
|
|
|
126
|
-
```
|
|
126
|
+
```typescript
|
|
127
127
|
// Exemplo: correção automática de versão de API
|
|
128
128
|
async function applyAutoFix(correction) {
|
|
129
129
|
const { files_affected, check_pattern, expected_pattern } = correction;
|
|
@@ -142,7 +142,7 @@ async function applyAutoFix(correction) {
|
|
|
142
142
|
|
|
143
143
|
#### PASSO 2 — Re-validar após Fix
|
|
144
144
|
|
|
145
|
-
```
|
|
145
|
+
```typescript
|
|
146
146
|
// Após aplicar fix, re-executar validação específica
|
|
147
147
|
async function reValidateAfterFix(correction) {
|
|
148
148
|
const { validation_criteria, files_affected } = correction;
|
|
@@ -171,14 +171,14 @@ Para correções com `user_action_required: true`, emitir instrução estruturad
|
|
|
171
171
|
|
|
172
172
|
**Agente Responsável:** meta-agent
|
|
173
173
|
**Prioridade:** 🔴 CRÍTICO
|
|
174
|
-
**Arquivos Afetados:**
|
|
174
|
+
**Arquivos Afetados:** index.ts, modules/dispatch/meta.ts
|
|
175
175
|
|
|
176
176
|
### Problema Detectado:
|
|
177
177
|
Meta CAPI está usando versão v21.0 (desatualizada) — isso causará rejeição de eventos pela Meta.
|
|
178
178
|
|
|
179
179
|
### O que precisa ser feito:
|
|
180
180
|
|
|
181
|
-
1. **Abrir o arquivo:** `
|
|
181
|
+
1. **Abrir o arquivo:** `modules/dispatch/meta.ts`
|
|
182
182
|
2. **Localizar:** Todas as ocorrências de `/v21.0/`
|
|
183
183
|
3. **Substituir por:** `/v22.0/`
|
|
184
184
|
4. **Testar:** Fazer uma requisição de teste para https://graph.facebook.com/v22.0/{SEU_PIXEL_ID}/events
|
|
@@ -201,7 +201,7 @@ Após cada correção (auto ou manual), o Validator Agent DEVE executar validaç
|
|
|
201
201
|
|
|
202
202
|
#### Para Correções de API Version:
|
|
203
203
|
|
|
204
|
-
```
|
|
204
|
+
```typescript
|
|
205
205
|
{
|
|
206
206
|
"revalidation_checklist": {
|
|
207
207
|
"version_correct": true, // Check: endpoint usa versão correta
|
|
@@ -214,7 +214,7 @@ Após cada correção (auto ou manual), o Validator Agent DEVE executar validaç
|
|
|
214
214
|
|
|
215
215
|
#### Para Correções de Missing Fields:
|
|
216
216
|
|
|
217
|
-
```
|
|
217
|
+
```typescript
|
|
218
218
|
{
|
|
219
219
|
"revalidation_checklist": {
|
|
220
220
|
"field_present": true, // Check: campo existe no payload
|
|
@@ -227,7 +227,7 @@ Após cada correção (auto ou manual), o Validator Agent DEVE executar validaç
|
|
|
227
227
|
|
|
228
228
|
#### Para Correções de Seletores:
|
|
229
229
|
|
|
230
|
-
```
|
|
230
|
+
```typescript
|
|
231
231
|
{
|
|
232
232
|
"revalidation_checklist": {
|
|
233
233
|
"selector_exists": true, // Check: seletor encontrado no HTML/JS
|
|
@@ -16,7 +16,7 @@ Você é o especialista em Webhooks do CDP Edge. Sua missão é capturar vendas
|
|
|
16
16
|
|
|
17
17
|
Antes de qualquer dispatch para CAPI, normalizar e hashear PII extraída do webhook:
|
|
18
18
|
|
|
19
|
-
```
|
|
19
|
+
```typescript
|
|
20
20
|
// Hashing SHA-256 para PII — usar WebCrypto (disponível em Cloudflare Workers)
|
|
21
21
|
async function hashPII(value) {
|
|
22
22
|
if (!value) return null;
|
|
@@ -99,7 +99,7 @@ Webhook (Hotmart/Kiwify/Ticto/Stripe)
|
|
|
99
99
|
|
|
100
100
|
### Código de Integração (webhook handler)
|
|
101
101
|
|
|
102
|
-
```
|
|
102
|
+
```typescript
|
|
103
103
|
// No handler de webhook, após validação e dedup:
|
|
104
104
|
ctx.waitUntil(Promise.allSettled([
|
|
105
105
|
// [5] CAPI dispatch
|
|
@@ -124,8 +124,8 @@ ctx.waitUntil(Promise.allSettled([
|
|
|
124
124
|
]));
|
|
125
125
|
```
|
|
126
126
|
|
|
127
|
-
> **Nota:** `sendEmail()` é implementada pelo Email Agent em `
|
|
128
|
-
> `syncToCRM()` é implementada pelo CRM Integration Agent em `
|
|
127
|
+
> **Nota:** `sendEmail()` é implementada pelo Email Agent em `modules/email-service.ts`.
|
|
128
|
+
> `syncToCRM()` é implementada pelo CRM Integration Agent em `modules/crm-service.ts`.
|
|
129
129
|
|
|
130
130
|
---
|
|
131
131
|
|
|
@@ -66,7 +66,7 @@ WhatsApp Agent dispara notificação ao dono via Meta Cloud API v22.0
|
|
|
66
66
|
|
|
67
67
|
### O que este agente gera para o fluxo CTWA
|
|
68
68
|
|
|
69
|
-
```
|
|
69
|
+
```typescript
|
|
70
70
|
// sendWhatsApp() — notificação ao dono quando chega lead CTWA
|
|
71
71
|
async function notifyOwnerNewCtwaLead(env, contactData) {
|
|
72
72
|
const message = `📲 Novo Lead CTWA!\n\nNome: ${contactData.name || 'Desconhecido'}\nTelefone: ${contactData.phone}\nAnúncio: ${contactData.headline || '-'}\nMensagem: "${contactData.messageBody?.slice(0, 80) || '-'}"`;
|
|
@@ -183,7 +183,7 @@ message_body | Olá, vi o anúncio e tenho interesse
|
|
|
183
183
|
3. `META_APP_SECRET`
|
|
184
184
|
|
|
185
185
|
**O agente gera/descobre o restante automaticamente:**
|
|
186
|
-
```
|
|
186
|
+
```typescript
|
|
187
187
|
// WA_WEBHOOK_VERIFY_TOKEN — gerado pelo agente antes de registrar o webhook
|
|
188
188
|
const WA_WEBHOOK_VERIFY_TOKEN = crypto.randomUUID().replace(/-/g, '') + crypto.randomUUID().replace(/-/g, '');
|
|
189
189
|
// Exemplo: "a3f8c1d2e4b5a6f7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1"
|
|
@@ -504,7 +504,7 @@ echo "{META_APP_SECRET}" | wrangler secret put META_APP_SECRET
|
|
|
504
504
|
echo "{META_ACCESS_TOKEN}" | wrangler secret put META_ACCESS_TOKEN
|
|
505
505
|
|
|
506
506
|
# ── Secrets para Auto-Resposta WhatsApp (enviar mensagens de saída) ─────────
|
|
507
|
-
# Necessários para:
|
|
507
|
+
# Necessários para: index.ts → auto-resposta após Lead/Purchase
|
|
508
508
|
# WHATSAPP_ACCESS_TOKEN = mesmo token Meta (Cloud API) — pode reutilizar META_ACCESS_TOKEN
|
|
509
509
|
# WHATSAPP_PHONE_NUMBER_ID = mesmo {PHONE_ID} descoberto acima
|
|
510
510
|
echo "{META_ACCESS_TOKEN}" | wrangler secret put WHATSAPP_ACCESS_TOKEN
|
|
@@ -682,7 +682,7 @@ PRÓXIMO PASSO:
|
|
|
682
682
|
|
|
683
683
|
| Arquivo | Função |
|
|
684
684
|
|---------|--------|
|
|
685
|
-
| `server-edge-tracker/
|
|
685
|
+
| `server-edge-tracker/index.ts` | `processWhatsAppWebhook()` + rotas `GET/POST /webhook/whatsapp` |
|
|
686
686
|
| `server-edge-tracker/migrate-v6.sql` | Criação da tabela `whatsapp_contacts` com índices |
|
|
687
687
|
| `server-edge-tracker/wrangler.toml` | Configuração do worker + lista de secrets documentados |
|
|
688
688
|
| `docs/whatsapp-ctwa.md` | Documentação técnica completa do módulo CTWA |
|
|
@@ -33,7 +33,7 @@ YouTube Ad (TrueView / Bumper / Non-skip)
|
|
|
33
33
|
|
|
34
34
|
### PASSO 0 — Ler Versões Atuais
|
|
35
35
|
|
|
36
|
-
```
|
|
36
|
+
```typescript
|
|
37
37
|
const apiVersions = await readJSON('contracts/api-versions.json');
|
|
38
38
|
const googleVersions = apiVersions.google;
|
|
39
39
|
|
|
@@ -253,7 +253,7 @@ cdpTrack.updateConsent({ analytics: true, ads: true });
|
|
|
253
253
|
|
|
254
254
|
---
|
|
255
255
|
|
|
256
|
-
## 🛠️ IMPLEMENTAÇÃO SERVER —
|
|
256
|
+
## 🛠️ IMPLEMENTAÇÃO SERVER — index.ts
|
|
257
257
|
|
|
258
258
|
### 1. Extrair e persistir Click IDs do YouTube
|
|
259
259
|
|
|
@@ -262,7 +262,7 @@ O `upsertProfile()` já persiste `gclid`, `wbraid`, `gbraid` no D1.
|
|
|
262
262
|
|
|
263
263
|
Para verificar persistência correta:
|
|
264
264
|
|
|
265
|
-
```
|
|
265
|
+
```typescript
|
|
266
266
|
// D1: user_profiles — colunas já existentes
|
|
267
267
|
// gclid TEXT — Google Ads standard click ID
|
|
268
268
|
// wbraid TEXT — iOS privacy-preserving (YouTube)
|
|
@@ -271,7 +271,7 @@ Para verificar persistência correta:
|
|
|
271
271
|
|
|
272
272
|
### 2. GA4 Measurement Protocol — Eventos de Vídeo
|
|
273
273
|
|
|
274
|
-
```
|
|
274
|
+
```typescript
|
|
275
275
|
// No sendGA4Mp() — adicionar mapeamento de eventos YouTube
|
|
276
276
|
const VIDEO_GA4_MAP = {
|
|
277
277
|
video_start: 'video_start',
|
|
@@ -293,7 +293,7 @@ const videoParams = {
|
|
|
293
293
|
|
|
294
294
|
### 3. Google Ads Enhanced Conversions — Lead de Vídeo
|
|
295
295
|
|
|
296
|
-
```
|
|
296
|
+
```typescript
|
|
297
297
|
// Conversão de Lead gerada por campanha YouTube
|
|
298
298
|
// Envia para GA4 MP com user_data para Enhanced Conversions
|
|
299
299
|
const enhancedConversionPayload = {
|
|
@@ -326,7 +326,7 @@ const enhancedConversionPayload = {
|
|
|
326
326
|
Para campanhas Bumper/Non-skip, o usuário converte DEPOIS sem clicar.
|
|
327
327
|
O Worker detecta isso quando um Lead chega SEM gclid mas com histórico de impressão YouTube:
|
|
328
328
|
|
|
329
|
-
```
|
|
329
|
+
```typescript
|
|
330
330
|
// No upsertProfile() — verificar se perfil tem impressão YouTube recente
|
|
331
331
|
// (requer webhook do Google Ads — avançado, Fase 5)
|
|
332
332
|
// Por ora: registrar ausência de gclid + utm_source=youtube como view-through candidate
|
|
@@ -418,7 +418,7 @@ const YOUTUBE_AUDIENCES_IMOVEIS = {
|
|
|
418
418
|
|
|
419
419
|
### Customer Match — Exportar leads do D1 para Google Ads
|
|
420
420
|
|
|
421
|
-
```
|
|
421
|
+
```typescript
|
|
422
422
|
// Endpoint no Worker: GET /export/customer-match
|
|
423
423
|
// Gera CSV criptografado para upload no Google Ads
|
|
424
424
|
|
|
@@ -449,7 +449,7 @@ async function exportCustomerMatchList(env) {
|
|
|
449
449
|
|
|
450
450
|
O Intelligence Agent (cron semanal) deve incluir check de YouTube:
|
|
451
451
|
|
|
452
|
-
```
|
|
452
|
+
```typescript
|
|
453
453
|
// Adicionar ao checkApiVersionsIntelligence():
|
|
454
454
|
// Verificar se wbraid/gbraid estão chegando nos leads
|
|
455
455
|
// (indica que campanhas YouTube iOS estão funcionando)
|
|
@@ -518,7 +518,7 @@ if (youtubeMobileLeads.count === 0) {
|
|
|
518
518
|
{
|
|
519
519
|
"arquivos_gerados": {
|
|
520
520
|
"browser": "cdpTrack.js (eventos YouTube + IFrame API listener)",
|
|
521
|
-
"server": "
|
|
521
|
+
"server": "modules/dispatch/ga4.ts (já inclui YouTube via GA4)"
|
|
522
522
|
},
|
|
523
523
|
"eventos_implementados": [
|
|
524
524
|
"video_start",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cdp-edge",
|
|
3
|
-
"version": "2.5.
|
|
3
|
+
"version": "2.5.3",
|
|
4
4
|
"description": "CDP Edge - Quantum Tracking - Sistema multi-agente para tracking digital Cloudflare Native (Workers + D1)",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -59,31 +59,31 @@
|
|
|
59
59
|
"license": "MIT",
|
|
60
60
|
"repository": {
|
|
61
61
|
"type": "git",
|
|
62
|
-
"url": "https://github.com/ricardosoli777/CDP-Edge-Premium"
|
|
62
|
+
"url": "https://github.com/ricardosoli777/CDP-Edge-Premium.ts"
|
|
63
63
|
},
|
|
64
64
|
"bugs": {
|
|
65
|
-
"url": "https://github.com/ricardosoli777/CDP-Edge-Premium/issues"
|
|
65
|
+
"url": "https://github.com/ricardosoli777/CDP-Edge-Premium.ts/issues"
|
|
66
66
|
},
|
|
67
|
-
"homepage": "https://github.com/ricardosoli777/CDP-Edge-Premium#readme",
|
|
67
|
+
"homepage": "https://github.com/ricardosoli777/CDP-Edge-Premium.ts#readme",
|
|
68
68
|
"engines": {
|
|
69
69
|
"node": ">=18.0.0"
|
|
70
70
|
},
|
|
71
71
|
"dependencies": {
|
|
72
72
|
"chalk": "^5.3.0",
|
|
73
|
-
"commander": "^
|
|
74
|
-
"inquirer": "^
|
|
75
|
-
"ora": "^
|
|
73
|
+
"commander": "^14.0.3",
|
|
74
|
+
"inquirer": "^13.4.2",
|
|
75
|
+
"ora": "^9.4.0"
|
|
76
76
|
},
|
|
77
77
|
"devDependencies": {
|
|
78
|
-
"@cloudflare/workers-types": "^4.
|
|
78
|
+
"@cloudflare/workers-types": "^4.20260425.1",
|
|
79
79
|
"@semantic-release/changelog": "^6.0.3",
|
|
80
80
|
"@semantic-release/commit-analyzer": "^13.0.1",
|
|
81
81
|
"@semantic-release/github": "^12.0.6",
|
|
82
82
|
"@semantic-release/npm": "^13.1.5",
|
|
83
83
|
"@semantic-release/release-notes-generator": "^14.1.0",
|
|
84
|
-
"@types/node": "^
|
|
84
|
+
"@types/node": "^25.6.0",
|
|
85
85
|
"esbuild": "^0.28.0",
|
|
86
86
|
"semantic-release": "^25.0.3",
|
|
87
|
-
"typescript": "^6.0.
|
|
87
|
+
"typescript": "^6.0.3"
|
|
88
88
|
}
|
|
89
89
|
}
|
|
@@ -99,9 +99,9 @@ export async function sendWhatsApp(env: Env, tipo: string, payload: TrackPayload
|
|
|
99
99
|
}
|
|
100
100
|
|
|
101
101
|
// Text fallback (dentro da janela de 24h)
|
|
102
|
-
const nome
|
|
103
|
-
const valor
|
|
104
|
-
const utm
|
|
102
|
+
const nome = [payload.firstName, payload.lastName].filter(Boolean).join(' ') || 'sem nome';
|
|
103
|
+
const valor = payload.value ? `R$ ${parseFloat(String(payload.value)).toFixed(2)}` : '—';
|
|
104
|
+
const utm = payload.utmSource || 'direto';
|
|
105
105
|
const produto = payload.contentName || '';
|
|
106
106
|
|
|
107
107
|
let texto = '';
|
|
@@ -127,7 +127,7 @@ export async function sendWhatsApp(env: Env, tipo: string, payload: TrackPayload
|
|
|
127
127
|
async function _sendWARequest(env: Env, body: Record<string, any>): Promise<any> {
|
|
128
128
|
try {
|
|
129
129
|
const phoneNumberId = resolvePhoneNumberId(env);
|
|
130
|
-
const accessToken
|
|
130
|
+
const accessToken = resolveAccessToken(env);
|
|
131
131
|
const res = await fetch(`https://graph.facebook.com/v22.0/${phoneNumberId}/messages`, {
|
|
132
132
|
method: 'POST',
|
|
133
133
|
headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${accessToken}` },
|
|
@@ -169,14 +169,14 @@ export async function processWhatsAppWebhook(env: Env, body: any, request: Reque
|
|
|
169
169
|
const results: any[] = [];
|
|
170
170
|
|
|
171
171
|
for (const message of messages) {
|
|
172
|
-
const phone
|
|
173
|
-
const wamid
|
|
174
|
-
const referral
|
|
175
|
-
const ctwaClid
|
|
176
|
-
const adId
|
|
177
|
-
const sourceUrl
|
|
178
|
-
const headline
|
|
179
|
-
const messageBody = message.text?.body
|
|
172
|
+
const phone = message.from;
|
|
173
|
+
const wamid = message.id;
|
|
174
|
+
const referral = message.referral || {};
|
|
175
|
+
const ctwaClid = referral.ctwa_clid || null;
|
|
176
|
+
const adId = referral.source_id || null;
|
|
177
|
+
const sourceUrl = referral.source_url || null;
|
|
178
|
+
const headline = referral.headline || null;
|
|
179
|
+
const messageBody = message.text?.body || message.type || '';
|
|
180
180
|
|
|
181
181
|
if (!phone) { results.push({ skipped: 'no phone' }); continue; }
|
|
182
182
|
|
|
@@ -202,9 +202,9 @@ export async function processWhatsAppWebhook(env: Env, body: any, request: Reque
|
|
|
202
202
|
}
|
|
203
203
|
|
|
204
204
|
const capiEvent: Record<string, any> = {
|
|
205
|
-
event_name:
|
|
206
|
-
event_time:
|
|
207
|
-
event_id:
|
|
205
|
+
event_name: 'Contact',
|
|
206
|
+
event_time: Math.floor(Date.now() / 1000),
|
|
207
|
+
event_id: eventId,
|
|
208
208
|
action_source: 'chat',
|
|
209
209
|
user_data: {
|
|
210
210
|
ph: phoneHash,
|
|
@@ -32,9 +32,11 @@ CREATE INDEX IF NOT EXISTS idx_utm_category ON utm_mappings(category);
|
|
|
32
32
|
-- ============================================================================
|
|
33
33
|
-- ALTER: leads (adicionar colunas de segmentação)
|
|
34
34
|
-- ============================================================================
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
ALTER TABLE leads ADD COLUMN
|
|
35
|
+
-- Nota: D1/SQLite não suporta ADD COLUMN IF NOT EXISTS. Executar uma vez.
|
|
36
|
+
-- Se as colunas já existirem, o erro "duplicate column name" é inofensivo — banco continua OK.
|
|
37
|
+
ALTER TABLE leads ADD COLUMN faixa_obfuscada TEXT; -- Hash da faixa de valor (vem da URL)
|
|
38
|
+
ALTER TABLE leads ADD COLUMN faixa_real TEXT; -- Valor real de-obfuscado (ex: "700k-1M")
|
|
39
|
+
ALTER TABLE leads ADD COLUMN faixa_category TEXT; -- Categoria do produto (ex: "imovel")
|
|
38
40
|
|
|
39
41
|
-- ============================================================================
|
|
40
42
|
-- ÍNDICES: leads (novas colunas para segmentação)
|
|
@@ -37,7 +37,7 @@ SITE_DOMAIN = "SEU_DOMINIO"
|
|
|
37
37
|
[[d1_databases]]
|
|
38
38
|
binding = "DB"
|
|
39
39
|
database_name = "cdp-edge-db"
|
|
40
|
-
database_id = "
|
|
40
|
+
database_id = "7867d38f-5fa8-4c17-b465-386211422c09"
|
|
41
41
|
|
|
42
42
|
# ── Queues — Retry + Dead Letter Queue ───────────────────────────────────────
|
|
43
43
|
# Produtor: worker envia eventos com falha para cdp-edge-retry
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
# Intelligence Agent — Scheduling (REDIRECIONAMENTO)
|
|
2
|
-
|
|
3
|
-
> ⚠️ **Este arquivo foi consolidado.**
|
|
4
|
-
>
|
|
5
|
-
> Todo o conteúdo de scheduling automático do Intelligence Agent foi unificado em:
|
|
6
|
-
> **[intelligence-agent.md](./intelligence-agent.md)**
|
|
7
|
-
>
|
|
8
|
-
> Consulte a seção `## 📅 PROTOCOLO DE SCHEDULING` dentro de `intelligence-agent.md`.
|
|
9
|
-
|
|
10
|
-
Motivo: duplicação eliminada para manter uma única fonte de verdade.
|
|
File without changes
|