cdp-edge 1.2.2 → 1.3.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 +244 -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 +5 -5
- package/extracted-skill/tracking-events-generator/agents/master-feedback-loop.md +81 -21
- package/extracted-skill/tracking-events-generator/agents/master-orchestrator.md +313 -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 +749 -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
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CDP Edge — Route Intent Capture
|
|
3
|
+
* @version 2.0.0
|
|
4
|
+
*
|
|
5
|
+
* Fluxo:
|
|
6
|
+
* 1. Usuário clica em "Ver rota" → Google Maps abre normalmente
|
|
7
|
+
* 2. Widget aparece com um botão de WhatsApp
|
|
8
|
+
* 3. Usuário clica → WhatsApp abre com mensagem pré-escrita
|
|
9
|
+
* 4. Usuário envia → corretor recebe e responde
|
|
10
|
+
*
|
|
11
|
+
* Uso:
|
|
12
|
+
* initRouteIntentCapture({
|
|
13
|
+
* whatsappNumber: '5511999999999', // número do plantão/corretor
|
|
14
|
+
* propertyName: 'Reserva do Jardim',
|
|
15
|
+
* propertyId: 'rj-001',
|
|
16
|
+
* propertyLat: -23.6519,
|
|
17
|
+
* propertyLng: -46.5330,
|
|
18
|
+
* });
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
const isBrowser = typeof window !== 'undefined';
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @param {object} options
|
|
25
|
+
* @param {string} options.whatsappNumber Número do plantão (ex: '5511999999999')
|
|
26
|
+
* @param {string} [options.propertyName] Nome do empreendimento
|
|
27
|
+
* @param {string} [options.propertyId] ID interno do imóvel
|
|
28
|
+
* @param {number} [options.propertyLat] Latitude
|
|
29
|
+
* @param {number} [options.propertyLng] Longitude
|
|
30
|
+
* @param {string} [options.routeSelector] CSS selector dos botões de rota (default auto)
|
|
31
|
+
* @param {string} [options.distanceBucket] 'very_close'|'close'|'nearby'|'moderate'|'far'
|
|
32
|
+
* @param {number} [options.distanceKm] Distância em km — exibe tempo estimado
|
|
33
|
+
* @param {string} [options.metaSignalBucket] 'hot'|'warm'|'cold'
|
|
34
|
+
* @param {string} [options.brokerName] Nome do corretor de plantão (ex: 'Ramon')
|
|
35
|
+
*/
|
|
36
|
+
export function initRouteIntentCapture(options = {}) {
|
|
37
|
+
if (!isBrowser) return;
|
|
38
|
+
|
|
39
|
+
const {
|
|
40
|
+
whatsappNumber,
|
|
41
|
+
propertyName = 'o imóvel',
|
|
42
|
+
propertyId = null,
|
|
43
|
+
propertyLat = null,
|
|
44
|
+
propertyLng = null,
|
|
45
|
+
routeSelector = '[data-route-intent], a[href*="maps/dir"], a[href*="maps?q="]',
|
|
46
|
+
distanceBucket = null,
|
|
47
|
+
distanceKm = null,
|
|
48
|
+
metaSignalBucket = null,
|
|
49
|
+
brokerName = null,
|
|
50
|
+
} = options;
|
|
51
|
+
|
|
52
|
+
if (!whatsappNumber) {
|
|
53
|
+
console.warn('[RouteIntent] whatsappNumber é obrigatório.');
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
_injectStyles();
|
|
58
|
+
|
|
59
|
+
document.addEventListener('click', (e) => {
|
|
60
|
+
const btn = e.target.closest(routeSelector);
|
|
61
|
+
if (!btn) return;
|
|
62
|
+
_showWidget(btn, { whatsappNumber, propertyName, propertyId, propertyLat, propertyLng, distanceBucket, distanceKm, metaSignalBucket, brokerName });
|
|
63
|
+
}, true);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// ── Widget ────────────────────────────────────────────────────────────────────
|
|
67
|
+
|
|
68
|
+
function _showWidget(anchorEl, opts) {
|
|
69
|
+
document.getElementById('cdp-ri-widget')?.remove();
|
|
70
|
+
|
|
71
|
+
const travelMinutes = _estimateTravelMinutes(opts.distanceKm);
|
|
72
|
+
const travelText = travelMinutes
|
|
73
|
+
? `<p class="cdp-ri-travel">📍 Você está a cerca de <strong>${travelMinutes} min</strong> daqui</p>`
|
|
74
|
+
: '';
|
|
75
|
+
|
|
76
|
+
const brokerLine = opts.brokerName
|
|
77
|
+
? `<p class="cdp-ri-broker">Ao chegar, pergunte pelo <strong>${opts.brokerName}</strong> — ele vai estar te aguardando com tudo pronto 🤝</p>`
|
|
78
|
+
: '';
|
|
79
|
+
|
|
80
|
+
const widget = document.createElement('div');
|
|
81
|
+
widget.id = 'cdp-ri-widget';
|
|
82
|
+
widget.innerHTML = `
|
|
83
|
+
<div class="cdp-ri-inner">
|
|
84
|
+
${travelText}
|
|
85
|
+
<p class="cdp-ri-headline">Vi que você quer visitar o local! Confirme sua vinda enviando a mensagem abaixo — nossa equipe já fica de prontidão pra te receber 👇</p>
|
|
86
|
+
${brokerLine}
|
|
87
|
+
<button id="cdp-ri-btn" type="button">
|
|
88
|
+
${_waIcon()} Confirmar minha visita
|
|
89
|
+
</button>
|
|
90
|
+
<button id="cdp-ri-dismiss" type="button" class="cdp-ri-dismiss">Agora não</button>
|
|
91
|
+
</div>
|
|
92
|
+
`;
|
|
93
|
+
|
|
94
|
+
anchorEl.insertAdjacentElement('afterend', widget);
|
|
95
|
+
setTimeout(() => widget.scrollIntoView({ behavior: 'smooth', block: 'nearest' }), 150);
|
|
96
|
+
|
|
97
|
+
document.getElementById('cdp-ri-btn').addEventListener('click', () => _handleClick(widget, opts));
|
|
98
|
+
document.getElementById('cdp-ri-dismiss').addEventListener('click', () => {
|
|
99
|
+
window.cdpTrack?.track?.('ViewContent', {
|
|
100
|
+
content_name: 'rota_dispensada',
|
|
101
|
+
property_id: opts.propertyId,
|
|
102
|
+
funnel_stage: 'route_dismiss',
|
|
103
|
+
intent_score: 'medium',
|
|
104
|
+
distance_bucket: opts.distanceBucket || undefined,
|
|
105
|
+
meta_signal_bucket: opts.metaSignalBucket || undefined,
|
|
106
|
+
});
|
|
107
|
+
widget.remove();
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// ── Click — dispara evento e abre WhatsApp ────────────────────────────────────
|
|
112
|
+
|
|
113
|
+
async function _handleClick(widget, opts) {
|
|
114
|
+
const btn = document.getElementById('cdp-ri-btn');
|
|
115
|
+
if (btn) btn.disabled = true;
|
|
116
|
+
|
|
117
|
+
// Evento Contact → Worker: LTV + hot lead trigger + CAPI
|
|
118
|
+
// Phone capturado depois via webhook quando a mensagem chegar
|
|
119
|
+
window.cdpTrack?.track?.('Contact', {
|
|
120
|
+
content_name: 'aviso_chegada_whatsapp',
|
|
121
|
+
property_id: opts.propertyId,
|
|
122
|
+
property_lat: opts.propertyLat,
|
|
123
|
+
property_lng: opts.propertyLng,
|
|
124
|
+
funnel_stage: 'route_click',
|
|
125
|
+
intent_score: 'high',
|
|
126
|
+
distance_bucket: opts.distanceBucket || undefined,
|
|
127
|
+
meta_signal_bucket: opts.metaSignalBucket || undefined,
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
// Monta mensagem — acolhedora, foco em confirmar chegada
|
|
131
|
+
const travelMinutes = _estimateTravelMinutes(opts.distanceKm);
|
|
132
|
+
const travelLine = travelMinutes ? `Estou a cerca de ${travelMinutes} minutos daí.` : '';
|
|
133
|
+
const brokerLine = opts.brokerName
|
|
134
|
+
? `Vou procurar pelo ${opts.brokerName} ao chegar.`
|
|
135
|
+
: '';
|
|
136
|
+
|
|
137
|
+
const msg = [
|
|
138
|
+
`Oi! Estou interessado(a) em visitar o ${opts.propertyName} e gostaria de confirmar minha visita.`,
|
|
139
|
+
travelLine,
|
|
140
|
+
brokerLine || `Vocês conseguem me receber agora ou preciso marcar horário?`,
|
|
141
|
+
].filter(Boolean).join(' ');
|
|
142
|
+
|
|
143
|
+
_showSuccess(widget, opts.whatsappNumber, msg);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// ── Tela de confirmação ───────────────────────────────────────────────────────
|
|
147
|
+
|
|
148
|
+
function _showSuccess(widget, whatsappNumber, msg) {
|
|
149
|
+
widget.innerHTML = `
|
|
150
|
+
<div class="cdp-ri-inner cdp-ri-ok">
|
|
151
|
+
<span class="cdp-ri-check">✅</span>
|
|
152
|
+
<p><strong>Abrindo WhatsApp...</strong><br><span>A equipe já foi avisada!</span></p>
|
|
153
|
+
</div>
|
|
154
|
+
`;
|
|
155
|
+
setTimeout(() => {
|
|
156
|
+
window.open(`https://wa.me/${whatsappNumber}?text=${encodeURIComponent(msg)}`, '_blank');
|
|
157
|
+
setTimeout(() => widget?.remove(), 3500);
|
|
158
|
+
}, 600);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// ── Helpers ───────────────────────────────────────────────────────────────────
|
|
162
|
+
|
|
163
|
+
function _estimateTravelMinutes(distanceKm) {
|
|
164
|
+
if (!distanceKm || distanceKm <= 0) return null;
|
|
165
|
+
return Math.max(5, Math.round((distanceKm * 60 / 25) / 5) * 5);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
function _waIcon() {
|
|
169
|
+
return `<svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
|
|
170
|
+
<path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347z"/>
|
|
171
|
+
<path d="M12 0C5.373 0 0 5.373 0 12c0 2.122.554 4.118 1.528 5.852L0 24l6.335-1.513A11.933 11.933 0 0012 24c6.627 0 12-5.373 12-12S18.627 0 12 0zm0 21.818a9.818 9.818 0 01-5.002-1.368l-.359-.213-3.722.888.924-3.617-.234-.372A9.818 9.818 0 012.182 12C2.182 6.57 6.57 2.182 12 2.182S21.818 6.57 21.818 12 17.43 21.818 12 21.818z"/>
|
|
172
|
+
</svg>`;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// ── Estilos ───────────────────────────────────────────────────────────────────
|
|
176
|
+
|
|
177
|
+
function _injectStyles() {
|
|
178
|
+
if (document.getElementById('cdp-ri-styles')) return;
|
|
179
|
+
const s = document.createElement('style');
|
|
180
|
+
s.id = 'cdp-ri-styles';
|
|
181
|
+
s.textContent = `
|
|
182
|
+
#cdp-ri-widget {
|
|
183
|
+
margin-top: 12px;
|
|
184
|
+
padding: 16px 18px;
|
|
185
|
+
background: #f0fdf4;
|
|
186
|
+
border: 1.5px solid #22c55e;
|
|
187
|
+
border-radius: 12px;
|
|
188
|
+
font-family: Arial, sans-serif;
|
|
189
|
+
animation: cdp-ri-in .25s ease;
|
|
190
|
+
}
|
|
191
|
+
@keyframes cdp-ri-in {
|
|
192
|
+
from { opacity: 0; transform: translateY(-8px); }
|
|
193
|
+
to { opacity: 1; transform: translateY(0); }
|
|
194
|
+
}
|
|
195
|
+
.cdp-ri-inner { display: flex; flex-direction: column; gap: 10px; }
|
|
196
|
+
.cdp-ri-travel { margin: 0; font-size: 13px; color: #555; }
|
|
197
|
+
.cdp-ri-travel strong { color: #0f766e; }
|
|
198
|
+
.cdp-ri-headline { margin: 0; font-size: 14px; color: #15803d; font-weight: bold; line-height: 1.4; }
|
|
199
|
+
.cdp-ri-broker { margin: 0; font-size: 13px; color: #555; line-height: 1.4; }
|
|
200
|
+
.cdp-ri-broker strong { color: #0f766e; }
|
|
201
|
+
#cdp-ri-btn {
|
|
202
|
+
display: flex; align-items: center; justify-content: center; gap: 8px;
|
|
203
|
+
width: 100%; padding: 13px 16px;
|
|
204
|
+
background: #25D366; color: #fff;
|
|
205
|
+
border: none; border-radius: 10px;
|
|
206
|
+
font-size: 15px; font-weight: bold; cursor: pointer;
|
|
207
|
+
}
|
|
208
|
+
#cdp-ri-btn:hover { background: #1ebe5a; }
|
|
209
|
+
#cdp-ri-btn:disabled { background: #86efac; cursor: not-allowed; }
|
|
210
|
+
.cdp-ri-dismiss {
|
|
211
|
+
background: none; border: none;
|
|
212
|
+
color: #aaa; font-size: 12px;
|
|
213
|
+
cursor: pointer; padding: 2px 0; text-align: center;
|
|
214
|
+
}
|
|
215
|
+
.cdp-ri-dismiss:hover { color: #666; }
|
|
216
|
+
.cdp-ri-ok { align-items: center; text-align: center; gap: 8px; }
|
|
217
|
+
.cdp-ri-check { font-size: 28px; }
|
|
218
|
+
.cdp-ri-ok p { margin: 0; font-size: 14px; color: #15803d; line-height: 1.5; }
|
|
219
|
+
.cdp-ri-ok span { font-size: 13px; color: #555; }
|
|
220
|
+
`;
|
|
221
|
+
document.head.appendChild(s);
|
|
222
|
+
}
|
|
@@ -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,75 +1,89 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "cdp-edge",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "CDP Edge - Quantum Tracking - Sistema multi-agente para tracking digital Cloudflare Native (Workers + D1)",
|
|
5
|
-
"main": "dist/index.js",
|
|
6
|
-
"type": "module",
|
|
7
|
-
"bin": {
|
|
8
|
-
"cdp-edge": "./bin/cdp-edge.js",
|
|
9
|
-
"pb": "./bin/cdp-edge.js"
|
|
10
|
-
},
|
|
11
|
-
"files": [
|
|
12
|
-
"bin",
|
|
13
|
-
"dist",
|
|
14
|
-
"templates",
|
|
15
|
-
"contracts",
|
|
16
|
-
"extracted-skill",
|
|
17
|
-
"server-edge-tracker",
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"test
|
|
27
|
-
"test:unit
|
|
28
|
-
"test:unit:
|
|
29
|
-
"test:unit:
|
|
30
|
-
"test:
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
"
|
|
41
|
-
"
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
"
|
|
45
|
-
"
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
"
|
|
51
|
-
"
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
"
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
"
|
|
61
|
-
"
|
|
62
|
-
"
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
"
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
"
|
|
73
|
-
"
|
|
74
|
-
|
|
75
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "cdp-edge",
|
|
3
|
+
"version": "1.3.0",
|
|
4
|
+
"description": "CDP Edge - Quantum Tracking - Sistema multi-agente para tracking digital Cloudflare Native (Workers + D1)",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"cdp-edge": "./bin/cdp-edge.js",
|
|
9
|
+
"pb": "./bin/cdp-edge.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"bin",
|
|
13
|
+
"dist",
|
|
14
|
+
"templates",
|
|
15
|
+
"contracts",
|
|
16
|
+
"extracted-skill",
|
|
17
|
+
"server-edge-tracker",
|
|
18
|
+
"scripts/build-sdk.js",
|
|
19
|
+
"docs",
|
|
20
|
+
"README.md"
|
|
21
|
+
],
|
|
22
|
+
"scripts": {
|
|
23
|
+
"prepare": "node build.js",
|
|
24
|
+
"build": "node build.js",
|
|
25
|
+
"dev": "node build.js --watch",
|
|
26
|
+
"test": "node test.js",
|
|
27
|
+
"test:unit": "node tests/unit/normalization.test.js && node tests/unit/hashing.test.js && node tests/unit/deduplication.test.js && node tests/unit/payload-validation.test.js && node tests/unit/new-features.test.js && node tests/unit/utils.test.js",
|
|
28
|
+
"test:unit:normalize": "node tests/unit/normalization.test.js",
|
|
29
|
+
"test:unit:hash": "node tests/unit/hashing.test.js",
|
|
30
|
+
"test:unit:dedup": "node tests/unit/deduplication.test.js",
|
|
31
|
+
"test:unit:payload": "node tests/unit/payload-validation.test.js",
|
|
32
|
+
"test:unit:utils": "node tests/unit/utils.test.js",
|
|
33
|
+
"test:all": "npm run test:unit",
|
|
34
|
+
"test:integration": "cd tests/integration && npx vitest run",
|
|
35
|
+
"agents:check": "node scripts/validate-agents.js",
|
|
36
|
+
"agents:sync": "node scripts/sync-agents.js",
|
|
37
|
+
"agents:sync:list": "node scripts/sync-agents.js --list",
|
|
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",
|
|
41
|
+
"typecheck": "tsc --noEmit"
|
|
42
|
+
},
|
|
43
|
+
"keywords": [
|
|
44
|
+
"pixel",
|
|
45
|
+
"tracking",
|
|
46
|
+
"meta",
|
|
47
|
+
"caut",
|
|
48
|
+
"capi",
|
|
49
|
+
"tiktok",
|
|
50
|
+
"ga4",
|
|
51
|
+
"cloudflare",
|
|
52
|
+
"workers",
|
|
53
|
+
"d1",
|
|
54
|
+
"analytics",
|
|
55
|
+
"conversion",
|
|
56
|
+
"server-side"
|
|
57
|
+
],
|
|
58
|
+
"author": "CDP Edge",
|
|
59
|
+
"license": "MIT",
|
|
60
|
+
"repository": {
|
|
61
|
+
"type": "git",
|
|
62
|
+
"url": "https://github.com/ricardosoli777/CDP-Edge-Premium.ts"
|
|
63
|
+
},
|
|
64
|
+
"bugs": {
|
|
65
|
+
"url": "https://github.com/ricardosoli777/CDP-Edge-Premium.ts/issues"
|
|
66
|
+
},
|
|
67
|
+
"homepage": "https://github.com/ricardosoli777/CDP-Edge-Premium.ts#readme",
|
|
68
|
+
"engines": {
|
|
69
|
+
"node": ">=18.0.0"
|
|
70
|
+
},
|
|
71
|
+
"dependencies": {
|
|
72
|
+
"chalk": "^5.3.0",
|
|
73
|
+
"commander": "^14.0.3",
|
|
74
|
+
"inquirer": "^13.4.2",
|
|
75
|
+
"ora": "^9.4.0"
|
|
76
|
+
},
|
|
77
|
+
"devDependencies": {
|
|
78
|
+
"@cloudflare/workers-types": "^4.20260425.1",
|
|
79
|
+
"@semantic-release/changelog": "^6.0.3",
|
|
80
|
+
"@semantic-release/commit-analyzer": "^13.0.1",
|
|
81
|
+
"@semantic-release/github": "^12.0.6",
|
|
82
|
+
"@semantic-release/npm": "^13.1.5",
|
|
83
|
+
"@semantic-release/release-notes-generator": "^14.1.0",
|
|
84
|
+
"@types/node": "^25.6.0",
|
|
85
|
+
"esbuild": "^0.28.0",
|
|
86
|
+
"semantic-release": "^25.0.3",
|
|
87
|
+
"typescript": "^6.0.3"
|
|
88
|
+
}
|
|
89
|
+
}
|
|
@@ -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
|
+
});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# CDP Edge — Variáveis do cliente para deploy
|
|
2
|
+
# Copie este arquivo para .client.env e preencha com os dados reais.
|
|
3
|
+
# .client.env é gitignored — NUNCA commitado.
|
|
4
|
+
|
|
5
|
+
# Cloudflare D1 — obter com: wrangler d1 list
|
|
6
|
+
DATABASE_ID=SEU_DATABASE_ID
|
|
7
|
+
|
|
8
|
+
# Domínio do projeto (sem https://)
|
|
9
|
+
SITE_DOMAIN=seudominio.com.br
|
|
10
|
+
|
|
11
|
+
# Pixels de rastreamento (opcional — deixar vazio se não usar)
|
|
12
|
+
META_PIXEL_ID=
|
|
13
|
+
GA4_MEASUREMENT_ID=
|
|
14
|
+
TIKTOK_PIXEL_ID=
|