cdp-edge 2.3.9 → 2.5.2

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 (61) hide show
  1. package/README.md +54 -4
  2. package/bin/cdp-edge.js +3 -2
  3. package/contracts/agent-versions.json +383 -83
  4. package/dist/commands/validate.js +248 -84
  5. package/dist/sdk/cdpTrack.js +2095 -0
  6. package/dist/sdk/cdpTrack.min.js +64 -0
  7. package/dist/sdk/install-snippet.html +10 -0
  8. package/extracted-skill/tracking-events-generator/agents/ab-ltv-agent.md +1 -1
  9. package/extracted-skill/tracking-events-generator/agents/ab-testing-agent.md +1 -1
  10. package/extracted-skill/tracking-events-generator/agents/attribution-agent.md +18 -18
  11. package/extracted-skill/tracking-events-generator/agents/bidding-agent.md +1 -1
  12. package/extracted-skill/tracking-events-generator/agents/bing-agent.md +1 -1
  13. package/extracted-skill/tracking-events-generator/agents/code-guardian-agent.md +1 -1
  14. package/extracted-skill/tracking-events-generator/agents/compliance-agent.md +5 -5
  15. package/extracted-skill/tracking-events-generator/agents/crm-integration-agent.md +10 -10
  16. package/extracted-skill/tracking-events-generator/agents/dashboard-agent.md +3 -3
  17. package/extracted-skill/tracking-events-generator/agents/database-agent.md +17 -25
  18. package/extracted-skill/tracking-events-generator/agents/debug-agent.md +9 -9
  19. package/extracted-skill/tracking-events-generator/agents/devops-agent.md +18 -1
  20. package/extracted-skill/tracking-events-generator/agents/domain-setup-agent.md +5 -5
  21. package/extracted-skill/tracking-events-generator/agents/email-agent.md +3 -3
  22. package/extracted-skill/tracking-events-generator/agents/fingerprint-agent.md +4 -4
  23. package/extracted-skill/tracking-events-generator/agents/fraud-detection-agent.md +2 -0
  24. package/extracted-skill/tracking-events-generator/agents/google-agent.md +2 -2
  25. package/extracted-skill/tracking-events-generator/agents/intelligence-agent.md +23 -29
  26. package/extracted-skill/tracking-events-generator/agents/linkedin-agent.md +3 -3
  27. package/extracted-skill/tracking-events-generator/agents/localization-agent.md +1 -1
  28. package/extracted-skill/tracking-events-generator/agents/ltv-predictor-agent.md +1 -1
  29. package/extracted-skill/tracking-events-generator/agents/master-feedback-loop.md +16 -16
  30. package/extracted-skill/tracking-events-generator/agents/master-orchestrator.md +13 -13
  31. package/extracted-skill/tracking-events-generator/agents/memory-agent.md +14 -14
  32. package/extracted-skill/tracking-events-generator/agents/meta-agent.md +2 -2
  33. package/extracted-skill/tracking-events-generator/agents/ml-clustering-agent.md +9 -9
  34. package/extracted-skill/tracking-events-generator/agents/page-analyzer.md +1 -0
  35. package/extracted-skill/tracking-events-generator/agents/performance-agent.md +12 -12
  36. package/extracted-skill/tracking-events-generator/agents/performance-optimization-agent.md +7 -7
  37. package/extracted-skill/tracking-events-generator/agents/pinterest-agent.md +6 -6
  38. package/extracted-skill/tracking-events-generator/agents/premium-tracking-intelligence-agent.md +3 -3
  39. package/extracted-skill/tracking-events-generator/agents/r2-setup-agent.md +8 -8
  40. package/extracted-skill/tracking-events-generator/agents/reddit-agent.md +7 -7
  41. package/extracted-skill/tracking-events-generator/agents/security-enterprise-agent.md +21 -21
  42. package/extracted-skill/tracking-events-generator/agents/server-tracking.md +15 -15
  43. package/extracted-skill/tracking-events-generator/agents/spotify-agent.md +6 -6
  44. package/extracted-skill/tracking-events-generator/agents/tiktok-agent.md +3 -3
  45. package/extracted-skill/tracking-events-generator/agents/tracking-plan-agent.md +5 -5
  46. package/extracted-skill/tracking-events-generator/agents/validator-agent.md +9 -9
  47. package/extracted-skill/tracking-events-generator/agents/webhook-agent.md +4 -4
  48. package/extracted-skill/tracking-events-generator/agents/whatsapp-agent.md +1 -1
  49. package/extracted-skill/tracking-events-generator/agents/whatsapp-ctwa-setup-agent.md +3 -3
  50. package/extracted-skill/tracking-events-generator/agents/youtube-agent.md +9 -9
  51. package/extracted-skill/tracking-events-generator/anti-blocking.js +1 -1
  52. package/extracted-skill/tracking-events-generator/cdpTrack.js +0 -10
  53. package/extracted-skill/tracking-events-generator/engagement-scoring.js +2 -2
  54. package/extracted-skill/tracking-events-generator/micro-events.js +1 -1
  55. package/extracted-skill/tracking-events-generator/tracking.config.js +3 -3
  56. package/package.json +5 -1
  57. package/scripts/build-sdk.js +106 -0
  58. package/server-edge-tracker/index.ts +93 -0
  59. package/server-edge-tracker/schema-utm.sql +5 -3
  60. package/server-edge-tracker/wrangler.toml +1 -1
  61. package/extracted-skill/tracking-events-generator/agents/intelligence-scheduling.md +0 -10
@@ -27,7 +27,7 @@ const TIME_CONFIG = {
27
27
  thresholds: {
28
28
  curioso: 10000, // 10 segundos
29
29
  interessado: 60000, // 60 segundos
30
- comprador: 180000 // 180 segundos (3 minutos)
30
+ comprador: 180000, // 180 segundos (3 minutos)
31
31
  profundao: 60
32
32
  },
33
33
  signalStrength: {
@@ -10,9 +10,9 @@
10
10
  const CONFIG = {
11
11
  // ── Endpoint do Cloudflare Worker ────────────────────────────────────────────
12
12
  // Same-domain: evita ad-blockers e CORS.
13
- // Em produção: seu-dominio.com.br/api/tracking (Worker roteado)
14
- // Em dev: use o URL do Worker diretamente
15
- endpoint: '/api/tracking',
13
+ // Em produção: seu-dominio.com.br/track (Worker roteado via Custom Domain)
14
+ // Em dev: use o URL do Worker diretamente (ex: https://worker.seu-dominio.workers.dev/track)
15
+ endpoint: '/track',
16
16
 
17
17
  // ── Plataformas de checkout habilitadas ──────────────────────────────────────
18
18
  // Controla quais plataformas recebem passCheckoutParams() automaticamente.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cdp-edge",
3
- "version": "2.3.9",
3
+ "version": "2.5.2",
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",
@@ -15,6 +15,7 @@
15
15
  "contracts",
16
16
  "extracted-skill",
17
17
  "server-edge-tracker",
18
+ "scripts/build-sdk.js",
18
19
  "docs",
19
20
  "README.md"
20
21
  ],
@@ -35,6 +36,8 @@
35
36
  "agents:sync": "node scripts/sync-agents.js",
36
37
  "agents:sync:list": "node scripts/sync-agents.js --list",
37
38
  "agents:sync:all": "node scripts/sync-agents.js --apply-all",
39
+ "sdk:build": "node scripts/build-sdk.js",
40
+ "sdk:build:debug": "node scripts/build-sdk.js --debug",
38
41
  "typecheck": "tsc --noEmit"
39
42
  },
40
43
  "keywords": [
@@ -79,6 +82,7 @@
79
82
  "@semantic-release/npm": "^13.1.5",
80
83
  "@semantic-release/release-notes-generator": "^14.1.0",
81
84
  "@types/node": "^20.19.39",
85
+ "esbuild": "^0.28.0",
82
86
  "semantic-release": "^25.0.3",
83
87
  "typescript": "^6.0.2"
84
88
  }
@@ -0,0 +1,106 @@
1
+ /**
2
+ * CDP Edge — SDK Build Script
3
+ *
4
+ * Gera cdpTrack.min.js: bundle único pronto para <script src=""> em qualquer site.
5
+ * Entrada: extracted-skill/tracking-events-generator/cdpTrack.js (ES Module)
6
+ * Saída: dist/sdk/cdpTrack.min.js — minificado (produção)
7
+ * dist/sdk/cdpTrack.js — legível (debug)
8
+ *
9
+ * Uso:
10
+ * node scripts/build-sdk.js
11
+ * node scripts/build-sdk.js --debug (só versão legível)
12
+ */
13
+
14
+ import { build } from 'esbuild';
15
+ import { readFileSync, writeFileSync, mkdirSync } from 'fs';
16
+ import { resolve, dirname } from 'path';
17
+ import { fileURLToPath } from 'url';
18
+
19
+ const __dirname = dirname(fileURLToPath(import.meta.url));
20
+ const ROOT = resolve(__dirname, '..');
21
+ const SDK_DIR = resolve(ROOT, 'extracted-skill/tracking-events-generator');
22
+ const OUT_DIR = resolve(ROOT, 'dist/sdk');
23
+
24
+ const debugOnly = process.argv.includes('--debug');
25
+
26
+ // Garante que o diretório de saída existe
27
+ mkdirSync(OUT_DIR, { recursive: true });
28
+
29
+ // ── Banner do bundle ──────────────────────────────────────────────────────────
30
+ const pkg = JSON.parse(readFileSync(resolve(ROOT, 'package.json'), 'utf-8'));
31
+ const banner = `/*!
32
+ * CDP Edge SDK v${pkg.version}
33
+ * (c) ${new Date().getFullYear()} CDP Edge — Quantum Tracking
34
+ * Gerado em: ${new Date().toISOString()}
35
+ * Endpoint padrão: /track (mesmo domínio — anti-adblock)
36
+ */`;
37
+
38
+ // ── Configuração base do esbuild ──────────────────────────────────────────────
39
+ const baseConfig = {
40
+ entryPoints: [resolve(SDK_DIR, 'cdpTrack.js')],
41
+ bundle: true,
42
+ format: 'iife', // <script> tag — expõe window.cdpTrack
43
+ globalName: 'cdpTrack', // window.cdpTrack após carregar
44
+ platform: 'browser',
45
+ target: ['es2018'], // suporta Safari 12+, Chrome 69+, Firefox 62+
46
+ banner: { js: banner },
47
+ define: {
48
+ 'process.env.NODE_ENV': '"production"',
49
+ },
50
+ // Resolve módulos locais pelo diretório do SDK
51
+ absWorkingDir: SDK_DIR,
52
+ };
53
+
54
+ async function buildSDK() {
55
+ console.log('🏗️ Buildando CDP Edge SDK...\n');
56
+
57
+ // ── Versão debug (legível) ────────────────────────────────────────────────
58
+ console.log('📦 Gerando cdpTrack.js (debug)...');
59
+ await build({
60
+ ...baseConfig,
61
+ outfile: resolve(OUT_DIR, 'cdpTrack.js'),
62
+ minify: false,
63
+ sourcemap: false,
64
+ });
65
+ const debugSize = (readFileSync(resolve(OUT_DIR, 'cdpTrack.js')).length / 1024).toFixed(1);
66
+ console.log(` ✓ dist/sdk/cdpTrack.js — ${debugSize} kB`);
67
+
68
+ if (!debugOnly) {
69
+ // ── Versão produção (minificada) ────────────────────────────────────────
70
+ console.log('📦 Gerando cdpTrack.min.js (produção)...');
71
+ await build({
72
+ ...baseConfig,
73
+ outfile: resolve(OUT_DIR, 'cdpTrack.min.js'),
74
+ minify: true,
75
+ sourcemap: false,
76
+ });
77
+ const minSize = (readFileSync(resolve(OUT_DIR, 'cdpTrack.min.js')).length / 1024).toFixed(1);
78
+ console.log(` ✓ dist/sdk/cdpTrack.min.js — ${minSize} kB`);
79
+ }
80
+
81
+ // ── Gera snippet de instalação ────────────────────────────────────────────
82
+ const snippet = `<!-- CDP Edge SDK v${pkg.version} — instalar antes do </body> -->
83
+ <script src="/cdpTrack.min.js"></script>
84
+ <script>
85
+ // Inicializar após carregar
86
+ document.addEventListener('DOMContentLoaded', function() {
87
+ if (window.cdpTrack && window.cdpTrack.init) {
88
+ window.cdpTrack.init();
89
+ }
90
+ });
91
+ </script>`;
92
+
93
+ writeFileSync(resolve(OUT_DIR, 'install-snippet.html'), snippet, 'utf-8');
94
+ console.log(` ✓ dist/sdk/install-snippet.html — snippet de instalação\n`);
95
+
96
+ console.log('✅ SDK build concluído!');
97
+ console.log('\n📋 Próximos passos para o cliente:');
98
+ console.log(' 1. Copiar dist/sdk/cdpTrack.min.js para a raiz do site');
99
+ console.log(' 2. Adicionar snippet de dist/sdk/install-snippet.html antes de </body>');
100
+ console.log(' 3. O Worker deve estar no mesmo domínio (Custom Domain Cloudflare → /track)\n');
101
+ }
102
+
103
+ buildSDK().catch(err => {
104
+ console.error('❌ Build falhou:', err.message);
105
+ process.exit(1);
106
+ });
@@ -255,6 +255,99 @@ export default {
255
255
  }, null, 2), { headers });
256
256
  }
257
257
 
258
+ // ── GET /validate-install ─────────────────────────────────────────────────
259
+ // Endpoint de diagnóstico pós-deploy. Chamado por `cdp-edge validate <url>`.
260
+ // Testa D1 write/read, KV, AI e retorna relatório estruturado.
261
+ // Protegido: só aceita requisições com header CDP-Validate: 1
262
+ if (request.method === 'GET' && url.pathname === '/validate-install') {
263
+ if (request.headers.get('CDP-Validate') !== '1') {
264
+ return new Response(JSON.stringify({ error: 'Unauthorized' }), { status: 401, headers });
265
+ }
266
+
267
+ const report: Record<string, { ok: boolean; detail: string }> = {};
268
+
269
+ // 1. D1 write + read
270
+ try {
271
+ const testId = `__cdp_validate_${Date.now()}__`;
272
+ await env.DB?.prepare(
273
+ `INSERT OR REPLACE INTO events (event_id, event_name, user_id, created_at)
274
+ VALUES (?, '__validate__', '__validate__', datetime('now'))`
275
+ ).bind(testId).run();
276
+ const row = await env.DB?.prepare(
277
+ `SELECT event_id FROM events WHERE event_id = ?`
278
+ ).bind(testId).first();
279
+ await env.DB?.prepare(`DELETE FROM events WHERE event_id = ?`).bind(testId).run();
280
+ report.d1 = { ok: !!row, detail: row ? 'write+read+delete OK' : 'row not found after insert' };
281
+ } catch (err: any) {
282
+ report.d1 = { ok: false, detail: err?.message || String(err) };
283
+ }
284
+
285
+ // 2. KV read/write
286
+ try {
287
+ await env.GEO_CACHE?.put('__cdp_validate__', '1', { expirationTtl: 60 });
288
+ const val = await env.GEO_CACHE?.get('__cdp_validate__');
289
+ report.kv = { ok: val === '1', detail: val === '1' ? 'write+read OK' : 'value mismatch' };
290
+ } catch (err: any) {
291
+ report.kv = { ok: false, detail: err?.message || String(err) };
292
+ }
293
+
294
+ // 3. Workers AI
295
+ try {
296
+ await env.AI?.run('@cf/ibm-granite/granite-4.0-h-micro', {
297
+ messages: [{ role: 'user', content: 'ping' }],
298
+ max_tokens: 1,
299
+ });
300
+ report.ai = { ok: true, detail: 'Granite 4.0 Micro respondeu' };
301
+ } catch (err: any) {
302
+ report.ai = { ok: false, detail: err?.message || String(err) };
303
+ }
304
+
305
+ // 4. Secrets críticos
306
+ const missing: string[] = [];
307
+ if (!env.META_PIXEL_ID) missing.push('META_PIXEL_ID');
308
+ if (!env.META_ACCESS_TOKEN) missing.push('META_ACCESS_TOKEN');
309
+ if (!env.SITE_DOMAIN) missing.push('SITE_DOMAIN');
310
+ report.secrets = {
311
+ ok: missing.length === 0,
312
+ detail: missing.length === 0 ? 'todos os secrets críticos configurados' : `MISSING: ${missing.join(', ')}`,
313
+ };
314
+
315
+ // 5. /track endpoint (auto-teste)
316
+ const trackTest = { ok: false, detail: '' };
317
+ try {
318
+ const testPayload = {
319
+ eventName: 'PageView',
320
+ userId: '__cdp_validate__',
321
+ pageUrl: `https://${env.SITE_DOMAIN || 'validate.test'}/`,
322
+ userAgent: request.headers.get('User-Agent') || '',
323
+ ip: request.headers.get('CF-Connecting-IP') || '',
324
+ _validate: true,
325
+ };
326
+ const internalReq = new Request(`https://${env.SITE_DOMAIN || 'localhost'}/track`, {
327
+ method: 'POST',
328
+ headers: { 'Content-Type': 'application/json', 'CDP-Validate': '1' },
329
+ body: JSON.stringify(testPayload),
330
+ });
331
+ // Não chama fetch externo — apenas verifica que o payload seria aceito
332
+ const hasRequired = testPayload.eventName && testPayload.userId;
333
+ trackTest.ok = !!hasRequired;
334
+ trackTest.detail = hasRequired ? 'payload de teste válido (eventName + userId presentes)' : 'payload inválido';
335
+ } catch (err: any) {
336
+ trackTest.detail = err?.message || String(err);
337
+ }
338
+ report.track_endpoint = trackTest;
339
+
340
+ const allOk = Object.values(report).every(r => r.ok);
341
+ return new Response(JSON.stringify({
342
+ status: allOk ? 'ok' : 'degraded',
343
+ timestamp: new Date().toISOString(),
344
+ checks: report,
345
+ }, null, 2), {
346
+ status: allOk ? 200 : 207,
347
+ headers,
348
+ });
349
+ }
350
+
258
351
  // ── POST /track ───────────────────────────────────────────────────────────
259
352
  if (request.method === 'POST' && url.pathname === '/track') {
260
353
  // Reject oversized payloads before reading body (64 KB limit)
@@ -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
- ALTER TABLE leads ADD COLUMN IF NOT EXISTS faixa_obfuscada TEXT; -- Hash da faixa de valor (vem da URL)
36
- ALTER TABLE leads ADD COLUMN IF NOT EXISTS faixa_real TEXT; -- Valor real de-obfuscado (ex: "700k-1M")
37
- ALTER TABLE leads ADD COLUMN IF NOT EXISTS faixa_category TEXT; -- Categoria do produto (ex: "imovel")
35
+ -- Nota: D1/SQLite não suporta ADD COLUMN IF NOT EXISTS. Executar uma vez.
36
+ -- Se as colunas 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 = "SEU_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.