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.
- package/README.md +54 -4
- package/bin/cdp-edge.js +3 -2
- package/contracts/agent-versions.json +383 -83
- package/dist/commands/validate.js +248 -84
- package/dist/sdk/cdpTrack.js +2095 -0
- package/dist/sdk/cdpTrack.min.js +64 -0
- package/dist/sdk/install-snippet.html +10 -0
- package/extracted-skill/tracking-events-generator/agents/ab-ltv-agent.md +1 -1
- package/extracted-skill/tracking-events-generator/agents/ab-testing-agent.md +1 -1
- package/extracted-skill/tracking-events-generator/agents/attribution-agent.md +18 -18
- package/extracted-skill/tracking-events-generator/agents/bidding-agent.md +1 -1
- package/extracted-skill/tracking-events-generator/agents/bing-agent.md +1 -1
- package/extracted-skill/tracking-events-generator/agents/code-guardian-agent.md +1 -1
- package/extracted-skill/tracking-events-generator/agents/compliance-agent.md +5 -5
- package/extracted-skill/tracking-events-generator/agents/crm-integration-agent.md +10 -10
- package/extracted-skill/tracking-events-generator/agents/dashboard-agent.md +3 -3
- package/extracted-skill/tracking-events-generator/agents/database-agent.md +17 -25
- package/extracted-skill/tracking-events-generator/agents/debug-agent.md +9 -9
- package/extracted-skill/tracking-events-generator/agents/devops-agent.md +18 -1
- package/extracted-skill/tracking-events-generator/agents/domain-setup-agent.md +5 -5
- package/extracted-skill/tracking-events-generator/agents/email-agent.md +3 -3
- package/extracted-skill/tracking-events-generator/agents/fingerprint-agent.md +4 -4
- package/extracted-skill/tracking-events-generator/agents/fraud-detection-agent.md +2 -0
- package/extracted-skill/tracking-events-generator/agents/google-agent.md +2 -2
- package/extracted-skill/tracking-events-generator/agents/intelligence-agent.md +23 -29
- package/extracted-skill/tracking-events-generator/agents/linkedin-agent.md +3 -3
- package/extracted-skill/tracking-events-generator/agents/localization-agent.md +1 -1
- package/extracted-skill/tracking-events-generator/agents/ltv-predictor-agent.md +1 -1
- package/extracted-skill/tracking-events-generator/agents/master-feedback-loop.md +16 -16
- package/extracted-skill/tracking-events-generator/agents/master-orchestrator.md +13 -13
- package/extracted-skill/tracking-events-generator/agents/memory-agent.md +14 -14
- package/extracted-skill/tracking-events-generator/agents/meta-agent.md +2 -2
- package/extracted-skill/tracking-events-generator/agents/ml-clustering-agent.md +9 -9
- package/extracted-skill/tracking-events-generator/agents/page-analyzer.md +1 -0
- package/extracted-skill/tracking-events-generator/agents/performance-agent.md +12 -12
- package/extracted-skill/tracking-events-generator/agents/performance-optimization-agent.md +7 -7
- package/extracted-skill/tracking-events-generator/agents/pinterest-agent.md +6 -6
- package/extracted-skill/tracking-events-generator/agents/premium-tracking-intelligence-agent.md +3 -3
- package/extracted-skill/tracking-events-generator/agents/r2-setup-agent.md +8 -8
- package/extracted-skill/tracking-events-generator/agents/reddit-agent.md +7 -7
- package/extracted-skill/tracking-events-generator/agents/security-enterprise-agent.md +21 -21
- package/extracted-skill/tracking-events-generator/agents/server-tracking.md +15 -15
- package/extracted-skill/tracking-events-generator/agents/spotify-agent.md +6 -6
- package/extracted-skill/tracking-events-generator/agents/tiktok-agent.md +3 -3
- package/extracted-skill/tracking-events-generator/agents/tracking-plan-agent.md +5 -5
- package/extracted-skill/tracking-events-generator/agents/validator-agent.md +9 -9
- package/extracted-skill/tracking-events-generator/agents/webhook-agent.md +4 -4
- package/extracted-skill/tracking-events-generator/agents/whatsapp-agent.md +1 -1
- package/extracted-skill/tracking-events-generator/agents/whatsapp-ctwa-setup-agent.md +3 -3
- package/extracted-skill/tracking-events-generator/agents/youtube-agent.md +9 -9
- package/extracted-skill/tracking-events-generator/anti-blocking.js +1 -1
- package/extracted-skill/tracking-events-generator/cdpTrack.js +0 -10
- package/extracted-skill/tracking-events-generator/engagement-scoring.js +2 -2
- package/extracted-skill/tracking-events-generator/micro-events.js +1 -1
- package/extracted-skill/tracking-events-generator/tracking.config.js +3 -3
- package/package.json +5 -1
- package/scripts/build-sdk.js +106 -0
- package/server-edge-tracker/index.ts +93 -0
- package/server-edge-tracker/schema-utm.sql +5 -3
- package/server-edge-tracker/wrangler.toml +1 -1
- package/extracted-skill/tracking-events-generator/agents/intelligence-scheduling.md +0 -10
|
@@ -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/
|
|
14
|
-
// Em dev: use o URL do Worker diretamente
|
|
15
|
-
endpoint: '/
|
|
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
|
+
"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
|
-
|
|
36
|
-
|
|
37
|
-
ALTER TABLE leads ADD COLUMN
|
|
35
|
+
-- Nota: D1/SQLite não suporta ADD COLUMN IF NOT EXISTS. Executar uma vez.
|
|
36
|
+
-- Se as colunas já existirem, o erro "duplicate column name" é inofensivo — banco continua OK.
|
|
37
|
+
ALTER TABLE leads ADD COLUMN faixa_obfuscada TEXT; -- Hash da faixa de valor (vem da URL)
|
|
38
|
+
ALTER TABLE leads ADD COLUMN faixa_real TEXT; -- Valor real de-obfuscado (ex: "700k-1M")
|
|
39
|
+
ALTER TABLE leads ADD COLUMN faixa_category TEXT; -- Categoria do produto (ex: "imovel")
|
|
38
40
|
|
|
39
41
|
-- ============================================================================
|
|
40
42
|
-- ÍNDICES: leads (novas colunas para segmentação)
|
|
@@ -37,7 +37,7 @@ SITE_DOMAIN = "SEU_DOMINIO"
|
|
|
37
37
|
[[d1_databases]]
|
|
38
38
|
binding = "DB"
|
|
39
39
|
database_name = "cdp-edge-db"
|
|
40
|
-
database_id = "
|
|
40
|
+
database_id = "7867d38f-5fa8-4c17-b465-386211422c09"
|
|
41
41
|
|
|
42
42
|
# ── Queues — Retry + Dead Letter Queue ───────────────────────────────────────
|
|
43
43
|
# Produtor: worker envia eventos com falha para cdp-edge-retry
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
# Intelligence Agent — Scheduling (REDIRECIONAMENTO)
|
|
2
|
-
|
|
3
|
-
> ⚠️ **Este arquivo foi consolidado.**
|
|
4
|
-
>
|
|
5
|
-
> Todo o conteúdo de scheduling automático do Intelligence Agent foi unificado em:
|
|
6
|
-
> **[intelligence-agent.md](./intelligence-agent.md)**
|
|
7
|
-
>
|
|
8
|
-
> Consulte a seção `## 📅 PROTOCOLO DE SCHEDULING` dentro de `intelligence-agent.md`.
|
|
9
|
-
|
|
10
|
-
Motivo: duplicação eliminada para manter uma única fonte de verdade.
|