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,226 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CDP Edge — Logistic Regression (pure TS, sem deps externas)
|
|
3
|
+
* Treina modelo de predição de conversão com dados reais do D1.
|
|
4
|
+
*
|
|
5
|
+
* Features usadas (todas normalizadas 0-1):
|
|
6
|
+
* utm_source, engagement_score, intention_level, recency,
|
|
7
|
+
* has_email, has_phone, is_br, hour_normalized
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { Env } from '../../types.js';
|
|
11
|
+
import { D1Database, KVNamespace } from '@cloudflare/workers-types';
|
|
12
|
+
|
|
13
|
+
// ── Tipos ───────────────────────────────────────────────────────────────────────
|
|
14
|
+
export interface DatasetRow {
|
|
15
|
+
features: number[];
|
|
16
|
+
label: number;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface LogisticModel {
|
|
20
|
+
bias: number;
|
|
21
|
+
weights: number[];
|
|
22
|
+
accuracy: number;
|
|
23
|
+
positiveRate: number;
|
|
24
|
+
sampleSize: number;
|
|
25
|
+
threshold: number;
|
|
26
|
+
featureNames: string[];
|
|
27
|
+
trainedAt: string;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface ExtractedFeatures {
|
|
31
|
+
utm_score: number;
|
|
32
|
+
engagement: number;
|
|
33
|
+
intention: number;
|
|
34
|
+
recency: number;
|
|
35
|
+
has_email: number;
|
|
36
|
+
has_phone: number;
|
|
37
|
+
is_br: number;
|
|
38
|
+
hour: number;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// ── Feature Engineering ───────────────────────────────────────────────────────
|
|
42
|
+
|
|
43
|
+
const UTM_SCORES: Record<string, number> = {
|
|
44
|
+
facebook: 0.90, instagram: 0.90, meta: 0.90,
|
|
45
|
+
google: 0.82, youtube: 0.82,
|
|
46
|
+
tiktok: 0.75,
|
|
47
|
+
email: 0.68, sms: 0.68,
|
|
48
|
+
organic: 0.30,
|
|
49
|
+
direct: 0.20,
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
const INTENTION_SCORES: Record<string, number> = {
|
|
53
|
+
comprador: 1.00, high_intent: 1.00,
|
|
54
|
+
interessado: 0.60,
|
|
55
|
+
nurture: 0.30,
|
|
56
|
+
curioso: 0.15,
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
export function extractFeatures(row: any): number[] {
|
|
60
|
+
const src = (row.utm_source || '').toLowerCase().trim();
|
|
61
|
+
const intention = (row.intention_level || '').toLowerCase().trim();
|
|
62
|
+
const daysSince = row.days_since_lead || 0;
|
|
63
|
+
|
|
64
|
+
return [
|
|
65
|
+
UTM_SCORES[src] ?? (src ? 0.10 : 0.05), // utm_score
|
|
66
|
+
Math.min((row.engagement_score || 0) / 5, 1), // engagement (0-5 → 0-1)
|
|
67
|
+
INTENTION_SCORES[intention] ?? 0, // intention
|
|
68
|
+
Math.max(0, 1 - daysSince / 90), // recency (0=90 dias, 1=hoje)
|
|
69
|
+
row.has_email ? 1 : 0, // has_email
|
|
70
|
+
row.has_phone ? 1 : 0, // has_phone
|
|
71
|
+
row.is_br ? 1 : 0, // is_br
|
|
72
|
+
((row.hour || 12) / 23), // hour normalized
|
|
73
|
+
];
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// ── Sigmoid ───────────────────────────────────────────────────────────────────
|
|
77
|
+
|
|
78
|
+
function sigmoid(z: number): number {
|
|
79
|
+
if (z > 20) return 1;
|
|
80
|
+
if (z < -20) return 0;
|
|
81
|
+
return 1 / (1 + Math.exp(-z));
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function dot(weights: number[], features: number[]): number {
|
|
85
|
+
return features.reduce((sum, f, i) => sum + (weights[i] || 0) * f, 0);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// ── Treinamento ───────────────────────────────────────────────────────────────
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Treina regressão logística com gradiente descendente.
|
|
92
|
+
*/
|
|
93
|
+
export function trainLogisticRegression(dataset: DatasetRow[], opts: { iterations?: number; learningRate?: number; lambda?: number } = {}): LogisticModel | null {
|
|
94
|
+
if (!dataset || dataset.length < 50) {
|
|
95
|
+
return null; // dados insuficientes
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const iterations = opts.iterations || 200;
|
|
99
|
+
const learningRate = opts.learningRate || 0.1;
|
|
100
|
+
const lambda = opts.lambda || 0.01; // L2 regularization
|
|
101
|
+
const nFeatures = dataset[0].features.length;
|
|
102
|
+
|
|
103
|
+
let bias = 0;
|
|
104
|
+
let weights = new Array(nFeatures).fill(0);
|
|
105
|
+
|
|
106
|
+
const positives = dataset.filter(d => d.label === 1).length;
|
|
107
|
+
const positiveRate = positives / dataset.length;
|
|
108
|
+
|
|
109
|
+
// Se menos de 5% positivos, não treina (dados de compra insuficientes)
|
|
110
|
+
if (positiveRate < 0.03) return null;
|
|
111
|
+
|
|
112
|
+
for (let iter = 0; iter < iterations; iter++) {
|
|
113
|
+
let dBias = 0;
|
|
114
|
+
const dWeights = new Array(nFeatures).fill(0);
|
|
115
|
+
|
|
116
|
+
for (const { features, label } of dataset) {
|
|
117
|
+
const z = dot(weights, features) + bias;
|
|
118
|
+
const pred = sigmoid(z);
|
|
119
|
+
const error = pred - label;
|
|
120
|
+
|
|
121
|
+
dBias += error;
|
|
122
|
+
for (let j = 0; j < nFeatures; j++) {
|
|
123
|
+
dWeights[j] += error * features[j];
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const n = dataset.length;
|
|
128
|
+
bias -= learningRate * (dBias / n);
|
|
129
|
+
for (let j = 0; j < nFeatures; j++) {
|
|
130
|
+
// L2: penaliza pesos grandes para evitar overfitting
|
|
131
|
+
weights[j] -= learningRate * ((dWeights[j] / n) + lambda * weights[j]);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Calcular acurácia no conjunto de treino
|
|
136
|
+
let correct = 0;
|
|
137
|
+
const threshold = positiveRate > 0.3 ? 0.5 : Math.max(0.3, positiveRate * 1.5);
|
|
138
|
+
|
|
139
|
+
for (const { features, label } of dataset) {
|
|
140
|
+
const z = dot(weights, features) + bias;
|
|
141
|
+
const pred = sigmoid(z) >= threshold ? 1 : 0;
|
|
142
|
+
if (pred === label) correct++;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
const accuracy = correct / dataset.length;
|
|
146
|
+
|
|
147
|
+
return {
|
|
148
|
+
bias,
|
|
149
|
+
weights,
|
|
150
|
+
accuracy,
|
|
151
|
+
positiveRate,
|
|
152
|
+
sampleSize: dataset.length,
|
|
153
|
+
threshold,
|
|
154
|
+
featureNames: ['utm_score', 'engagement', 'intention', 'recency', 'has_email', 'has_phone', 'is_br', 'hour'],
|
|
155
|
+
trainedAt: new Date().toISOString(),
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// ── Inferência ────────────────────────────────────────────────────────────────
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Prediz score de conversão (0-100) usando pesos treinados.
|
|
163
|
+
*/
|
|
164
|
+
export function predictWithWeights(model: LogisticModel, features: number[]): number {
|
|
165
|
+
const z = dot(model.weights, features) + model.bias;
|
|
166
|
+
const prob = sigmoid(z);
|
|
167
|
+
return Math.round(prob * 100);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// ── Helpers de persistência ───────────────────────────────────────────────────
|
|
171
|
+
|
|
172
|
+
export const LTV_WEIGHTS_KV_KEY = 'ltv_weights_active';
|
|
173
|
+
|
|
174
|
+
export async function loadActiveWeights(env: Env): Promise<LogisticModel | null> {
|
|
175
|
+
// 1. Tentar KV (cache ~7 dias)
|
|
176
|
+
if (env.GEO_CACHE) {
|
|
177
|
+
try {
|
|
178
|
+
const cached = await env.GEO_CACHE.get(LTV_WEIGHTS_KV_KEY, 'json') as LogisticModel | null;
|
|
179
|
+
if (cached?.weights?.length) return cached;
|
|
180
|
+
} catch (err: any) {
|
|
181
|
+
console.error('[Logistic] Error fetching LTV weights from KV cache:', {
|
|
182
|
+
key: LTV_WEIGHTS_KV_KEY,
|
|
183
|
+
error: err?.message || String(err),
|
|
184
|
+
stack: err?.stack,
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// 2. Fallback: D1
|
|
190
|
+
if (!env.DB) return null;
|
|
191
|
+
try {
|
|
192
|
+
const row = await env.DB.prepare(
|
|
193
|
+
`SELECT weights_json FROM ltv_model_weights WHERE is_active = 1 ORDER BY trained_at DESC LIMIT 1`
|
|
194
|
+
).first();
|
|
195
|
+
if (!row || !(row as any).weights_json) return null;
|
|
196
|
+
const model = JSON.parse((row as any).weights_json) as LogisticModel;
|
|
197
|
+
|
|
198
|
+
// Popular KV para próximas requests
|
|
199
|
+
if (env.GEO_CACHE && model?.weights?.length) {
|
|
200
|
+
env.GEO_CACHE.put(LTV_WEIGHTS_KV_KEY, JSON.stringify(model), { expirationTtl: 604800 }).catch(() => {});
|
|
201
|
+
}
|
|
202
|
+
return model;
|
|
203
|
+
} catch {
|
|
204
|
+
return null;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
export async function saveWeights(DB: D1Database, model: LogisticModel): Promise<void> {
|
|
209
|
+
if (!DB || !model) return;
|
|
210
|
+
const now = new Date().toISOString();
|
|
211
|
+
|
|
212
|
+
// Desativar modelo anterior
|
|
213
|
+
await DB.prepare(`UPDATE ltv_model_weights SET is_active = 0 WHERE is_active = 1`).run();
|
|
214
|
+
|
|
215
|
+
// Inserir novo como ativo
|
|
216
|
+
await DB.prepare(`
|
|
217
|
+
INSERT INTO ltv_model_weights (trained_at, is_active, sample_size, positive_rate, accuracy, weights_json)
|
|
218
|
+
VALUES (?, 1, ?, ?, ?, ?)
|
|
219
|
+
`).bind(
|
|
220
|
+
now,
|
|
221
|
+
model.sampleSize,
|
|
222
|
+
model.positiveRate,
|
|
223
|
+
model.accuracy,
|
|
224
|
+
JSON.stringify(model),
|
|
225
|
+
).run();
|
|
226
|
+
}
|