cdp-edge 1.18.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +308 -308
  2. package/bin/cdp-edge.js +61 -61
  3. package/dist/commands/analyze.js +52 -52
  4. package/dist/commands/infra.js +54 -54
  5. package/dist/commands/install.js +186 -0
  6. package/dist/commands/server.js +174 -174
  7. package/dist/commands/setup.js +18 -1
  8. package/dist/commands/validate.js +84 -84
  9. package/dist/index.js +12 -12
  10. package/extracted-skill/tracking-events-generator/advanced-matching.js +364 -364
  11. package/extracted-skill/tracking-events-generator/agents/browser-tracking.md +172 -72
  12. package/extracted-skill/tracking-events-generator/agents/google-agent.md +118 -0
  13. package/extracted-skill/tracking-events-generator/agents/intelligence-agent.md +86 -0
  14. package/extracted-skill/tracking-events-generator/agents/intelligence-scheduling.md +8 -641
  15. package/extracted-skill/tracking-events-generator/agents/memory-agent.md +98 -0
  16. package/extracted-skill/tracking-events-generator/agents/webhook-agent.md +42 -0
  17. package/extracted-skill/tracking-events-generator/anti-blocking.js +285 -285
  18. package/extracted-skill/tracking-events-generator/cdpTrack.js +641 -641
  19. package/extracted-skill/tracking-events-generator/engagement-scoring.js +226 -226
  20. package/extracted-skill/tracking-events-generator/evals/evals.json +235 -235
  21. package/extracted-skill/tracking-events-generator/integration-test.js +497 -497
  22. package/extracted-skill/tracking-events-generator/micro-events.js +992 -992
  23. package/extracted-skill/tracking-events-generator/models/pinterest/conversions-api-template.js +144 -144
  24. package/extracted-skill/tracking-events-generator/models/pinterest/event-mappings.json +48 -48
  25. package/extracted-skill/tracking-events-generator/models/pinterest/tag-template.js +28 -28
  26. package/extracted-skill/tracking-events-generator/models/reddit/conversions-api-template.js +205 -205
  27. package/extracted-skill/tracking-events-generator/models/reddit/event-mappings.json +56 -56
  28. package/extracted-skill/tracking-events-generator/models/reddit/pixel-template.js +19 -19
  29. package/extracted-skill/tracking-events-generator/models/scenarios/behavior-engine.js +425 -425
  30. package/package.json +76 -76
  31. package/server-edge-tracker/schema.sql +265 -265
  32. package/server-edge-tracker/worker.js +4160 -4160
  33. package/server-edge-tracker/wrangler.toml +103 -103
  34. package/templates/pinterest/conversions-api-template.js +144 -144
  35. package/templates/pinterest/event-mappings.json +48 -48
  36. package/templates/pinterest/tag-template.js +28 -28
  37. package/templates/reddit/conversions-api-template.js +205 -205
  38. package/templates/reddit/event-mappings.json +56 -56
  39. package/templates/reddit/pixel-template.js +19 -19
  40. package/templates/scenarios/behavior-engine.js +425 -425
@@ -54,6 +54,52 @@ Quando o Master Orchestrator solicitar um deploy, você fornece os dados ao DevO
54
54
 
55
55
  ---
56
56
 
57
+ ## ⚡ QUICK REFERENCE — API DE CONSULTA (para outros agentes)
58
+
59
+ Qualquer agente pode consultar o Memory Agent com a seguinte chamada:
60
+
61
+ ```javascript
62
+ // Consultar qualquer dado salvo na memória da sessão
63
+ const memoryQuery = async (query) => {
64
+ const checkpoint = await readMemoryCheckpoint(); // lê memory-agent.json
65
+
66
+ switch (query.type) {
67
+ case 'get_secret':
68
+ // query: { type: 'get_secret', platform: 'meta', secret_name: 'access_token' }
69
+ return checkpoint.secrets_configured?.[query.platform]?.[query.secret_name];
70
+
71
+ case 'get_api_version':
72
+ // query: { type: 'get_api_version', platform: 'tiktok' }
73
+ return checkpoint.api_versions?.[query.platform];
74
+
75
+ case 'get_infra':
76
+ // query: { type: 'get_infra', key: 'd1_database_id' }
77
+ return checkpoint.cloudflare_infrastructure?.bindings?.[query.key];
78
+
79
+ case 'check_if_implemented':
80
+ // query: { type: 'check_if_implemented', item: 'meta_capi' }
81
+ return checkpoint.context_state?.platforms_configured?.includes(query.item);
82
+
83
+ case 'get_technical_decision':
84
+ // query: { type: 'get_technical_decision', decision_id: 'decision_001' }
85
+ return checkpoint.technical_decisions?.find(d => d.id === query.decision_id);
86
+
87
+ default:
88
+ throw new Error(`Query type desconhecido: ${query.type}. Tipos válidos: get_secret | get_api_version | get_infra | check_if_implemented | get_technical_decision`);
89
+ }
90
+ };
91
+
92
+ // Exemplo de uso em qualquer agente — NUNCA inventar credenciais:
93
+ const metaToken = await memoryQuery({ type: 'get_secret', platform: 'meta', secret_name: 'access_token' });
94
+ if (!metaToken || metaToken === 'NOT_SET') {
95
+ throw new Error('META_ACCESS_TOKEN não configurado. Solicite ao usuário antes de continuar.');
96
+ }
97
+ ```
98
+
99
+ > **Regra Anti-Alucinação:** Se `memoryQuery()` retornar `null`, `undefined` ou `NOT_SET` → **NÃO INVENTAR**. Solicitar ao usuário explicitamente.
100
+
101
+ ---
102
+
57
103
  ## 🧠 OBJETIVO PRINCIPAL: ELIMINAR RETRABALHO E ALUCINAÇÃO
58
104
 
59
105
  Sua única função é registrar absolutamente TUDO o que importa. Você é o banco de dados centralizado da sessão de chat.
@@ -144,6 +190,30 @@ O Memory Agent não é só um conceito — ele tem uma implementação técnica
144
190
  "pixel": "v2",
145
191
  "conversions_api": "v2.0",
146
192
  "verified_at": null
193
+ },
194
+ "linkedin": {
195
+ "insight_tag": "latest",
196
+ "conversions_api": "v2",
197
+ "verified_at": null
198
+ },
199
+ "spotify": {
200
+ "pixel": "v1",
201
+ "conversions_api": "v1",
202
+ "verified_at": null
203
+ },
204
+ "whatsapp": {
205
+ "cloud_api": "v22.0",
206
+ "verified_at": null
207
+ },
208
+ "bing": {
209
+ "uet": "latest",
210
+ "conversions_api": "v2",
211
+ "verified_at": null
212
+ },
213
+ "youtube": {
214
+ "ga4_integration": "latest",
215
+ "customer_match": "SHA-256",
216
+ "verified_at": null
147
217
  }
148
218
  },
149
219
 
@@ -181,6 +251,34 @@ O Memory Agent não é só um conceito — ele tem uma implementação técnica
181
251
  "pixel_id": "NOT_SET",
182
252
  "access_token": "NOT_SET",
183
253
  "verified_at": null
254
+ },
255
+ "pinterest": {
256
+ "tag_id": "NOT_SET",
257
+ "access_token": "NOT_SET",
258
+ "ad_account_id": "NOT_SET",
259
+ "verified_at": null
260
+ },
261
+ "reddit": {
262
+ "pixel_id": "NOT_SET",
263
+ "access_token": "NOT_SET",
264
+ "ad_account_id": "NOT_SET",
265
+ "verified_at": null
266
+ },
267
+ "linkedin": {
268
+ "access_token": "NOT_SET",
269
+ "conversion_id": "NOT_SET",
270
+ "ad_account_id": "NOT_SET",
271
+ "verified_at": null
272
+ },
273
+ "spotify": {
274
+ "ad_account_id": "NOT_SET",
275
+ "access_token": "NOT_SET",
276
+ "verified_at": null
277
+ },
278
+ "whatsapp": {
279
+ "phone_number_id": "NOT_SET",
280
+ "token": "NOT_SET",
281
+ "verified_at": null
184
282
  }
185
283
  },
186
284
 
@@ -12,6 +12,48 @@ Você é o especialista em Webhooks do CDP Edge. Sua missão é capturar vendas
12
12
 
13
13
  ---
14
14
 
15
+ ## 🔐 NORMALIZAÇÃO E HASHING DE PII (OBRIGATÓRIO)
16
+
17
+ Antes de qualquer dispatch para CAPI, normalizar e hashear PII extraída do webhook:
18
+
19
+ ```javascript
20
+ // Hashing SHA-256 para PII — usar WebCrypto (disponível em Cloudflare Workers)
21
+ async function hashPII(value) {
22
+ if (!value) return null;
23
+ const normalized = value.toString().toLowerCase().trim();
24
+ const encoder = new TextEncoder();
25
+ const data = encoder.encode(normalized);
26
+ const hashBuffer = await crypto.subtle.digest('SHA-256', data);
27
+ return Array.from(new Uint8Array(hashBuffer)).map(b => b.toString(16).padStart(2, '0')).join('');
28
+ }
29
+
30
+ // Normalização E.164 para telefone (Brasil)
31
+ function normalizePhone(phone) {
32
+ if (!phone) return null;
33
+ const digits = phone.replace(/\D/g, '');
34
+ // Adicionar +55 se não tiver código de país
35
+ if (digits.length === 10 || digits.length === 11) return `+55${digits}`;
36
+ if (digits.startsWith('55') && (digits.length === 12 || digits.length === 13)) return `+${digits}`;
37
+ return `+${digits}`;
38
+ }
39
+
40
+ // Exemplo de uso no handler de webhook:
41
+ async function hashWebhookUserData(webhookPayload) {
42
+ const email = webhookPayload.buyer?.email || webhookPayload.email;
43
+ const phone = webhookPayload.buyer?.phone || webhookPayload.phone;
44
+ return {
45
+ em: email ? await hashPII(email) : null, // SHA-256 lowercase+trim
46
+ ph: phone ? await hashPII(normalizePhone(phone)) : null, // SHA-256 após E.164
47
+ fn: webhookPayload.buyer?.first_name ? await hashPII(webhookPayload.buyer.first_name) : null,
48
+ ln: webhookPayload.buyer?.last_name ? await hashPII(webhookPayload.buyer.last_name) : null,
49
+ };
50
+ }
51
+ ```
52
+
53
+ > **Regra:** NUNCA enviar email ou telefone em plaintext para Meta CAPI, GA4 MP ou TikTok Events API. Sempre normalizar → hashear → enviar.
54
+
55
+ ---
56
+
15
57
  ## 🏗️ PADRÕES TÉCNICOS (Quantum Tier)
16
58
 
17
59
  1. **D1 Identity Cross-Check**: Utilize o e-mail ou telefone do webhook para buscar no banco **D1** os identificadores originais (`fbp`, `fbc`, `ttp`). Isso garante a precisão da atribuição.