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.
Files changed (84) hide show
  1. package/README.md +21 -0
  2. package/bin/nuxs-capsule-intercept.js +4 -0
  3. package/bin/nuxs-capsule.js +20 -0
  4. package/dist/install.d.ts +17 -0
  5. package/dist/install.d.ts.map +1 -0
  6. package/dist/install.js +243 -0
  7. package/dist/install.js.map +1 -0
  8. package/dist/intercept.d.ts +19 -0
  9. package/dist/intercept.d.ts.map +1 -0
  10. package/dist/intercept.js +232 -0
  11. package/dist/intercept.js.map +1 -0
  12. package/dist/lib/fileStat.d.ts +20 -0
  13. package/dist/lib/fileStat.d.ts.map +1 -0
  14. package/dist/lib/fileStat.js +71 -0
  15. package/dist/lib/fileStat.js.map +1 -0
  16. package/dist/lib/fingerprint.d.ts +10 -0
  17. package/dist/lib/fingerprint.d.ts.map +1 -0
  18. package/dist/lib/fingerprint.js +41 -0
  19. package/dist/lib/fingerprint.js.map +1 -0
  20. package/dist/lib/tokenCount.d.ts +13 -0
  21. package/dist/lib/tokenCount.d.ts.map +1 -0
  22. package/dist/lib/tokenCount.js +32 -0
  23. package/dist/lib/tokenCount.js.map +1 -0
  24. package/dist/license/check.d.ts +14 -0
  25. package/dist/license/check.d.ts.map +1 -0
  26. package/dist/license/check.js +141 -0
  27. package/dist/license/check.js.map +1 -0
  28. package/dist/providers/llmClient.d.ts +20 -0
  29. package/dist/providers/llmClient.d.ts.map +1 -0
  30. package/dist/providers/llmClient.js +40 -0
  31. package/dist/providers/llmClient.js.map +1 -0
  32. package/dist/server.d.ts +10 -0
  33. package/dist/server.d.ts.map +1 -0
  34. package/dist/server.js +268 -0
  35. package/dist/server.js.map +1 -0
  36. package/dist/setup.d.ts +14 -0
  37. package/dist/setup.d.ts.map +1 -0
  38. package/dist/setup.js +135 -0
  39. package/dist/setup.js.map +1 -0
  40. package/dist/telemetry/usage.d.ts +19 -0
  41. package/dist/telemetry/usage.d.ts.map +1 -0
  42. package/dist/telemetry/usage.js +114 -0
  43. package/dist/telemetry/usage.js.map +1 -0
  44. package/dist/tools/apiCapsule.d.ts +16 -0
  45. package/dist/tools/apiCapsule.d.ts.map +1 -0
  46. package/dist/tools/apiCapsule.js +169 -0
  47. package/dist/tools/apiCapsule.js.map +1 -0
  48. package/dist/tools/eventsCapsule.d.ts +15 -0
  49. package/dist/tools/eventsCapsule.d.ts.map +1 -0
  50. package/dist/tools/eventsCapsule.js +72 -0
  51. package/dist/tools/eventsCapsule.js.map +1 -0
  52. package/dist/tools/logCapsule.d.ts +38 -0
  53. package/dist/tools/logCapsule.d.ts.map +1 -0
  54. package/dist/tools/logCapsule.js +283 -0
  55. package/dist/tools/logCapsule.js.map +1 -0
  56. package/dist/tools/networkCapsule.d.ts +18 -0
  57. package/dist/tools/networkCapsule.d.ts.map +1 -0
  58. package/dist/tools/networkCapsule.js +151 -0
  59. package/dist/tools/networkCapsule.js.map +1 -0
  60. package/dist/tools/sessionCapsule.d.ts +21 -0
  61. package/dist/tools/sessionCapsule.d.ts.map +1 -0
  62. package/dist/tools/sessionCapsule.js +174 -0
  63. package/dist/tools/sessionCapsule.js.map +1 -0
  64. package/dist/tools/sqlCapsule.d.ts +17 -0
  65. package/dist/tools/sqlCapsule.d.ts.map +1 -0
  66. package/dist/tools/sqlCapsule.js +144 -0
  67. package/dist/tools/sqlCapsule.js.map +1 -0
  68. package/dist/tools/stackCapsule.d.ts +9 -0
  69. package/dist/tools/stackCapsule.d.ts.map +1 -0
  70. package/dist/tools/stackCapsule.js +132 -0
  71. package/dist/tools/stackCapsule.js.map +1 -0
  72. package/dist/tools/threadsCapsule.d.ts +14 -0
  73. package/dist/tools/threadsCapsule.d.ts.map +1 -0
  74. package/dist/tools/threadsCapsule.js +77 -0
  75. package/dist/tools/threadsCapsule.js.map +1 -0
  76. package/dist/types.d.ts +199 -0
  77. package/dist/types.d.ts.map +1 -0
  78. package/dist/types.js +9 -0
  79. package/dist/types.js.map +1 -0
  80. package/dist/wrap.d.ts +14 -0
  81. package/dist/wrap.d.ts.map +1 -0
  82. package/dist/wrap.js +100 -0
  83. package/dist/wrap.js.map +1 -0
  84. 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":"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"}
@@ -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":"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"}
@@ -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"}