cortex-engine 0.4.2 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -6
- package/dist/bin/anomalies-cmd.d.ts +17 -0
- package/dist/bin/anomalies-cmd.d.ts.map +1 -0
- package/dist/bin/anomalies-cmd.js +417 -0
- package/dist/bin/anomalies-cmd.js.map +1 -0
- package/dist/bin/cli.d.ts +5 -0
- package/dist/bin/cli.d.ts.map +1 -1
- package/dist/bin/cli.js +84 -0
- package/dist/bin/cli.js.map +1 -1
- package/dist/bin/health-cmd.d.ts +15 -0
- package/dist/bin/health-cmd.d.ts.map +1 -0
- package/dist/bin/health-cmd.js +273 -0
- package/dist/bin/health-cmd.js.map +1 -0
- package/dist/bin/init.d.ts.map +1 -1
- package/dist/bin/init.js +197 -13
- package/dist/bin/init.js.map +1 -1
- package/dist/bin/maintain-cmd.d.ts +17 -0
- package/dist/bin/maintain-cmd.d.ts.map +1 -0
- package/dist/bin/maintain-cmd.js +352 -0
- package/dist/bin/maintain-cmd.js.map +1 -0
- package/dist/bin/report-cmd.d.ts +17 -0
- package/dist/bin/report-cmd.d.ts.map +1 -0
- package/dist/bin/report-cmd.js +309 -0
- package/dist/bin/report-cmd.js.map +1 -0
- package/dist/bin/store-factory.d.ts +21 -0
- package/dist/bin/store-factory.d.ts.map +1 -0
- package/dist/bin/store-factory.js +64 -0
- package/dist/bin/store-factory.js.map +1 -0
- package/dist/bin/vitals-cmd.d.ts +16 -0
- package/dist/bin/vitals-cmd.d.ts.map +1 -0
- package/dist/bin/vitals-cmd.js +425 -0
- package/dist/bin/vitals-cmd.js.map +1 -0
- package/dist/core/types.d.ts +6 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/engines/cognition.d.ts.map +1 -1
- package/dist/engines/cognition.js +39 -3
- package/dist/engines/cognition.js.map +1 -1
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/tools.d.ts +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +22 -2
- package/dist/mcp/tools.js.map +1 -1
- package/dist/tools/evolution-list.d.ts +6 -0
- package/dist/tools/evolution-list.d.ts.map +1 -0
- package/dist/tools/evolution-list.js +52 -0
- package/dist/tools/evolution-list.js.map +1 -0
- package/dist/tools/evolve.d.ts +6 -0
- package/dist/tools/evolve.d.ts.map +1 -0
- package/dist/tools/evolve.js +63 -0
- package/dist/tools/evolve.js.map +1 -0
- package/dist/tools/journal-read.d.ts +6 -0
- package/dist/tools/journal-read.d.ts.map +1 -0
- package/dist/tools/journal-read.js +59 -0
- package/dist/tools/journal-read.js.map +1 -0
- package/dist/tools/journal-write.d.ts +6 -0
- package/dist/tools/journal-write.d.ts.map +1 -0
- package/dist/tools/journal-write.js +71 -0
- package/dist/tools/journal-write.js.map +1 -0
- package/dist/tools/thread-create.d.ts +6 -0
- package/dist/tools/thread-create.d.ts.map +1 -0
- package/dist/tools/thread-create.js +57 -0
- package/dist/tools/thread-create.js.map +1 -0
- package/dist/tools/thread-resolve.d.ts +6 -0
- package/dist/tools/thread-resolve.d.ts.map +1 -0
- package/dist/tools/thread-resolve.js +42 -0
- package/dist/tools/thread-resolve.js.map +1 -0
- package/dist/tools/thread-update.d.ts +6 -0
- package/dist/tools/thread-update.d.ts.map +1 -0
- package/dist/tools/thread-update.js +91 -0
- package/dist/tools/thread-update.js.map +1 -0
- package/dist/tools/threads-list.d.ts +6 -0
- package/dist/tools/threads-list.d.ts.map +1 -0
- package/dist/tools/threads-list.js +70 -0
- package/dist/tools/threads-list.js.map +1 -0
- package/package.json +120 -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** —
|
|
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
|
|
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 **[
|
|
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 **[
|
|
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
|
|
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":"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"}
|
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 {};
|
package/dist/bin/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/bin/cli.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/bin/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG"}
|