nuxs-capsule 0.1.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.
- package/README.md +21 -0
- package/bin/nuxs-capsule-intercept.js +4 -0
- package/bin/nuxs-capsule.js +20 -0
- package/dist/install.d.ts +17 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +243 -0
- package/dist/install.js.map +1 -0
- package/dist/intercept.d.ts +19 -0
- package/dist/intercept.d.ts.map +1 -0
- package/dist/intercept.js +232 -0
- package/dist/intercept.js.map +1 -0
- package/dist/lib/fileStat.d.ts +20 -0
- package/dist/lib/fileStat.d.ts.map +1 -0
- package/dist/lib/fileStat.js +71 -0
- package/dist/lib/fileStat.js.map +1 -0
- package/dist/lib/fingerprint.d.ts +10 -0
- package/dist/lib/fingerprint.d.ts.map +1 -0
- package/dist/lib/fingerprint.js +41 -0
- package/dist/lib/fingerprint.js.map +1 -0
- package/dist/lib/tokenCount.d.ts +13 -0
- package/dist/lib/tokenCount.d.ts.map +1 -0
- package/dist/lib/tokenCount.js +32 -0
- package/dist/lib/tokenCount.js.map +1 -0
- package/dist/license/check.d.ts +14 -0
- package/dist/license/check.d.ts.map +1 -0
- package/dist/license/check.js +141 -0
- package/dist/license/check.js.map +1 -0
- package/dist/providers/llmClient.d.ts +20 -0
- package/dist/providers/llmClient.d.ts.map +1 -0
- package/dist/providers/llmClient.js +40 -0
- package/dist/providers/llmClient.js.map +1 -0
- package/dist/server.d.ts +10 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +268 -0
- package/dist/server.js.map +1 -0
- package/dist/setup.d.ts +14 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +135 -0
- package/dist/setup.js.map +1 -0
- package/dist/telemetry/usage.d.ts +19 -0
- package/dist/telemetry/usage.d.ts.map +1 -0
- package/dist/telemetry/usage.js +114 -0
- package/dist/telemetry/usage.js.map +1 -0
- package/dist/tools/apiCapsule.d.ts +16 -0
- package/dist/tools/apiCapsule.d.ts.map +1 -0
- package/dist/tools/apiCapsule.js +169 -0
- package/dist/tools/apiCapsule.js.map +1 -0
- package/dist/tools/eventsCapsule.d.ts +15 -0
- package/dist/tools/eventsCapsule.d.ts.map +1 -0
- package/dist/tools/eventsCapsule.js +72 -0
- package/dist/tools/eventsCapsule.js.map +1 -0
- package/dist/tools/logCapsule.d.ts +38 -0
- package/dist/tools/logCapsule.d.ts.map +1 -0
- package/dist/tools/logCapsule.js +283 -0
- package/dist/tools/logCapsule.js.map +1 -0
- package/dist/tools/networkCapsule.d.ts +18 -0
- package/dist/tools/networkCapsule.d.ts.map +1 -0
- package/dist/tools/networkCapsule.js +151 -0
- package/dist/tools/networkCapsule.js.map +1 -0
- package/dist/tools/sessionCapsule.d.ts +21 -0
- package/dist/tools/sessionCapsule.d.ts.map +1 -0
- package/dist/tools/sessionCapsule.js +174 -0
- package/dist/tools/sessionCapsule.js.map +1 -0
- package/dist/tools/sqlCapsule.d.ts +17 -0
- package/dist/tools/sqlCapsule.d.ts.map +1 -0
- package/dist/tools/sqlCapsule.js +144 -0
- package/dist/tools/sqlCapsule.js.map +1 -0
- package/dist/tools/stackCapsule.d.ts +9 -0
- package/dist/tools/stackCapsule.d.ts.map +1 -0
- package/dist/tools/stackCapsule.js +132 -0
- package/dist/tools/stackCapsule.js.map +1 -0
- package/dist/tools/threadsCapsule.d.ts +14 -0
- package/dist/tools/threadsCapsule.d.ts.map +1 -0
- package/dist/tools/threadsCapsule.js +77 -0
- package/dist/tools/threadsCapsule.js.map +1 -0
- package/dist/types.d.ts +199 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/dist/wrap.d.ts +14 -0
- package/dist/wrap.d.ts.map +1 -0
- package/dist/wrap.js +100 -0
- package/dist/wrap.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* api_capsule — comprime JSON gigante (responses de API).
|
|
3
|
+
* Algoritmo puro, zero LLM.
|
|
4
|
+
*
|
|
5
|
+
* Compressão típica: 100k tokens → 2k (50×).
|
|
6
|
+
*
|
|
7
|
+
* Mecânica:
|
|
8
|
+
* 1. Parse JSON
|
|
9
|
+
* 2. Detecta array principal (data, items, results, ou root array)
|
|
10
|
+
* 3. Infer JSON Schema simples
|
|
11
|
+
* 4. Sample 3-5 itens diversos (cobrem variações)
|
|
12
|
+
* 5. Field stats: type + null_count + unique_count
|
|
13
|
+
*/
|
|
14
|
+
export function apiCapsule(json, _sourceUrl) {
|
|
15
|
+
const data = JSON.parse(json);
|
|
16
|
+
const items = findItemsArray(data);
|
|
17
|
+
if (items.length === 0) {
|
|
18
|
+
// Não é lista — devolve schema do objeto único
|
|
19
|
+
return {
|
|
20
|
+
schema: inferSchema(data),
|
|
21
|
+
sample: data ? [data] : [],
|
|
22
|
+
total_items: 0,
|
|
23
|
+
unique_shapes: 1,
|
|
24
|
+
field_stats: computeFieldStats([data])
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
schema: inferSchema(items[0]),
|
|
29
|
+
sample: pickDiverseSamples(items, 5),
|
|
30
|
+
total_items: items.length,
|
|
31
|
+
unique_shapes: countUniqueShapes(items),
|
|
32
|
+
field_stats: computeFieldStats(items)
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function findItemsArray(data) {
|
|
36
|
+
if (Array.isArray(data))
|
|
37
|
+
return data;
|
|
38
|
+
if (data && typeof data === 'object') {
|
|
39
|
+
const obj = data;
|
|
40
|
+
// Tentativas comuns
|
|
41
|
+
for (const key of ['data', 'items', 'results', 'list', 'rows', 'records', 'entries']) {
|
|
42
|
+
const val = obj[key];
|
|
43
|
+
if (Array.isArray(val))
|
|
44
|
+
return val;
|
|
45
|
+
}
|
|
46
|
+
// Procura primeiro campo que é array
|
|
47
|
+
for (const val of Object.values(obj)) {
|
|
48
|
+
if (Array.isArray(val) && val.length > 0)
|
|
49
|
+
return val;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return [];
|
|
53
|
+
}
|
|
54
|
+
/** JSON Schema simplificado — só types + required-ness. */
|
|
55
|
+
function inferSchema(value) {
|
|
56
|
+
if (value === null)
|
|
57
|
+
return { type: 'null' };
|
|
58
|
+
if (Array.isArray(value)) {
|
|
59
|
+
return {
|
|
60
|
+
type: 'array',
|
|
61
|
+
items: value.length > 0 ? inferSchema(value[0]) : {}
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
const t = typeof value;
|
|
65
|
+
if (t === 'object') {
|
|
66
|
+
const props = {};
|
|
67
|
+
for (const [key, val] of Object.entries(value)) {
|
|
68
|
+
props[key] = inferSchema(val);
|
|
69
|
+
}
|
|
70
|
+
return { type: 'object', properties: props };
|
|
71
|
+
}
|
|
72
|
+
return { type: t };
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Sample diverso: pega itens que cobrem variações de campos preenchidos
|
|
76
|
+
* (não só os 5 primeiros, que podem ser idênticos).
|
|
77
|
+
*/
|
|
78
|
+
function pickDiverseSamples(items, n) {
|
|
79
|
+
if (items.length <= n)
|
|
80
|
+
return items;
|
|
81
|
+
// Estratégia: classifica items pelo "shape" (set de campos preenchidos)
|
|
82
|
+
// e pega 1 de cada shape até completar n.
|
|
83
|
+
const byShape = new Map();
|
|
84
|
+
for (const item of items) {
|
|
85
|
+
const shape = shapeOf(item);
|
|
86
|
+
if (!byShape.has(shape))
|
|
87
|
+
byShape.set(shape, item);
|
|
88
|
+
if (byShape.size >= n)
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
// Se shapes < n, completa com primeiros + meio + último
|
|
92
|
+
const samples = Array.from(byShape.values());
|
|
93
|
+
if (samples.length < n) {
|
|
94
|
+
const middle = Math.floor(items.length / 2);
|
|
95
|
+
const candidates = [items[0], items[middle], items[items.length - 1]];
|
|
96
|
+
for (const c of candidates) {
|
|
97
|
+
if (samples.length >= n)
|
|
98
|
+
break;
|
|
99
|
+
if (!samples.includes(c))
|
|
100
|
+
samples.push(c);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return samples.slice(0, n);
|
|
104
|
+
}
|
|
105
|
+
function shapeOf(value) {
|
|
106
|
+
if (value === null)
|
|
107
|
+
return 'null';
|
|
108
|
+
if (Array.isArray(value))
|
|
109
|
+
return `array[${value.length > 0 ? shapeOf(value[0]) : ''}]`;
|
|
110
|
+
if (typeof value === 'object') {
|
|
111
|
+
const keys = Object.entries(value)
|
|
112
|
+
.filter(([_, v]) => v !== null && v !== undefined)
|
|
113
|
+
.map(([k]) => k)
|
|
114
|
+
.sort()
|
|
115
|
+
.join(',');
|
|
116
|
+
return `{${keys}}`;
|
|
117
|
+
}
|
|
118
|
+
return typeof value;
|
|
119
|
+
}
|
|
120
|
+
function countUniqueShapes(items) {
|
|
121
|
+
const shapes = new Set();
|
|
122
|
+
for (const item of items)
|
|
123
|
+
shapes.add(shapeOf(item));
|
|
124
|
+
return shapes.size;
|
|
125
|
+
}
|
|
126
|
+
/** Stats por campo: type + null_count + unique_count (top fields). */
|
|
127
|
+
function computeFieldStats(items) {
|
|
128
|
+
const stats = {};
|
|
129
|
+
for (const item of items) {
|
|
130
|
+
if (!item || typeof item !== 'object' || Array.isArray(item))
|
|
131
|
+
continue;
|
|
132
|
+
for (const [key, val] of Object.entries(item)) {
|
|
133
|
+
if (!stats[key]) {
|
|
134
|
+
stats[key] = {
|
|
135
|
+
type: 'unknown',
|
|
136
|
+
null_count: 0,
|
|
137
|
+
unique_count: 0,
|
|
138
|
+
seen: new Set()
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
const s = stats[key];
|
|
142
|
+
if (val === null) {
|
|
143
|
+
s.null_count++;
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
if (s.type === 'unknown') {
|
|
147
|
+
s.type = Array.isArray(val) ? 'array' : typeof val;
|
|
148
|
+
}
|
|
149
|
+
// Conta unique (até 100 pra não estourar memória)
|
|
150
|
+
if (s.seen.size < 100) {
|
|
151
|
+
s.seen.add(typeof val === 'object' ? JSON.stringify(val) : String(val));
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// Limpa: só top 20 fields mais frequentes
|
|
157
|
+
const sortedKeys = Object.keys(stats).slice(0, 20);
|
|
158
|
+
const result = {};
|
|
159
|
+
for (const key of sortedKeys) {
|
|
160
|
+
const s = stats[key];
|
|
161
|
+
result[key] = {
|
|
162
|
+
type: s.type,
|
|
163
|
+
null_count: s.null_count,
|
|
164
|
+
unique_count: s.seen.size
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
return result;
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=apiCapsule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiCapsule.js","sourceRoot":"","sources":["../../src/tools/apiCapsule.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,UAAmB;IAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAc,CAAC;IAC3C,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAEnC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,+CAA+C;QAC/C,OAAO;YACL,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC;YACzB,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;YAC1B,WAAW,EAAE,CAAC;YACd,aAAa,EAAE,CAAC;YAChB,WAAW,EAAE,iBAAiB,CAAC,CAAC,IAAI,CAAC,CAAC;SACvC,CAAC;IACJ,CAAC;IAED,OAAO;QACL,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC;QAC9B,MAAM,EAAE,kBAAkB,CAAC,KAAK,EAAE,CAAC,CAAC;QACpC,WAAW,EAAE,KAAK,CAAC,MAAM;QACzB,aAAa,EAAE,iBAAiB,CAAC,KAAK,CAAC;QACvC,WAAW,EAAE,iBAAiB,CAAC,KAAK,CAAC;KACtC,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,IAAe;IACrC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAkB,CAAC;QAC/B,oBAAoB;QACpB,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC;YACrF,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;YACrB,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;gBAAE,OAAO,GAAG,CAAC;QACrC,CAAC;QACD,qCAAqC;QACrC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACrC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,GAAG,CAAC;QACvD,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,2DAA2D;AAC3D,SAAS,WAAW,CAAC,KAAgB;IACnC,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC5C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO;YACL,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,EAAE;SACtD,CAAC;IACJ,CAAC;IACD,MAAM,CAAC,GAAG,OAAO,KAAK,CAAC;IACvB,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;QACnB,MAAM,KAAK,GAA4B,EAAE,CAAC;QAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAmB,CAAC,EAAE,CAAC;YAC7D,KAAK,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IAC/C,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AACrB,CAAC;AAED;;;GAGG;AACH,SAAS,kBAAkB,CAAC,KAAkB,EAAE,CAAS;IACvD,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACpC,wEAAwE;IACxE,0CAA0C;IAC1C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAqB,CAAC;IAC7C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAClD,IAAI,OAAO,CAAC,IAAI,IAAI,CAAC;YAAE,MAAM;IAC/B,CAAC;IACD,wDAAwD;IACxD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC5C,MAAM,UAAU,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,KAAK,CAAC,MAAM,CAAE,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,CAAC;QACzE,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC;gBAAE,MAAM;YAC/B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,OAAO,CAAC,KAAgB;IAC/B,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAClC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;IACxF,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,KAAmB,CAAC;aAC7C,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS,CAAC;aACjD,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;aACf,IAAI,EAAE;aACN,IAAI,CAAC,GAAG,CAAC,CAAC;QACb,OAAO,IAAI,IAAI,GAAG,CAAC;IACrB,CAAC;IACD,OAAO,OAAO,KAAK,CAAC;AACtB,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAkB;IAC3C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACpD,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,sEAAsE;AACtE,SAAS,iBAAiB,CAAC,KAAkB;IAK3C,MAAM,KAAK,GAKN,EAAE,CAAC;IAER,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,SAAS;QACvE,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAkB,CAAC,EAAE,CAAC;YAC5D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;gBAChB,KAAK,CAAC,GAAG,CAAC,GAAG;oBACX,IAAI,EAAE,SAAS;oBACf,UAAU,EAAE,CAAC;oBACb,YAAY,EAAE,CAAC;oBACf,IAAI,EAAE,IAAI,GAAG,EAAE;iBAChB,CAAC;YACJ,CAAC;YACD,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAE,CAAC;YACtB,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;gBACjB,CAAC,CAAC,UAAU,EAAE,CAAC;YACjB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;oBACzB,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC;gBACrD,CAAC;gBACD,kDAAkD;gBAClD,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,EAAE,CAAC;oBACtB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC1E,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,0CAA0C;IAC1C,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACnD,MAAM,MAAM,GAA+E,EAAE,CAAC;IAC9F,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAE,CAAC;QACtB,MAAM,CAAC,GAAG,CAAC,GAAG;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI;SAC1B,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* events_capsule — comprime eventos de produto (Mixpanel/PostHog/Amplitude).
|
|
3
|
+
* Agregação algorítmica + LLM resume narrativa.
|
|
4
|
+
*
|
|
5
|
+
* Compressão típica: 30k tokens → 1k (30×).
|
|
6
|
+
*/
|
|
7
|
+
import type { EventsCapsule } from '../types.js';
|
|
8
|
+
export interface ProductEvent {
|
|
9
|
+
event: string;
|
|
10
|
+
user_id?: string;
|
|
11
|
+
timestamp?: string;
|
|
12
|
+
properties?: Record<string, unknown>;
|
|
13
|
+
}
|
|
14
|
+
export declare function eventsCapsule(events: ProductEvent[], source?: EventsCapsule['source']): Promise<EventsCapsule>;
|
|
15
|
+
//# sourceMappingURL=eventsCapsule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventsCapsule.d.ts","sourceRoot":"","sources":["../../src/tools/eventsCapsule.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,YAAY,EAAE,EACtB,MAAM,GAAE,aAAa,CAAC,QAAQ,CAAW,GACxC,OAAO,CAAC,aAAa,CAAC,CAqDxB"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* events_capsule — comprime eventos de produto (Mixpanel/PostHog/Amplitude).
|
|
3
|
+
* Agregação algorítmica + LLM resume narrativa.
|
|
4
|
+
*
|
|
5
|
+
* Compressão típica: 30k tokens → 1k (30×).
|
|
6
|
+
*/
|
|
7
|
+
import { compressViaLlm } from '../providers/llmClient.js';
|
|
8
|
+
export async function eventsCapsule(events, source = 'other') {
|
|
9
|
+
if (events.length === 0) {
|
|
10
|
+
return {
|
|
11
|
+
source,
|
|
12
|
+
total_events: 0,
|
|
13
|
+
funnel: [],
|
|
14
|
+
anomalies: [],
|
|
15
|
+
top_events: []
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
// 1. Agregação ALGORÍTMICA (não usa LLM ainda)
|
|
19
|
+
const eventCounts = {};
|
|
20
|
+
for (const e of events) {
|
|
21
|
+
eventCounts[e.event] = (eventCounts[e.event] ?? 0) + 1;
|
|
22
|
+
}
|
|
23
|
+
const topEvents = Object.entries(eventCounts)
|
|
24
|
+
.sort((a, b) => b[1] - a[1])
|
|
25
|
+
.slice(0, 15)
|
|
26
|
+
.map(([event, count]) => ({ event, count }));
|
|
27
|
+
// 2. LLM resume funnel + anomalias (input já compacto: top events)
|
|
28
|
+
const llm = await compressViaLlm({
|
|
29
|
+
capsule_type: 'events',
|
|
30
|
+
prompt: EVENTS_PROMPT,
|
|
31
|
+
input: {
|
|
32
|
+
source,
|
|
33
|
+
total_events: events.length,
|
|
34
|
+
top_events: topEvents,
|
|
35
|
+
sample_events: events.slice(0, 10) // 10 exemplos completos pra LLM ver estrutura
|
|
36
|
+
},
|
|
37
|
+
model_preference: 'cheap'
|
|
38
|
+
});
|
|
39
|
+
if (!llm) {
|
|
40
|
+
return {
|
|
41
|
+
source,
|
|
42
|
+
total_events: events.length,
|
|
43
|
+
funnel: [],
|
|
44
|
+
anomalies: [],
|
|
45
|
+
top_events: topEvents
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
const partial = llm.result;
|
|
49
|
+
return {
|
|
50
|
+
source,
|
|
51
|
+
total_events: events.length,
|
|
52
|
+
funnel: partial.funnel ?? [],
|
|
53
|
+
anomalies: partial.anomalies ?? [],
|
|
54
|
+
top_events: topEvents
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
const EVENTS_PROMPT = `
|
|
58
|
+
Você recebe eventos de produto agregados.
|
|
59
|
+
Devolva APENAS JSON com:
|
|
60
|
+
{
|
|
61
|
+
"funnel": [
|
|
62
|
+
{"step": "nome do evento", "count": N, "drop_off_pct": % perdido pro próximo}
|
|
63
|
+
],
|
|
64
|
+
"anomalies": [
|
|
65
|
+
{"event": "nome", "expected": N, "observed": N, "deviation_pct": %}
|
|
66
|
+
]
|
|
67
|
+
}
|
|
68
|
+
Funnel: detecta sequência típica de uso (signup → onboarding → first_action → retention).
|
|
69
|
+
Anomalies: eventos com volume muito acima/abaixo do esperado.
|
|
70
|
+
Sem markdown, JSON puro.
|
|
71
|
+
`;
|
|
72
|
+
//# sourceMappingURL=eventsCapsule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventsCapsule.js","sourceRoot":"","sources":["../../src/tools/eventsCapsule.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAU3D,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAsB,EACtB,SAAkC,OAAO;IAEzC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO;YACL,MAAM;YACN,YAAY,EAAE,CAAC;YACf,MAAM,EAAE,EAAE;YACV,SAAS,EAAE,EAAE;YACb,UAAU,EAAE,EAAE;SACf,CAAC;IACJ,CAAC;IAED,+CAA+C;IAC/C,MAAM,WAAW,GAA2B,EAAE,CAAC;IAC/C,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;SAC1C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SAC3B,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;SACZ,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAE/C,mEAAmE;IACnE,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC;QAC/B,YAAY,EAAE,QAAQ;QACtB,MAAM,EAAE,aAAa;QACrB,KAAK,EAAE;YACL,MAAM;YACN,YAAY,EAAE,MAAM,CAAC,MAAM;YAC3B,UAAU,EAAE,SAAS;YACrB,aAAa,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,8CAA8C;SAClF;QACD,gBAAgB,EAAE,OAAO;KAC1B,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO;YACL,MAAM;YACN,YAAY,EAAE,MAAM,CAAC,MAAM;YAC3B,MAAM,EAAE,EAAE;YACV,SAAS,EAAE,EAAE;YACb,UAAU,EAAE,SAAS;SACtB,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,MAAgC,CAAC;IACrD,OAAO;QACL,MAAM;QACN,YAAY,EAAE,MAAM,CAAC,MAAM;QAC3B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;QAC5B,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,EAAE;QAClC,UAAU,EAAE,SAAS;KACtB,CAAC;AACJ,CAAC;AAED,MAAM,aAAa,GAAG;;;;;;;;;;;;;;CAcrB,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* log_capsule — compressor universal de logs.
|
|
3
|
+
*
|
|
4
|
+
* Algoritmo: Drain3 templating em JS puro [adaptado dos papers da
|
|
5
|
+
* IBM/HKUST de 2017]. ZERO LLM, ZERO custo recorrente. Algoritmo
|
|
6
|
+
* roda 100% local, latência <300ms p95 mesmo em 1M+ linhas.
|
|
7
|
+
*
|
|
8
|
+
* Output schema compatível com IncidentCapsule da Codag pra
|
|
9
|
+
* facilitar migração de quem vinha do produto deles.
|
|
10
|
+
*
|
|
11
|
+
* Compressão típica: 50-200× em logs reais com muita repetição
|
|
12
|
+
* [nginx access logs, k8s pod logs, journalctl, docker logs].
|
|
13
|
+
*
|
|
14
|
+
* Mecânica Drain:
|
|
15
|
+
* 1. Tokeniza cada linha [whitespace]
|
|
16
|
+
* 2. Agrupa por [token_count, primeiro_token]
|
|
17
|
+
* 3. Dentro do grupo: posições com valores diferentes viram <*>
|
|
18
|
+
* 4. Resultado: template canônico + count + samples representativos
|
|
19
|
+
*
|
|
20
|
+
* Extras nossos vs Drain puro:
|
|
21
|
+
* - Classifica role automaticamente [error/critical/warning/normal/noise]
|
|
22
|
+
* via regex em level + keywords [exception, fatal, killed, timeout]
|
|
23
|
+
* - Extrai timeline de "evidence" — eventos críticos com line numbers
|
|
24
|
+
* - Detecta service de qualquer formato comum [kubectl logs <pod>,
|
|
25
|
+
* journalctl -u <svc>, [tag], etc]
|
|
26
|
+
* - Time window automático [primeira/última timestamp parseada]
|
|
27
|
+
*/
|
|
28
|
+
import type { LogCapsule } from '../types.js';
|
|
29
|
+
/**
|
|
30
|
+
* logCapsuleFromString — entrada principal.
|
|
31
|
+
*
|
|
32
|
+
* @param rawLogs conteúdo bruto [string com newlines]
|
|
33
|
+
* @param serviceHint service explicit [opcional, sobrescreve detect]
|
|
34
|
+
*/
|
|
35
|
+
export declare function logCapsuleFromString(rawLogs: string, serviceHint?: string): LogCapsule;
|
|
36
|
+
/** Helper pro hook intercept ler de arquivo. */
|
|
37
|
+
export declare function logCapsuleFromFile(filePath: string, serviceHint?: string): LogCapsule;
|
|
38
|
+
//# sourceMappingURL=logCapsule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logCapsule.d.ts","sourceRoot":"","sources":["../../src/tools/logCapsule.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAyJ9C;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,MAAM,GACnB,UAAU,CA6FZ;AAED,gDAAgD;AAChD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,UAAU,CAGrF"}
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* log_capsule — compressor universal de logs.
|
|
3
|
+
*
|
|
4
|
+
* Algoritmo: Drain3 templating em JS puro [adaptado dos papers da
|
|
5
|
+
* IBM/HKUST de 2017]. ZERO LLM, ZERO custo recorrente. Algoritmo
|
|
6
|
+
* roda 100% local, latência <300ms p95 mesmo em 1M+ linhas.
|
|
7
|
+
*
|
|
8
|
+
* Output schema compatível com IncidentCapsule da Codag pra
|
|
9
|
+
* facilitar migração de quem vinha do produto deles.
|
|
10
|
+
*
|
|
11
|
+
* Compressão típica: 50-200× em logs reais com muita repetição
|
|
12
|
+
* [nginx access logs, k8s pod logs, journalctl, docker logs].
|
|
13
|
+
*
|
|
14
|
+
* Mecânica Drain:
|
|
15
|
+
* 1. Tokeniza cada linha [whitespace]
|
|
16
|
+
* 2. Agrupa por [token_count, primeiro_token]
|
|
17
|
+
* 3. Dentro do grupo: posições com valores diferentes viram <*>
|
|
18
|
+
* 4. Resultado: template canônico + count + samples representativos
|
|
19
|
+
*
|
|
20
|
+
* Extras nossos vs Drain puro:
|
|
21
|
+
* - Classifica role automaticamente [error/critical/warning/normal/noise]
|
|
22
|
+
* via regex em level + keywords [exception, fatal, killed, timeout]
|
|
23
|
+
* - Extrai timeline de "evidence" — eventos críticos com line numbers
|
|
24
|
+
* - Detecta service de qualquer formato comum [kubectl logs <pod>,
|
|
25
|
+
* journalctl -u <svc>, [tag], etc]
|
|
26
|
+
* - Time window automático [primeira/última timestamp parseada]
|
|
27
|
+
*/
|
|
28
|
+
import { readFileSync } from 'node:fs';
|
|
29
|
+
import { createHash } from 'node:crypto';
|
|
30
|
+
// ─── Configuração ──────────────────────────────────────────────────
|
|
31
|
+
const MAX_SAMPLES_PER_TEMPLATE = 3; // Cádra template guarda até 3 linhas exemplo
|
|
32
|
+
const MAX_TEMPLATES_OUT = 50; // Top N templates no output
|
|
33
|
+
const MAX_EVIDENCE_OUT = 30; // Top N evidências críticas
|
|
34
|
+
const MIN_TEMPLATES_FOR_DRAIN = 2; // Abaixo disso não compensa templating
|
|
35
|
+
const VAR_PLACEHOLDER = '<*>';
|
|
36
|
+
// Regex de classificação de role
|
|
37
|
+
const RE_CRITICAL = /\b(FATAL|PANIC|EMERGENCY|CRITICAL|SEGFAULT|OOM|OutOfMemory|killed)\b/i;
|
|
38
|
+
const RE_ERROR = /\b(ERROR|ERR|EXCEPTION|FAIL(?:ED)?|TRACEBACK|stack trace)\b/i;
|
|
39
|
+
const RE_WARNING = /\b(WARN(?:ING)?|DEPRECATED)\b/i;
|
|
40
|
+
const RE_TIMESTAMP = /\b(\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}:\d{2}(?:[.,]\d+)?(?:Z|[+-]\d{2}:?\d{2})?)\b/;
|
|
41
|
+
// Regex de tokens que SEMPRE são variáveis [otimização do Drain stock]
|
|
42
|
+
const VAR_PATTERNS = [
|
|
43
|
+
/^\d+$/, // só números
|
|
44
|
+
/^[0-9a-fA-F]{8,}$/, // hex curto+ [hash, IDs]
|
|
45
|
+
/^\d+\.\d+\.\d+\.\d+$/, // IPv4
|
|
46
|
+
/^\d{4}-\d{2}-\d{2}/, // datas
|
|
47
|
+
/^\d{2}:\d{2}(?::\d{2})?$/, // horários
|
|
48
|
+
/^\/[^\s]*$/, // paths
|
|
49
|
+
/^https?:\/\//, // URLs
|
|
50
|
+
/^[0-9a-f]{8}-[0-9a-f]{4}-/i, // UUIDs
|
|
51
|
+
/^\d+(?:ms|s|m|h|kb|mb|gb)$/i, // medidas
|
|
52
|
+
/^\d+\.\d+$/ // floats
|
|
53
|
+
];
|
|
54
|
+
function isLikelyVariable(token) {
|
|
55
|
+
for (const re of VAR_PATTERNS) {
|
|
56
|
+
if (re.test(token))
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
function classifyLine(line) {
|
|
62
|
+
if (RE_CRITICAL.test(line))
|
|
63
|
+
return 'critical';
|
|
64
|
+
if (RE_ERROR.test(line))
|
|
65
|
+
return 'error';
|
|
66
|
+
if (RE_WARNING.test(line))
|
|
67
|
+
return 'warning';
|
|
68
|
+
// Linhas que parecem heartbeat/ack/ping são noise
|
|
69
|
+
if (/\b(heartbeat|keepalive|ack|pong|GET\s+\/health|GET\s+\/ping)\b/i.test(line)) {
|
|
70
|
+
return 'noise';
|
|
71
|
+
}
|
|
72
|
+
return 'normal';
|
|
73
|
+
}
|
|
74
|
+
function detectService(lines) {
|
|
75
|
+
// Heurísticas baratas: procura padrões nas 20 primeiras linhas
|
|
76
|
+
for (const line of lines.slice(0, 20)) {
|
|
77
|
+
// systemd journal: "May 26 10:30:00 hostname svcname[123]:"
|
|
78
|
+
const sysd = line.match(/\s([a-z][a-z0-9._-]+)\[\d+\]:/i);
|
|
79
|
+
if (sysd)
|
|
80
|
+
return sysd[1] ?? null;
|
|
81
|
+
// docker tag: "[2024-...] [tag]"
|
|
82
|
+
const tag = line.match(/\[([a-z][a-z0-9._-]+)\]/i);
|
|
83
|
+
if (tag && tag[1] && tag[1].length > 2 && !/^\d/.test(tag[1]))
|
|
84
|
+
return tag[1];
|
|
85
|
+
}
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
function extractTimestamp(line) {
|
|
89
|
+
const m = line.match(RE_TIMESTAMP);
|
|
90
|
+
return m ? m[1] ?? null : null;
|
|
91
|
+
}
|
|
92
|
+
function hashTemplate(tokens) {
|
|
93
|
+
return createHash('sha256').update(tokens.join(' ')).digest('hex').slice(0, 10);
|
|
94
|
+
}
|
|
95
|
+
// Estima tokens [4 chars ≈ 1 token]
|
|
96
|
+
function estTokens(s) {
|
|
97
|
+
return Math.ceil((s || '').length / 4);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Roda Drain templating em uma sequência de linhas.
|
|
101
|
+
*
|
|
102
|
+
* Estratégia: bucket por (length, first_token_hash). Dentro do bucket
|
|
103
|
+
* compara token-a-token; posições onde os tokens diferem viram <*>.
|
|
104
|
+
* Heurística de match: se >70% dos tokens não-variáveis batem, é o
|
|
105
|
+
* mesmo template — atualiza template merging os tokens diferentes.
|
|
106
|
+
*/
|
|
107
|
+
function drainTemplating(lines) {
|
|
108
|
+
const buckets = new Map();
|
|
109
|
+
for (let i = 0; i < lines.length; i++) {
|
|
110
|
+
const raw = lines[i];
|
|
111
|
+
if (!raw || !raw.trim())
|
|
112
|
+
continue;
|
|
113
|
+
const tokens = raw.trim().split(/\s+/);
|
|
114
|
+
if (tokens.length === 0)
|
|
115
|
+
continue;
|
|
116
|
+
// Normaliza tokens "variáveis óbvios" já de entrada
|
|
117
|
+
const normalized = tokens.map((t) => isLikelyVariable(t) ? VAR_PLACEHOLDER : t);
|
|
118
|
+
const bucketKey = `${normalized.length}:${normalized[0]}`;
|
|
119
|
+
const bucket = buckets.get(bucketKey) ?? [];
|
|
120
|
+
// Tenta dar match com um template existente
|
|
121
|
+
let matched = null;
|
|
122
|
+
for (const grp of bucket) {
|
|
123
|
+
if (grp.template.length !== normalized.length)
|
|
124
|
+
continue;
|
|
125
|
+
let same = 0;
|
|
126
|
+
let diff = 0;
|
|
127
|
+
for (let k = 0; k < normalized.length; k++) {
|
|
128
|
+
const a = grp.template[k];
|
|
129
|
+
const b = normalized[k];
|
|
130
|
+
if (a === b)
|
|
131
|
+
same++;
|
|
132
|
+
else if (a === VAR_PLACEHOLDER || b === VAR_PLACEHOLDER)
|
|
133
|
+
same++;
|
|
134
|
+
else
|
|
135
|
+
diff++;
|
|
136
|
+
}
|
|
137
|
+
// Threshold: >=70% similaridade considera mesmo template
|
|
138
|
+
if (same / normalized.length >= 0.7) {
|
|
139
|
+
matched = grp;
|
|
140
|
+
// Merge: posições conflitantes viram <*>
|
|
141
|
+
for (let k = 0; k < normalized.length; k++) {
|
|
142
|
+
if (grp.template[k] !== normalized[k]) {
|
|
143
|
+
grp.template[k] = VAR_PLACEHOLDER;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
break;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
if (matched) {
|
|
150
|
+
matched.count++;
|
|
151
|
+
if (matched.samples.length < MAX_SAMPLES_PER_TEMPLATE) {
|
|
152
|
+
matched.samples.push({ line: i + 1, text: raw.slice(0, 200) });
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
const grp = {
|
|
157
|
+
template: [...normalized],
|
|
158
|
+
count: 1,
|
|
159
|
+
first_line: i + 1,
|
|
160
|
+
samples: [{ line: i + 1, text: raw.slice(0, 200) }]
|
|
161
|
+
};
|
|
162
|
+
bucket.push(grp);
|
|
163
|
+
buckets.set(bucketKey, bucket);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
// Flatten todos os buckets
|
|
167
|
+
const all = [];
|
|
168
|
+
for (const bs of buckets.values())
|
|
169
|
+
for (const g of bs)
|
|
170
|
+
all.push(g);
|
|
171
|
+
return all;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* logCapsuleFromString — entrada principal.
|
|
175
|
+
*
|
|
176
|
+
* @param rawLogs conteúdo bruto [string com newlines]
|
|
177
|
+
* @param serviceHint service explicit [opcional, sobrescreve detect]
|
|
178
|
+
*/
|
|
179
|
+
export function logCapsuleFromString(rawLogs, serviceHint) {
|
|
180
|
+
const lines = rawLogs.split(/\r?\n/);
|
|
181
|
+
const totalLines = lines.length;
|
|
182
|
+
const service = serviceHint ?? detectService(lines);
|
|
183
|
+
// Window de tempo
|
|
184
|
+
let from = null;
|
|
185
|
+
let to = null;
|
|
186
|
+
for (let i = 0; i < Math.min(50, lines.length); i++) {
|
|
187
|
+
const ts = extractTimestamp(lines[i] ?? '');
|
|
188
|
+
if (ts) {
|
|
189
|
+
from = ts;
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
for (let i = lines.length - 1; i >= Math.max(0, lines.length - 50); i--) {
|
|
194
|
+
const ts = extractTimestamp(lines[i] ?? '');
|
|
195
|
+
if (ts) {
|
|
196
|
+
to = ts;
|
|
197
|
+
break;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
// Templating Drain
|
|
201
|
+
const groups = drainTemplating(lines);
|
|
202
|
+
// Classifica cada template usando a primeira sample dele
|
|
203
|
+
const templatesOut = groups
|
|
204
|
+
.map((g) => {
|
|
205
|
+
const first = g.samples[0]?.text ?? g.template.join(' ');
|
|
206
|
+
const role = classifyLine(first);
|
|
207
|
+
const pattern = g.template.join(' ');
|
|
208
|
+
return {
|
|
209
|
+
id: hashTemplate(g.template),
|
|
210
|
+
pattern: pattern.length > 200 ? pattern.slice(0, 197) + '...' : pattern,
|
|
211
|
+
count: g.count,
|
|
212
|
+
role,
|
|
213
|
+
first_seen_line: g.first_line,
|
|
214
|
+
samples: g.samples
|
|
215
|
+
};
|
|
216
|
+
})
|
|
217
|
+
.sort((a, b) => {
|
|
218
|
+
// Prioriza critical/error > warning > normal > noise
|
|
219
|
+
const roleScore = (r) => r === 'critical' ? 4 : r === 'error' ? 3 : r === 'warning' ? 2 : r === 'normal' ? 1 : 0;
|
|
220
|
+
const ra = roleScore(a.role);
|
|
221
|
+
const rb = roleScore(b.role);
|
|
222
|
+
if (ra !== rb)
|
|
223
|
+
return rb - ra;
|
|
224
|
+
// Empate: mais frequente primeiro [pra dar visibilidade ao "ruído"]
|
|
225
|
+
return b.count - a.count;
|
|
226
|
+
})
|
|
227
|
+
.slice(0, MAX_TEMPLATES_OUT);
|
|
228
|
+
// Extrai evidências críticas [linhas com role error+ ainda raw, com line number]
|
|
229
|
+
const evidence = [];
|
|
230
|
+
for (let i = 0; i < lines.length && evidence.length < MAX_EVIDENCE_OUT; i++) {
|
|
231
|
+
const line = lines[i];
|
|
232
|
+
if (!line || !line.trim())
|
|
233
|
+
continue;
|
|
234
|
+
const role = classifyLine(line);
|
|
235
|
+
if (role === 'critical' || role === 'error') {
|
|
236
|
+
evidence.push({
|
|
237
|
+
line: i + 1,
|
|
238
|
+
role: role,
|
|
239
|
+
text: line.slice(0, 300)
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
// Breakdown por level
|
|
244
|
+
const levelBreakdown = {
|
|
245
|
+
CRITICAL: 0, ERROR: 0, WARN: 0, INFO: 0, NOISE: 0
|
|
246
|
+
};
|
|
247
|
+
for (const g of groups) {
|
|
248
|
+
const role = classifyLine(g.samples[0]?.text ?? '');
|
|
249
|
+
if (role === 'critical')
|
|
250
|
+
levelBreakdown.CRITICAL += g.count;
|
|
251
|
+
else if (role === 'error')
|
|
252
|
+
levelBreakdown.ERROR += g.count;
|
|
253
|
+
else if (role === 'warning')
|
|
254
|
+
levelBreakdown.WARN += g.count;
|
|
255
|
+
else if (role === 'noise')
|
|
256
|
+
levelBreakdown.NOISE += g.count;
|
|
257
|
+
else
|
|
258
|
+
levelBreakdown.INFO += g.count;
|
|
259
|
+
}
|
|
260
|
+
// Compressão metrics
|
|
261
|
+
const outputTokens = estTokens(JSON.stringify({ templates: templatesOut, evidence }));
|
|
262
|
+
const inputTokens = estTokens(rawLogs);
|
|
263
|
+
const ratio = inputTokens > 0 ? inputTokens / Math.max(outputTokens, 1) : 1;
|
|
264
|
+
return {
|
|
265
|
+
service,
|
|
266
|
+
window: { from, to },
|
|
267
|
+
compression: {
|
|
268
|
+
input_lines: totalLines,
|
|
269
|
+
output_tokens: outputTokens,
|
|
270
|
+
ratio: Number(ratio.toFixed(1))
|
|
271
|
+
},
|
|
272
|
+
total_lines: totalLines,
|
|
273
|
+
templates: templatesOut,
|
|
274
|
+
evidence,
|
|
275
|
+
level_breakdown: levelBreakdown
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
/** Helper pro hook intercept ler de arquivo. */
|
|
279
|
+
export function logCapsuleFromFile(filePath, serviceHint) {
|
|
280
|
+
const raw = readFileSync(filePath, 'utf8');
|
|
281
|
+
return logCapsuleFromString(raw, serviceHint);
|
|
282
|
+
}
|
|
283
|
+
//# sourceMappingURL=logCapsule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logCapsule.js","sourceRoot":"","sources":["../../src/tools/logCapsule.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,sEAAsE;AACtE,MAAM,wBAAwB,GAAG,CAAC,CAAC,CAAK,6CAA6C;AACrF,MAAM,iBAAiB,GAAG,EAAE,CAAC,CAAY,4BAA4B;AACrE,MAAM,gBAAgB,GAAG,EAAE,CAAC,CAAa,4BAA4B;AACrE,MAAM,uBAAuB,GAAG,CAAC,CAAC,CAAO,uCAAuC;AAChF,MAAM,eAAe,GAAG,KAAK,CAAC;AAE9B,iCAAiC;AACjC,MAAM,WAAW,GAAG,uEAAuE,CAAC;AAC5F,MAAM,QAAQ,GAAG,8DAA8D,CAAC;AAChF,MAAM,UAAU,GAAG,gCAAgC,CAAC;AACpD,MAAM,YAAY,GAAG,iFAAiF,CAAC;AAEvG,uEAAuE;AACvE,MAAM,YAAY,GAAa;IAC7B,OAAO,EAA2C,aAAa;IAC/D,mBAAmB,EAA+B,yBAAyB;IAC3E,sBAAsB,EAA4B,OAAO;IACzD,oBAAoB,EAA8B,QAAQ;IAC1D,0BAA0B,EAAwB,WAAW;IAC7D,YAAY,EAAsC,QAAQ;IAC1D,cAAc,EAAoC,OAAO;IACzD,4BAA4B,EAAsB,QAAQ;IAC1D,6BAA6B,EAAqB,UAAU;IAC5D,YAAY,CAAsC,SAAS;CAC5D,CAAC;AAEF,SAAS,gBAAgB,CAAC,KAAa;IACrC,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;QAC9B,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;IAClC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AASD,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,UAAU,CAAC;IAC9C,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC;IACxC,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5C,kDAAkD;IAClD,IAAI,iEAAiE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACjF,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,aAAa,CAAC,KAAe;IACpC,+DAA+D;IAC/D,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QACtC,4DAA4D;QAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAC1D,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;QACjC,iCAAiC;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QACnD,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY;IACpC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACnC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACjC,CAAC;AAED,SAAS,YAAY,CAAC,MAAgB;IACpC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClF,CAAC;AAED,oCAAoC;AACpC,SAAS,SAAS,CAAC,CAAS;IAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACzC,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,eAAe,CAAC,KAAe;IACtC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAwB,CAAC;IAEhD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;YAAE,SAAS;QAClC,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAElC,oDAAoD;QACpD,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEhF,MAAM,SAAS,GAAG,GAAG,UAAU,CAAC,MAAM,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAE5C,4CAA4C;QAC5C,IAAI,OAAO,GAAsB,IAAI,CAAC;QACtC,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;YACzB,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM;gBAAE,SAAS;YACxD,IAAI,IAAI,GAAG,CAAC,CAAC;YACb,IAAI,IAAI,GAAG,CAAC,CAAC;YACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3C,MAAM,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC1B,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;gBACxB,IAAI,CAAC,KAAK,CAAC;oBAAE,IAAI,EAAE,CAAC;qBACf,IAAI,CAAC,KAAK,eAAe,IAAI,CAAC,KAAK,eAAe;oBAAE,IAAI,EAAE,CAAC;;oBAC3D,IAAI,EAAE,CAAC;YACd,CAAC;YACD,yDAAyD;YACzD,IAAI,IAAI,GAAG,UAAU,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;gBACpC,OAAO,GAAG,GAAG,CAAC;gBACd,yCAAyC;gBACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC3C,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;wBACtC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC;oBACpC,CAAC;gBACH,CAAC;gBACD,MAAM;YACR,CAAC;QACH,CAAC;QAED,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,wBAAwB,EAAE,CAAC;gBACtD,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAe;gBACtB,QAAQ,EAAE,CAAC,GAAG,UAAU,CAAC;gBACzB,KAAK,EAAE,CAAC;gBACR,UAAU,EAAE,CAAC,GAAG,CAAC;gBACjB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;aACpD,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,2BAA2B;IAC3B,MAAM,GAAG,GAAiB,EAAE,CAAC;IAC7B,KAAK,MAAM,EAAE,IAAI,OAAO,CAAC,MAAM,EAAE;QAAE,KAAK,MAAM,CAAC,IAAI,EAAE;YAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnE,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAe,EACf,WAAoB;IAEpB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;IAChC,MAAM,OAAO,GAAG,WAAW,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC;IAEpD,kBAAkB;IAClB,IAAI,IAAI,GAAkB,IAAI,CAAC;IAC/B,IAAI,EAAE,GAAkB,IAAI,CAAC;IAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACpD,MAAM,EAAE,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5C,IAAI,EAAE,EAAE,CAAC;YAAC,IAAI,GAAG,EAAE,CAAC;YAAC,MAAM;QAAC,CAAC;IAC/B,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACxE,MAAM,EAAE,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5C,IAAI,EAAE,EAAE,CAAC;YAAC,EAAE,GAAG,EAAE,CAAC;YAAC,MAAM;QAAC,CAAC;IAC7B,CAAC;IAED,mBAAmB;IACnB,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAEtC,yDAAyD;IACzD,MAAM,YAAY,GAAG,MAAM;SACxB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrC,OAAO;YACL,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC;YAC5B,OAAO,EAAE,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO;YACvE,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,IAAI;YACJ,eAAe,EAAE,CAAC,CAAC,UAAU;YAC7B,OAAO,EAAE,CAAC,CAAC,OAAO;SACnB,CAAC;IACJ,CAAC,CAAC;SACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACb,qDAAqD;QACrD,MAAM,SAAS,GAAG,CAAC,CAAS,EAAE,EAAE,CAC9B,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1F,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,EAAE,GAAG,EAAE,CAAC;QAC9B,oEAAoE;QACpE,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;IAC3B,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC;IAE/B,iFAAiF;IACjF,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,GAAG,gBAAgB,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5E,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,SAAS;QACpC,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YAC5C,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,CAAC,GAAG,CAAC;gBACX,IAAI,EAAE,IAA4B;gBAClC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;aACzB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,MAAM,cAAc,GAA2B;QAC7C,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;KAClD,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;QACpD,IAAI,IAAI,KAAK,UAAU;YAAE,cAAc,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC;aACvD,IAAI,IAAI,KAAK,OAAO;YAAE,cAAc,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC;aACtD,IAAI,IAAI,KAAK,SAAS;YAAE,cAAc,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC;aACvD,IAAI,IAAI,KAAK,OAAO;YAAE,cAAc,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC;;YACtD,cAAc,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC;IACtC,CAAC;IAED,qBAAqB;IACrB,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;IACtF,MAAM,WAAW,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE5E,OAAO;QACL,OAAO;QACP,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACpB,WAAW,EAAE;YACX,WAAW,EAAE,UAAU;YACvB,aAAa,EAAE,YAAY;YAC3B,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;SAChC;QACD,WAAW,EAAE,UAAU;QACvB,SAAS,EAAE,YAAY;QACvB,QAAQ;QACR,eAAe,EAAE,cAAc;KAChC,CAAC;AACJ,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,kBAAkB,CAAC,QAAgB,EAAE,WAAoB;IACvE,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC3C,OAAO,oBAAoB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* network_capsule — comprime HAR (HTTP Archive) do DevTools.
|
|
3
|
+
* Algoritmo puro, zero LLM, zero custo recorrente.
|
|
4
|
+
*
|
|
5
|
+
* Compressão típica: 50-100k tokens → 1-2k tokens (50-66×).
|
|
6
|
+
*
|
|
7
|
+
* Mecânica:
|
|
8
|
+
* 1. Parse JSON HAR
|
|
9
|
+
* 2. Sort por tempo total → top 10 slowest
|
|
10
|
+
* 3. Filter erros (4xx, 5xx, connection refused)
|
|
11
|
+
* 4. Agrega por host (count, total_ms, avg_ms)
|
|
12
|
+
* 5. Critical path — waterfall causal (req B começou depois de A terminar)
|
|
13
|
+
* 6. Blocking — reqs com timings.blocked > 100ms
|
|
14
|
+
*/
|
|
15
|
+
import type { NetworkCapsule } from '../types.js';
|
|
16
|
+
export declare function networkCapsuleFromFile(filePath: string): NetworkCapsule;
|
|
17
|
+
export declare function networkCapsule(harJson: string): NetworkCapsule;
|
|
18
|
+
//# sourceMappingURL=networkCapsule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"networkCapsule.d.ts","sourceRoot":"","sources":["../../src/tools/networkCapsule.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAwClD,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAGvE;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CA0D9D"}
|