@vainplex/openclaw-cortex 0.3.0 → 0.4.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 +89 -55
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +3 -0
- package/dist/src/config.js.map +1 -1
- package/dist/src/hooks.d.ts.map +1 -1
- package/dist/src/hooks.js +13 -1
- package/dist/src/hooks.js.map +1 -1
- package/dist/src/trace-analyzer/analyzer.d.ts +59 -0
- package/dist/src/trace-analyzer/analyzer.d.ts.map +1 -0
- package/dist/src/trace-analyzer/analyzer.js +175 -0
- package/dist/src/trace-analyzer/analyzer.js.map +1 -0
- package/dist/src/trace-analyzer/chain-reconstructor.d.ts +52 -0
- package/dist/src/trace-analyzer/chain-reconstructor.d.ts.map +1 -0
- package/dist/src/trace-analyzer/chain-reconstructor.js +190 -0
- package/dist/src/trace-analyzer/chain-reconstructor.js.map +1 -0
- package/dist/src/trace-analyzer/classifier.d.ts +28 -0
- package/dist/src/trace-analyzer/classifier.d.ts.map +1 -0
- package/dist/src/trace-analyzer/classifier.js +271 -0
- package/dist/src/trace-analyzer/classifier.js.map +1 -0
- package/dist/src/trace-analyzer/config.d.ts +78 -0
- package/dist/src/trace-analyzer/config.d.ts.map +1 -0
- package/dist/src/trace-analyzer/config.js +161 -0
- package/dist/src/trace-analyzer/config.js.map +1 -0
- package/dist/src/trace-analyzer/events.d.ts +70 -0
- package/dist/src/trace-analyzer/events.d.ts.map +1 -0
- package/dist/src/trace-analyzer/events.js +228 -0
- package/dist/src/trace-analyzer/events.js.map +1 -0
- package/dist/src/trace-analyzer/hooks.d.ts +22 -0
- package/dist/src/trace-analyzer/hooks.d.ts.map +1 -0
- package/dist/src/trace-analyzer/hooks.js +151 -0
- package/dist/src/trace-analyzer/hooks.js.map +1 -0
- package/dist/src/trace-analyzer/index.d.ts +32 -0
- package/dist/src/trace-analyzer/index.d.ts.map +1 -0
- package/dist/src/trace-analyzer/index.js +30 -0
- package/dist/src/trace-analyzer/index.js.map +1 -0
- package/dist/src/trace-analyzer/nats-trace-source.d.ts +10 -0
- package/dist/src/trace-analyzer/nats-trace-source.d.ts.map +1 -0
- package/dist/src/trace-analyzer/nats-trace-source.js +151 -0
- package/dist/src/trace-analyzer/nats-trace-source.js.map +1 -0
- package/dist/src/trace-analyzer/output-generator.d.ts +29 -0
- package/dist/src/trace-analyzer/output-generator.d.ts.map +1 -0
- package/dist/src/trace-analyzer/output-generator.js +142 -0
- package/dist/src/trace-analyzer/output-generator.js.map +1 -0
- package/dist/src/trace-analyzer/redactor.d.ts +14 -0
- package/dist/src/trace-analyzer/redactor.d.ts.map +1 -0
- package/dist/src/trace-analyzer/redactor.js +137 -0
- package/dist/src/trace-analyzer/redactor.js.map +1 -0
- package/dist/src/trace-analyzer/report.d.ts +93 -0
- package/dist/src/trace-analyzer/report.d.ts.map +1 -0
- package/dist/src/trace-analyzer/report.js +108 -0
- package/dist/src/trace-analyzer/report.js.map +1 -0
- package/dist/src/trace-analyzer/signals/correction.d.ts +11 -0
- package/dist/src/trace-analyzer/signals/correction.d.ts.map +1 -0
- package/dist/src/trace-analyzer/signals/correction.js +54 -0
- package/dist/src/trace-analyzer/signals/correction.js.map +1 -0
- package/dist/src/trace-analyzer/signals/dissatisfied.d.ts +11 -0
- package/dist/src/trace-analyzer/signals/dissatisfied.d.ts.map +1 -0
- package/dist/src/trace-analyzer/signals/dissatisfied.js +60 -0
- package/dist/src/trace-analyzer/signals/dissatisfied.js.map +1 -0
- package/dist/src/trace-analyzer/signals/doom-loop.d.ts +13 -0
- package/dist/src/trace-analyzer/signals/doom-loop.d.ts.map +1 -0
- package/dist/src/trace-analyzer/signals/doom-loop.js +156 -0
- package/dist/src/trace-analyzer/signals/doom-loop.js.map +1 -0
- package/dist/src/trace-analyzer/signals/hallucination.d.ts +11 -0
- package/dist/src/trace-analyzer/signals/hallucination.d.ts.map +1 -0
- package/dist/src/trace-analyzer/signals/hallucination.js +67 -0
- package/dist/src/trace-analyzer/signals/hallucination.js.map +1 -0
- package/dist/src/trace-analyzer/signals/index.d.ts +16 -0
- package/dist/src/trace-analyzer/signals/index.d.ts.map +1 -0
- package/dist/src/trace-analyzer/signals/index.js +92 -0
- package/dist/src/trace-analyzer/signals/index.js.map +1 -0
- package/dist/src/trace-analyzer/signals/lang/index.d.ts +4 -0
- package/dist/src/trace-analyzer/signals/lang/index.d.ts.map +1 -0
- package/dist/src/trace-analyzer/signals/lang/index.js +2 -0
- package/dist/src/trace-analyzer/signals/lang/index.js.map +1 -0
- package/dist/src/trace-analyzer/signals/lang/registry.d.ts +41 -0
- package/dist/src/trace-analyzer/signals/lang/registry.d.ts.map +1 -0
- package/dist/src/trace-analyzer/signals/lang/registry.js +111 -0
- package/dist/src/trace-analyzer/signals/lang/registry.js.map +1 -0
- package/dist/src/trace-analyzer/signals/lang/signal-lang-de.d.ts +10 -0
- package/dist/src/trace-analyzer/signals/lang/signal-lang-de.d.ts.map +1 -0
- package/dist/src/trace-analyzer/signals/lang/signal-lang-de.js +60 -0
- package/dist/src/trace-analyzer/signals/lang/signal-lang-de.js.map +1 -0
- package/dist/src/trace-analyzer/signals/lang/signal-lang-en.d.ts +4 -0
- package/dist/src/trace-analyzer/signals/lang/signal-lang-en.d.ts.map +1 -0
- package/dist/src/trace-analyzer/signals/lang/signal-lang-en.js +55 -0
- package/dist/src/trace-analyzer/signals/lang/signal-lang-en.js.map +1 -0
- package/dist/src/trace-analyzer/signals/lang/signal-lang-es.d.ts +9 -0
- package/dist/src/trace-analyzer/signals/lang/signal-lang-es.d.ts.map +1 -0
- package/dist/src/trace-analyzer/signals/lang/signal-lang-es.js +59 -0
- package/dist/src/trace-analyzer/signals/lang/signal-lang-es.js.map +1 -0
- package/dist/src/trace-analyzer/signals/lang/signal-lang-fr.d.ts +10 -0
- package/dist/src/trace-analyzer/signals/lang/signal-lang-fr.d.ts.map +1 -0
- package/dist/src/trace-analyzer/signals/lang/signal-lang-fr.js +60 -0
- package/dist/src/trace-analyzer/signals/lang/signal-lang-fr.js.map +1 -0
- package/dist/src/trace-analyzer/signals/lang/signal-lang-it.d.ts +9 -0
- package/dist/src/trace-analyzer/signals/lang/signal-lang-it.d.ts.map +1 -0
- package/dist/src/trace-analyzer/signals/lang/signal-lang-it.js +59 -0
- package/dist/src/trace-analyzer/signals/lang/signal-lang-it.js.map +1 -0
- package/dist/src/trace-analyzer/signals/lang/signal-lang-ja.d.ts +9 -0
- package/dist/src/trace-analyzer/signals/lang/signal-lang-ja.d.ts.map +1 -0
- package/dist/src/trace-analyzer/signals/lang/signal-lang-ja.js +59 -0
- package/dist/src/trace-analyzer/signals/lang/signal-lang-ja.js.map +1 -0
- package/dist/src/trace-analyzer/signals/lang/signal-lang-ko.d.ts +9 -0
- package/dist/src/trace-analyzer/signals/lang/signal-lang-ko.d.ts.map +1 -0
- package/dist/src/trace-analyzer/signals/lang/signal-lang-ko.js +59 -0
- package/dist/src/trace-analyzer/signals/lang/signal-lang-ko.js.map +1 -0
- package/dist/src/trace-analyzer/signals/lang/signal-lang-pt.d.ts +9 -0
- package/dist/src/trace-analyzer/signals/lang/signal-lang-pt.d.ts.map +1 -0
- package/dist/src/trace-analyzer/signals/lang/signal-lang-pt.js +59 -0
- package/dist/src/trace-analyzer/signals/lang/signal-lang-pt.js.map +1 -0
- package/dist/src/trace-analyzer/signals/lang/signal-lang-ru.d.ts +9 -0
- package/dist/src/trace-analyzer/signals/lang/signal-lang-ru.d.ts.map +1 -0
- package/dist/src/trace-analyzer/signals/lang/signal-lang-ru.js +59 -0
- package/dist/src/trace-analyzer/signals/lang/signal-lang-ru.js.map +1 -0
- package/dist/src/trace-analyzer/signals/lang/signal-lang-zh.d.ts +8 -0
- package/dist/src/trace-analyzer/signals/lang/signal-lang-zh.d.ts.map +1 -0
- package/dist/src/trace-analyzer/signals/lang/signal-lang-zh.js +58 -0
- package/dist/src/trace-analyzer/signals/lang/signal-lang-zh.js.map +1 -0
- package/dist/src/trace-analyzer/signals/lang/types.d.ts +76 -0
- package/dist/src/trace-analyzer/signals/lang/types.d.ts.map +1 -0
- package/dist/src/trace-analyzer/signals/lang/types.js +12 -0
- package/dist/src/trace-analyzer/signals/lang/types.js.map +1 -0
- package/dist/src/trace-analyzer/signals/repeat-fail.d.ts +24 -0
- package/dist/src/trace-analyzer/signals/repeat-fail.d.ts.map +1 -0
- package/dist/src/trace-analyzer/signals/repeat-fail.js +112 -0
- package/dist/src/trace-analyzer/signals/repeat-fail.js.map +1 -0
- package/dist/src/trace-analyzer/signals/tool-fail.d.ts +10 -0
- package/dist/src/trace-analyzer/signals/tool-fail.d.ts.map +1 -0
- package/dist/src/trace-analyzer/signals/tool-fail.js +99 -0
- package/dist/src/trace-analyzer/signals/tool-fail.js.map +1 -0
- package/dist/src/trace-analyzer/signals/types.d.ts +54 -0
- package/dist/src/trace-analyzer/signals/types.d.ts.map +1 -0
- package/dist/src/trace-analyzer/signals/types.js +9 -0
- package/dist/src/trace-analyzer/signals/types.js.map +1 -0
- package/dist/src/trace-analyzer/signals/unverified-claim.d.ts +11 -0
- package/dist/src/trace-analyzer/signals/unverified-claim.d.ts.map +1 -0
- package/dist/src/trace-analyzer/signals/unverified-claim.js +84 -0
- package/dist/src/trace-analyzer/signals/unverified-claim.js.map +1 -0
- package/dist/src/trace-analyzer/trace-source.d.ts +31 -0
- package/dist/src/trace-analyzer/trace-source.d.ts.map +1 -0
- package/dist/src/trace-analyzer/trace-source.js +5 -0
- package/dist/src/trace-analyzer/trace-source.js.map +1 -0
- package/dist/src/trace-analyzer/util.d.ts +17 -0
- package/dist/src/trace-analyzer/util.d.ts.map +1 -0
- package/dist/src/trace-analyzer/util.js +26 -0
- package/dist/src/trace-analyzer/util.js.map +1 -0
- package/dist/src/types.d.ts +2 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -32,8 +32,9 @@ The LLM runs **on top of regex** — it enhances, never replaces. If the LLM is
|
|
|
32
32
|
Try the interactive demo — it simulates a real bilingual dev conversation and shows every Cortex feature in action:
|
|
33
33
|
|
|
34
34
|
```bash
|
|
35
|
-
git clone https://github.com/alberthild/openclaw
|
|
36
|
-
cd openclaw-cortex
|
|
35
|
+
git clone https://github.com/alberthild/vainplex-openclaw.git
|
|
36
|
+
cd vainplex-openclaw/packages/openclaw-cortex
|
|
37
|
+
npm install
|
|
37
38
|
npx tsx demo/demo.ts
|
|
38
39
|
```
|
|
39
40
|
|
|
@@ -200,52 +201,60 @@ Or clone directly:
|
|
|
200
201
|
|
|
201
202
|
```bash
|
|
202
203
|
cd ~/.openclaw/extensions
|
|
203
|
-
git clone https://github.com/alberthild/openclaw
|
|
204
|
-
cd openclaw-cortex
|
|
204
|
+
git clone https://github.com/alberthild/vainplex-openclaw.git
|
|
205
|
+
cd vainplex-openclaw/packages/openclaw-cortex
|
|
206
|
+
npm install && npm run build
|
|
205
207
|
```
|
|
206
208
|
|
|
207
209
|
## Configure
|
|
208
210
|
|
|
209
|
-
Add to your OpenClaw config:
|
|
211
|
+
Add to your OpenClaw config (`openclaw.json`):
|
|
210
212
|
|
|
211
213
|
```json
|
|
212
214
|
{
|
|
213
215
|
"plugins": {
|
|
214
|
-
"
|
|
215
|
-
"enabled": true
|
|
216
|
-
"patterns": {
|
|
217
|
-
"language": "both"
|
|
218
|
-
},
|
|
219
|
-
"threadTracker": {
|
|
220
|
-
"enabled": true,
|
|
221
|
-
"pruneDays": 7,
|
|
222
|
-
"maxThreads": 50
|
|
223
|
-
},
|
|
224
|
-
"decisionTracker": {
|
|
225
|
-
"enabled": true,
|
|
226
|
-
"maxDecisions": 100,
|
|
227
|
-
"dedupeWindowHours": 24
|
|
228
|
-
},
|
|
229
|
-
"bootContext": {
|
|
230
|
-
"enabled": true,
|
|
231
|
-
"maxChars": 16000,
|
|
232
|
-
"onSessionStart": true,
|
|
233
|
-
"maxThreadsInBoot": 7,
|
|
234
|
-
"maxDecisionsInBoot": 10,
|
|
235
|
-
"decisionRecencyDays": 14
|
|
236
|
-
},
|
|
237
|
-
"preCompaction": {
|
|
238
|
-
"enabled": true,
|
|
239
|
-
"maxSnapshotMessages": 15
|
|
240
|
-
},
|
|
241
|
-
"narrative": {
|
|
242
|
-
"enabled": true
|
|
243
|
-
}
|
|
216
|
+
"entries": {
|
|
217
|
+
"openclaw-cortex": { "enabled": true }
|
|
244
218
|
}
|
|
245
219
|
}
|
|
246
220
|
}
|
|
247
221
|
```
|
|
248
222
|
|
|
223
|
+
Then create `~/.openclaw/plugins/openclaw-cortex/config.json`:
|
|
224
|
+
|
|
225
|
+
```json
|
|
226
|
+
{
|
|
227
|
+
"patterns": {
|
|
228
|
+
"language": "all"
|
|
229
|
+
},
|
|
230
|
+
"threadTracker": {
|
|
231
|
+
"enabled": true,
|
|
232
|
+
"pruneDays": 7,
|
|
233
|
+
"maxThreads": 50
|
|
234
|
+
},
|
|
235
|
+
"decisionTracker": {
|
|
236
|
+
"enabled": true,
|
|
237
|
+
"maxDecisions": 100,
|
|
238
|
+
"dedupeWindowHours": 24
|
|
239
|
+
},
|
|
240
|
+
"bootContext": {
|
|
241
|
+
"enabled": true,
|
|
242
|
+
"maxChars": 16000,
|
|
243
|
+
"onSessionStart": true,
|
|
244
|
+
"maxThreadsInBoot": 7,
|
|
245
|
+
"maxDecisionsInBoot": 10,
|
|
246
|
+
"decisionRecencyDays": 14
|
|
247
|
+
},
|
|
248
|
+
"preCompaction": {
|
|
249
|
+
"enabled": true,
|
|
250
|
+
"maxSnapshotMessages": 15
|
|
251
|
+
},
|
|
252
|
+
"narrative": {
|
|
253
|
+
"enabled": true
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
```
|
|
257
|
+
|
|
249
258
|
### LLM Enhancement (optional)
|
|
250
259
|
|
|
251
260
|
Add an `llm` section to enable AI-powered analysis on top of regex:
|
|
@@ -319,15 +328,44 @@ Restart OpenClaw after configuring.
|
|
|
319
328
|
└── hot-snapshot.md # Pre-compaction snapshot
|
|
320
329
|
```
|
|
321
330
|
|
|
322
|
-
### Pattern Languages
|
|
331
|
+
### Pattern Languages (v0.3.0)
|
|
332
|
+
|
|
333
|
+
Thread and decision detection supports **10 languages** out of the box:
|
|
323
334
|
|
|
324
|
-
|
|
335
|
+
| Language | Code | Decision | Closure | Wait | Mood |
|
|
336
|
+
|----------|------|----------|---------|------|------|
|
|
337
|
+
| English | `en` | "we decided", "let's do", "the plan is" | "is done", "fixed ✅" | "waiting for", "blocked by" | ✅ |
|
|
338
|
+
| German | `de` | "wir machen", "beschlossen" | "erledigt", "gefixt" | "warte auf" | ✅ |
|
|
339
|
+
| French | `fr` | "nous avons décidé", "on fait" | "c'est fait", "résolu" | "en attente de" | ✅ |
|
|
340
|
+
| Spanish | `es` | "decidimos", "el plan es" | "está hecho", "resuelto" | "esperando" | ✅ |
|
|
341
|
+
| Portuguese | `pt` | "decidimos", "o plano é" | "está feito", "resolvido" | "aguardando" | ✅ |
|
|
342
|
+
| Italian | `it` | "abbiamo deciso", "il piano è" | "è fatto", "risolto" | "in attesa di" | ✅ |
|
|
343
|
+
| Chinese | `zh` | "我们决定", "计划是" | "已完成", "已解决" | "等待", "阻塞" | ✅ |
|
|
344
|
+
| Japanese | `ja` | "決定しました", "方針は" | "完了", "解決済み" | "待ち" | ✅ |
|
|
345
|
+
| Korean | `ko` | "결정했습니다", "계획은" | "완료", "해결" | "대기 중" | ✅ |
|
|
346
|
+
| Russian | `ru` | "мы решили", "план такой" | "готово", "исправлено" | "ждём", "заблокировано" | ✅ |
|
|
325
347
|
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
348
|
+
Configure via `patternLanguage`:
|
|
349
|
+
```jsonc
|
|
350
|
+
"both" // backward-compat: EN + DE
|
|
351
|
+
"all" // all 10 languages
|
|
352
|
+
["en", "fr", "es"] // specific languages
|
|
353
|
+
"de" // single language
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
**Custom patterns** — add your own via config:
|
|
357
|
+
```json
|
|
358
|
+
{
|
|
359
|
+
"patterns": {
|
|
360
|
+
"language": "all",
|
|
361
|
+
"custom": {
|
|
362
|
+
"mode": "extend",
|
|
363
|
+
"decision": ["my custom pattern"],
|
|
364
|
+
"close": ["zakończone"]
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
```
|
|
331
369
|
|
|
332
370
|
### LLM Enhancement Flow
|
|
333
371
|
|
|
@@ -359,7 +397,7 @@ The LLM sees a conversation snippet (configurable batch size) and returns:
|
|
|
359
397
|
|
|
360
398
|
```bash
|
|
361
399
|
npm install
|
|
362
|
-
npm test #
|
|
400
|
+
npm test # 516 tests
|
|
363
401
|
npm run typecheck # TypeScript strict mode
|
|
364
402
|
npm run build # Compile to dist/
|
|
365
403
|
```
|
|
@@ -371,7 +409,7 @@ npm run build # Compile to dist/
|
|
|
371
409
|
- LLM enhancement: async, batched, fire-and-forget (never blocks hooks)
|
|
372
410
|
- Atomic file writes via `.tmp` + rename
|
|
373
411
|
- Noise filter prevents garbage threads from polluting state
|
|
374
|
-
- Tested with
|
|
412
|
+
- Tested with 516 unit + integration tests
|
|
375
413
|
|
|
376
414
|
## Architecture
|
|
377
415
|
|
|
@@ -383,15 +421,11 @@ MIT — see [LICENSE](LICENSE)
|
|
|
383
421
|
|
|
384
422
|
## Part of the Vainplex Plugin Suite
|
|
385
423
|
|
|
386
|
-
|
|
387
|
-
|---|--------|--------|-------------|
|
|
388
|
-
| 1 | [@vainplex/nats-eventstore](https://github.com/alberthild/openclaw-nats-eventstore) | ✅ Published | NATS JetStream event persistence |
|
|
389
|
-
| 2 | **@vainplex/openclaw-cortex** | ✅ Published | Conversation intelligence — threads, decisions, boot context (this plugin) |
|
|
390
|
-
| 3 | [@vainplex/openclaw-knowledge-engine](https://github.com/alberthild/openclaw-knowledge-engine) | ✅ Published | Real-time knowledge extraction |
|
|
391
|
-
| 4 | @vainplex/openclaw-governance | 📋 Planned | Policy enforcement + guardrails |
|
|
392
|
-
| 5 | @vainplex/openclaw-memory-engine | 📋 Planned | Unified memory layer |
|
|
393
|
-
| 6 | @vainplex/openclaw-health-monitor | 📋 Planned | System health + auto-healing |
|
|
424
|
+
All plugins live in one monorepo: [alberthild/vainplex-openclaw](https://github.com/alberthild/vainplex-openclaw)
|
|
394
425
|
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
426
|
+
| # | Plugin | Version | Description |
|
|
427
|
+
|---|--------|---------|-------------|
|
|
428
|
+
| 1 | [@vainplex/nats-eventstore](https://github.com/alberthild/vainplex-openclaw/tree/main/packages/openclaw-nats-eventstore) | 0.2.1 | NATS JetStream event persistence + audit trail |
|
|
429
|
+
| 2 | **@vainplex/openclaw-cortex** | **0.3.1** | Conversation intelligence — threads, decisions, boot context, 10 languages (this plugin) |
|
|
430
|
+
| 3 | [@vainplex/openclaw-knowledge-engine](https://github.com/alberthild/vainplex-openclaw/tree/main/packages/openclaw-knowledge-engine) | 0.1.3 | Real-time fact extraction from conversations |
|
|
431
|
+
| 4 | [@vainplex/openclaw-governance](https://github.com/alberthild/vainplex-openclaw/tree/main/packages/openclaw-governance) | 0.3.1 | Policy-as-code — trust scoring, audit trail, production safeguards |
|
package/dist/src/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,eAAO,MAAM,QAAQ,EAAE,YAwCtB,CAAC;AA6CF,wBAAgB,aAAa,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY,CAsDlF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,YAAY,EACpB,GAAG,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9B,MAAM,CAIR"}
|
package/dist/src/config.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { TRACE_ANALYZER_DEFAULTS, resolveTraceAnalyzerConfig } from "./trace-analyzer/config.js";
|
|
1
2
|
export const DEFAULTS = {
|
|
2
3
|
enabled: true,
|
|
3
4
|
workspace: "",
|
|
@@ -37,6 +38,7 @@ export const DEFAULTS = {
|
|
|
37
38
|
timeoutMs: 15000,
|
|
38
39
|
batchSize: 3,
|
|
39
40
|
},
|
|
41
|
+
traceAnalyzer: TRACE_ANALYZER_DEFAULTS,
|
|
40
42
|
};
|
|
41
43
|
function bool(value, fallback) {
|
|
42
44
|
return typeof value === "boolean" ? value : fallback;
|
|
@@ -129,6 +131,7 @@ export function resolveConfig(pluginConfig) {
|
|
|
129
131
|
timeoutMs: int(lm.timeoutMs, DEFAULTS.llm.timeoutMs),
|
|
130
132
|
batchSize: int(lm.batchSize, DEFAULTS.llm.batchSize),
|
|
131
133
|
},
|
|
134
|
+
traceAnalyzer: resolveTraceAnalyzerConfig((raw.traceAnalyzer ?? undefined)),
|
|
132
135
|
};
|
|
133
136
|
}
|
|
134
137
|
/**
|
package/dist/src/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/src/hooks.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,YAAY,EAGb,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,YAAY,EAGb,MAAM,YAAY,CAAC;AA4HpB;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,iBAAiB,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAuBtF"}
|
package/dist/src/hooks.js
CHANGED
|
@@ -4,6 +4,7 @@ import { DecisionTracker } from "./decision-tracker.js";
|
|
|
4
4
|
import { BootContextGenerator } from "./boot-context.js";
|
|
5
5
|
import { PreCompaction } from "./pre-compaction.js";
|
|
6
6
|
import { LlmEnhancer } from "./llm-enhance.js";
|
|
7
|
+
import { registerTraceAnalyzerHooks, cleanupTraceAnalyzerHooks } from "./trace-analyzer/index.js";
|
|
7
8
|
/**
|
|
8
9
|
* Extract message content from a hook event using the fallback chain.
|
|
9
10
|
*/
|
|
@@ -119,6 +120,17 @@ export function registerCortexHooks(api, config) {
|
|
|
119
120
|
registerMessageHooks(api, config, state);
|
|
120
121
|
registerSessionHooks(api, config, state);
|
|
121
122
|
registerCompactionHooks(api, config, state);
|
|
122
|
-
|
|
123
|
+
// Trace Analyzer — conditional registration (R-010, R-013, R-028)
|
|
124
|
+
if (config.traceAnalyzer?.enabled) {
|
|
125
|
+
const taState = { timer: null, analyzer: null };
|
|
126
|
+
registerTraceAnalyzerHooks(api, config, taState);
|
|
127
|
+
// Register cleanup as a service so it runs on plugin stop
|
|
128
|
+
api.registerService({
|
|
129
|
+
id: "trace-analyzer",
|
|
130
|
+
start: async () => { },
|
|
131
|
+
stop: async () => { cleanupTraceAnalyzerHooks(taState); },
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
api.logger.info(`[cortex] Hooks registered — threads:${config.threadTracker.enabled} decisions:${config.decisionTracker.enabled} boot:${config.bootContext.enabled} compaction:${config.preCompaction.enabled} llm:${config.llm.enabled}${config.llm.enabled ? ` (${config.llm.model}@${config.llm.endpoint})` : ""} trace:${config.traceAnalyzer?.enabled ?? false}`);
|
|
123
135
|
}
|
|
124
136
|
//# sourceMappingURL=hooks.js.map
|
package/dist/src/hooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/hooks.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAoB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { PluginLogger } from "../types.js";
|
|
2
|
+
import type { LlmConfig } from "../llm-enhance.js";
|
|
3
|
+
import type { TraceSource } from "./trace-source.js";
|
|
4
|
+
import type { TraceAnalyzerConfig } from "./config.js";
|
|
5
|
+
import type { AnalysisReport, ProcessingState } from "./report.js";
|
|
6
|
+
import type { SignalPatternSet } from "./signals/index.js";
|
|
7
|
+
export type TraceAnalyzerRunOpts = {
|
|
8
|
+
/** If true, reprocesses all events from the beginning. */
|
|
9
|
+
full?: boolean;
|
|
10
|
+
};
|
|
11
|
+
export type TraceAnalyzerStatus = {
|
|
12
|
+
lastRun: string | null;
|
|
13
|
+
findings: number;
|
|
14
|
+
state: Partial<ProcessingState>;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* TraceAnalyzer — orchestrates the 3-stage analysis pipeline.
|
|
18
|
+
*
|
|
19
|
+
* Create via constructor, then call `run()` for a full analysis.
|
|
20
|
+
* The analyzer manages its own processing state for incremental runs.
|
|
21
|
+
*/
|
|
22
|
+
export declare class TraceAnalyzer {
|
|
23
|
+
private readonly config;
|
|
24
|
+
private readonly topLevelLlm;
|
|
25
|
+
private readonly workspace;
|
|
26
|
+
private readonly logger;
|
|
27
|
+
private readonly createSource;
|
|
28
|
+
/** Pre-loaded signal patterns (if provided). */
|
|
29
|
+
private signalPatterns;
|
|
30
|
+
constructor(params: {
|
|
31
|
+
config: TraceAnalyzerConfig;
|
|
32
|
+
logger: PluginLogger;
|
|
33
|
+
workspace: string;
|
|
34
|
+
topLevelLlm: LlmConfig;
|
|
35
|
+
createSource?: () => Promise<TraceSource | null>;
|
|
36
|
+
/** Pre-loaded signal patterns. If not provided, falls back to EN+DE. */
|
|
37
|
+
signalPatterns?: SignalPatternSet;
|
|
38
|
+
});
|
|
39
|
+
/**
|
|
40
|
+
* Execute the full analysis pipeline.
|
|
41
|
+
*
|
|
42
|
+
* @param opts.full — If true, reprocess all events from the beginning.
|
|
43
|
+
* @returns The analysis report.
|
|
44
|
+
*/
|
|
45
|
+
run(opts?: TraceAnalyzerRunOpts): Promise<AnalysisReport>;
|
|
46
|
+
/**
|
|
47
|
+
* Get the current analyzer status.
|
|
48
|
+
*/
|
|
49
|
+
getStatus(): Promise<TraceAnalyzerStatus>;
|
|
50
|
+
/** Steps 2-3: Fetch events and reconstruct conversation chains. */
|
|
51
|
+
private fetchAndReconstructChains;
|
|
52
|
+
/** Steps 4-6: Detect signals and optionally classify with LLM. */
|
|
53
|
+
private detectAndClassify;
|
|
54
|
+
/** Steps 7-8: Generate outputs, assemble report, persist. */
|
|
55
|
+
private generateAndPersist;
|
|
56
|
+
private executePipeline;
|
|
57
|
+
private loadState;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../../../src/trace-analyzer/analyzer.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAY,MAAM,aAAa,CAAC;AAIjE,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAInE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AA0C3D,MAAM,MAAM,oBAAoB,GAAG;IACjC,0DAA0D;IAC1D,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;CACjC,CAAC;AAEF;;;;;GAKG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAY;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6C;IAC1E,gDAAgD;IAChD,OAAO,CAAC,cAAc,CAA+B;gBAEzC,MAAM,EAAE;QAClB,MAAM,EAAE,mBAAmB,CAAC;QAC5B,MAAM,EAAE,YAAY,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,SAAS,CAAC;QACvB,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;QACjD,wEAAwE;QACxE,cAAc,CAAC,EAAE,gBAAgB,CAAC;KACnC;IASD;;;;;OAKG;IACG,GAAG,CAAC,IAAI,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,cAAc,CAAC;IAiC/D;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAW/C,mEAAmE;YACrD,yBAAyB;IAqBvC,kEAAkE;YACpD,iBAAiB;IAoB/B,6DAA6D;IAC7D,OAAO,CAAC,kBAAkB;YAsBZ,eAAe;IAY7B,OAAO,CAAC,SAAS;CAMlB"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// Trace Analyzer — Orchestrator (Stage 1 → 2 → 3)
|
|
3
|
+
// ============================================================
|
|
4
|
+
//
|
|
5
|
+
// The TraceAnalyzer class orchestrates the full analysis pipeline:
|
|
6
|
+
// 1. Connect to TraceSource
|
|
7
|
+
// 2. Fetch events (incremental or full)
|
|
8
|
+
// 3. Reconstruct chains
|
|
9
|
+
// 4. Detect signals (Stage 1)
|
|
10
|
+
// 5. Classify via LLM (Stage 2, optional)
|
|
11
|
+
// 6. Generate outputs (Stage 3)
|
|
12
|
+
// 7. Assemble report
|
|
13
|
+
// 8. Persist report + processing state
|
|
14
|
+
// 9. Close TraceSource
|
|
15
|
+
//
|
|
16
|
+
// Implements R-010, R-012, R-015, R-019, R-020, R-043–R-045.
|
|
17
|
+
// ============================================================
|
|
18
|
+
import { join } from "node:path";
|
|
19
|
+
import { reconstructChains } from "./chain-reconstructor.js";
|
|
20
|
+
import { detectAllSignals, createRepeatFailState } from "./signals/index.js";
|
|
21
|
+
import { classifyFindings } from "./classifier.js";
|
|
22
|
+
import { generateOutputs } from "./output-generator.js";
|
|
23
|
+
import { assembleReport } from "./report.js";
|
|
24
|
+
import { loadJson, saveJson } from "../storage.js";
|
|
25
|
+
// ---- Severity ranking for sorting ----
|
|
26
|
+
const SEVERITY_RANK = {
|
|
27
|
+
low: 0,
|
|
28
|
+
medium: 1,
|
|
29
|
+
high: 2,
|
|
30
|
+
critical: 3,
|
|
31
|
+
};
|
|
32
|
+
// ---- Processing state path ----
|
|
33
|
+
function statePath(workspace) {
|
|
34
|
+
return join(workspace, "memory", "reboot", "trace-analyzer-state.json");
|
|
35
|
+
}
|
|
36
|
+
function reportPath(workspace, config) {
|
|
37
|
+
return config.output.reportPath
|
|
38
|
+
?? join(workspace, "memory", "reboot", "trace-analysis-report.json");
|
|
39
|
+
}
|
|
40
|
+
// ---- Empty report factory ----
|
|
41
|
+
function emptyReport(startedAt, previousState) {
|
|
42
|
+
return assembleReport({
|
|
43
|
+
startedAt,
|
|
44
|
+
completedAt: Date.now(),
|
|
45
|
+
eventsProcessed: 0,
|
|
46
|
+
chains: [],
|
|
47
|
+
findings: [],
|
|
48
|
+
generatedOutputs: [],
|
|
49
|
+
previousState,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* TraceAnalyzer — orchestrates the 3-stage analysis pipeline.
|
|
54
|
+
*
|
|
55
|
+
* Create via constructor, then call `run()` for a full analysis.
|
|
56
|
+
* The analyzer manages its own processing state for incremental runs.
|
|
57
|
+
*/
|
|
58
|
+
export class TraceAnalyzer {
|
|
59
|
+
config;
|
|
60
|
+
topLevelLlm;
|
|
61
|
+
workspace;
|
|
62
|
+
logger;
|
|
63
|
+
createSource;
|
|
64
|
+
/** Pre-loaded signal patterns (if provided). */
|
|
65
|
+
signalPatterns;
|
|
66
|
+
constructor(params) {
|
|
67
|
+
this.config = params.config;
|
|
68
|
+
this.logger = params.logger;
|
|
69
|
+
this.workspace = params.workspace;
|
|
70
|
+
this.topLevelLlm = params.topLevelLlm;
|
|
71
|
+
this.createSource = params.createSource ?? null;
|
|
72
|
+
this.signalPatterns = params.signalPatterns;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Execute the full analysis pipeline.
|
|
76
|
+
*
|
|
77
|
+
* @param opts.full — If true, reprocess all events from the beginning.
|
|
78
|
+
* @returns The analysis report.
|
|
79
|
+
*/
|
|
80
|
+
async run(opts) {
|
|
81
|
+
const startedAt = Date.now();
|
|
82
|
+
const previousState = this.loadState();
|
|
83
|
+
// 1. Connect to TraceSource
|
|
84
|
+
let source = null;
|
|
85
|
+
try {
|
|
86
|
+
source = this.createSource ? await this.createSource() : null;
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
this.logger.warn(`[trace-analyzer] TraceSource connection failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
90
|
+
}
|
|
91
|
+
if (!source) {
|
|
92
|
+
this.logger.warn("[trace-analyzer] No TraceSource available — returning empty report");
|
|
93
|
+
return emptyReport(startedAt, previousState);
|
|
94
|
+
}
|
|
95
|
+
try {
|
|
96
|
+
return await this.executePipeline(source, startedAt, previousState, opts);
|
|
97
|
+
}
|
|
98
|
+
finally {
|
|
99
|
+
// 9. Close TraceSource
|
|
100
|
+
try {
|
|
101
|
+
await source.close();
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
this.logger.warn(`[trace-analyzer] Failed to close TraceSource: ${err instanceof Error ? err.message : String(err)}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Get the current analyzer status.
|
|
110
|
+
*/
|
|
111
|
+
async getStatus() {
|
|
112
|
+
const state = this.loadState();
|
|
113
|
+
return {
|
|
114
|
+
lastRun: state.updatedAt || null,
|
|
115
|
+
findings: state.totalFindings ?? 0,
|
|
116
|
+
state,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
// ---- Private Pipeline Steps ----
|
|
120
|
+
/** Steps 2-3: Fetch events and reconstruct conversation chains. */
|
|
121
|
+
async fetchAndReconstructChains(source, previousState, opts) {
|
|
122
|
+
const isFullRun = opts?.full === true || !previousState.lastProcessedTs;
|
|
123
|
+
const startMs = isFullRun
|
|
124
|
+
? 0
|
|
125
|
+
: (previousState.lastProcessedTs ?? 0) - (this.config.incrementalContextWindow * 60_000);
|
|
126
|
+
const endMs = Date.now();
|
|
127
|
+
const events = source.fetchByTimeRange(Math.max(0, startMs), endMs, {
|
|
128
|
+
batchSize: this.config.fetchBatchSize,
|
|
129
|
+
});
|
|
130
|
+
return reconstructChains(events, {
|
|
131
|
+
gapMinutes: this.config.chainGapMinutes,
|
|
132
|
+
maxEventsPerChain: 1000,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
/** Steps 4-6: Detect signals and optionally classify with LLM. */
|
|
136
|
+
async detectAndClassify(chains) {
|
|
137
|
+
const repeatFailState = createRepeatFailState();
|
|
138
|
+
let findings = detectAllSignals(chains, this.config.signals, repeatFailState, this.signalPatterns, this.logger);
|
|
139
|
+
if (findings.length > this.config.output.maxFindings) {
|
|
140
|
+
findings = findings
|
|
141
|
+
.sort((a, b) => SEVERITY_RANK[b.signal.severity] - SEVERITY_RANK[a.signal.severity])
|
|
142
|
+
.slice(0, this.config.output.maxFindings);
|
|
143
|
+
}
|
|
144
|
+
if (this.config.llm.enabled) {
|
|
145
|
+
const chainMap = new Map(chains.map(c => [c.id, c]));
|
|
146
|
+
findings = await classifyFindings(findings, chainMap, this.config, this.topLevelLlm, this.logger);
|
|
147
|
+
}
|
|
148
|
+
return findings;
|
|
149
|
+
}
|
|
150
|
+
/** Steps 7-8: Generate outputs, assemble report, persist. */
|
|
151
|
+
generateAndPersist(startedAt, eventsProcessed, chains, findings, previousState) {
|
|
152
|
+
const generatedOutputs = generateOutputs(findings);
|
|
153
|
+
const report = assembleReport({
|
|
154
|
+
startedAt, completedAt: Date.now(),
|
|
155
|
+
eventsProcessed, chains, findings, generatedOutputs, previousState,
|
|
156
|
+
});
|
|
157
|
+
saveJson(reportPath(this.workspace, this.config), report, this.logger);
|
|
158
|
+
saveJson(statePath(this.workspace), report.processingState, this.logger);
|
|
159
|
+
this.logger.info(`[trace-analyzer] Analysis complete: ${eventsProcessed} events, ${chains.length} chains, ${findings.length} findings`);
|
|
160
|
+
return report;
|
|
161
|
+
}
|
|
162
|
+
async executePipeline(source, startedAt, previousState, opts) {
|
|
163
|
+
const chains = await this.fetchAndReconstructChains(source, previousState, opts);
|
|
164
|
+
const eventsProcessed = chains.reduce((sum, c) => sum + c.events.length, 0);
|
|
165
|
+
const findings = await this.detectAndClassify(chains);
|
|
166
|
+
return this.generateAndPersist(startedAt, eventsProcessed, chains, findings, previousState);
|
|
167
|
+
}
|
|
168
|
+
loadState() {
|
|
169
|
+
const path = statePath(this.workspace);
|
|
170
|
+
const raw = loadJson(path);
|
|
171
|
+
// loadJson returns {} on failure, which satisfies Partial<ProcessingState>
|
|
172
|
+
return raw;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../../../src/trace-analyzer/analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { NormalizedEvent, AnalyzerEventType } from "./events.js";
|
|
2
|
+
/** A reconstructed conversation chain. */
|
|
3
|
+
export type ConversationChain = {
|
|
4
|
+
/** Deterministic chain ID: first 16 hex chars of SHA-256("session:agent:firstTs"). */
|
|
5
|
+
id: string;
|
|
6
|
+
/** Agent ID (e.g., "main", "forge", "viola"). */
|
|
7
|
+
agent: string;
|
|
8
|
+
/** Normalized session key. */
|
|
9
|
+
session: string;
|
|
10
|
+
/** Timestamp of first event (ms). */
|
|
11
|
+
startTs: number;
|
|
12
|
+
/** Timestamp of last event (ms). */
|
|
13
|
+
endTs: number;
|
|
14
|
+
/** Ordered events in this chain. */
|
|
15
|
+
events: NormalizedEvent[];
|
|
16
|
+
/** Event count per type (for quick filtering). */
|
|
17
|
+
typeCounts: Partial<Record<AnalyzerEventType, number>>;
|
|
18
|
+
/** How the chain boundary was determined. */
|
|
19
|
+
boundaryType: "lifecycle" | "gap" | "time_range" | "memory_cap";
|
|
20
|
+
};
|
|
21
|
+
/** Configuration for chain reconstruction. */
|
|
22
|
+
export type ChainReconstructorOpts = {
|
|
23
|
+
/** Inactivity gap in minutes that triggers a chain split. Default: 30. */
|
|
24
|
+
gapMinutes: number;
|
|
25
|
+
/** Maximum events per chain before forced split. Default: 1000. */
|
|
26
|
+
maxEventsPerChain: number;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Reconstruct conversation chains from a stream of normalized events.
|
|
30
|
+
*
|
|
31
|
+
* Two-pass algorithm:
|
|
32
|
+
* 1. Accumulate events into (session, agent) buckets
|
|
33
|
+
* 2. Split each bucket into chains by boundaries, deduplicate, emit
|
|
34
|
+
*/
|
|
35
|
+
export declare function reconstructChains(events: AsyncIterable<NormalizedEvent>, opts?: Partial<ChainReconstructorOpts>): Promise<ConversationChain[]>;
|
|
36
|
+
/**
|
|
37
|
+
* Deduplicate events within a sorted event list.
|
|
38
|
+
* When two events share the same fingerprint (same type, agent, time window,
|
|
39
|
+
* and content/params), keep the one with the higher sequence number.
|
|
40
|
+
*/
|
|
41
|
+
export declare function deduplicateEvents(events: NormalizedEvent[]): NormalizedEvent[];
|
|
42
|
+
/**
|
|
43
|
+
* Compute a fingerprint for deduplication.
|
|
44
|
+
* Uses a 1-second time window to match events from both schemas
|
|
45
|
+
* that represent the same underlying action.
|
|
46
|
+
*/
|
|
47
|
+
export declare function eventFingerprint(event: NormalizedEvent): string;
|
|
48
|
+
/** Fast non-crypto hash for dedup fingerprinting. */
|
|
49
|
+
export declare function simpleHash(str: string): number;
|
|
50
|
+
/** Compute a deterministic chain ID. */
|
|
51
|
+
export declare function computeChainId(session: string, agent: string, firstTs: number): string;
|
|
52
|
+
//# sourceMappingURL=chain-reconstructor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chain-reconstructor.d.ts","sourceRoot":"","sources":["../../../src/trace-analyzer/chain-reconstructor.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEtE,0CAA0C;AAC1C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,sFAAsF;IACtF,EAAE,EAAE,MAAM,CAAC;IACX,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,qCAAqC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,kDAAkD;IAClD,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAC;IACvD,6CAA6C;IAC7C,YAAY,EAAE,WAAW,GAAG,KAAK,GAAG,YAAY,GAAG,YAAY,CAAC;CACjE,CAAC;AAEF,8CAA8C;AAC9C,MAAM,MAAM,sBAAsB,GAAG;IACnC,0EAA0E;IAC1E,UAAU,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAAC;AAyCF;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,aAAa,CAAC,eAAe,CAAC,EACtC,IAAI,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,GACrC,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAe9B;AAiDD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,eAAe,EAAE,CAmB9E;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAqB/D;AAED,qDAAqD;AACrD,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAM9C;AAED,wCAAwC;AACxC,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAGtF"}
|