cortex-engine 0.4.2 → 0.5.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.
Files changed (78) hide show
  1. package/README.md +16 -6
  2. package/dist/bin/anomalies-cmd.d.ts +17 -0
  3. package/dist/bin/anomalies-cmd.d.ts.map +1 -0
  4. package/dist/bin/anomalies-cmd.js +417 -0
  5. package/dist/bin/anomalies-cmd.js.map +1 -0
  6. package/dist/bin/cli.d.ts +5 -0
  7. package/dist/bin/cli.d.ts.map +1 -1
  8. package/dist/bin/cli.js +84 -0
  9. package/dist/bin/cli.js.map +1 -1
  10. package/dist/bin/health-cmd.d.ts +15 -0
  11. package/dist/bin/health-cmd.d.ts.map +1 -0
  12. package/dist/bin/health-cmd.js +273 -0
  13. package/dist/bin/health-cmd.js.map +1 -0
  14. package/dist/bin/init.d.ts.map +1 -1
  15. package/dist/bin/init.js +164 -8
  16. package/dist/bin/init.js.map +1 -1
  17. package/dist/bin/maintain-cmd.d.ts +17 -0
  18. package/dist/bin/maintain-cmd.d.ts.map +1 -0
  19. package/dist/bin/maintain-cmd.js +352 -0
  20. package/dist/bin/maintain-cmd.js.map +1 -0
  21. package/dist/bin/report-cmd.d.ts +17 -0
  22. package/dist/bin/report-cmd.d.ts.map +1 -0
  23. package/dist/bin/report-cmd.js +309 -0
  24. package/dist/bin/report-cmd.js.map +1 -0
  25. package/dist/bin/store-factory.d.ts +21 -0
  26. package/dist/bin/store-factory.d.ts.map +1 -0
  27. package/dist/bin/store-factory.js +64 -0
  28. package/dist/bin/store-factory.js.map +1 -0
  29. package/dist/bin/vitals-cmd.d.ts +16 -0
  30. package/dist/bin/vitals-cmd.d.ts.map +1 -0
  31. package/dist/bin/vitals-cmd.js +425 -0
  32. package/dist/bin/vitals-cmd.js.map +1 -0
  33. package/dist/core/types.d.ts +6 -0
  34. package/dist/core/types.d.ts.map +1 -1
  35. package/dist/engines/cognition.d.ts.map +1 -1
  36. package/dist/engines/cognition.js +39 -3
  37. package/dist/engines/cognition.js.map +1 -1
  38. package/dist/index.d.ts +8 -0
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +9 -0
  41. package/dist/index.js.map +1 -1
  42. package/dist/mcp/tools.d.ts +1 -1
  43. package/dist/mcp/tools.d.ts.map +1 -1
  44. package/dist/mcp/tools.js +22 -2
  45. package/dist/mcp/tools.js.map +1 -1
  46. package/dist/tools/evolution-list.d.ts +6 -0
  47. package/dist/tools/evolution-list.d.ts.map +1 -0
  48. package/dist/tools/evolution-list.js +52 -0
  49. package/dist/tools/evolution-list.js.map +1 -0
  50. package/dist/tools/evolve.d.ts +6 -0
  51. package/dist/tools/evolve.d.ts.map +1 -0
  52. package/dist/tools/evolve.js +63 -0
  53. package/dist/tools/evolve.js.map +1 -0
  54. package/dist/tools/journal-read.d.ts +6 -0
  55. package/dist/tools/journal-read.d.ts.map +1 -0
  56. package/dist/tools/journal-read.js +59 -0
  57. package/dist/tools/journal-read.js.map +1 -0
  58. package/dist/tools/journal-write.d.ts +6 -0
  59. package/dist/tools/journal-write.d.ts.map +1 -0
  60. package/dist/tools/journal-write.js +71 -0
  61. package/dist/tools/journal-write.js.map +1 -0
  62. package/dist/tools/thread-create.d.ts +6 -0
  63. package/dist/tools/thread-create.d.ts.map +1 -0
  64. package/dist/tools/thread-create.js +57 -0
  65. package/dist/tools/thread-create.js.map +1 -0
  66. package/dist/tools/thread-resolve.d.ts +6 -0
  67. package/dist/tools/thread-resolve.d.ts.map +1 -0
  68. package/dist/tools/thread-resolve.js +42 -0
  69. package/dist/tools/thread-resolve.js.map +1 -0
  70. package/dist/tools/thread-update.d.ts +6 -0
  71. package/dist/tools/thread-update.d.ts.map +1 -0
  72. package/dist/tools/thread-update.js +91 -0
  73. package/dist/tools/thread-update.js.map +1 -0
  74. package/dist/tools/threads-list.d.ts +6 -0
  75. package/dist/tools/threads-list.d.ts.map +1 -0
  76. package/dist/tools/threads-list.js +70 -0
  77. package/dist/tools/threads-list.js.map +1 -0
  78. package/package.json +119 -115
package/README.md CHANGED
@@ -11,7 +11,7 @@ Most AI agents forget everything when the session ends. `cortex-engine` fixes th
11
11
  - **Dream consolidation** — batches of short-term observations compress into durable long-term memories (like biological sleep consolidation)
12
12
  - **Spaced repetition (FSRS)** — memories that aren't accessed fade over time, keeping retrieval relevant
13
13
  - **Embeddings** — pluggable providers (built-in, OpenAI, Vertex AI, Ollama) — no external service required by default
14
- - **MCP server** — 17 cognitive tools (`query`, `observe`, `believe`, `wander`, `dream`, etc.) over the Model Context Protocol
14
+ - **MCP server** — 25 cognitive tools (`query`, `observe`, `believe`, `wander`, `dream`, etc.) over the Model Context Protocol
15
15
 
16
16
  The result: personality and expertise emerge from accumulated experience, not system prompts. An agent with 200 observations about distributed systems doesn't need to be told "you care about distributed systems." It just knows.
17
17
 
@@ -40,7 +40,7 @@ cd my-agent
40
40
  npx cortex-engine # starts MCP server
41
41
  ```
42
42
 
43
- Your agent now has 17 cognitive tools. See **[docs/quick-start.md](docs/quick-start.md)** for the full 5-minute setup.
43
+ Your agent now has 25 cognitive tools. See the **[Quick Start](https://github.com/Fozikio/cortex-engine/wiki/Quick-Start)** wiki page for the full 5-minute setup.
44
44
 
45
45
  ### Multi-Agent
46
46
 
@@ -50,11 +50,11 @@ npx fozikio agent add trader --description "Trading signals"
50
50
  npx fozikio agent generate-mcp # writes .mcp.json with scoped servers
51
51
  ```
52
52
 
53
- Each agent gets isolated memory via namespaces. See **[docs/multi-agent-design.md](docs/multi-agent-design.md)** for architecture details.
53
+ Each agent gets isolated memory via namespaces. See the **[Architecture](https://github.com/Fozikio/cortex-engine/wiki/Architecture)** wiki page for details.
54
54
 
55
55
  ### Agent-First Setup
56
56
 
57
- The fastest path: open an AI agent in an empty directory and say *"set up a cortex workspace."* The agent runs `npx fozikio init`, reads the generated files, and is immediately productive. See **[docs/agent-first-setup.md](docs/agent-first-setup.md)** for the full guide.
57
+ The fastest path: open an AI agent in an empty directory and say *"set up a cortex workspace."* The agent runs `npx fozikio init`, reads the generated files, and is immediately productive. See the **[Installation](https://github.com/Fozikio/cortex-engine/wiki/Installation)** wiki page for the full guide.
58
58
 
59
59
  ### Development
60
60
 
@@ -115,7 +115,8 @@ Skills are invocable workflows that agents can use via `/skill-name`.
115
115
 
116
116
  ## Plugin Ecosystem
117
117
 
118
- cortex-engine ships with 17 cognitive tools out of the box. Plugins add more:
118
+ cortex-engine ships with 25 cognitive tools out of the box. Plugins add more:
119
+ [Fozikio Plugin Docs](https://www.fozikio.com/products/plugins/)
119
120
 
120
121
  | Plugin | What It Adds |
121
122
  |--------|-------------|
@@ -131,11 +132,20 @@ cortex-engine ships with 17 cognitive tools out of the box. Plugins add more:
131
132
 
132
133
  Install any plugin: `npm install @fozikio/tools-threads` — cortex-engine auto-discovers and loads installed plugins.
133
134
 
135
+ ## Documentation
136
+
137
+ - **[Wiki](https://github.com/Fozikio/cortex-engine/wiki)** — Installation, architecture, plugin authoring, MCP integration, deployment, FAQ
138
+ - **[Discussions](https://github.com/Fozikio/cortex-engine/discussions)** — Ask questions, share what you've built
139
+ - **[Contributing](https://github.com/Fozikio/.github/blob/main/CONTRIBUTING.md)** — How to contribute
140
+ - **[Project Board](https://github.com/orgs/Fozikio/projects/2)** — Roadmap and active work
141
+ - **[Security](https://github.com/Fozikio/.github/blob/main/SECURITY.md)** — Report vulnerabilities
142
+
134
143
  ## Related Projects
135
144
 
136
145
  - [@fozikio/reflex](https://github.com/Fozikio/reflex) — Portable safety guardrails for agents. Rules as data, not code.
137
146
  - [sigil](https://github.com/Fozikio/sigil) — Agent control surface. Signals and gestures, not conversations.
138
- - [fozikio.com](https://www.fozikio.com) — Documentation and guides.
147
+ - [fozikio.com](https://www.fozikio.com) — Documentation and guides
148
+ - [r/fozikio](https://www.reddit.com/r/Fozikio/) — Community
139
149
 
140
150
  ## License
141
151
 
@@ -0,0 +1,17 @@
1
+ /**
2
+ * anomalies-cmd.ts — fozikio anomalies command handler.
3
+ *
4
+ * Loads session data from ops entries + retrieval traces, builds session
5
+ * feature vectors, and runs an Isolation Forest to detect anomalous sessions.
6
+ *
7
+ * Isolation Forest is implemented in pure TypeScript — no ML dependencies.
8
+ *
9
+ * Works with both SQLite and Firestore backends.
10
+ *
11
+ * Usage:
12
+ * fozikio anomalies
13
+ * fozikio anomalies --days 60
14
+ * fozikio anomalies --json
15
+ */
16
+ export declare function runAnomalies(args: string[]): Promise<void>;
17
+ //# sourceMappingURL=anomalies-cmd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anomalies-cmd.d.ts","sourceRoot":"","sources":["../../src/bin/anomalies-cmd.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAqaH,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAwHhE"}
@@ -0,0 +1,417 @@
1
+ /**
2
+ * anomalies-cmd.ts — fozikio anomalies command handler.
3
+ *
4
+ * Loads session data from ops entries + retrieval traces, builds session
5
+ * feature vectors, and runs an Isolation Forest to detect anomalous sessions.
6
+ *
7
+ * Isolation Forest is implemented in pure TypeScript — no ML dependencies.
8
+ *
9
+ * Works with both SQLite and Firestore backends.
10
+ *
11
+ * Usage:
12
+ * fozikio anomalies
13
+ * fozikio anomalies --days 60
14
+ * fozikio anomalies --json
15
+ */
16
+ import { loadConfig } from './config-loader.js';
17
+ import { SqliteCortexStore } from '../stores/sqlite.js';
18
+ import { FirestoreCortexStore } from '../stores/firestore.js';
19
+ // ─── Constants ────────────────────────────────────────────────────────────────
20
+ const DEFAULT_DAYS = 90;
21
+ const N_TREES = 100;
22
+ const SUBSAMPLE_SIZE = 256;
23
+ const ANOMALY_THRESHOLD = 0.6;
24
+ const WIDTH = 52;
25
+ function parseArgs(args) {
26
+ let json = false;
27
+ let days = DEFAULT_DAYS;
28
+ for (let i = 0; i < args.length; i++) {
29
+ const arg = args[i];
30
+ if (arg === '--json') {
31
+ json = true;
32
+ }
33
+ else if (arg === '--days' && args[i + 1]) {
34
+ const parsed = parseInt(args[++i], 10);
35
+ if (!isNaN(parsed) && parsed > 0)
36
+ days = parsed;
37
+ }
38
+ }
39
+ return { json, days };
40
+ }
41
+ // ─── Store Factory ────────────────────────────────────────────────────────────
42
+ async function createStore(config) {
43
+ if (config.store === 'firestore') {
44
+ const { getApps, initializeApp } = await import('firebase-admin/app');
45
+ if (getApps().length === 0) {
46
+ initializeApp({ projectId: config.store_options?.gcp_project_id });
47
+ }
48
+ const { getFirestore, FieldValue } = await import('firebase-admin/firestore');
49
+ const db = config.store_options?.firestore_database_id
50
+ ? getFirestore(config.store_options.firestore_database_id)
51
+ : getFirestore();
52
+ db.settings({ ignoreUndefinedProperties: true });
53
+ return new FirestoreCortexStore(db, '', FieldValue);
54
+ }
55
+ return new SqliteCortexStore(config.store_options?.sqlite_path ?? './cortex.db');
56
+ }
57
+ // ─── Date Helpers ─────────────────────────────────────────────────────────────
58
+ function toDate(v) {
59
+ if (!v)
60
+ return null;
61
+ if (v instanceof Date)
62
+ return v;
63
+ const t = v;
64
+ if (typeof t.toDate === 'function')
65
+ return t.toDate();
66
+ if (typeof v === 'string')
67
+ return new Date(v);
68
+ return null;
69
+ }
70
+ // ─── Box Drawing ─────────────────────────────────────────────────────────────
71
+ function row(label, value) {
72
+ const content = ` ${label.padEnd(28)}${value}`;
73
+ return `\u2551${content.padEnd(WIDTH)}\u2551`;
74
+ }
75
+ function header(title) {
76
+ const padded = ` ${title} `;
77
+ const totalPad = WIDTH - padded.length;
78
+ const left = Math.floor(totalPad / 2);
79
+ const right = totalPad - left;
80
+ return `\u2551${' '.repeat(left)}${padded}${' '.repeat(right)}\u2551`;
81
+ }
82
+ function divider() { return `\u2560${'\u2550'.repeat(WIDTH)}\u2563`; }
83
+ function top() { return `\u2554${'\u2550'.repeat(WIDTH)}\u2557`; }
84
+ function bottom() { return `\u255a${'\u2550'.repeat(WIDTH)}\u255d`; }
85
+ function fmt(n, digits = 3) { return n.toFixed(digits); }
86
+ // ─── Session Feature Extraction ───────────────────────────────────────────────
87
+ const COMMIT_KEYWORDS = ['commit', 'push', 'merge'];
88
+ function hasCommitKeyword(content) {
89
+ const lower = content.toLowerCase();
90
+ return COMMIT_KEYWORDS.some(kw => lower.includes(kw));
91
+ }
92
+ function buildSessionFeatures(entries, traces, sessionRef) {
93
+ const dates = entries
94
+ .map(e => (e.created_at instanceof Date ? e.created_at : toDate(e.created_at)))
95
+ .filter((d) => d !== null)
96
+ .sort((a, b) => a.getTime() - b.getTime());
97
+ if (dates.length === 0)
98
+ return null;
99
+ const startTime = dates[0];
100
+ const endTime = dates[dates.length - 1];
101
+ const durationMinutes = (endTime.getTime() - startTime.getTime()) / (1000 * 60);
102
+ // Sessions under half a minute with fewer than 3 entries are likely incomplete data
103
+ if (durationMinutes < 0.5 && entries.length < 3)
104
+ return null;
105
+ const sessionTraces = traces.filter(t => t.session_id === sessionRef);
106
+ const retrieval_count = sessionTraces.length;
107
+ const retried = sessionTraces.filter(t => t.retry_within_60s === true).length;
108
+ const retry_rate = retrieval_count > 0 ? retried / retrieval_count : 0;
109
+ const has_commits = entries.some(e => hasCommitKeyword(e.content)) ? 1 : 0;
110
+ return {
111
+ session_ref: sessionRef,
112
+ start_time: startTime,
113
+ duration_minutes: durationMinutes,
114
+ retrieval_count,
115
+ retry_rate,
116
+ ops_entry_count: entries.length,
117
+ has_commits,
118
+ observation_count: 0, // filled in after building all features
119
+ };
120
+ }
121
+ function featureToVector(f) {
122
+ return [
123
+ f.duration_minutes,
124
+ f.retrieval_count,
125
+ f.retry_rate,
126
+ f.ops_entry_count,
127
+ f.has_commits,
128
+ f.observation_count,
129
+ ];
130
+ }
131
+ // ─── Isolation Forest ─────────────────────────────────────────────────────────
132
+ /**
133
+ * Average path length for a dataset of size n (theoretical expectation).
134
+ * Used as the normalization constant c(n) in the anomaly score formula.
135
+ */
136
+ function avgPathLength(n) {
137
+ if (n <= 1)
138
+ return 0;
139
+ if (n === 2)
140
+ return 1;
141
+ // H(n-1) harmonic number approximation (Euler-Mascheroni constant = 0.5772156649)
142
+ const h = Math.log(n - 1) + 0.5772156649;
143
+ return 2 * h - (2 * (n - 1)) / n;
144
+ }
145
+ function buildTree(data, indices, currentDepth, maxDepth) {
146
+ const size = indices.length;
147
+ if (size <= 1 || currentDepth >= maxDepth) {
148
+ return { size, is_leaf: true };
149
+ }
150
+ const numFeatures = data[0].length;
151
+ const featureIdx = Math.floor(Math.random() * numFeatures);
152
+ let minVal = Infinity;
153
+ let maxVal = -Infinity;
154
+ for (const i of indices) {
155
+ const v = data[i][featureIdx];
156
+ if (v < minVal)
157
+ minVal = v;
158
+ if (v > maxVal)
159
+ maxVal = v;
160
+ }
161
+ if (minVal === maxVal) {
162
+ return { size, is_leaf: true };
163
+ }
164
+ const splitVal = minVal + Math.random() * (maxVal - minVal);
165
+ const leftIdx = [];
166
+ const rightIdx = [];
167
+ for (const i of indices) {
168
+ if (data[i][featureIdx] < splitVal) {
169
+ leftIdx.push(i);
170
+ }
171
+ else {
172
+ rightIdx.push(i);
173
+ }
174
+ }
175
+ return {
176
+ feature_index: featureIdx,
177
+ split_value: splitVal,
178
+ left: buildTree(data, leftIdx, currentDepth + 1, maxDepth),
179
+ right: buildTree(data, rightIdx, currentDepth + 1, maxDepth),
180
+ size,
181
+ is_leaf: false,
182
+ };
183
+ }
184
+ function pathLength(node, x, depth) {
185
+ if (node.is_leaf || node.feature_index === undefined) {
186
+ return depth + avgPathLength(node.size);
187
+ }
188
+ if (x[node.feature_index] < node.split_value) {
189
+ return pathLength(node.left, x, depth + 1);
190
+ }
191
+ else {
192
+ return pathLength(node.right, x, depth + 1);
193
+ }
194
+ }
195
+ /** Fisher-Yates shuffle (unbiased). */
196
+ function fisherYatesShuffle(arr) {
197
+ const a = [...arr];
198
+ for (let i = a.length - 1; i > 0; i--) {
199
+ const j = Math.floor(Math.random() * (i + 1));
200
+ [a[i], a[j]] = [a[j], a[i]];
201
+ }
202
+ return a;
203
+ }
204
+ /**
205
+ * Build Isolation Forest and return anomaly scores (0–1, higher = more anomalous).
206
+ * Score formula: 2^(-avgPath / c), where c = avgPathLength(subsampleSize).
207
+ */
208
+ function isolationForest(data) {
209
+ const n = data.length;
210
+ if (n === 0)
211
+ return [];
212
+ if (n === 1)
213
+ return [0];
214
+ const subsampleSize = Math.min(SUBSAMPLE_SIZE, n);
215
+ const maxDepth = Math.ceil(Math.log2(subsampleSize));
216
+ const trees = [];
217
+ for (let t = 0; t < N_TREES; t++) {
218
+ const shuffled = fisherYatesShuffle([...Array(n).keys()]);
219
+ const subset = shuffled.slice(0, subsampleSize);
220
+ trees.push(buildTree(data, subset, 0, maxDepth));
221
+ }
222
+ const c = avgPathLength(subsampleSize);
223
+ const scores = [];
224
+ for (let i = 0; i < n; i++) {
225
+ const x = data[i];
226
+ let totalPath = 0;
227
+ for (const tree of trees) {
228
+ totalPath += pathLength(tree, x, 0);
229
+ }
230
+ const avgPath = totalPath / N_TREES;
231
+ scores.push(Math.pow(2, -avgPath / c));
232
+ }
233
+ return scores;
234
+ }
235
+ // ─── Anomaly Explanation ──────────────────────────────────────────────────────
236
+ function explainAnomaly(features) {
237
+ const reasons = [];
238
+ if (features.duration_minutes > 60 && features.has_commits === 0) {
239
+ reasons.push('Long session with no commits — possible stuck session');
240
+ }
241
+ if (features.retry_rate > 0.3 && features.retrieval_count > 10) {
242
+ reasons.push('High retry rate with many tool calls — fighting the system');
243
+ }
244
+ if (features.observation_count > 5 && features.ops_entry_count < 3) {
245
+ reasons.push('Many observations but few ops entries — thinking without acting');
246
+ }
247
+ if (features.duration_minutes < 2 &&
248
+ features.has_commits === 0 &&
249
+ features.retrieval_count === 0) {
250
+ reasons.push('Very short session with no retrieval or commits — incomplete/crashed');
251
+ }
252
+ if (features.duration_minutes > 180) {
253
+ reasons.push('Unusually long session duration — possible runaway or stall');
254
+ }
255
+ if (features.retry_rate > 0.5 && features.retrieval_count > 5) {
256
+ reasons.push('Very high retry rate — repeated retrieval failures');
257
+ }
258
+ if (reasons.length === 0) {
259
+ reasons.push('Statistical outlier — unusual combination of features');
260
+ }
261
+ return reasons.join('; ');
262
+ }
263
+ // ─── Report Rendering ─────────────────────────────────────────────────────────
264
+ function renderReport(report) {
265
+ const now = new Date(report.generated_at);
266
+ const anomalies = report.results.filter(r => r.is_anomalous);
267
+ const pct = report.sessions_analyzed > 0
268
+ ? ((anomalies.length / report.sessions_analyzed) * 100).toFixed(1)
269
+ : '0.0';
270
+ const lines = [];
271
+ lines.push(top());
272
+ lines.push(header('ANOMALY DETECTION REPORT'));
273
+ lines.push(header(now.toISOString().slice(0, 10)));
274
+ lines.push(divider());
275
+ lines.push(row('Sessions analyzed:', String(report.sessions_analyzed)));
276
+ lines.push(row('Anomalies detected:', `${anomalies.length} (${pct}%)`));
277
+ lines.push(row('Threshold:', String(report.threshold)));
278
+ lines.push(row('Trees:', String(N_TREES)));
279
+ lines.push(row('Window:', `last ${report.window_days} days`));
280
+ if (anomalies.length > 0) {
281
+ lines.push(divider());
282
+ lines.push(header('Flagged Sessions'));
283
+ lines.push(divider());
284
+ for (const a of anomalies.slice(0, 10)) {
285
+ const ts = a.start_time.slice(0, 16).replace('T', ' ');
286
+ const scoreStr = fmt(a.score);
287
+ const tag = a.explanation.split(';')[0].trim().slice(0, 20);
288
+ lines.push(row(` ${ts}`, `score=${scoreStr} ${tag}`));
289
+ }
290
+ if (anomalies.length > 10) {
291
+ lines.push(row(' ...and more', `(${anomalies.length - 10} not shown)`));
292
+ }
293
+ }
294
+ if (report.feature_summary) {
295
+ const fs = report.feature_summary;
296
+ lines.push(divider());
297
+ lines.push(header('Feature Ranges'));
298
+ lines.push(divider());
299
+ lines.push(row('Avg duration (min):', fmt(fs.avg_duration_minutes, 1)));
300
+ lines.push(row('Avg retrieval count:', fmt(fs.avg_retrieval_count, 1)));
301
+ lines.push(row('Avg retry rate:', fmt(fs.avg_retry_rate)));
302
+ lines.push(row('Sessions with commits:', `${fs.commit_rate_pct.toFixed(1)}%`));
303
+ }
304
+ lines.push(bottom());
305
+ console.log('');
306
+ for (const line of lines)
307
+ console.log(line);
308
+ console.log('');
309
+ }
310
+ // ─── Main Export ─────────────────────────────────────────────────────────────
311
+ export async function runAnomalies(args) {
312
+ const { json, days } = parseArgs(args);
313
+ const config = loadConfig();
314
+ const store = await createStore(config);
315
+ const now = new Date();
316
+ const cutoff = new Date(now);
317
+ cutoff.setDate(cutoff.getDate() - days);
318
+ process.stderr.write(`[fozikio anomalies] Loading session data (last ${days} days)...\n`);
319
+ const cutoffFilter = { field: 'created_at', op: '>=', value: cutoff };
320
+ const traceCutoffFilter = { field: 'timestamp', op: '>=', value: cutoff };
321
+ const obsCutoffFilter = { field: 'created_at', op: '>=', value: cutoff };
322
+ const [opsEntries, rawTraces, rawObs] = await Promise.all([
323
+ store.queryOps({ days }),
324
+ store.query('retrieval_traces', [traceCutoffFilter], { limit: 5000, orderBy: 'timestamp', orderDir: 'asc' }),
325
+ store.query('observations', [obsCutoffFilter], { limit: 2000 }),
326
+ ]);
327
+ // Silence unused variable warning — cutoffFilter used above
328
+ void cutoffFilter;
329
+ const traces = rawTraces;
330
+ // Group ops entries by session_ref
331
+ const opsByRef = new Map();
332
+ for (const e of opsEntries) {
333
+ const ref = e.session_ref ?? 'unknown';
334
+ if (ref === 'unknown')
335
+ continue;
336
+ if (!opsByRef.has(ref))
337
+ opsByRef.set(ref, []);
338
+ opsByRef.get(ref).push(e);
339
+ }
340
+ // Build session features
341
+ const allFeatures = [];
342
+ for (const [ref, entries] of opsByRef) {
343
+ const f = buildSessionFeatures(entries, traces, ref);
344
+ if (f)
345
+ allFeatures.push(f);
346
+ }
347
+ if (allFeatures.length === 0) {
348
+ process.stderr.write('[fozikio anomalies] No sessions found with sufficient data.\n');
349
+ const emptyReport = {
350
+ generated_at: now.toISOString(),
351
+ window_days: days,
352
+ sessions_analyzed: 0,
353
+ anomalies_detected: 0,
354
+ threshold: ANOMALY_THRESHOLD,
355
+ results: [],
356
+ feature_summary: null,
357
+ };
358
+ if (json) {
359
+ console.log(JSON.stringify(emptyReport, null, 2));
360
+ }
361
+ else {
362
+ console.log('[fozikio anomalies] No sessions found with sufficient data.');
363
+ }
364
+ return;
365
+ }
366
+ // Assign observation counts using session time windows
367
+ for (const f of allFeatures) {
368
+ const windowStart = new Date(f.start_time.getTime() - 2 * 60 * 60 * 1000);
369
+ const windowEnd = new Date(f.start_time.getTime() + 4 * 60 * 60 * 1000);
370
+ let count = 0;
371
+ for (const obs of rawObs) {
372
+ const created = obs.created_at;
373
+ const d = toDate(created);
374
+ if (d && d >= windowStart && d <= windowEnd)
375
+ count++;
376
+ }
377
+ f.observation_count = count;
378
+ }
379
+ process.stderr.write(`[fozikio anomalies] Analyzing ${allFeatures.length} sessions with ${N_TREES} trees...\n`);
380
+ const featureVectors = allFeatures.map(featureToVector);
381
+ const scores = isolationForest(featureVectors);
382
+ const results = allFeatures.map((f, i) => ({
383
+ session_ref: f.session_ref,
384
+ start_time: f.start_time.toISOString(),
385
+ score: scores[i],
386
+ is_anomalous: scores[i] >= ANOMALY_THRESHOLD,
387
+ features: f,
388
+ explanation: scores[i] >= ANOMALY_THRESHOLD ? explainAnomaly(f) : '',
389
+ }));
390
+ results.sort((a, b) => b.score - a.score);
391
+ const anomalies = results.filter(r => r.is_anomalous);
392
+ const avgDur = allFeatures.reduce((s, f) => s + f.duration_minutes, 0) / allFeatures.length;
393
+ const avgRetrieval = allFeatures.reduce((s, f) => s + f.retrieval_count, 0) / allFeatures.length;
394
+ const avgRetry = allFeatures.reduce((s, f) => s + f.retry_rate, 0) / allFeatures.length;
395
+ const commitRate = allFeatures.filter(f => f.has_commits).length / allFeatures.length;
396
+ const report = {
397
+ generated_at: now.toISOString(),
398
+ window_days: days,
399
+ sessions_analyzed: allFeatures.length,
400
+ anomalies_detected: anomalies.length,
401
+ threshold: ANOMALY_THRESHOLD,
402
+ results,
403
+ feature_summary: {
404
+ avg_duration_minutes: avgDur,
405
+ avg_retrieval_count: avgRetrieval,
406
+ avg_retry_rate: avgRetry,
407
+ commit_rate_pct: commitRate * 100,
408
+ },
409
+ };
410
+ if (json) {
411
+ console.log(JSON.stringify(report, null, 2));
412
+ }
413
+ else {
414
+ renderReport(report);
415
+ }
416
+ }
417
+ //# sourceMappingURL=anomalies-cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anomalies-cmd.js","sourceRoot":"","sources":["../../src/bin/anomalies-cmd.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAK9D,iFAAiF;AAEjF,MAAM,YAAY,GAAG,EAAE,CAAC;AACxB,MAAM,OAAO,GAAG,GAAG,CAAC;AACpB,MAAM,cAAc,GAAG,GAAG,CAAC;AAC3B,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAC9B,MAAM,KAAK,GAAG,EAAE,CAAC;AAiEjB,SAAS,SAAS,CAAC,IAAc;IAC/B,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,IAAI,IAAI,GAAG,YAAY,CAAC;IAExB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YACrB,IAAI,GAAG,IAAI,CAAC;QACd,CAAC;aAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC3C,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC;gBAAE,IAAI,GAAG,MAAM,CAAC;QAClD,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACxB,CAAC;AAED,iFAAiF;AAEjF,KAAK,UAAU,WAAW,CAAC,MAAoB;IAC7C,IAAI,MAAM,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;QACjC,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACtE,IAAI,OAAO,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,aAAa,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,aAAa,EAAE,cAAc,EAAE,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC;QAC9E,MAAM,EAAE,GAAG,MAAM,CAAC,aAAa,EAAE,qBAAqB;YACpD,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,aAAa,CAAC,qBAAqB,CAAC;YAC1D,CAAC,CAAC,YAAY,EAAE,CAAC;QACnB,EAAE,CAAC,QAAQ,CAAC,EAAE,yBAAyB,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,OAAO,IAAI,oBAAoB,CAAC,EAAE,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,IAAI,iBAAiB,CAC1B,MAAM,CAAC,aAAa,EAAE,WAAW,IAAI,aAAa,CACnD,CAAC;AACJ,CAAC;AAED,iFAAiF;AAEjF,SAAS,MAAM,CAAC,CAAU;IACxB,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,IAAI,CAAC,YAAY,IAAI;QAAE,OAAO,CAAC,CAAC;IAChC,MAAM,CAAC,GAAG,CAA4B,CAAC;IACvC,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,UAAU;QAAE,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;IACtD,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,gFAAgF;AAEhF,SAAS,GAAG,CAAC,KAAa,EAAE,KAAa;IACvC,MAAM,OAAO,GAAG,KAAK,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC;IAChD,OAAO,SAAS,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;AAChD,CAAC;AAED,SAAS,MAAM,CAAC,KAAa;IAC3B,MAAM,MAAM,GAAG,IAAI,KAAK,GAAG,CAAC;IAC5B,MAAM,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;IACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,QAAQ,GAAG,IAAI,CAAC;IAC9B,OAAO,SAAS,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;AACxE,CAAC;AAED,SAAS,OAAO,KAAa,OAAO,SAAS,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC9E,SAAS,GAAG,KAAiB,OAAO,SAAS,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC9E,SAAS,MAAM,KAAc,OAAO,SAAS,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC9E,SAAS,GAAG,CAAC,CAAS,EAAE,MAAM,GAAG,CAAC,IAAY,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAEzE,iFAAiF;AAEjF,MAAM,eAAe,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAEpD,SAAS,gBAAgB,CAAC,OAAe;IACvC,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACpC,OAAO,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,oBAAoB,CAC3B,OAAmB,EACnB,MAAwB,EACxB,UAAkB;IAElB,MAAM,KAAK,GAAG,OAAO;SAClB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;SAC9E,MAAM,CAAC,CAAC,CAAC,EAAa,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;SACpC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAE7C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEpC,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACxC,MAAM,eAAe,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IAEhF,oFAAoF;IACpF,IAAI,eAAe,GAAG,GAAG,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAE7D,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC;IACtE,MAAM,eAAe,GAAG,aAAa,CAAC,MAAM,CAAC;IAC7C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC;IAC9E,MAAM,UAAU,GAAG,eAAe,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3E,OAAO;QACL,WAAW,EAAE,UAAU;QACvB,UAAU,EAAE,SAAS;QACrB,gBAAgB,EAAE,eAAe;QACjC,eAAe;QACf,UAAU;QACV,eAAe,EAAE,OAAO,CAAC,MAAM;QAC/B,WAAW;QACX,iBAAiB,EAAE,CAAC,EAAE,wCAAwC;KAC/D,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,CAAkB;IACzC,OAAO;QACL,CAAC,CAAC,gBAAgB;QAClB,CAAC,CAAC,eAAe;QACjB,CAAC,CAAC,UAAU;QACZ,CAAC,CAAC,eAAe;QACjB,CAAC,CAAC,WAAW;QACb,CAAC,CAAC,iBAAiB;KACpB,CAAC;AACJ,CAAC;AAED,iFAAiF;AAEjF;;;GAGG;AACH,SAAS,aAAa,CAAC,CAAS;IAC9B,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IACrB,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACtB,kFAAkF;IAClF,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,SAAS,CAChB,IAAqB,EACrB,OAAiB,EACjB,YAAoB,EACpB,QAAgB;IAEhB,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;IAE5B,IAAI,IAAI,IAAI,CAAC,IAAI,YAAY,IAAI,QAAQ,EAAE,CAAC;QAC1C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACjC,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACnC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC;IAE3D,IAAI,MAAM,GAAG,QAAQ,CAAC;IACtB,IAAI,MAAM,GAAG,CAAC,QAAQ,CAAC;IACvB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QAC9B,IAAI,CAAC,GAAG,MAAM;YAAE,MAAM,GAAG,CAAC,CAAC;QAC3B,IAAI,CAAC,GAAG,MAAM;YAAE,MAAM,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACjC,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IAE5D,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,QAAQ,EAAE,CAAC;YACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO;QACL,aAAa,EAAE,UAAU;QACzB,WAAW,EAAE,QAAQ;QACrB,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,YAAY,GAAG,CAAC,EAAE,QAAQ,CAAC;QAC1D,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,GAAG,CAAC,EAAE,QAAQ,CAAC;QAC5D,IAAI;QACJ,OAAO,EAAE,KAAK;KACf,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,IAAmB,EAAE,CAAgB,EAAE,KAAa;IACtE,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QACrD,OAAO,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,WAAY,EAAE,CAAC;QAC9C,OAAO,UAAU,CAAC,IAAI,CAAC,IAAK,EAAE,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IAC9C,CAAC;SAAM,CAAC;QACN,OAAO,UAAU,CAAC,IAAI,CAAC,KAAM,EAAE,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,uCAAuC;AACvC,SAAS,kBAAkB,CAAC,GAAa;IACvC,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;IACnB,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,IAAqB;IAC5C,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IACtB,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACvB,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAExB,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;IAErD,MAAM,KAAK,GAAoB,EAAE,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,CAAC,GAAG,aAAa,CAAC,aAAa,CAAC,CAAC;IACvC,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,SAAS,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACtC,CAAC;QACD,MAAM,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,iFAAiF;AAEjF,SAAS,cAAc,CAAC,QAAyB;IAC/C,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,IAAI,QAAQ,CAAC,gBAAgB,GAAG,EAAE,IAAI,QAAQ,CAAC,WAAW,KAAK,CAAC,EAAE,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;IACxE,CAAC;IAED,IAAI,QAAQ,CAAC,UAAU,GAAG,GAAG,IAAI,QAAQ,CAAC,eAAe,GAAG,EAAE,EAAE,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;IAC7E,CAAC;IAED,IAAI,QAAQ,CAAC,iBAAiB,GAAG,CAAC,IAAI,QAAQ,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;QACnE,OAAO,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;IAClF,CAAC;IAED,IACE,QAAQ,CAAC,gBAAgB,GAAG,CAAC;QAC7B,QAAQ,CAAC,WAAW,KAAK,CAAC;QAC1B,QAAQ,CAAC,eAAe,KAAK,CAAC,EAC9B,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAC;IACvF,CAAC;IAED,IAAI,QAAQ,CAAC,gBAAgB,GAAG,GAAG,EAAE,CAAC;QACpC,OAAO,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,QAAQ,CAAC,UAAU,GAAG,GAAG,IAAI,QAAQ,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;QAC9D,OAAO,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;IACxE,CAAC;IAED,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,iFAAiF;AAEjF,SAAS,YAAY,CAAC,MAAuB;IAC3C,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IAC7D,MAAM,GAAG,GAAG,MAAM,CAAC,iBAAiB,GAAG,CAAC;QACtC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,iBAAiB,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAClE,CAAC,CAAC,KAAK,CAAC;IAEV,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAClB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC,CAAC;IAC/C,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACnD,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACtB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;IACxE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,qBAAqB,EAAE,GAAG,SAAS,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC;IACxE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACxD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3C,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,MAAM,CAAC,WAAW,OAAO,CAAC,CAAC,CAAC;IAE9D,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QACtB,KAAK,MAAM,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YACvC,MAAM,EAAE,GAAG,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACvD,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAC9B,MAAM,GAAG,GAAG,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC5D,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,SAAS,QAAQ,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,SAAS,CAAC,MAAM,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;QAC3B,MAAM,EAAE,GAAG,MAAM,CAAC,eAAe,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,qBAAqB,EAAE,GAAG,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,sBAAsB,EAAE,GAAG,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,GAAG,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;QAC3D,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,wBAAwB,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACjF,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAErB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,gFAAgF;AAEhF,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAc;IAC/C,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAEvC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;IAExC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IAExC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kDAAkD,IAAI,aAAa,CAAC,CAAC;IAE1F,MAAM,YAAY,GAAgB,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IACnF,MAAM,iBAAiB,GAAgB,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IACvF,MAAM,eAAe,GAAgB,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAEtF,MAAM,CAAC,UAAU,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACxD,KAAK,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC;QACxB,KAAK,CAAC,KAAK,CAAC,kBAAkB,EAAE,CAAC,iBAAiB,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QAC5G,KAAK,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,eAAe,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;KAChE,CAAC,CAAC;IAEH,4DAA4D;IAC5D,KAAK,YAAY,CAAC;IAElB,MAAM,MAAM,GAAG,SAA6B,CAAC;IAE7C,mCAAmC;IACnC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC/C,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,CAAC,CAAC,WAAW,IAAI,SAAS,CAAC;QACvC,IAAI,GAAG,KAAK,SAAS;YAAE,SAAS;QAChC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC9C,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;IAED,yBAAyB;IACzB,MAAM,WAAW,GAAsB,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,QAAQ,EAAE,CAAC;QACtC,MAAM,CAAC,GAAG,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QACrD,IAAI,CAAC;YAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+DAA+D,CAAC,CAAC;QACtF,MAAM,WAAW,GAAoB;YACnC,YAAY,EAAE,GAAG,CAAC,WAAW,EAAE;YAC/B,WAAW,EAAE,IAAI;YACjB,iBAAiB,EAAE,CAAC;YACpB,kBAAkB,EAAE,CAAC;YACrB,SAAS,EAAE,iBAAiB;YAC5B,OAAO,EAAE,EAAE;YACX,eAAe,EAAE,IAAI;SACtB,CAAC;QACF,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACpD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO;IACT,CAAC;IAED,uDAAuD;IACvD,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5B,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC1E,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QACxE,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,GAAG,CAAC,UAAqB,CAAC;YAC1C,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC,IAAI,WAAW,IAAI,CAAC,IAAI,SAAS;gBAAE,KAAK,EAAE,CAAC;QACvD,CAAC;QACD,CAAC,CAAC,iBAAiB,GAAG,KAAK,CAAC;IAC9B,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,iCAAiC,WAAW,CAAC,MAAM,kBAAkB,OAAO,aAAa,CAC1F,CAAC;IAEF,MAAM,cAAc,GAAoB,WAAW,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACzE,MAAM,MAAM,GAAG,eAAe,CAAC,cAAc,CAAC,CAAC;IAE/C,MAAM,OAAO,GAAoB,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1D,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC,WAAW,EAAE;QACtC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;QAChB,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,iBAAiB;QAC5C,QAAQ,EAAE,CAAC;QACX,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;KACrE,CAAC,CAAC,CAAC;IAEJ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAE1C,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IAEtD,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC;IAC5F,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC;IACjG,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC;IACxF,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC;IAEtF,MAAM,MAAM,GAAoB;QAC9B,YAAY,EAAE,GAAG,CAAC,WAAW,EAAE;QAC/B,WAAW,EAAE,IAAI;QACjB,iBAAiB,EAAE,WAAW,CAAC,MAAM;QACrC,kBAAkB,EAAE,SAAS,CAAC,MAAM;QACpC,SAAS,EAAE,iBAAiB;QAC5B,OAAO;QACP,eAAe,EAAE;YACf,oBAAoB,EAAE,MAAM;YAC5B,mBAAmB,EAAE,YAAY;YACjC,cAAc,EAAE,QAAQ;YACxB,eAAe,EAAE,UAAU,GAAG,GAAG;SAClC;KACF,CAAC;IAEF,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,YAAY,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
package/dist/bin/cli.d.ts CHANGED
@@ -7,6 +7,11 @@
7
7
  * serve Start the MCP server
8
8
  * config View or edit configuration
9
9
  * digest Process documents through cortex
10
+ * health Show cortex health report
11
+ * vitals Show behavioral vitals and PE delta
12
+ * anomalies Detect anomalous sessions with Isolation Forest
13
+ * report Generate weekly quality report
14
+ * maintain Data maintenance (fix, re-embed)
10
15
  * help Show help
11
16
  */
12
17
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/bin/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/bin/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG"}