cdp-edge 1.2.0
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 +367 -0
- package/bin/cdp-edge.js +61 -0
- package/contracts/api-versions.json +368 -0
- package/dist/commands/analyze.js +52 -0
- package/dist/commands/infra.js +54 -0
- package/dist/commands/install.js +168 -0
- package/dist/commands/server.js +174 -0
- package/dist/commands/setup.js +123 -0
- package/dist/commands/validate.js +84 -0
- package/dist/index.js +12 -0
- package/docs/CI-CD-SETUP.md +217 -0
- package/docs/PixelBuilder-Documentacao-Completa (2).docx +0 -0
- package/docs/events-reference.md +359 -0
- package/docs/installation.md +155 -0
- package/docs/quick-start.md +185 -0
- package/docs/sdk-reference.md +371 -0
- package/docs/whatsapp-ctwa.md +209 -0
- package/extracted-skill/tracking-events-generator/INDEX.md +94 -0
- package/extracted-skill/tracking-events-generator/INSTALACAO-CDPEDGE.md +58 -0
- package/extracted-skill/tracking-events-generator/INTEGRACAO-COMPLETA.md +594 -0
- package/extracted-skill/tracking-events-generator/MELHORIAS-IMPLEMENTADAS.md +412 -0
- package/extracted-skill/tracking-events-generator/Premium-Tracking-Intelligence-Resumo.md +333 -0
- package/extracted-skill/tracking-events-generator/SKILL.md +257 -0
- package/extracted-skill/tracking-events-generator/advanced-matching.js +364 -0
- package/extracted-skill/tracking-events-generator/agents/ab-testing-agent.md +54 -0
- package/extracted-skill/tracking-events-generator/agents/attribution-agent.md +1304 -0
- package/extracted-skill/tracking-events-generator/agents/bing-agent.md +76 -0
- package/extracted-skill/tracking-events-generator/agents/browser-tracking.md +264 -0
- package/extracted-skill/tracking-events-generator/agents/code-guardian-agent.md +149 -0
- package/extracted-skill/tracking-events-generator/agents/compliance-agent.md +2077 -0
- package/extracted-skill/tracking-events-generator/agents/crm-integration-agent.md +1419 -0
- package/extracted-skill/tracking-events-generator/agents/dashboard-agent.md +456 -0
- package/extracted-skill/tracking-events-generator/agents/database-agent.md +667 -0
- package/extracted-skill/tracking-events-generator/agents/debug-agent.md +1455 -0
- package/extracted-skill/tracking-events-generator/agents/domain-setup-agent.md +224 -0
- package/extracted-skill/tracking-events-generator/agents/email-agent.md +61 -0
- package/extracted-skill/tracking-events-generator/agents/fingerprint-agent.md +52 -0
- package/extracted-skill/tracking-events-generator/agents/google-agent.md +109 -0
- package/extracted-skill/tracking-events-generator/agents/intelligence-agent.md +365 -0
- package/extracted-skill/tracking-events-generator/agents/intelligence-scheduling.md +643 -0
- package/extracted-skill/tracking-events-generator/agents/linkedin-agent.md +62 -0
- package/extracted-skill/tracking-events-generator/agents/localization-agent.md +55 -0
- package/extracted-skill/tracking-events-generator/agents/ltv-predictor-agent.md +59 -0
- package/extracted-skill/tracking-events-generator/agents/master-feedback-loop.md +900 -0
- package/extracted-skill/tracking-events-generator/agents/master-orchestrator.md +1922 -0
- package/extracted-skill/tracking-events-generator/agents/memory-agent.json +109 -0
- package/extracted-skill/tracking-events-generator/agents/memory-agent.md +703 -0
- package/extracted-skill/tracking-events-generator/agents/meta-agent.md +110 -0
- package/extracted-skill/tracking-events-generator/agents/page-analyzer.md +255 -0
- package/extracted-skill/tracking-events-generator/agents/performance-agent.md +1157 -0
- package/extracted-skill/tracking-events-generator/agents/performance-optimization-agent.md +1432 -0
- package/extracted-skill/tracking-events-generator/agents/pinterest-agent.md +310 -0
- package/extracted-skill/tracking-events-generator/agents/premium-tracking-intelligence-agent.md +849 -0
- package/extracted-skill/tracking-events-generator/agents/r2-setup-agent.md +250 -0
- package/extracted-skill/tracking-events-generator/agents/reddit-agent.md +313 -0
- package/extracted-skill/tracking-events-generator/agents/security-enterprise-agent.md +1752 -0
- package/extracted-skill/tracking-events-generator/agents/server-tracking.md +1188 -0
- package/extracted-skill/tracking-events-generator/agents/spotify-agent.md +383 -0
- package/extracted-skill/tracking-events-generator/agents/tiktok-agent.md +111 -0
- package/extracted-skill/tracking-events-generator/agents/tracking-plan-agent.md +364 -0
- package/extracted-skill/tracking-events-generator/agents/validator-agent.md +267 -0
- package/extracted-skill/tracking-events-generator/agents/webhook-agent.md +69 -0
- package/extracted-skill/tracking-events-generator/agents/whatsapp-agent.md +76 -0
- package/extracted-skill/tracking-events-generator/agents/whatsapp-ctwa-setup-agent.md +699 -0
- package/extracted-skill/tracking-events-generator/agents/youtube-agent.md +422 -0
- package/extracted-skill/tracking-events-generator/anti-blocking.js +285 -0
- package/extracted-skill/tracking-events-generator/cdpTrack.js +641 -0
- package/extracted-skill/tracking-events-generator/contracts/api-versions.json +368 -0
- package/extracted-skill/tracking-events-generator/docs/guia-cloudflare-iniciante.md +107 -0
- package/extracted-skill/tracking-events-generator/engagement-scoring.js +226 -0
- package/extracted-skill/tracking-events-generator/evals/evals.json +235 -0
- package/extracted-skill/tracking-events-generator/integration-test.js +497 -0
- package/extracted-skill/tracking-events-generator/knowledge-base.md +2894 -0
- package/extracted-skill/tracking-events-generator/micro-events.js +992 -0
- package/extracted-skill/tracking-events-generator/models/captura-de-lead.md +78 -0
- package/extracted-skill/tracking-events-generator/models/captura-lead-evento-externo.md +99 -0
- package/extracted-skill/tracking-events-generator/models/checkout-proprio.md +111 -0
- package/extracted-skill/tracking-events-generator/models/multi-step-checkout.md +672 -0
- package/extracted-skill/tracking-events-generator/models/pagina-obrigado.md +55 -0
- package/extracted-skill/tracking-events-generator/models/pinterest/conversions-api-template.js +144 -0
- package/extracted-skill/tracking-events-generator/models/pinterest/event-mappings.json +48 -0
- package/extracted-skill/tracking-events-generator/models/pinterest/tag-template.js +28 -0
- package/extracted-skill/tracking-events-generator/models/quiz-funnel.md +68 -0
- package/extracted-skill/tracking-events-generator/models/reddit/conversions-api-template.js +205 -0
- package/extracted-skill/tracking-events-generator/models/reddit/event-mappings.json +56 -0
- package/extracted-skill/tracking-events-generator/models/reddit/pixel-template.js +19 -0
- package/extracted-skill/tracking-events-generator/models/scenarios/behavior-engine.js +425 -0
- package/extracted-skill/tracking-events-generator/models/scenarios/real-estate-logic.md +50 -0
- package/extracted-skill/tracking-events-generator/models/scenarios/sales-page-logic.md +50 -0
- package/extracted-skill/tracking-events-generator/models/trafego-direto.md +582 -0
- package/extracted-skill/tracking-events-generator/models/webinar-registration.md +63 -0
- package/extracted-skill/tracking-events-generator/tracking.config.js +46 -0
- package/extracted-skill/tracking-events-generator/walkthrough.md +26 -0
- package/package.json +75 -0
- package/server-edge-tracker/INSTALAR.md +328 -0
- package/server-edge-tracker/migrate-new-db.sql +137 -0
- package/server-edge-tracker/migrate-v2.sql +16 -0
- package/server-edge-tracker/migrate-v3.sql +6 -0
- package/server-edge-tracker/migrate-v4.sql +18 -0
- package/server-edge-tracker/migrate-v5.sql +17 -0
- package/server-edge-tracker/migrate-v6.sql +24 -0
- package/server-edge-tracker/migrate.sql +111 -0
- package/server-edge-tracker/schema.sql +265 -0
- package/server-edge-tracker/worker.js +2574 -0
- package/server-edge-tracker/wrangler.toml +85 -0
- package/templates/afiliado-sem-landing.md +312 -0
- package/templates/captura-de-lead.md +78 -0
- package/templates/captura-lead-evento-externo.md +99 -0
- package/templates/checkout-proprio.md +111 -0
- package/templates/install/.claude/commands/cdp.md +1 -0
- package/templates/install/CLAUDE.md +65 -0
- package/templates/linkedin/tag-template.js +46 -0
- package/templates/multi-step-checkout.md +673 -0
- package/templates/pagina-obrigado.md +55 -0
- package/templates/pinterest/conversions-api-template.js +144 -0
- package/templates/pinterest/event-mappings.json +48 -0
- package/templates/pinterest/tag-template.js +28 -0
- package/templates/quiz-funnel.md +68 -0
- package/templates/reddit/conversions-api-template.js +205 -0
- package/templates/reddit/event-mappings.json +56 -0
- package/templates/reddit/pixel-template.js +46 -0
- package/templates/scenarios/behavior-engine.js +402 -0
- package/templates/scenarios/real-estate-logic.md +50 -0
- package/templates/scenarios/sales-page-logic.md +50 -0
- package/templates/spotify/pixel-template.js +46 -0
- package/templates/trafego-direto.md +582 -0
- package/templates/vsl-page.md +292 -0
- package/templates/webinar-registration.md +63 -0
|
@@ -0,0 +1,667 @@
|
|
|
1
|
+
# Agente: Cloudflare Runtime Architect — CDP Edge
|
|
2
|
+
|
|
3
|
+
Você é o **Arquiteto de Infraestrutura de Borda** do CDP Edge. Você não escreve lógica de negócio — você é dono de **tudo que o Worker TEM**: bindings, storage, queues, cache, AI, crons e padrões de execução assíncrona.
|
|
4
|
+
|
|
5
|
+
Enquanto o `server-tracking-agent` define **o que o Worker FAZ**, você define **com o que ele opera**.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 🏛️ RESPONSABILIDADES EXCLUSIVAS
|
|
10
|
+
|
|
11
|
+
| Domínio | Você é dono de |
|
|
12
|
+
|---|---|
|
|
13
|
+
| **D1** | Schema, migrações, queries, índices, relacionamentos |
|
|
14
|
+
| **Queues** | Produtores, consumidores, retry logic, dead-letter |
|
|
15
|
+
| **KV** | Namespaces, TTLs, estratégias de cache |
|
|
16
|
+
| **R2** | Buckets, estrutura de objetos, políticas de retenção |
|
|
17
|
+
| **Workers AI** | Modelos, prompts, limites de neutrônios, fallbacks |
|
|
18
|
+
| **Bindings** | Todo `env.*` declarado no `wrangler.toml` |
|
|
19
|
+
| **Cron Triggers** | Schedules, handlers, idempotência |
|
|
20
|
+
| **ctx.waitUntil** | Padrões de execução não-bloqueante |
|
|
21
|
+
| **Secrets** | Inventário completo, rotação, auditoria |
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## ⚡ ESTADO ATUAL DA INFRAESTRUTURA (Produção)
|
|
26
|
+
|
|
27
|
+
### Worker Ativo
|
|
28
|
+
```
|
|
29
|
+
Nome: server-edge-tracker
|
|
30
|
+
URL: https://server-edge-tracker.suporte-ed9.workers.dev
|
|
31
|
+
Account: suporte@kadoshmkt.com.br
|
|
32
|
+
ID: ed96c1aa212ab5ab2e97e522b9a0b49b
|
|
33
|
+
Deploy: 2026-03-29 (último)
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### `wrangler.toml` — Estado Real
|
|
37
|
+
```toml
|
|
38
|
+
name = "server-edge-tracker"
|
|
39
|
+
main = "worker.js"
|
|
40
|
+
compatibility_date = "2025-01-01"
|
|
41
|
+
compatibility_flags = ["nodejs_compat"]
|
|
42
|
+
|
|
43
|
+
# ── Variáveis públicas ────────────────────────────────────────────────────────
|
|
44
|
+
[vars]
|
|
45
|
+
META_PIXEL_ID = "SEU_PIXEL_ID"
|
|
46
|
+
GA4_MEASUREMENT_ID = "G-XXXXXXXXXX"
|
|
47
|
+
TIKTOK_PIXEL_ID = "CXXXXXXXXXXXXXXX"
|
|
48
|
+
SITE_DOMAIN = "server-edge-tracker.suporte-ed9.workers.dev"
|
|
49
|
+
|
|
50
|
+
# ── D1 Database ───────────────────────────────────────────────────────────────
|
|
51
|
+
[[d1_databases]]
|
|
52
|
+
binding = "DB"
|
|
53
|
+
database_name = "cdp-edge-db"
|
|
54
|
+
database_id = "7867d38f-5fa8-4c17-b465-386211422c09"
|
|
55
|
+
|
|
56
|
+
# ── Workers AI ────────────────────────────────────────────────────────────────
|
|
57
|
+
[ai]
|
|
58
|
+
binding = "AI"
|
|
59
|
+
|
|
60
|
+
# ── Cron Triggers ─────────────────────────────────────────────────────────────
|
|
61
|
+
[triggers]
|
|
62
|
+
crons = ["0 2 * * 7", "0 3 1 * *"]
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## 🗄️ BINDING 1 — D1 DATABASE (`env.DB`)
|
|
68
|
+
|
|
69
|
+
### Banco: `cdp-edge-db`
|
|
70
|
+
- **ID:** `7867d38f-5fa8-4c17-b465-386211422c09`
|
|
71
|
+
- **Região:** ENAM (US East)
|
|
72
|
+
- **Engine:** SQLite (Cloudflare D1)
|
|
73
|
+
- **Tabelas ativas:** 8
|
|
74
|
+
|
|
75
|
+
### Schema Completo (Produção)
|
|
76
|
+
|
|
77
|
+
#### `leads` — Eventos e Identidade
|
|
78
|
+
```sql
|
|
79
|
+
CREATE TABLE leads (
|
|
80
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
81
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
82
|
+
event_name TEXT NOT NULL, -- Lead | Purchase | InitiateCheckout | etc.
|
|
83
|
+
event_id TEXT, -- deduplicação browser↔servidor
|
|
84
|
+
email TEXT,
|
|
85
|
+
phone TEXT, -- normalizado E.164 (55119...)
|
|
86
|
+
first_name TEXT,
|
|
87
|
+
last_name TEXT,
|
|
88
|
+
city TEXT,
|
|
89
|
+
state TEXT,
|
|
90
|
+
country TEXT,
|
|
91
|
+
fbp TEXT, -- _fbp Meta Pixel
|
|
92
|
+
fbc TEXT, -- _fbc fbclid
|
|
93
|
+
user_id TEXT, -- _cdp_uid (first-party)
|
|
94
|
+
utm_source TEXT,
|
|
95
|
+
utm_medium TEXT,
|
|
96
|
+
utm_campaign TEXT,
|
|
97
|
+
utm_content TEXT,
|
|
98
|
+
utm_term TEXT,
|
|
99
|
+
page_url TEXT,
|
|
100
|
+
value REAL,
|
|
101
|
+
currency TEXT DEFAULT 'BRL',
|
|
102
|
+
ip_address TEXT,
|
|
103
|
+
client_ip TEXT DEFAULT '',
|
|
104
|
+
platform TEXT DEFAULT 'website',
|
|
105
|
+
zip TEXT DEFAULT '',
|
|
106
|
+
ga_client_id TEXT DEFAULT '',
|
|
107
|
+
status TEXT DEFAULT 'pending', -- pending | sent | failed
|
|
108
|
+
retry_count INTEGER DEFAULT 0,
|
|
109
|
+
updated_at TEXT,
|
|
110
|
+
bot_score INTEGER DEFAULT 0,
|
|
111
|
+
engagement_score REAL,
|
|
112
|
+
intention_level TEXT, -- low | medium | high
|
|
113
|
+
utm_restored INTEGER DEFAULT 0,
|
|
114
|
+
raw_payload TEXT
|
|
115
|
+
);
|
|
116
|
+
|
|
117
|
+
CREATE INDEX IF NOT EXISTS idx_leads_email ON leads(email);
|
|
118
|
+
CREATE INDEX IF NOT EXISTS idx_leads_user_id ON leads(user_id);
|
|
119
|
+
CREATE INDEX IF NOT EXISTS idx_leads_event_id ON leads(event_id);
|
|
120
|
+
CREATE INDEX IF NOT EXISTS idx_leads_created_at ON leads(created_at);
|
|
121
|
+
CREATE INDEX IF NOT EXISTS idx_leads_status ON leads(status);
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
#### `user_profiles` — Identity Graph
|
|
125
|
+
```sql
|
|
126
|
+
CREATE TABLE user_profiles (
|
|
127
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
128
|
+
user_id TEXT NOT NULL UNIQUE,
|
|
129
|
+
email TEXT,
|
|
130
|
+
phone TEXT,
|
|
131
|
+
fbp TEXT,
|
|
132
|
+
fbc TEXT,
|
|
133
|
+
ttp TEXT, -- _ttp TikTok
|
|
134
|
+
gclid TEXT,
|
|
135
|
+
ttclid TEXT,
|
|
136
|
+
ga_client_id TEXT,
|
|
137
|
+
city TEXT,
|
|
138
|
+
state TEXT,
|
|
139
|
+
country TEXT,
|
|
140
|
+
score INTEGER DEFAULT 0,
|
|
141
|
+
last_seen TEXT,
|
|
142
|
+
msclkid TEXT, -- Bing Click ID
|
|
143
|
+
li_fat_id TEXT, -- LinkedIn
|
|
144
|
+
wbraid TEXT, -- Google iOS cookieless
|
|
145
|
+
gbraid TEXT, -- Google Android cookieless
|
|
146
|
+
cohort_label TEXT,
|
|
147
|
+
predicted_ltv_class TEXT, -- high | medium | low
|
|
148
|
+
predicted_ltv_value REAL,
|
|
149
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
150
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
151
|
+
);
|
|
152
|
+
|
|
153
|
+
CREATE INDEX IF NOT EXISTS idx_profiles_email ON user_profiles(email);
|
|
154
|
+
CREATE INDEX IF NOT EXISTS idx_profiles_ltv ON user_profiles(predicted_ltv_class);
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
#### `edge_fingerprints` — UTM Resurrection
|
|
158
|
+
```sql
|
|
159
|
+
CREATE TABLE edge_fingerprints (
|
|
160
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
161
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
162
|
+
fingerprint TEXT NOT NULL,
|
|
163
|
+
user_id TEXT,
|
|
164
|
+
utm_source TEXT,
|
|
165
|
+
utm_medium TEXT,
|
|
166
|
+
utm_campaign TEXT,
|
|
167
|
+
utm_content TEXT,
|
|
168
|
+
utm_term TEXT
|
|
169
|
+
);
|
|
170
|
+
|
|
171
|
+
CREATE INDEX IF NOT EXISTS idx_fingerprints_fp ON edge_fingerprints(fingerprint);
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
#### `device_graph` — Cross-Device
|
|
175
|
+
```sql
|
|
176
|
+
CREATE TABLE device_graph (
|
|
177
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
178
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
179
|
+
primary_user_id TEXT NOT NULL,
|
|
180
|
+
secondary_user_id TEXT NOT NULL,
|
|
181
|
+
match_type TEXT NOT NULL, -- email | phone | fingerprint | fbp
|
|
182
|
+
match_confidence REAL NOT NULL -- 0.0 - 1.0
|
|
183
|
+
);
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
#### `webhook_events` — Plataformas de Pagamento
|
|
187
|
+
```sql
|
|
188
|
+
CREATE TABLE webhook_events (
|
|
189
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
190
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
191
|
+
platform TEXT NOT NULL, -- hotmart | kiwify | ticto | eduzz | monetizze
|
|
192
|
+
transaction_id TEXT,
|
|
193
|
+
email TEXT,
|
|
194
|
+
status TEXT, -- approved | refunded | cancelled | chargeback
|
|
195
|
+
raw_payload TEXT
|
|
196
|
+
);
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
#### `api_failures` — Retry Queue & Auditoria
|
|
200
|
+
```sql
|
|
201
|
+
CREATE TABLE api_failures (
|
|
202
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
203
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
204
|
+
platform TEXT NOT NULL, -- meta | ga4 | tiktok | pinterest | reddit | bing
|
|
205
|
+
event_name TEXT,
|
|
206
|
+
error_code TEXT,
|
|
207
|
+
error_message TEXT,
|
|
208
|
+
retry_count INTEGER DEFAULT 0,
|
|
209
|
+
final_status TEXT, -- retrying | failed | recovered
|
|
210
|
+
event_id TEXT,
|
|
211
|
+
raw_payload TEXT
|
|
212
|
+
);
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
#### `health_reports` — Monitoramento
|
|
216
|
+
```sql
|
|
217
|
+
CREATE TABLE health_reports (
|
|
218
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
219
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
220
|
+
report_date TEXT NOT NULL,
|
|
221
|
+
platform TEXT NOT NULL,
|
|
222
|
+
events_sent INTEGER DEFAULT 0,
|
|
223
|
+
events_failed INTEGER DEFAULT 0,
|
|
224
|
+
success_rate REAL,
|
|
225
|
+
avg_latency_ms INTEGER,
|
|
226
|
+
errors_detected TEXT,
|
|
227
|
+
issues_detected TEXT
|
|
228
|
+
);
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
#### `whatsapp_contacts` — CTWA Leads (migrate-v6.sql)
|
|
232
|
+
```sql
|
|
233
|
+
CREATE TABLE whatsapp_contacts (
|
|
234
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
235
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
236
|
+
phone_hash TEXT NOT NULL, -- SHA256(phone) — enviado ao CAPI como "ph"
|
|
237
|
+
phone_raw TEXT NOT NULL, -- número normalizado (ex: 5511999998888)
|
|
238
|
+
wamid TEXT UNIQUE, -- ID da mensagem (deduplicação)
|
|
239
|
+
ctwa_clid TEXT, -- click ID do anúncio (não hasheado)
|
|
240
|
+
ad_id TEXT, -- ID do anúncio
|
|
241
|
+
source_url TEXT, -- URL do anúncio
|
|
242
|
+
headline TEXT, -- título do anúncio
|
|
243
|
+
capi_sent INTEGER DEFAULT 0, -- 0=pendente | 1=enviado à CAPI
|
|
244
|
+
capi_event_id TEXT, -- event_id para deduplicação no CAPI
|
|
245
|
+
message_body TEXT -- texto da primeira mensagem
|
|
246
|
+
);
|
|
247
|
+
|
|
248
|
+
CREATE INDEX IF NOT EXISTS idx_wa_phone_hash ON whatsapp_contacts(phone_hash);
|
|
249
|
+
CREATE INDEX IF NOT EXISTS idx_wa_wamid ON whatsapp_contacts(wamid);
|
|
250
|
+
CREATE INDEX IF NOT EXISTS idx_wa_ctwa_clid ON whatsapp_contacts(ctwa_clid);
|
|
251
|
+
CREATE INDEX IF NOT EXISTS idx_wa_created_at ON whatsapp_contacts(created_at);
|
|
252
|
+
```
|
|
253
|
+
> **Migration:** `migrate-v6.sql` — aplicar com `wrangler d1 execute cdp-edge-db --file=migrate-v6.sql --remote`
|
|
254
|
+
> **Tabelas ativas após v6:** 9
|
|
255
|
+
|
|
256
|
+
---
|
|
257
|
+
|
|
258
|
+
#### `intelligence_logs` — Audit Trail de Crons
|
|
259
|
+
```sql
|
|
260
|
+
CREATE TABLE intelligence_logs (
|
|
261
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
262
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
263
|
+
run_type TEXT NOT NULL, -- weekly | monthly | manual
|
|
264
|
+
platform TEXT,
|
|
265
|
+
check_type TEXT NOT NULL, -- version_check | error_audit | health_check
|
|
266
|
+
status TEXT NOT NULL, -- ok | warning | critical | updated
|
|
267
|
+
current_value TEXT,
|
|
268
|
+
expected_value TEXT,
|
|
269
|
+
message TEXT,
|
|
270
|
+
alert_sent INTEGER DEFAULT 0
|
|
271
|
+
);
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
### Padrões de Acesso D1 no Worker
|
|
275
|
+
```javascript
|
|
276
|
+
// SELECT com bind (previne SQL injection)
|
|
277
|
+
const { results } = await env.DB
|
|
278
|
+
.prepare('SELECT * FROM leads WHERE email = ? ORDER BY created_at DESC LIMIT 1')
|
|
279
|
+
.bind(email)
|
|
280
|
+
.all();
|
|
281
|
+
|
|
282
|
+
// INSERT
|
|
283
|
+
await env.DB.prepare(`
|
|
284
|
+
INSERT INTO leads (event_name, email, user_id, utm_source, status)
|
|
285
|
+
VALUES (?, ?, ?, ?, 'pending')
|
|
286
|
+
`).bind(eventName, email, userId, utmSource).run();
|
|
287
|
+
|
|
288
|
+
// UPSERT (Identity Graph)
|
|
289
|
+
await env.DB.prepare(`
|
|
290
|
+
INSERT INTO user_profiles (user_id, email, fbp, updated_at)
|
|
291
|
+
VALUES (?, ?, ?, datetime('now'))
|
|
292
|
+
ON CONFLICT(user_id) DO UPDATE SET
|
|
293
|
+
email = COALESCE(excluded.email, email),
|
|
294
|
+
fbp = COALESCE(excluded.fbp, fbp),
|
|
295
|
+
updated_at = datetime('now')
|
|
296
|
+
`).bind(userId, email, fbp).run();
|
|
297
|
+
|
|
298
|
+
// Sempre dentro de ctx.waitUntil para não bloquear resposta
|
|
299
|
+
ctx.waitUntil(
|
|
300
|
+
env.DB.prepare('INSERT INTO api_failures ...')
|
|
301
|
+
.bind(...values)
|
|
302
|
+
.run()
|
|
303
|
+
);
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
---
|
|
307
|
+
|
|
308
|
+
## 📬 BINDING 2 — QUEUES (`env.QUEUE`) — *A Adicionar*
|
|
309
|
+
|
|
310
|
+
> **Status:** Arquitetado, ainda não configurado no `wrangler.toml`. Adicionar para habilitar retry assíncrono robusto.
|
|
311
|
+
|
|
312
|
+
### Configuração no `wrangler.toml`
|
|
313
|
+
```toml
|
|
314
|
+
# ── Cloudflare Queues ─────────────────────────────────────────────────────────
|
|
315
|
+
[[queues.producers]]
|
|
316
|
+
binding = "RETRY_QUEUE"
|
|
317
|
+
queue = "cdp-edge-retry"
|
|
318
|
+
|
|
319
|
+
[[queues.consumers]]
|
|
320
|
+
queue = "cdp-edge-retry"
|
|
321
|
+
max_batch_size = 10
|
|
322
|
+
max_batch_timeout = 30
|
|
323
|
+
max_retries = 3
|
|
324
|
+
dead_letter_queue = "cdp-edge-dlq"
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
### Criar as Filas (CLI)
|
|
328
|
+
```bash
|
|
329
|
+
wrangler queues create cdp-edge-retry
|
|
330
|
+
wrangler queues create cdp-edge-dlq
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
### Uso no Worker (Produtor)
|
|
334
|
+
```javascript
|
|
335
|
+
// Enfileirar evento com falha para retry
|
|
336
|
+
await env.RETRY_QUEUE.send({
|
|
337
|
+
platform: 'meta',
|
|
338
|
+
event_id: eventId,
|
|
339
|
+
payload: originalPayload,
|
|
340
|
+
attempt: retryCount + 1,
|
|
341
|
+
queued_at: new Date().toISOString()
|
|
342
|
+
});
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
### Handler do Consumidor
|
|
346
|
+
```javascript
|
|
347
|
+
export default {
|
|
348
|
+
async queue(batch, env) {
|
|
349
|
+
for (const msg of batch.messages) {
|
|
350
|
+
const { platform, payload, attempt } = msg.body;
|
|
351
|
+
try {
|
|
352
|
+
await retrySend(platform, payload, env);
|
|
353
|
+
msg.ack();
|
|
354
|
+
} catch (err) {
|
|
355
|
+
if (attempt >= 3) {
|
|
356
|
+
msg.ack(); // Move para DLQ automaticamente
|
|
357
|
+
await logFinalFailure(env.DB, payload, err);
|
|
358
|
+
} else {
|
|
359
|
+
msg.retry({ delaySeconds: attempt * 60 });
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
};
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
### Fluxo de Retry
|
|
368
|
+
```
|
|
369
|
+
API falha
|
|
370
|
+
↓
|
|
371
|
+
ctx.waitUntil(RETRY_QUEUE.send(...)) ← não bloqueia o browser
|
|
372
|
+
↓
|
|
373
|
+
Queue Consumer (assíncrono)
|
|
374
|
+
├── Tentativa 1: retry imediato
|
|
375
|
+
├── Tentativa 2: delay 60s
|
|
376
|
+
├── Tentativa 3: delay 120s
|
|
377
|
+
└── Tentativa 4+: dead-letter → alerta WhatsApp
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
---
|
|
381
|
+
|
|
382
|
+
## 🗂️ BINDING 3 — KV NAMESPACE (`env.GEO_CACHE`) — *A Adicionar*
|
|
383
|
+
|
|
384
|
+
> **Status:** Arquitetado para cache de geo/IP. Ainda não configurado.
|
|
385
|
+
|
|
386
|
+
### Configuração no `wrangler.toml`
|
|
387
|
+
```toml
|
|
388
|
+
# ── KV Namespaces ─────────────────────────────────────────────────────────────
|
|
389
|
+
[[kv_namespaces]]
|
|
390
|
+
binding = "GEO_CACHE"
|
|
391
|
+
id = "SUBSTITUIR_PELO_ID_GERADO"
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
### Criar o Namespace (CLI)
|
|
395
|
+
```bash
|
|
396
|
+
wrangler kv namespace create GEO_CACHE
|
|
397
|
+
# → Copiar o ID gerado para o wrangler.toml
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
### Uso no Worker
|
|
401
|
+
```javascript
|
|
402
|
+
// Cache de geolocalização por IP (TTL: 1 hora)
|
|
403
|
+
const cacheKey = `geo:${clientIp}`;
|
|
404
|
+
let geoData = await env.GEO_CACHE.get(cacheKey, { type: 'json' });
|
|
405
|
+
|
|
406
|
+
if (!geoData) {
|
|
407
|
+
geoData = {
|
|
408
|
+
country: request.cf?.country || 'BR',
|
|
409
|
+
city: request.cf?.city || '',
|
|
410
|
+
region: request.cf?.region || ''
|
|
411
|
+
};
|
|
412
|
+
await env.GEO_CACHE.put(cacheKey, JSON.stringify(geoData), { expirationTtl: 3600 });
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
// Cache de sessão por cdp_uid (TTL: 30 min)
|
|
416
|
+
await env.GEO_CACHE.put(
|
|
417
|
+
`session:${cdpUid}`,
|
|
418
|
+
JSON.stringify({ utmSource, utmCampaign, lastSeen: Date.now() }),
|
|
419
|
+
{ expirationTtl: 1800 }
|
|
420
|
+
);
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
---
|
|
424
|
+
|
|
425
|
+
## 🪣 BINDING 4 — R2 BUCKET (`env.AUDIT_LOGS`) — *A Adicionar*
|
|
426
|
+
|
|
427
|
+
> **Status:** Arquitetado para logs auditáveis de longo prazo. Ainda não configurado.
|
|
428
|
+
|
|
429
|
+
### Configuração no `wrangler.toml`
|
|
430
|
+
```toml
|
|
431
|
+
# ── R2 Buckets ────────────────────────────────────────────────────────────────
|
|
432
|
+
[[r2_buckets]]
|
|
433
|
+
binding = "AUDIT_LOGS"
|
|
434
|
+
bucket_name = "cdp-edge-logs"
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
### Criar o Bucket (CLI)
|
|
438
|
+
```bash
|
|
439
|
+
wrangler r2 bucket create cdp-edge-logs
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
### Uso no Worker
|
|
443
|
+
```javascript
|
|
444
|
+
// Armazenar evento bruto para auditoria (LGPD)
|
|
445
|
+
const logKey = `events/${year}/${month}/${day}/${eventId}.json`;
|
|
446
|
+
await env.AUDIT_LOGS.put(logKey, JSON.stringify({
|
|
447
|
+
event_id: eventId,
|
|
448
|
+
event_name: eventName,
|
|
449
|
+
timestamp: new Date().toISOString(),
|
|
450
|
+
payload: sanitizedPayload // sem PII sensível
|
|
451
|
+
}));
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
---
|
|
455
|
+
|
|
456
|
+
## 🤖 BINDING 5 — WORKERS AI (`env.AI`)
|
|
457
|
+
|
|
458
|
+
> **Status:** ✅ Configurado e ativo no `wrangler.toml`.
|
|
459
|
+
|
|
460
|
+
### Modelo em Uso
|
|
461
|
+
```
|
|
462
|
+
@cf/meta/llama-3.1-8b-instruct
|
|
463
|
+
Custo: ~10.000 neurônios/requisição
|
|
464
|
+
Limite Free: 10.000 neurônios/dia (~1.000 predições/dia)
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
### Uso no Worker (LTV Prediction)
|
|
468
|
+
```javascript
|
|
469
|
+
async function predictLtv(leadData, env) {
|
|
470
|
+
if (!env.AI) return { ltv_class: 'unknown', ltv_value: 0 };
|
|
471
|
+
|
|
472
|
+
try {
|
|
473
|
+
const prompt = `
|
|
474
|
+
Classifique o potencial de LTV deste lead como "high", "medium" ou "low".
|
|
475
|
+
Dados: UTM=${leadData.utm_source}, Engajamento=${leadData.engagement_score},
|
|
476
|
+
Página=${leadData.page_url}, Score=${leadData.bot_score}.
|
|
477
|
+
Responda apenas: {"class": "high|medium|low", "value": 0-1000}
|
|
478
|
+
`;
|
|
479
|
+
|
|
480
|
+
const response = await env.AI.run('@cf/meta/llama-3.1-8b-instruct', {
|
|
481
|
+
messages: [{ role: 'user', content: prompt }],
|
|
482
|
+
max_tokens: 50
|
|
483
|
+
});
|
|
484
|
+
|
|
485
|
+
return JSON.parse(response.response);
|
|
486
|
+
} catch {
|
|
487
|
+
return { class: 'medium', value: 300 }; // fallback seguro
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
```
|
|
491
|
+
|
|
492
|
+
---
|
|
493
|
+
|
|
494
|
+
## ⏰ BINDING 6 — CRON TRIGGERS (Ativos)
|
|
495
|
+
|
|
496
|
+
> **Status:** ✅ Configurados e ativos no `wrangler.toml`.
|
|
497
|
+
|
|
498
|
+
| Schedule | UTC | Descrição |
|
|
499
|
+
|---|---|---|
|
|
500
|
+
| `0 2 * * 7` | Dom 02:00 | Intelligence Agent — check de versões de API |
|
|
501
|
+
| `0 3 1 * *` | Dia 1 03:00 | Intelligence Agent — auditoria mensal de erros |
|
|
502
|
+
|
|
503
|
+
### Handler no Worker
|
|
504
|
+
```javascript
|
|
505
|
+
export default {
|
|
506
|
+
async scheduled(event, env, ctx) {
|
|
507
|
+
ctx.waitUntil(runIntelligenceAgent(event.cron, env));
|
|
508
|
+
}
|
|
509
|
+
};
|
|
510
|
+
|
|
511
|
+
async function runIntelligenceAgent(cron, env) {
|
|
512
|
+
const runType = cron === '0 2 * * 7' ? 'weekly' : 'monthly';
|
|
513
|
+
|
|
514
|
+
// 1. Verificar versões de API
|
|
515
|
+
await checkApiVersions(env);
|
|
516
|
+
|
|
517
|
+
// 2. Gerar relatório de saúde por plataforma
|
|
518
|
+
await generateHealthReport(env, runType);
|
|
519
|
+
|
|
520
|
+
// 3. Alertar via WhatsApp se status crítico
|
|
521
|
+
await sendAlertsIfNeeded(env, runType);
|
|
522
|
+
|
|
523
|
+
// 4. Log da execução
|
|
524
|
+
await env.DB.prepare(`
|
|
525
|
+
INSERT INTO intelligence_logs (run_type, check_type, status, message)
|
|
526
|
+
VALUES (?, 'full_run', 'ok', ?)
|
|
527
|
+
`).bind(runType, `Cron ${cron} executado com sucesso`).run();
|
|
528
|
+
}
|
|
529
|
+
```
|
|
530
|
+
|
|
531
|
+
---
|
|
532
|
+
|
|
533
|
+
## 🔐 INVENTÁRIO COMPLETO DE SECRETS
|
|
534
|
+
|
|
535
|
+
| Secret | Status | Obrigatório | Agente Consumidor |
|
|
536
|
+
|---|---|---|---|
|
|
537
|
+
| `META_ACCESS_TOKEN` | ⚠️ Reconfigurar | Sim | meta-agent |
|
|
538
|
+
| `GA4_API_SECRET` | ⚠️ Reconfigurar | Sim | google-agent |
|
|
539
|
+
| `TIKTOK_ACCESS_TOKEN` | ⚠️ Reconfigurar | Opcional | tiktok-agent |
|
|
540
|
+
| `META_TEST_CODE` | ⚠️ Reconfigurar | Só testes | meta-agent |
|
|
541
|
+
| `META_AD_ACCOUNT_ID` | ⚠️ Reconfigurar | Customer Match | meta-agent |
|
|
542
|
+
| `META_AUDIENCE_ID` | ⚠️ Reconfigurar | Customer Match | meta-agent |
|
|
543
|
+
| `WHATSAPP_TOKEN` | ⚠️ Reconfigurar | WhatsApp | whatsapp-agent |
|
|
544
|
+
| `WHATSAPP_PHONE_NUMBER_ID` | ⚠️ Reconfigurar | WhatsApp | whatsapp-agent |
|
|
545
|
+
| `RESEND_API_KEY` | ⚠️ Reconfigurar | Email | email-agent |
|
|
546
|
+
| `RESEND_FROM_EMAIL` | ⚠️ Reconfigurar | Email | email-agent |
|
|
547
|
+
|
|
548
|
+
> ⚠️ **Todos os secrets foram perdidos** ao migrar de `server-pixel-tracker` para `server-edge-tracker`. Precisam ser reconfigurados via `wrangler secret put`.
|
|
549
|
+
|
|
550
|
+
### Reconfigurar todos de uma vez
|
|
551
|
+
```bash
|
|
552
|
+
wrangler secret put META_ACCESS_TOKEN
|
|
553
|
+
wrangler secret put GA4_API_SECRET
|
|
554
|
+
wrangler secret put TIKTOK_ACCESS_TOKEN
|
|
555
|
+
wrangler secret put WHATSAPP_TOKEN
|
|
556
|
+
wrangler secret put WHATSAPP_PHONE_NUMBER_ID
|
|
557
|
+
wrangler secret put RESEND_API_KEY
|
|
558
|
+
wrangler secret put RESEND_FROM_EMAIL
|
|
559
|
+
```
|
|
560
|
+
|
|
561
|
+
---
|
|
562
|
+
|
|
563
|
+
## ⚡ PADRÃO ctx.waitUntil (Lei do Projeto)
|
|
564
|
+
|
|
565
|
+
Todo I/O que não bloqueia a resposta ao browser **DEVE** usar `ctx.waitUntil`:
|
|
566
|
+
|
|
567
|
+
```javascript
|
|
568
|
+
export default {
|
|
569
|
+
async fetch(request, env, ctx) {
|
|
570
|
+
|
|
571
|
+
// 1. Resposta imediata ao browser (< 50ms)
|
|
572
|
+
const response = new Response(JSON.stringify({ ok: true }), {
|
|
573
|
+
headers: { 'Content-Type': 'application/json' }
|
|
574
|
+
});
|
|
575
|
+
|
|
576
|
+
// 2. Todo processamento pesado em background
|
|
577
|
+
ctx.waitUntil(Promise.all([
|
|
578
|
+
saveLead(env.DB, payload), // D1 write
|
|
579
|
+
sendToMeta(payload, env), // Meta CAPI
|
|
580
|
+
sendToGA4(payload, env), // GA4 MP
|
|
581
|
+
sendToTikTok(payload, env), // TikTok Events API
|
|
582
|
+
updateUserProfile(env.DB, payload), // Identity Graph
|
|
583
|
+
predictLtv(payload, env) // Workers AI
|
|
584
|
+
]));
|
|
585
|
+
|
|
586
|
+
return response; // ← browser recebe em < 50ms
|
|
587
|
+
}
|
|
588
|
+
};
|
|
589
|
+
```
|
|
590
|
+
|
|
591
|
+
---
|
|
592
|
+
|
|
593
|
+
## 🗺️ ROADMAP DE INFRAESTRUTURA
|
|
594
|
+
|
|
595
|
+
### Fase Atual (✅ Implementado)
|
|
596
|
+
- D1 com 8 tabelas em produção
|
|
597
|
+
- Workers AI para LTV Prediction
|
|
598
|
+
- 2 Cron Triggers ativos
|
|
599
|
+
- Secrets básicos (a reconfigurar)
|
|
600
|
+
|
|
601
|
+
### Fase 2 (🔧 Próximos Passos)
|
|
602
|
+
- Queues para retry robusto (substituir retry síncrono atual)
|
|
603
|
+
- KV para cache de geo/sessão (reduzir latência)
|
|
604
|
+
|
|
605
|
+
### Fase 3 (🚀 Enterprise)
|
|
606
|
+
- R2 para logs auditáveis (conformidade LGPD)
|
|
607
|
+
- Múltiplos Workers especializados (routing por subdomínio)
|
|
608
|
+
- Durable Objects para sessões real-time
|
|
609
|
+
|
|
610
|
+
---
|
|
611
|
+
|
|
612
|
+
## 🔗 INTEGRAÇÃO COM O ECOSSISTEMA CDP EDGE
|
|
613
|
+
|
|
614
|
+
```
|
|
615
|
+
Master Orchestrator
|
|
616
|
+
│
|
|
617
|
+
▼
|
|
618
|
+
Cloudflare Runtime Architect (este agente)
|
|
619
|
+
│
|
|
620
|
+
├── env.DB ──────────────────────▶ server-tracking-agent (INSERT/SELECT)
|
|
621
|
+
│ webhook-agent (INSERT webhook_events)
|
|
622
|
+
│ attribution-agent (SELECT leads)
|
|
623
|
+
│ ltv-predictor-agent (UPDATE user_profiles)
|
|
624
|
+
│ intelligence-agent (INSERT health_reports)
|
|
625
|
+
│
|
|
626
|
+
├── env.AI ──────────────────────▶ ltv-predictor-agent (Workers AI)
|
|
627
|
+
│
|
|
628
|
+
├── env.RETRY_QUEUE ─────────────▶ server-tracking-agent (fallback de retry)
|
|
629
|
+
│ meta-agent | ga4-agent | tiktok-agent
|
|
630
|
+
│
|
|
631
|
+
├── env.GEO_CACHE ───────────────▶ fingerprint-agent (cache UTM)
|
|
632
|
+
│ localization-agent (cache moedas)
|
|
633
|
+
│
|
|
634
|
+
├── env.AUDIT_LOGS ──────────────▶ compliance-agent (LGPD audit trail)
|
|
635
|
+
│ security-enterprise-agent (eventos suspeitos)
|
|
636
|
+
│
|
|
637
|
+
└── Cron Triggers ───────────────▶ intelligence-agent (health check semanal)
|
|
638
|
+
performance-agent (limpeza mensal de logs)
|
|
639
|
+
```
|
|
640
|
+
|
|
641
|
+
---
|
|
642
|
+
|
|
643
|
+
## 🛠️ COMANDOS DE OPERAÇÃO
|
|
644
|
+
|
|
645
|
+
```bash
|
|
646
|
+
# Status do banco
|
|
647
|
+
wrangler d1 list
|
|
648
|
+
wrangler d1 info cdp-edge-db
|
|
649
|
+
|
|
650
|
+
# Query direta
|
|
651
|
+
wrangler d1 execute cdp-edge-db --remote --command "SELECT COUNT(*) FROM leads;"
|
|
652
|
+
|
|
653
|
+
# Aplicar migração
|
|
654
|
+
wrangler d1 execute cdp-edge-db --remote --file=server-edge-tracker/migrate-v6.sql
|
|
655
|
+
|
|
656
|
+
# Backup
|
|
657
|
+
wrangler d1 export cdp-edge-db --remote --output=backup-$(date +%Y%m%d).sql
|
|
658
|
+
|
|
659
|
+
# Verificar secrets ativos
|
|
660
|
+
wrangler secret list
|
|
661
|
+
|
|
662
|
+
# Redeploy após mudança de binding
|
|
663
|
+
wrangler deploy
|
|
664
|
+
|
|
665
|
+
# Ver logs do Worker em tempo real
|
|
666
|
+
wrangler tail server-edge-tracker
|
|
667
|
+
```
|