cdp-edge 1.2.2 → 1.4.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 +153 -306
- package/bin/cdp-edge.js +71 -61
- package/contracts/agent-versions.json +682 -0
- package/contracts/api-versions.json +372 -368
- package/contracts/types.ts +81 -0
- package/dist/commands/analyze.js +52 -52
- package/dist/commands/infra.js +54 -54
- package/dist/commands/install.js +26 -3
- package/dist/commands/server.js +174 -174
- package/dist/commands/setup.js +332 -100
- package/dist/commands/validate.js +248 -84
- package/dist/index.js +12 -12
- package/dist/sdk/cdpTrack.js +2095 -0
- package/dist/sdk/cdpTrack.min.js +64 -0
- package/dist/sdk/install-snippet.html +10 -0
- package/docs/whatsapp-ctwa.md +5 -4
- package/extracted-skill/tracking-events-generator/INTEGRACAO-COMPLETA.md +89 -0
- package/extracted-skill/tracking-events-generator/MELHORIAS-IMPLEMENTADAS.md +101 -0
- package/extracted-skill/tracking-events-generator/advanced-matching.js +364 -364
- package/extracted-skill/tracking-events-generator/agents/ab-ltv-agent.md +196 -0
- package/extracted-skill/tracking-events-generator/agents/ab-testing-agent.md +1 -1
- package/extracted-skill/tracking-events-generator/agents/attribution-agent.md +41 -41
- package/extracted-skill/tracking-events-generator/agents/bidding-agent.md +347 -0
- package/extracted-skill/tracking-events-generator/agents/bing-agent.md +40 -50
- package/extracted-skill/tracking-events-generator/agents/browser-tracking.md +174 -74
- package/extracted-skill/tracking-events-generator/agents/code-guardian-agent.md +1 -1
- package/extracted-skill/tracking-events-generator/agents/compliance-agent.md +25 -5
- package/extracted-skill/tracking-events-generator/agents/dashboard-agent.md +10 -10
- package/extracted-skill/tracking-events-generator/agents/database-agent.md +43 -42
- package/extracted-skill/tracking-events-generator/agents/debug-agent.md +22 -22
- package/extracted-skill/tracking-events-generator/agents/devops-agent.md +232 -0
- package/extracted-skill/tracking-events-generator/agents/domain-setup-agent.md +23 -9
- package/extracted-skill/tracking-events-generator/agents/email-agent.md +28 -1
- package/extracted-skill/tracking-events-generator/agents/evo-crm-agent.md +253 -0
- package/extracted-skill/tracking-events-generator/agents/fingerprint-agent.md +206 -1
- package/extracted-skill/tracking-events-generator/agents/fraud-detection-agent.md +143 -0
- package/extracted-skill/tracking-events-generator/agents/google-agent.md +128 -2
- package/extracted-skill/tracking-events-generator/agents/intelligence-agent.md +191 -31
- package/extracted-skill/tracking-events-generator/agents/lead-scoring-agent.md +282 -0
- package/extracted-skill/tracking-events-generator/agents/linkedin-agent.md +145 -34
- package/extracted-skill/tracking-events-generator/agents/localization-agent.md +1 -1
- package/extracted-skill/tracking-events-generator/agents/ltv-predictor-agent.md +24 -5
- package/extracted-skill/tracking-events-generator/agents/master-feedback-loop.md +81 -21
- package/extracted-skill/tracking-events-generator/agents/master-orchestrator.md +588 -93
- package/extracted-skill/tracking-events-generator/agents/match-quality-agent.md +304 -0
- package/extracted-skill/tracking-events-generator/agents/memory-agent.md +190 -15
- package/extracted-skill/tracking-events-generator/agents/meta-agent.md +10 -2
- package/extracted-skill/tracking-events-generator/agents/ml-clustering-agent.md +769 -0
- package/extracted-skill/tracking-events-generator/agents/page-analyzer.md +21 -4
- package/extracted-skill/tracking-events-generator/agents/performance-agent.md +41 -31
- package/extracted-skill/tracking-events-generator/agents/performance-optimization-agent.md +18 -8
- package/extracted-skill/tracking-events-generator/agents/pinterest-agent.md +14 -6
- package/extracted-skill/tracking-events-generator/agents/premium-tracking-intelligence-agent.md +7 -7
- package/extracted-skill/tracking-events-generator/agents/r2-setup-agent.md +16 -8
- package/extracted-skill/tracking-events-generator/agents/reddit-agent.md +15 -7
- package/extracted-skill/tracking-events-generator/agents/security-enterprise-agent.md +157 -48
- package/extracted-skill/tracking-events-generator/agents/server-tracking.md +35 -35
- package/extracted-skill/tracking-events-generator/agents/spotify-agent.md +15 -7
- package/extracted-skill/tracking-events-generator/agents/tiktok-agent.md +73 -2
- package/extracted-skill/tracking-events-generator/agents/tracking-plan-agent.md +104 -9
- package/extracted-skill/tracking-events-generator/agents/utm-agent.md +322 -0
- package/extracted-skill/tracking-events-generator/agents/validator-agent.md +13 -9
- package/extracted-skill/tracking-events-generator/agents/webhook-agent.md +112 -4
- package/extracted-skill/tracking-events-generator/agents/whatsapp-agent.md +58 -5
- package/extracted-skill/tracking-events-generator/agents/whatsapp-ctwa-setup-agent.md +26 -18
- package/extracted-skill/tracking-events-generator/agents/youtube-agent.md +152 -37
- package/extracted-skill/tracking-events-generator/anti-blocking.js +285 -285
- package/extracted-skill/tracking-events-generator/cdpTrack.js +642 -641
- package/extracted-skill/tracking-events-generator/contracts/api-versions.json +14 -10
- package/extracted-skill/tracking-events-generator/engagement-scoring.js +226 -226
- package/extracted-skill/tracking-events-generator/evals/evals.json +235 -235
- package/extracted-skill/tracking-events-generator/integration-test.js +497 -497
- package/extracted-skill/tracking-events-generator/knowledge-base.md +172 -0
- package/extracted-skill/tracking-events-generator/micro-events.js +992 -992
- package/extracted-skill/tracking-events-generator/models/lancamento-imobiliario.md +344 -0
- package/extracted-skill/tracking-events-generator/models/pinterest/conversions-api-template.js +144 -144
- package/extracted-skill/tracking-events-generator/models/pinterest/event-mappings.json +48 -48
- package/extracted-skill/tracking-events-generator/models/pinterest/tag-template.js +28 -28
- package/extracted-skill/tracking-events-generator/models/quiz-funnel.md +83 -19
- package/extracted-skill/tracking-events-generator/models/reddit/conversions-api-template.js +205 -205
- package/extracted-skill/tracking-events-generator/models/reddit/event-mappings.json +56 -56
- package/extracted-skill/tracking-events-generator/models/reddit/pixel-template.js +19 -19
- package/extracted-skill/tracking-events-generator/models/scenarios/behavior-engine.js +425 -425
- package/extracted-skill/tracking-events-generator/route-intent-capture.js +222 -0
- package/extracted-skill/tracking-events-generator/tracking.config.js +3 -3
- package/package.json +89 -75
- package/scripts/build-sdk.js +106 -0
- package/server-edge-tracker/.client.env.example +14 -0
- package/server-edge-tracker/INSTALAR.md +222 -23
- package/server-edge-tracker/SEGMENTATION-DOCS.md +513 -0
- package/server-edge-tracker/config/utm-mapping.json +64 -0
- package/server-edge-tracker/deploy-client.cjs +76 -0
- package/server-edge-tracker/index.ts +1230 -0
- package/server-edge-tracker/migrate-v7.sql +64 -0
- package/server-edge-tracker/modules/db.ts +710 -0
- package/server-edge-tracker/modules/dispatch/crm.ts +382 -0
- package/server-edge-tracker/modules/dispatch/ga4.ts +72 -0
- package/server-edge-tracker/modules/dispatch/meta.ts +143 -0
- package/server-edge-tracker/modules/dispatch/platforms.ts +255 -0
- package/server-edge-tracker/modules/dispatch/tiktok.ts +107 -0
- package/server-edge-tracker/modules/dispatch/whatsapp.ts +296 -0
- package/server-edge-tracker/modules/intelligence.ts +589 -0
- package/server-edge-tracker/modules/ml/bidding.ts +247 -0
- package/server-edge-tracker/modules/ml/fraud.ts +302 -0
- package/server-edge-tracker/modules/ml/logistic.ts +226 -0
- package/server-edge-tracker/modules/ml/ltv.ts +531 -0
- package/server-edge-tracker/modules/ml/matchquality.ts +232 -0
- package/server-edge-tracker/modules/ml/quiz.ts +343 -0
- package/server-edge-tracker/modules/ml/roas.ts +255 -0
- package/server-edge-tracker/modules/ml/segmentation.ts +407 -0
- package/server-edge-tracker/modules/nurture.ts +257 -0
- package/server-edge-tracker/modules/utils.ts +311 -0
- package/server-edge-tracker/modules/utm/utm-enricher.ts +231 -0
- package/server-edge-tracker/schema-ab-ltv.sql +97 -0
- package/server-edge-tracker/schema-bidding.sql +86 -0
- package/server-edge-tracker/schema-fraud.sql +90 -0
- package/server-edge-tracker/schema-indexes.sql +67 -0
- package/server-edge-tracker/schema-ltv-feedback.sql +11 -0
- package/server-edge-tracker/schema-quiz.sql +52 -0
- package/server-edge-tracker/schema-sales-engine.sql +113 -0
- package/server-edge-tracker/schema-segmentation.sql +219 -0
- package/server-edge-tracker/schema-utm.sql +82 -0
- package/server-edge-tracker/schema.sql +281 -265
- package/server-edge-tracker/types.ts +275 -0
- package/server-edge-tracker/wrangler.toml +140 -85
- package/templates/lancamento-imobiliario.md +344 -0
- package/templates/multi-step-checkout.md +3 -4
- package/templates/pinterest/conversions-api-template.js +144 -144
- package/templates/pinterest/event-mappings.json +48 -48
- package/templates/pinterest/tag-template.js +28 -28
- package/templates/quiz-funnel.md +83 -19
- package/templates/reddit/conversions-api-template.js +205 -205
- package/templates/reddit/event-mappings.json +56 -56
- package/templates/reddit/pixel-template.js +12 -39
- package/templates/scenarios/behavior-engine.js +45 -22
- package/docs/PixelBuilder-Documentacao-Completa (2).docx +0 -0
- package/docs/installation.md +0 -155
- package/docs/quick-start.md +0 -185
- package/extracted-skill/tracking-events-generator/agents/crm-integration-agent.md +0 -1419
- package/extracted-skill/tracking-events-generator/agents/intelligence-scheduling.md +0 -643
- package/server-edge-tracker/worker.js +0 -2574
|
@@ -33,7 +33,7 @@ Database: Cloudflare D1 (Persistência)
|
|
|
33
33
|
## 📊 FUNCIONALIDADES DO SDK
|
|
34
34
|
|
|
35
35
|
### 1. Direct Fetch
|
|
36
|
-
O rastreamento utiliza chamadas diretas via `fetch()` para o endpoint `/
|
|
36
|
+
O rastreamento utiliza chamadas diretas via `fetch()` para o endpoint `/track` no mesmo domínio.
|
|
37
37
|
|
|
38
38
|
### 2. Deduplicação
|
|
39
39
|
Gera um `event_id` único para cada evento disparado no browser para que o Worker possa bater com a CAPI.
|
|
@@ -109,99 +109,199 @@ Implementado via `anti-blocking.js`:
|
|
|
109
109
|
|
|
110
110
|
## 💻 EXEMPLO DE CÓDIGO GERADO
|
|
111
111
|
|
|
112
|
-
### `cdpTrack.js` (SDK Principal)
|
|
112
|
+
### `cdpTrack.js` (SDK Principal — Padrão Multi-Plataforma)
|
|
113
|
+
|
|
114
|
+
> Este é o padrão canônico do cdpTrack SDK para Meta, TikTok e GA4.
|
|
115
|
+
> Cada agente de plataforma injeta seus eventos neste SDK via Browser Tracking Agent.
|
|
113
116
|
|
|
114
117
|
```javascript
|
|
115
118
|
/**
|
|
116
119
|
* cdpTrack SDK - CDP Edge Quantum Tier
|
|
117
120
|
* Browser Tracking SDK Principal
|
|
121
|
+
* Suporta: Meta Pixel, TikTok Pixel, GA4, Pinterest Tag, Reddit Pixel, Spotify Pixel
|
|
118
122
|
*/
|
|
119
123
|
|
|
120
|
-
(function(w
|
|
121
|
-
|
|
122
|
-
w._pbq.push = w._pbq.push || [];
|
|
123
|
-
w._spotify = w._spotify || {};
|
|
124
|
-
|
|
125
|
-
// Carregar configuração
|
|
126
|
-
const config = window.cdpTrack?.config || {};
|
|
124
|
+
(function(w) {
|
|
125
|
+
'use strict';
|
|
127
126
|
|
|
128
|
-
//
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
127
|
+
// ──────────────────────────────────────────────
|
|
128
|
+
// CORE: Geração de event_id único (deduplicação)
|
|
129
|
+
// O mesmo event_id deve ser usado no browser E no servidor (CAPI)
|
|
130
|
+
// ──────────────────────────────────────────────
|
|
131
|
+
function generateEventId() {
|
|
132
|
+
return 'evt_' + Date.now() + '_' + Math.random().toString(36).substring(2, 11);
|
|
132
133
|
}
|
|
133
134
|
|
|
134
|
-
//
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
135
|
+
// ──────────────────────────────────────────────
|
|
136
|
+
// CORE: Envio para Cloudflare Worker (same-domain)
|
|
137
|
+
// Usa /track no mesmo domínio — imune a ad-blockers
|
|
138
|
+
// ──────────────────────────────────────────────
|
|
139
|
+
async function sendToWorker(eventName, payload) {
|
|
140
|
+
const eventId = generateEventId();
|
|
141
|
+
|
|
142
|
+
const body = {
|
|
143
|
+
event: eventName,
|
|
144
|
+
event_id: eventId, // CRÍTICO: mesmo ID usado nas CAPIs
|
|
145
|
+
url: window.location.href,
|
|
146
|
+
referrer: document.referrer,
|
|
147
|
+
timestamp: Date.now(),
|
|
148
|
+
...payload
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
try {
|
|
152
|
+
// Tentativa primária: fetch
|
|
153
|
+
await fetch('/track', {
|
|
154
|
+
method: 'POST',
|
|
155
|
+
headers: { 'Content-Type': 'application/json' },
|
|
156
|
+
body: JSON.stringify(body),
|
|
157
|
+
keepalive: true
|
|
152
158
|
});
|
|
159
|
+
} catch (_) {
|
|
160
|
+
// Fallback: Beacon API (funciona mesmo no unload da página)
|
|
161
|
+
navigator.sendBeacon('/track', JSON.stringify(body));
|
|
153
162
|
}
|
|
154
|
-
};
|
|
155
163
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
w._spotify.trackEvent('ViewContent', {
|
|
159
|
-
content_name: contentName,
|
|
160
|
-
content_id: contentId,
|
|
161
|
-
...params
|
|
162
|
-
});
|
|
163
|
-
};
|
|
164
|
+
return eventId;
|
|
165
|
+
}
|
|
164
166
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
};
|
|
167
|
+
// ──────────────────────────────────────────────
|
|
168
|
+
// CORE: Captura de cookies first-party
|
|
169
|
+
// ──────────────────────────────────────────────
|
|
170
|
+
function getCookie(name) {
|
|
171
|
+
const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));
|
|
172
|
+
return match ? decodeURIComponent(match[2]) : null;
|
|
173
|
+
}
|
|
173
174
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
175
|
+
// ──────────────────────────────────────────────
|
|
176
|
+
// CORE: Captura de click IDs da URL (Meta, TikTok, Google)
|
|
177
|
+
// ──────────────────────────────────────────────
|
|
178
|
+
function getClickIds() {
|
|
179
|
+
const params = new URLSearchParams(window.location.search);
|
|
180
|
+
return {
|
|
181
|
+
fbclid: params.get('fbclid') || getCookie('fbclid') || null,
|
|
182
|
+
ttclid: params.get('ttclid') || getCookie('ttclid') || null,
|
|
183
|
+
gclid: params.get('gclid') || null,
|
|
184
|
+
gbraid: params.get('gbraid') || null,
|
|
185
|
+
wbraid: params.get('wbraid') || null,
|
|
186
|
+
fbp: getCookie('_fbp') || null,
|
|
187
|
+
fbc: getCookie('_fbc') || null,
|
|
188
|
+
ttp: getCookie('_ttp') || null,
|
|
189
|
+
uid: getCookie('_cdp_uid') || null // Identity Graph first-party cookie
|
|
190
|
+
};
|
|
191
|
+
}
|
|
183
192
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
193
|
+
// ──────────────────────────────────────────────
|
|
194
|
+
// API PÚBLICA
|
|
195
|
+
// ──────────────────────────────────────────────
|
|
196
|
+
const cdpTrack = {
|
|
197
|
+
generateEventId,
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Rastrear evento genérico — enviado para o Worker
|
|
201
|
+
* O Worker despacha para Meta CAPI, GA4 MP, TikTok Events API etc.
|
|
202
|
+
*
|
|
203
|
+
* @param {string} eventName - Nome do evento (ex: 'Lead', 'Purchase', 'PageView')
|
|
204
|
+
* @param {Object} params - Parâmetros adicionais do evento
|
|
205
|
+
*/
|
|
206
|
+
track(eventName, params = {}) {
|
|
207
|
+
const clickIds = getClickIds();
|
|
208
|
+
return sendToWorker(eventName, { ...clickIds, ...params });
|
|
209
|
+
},
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Rastrear Lead (captura de formulário)
|
|
213
|
+
* Enviar dados PII crus — o Worker faz SHA-256 no servidor
|
|
214
|
+
*/
|
|
215
|
+
trackLead(userData = {}) {
|
|
216
|
+
const clickIds = getClickIds();
|
|
217
|
+
return sendToWorker('Lead', {
|
|
218
|
+
...clickIds,
|
|
219
|
+
email: userData.email || null, // Worker aplica SHA-256
|
|
220
|
+
phone: userData.phone || null, // Worker aplica E.164 + SHA-256
|
|
221
|
+
first_name: userData.first_name || null,
|
|
222
|
+
last_name: userData.last_name || null,
|
|
223
|
+
city: userData.city || null,
|
|
224
|
+
state: userData.state || null,
|
|
225
|
+
zip: userData.zip || null,
|
|
226
|
+
country: userData.country || 'BR'
|
|
227
|
+
});
|
|
228
|
+
},
|
|
192
229
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
230
|
+
/**
|
|
231
|
+
* Rastrear Purchase (confirmação de compra)
|
|
232
|
+
*/
|
|
233
|
+
trackPurchase(orderData = {}) {
|
|
234
|
+
const clickIds = getClickIds();
|
|
235
|
+
return sendToWorker('Purchase', {
|
|
236
|
+
...clickIds,
|
|
237
|
+
value: orderData.value || 0,
|
|
238
|
+
currency: orderData.currency || 'BRL',
|
|
239
|
+
order_id: orderData.order_id || null,
|
|
240
|
+
content_name: orderData.product || null
|
|
241
|
+
});
|
|
242
|
+
},
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Rastrear PageView — chamar no load da página
|
|
246
|
+
*/
|
|
247
|
+
trackPageView() {
|
|
248
|
+
const clickIds = getClickIds();
|
|
249
|
+
return sendToWorker('PageView', { ...clickIds });
|
|
250
|
+
},
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Rastrear InitiateCheckout
|
|
254
|
+
*/
|
|
255
|
+
trackInitiateCheckout(checkoutData = {}) {
|
|
256
|
+
const clickIds = getClickIds();
|
|
257
|
+
return sendToWorker('InitiateCheckout', {
|
|
258
|
+
...clickIds,
|
|
259
|
+
value: checkoutData.value || 0,
|
|
260
|
+
currency: checkoutData.currency || 'BRL'
|
|
261
|
+
});
|
|
262
|
+
}
|
|
200
263
|
};
|
|
201
264
|
|
|
202
|
-
|
|
265
|
+
// Expor no window
|
|
266
|
+
w.cdpTrack = cdpTrack;
|
|
267
|
+
|
|
268
|
+
// Auto page_view no load
|
|
269
|
+
if (document.readyState === 'loading') {
|
|
270
|
+
document.addEventListener('DOMContentLoaded', () => cdpTrack.trackPageView());
|
|
271
|
+
} else {
|
|
272
|
+
cdpTrack.trackPageView();
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
})(window);
|
|
203
276
|
```
|
|
204
277
|
|
|
278
|
+
### Uso típico no HTML do cliente
|
|
279
|
+
|
|
280
|
+
```html
|
|
281
|
+
<!-- 1. Carregar o SDK -->
|
|
282
|
+
<script src="/tracking/cdpTrack.js"></script>
|
|
283
|
+
|
|
284
|
+
<!-- 2. Rastrear lead ao submeter formulário -->
|
|
285
|
+
<script>
|
|
286
|
+
document.getElementById('lead-form').addEventListener('submit', function(e) {
|
|
287
|
+
cdpTrack.trackLead({
|
|
288
|
+
email: document.getElementById('email').value,
|
|
289
|
+
phone: document.getElementById('phone').value,
|
|
290
|
+
first_name: document.getElementById('name').value
|
|
291
|
+
});
|
|
292
|
+
});
|
|
293
|
+
</script>
|
|
294
|
+
|
|
295
|
+
<!-- 3. Rastrear checkout (botão de compra) -->
|
|
296
|
+
<script>
|
|
297
|
+
document.getElementById('buy-btn').addEventListener('click', function() {
|
|
298
|
+
cdpTrack.trackInitiateCheckout({ value: 97.00, currency: 'BRL' });
|
|
299
|
+
});
|
|
300
|
+
</script>
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
> **Nota:** O Worker recebe os dados crus, aplica SHA-256, e despacha para Meta CAPI v22.0, GA4 MP, TikTok Events API v1.3 e demais plataformas configuradas — tudo em paralelo via `Promise.allSettled`.
|
|
304
|
+
|
|
205
305
|
---
|
|
206
306
|
|
|
207
307
|
## 🔧 INTEGRAÇÃO COM OUTROS AGENTES
|
|
@@ -211,7 +311,7 @@ Implementado via `anti-blocking.js`:
|
|
|
211
311
|
| Depende de | Input Esperado | O que faz com isso |
|
|
212
312
|
|-------------|----------------|------------------|
|
|
213
313
|
| **Page Analyzer** | Lista de elementos HTML | Mapeia `content_name` e `content_id` |
|
|
214
|
-
| **Server Tracking Agent** | Lista de plataformas | Adiciona endpoint Spotify `/
|
|
314
|
+
| **Server Tracking Agent** | Lista de plataformas | Adiciona endpoint Spotify `/webhook/spotify` |
|
|
215
315
|
| **Premium Tracking Intelligence** | Estratégia de tracking | Define eventos prioritários para Spotify |
|
|
216
316
|
| **Validator Agent** | Código gerado | Valida conformidade com Spotify API v1 |
|
|
217
317
|
|
|
@@ -137,7 +137,7 @@ Regras que nunca podem ser violadas, independente do contexto:
|
|
|
137
137
|
## ESCOPO
|
|
138
138
|
|
|
139
139
|
Este agente monitora:
|
|
140
|
-
- `server-edge-tracker/
|
|
140
|
+
- `server-edge-tracker/index.ts` — código crítico de produção
|
|
141
141
|
- `extracted-skill/tracking-events-generator/cdpTrack.js` — SDK browser
|
|
142
142
|
- `extracted-skill/tracking-events-generator/agents/*.md` — definições de agentes
|
|
143
143
|
- `server-edge-tracker/wrangler.toml` — configuração de infraestrutura
|
|
@@ -183,7 +183,7 @@ CREATE INDEX IF NOT EXISTS idx_consent_policy_version
|
|
|
183
183
|
|
|
184
184
|
### Consent Collection & Storage
|
|
185
185
|
|
|
186
|
-
```
|
|
186
|
+
```typescript
|
|
187
187
|
/**
|
|
188
188
|
* Consent Manager
|
|
189
189
|
* Manages user consent collection, storage, and tracking
|
|
@@ -559,7 +559,7 @@ let consentManager = null;
|
|
|
559
559
|
|
|
560
560
|
### GDPR/LGPD/CCPA Data Rights Implementation
|
|
561
561
|
|
|
562
|
-
```
|
|
562
|
+
```typescript
|
|
563
563
|
/**
|
|
564
564
|
* Data Rights Manager
|
|
565
565
|
* Handles GDPR/LGPD/CCPA data rights: access, deletion, portability, rectification
|
|
@@ -1110,7 +1110,7 @@ let dataRightsManager = null;
|
|
|
1110
1110
|
|
|
1111
1111
|
### Automated Data Retention Policies
|
|
1112
1112
|
|
|
1113
|
-
```
|
|
1113
|
+
```typescript
|
|
1114
1114
|
/**
|
|
1115
1115
|
* Data Retention Manager
|
|
1116
1116
|
* Manages automated data retention and deletion policies
|
|
@@ -1381,7 +1381,7 @@ let dataRetentionManager = null;
|
|
|
1381
1381
|
|
|
1382
1382
|
### Comprehensive Audit Logging
|
|
1383
1383
|
|
|
1384
|
-
```
|
|
1384
|
+
```typescript
|
|
1385
1385
|
/**
|
|
1386
1386
|
* Compliance Audit Logger
|
|
1387
1387
|
* Records all compliance-related activities for audit purposes
|
|
@@ -1533,7 +1533,7 @@ let complianceAuditLogger = null;
|
|
|
1533
1533
|
|
|
1534
1534
|
### Compliance Management Endpoints
|
|
1535
1535
|
|
|
1536
|
-
```
|
|
1536
|
+
```typescript
|
|
1537
1537
|
/**
|
|
1538
1538
|
* Compliance Management Endpoints
|
|
1539
1539
|
*/
|
|
@@ -2044,6 +2044,26 @@ async function handleGetCurrentPolicy(request, env) {
|
|
|
2044
2044
|
- **security-enterprise-agent.md**: Usa encryption de PII para LGPD/GDPR
|
|
2045
2045
|
- **attribution-agent.md**: Respeita consentimento para analytics e marketing
|
|
2046
2046
|
- **master-orchestrator.md**: Implementa middleware de consentimento antes de tracking
|
|
2047
|
+
- **validator-agent.md**: O Compliance Agent DEVE ser consultado pelo Validator Agent para verificar conformidade de PII. Fluxo:
|
|
2048
|
+
|
|
2049
|
+
```
|
|
2050
|
+
validator-agent (auditoria do código gerado)
|
|
2051
|
+
└─► checkComplianceCompliance(generatedCode)
|
|
2052
|
+
├─ Verificar: SHA-256 aplicado em todos os campos PII (em, ph, fn, ln)?
|
|
2053
|
+
├─ Verificar: Google Consent Mode v2 implementado (ad_storage, analytics_storage)?
|
|
2054
|
+
├─ Verificar: url_passthrough: true ativo?
|
|
2055
|
+
├─ Verificar: PII nunca logada em plaintext?
|
|
2056
|
+
└─ Verificar: opt-in explícito antes de tracking de marketing?
|
|
2057
|
+
|
|
2058
|
+
// No validator-agent, chamar:
|
|
2059
|
+
const complianceCheck = await validateComplianceRequirements(generatedBrowserCode, generatedWorkerCode);
|
|
2060
|
+
if (!complianceCheck.passed) {
|
|
2061
|
+
// Bloquear entrega e reportar issues ao Master Orchestrator
|
|
2062
|
+
return { status: 'BLOCKED', issues: complianceCheck.issues };
|
|
2063
|
+
}
|
|
2064
|
+
```
|
|
2065
|
+
|
|
2066
|
+
- **google-agent.md**: Consent Mode v2 gerado por este agente valida conformidade detectada pelo Compliance Agent
|
|
2047
2067
|
|
|
2048
2068
|
---
|
|
2049
2069
|
|
|
@@ -94,18 +94,18 @@ Definir o Dashboard como um **Centro de Comando de Dados** que equilibra:
|
|
|
94
94
|
- Dados de evento: 15 minutos
|
|
95
95
|
|
|
96
96
|
**Implementação:**
|
|
97
|
-
```
|
|
97
|
+
```typescript
|
|
98
98
|
// Carregar dados do cache
|
|
99
|
-
const fetchMetrics = async (forceRefresh = false) => {
|
|
99
|
+
const fetchMetrics = async (env, forceRefresh = false) => {
|
|
100
100
|
const cacheKey = 'dashboard_metrics';
|
|
101
|
-
const cached = await
|
|
101
|
+
const cached = await env.GEO_CACHE.get(cacheKey);
|
|
102
102
|
|
|
103
103
|
if (cached && !forceRefresh) {
|
|
104
104
|
return JSON.parse(cached);
|
|
105
105
|
}
|
|
106
106
|
|
|
107
107
|
// Cache miss ou refresh forçado — consultar D1
|
|
108
|
-
const metrics = await DB.prepare(`
|
|
108
|
+
const metrics = await env.DB.prepare(`
|
|
109
109
|
SELECT
|
|
110
110
|
AVG(heat_score) as avg_heat,
|
|
111
111
|
COUNT(DISTINCT fingerprint) as total_users,
|
|
@@ -115,7 +115,7 @@ const fetchMetrics = async (forceRefresh = false) => {
|
|
|
115
115
|
`).all();
|
|
116
116
|
|
|
117
117
|
// Salvar no KV com TTL de 1 hora
|
|
118
|
-
await
|
|
118
|
+
await env.GEO_CACHE.put(cacheKey, JSON.stringify(metrics), { expirationTtl: 3600 });
|
|
119
119
|
|
|
120
120
|
return metrics;
|
|
121
121
|
};
|
|
@@ -129,7 +129,7 @@ const fetchMetrics = async (forceRefresh = false) => {
|
|
|
129
129
|
- Desativação manual ou timeout de inatividade
|
|
130
130
|
|
|
131
131
|
**Implementação:**
|
|
132
|
-
```
|
|
132
|
+
```typescript
|
|
133
133
|
const useRealTime = async () => {
|
|
134
134
|
// WebSockets ou Server-Sent Events (SSE)
|
|
135
135
|
const eventSource = new EventSource('/api/metrics/stream');
|
|
@@ -187,7 +187,7 @@ Invalidação:
|
|
|
187
187
|
|
|
188
188
|
### Para Cloudflare Worker
|
|
189
189
|
|
|
190
|
-
```
|
|
190
|
+
```typescript
|
|
191
191
|
// ENDPOINTS DE CONSULTA (otimizados)
|
|
192
192
|
export const DASHBOARD_API = {
|
|
193
193
|
// Métricas globais (cache no KV)
|
|
@@ -217,13 +217,13 @@ export const DASHBOARD_API = {
|
|
|
217
217
|
};
|
|
218
218
|
|
|
219
219
|
// HANDLER DE SINCronizaÇÃO (atualização de cache)
|
|
220
|
-
export async function invalidateCache(domain, pattern) {
|
|
220
|
+
export async function invalidateCache(domain, pattern, env) {
|
|
221
221
|
const deletePattern = `${domain}:${pattern}`;
|
|
222
222
|
|
|
223
223
|
// Deletar do KV
|
|
224
|
-
const keys = await
|
|
224
|
+
const keys = await env.GEO_CACHE.list({ prefix: deletePattern });
|
|
225
225
|
for (const key of keys.keys) {
|
|
226
|
-
await
|
|
226
|
+
await env.GEO_CACHE.delete(key);
|
|
227
227
|
}
|
|
228
228
|
|
|
229
229
|
// Retornar contagem
|
|
@@ -6,6 +6,14 @@ Enquanto o `server-tracking-agent` define **o que o Worker FAZ**, você define *
|
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
+
## ✅ REGRAS CRÍTICAS
|
|
10
|
+
|
|
11
|
+
0. **CONSULTA OBRIGATÓRIA À MEMÓRIA**: Extraia os IDs de Recursos Cloudflare (`D1_DATABASE_ID`, `KV_ID`, `R2_BUCKET_NAME`, `ZONE_ID`) e configurações de bindings consultando ativamente o "memory-agent.json". Solicite ao Orquestrador tudo o que faltar. Execute configurações de infraestrutura exclusivamente com os dados oficiais guardados na Memória para garantir alinhamento sistêmico.
|
|
12
|
+
1. Cloudflare-Only: Sem dependências externas.
|
|
13
|
+
2. Same-Domain: Worker no domínio do site (anti-adblock).
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
9
17
|
## 🏛️ RESPONSABILIDADES EXCLUSIVAS
|
|
10
18
|
|
|
11
19
|
| Domínio | Você é dono de |
|
|
@@ -27,16 +35,16 @@ Enquanto o `server-tracking-agent` define **o que o Worker FAZ**, você define *
|
|
|
27
35
|
### Worker Ativo
|
|
28
36
|
```
|
|
29
37
|
Nome: server-edge-tracker
|
|
30
|
-
URL: https://
|
|
31
|
-
Account:
|
|
32
|
-
ID:
|
|
33
|
-
Deploy:
|
|
38
|
+
URL: https://SEU_WORKER.SEU_USUARIO.workers.dev
|
|
39
|
+
Account: SEU_EMAIL@SEUDOMINIO.com.br
|
|
40
|
+
ID: SEU_CLOUDFLARE_ACCOUNT_ID
|
|
41
|
+
Deploy: (data do último deploy)
|
|
34
42
|
```
|
|
35
43
|
|
|
36
44
|
### `wrangler.toml` — Estado Real
|
|
37
45
|
```toml
|
|
38
46
|
name = "server-edge-tracker"
|
|
39
|
-
main = "
|
|
47
|
+
main = "index.ts"
|
|
40
48
|
compatibility_date = "2025-01-01"
|
|
41
49
|
compatibility_flags = ["nodejs_compat"]
|
|
42
50
|
|
|
@@ -45,13 +53,13 @@ compatibility_flags = ["nodejs_compat"]
|
|
|
45
53
|
META_PIXEL_ID = "SEU_PIXEL_ID"
|
|
46
54
|
GA4_MEASUREMENT_ID = "G-XXXXXXXXXX"
|
|
47
55
|
TIKTOK_PIXEL_ID = "CXXXXXXXXXXXXXXX"
|
|
48
|
-
SITE_DOMAIN = "
|
|
56
|
+
SITE_DOMAIN = "SEU_DOMINIO"
|
|
49
57
|
|
|
50
58
|
# ── D1 Database ───────────────────────────────────────────────────────────────
|
|
51
59
|
[[d1_databases]]
|
|
52
60
|
binding = "DB"
|
|
53
61
|
database_name = "cdp-edge-db"
|
|
54
|
-
database_id = "
|
|
62
|
+
database_id = "SEU_D1_DATABASE_ID"
|
|
55
63
|
|
|
56
64
|
# ── Workers AI ────────────────────────────────────────────────────────────────
|
|
57
65
|
[ai]
|
|
@@ -67,10 +75,10 @@ crons = ["0 2 * * 7", "0 3 1 * *"]
|
|
|
67
75
|
## 🗄️ BINDING 1 — D1 DATABASE (`env.DB`)
|
|
68
76
|
|
|
69
77
|
### Banco: `cdp-edge-db`
|
|
70
|
-
- **ID:** `
|
|
78
|
+
- **ID:** `SEU_D1_DATABASE_ID`
|
|
71
79
|
- **Região:** ENAM (US East)
|
|
72
80
|
- **Engine:** SQLite (Cloudflare D1)
|
|
73
|
-
- **Tabelas ativas:**
|
|
81
|
+
- **Tabelas ativas:** 31 (core: 13, migrate-v6: 1, migrate-v7: 2, Fases 1-4: 10, schema-ltv-feedback: +3 colunas, schema-utm: 1, schema-quiz: 1, schema-sales-engine: 3)
|
|
74
82
|
|
|
75
83
|
### Schema Completo (Produção)
|
|
76
84
|
|
|
@@ -251,7 +259,7 @@ CREATE INDEX IF NOT EXISTS idx_wa_ctwa_clid ON whatsapp_contacts(ctwa_clid);
|
|
|
251
259
|
CREATE INDEX IF NOT EXISTS idx_wa_created_at ON whatsapp_contacts(created_at);
|
|
252
260
|
```
|
|
253
261
|
> **Migration:** `migrate-v6.sql` — aplicar com `wrangler d1 execute cdp-edge-db --file=migrate-v6.sql --remote`
|
|
254
|
-
> **Tabelas ativas após v6:**
|
|
262
|
+
> **Tabelas ativas após v6:** 14 (core: 13 + whatsapp_contacts). Total final após todos os schemas: 31 tabelas.
|
|
255
263
|
|
|
256
264
|
---
|
|
257
265
|
|
|
@@ -272,7 +280,7 @@ CREATE TABLE intelligence_logs (
|
|
|
272
280
|
```
|
|
273
281
|
|
|
274
282
|
### Padrões de Acesso D1 no Worker
|
|
275
|
-
```
|
|
283
|
+
```typescript
|
|
276
284
|
// SELECT com bind (previne SQL injection)
|
|
277
285
|
const { results } = await env.DB
|
|
278
286
|
.prepare('SELECT * FROM leads WHERE email = ? ORDER BY created_at DESC LIMIT 1')
|
|
@@ -305,9 +313,9 @@ ctx.waitUntil(
|
|
|
305
313
|
|
|
306
314
|
---
|
|
307
315
|
|
|
308
|
-
## 📬 BINDING 2 — QUEUES (`env.
|
|
316
|
+
## 📬 BINDING 2 — QUEUES (`env.RETRY_QUEUE`) — ✅ Configurado
|
|
309
317
|
|
|
310
|
-
> **Status:**
|
|
318
|
+
> **Status:** Ativo em produção — `wrangler.toml` com `RETRY_QUEUE` binding e consumer configurados.
|
|
311
319
|
|
|
312
320
|
### Configuração no `wrangler.toml`
|
|
313
321
|
```toml
|
|
@@ -331,7 +339,7 @@ wrangler queues create cdp-edge-dlq
|
|
|
331
339
|
```
|
|
332
340
|
|
|
333
341
|
### Uso no Worker (Produtor)
|
|
334
|
-
```
|
|
342
|
+
```typescript
|
|
335
343
|
// Enfileirar evento com falha para retry
|
|
336
344
|
await env.RETRY_QUEUE.send({
|
|
337
345
|
platform: 'meta',
|
|
@@ -343,7 +351,7 @@ await env.RETRY_QUEUE.send({
|
|
|
343
351
|
```
|
|
344
352
|
|
|
345
353
|
### Handler do Consumidor
|
|
346
|
-
```
|
|
354
|
+
```typescript
|
|
347
355
|
export default {
|
|
348
356
|
async queue(batch, env) {
|
|
349
357
|
for (const msg of batch.messages) {
|
|
@@ -379,9 +387,9 @@ Queue Consumer (assíncrono)
|
|
|
379
387
|
|
|
380
388
|
---
|
|
381
389
|
|
|
382
|
-
## 🗂️ BINDING 3 — KV NAMESPACE (`env.GEO_CACHE`) —
|
|
390
|
+
## 🗂️ BINDING 3 — KV NAMESPACE (`env.GEO_CACHE`) — ✅ Configurado
|
|
383
391
|
|
|
384
|
-
> **Status:**
|
|
392
|
+
> **Status:** Ativo em produção — usado para geo cache, fraud blocklist, fraud velocity counters e A/B test cache.
|
|
385
393
|
|
|
386
394
|
### Configuração no `wrangler.toml`
|
|
387
395
|
```toml
|
|
@@ -398,7 +406,7 @@ wrangler kv namespace create GEO_CACHE
|
|
|
398
406
|
```
|
|
399
407
|
|
|
400
408
|
### Uso no Worker
|
|
401
|
-
```
|
|
409
|
+
```typescript
|
|
402
410
|
// Cache de geolocalização por IP (TTL: 1 hora)
|
|
403
411
|
const cacheKey = `geo:${clientIp}`;
|
|
404
412
|
let geoData = await env.GEO_CACHE.get(cacheKey, { type: 'json' });
|
|
@@ -440,7 +448,7 @@ wrangler r2 bucket create cdp-edge-logs
|
|
|
440
448
|
```
|
|
441
449
|
|
|
442
450
|
### Uso no Worker
|
|
443
|
-
```
|
|
451
|
+
```typescript
|
|
444
452
|
// Armazenar evento bruto para auditoria (LGPD)
|
|
445
453
|
const logKey = `events/${year}/${month}/${day}/${eventId}.json`;
|
|
446
454
|
await env.AUDIT_LOGS.put(logKey, JSON.stringify({
|
|
@@ -459,13 +467,14 @@ await env.AUDIT_LOGS.put(logKey, JSON.stringify({
|
|
|
459
467
|
|
|
460
468
|
### Modelo em Uso
|
|
461
469
|
```
|
|
462
|
-
@cf/
|
|
463
|
-
|
|
464
|
-
|
|
470
|
+
@cf/ibm-granite/granite-4.0-h-micro ← LTV Prediction + Naming de Clusters
|
|
471
|
+
@cf/baai/bge-m3 ← Embeddings para K-means vetorial (ML Clustering)
|
|
472
|
+
Custo Granite: ~20-35 neurônios/requisição (3x mais eficiente que Llama 3.1 8B)
|
|
473
|
+
Limite Free: 10.000 neurônios/dia (~350 predições/dia com Granite)
|
|
465
474
|
```
|
|
466
475
|
|
|
467
476
|
### Uso no Worker (LTV Prediction)
|
|
468
|
-
```
|
|
477
|
+
```typescript
|
|
469
478
|
async function predictLtv(leadData, env) {
|
|
470
479
|
if (!env.AI) return { ltv_class: 'unknown', ltv_value: 0 };
|
|
471
480
|
|
|
@@ -477,7 +486,7 @@ async function predictLtv(leadData, env) {
|
|
|
477
486
|
Responda apenas: {"class": "high|medium|low", "value": 0-1000}
|
|
478
487
|
`;
|
|
479
488
|
|
|
480
|
-
const response = await env.AI.run('@cf/
|
|
489
|
+
const response = await env.AI.run('@cf/ibm-granite/granite-4.0-h-micro', {
|
|
481
490
|
messages: [{ role: 'user', content: prompt }],
|
|
482
491
|
max_tokens: 50
|
|
483
492
|
});
|
|
@@ -501,7 +510,7 @@ async function predictLtv(leadData, env) {
|
|
|
501
510
|
| `0 3 1 * *` | Dia 1 03:00 | Intelligence Agent — auditoria mensal de erros |
|
|
502
511
|
|
|
503
512
|
### Handler no Worker
|
|
504
|
-
```
|
|
513
|
+
```typescript
|
|
505
514
|
export default {
|
|
506
515
|
async scheduled(event, env, ctx) {
|
|
507
516
|
ctx.waitUntil(runIntelligenceAgent(event.cron, env));
|
|
@@ -540,7 +549,7 @@ async function runIntelligenceAgent(cron, env) {
|
|
|
540
549
|
| `META_TEST_CODE` | ⚠️ Reconfigurar | Só testes | meta-agent |
|
|
541
550
|
| `META_AD_ACCOUNT_ID` | ⚠️ Reconfigurar | Customer Match | meta-agent |
|
|
542
551
|
| `META_AUDIENCE_ID` | ⚠️ Reconfigurar | Customer Match | meta-agent |
|
|
543
|
-
| `
|
|
552
|
+
| `WHATSAPP_ACCESS_TOKEN` | ⚠️ Reconfigurar | WhatsApp | whatsapp-agent |
|
|
544
553
|
| `WHATSAPP_PHONE_NUMBER_ID` | ⚠️ Reconfigurar | WhatsApp | whatsapp-agent |
|
|
545
554
|
| `RESEND_API_KEY` | ⚠️ Reconfigurar | Email | email-agent |
|
|
546
555
|
| `RESEND_FROM_EMAIL` | ⚠️ Reconfigurar | Email | email-agent |
|
|
@@ -552,7 +561,7 @@ async function runIntelligenceAgent(cron, env) {
|
|
|
552
561
|
wrangler secret put META_ACCESS_TOKEN
|
|
553
562
|
wrangler secret put GA4_API_SECRET
|
|
554
563
|
wrangler secret put TIKTOK_ACCESS_TOKEN
|
|
555
|
-
wrangler secret put
|
|
564
|
+
wrangler secret put WHATSAPP_ACCESS_TOKEN
|
|
556
565
|
wrangler secret put WHATSAPP_PHONE_NUMBER_ID
|
|
557
566
|
wrangler secret put RESEND_API_KEY
|
|
558
567
|
wrangler secret put RESEND_FROM_EMAIL
|
|
@@ -564,7 +573,7 @@ wrangler secret put RESEND_FROM_EMAIL
|
|
|
564
573
|
|
|
565
574
|
Todo I/O que não bloqueia a resposta ao browser **DEVE** usar `ctx.waitUntil`:
|
|
566
575
|
|
|
567
|
-
```
|
|
576
|
+
```typescript
|
|
568
577
|
export default {
|
|
569
578
|
async fetch(request, env, ctx) {
|
|
570
579
|
|
|
@@ -592,20 +601,12 @@ export default {
|
|
|
592
601
|
|
|
593
602
|
## 🗺️ ROADMAP DE INFRAESTRUTURA
|
|
594
603
|
|
|
595
|
-
### Fase Atual (✅ Implementado)
|
|
596
|
-
- D1 com
|
|
597
|
-
- Workers AI
|
|
598
|
-
- 2 Cron Triggers ativos
|
|
599
|
-
-
|
|
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
|
|
604
|
+
### Fase Atual (✅ Implementado — v2.5.1)
|
|
605
|
+
- D1 com 31 tabelas em produção (core + Fases 1-7)
|
|
606
|
+
- Workers AI: Granite 4.0 Micro (LTV + Quiz Scoring) + bge-m3 (Clustering)
|
|
607
|
+
- 2 Cron Triggers ativos (semanal + mensal)
|
|
608
|
+
- Rate Limiter, KV, R2 Audit Logs, Queues configurados
|
|
609
|
+
- Quiz Scoring Engine + Nurture Engine + ROAS Feedback Loop ativos
|
|
609
610
|
|
|
610
611
|
---
|
|
611
612
|
|