@adaptivemcp/memory 0.2.5 → 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/LICENSE +21 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/migrations.d.ts +16 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +104 -0
- package/dist/migrations.js.map +1 -0
- package/dist/store.d.ts +107 -5
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +445 -32
- package/dist/store.js.map +1 -1
- package/package.json +7 -7
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Kemal Elmizan
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { DatabaseSync } from "node:sqlite";
|
|
2
|
+
export interface Migration {
|
|
3
|
+
version: number;
|
|
4
|
+
name: string;
|
|
5
|
+
up: (db: DatabaseSync) => void;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Ordered, idempotent schema history. Each migration's `up` must be safe to
|
|
9
|
+
* run against a fresh `:memory:` database (migration 1 recreates the whole
|
|
10
|
+
* schema `IF NOT EXISTS`) as well as against a pre-existing file database
|
|
11
|
+
* that already has these objects from before this framework existed.
|
|
12
|
+
*/
|
|
13
|
+
export declare const MIGRATIONS: Migration[];
|
|
14
|
+
/** Applies every migration in `migrations` that hasn't already been recorded, in version order. */
|
|
15
|
+
export declare function runMigrations(db: DatabaseSync, migrations?: Migration[]): void;
|
|
16
|
+
//# sourceMappingURL=migrations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../src/migrations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,CAAC,EAAE,EAAE,YAAY,KAAK,IAAI,CAAC;CAChC;AAwCD;;;;;GAKG;AACH,eAAO,MAAM,UAAU,EAAE,SAAS,EA2CjC,CAAC;AAEF,mGAAmG;AACnG,wBAAgB,aAAa,CAAC,EAAE,EAAE,YAAY,EAAE,UAAU,GAAE,SAAS,EAAe,GAAG,IAAI,CAkB1F"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
const INIT_SCHEMA = `
|
|
2
|
+
CREATE TABLE IF NOT EXISTS tools (
|
|
3
|
+
tool_name TEXT NOT NULL,
|
|
4
|
+
server_name TEXT NOT NULL DEFAULT '',
|
|
5
|
+
annotation TEXT NOT NULL,
|
|
6
|
+
insights TEXT NOT NULL DEFAULT '[]',
|
|
7
|
+
recommendations TEXT NOT NULL DEFAULT '[]',
|
|
8
|
+
stats TEXT NOT NULL DEFAULT '{}',
|
|
9
|
+
updated_at TEXT NOT NULL,
|
|
10
|
+
PRIMARY KEY (tool_name, server_name)
|
|
11
|
+
);
|
|
12
|
+
|
|
13
|
+
CREATE TABLE IF NOT EXISTS execution_nodes (
|
|
14
|
+
id TEXT PRIMARY KEY,
|
|
15
|
+
tool_name TEXT NOT NULL,
|
|
16
|
+
server_name TEXT,
|
|
17
|
+
session_id TEXT NOT NULL,
|
|
18
|
+
workflow_id TEXT,
|
|
19
|
+
parent_id TEXT,
|
|
20
|
+
children_ids TEXT NOT NULL DEFAULT '[]',
|
|
21
|
+
timestamp TEXT NOT NULL,
|
|
22
|
+
duration_ms INTEGER,
|
|
23
|
+
status TEXT NOT NULL,
|
|
24
|
+
input TEXT,
|
|
25
|
+
output TEXT,
|
|
26
|
+
error TEXT,
|
|
27
|
+
model TEXT,
|
|
28
|
+
cost TEXT,
|
|
29
|
+
metadata TEXT,
|
|
30
|
+
FOREIGN KEY (parent_id) REFERENCES execution_nodes(id)
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
CREATE INDEX IF NOT EXISTS idx_nodes_session ON execution_nodes(session_id);
|
|
34
|
+
CREATE INDEX IF NOT EXISTS idx_nodes_workflow ON execution_nodes(workflow_id);
|
|
35
|
+
CREATE INDEX IF NOT EXISTS idx_nodes_tool ON execution_nodes(tool_name);
|
|
36
|
+
CREATE INDEX IF NOT EXISTS idx_nodes_parent ON execution_nodes(parent_id);
|
|
37
|
+
`;
|
|
38
|
+
/**
|
|
39
|
+
* Ordered, idempotent schema history. Each migration's `up` must be safe to
|
|
40
|
+
* run against a fresh `:memory:` database (migration 1 recreates the whole
|
|
41
|
+
* schema `IF NOT EXISTS`) as well as against a pre-existing file database
|
|
42
|
+
* that already has these objects from before this framework existed.
|
|
43
|
+
*/
|
|
44
|
+
export const MIGRATIONS = [
|
|
45
|
+
{ version: 1, name: "init_schema", up: (db) => db.exec(INIT_SCHEMA) },
|
|
46
|
+
{
|
|
47
|
+
version: 2,
|
|
48
|
+
name: "add_nodes_timestamp_index",
|
|
49
|
+
up: (db) => db.exec(`CREATE INDEX IF NOT EXISTS idx_nodes_timestamp ON execution_nodes(timestamp)`),
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
version: 3,
|
|
53
|
+
name: "add_metric_cells",
|
|
54
|
+
up: (db) => db.exec(`
|
|
55
|
+
CREATE TABLE IF NOT EXISTS metric_cells (
|
|
56
|
+
tool_name TEXT NOT NULL,
|
|
57
|
+
server_name TEXT NOT NULL DEFAULT '',
|
|
58
|
+
window TEXT NOT NULL DEFAULT 'all',
|
|
59
|
+
dims_key TEXT NOT NULL,
|
|
60
|
+
dims TEXT NOT NULL,
|
|
61
|
+
invocations INTEGER NOT NULL DEFAULT 0,
|
|
62
|
+
failures INTEGER NOT NULL DEFAULT 0,
|
|
63
|
+
error_codes TEXT NOT NULL DEFAULT '{}',
|
|
64
|
+
duration_sum REAL NOT NULL DEFAULT 0,
|
|
65
|
+
duration_count INTEGER NOT NULL DEFAULT 0,
|
|
66
|
+
duration_hist TEXT NOT NULL DEFAULT '[]',
|
|
67
|
+
token_in_sum REAL NOT NULL DEFAULT 0,
|
|
68
|
+
token_out_sum REAL NOT NULL DEFAULT 0,
|
|
69
|
+
token_count INTEGER NOT NULL DEFAULT 0,
|
|
70
|
+
cost_sum REAL NOT NULL DEFAULT 0,
|
|
71
|
+
ewma_failure_rate REAL,
|
|
72
|
+
ewma_duration_ms REAL,
|
|
73
|
+
first_seen TEXT,
|
|
74
|
+
last_seen TEXT,
|
|
75
|
+
exemplars TEXT NOT NULL DEFAULT '[]',
|
|
76
|
+
PRIMARY KEY (tool_name, server_name, window, dims_key)
|
|
77
|
+
);
|
|
78
|
+
CREATE INDEX IF NOT EXISTS idx_metric_cells_tool ON metric_cells(tool_name, server_name);
|
|
79
|
+
`),
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
version: 4,
|
|
83
|
+
name: "add_metric_cells_attempts",
|
|
84
|
+
up: (db) => db.exec(`ALTER TABLE metric_cells ADD COLUMN attempts INTEGER NOT NULL DEFAULT 0`),
|
|
85
|
+
},
|
|
86
|
+
];
|
|
87
|
+
/** Applies every migration in `migrations` that hasn't already been recorded, in version order. */
|
|
88
|
+
export function runMigrations(db, migrations = MIGRATIONS) {
|
|
89
|
+
db.exec(`CREATE TABLE IF NOT EXISTS schema_migrations (
|
|
90
|
+
version INTEGER PRIMARY KEY,
|
|
91
|
+
name TEXT NOT NULL,
|
|
92
|
+
applied_at TEXT NOT NULL
|
|
93
|
+
)`);
|
|
94
|
+
const applied = new Set(db.prepare(`SELECT version FROM schema_migrations`).all().map((r) => r.version));
|
|
95
|
+
const ordered = [...migrations].sort((a, b) => a.version - b.version);
|
|
96
|
+
const insert = db.prepare(`INSERT INTO schema_migrations (version, name, applied_at) VALUES (?, ?, ?)`);
|
|
97
|
+
for (const migration of ordered) {
|
|
98
|
+
if (applied.has(migration.version))
|
|
99
|
+
continue;
|
|
100
|
+
migration.up(db);
|
|
101
|
+
insert.run(migration.version, migration.name, new Date().toISOString());
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=migrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../src/migrations.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoCnB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,UAAU,GAAgB;IACrC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;IACrE;QACE,OAAO,EAAE,CAAC;QACV,IAAI,EAAE,2BAA2B;QACjC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,8EAA8E,CAAC;KACpG;IACD;QACE,OAAO,EAAE,CAAC;QACV,IAAI,EAAE,kBAAkB;QACxB,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CACT,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;CAyBb,CAAC;KACC;IACD;QACE,OAAO,EAAE,CAAC;QACV,IAAI,EAAE,2BAA2B;QACjC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,yEAAyE,CAAC;KAC/F;CACF,CAAC;AAEF,mGAAmG;AACnG,MAAM,UAAU,aAAa,CAAC,EAAgB,EAAE,aAA0B,UAAU;IAClF,EAAE,CAAC,IAAI,CACL;;;;MAIE,CACH,CAAC;IACF,MAAM,OAAO,GAAG,IAAI,GAAG,CACpB,EAAE,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC,GAAG,EAA4B,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAC3G,CAAC;IACF,MAAM,OAAO,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;IACtE,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,4EAA4E,CAAC,CAAC;IACxG,KAAK,MAAM,SAAS,IAAI,OAAO,EAAE,CAAC;QAChC,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC;YAAE,SAAS;QAC7C,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACjB,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IAC1E,CAAC;AACH,CAAC"}
|
package/dist/store.d.ts
CHANGED
|
@@ -1,9 +1,32 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import type { Annotation, Insight, Recommendation, RecommendationType, Store, ToolExecutionEvent, ToolRecord } from "@adaptivemcp/spec";
|
|
1
|
+
import type { DatabaseSyncOptions } from "node:sqlite";
|
|
2
|
+
import type { Annotation, Insight, MetricCell, Recommendation, RecommendationType, Store, ToolExecutionEvent, ToolRecord, ExecutionNode } from "@adaptivemcp/spec";
|
|
3
|
+
export interface MemoryStorePragmaOptions {
|
|
4
|
+
journalMode?: string;
|
|
5
|
+
synchronous?: string;
|
|
6
|
+
busyTimeoutMs?: number;
|
|
7
|
+
}
|
|
3
8
|
export interface MemoryStoreOptions {
|
|
4
9
|
/** Path to the SQLite database file. Use ":memory:" for an in-memory store. */
|
|
5
10
|
path?: string;
|
|
6
11
|
dbOptions?: DatabaseSyncOptions;
|
|
12
|
+
/**
|
|
13
|
+
* PRAGMA overrides. `journalMode` is ignored for `:memory:` stores, since
|
|
14
|
+
* WAL requires a file on disk. Defaults: journalMode "WAL", synchronous
|
|
15
|
+
* "NORMAL", busyTimeoutMs 5000. `foreign_keys` is always enabled.
|
|
16
|
+
*/
|
|
17
|
+
pragmas?: MemoryStorePragmaOptions;
|
|
18
|
+
/** When set, `recordExecutionNode` opportunistically prunes nodes older than `maxAgeMs`. */
|
|
19
|
+
retention?: {
|
|
20
|
+
maxAgeMs: number;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Cardinality guardrail for metric cells: cap the number of distinct `model`
|
|
24
|
+
* dimensions per tool; new models past the cap fold into a single `other`
|
|
25
|
+
* bucket. Defaults to 8.
|
|
26
|
+
*/
|
|
27
|
+
metricCardinality?: {
|
|
28
|
+
maxModelsPerTool?: number;
|
|
29
|
+
};
|
|
7
30
|
}
|
|
8
31
|
/**
|
|
9
32
|
* SQLite-backed store for Adaptive MCP.
|
|
@@ -14,11 +37,36 @@ export interface MemoryStoreOptions {
|
|
|
14
37
|
*/
|
|
15
38
|
export declare class MemoryStore implements Store {
|
|
16
39
|
private db;
|
|
40
|
+
private readonly isMemory;
|
|
41
|
+
private readonly retention?;
|
|
42
|
+
private readonly maxModelsPerTool;
|
|
43
|
+
private lastPrunedAt;
|
|
17
44
|
constructor(options?: MemoryStoreOptions);
|
|
18
45
|
close(): void;
|
|
19
|
-
/**
|
|
46
|
+
/**
|
|
47
|
+
* Ensure a tool record exists, seeding it with an empty annotation.
|
|
48
|
+
*
|
|
49
|
+
* - When `serverName` is omitted, reuses whatever record already exists for
|
|
50
|
+
* that `toolName` (any server) rather than creating a second,
|
|
51
|
+
* disconnected row — callers that don't know the server shouldn't
|
|
52
|
+
* fragment a tool they've already ensured elsewhere with a known server.
|
|
53
|
+
* - When `serverName` is given but no exact match exists, "claims" an
|
|
54
|
+
* unclaimed record (one created by a serverName-less caller, e.g. a human
|
|
55
|
+
* annotation set before any execution was observed) instead of
|
|
56
|
+
* fragmenting it into a second row — the first time a server becomes
|
|
57
|
+
* known for a tool, its prior annotation/insights/recommendations carry
|
|
58
|
+
* forward onto that server's row.
|
|
59
|
+
*/
|
|
20
60
|
ensureTool(toolName: string, serverName?: string): ToolRecord;
|
|
21
|
-
|
|
61
|
+
/** Reassign an unclaimed row's `server_name` in place once it's learned. */
|
|
62
|
+
private claimServer;
|
|
63
|
+
/**
|
|
64
|
+
* Read a single tool record. When `serverName` is given, looks up the exact
|
|
65
|
+
* `(toolName, serverName)` row. Otherwise falls back to the most recently
|
|
66
|
+
* updated row with that `toolName` — correct as long as the name isn't
|
|
67
|
+
* shared across servers, ambiguous (but non-crashing) if it is.
|
|
68
|
+
*/
|
|
69
|
+
getTool(toolName: string, serverName?: string): ToolRecord | undefined;
|
|
22
70
|
allTools(): ToolRecord[];
|
|
23
71
|
/** Persist a human-written annotation (the static metadata layer). */
|
|
24
72
|
setAnnotation(annotation: Annotation): ToolRecord;
|
|
@@ -31,9 +79,63 @@ export declare class MemoryStore implements Store {
|
|
|
31
79
|
* orchestration, and approval packages so each adaptation pass recomputes its
|
|
32
80
|
* own recommendations instead of appending duplicates on every observation.
|
|
33
81
|
*/
|
|
34
|
-
clearRecommendations(toolName: string, type: RecommendationType): ToolRecord;
|
|
82
|
+
clearRecommendations(toolName: string, type: RecommendationType, serverName?: string): ToolRecord;
|
|
35
83
|
/** Fold a tool execution event into the persisted stats. */
|
|
36
84
|
recordExecution(event: ToolExecutionEvent): ToolRecord;
|
|
85
|
+
/**
|
|
86
|
+
* Read pre-aggregated metric cells (bounded dimensional rollups). This is the
|
|
87
|
+
* durable, queryable metadata layer that replaces a raw events table.
|
|
88
|
+
*/
|
|
89
|
+
metricCells(options?: {
|
|
90
|
+
toolName?: string;
|
|
91
|
+
serverName?: string;
|
|
92
|
+
}): MetricCell[];
|
|
93
|
+
/** Pre-aggregate an event into the bounded set of metric cells it belongs to. */
|
|
94
|
+
private foldMetricCells;
|
|
95
|
+
/**
|
|
96
|
+
* Cardinality guardrail: fold new models past the per-tool cap into a single
|
|
97
|
+
* `other` bucket. Existing models and the bucket itself always pass through.
|
|
98
|
+
*/
|
|
99
|
+
private capModel;
|
|
100
|
+
private readMetricCell;
|
|
101
|
+
private writeMetricCell;
|
|
102
|
+
/** `server_name` is part of the primary key, so it's matched in WHERE, not reassigned in SET. */
|
|
37
103
|
private write;
|
|
104
|
+
/** Record an execution node in the graph. */
|
|
105
|
+
recordExecutionNode(node: ExecutionNode): ExecutionNode;
|
|
106
|
+
/**
|
|
107
|
+
* Delete execution nodes older than `olderThanMs`. Does not cascade-clean
|
|
108
|
+
* dangling `parent_id`/`children_ids` references left on surviving rows —
|
|
109
|
+
* acceptable for a best-effort retention pass; callers relying on strict
|
|
110
|
+
* graph integrity should prune with generous windows.
|
|
111
|
+
*/
|
|
112
|
+
pruneExecutionNodes(olderThanMs: number, now?: number): {
|
|
113
|
+
deleted: number;
|
|
114
|
+
};
|
|
115
|
+
private maybeOpportunisticPrune;
|
|
116
|
+
/** Delete hourly (non-`all`) metric cells older than `olderThanMs`; `all` is kept. */
|
|
117
|
+
pruneMetricCells(olderThanMs: number, now?: number): {
|
|
118
|
+
deleted: number;
|
|
119
|
+
};
|
|
120
|
+
/** Get an execution node by ID. */
|
|
121
|
+
getExecutionNode(id: string): ExecutionNode | undefined;
|
|
122
|
+
/** Get all nodes for a session. */
|
|
123
|
+
getNodesBySession(sessionId: string): ExecutionNode[];
|
|
124
|
+
/** Get all nodes for a workflow (across sessions). */
|
|
125
|
+
getNodesByWorkflow(workflowId: string): ExecutionNode[];
|
|
126
|
+
/** Get every distinct workflow ID that has at least one recorded execution node. */
|
|
127
|
+
getWorkflowIds(): string[];
|
|
128
|
+
/** Get every distinct session ID that has at least one recorded execution node. */
|
|
129
|
+
getSessionIds(): string[];
|
|
130
|
+
/** Get children of a node. */
|
|
131
|
+
getChildren(parentId: string): ExecutionNode[];
|
|
132
|
+
/** Get parent of a node. */
|
|
133
|
+
getParent(childId: string): ExecutionNode | undefined;
|
|
134
|
+
/** Get root nodes (no parent) for a session. */
|
|
135
|
+
getRootNodes(sessionId: string): ExecutionNode[];
|
|
136
|
+
/** Get leaf nodes (no children) for a session. */
|
|
137
|
+
getLeafNodes(sessionId: string): ExecutionNode[];
|
|
138
|
+
/** Update children IDs of a parent node. */
|
|
139
|
+
updateChildrenIds(parentId: string, childrenIds: string[]): void;
|
|
38
140
|
}
|
|
39
141
|
//# sourceMappingURL=store.d.ts.map
|
package/dist/store.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|
package/dist/store.js
CHANGED
|
@@ -1,15 +1,22 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
import { runMigrations } from "./migrations.js";
|
|
3
|
+
const { DatabaseSync: DatabaseSyncCtor } = createRequire(import.meta.url)("node:sqlite");
|
|
4
|
+
const DEFAULT_PRAGMAS = {
|
|
5
|
+
journalMode: "WAL",
|
|
6
|
+
synchronous: "NORMAL",
|
|
7
|
+
busyTimeoutMs: 5000,
|
|
8
|
+
};
|
|
9
|
+
/** Opportunistic pruning is throttled to at most once per this interval, to avoid a DELETE scan on every write. */
|
|
10
|
+
const RETENTION_CHECK_INTERVAL_MS = 60 * 60 * 1000;
|
|
11
|
+
/**
|
|
12
|
+
* `server_name` is part of the primary key, not just a stored column: two
|
|
13
|
+
* different MCP servers may expose a tool with the same name, and keying on
|
|
14
|
+
* `tool_name` alone would let one server's record silently overwrite the
|
|
15
|
+
* other's. It defaults to `''` (rather than being nullable) because SQLite
|
|
16
|
+
* treats every NULL as distinct in a UNIQUE/PRIMARY KEY index, which would
|
|
17
|
+
* defeat the composite key for the common case where the server is unknown.
|
|
18
|
+
*/
|
|
19
|
+
const UNKNOWN_SERVER = "";
|
|
13
20
|
/**
|
|
14
21
|
* SQLite-backed store for Adaptive MCP.
|
|
15
22
|
*
|
|
@@ -19,23 +26,56 @@ CREATE TABLE IF NOT EXISTS tools (
|
|
|
19
26
|
*/
|
|
20
27
|
export class MemoryStore {
|
|
21
28
|
db;
|
|
29
|
+
isMemory;
|
|
30
|
+
retention;
|
|
31
|
+
maxModelsPerTool;
|
|
32
|
+
lastPrunedAt = 0;
|
|
22
33
|
constructor(options = {}) {
|
|
23
|
-
|
|
24
|
-
this.
|
|
34
|
+
const path = options.path ?? ":memory:";
|
|
35
|
+
this.isMemory = path === ":memory:";
|
|
36
|
+
this.retention = options.retention;
|
|
37
|
+
this.maxModelsPerTool = options.metricCardinality?.maxModelsPerTool ?? 8;
|
|
38
|
+
this.db = new DatabaseSyncCtor(path, options.dbOptions ?? {});
|
|
39
|
+
const pragmas = { ...DEFAULT_PRAGMAS, ...options.pragmas };
|
|
40
|
+
if (!this.isMemory) {
|
|
41
|
+
this.db.exec(`PRAGMA journal_mode = ${pragmas.journalMode}`);
|
|
42
|
+
}
|
|
43
|
+
this.db.exec(`PRAGMA synchronous = ${pragmas.synchronous}`);
|
|
44
|
+
this.db.exec(`PRAGMA foreign_keys = ON`);
|
|
45
|
+
this.db.exec(`PRAGMA busy_timeout = ${pragmas.busyTimeoutMs}`);
|
|
46
|
+
runMigrations(this.db);
|
|
25
47
|
}
|
|
26
48
|
close() {
|
|
27
49
|
this.db.close();
|
|
28
50
|
}
|
|
29
|
-
/**
|
|
51
|
+
/**
|
|
52
|
+
* Ensure a tool record exists, seeding it with an empty annotation.
|
|
53
|
+
*
|
|
54
|
+
* - When `serverName` is omitted, reuses whatever record already exists for
|
|
55
|
+
* that `toolName` (any server) rather than creating a second,
|
|
56
|
+
* disconnected row — callers that don't know the server shouldn't
|
|
57
|
+
* fragment a tool they've already ensured elsewhere with a known server.
|
|
58
|
+
* - When `serverName` is given but no exact match exists, "claims" an
|
|
59
|
+
* unclaimed record (one created by a serverName-less caller, e.g. a human
|
|
60
|
+
* annotation set before any execution was observed) instead of
|
|
61
|
+
* fragmenting it into a second row — the first time a server becomes
|
|
62
|
+
* known for a tool, its prior annotation/insights/recommendations carry
|
|
63
|
+
* forward onto that server's row.
|
|
64
|
+
*/
|
|
30
65
|
ensureTool(toolName, serverName) {
|
|
31
|
-
const existing = this.getTool(toolName);
|
|
66
|
+
const existing = this.getTool(toolName, serverName);
|
|
32
67
|
if (existing)
|
|
33
68
|
return existing;
|
|
69
|
+
if (serverName !== undefined) {
|
|
70
|
+
const unclaimed = this.getTool(toolName, UNKNOWN_SERVER);
|
|
71
|
+
if (unclaimed)
|
|
72
|
+
return this.claimServer(unclaimed, serverName);
|
|
73
|
+
}
|
|
34
74
|
const now = new Date().toISOString();
|
|
35
75
|
const record = {
|
|
36
76
|
toolName,
|
|
37
77
|
serverName,
|
|
38
|
-
annotation: { toolName },
|
|
78
|
+
annotation: { toolName, serverName },
|
|
39
79
|
insights: [],
|
|
40
80
|
recommendations: [],
|
|
41
81
|
stats: emptyStats(),
|
|
@@ -44,24 +84,47 @@ export class MemoryStore {
|
|
|
44
84
|
this.db
|
|
45
85
|
.prepare(`INSERT INTO tools (tool_name, server_name, annotation, insights, recommendations, stats, updated_at)
|
|
46
86
|
VALUES (?, ?, ?, ?, ?, ?, ?)`)
|
|
47
|
-
.run(toolName, serverName ??
|
|
87
|
+
.run(toolName, serverName ?? UNKNOWN_SERVER, JSON.stringify(record.annotation), JSON.stringify(record.insights), JSON.stringify(record.recommendations), JSON.stringify(record.stats), now);
|
|
48
88
|
return record;
|
|
49
89
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
90
|
+
/** Reassign an unclaimed row's `server_name` in place once it's learned. */
|
|
91
|
+
claimServer(record, serverName) {
|
|
92
|
+
const updated = {
|
|
93
|
+
...record,
|
|
94
|
+
serverName,
|
|
95
|
+
annotation: { ...record.annotation, serverName },
|
|
96
|
+
updatedAt: new Date().toISOString(),
|
|
97
|
+
};
|
|
98
|
+
this.db
|
|
99
|
+
.prepare(`UPDATE tools SET server_name = ?, annotation = ?, updated_at = ? WHERE tool_name = ? AND server_name = ?`)
|
|
100
|
+
.run(serverName, JSON.stringify(updated.annotation), updated.updatedAt, record.toolName, UNKNOWN_SERVER);
|
|
101
|
+
return updated;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Read a single tool record. When `serverName` is given, looks up the exact
|
|
105
|
+
* `(toolName, serverName)` row. Otherwise falls back to the most recently
|
|
106
|
+
* updated row with that `toolName` — correct as long as the name isn't
|
|
107
|
+
* shared across servers, ambiguous (but non-crashing) if it is.
|
|
108
|
+
*/
|
|
109
|
+
getTool(toolName, serverName) {
|
|
110
|
+
const row = serverName !== undefined
|
|
111
|
+
? this.db
|
|
112
|
+
.prepare(`SELECT * FROM tools WHERE tool_name = ? AND server_name = ?`)
|
|
113
|
+
.get(toolName, serverName)
|
|
114
|
+
: this.db
|
|
115
|
+
.prepare(`SELECT * FROM tools WHERE tool_name = ? ORDER BY updated_at DESC LIMIT 1`)
|
|
116
|
+
.get(toolName);
|
|
54
117
|
return row ? deserialize(row) : undefined;
|
|
55
118
|
}
|
|
56
119
|
allTools() {
|
|
57
120
|
const rows = this.db
|
|
58
|
-
.prepare(`SELECT * FROM tools ORDER BY tool_name`)
|
|
121
|
+
.prepare(`SELECT * FROM tools ORDER BY tool_name, server_name`)
|
|
59
122
|
.all();
|
|
60
123
|
return rows.map(deserialize);
|
|
61
124
|
}
|
|
62
125
|
/** Persist a human-written annotation (the static metadata layer). */
|
|
63
126
|
setAnnotation(annotation) {
|
|
64
|
-
const record = this.ensureTool(annotation.toolName);
|
|
127
|
+
const record = this.ensureTool(annotation.toolName, annotation.serverName);
|
|
65
128
|
const updated = {
|
|
66
129
|
...record,
|
|
67
130
|
annotation: { ...record.annotation, ...annotation },
|
|
@@ -72,7 +135,7 @@ export class MemoryStore {
|
|
|
72
135
|
}
|
|
73
136
|
/** Record a learned insight derived from observed behavior. */
|
|
74
137
|
addInsight(insight) {
|
|
75
|
-
const record = this.ensureTool(insight.toolName);
|
|
138
|
+
const record = this.ensureTool(insight.toolName, insight.serverName);
|
|
76
139
|
const insights = [...record.insights.filter((i) => i.key !== insight.key), insight];
|
|
77
140
|
const updated = {
|
|
78
141
|
...record,
|
|
@@ -84,7 +147,7 @@ export class MemoryStore {
|
|
|
84
147
|
}
|
|
85
148
|
/** Store a suggested adaptation. */
|
|
86
149
|
addRecommendation(rec) {
|
|
87
|
-
const record = this.ensureTool(rec.toolName);
|
|
150
|
+
const record = this.ensureTool(rec.toolName, rec.serverName);
|
|
88
151
|
const updated = {
|
|
89
152
|
...record,
|
|
90
153
|
recommendations: [...record.recommendations, rec],
|
|
@@ -98,8 +161,8 @@ export class MemoryStore {
|
|
|
98
161
|
* orchestration, and approval packages so each adaptation pass recomputes its
|
|
99
162
|
* own recommendations instead of appending duplicates on every observation.
|
|
100
163
|
*/
|
|
101
|
-
clearRecommendations(toolName, type) {
|
|
102
|
-
const record = this.ensureTool(toolName);
|
|
164
|
+
clearRecommendations(toolName, type, serverName) {
|
|
165
|
+
const record = this.ensureTool(toolName, serverName);
|
|
103
166
|
const updated = {
|
|
104
167
|
...record,
|
|
105
168
|
recommendations: record.recommendations.filter((r) => r.type !== type),
|
|
@@ -119,15 +182,226 @@ export class MemoryStore {
|
|
|
119
182
|
updatedAt: new Date().toISOString(),
|
|
120
183
|
};
|
|
121
184
|
this.write(updated);
|
|
185
|
+
this.foldMetricCells(event);
|
|
122
186
|
return updated;
|
|
123
187
|
}
|
|
188
|
+
/**
|
|
189
|
+
* Read pre-aggregated metric cells (bounded dimensional rollups). This is the
|
|
190
|
+
* durable, queryable metadata layer that replaces a raw events table.
|
|
191
|
+
*/
|
|
192
|
+
metricCells(options = {}) {
|
|
193
|
+
const clauses = [];
|
|
194
|
+
const params = [];
|
|
195
|
+
if (options.toolName !== undefined) {
|
|
196
|
+
clauses.push("tool_name = ?");
|
|
197
|
+
params.push(options.toolName);
|
|
198
|
+
}
|
|
199
|
+
if (options.serverName !== undefined) {
|
|
200
|
+
clauses.push("server_name = ?");
|
|
201
|
+
params.push(options.serverName);
|
|
202
|
+
}
|
|
203
|
+
const where = clauses.length > 0 ? ` WHERE ${clauses.join(" AND ")}` : "";
|
|
204
|
+
const rows = this.db
|
|
205
|
+
.prepare(`SELECT * FROM metric_cells${where} ORDER BY tool_name, server_name, dims_key`)
|
|
206
|
+
.all(...params);
|
|
207
|
+
return rows.map(deserializeMetricCell);
|
|
208
|
+
}
|
|
209
|
+
/** Pre-aggregate an event into the bounded set of metric cells it belongs to. */
|
|
210
|
+
foldMetricCells(event) {
|
|
211
|
+
const now = event.timestamp ?? new Date().toISOString();
|
|
212
|
+
const model = event.model !== undefined
|
|
213
|
+
? this.capModel(event.toolName, event.serverName ?? UNKNOWN_SERVER, event.model)
|
|
214
|
+
: undefined;
|
|
215
|
+
for (const dimensions of cellDimensionsFor(event, model)) {
|
|
216
|
+
const key = dimsKey(dimensions);
|
|
217
|
+
// The overall `{}` cell also gets an hourly window (for drift); dimensioned
|
|
218
|
+
// cells keep only the lifetime aggregate to bound write amplification.
|
|
219
|
+
const windows = Object.keys(dimensions).length === 0 ? ["all", windowKey(now)] : ["all"];
|
|
220
|
+
for (const window of windows) {
|
|
221
|
+
const existing = this.readMetricCell(event.toolName, event.serverName ?? UNKNOWN_SERVER, window, key);
|
|
222
|
+
this.writeMetricCell(foldMetricCell(existing, event, dimensions, window, now), key);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Cardinality guardrail: fold new models past the per-tool cap into a single
|
|
228
|
+
* `other` bucket. Existing models and the bucket itself always pass through.
|
|
229
|
+
*/
|
|
230
|
+
capModel(toolName, serverName, model) {
|
|
231
|
+
if (model === "other")
|
|
232
|
+
return model;
|
|
233
|
+
const rows = this.db
|
|
234
|
+
.prepare(`SELECT dims FROM metric_cells WHERE tool_name = ? AND server_name = ? AND window = 'all'`)
|
|
235
|
+
.all(toolName, serverName);
|
|
236
|
+
const models = new Set();
|
|
237
|
+
for (const row of rows) {
|
|
238
|
+
const dims = JSON.parse(row.dims);
|
|
239
|
+
if (dims.model)
|
|
240
|
+
models.add(dims.model);
|
|
241
|
+
}
|
|
242
|
+
if (models.has(model) || models.size < this.maxModelsPerTool)
|
|
243
|
+
return model;
|
|
244
|
+
return "other";
|
|
245
|
+
}
|
|
246
|
+
readMetricCell(toolName, serverName, window, dimsKeyValue) {
|
|
247
|
+
const row = this.db
|
|
248
|
+
.prepare(`SELECT * FROM metric_cells WHERE tool_name = ? AND server_name = ? AND window = ? AND dims_key = ?`)
|
|
249
|
+
.get(toolName, serverName, window, dimsKeyValue);
|
|
250
|
+
return row ? deserializeMetricCell(row) : undefined;
|
|
251
|
+
}
|
|
252
|
+
writeMetricCell(cell, dimsKeyValue) {
|
|
253
|
+
this.db
|
|
254
|
+
.prepare(`INSERT OR REPLACE INTO metric_cells (
|
|
255
|
+
tool_name, server_name, window, dims_key, dims,
|
|
256
|
+
invocations, failures, attempts, error_codes,
|
|
257
|
+
duration_sum, duration_count, duration_hist,
|
|
258
|
+
token_in_sum, token_out_sum, token_count, cost_sum,
|
|
259
|
+
ewma_failure_rate, ewma_duration_ms, first_seen, last_seen, exemplars
|
|
260
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
|
|
261
|
+
.run(cell.toolName, cell.serverName ?? UNKNOWN_SERVER, cell.window, dimsKeyValue, JSON.stringify(cell.dimensions), cell.invocations, cell.failures, cell.attempts, JSON.stringify(cell.errorCodes), cell.durationSum, cell.durationCount, JSON.stringify(cell.durationHistogram), cell.tokenInSum, cell.tokenOutSum, cell.tokenCount, cell.costSum, cell.ewmaFailureRate ?? null, cell.ewmaDurationMs ?? null, cell.firstSeen, cell.lastSeen, JSON.stringify(cell.exemplars));
|
|
262
|
+
}
|
|
263
|
+
/** `server_name` is part of the primary key, so it's matched in WHERE, not reassigned in SET. */
|
|
124
264
|
write(record) {
|
|
125
265
|
this.db
|
|
126
266
|
.prepare(`UPDATE tools
|
|
127
|
-
SET
|
|
128
|
-
WHERE tool_name = ?`)
|
|
129
|
-
.run(
|
|
267
|
+
SET annotation = ?, insights = ?, recommendations = ?, stats = ?, updated_at = ?
|
|
268
|
+
WHERE tool_name = ? AND server_name = ?`)
|
|
269
|
+
.run(JSON.stringify(record.annotation), JSON.stringify(record.insights), JSON.stringify(record.recommendations), JSON.stringify(record.stats), record.updatedAt, record.toolName, record.serverName ?? UNKNOWN_SERVER);
|
|
270
|
+
}
|
|
271
|
+
/** Record an execution node in the graph. */
|
|
272
|
+
recordExecutionNode(node) {
|
|
273
|
+
this.db
|
|
274
|
+
.prepare(`INSERT OR REPLACE INTO execution_nodes (id, tool_name, server_name, session_id, workflow_id, parent_id, children_ids, timestamp, duration_ms, status, input, output, error, model, cost, metadata)
|
|
275
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
|
|
276
|
+
.run(node.id, node.toolName, node.serverName ?? null, node.sessionId, node.workflowId ?? null, node.parentId ?? null, JSON.stringify(node.childrenIds ?? []), node.timestamp, node.durationMs ?? null, node.status, node.input ? JSON.stringify(node.input) : null, node.output ? JSON.stringify(node.output) : null, node.error ? JSON.stringify(node.error) : null, node.model ?? null, node.cost ? JSON.stringify(node.cost) : null, node.metadata ? JSON.stringify(node.metadata) : null);
|
|
277
|
+
this.maybeOpportunisticPrune();
|
|
278
|
+
return node;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Delete execution nodes older than `olderThanMs`. Does not cascade-clean
|
|
282
|
+
* dangling `parent_id`/`children_ids` references left on surviving rows —
|
|
283
|
+
* acceptable for a best-effort retention pass; callers relying on strict
|
|
284
|
+
* graph integrity should prune with generous windows.
|
|
285
|
+
*/
|
|
286
|
+
pruneExecutionNodes(olderThanMs, now = Date.now()) {
|
|
287
|
+
const cutoff = new Date(now - olderThanMs).toISOString();
|
|
288
|
+
const result = this.db.prepare(`DELETE FROM execution_nodes WHERE timestamp < ?`).run(cutoff);
|
|
289
|
+
this.lastPrunedAt = now;
|
|
290
|
+
return { deleted: Number(result.changes) };
|
|
291
|
+
}
|
|
292
|
+
maybeOpportunisticPrune() {
|
|
293
|
+
if (!this.retention)
|
|
294
|
+
return;
|
|
295
|
+
const now = Date.now();
|
|
296
|
+
if (now - this.lastPrunedAt < RETENTION_CHECK_INTERVAL_MS)
|
|
297
|
+
return;
|
|
298
|
+
this.pruneExecutionNodes(this.retention.maxAgeMs, now);
|
|
299
|
+
this.pruneMetricCells(this.retention.maxAgeMs, now);
|
|
300
|
+
}
|
|
301
|
+
/** Delete hourly (non-`all`) metric cells older than `olderThanMs`; `all` is kept. */
|
|
302
|
+
pruneMetricCells(olderThanMs, now = Date.now()) {
|
|
303
|
+
const cutoff = new Date(now - olderThanMs).toISOString();
|
|
304
|
+
const result = this.db
|
|
305
|
+
.prepare(`DELETE FROM metric_cells WHERE window != 'all' AND last_seen < ?`)
|
|
306
|
+
.run(cutoff);
|
|
307
|
+
return { deleted: Number(result.changes) };
|
|
308
|
+
}
|
|
309
|
+
/** Get an execution node by ID. */
|
|
310
|
+
getExecutionNode(id) {
|
|
311
|
+
const row = this.db
|
|
312
|
+
.prepare(`SELECT * FROM execution_nodes WHERE id = ?`)
|
|
313
|
+
.get(id);
|
|
314
|
+
return row ? deserializeExecutionNode(row) : undefined;
|
|
315
|
+
}
|
|
316
|
+
/** Get all nodes for a session. */
|
|
317
|
+
getNodesBySession(sessionId) {
|
|
318
|
+
const rows = this.db
|
|
319
|
+
.prepare(`SELECT * FROM execution_nodes WHERE session_id = ? ORDER BY timestamp`)
|
|
320
|
+
.all(sessionId);
|
|
321
|
+
return rows.map(deserializeExecutionNode);
|
|
322
|
+
}
|
|
323
|
+
/** Get all nodes for a workflow (across sessions). */
|
|
324
|
+
getNodesByWorkflow(workflowId) {
|
|
325
|
+
const rows = this.db
|
|
326
|
+
.prepare(`SELECT * FROM execution_nodes WHERE workflow_id = ? ORDER BY timestamp`)
|
|
327
|
+
.all(workflowId);
|
|
328
|
+
return rows.map(deserializeExecutionNode);
|
|
130
329
|
}
|
|
330
|
+
/** Get every distinct workflow ID that has at least one recorded execution node. */
|
|
331
|
+
getWorkflowIds() {
|
|
332
|
+
const rows = this.db
|
|
333
|
+
.prepare(`SELECT DISTINCT workflow_id FROM execution_nodes WHERE workflow_id IS NOT NULL`)
|
|
334
|
+
.all();
|
|
335
|
+
return rows.map((r) => r.workflow_id);
|
|
336
|
+
}
|
|
337
|
+
/** Get every distinct session ID that has at least one recorded execution node. */
|
|
338
|
+
getSessionIds() {
|
|
339
|
+
const rows = this.db
|
|
340
|
+
.prepare(`SELECT DISTINCT session_id FROM execution_nodes`)
|
|
341
|
+
.all();
|
|
342
|
+
return rows.map((r) => r.session_id);
|
|
343
|
+
}
|
|
344
|
+
/** Get children of a node. */
|
|
345
|
+
getChildren(parentId) {
|
|
346
|
+
const parent = this.getExecutionNode(parentId);
|
|
347
|
+
if (!parent)
|
|
348
|
+
return [];
|
|
349
|
+
const childIds = parent.childrenIds;
|
|
350
|
+
if (childIds.length === 0)
|
|
351
|
+
return [];
|
|
352
|
+
const placeholders = childIds.map(() => "?").join(",");
|
|
353
|
+
const rows = this.db
|
|
354
|
+
.prepare(`SELECT * FROM execution_nodes WHERE id IN (${placeholders})`)
|
|
355
|
+
.all(...childIds);
|
|
356
|
+
return rows.map(deserializeExecutionNode);
|
|
357
|
+
}
|
|
358
|
+
/** Get parent of a node. */
|
|
359
|
+
getParent(childId) {
|
|
360
|
+
const child = this.getExecutionNode(childId);
|
|
361
|
+
if (!child || !child.parentId)
|
|
362
|
+
return undefined;
|
|
363
|
+
return this.getExecutionNode(child.parentId);
|
|
364
|
+
}
|
|
365
|
+
/** Get root nodes (no parent) for a session. */
|
|
366
|
+
getRootNodes(sessionId) {
|
|
367
|
+
const rows = this.db
|
|
368
|
+
.prepare(`SELECT * FROM execution_nodes WHERE session_id = ? AND parent_id IS NULL ORDER BY timestamp`)
|
|
369
|
+
.all(sessionId);
|
|
370
|
+
return rows.map(deserializeExecutionNode);
|
|
371
|
+
}
|
|
372
|
+
/** Get leaf nodes (no children) for a session. */
|
|
373
|
+
getLeafNodes(sessionId) {
|
|
374
|
+
const rows = this.db
|
|
375
|
+
.prepare(`SELECT * FROM execution_nodes WHERE session_id = ? AND children_ids = '[]' ORDER BY timestamp`)
|
|
376
|
+
.all(sessionId);
|
|
377
|
+
return rows.map(deserializeExecutionNode);
|
|
378
|
+
}
|
|
379
|
+
/** Update children IDs of a parent node. */
|
|
380
|
+
updateChildrenIds(parentId, childrenIds) {
|
|
381
|
+
this.db
|
|
382
|
+
.prepare(`UPDATE execution_nodes SET children_ids = ? WHERE id = ?`)
|
|
383
|
+
.run(JSON.stringify(childrenIds), parentId);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
function deserializeExecutionNode(row) {
|
|
387
|
+
return {
|
|
388
|
+
id: row.id,
|
|
389
|
+
toolName: row.tool_name,
|
|
390
|
+
serverName: row.server_name ?? undefined,
|
|
391
|
+
sessionId: row.session_id,
|
|
392
|
+
workflowId: row.workflow_id ?? undefined,
|
|
393
|
+
parentId: row.parent_id ?? undefined,
|
|
394
|
+
childrenIds: JSON.parse(row.children_ids),
|
|
395
|
+
timestamp: row.timestamp,
|
|
396
|
+
durationMs: row.duration_ms ?? undefined,
|
|
397
|
+
status: row.status,
|
|
398
|
+
input: row.input ? JSON.parse(row.input) : undefined,
|
|
399
|
+
output: row.output ? JSON.parse(row.output) : undefined,
|
|
400
|
+
error: row.error ? JSON.parse(row.error) : undefined,
|
|
401
|
+
model: row.model ?? undefined,
|
|
402
|
+
cost: row.cost ? JSON.parse(row.cost) : undefined,
|
|
403
|
+
metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
|
|
404
|
+
};
|
|
131
405
|
}
|
|
132
406
|
function emptyStats() {
|
|
133
407
|
return {
|
|
@@ -137,6 +411,7 @@ function emptyStats() {
|
|
|
137
411
|
avgDurationMs: null,
|
|
138
412
|
totalCost: 0,
|
|
139
413
|
lastObservedAt: null,
|
|
414
|
+
avgOutputTokens: undefined,
|
|
140
415
|
};
|
|
141
416
|
}
|
|
142
417
|
function foldEvent(stats, event) {
|
|
@@ -148,6 +423,10 @@ function foldEvent(stats, event) {
|
|
|
148
423
|
? (prevAvg * (invocations - 1) + durations[0]) / invocations
|
|
149
424
|
: stats.avgDurationMs;
|
|
150
425
|
const totalCost = stats.totalCost + (event.cost?.amount ?? 0);
|
|
426
|
+
// Track average output tokens for context cost
|
|
427
|
+
const outputTokens = eventTokens(event).outputTokens ?? 0;
|
|
428
|
+
const prevAvgTokens = stats.avgOutputTokens ?? 0;
|
|
429
|
+
const avgOutputTokens = (prevAvgTokens * (invocations - 1) + outputTokens) / invocations;
|
|
151
430
|
return {
|
|
152
431
|
invocations,
|
|
153
432
|
failures,
|
|
@@ -155,12 +434,13 @@ function foldEvent(stats, event) {
|
|
|
155
434
|
avgDurationMs,
|
|
156
435
|
totalCost,
|
|
157
436
|
lastObservedAt: event.timestamp,
|
|
437
|
+
avgOutputTokens,
|
|
158
438
|
};
|
|
159
439
|
}
|
|
160
440
|
function deserialize(row) {
|
|
161
441
|
return {
|
|
162
442
|
toolName: row.tool_name,
|
|
163
|
-
serverName: row.server_name
|
|
443
|
+
serverName: row.server_name === UNKNOWN_SERVER ? undefined : row.server_name,
|
|
164
444
|
annotation: JSON.parse(row.annotation),
|
|
165
445
|
insights: JSON.parse(row.insights),
|
|
166
446
|
recommendations: JSON.parse(row.recommendations),
|
|
@@ -168,4 +448,137 @@ function deserialize(row) {
|
|
|
168
448
|
updatedAt: row.updated_at,
|
|
169
449
|
};
|
|
170
450
|
}
|
|
451
|
+
function deserializeMetricCell(row) {
|
|
452
|
+
return {
|
|
453
|
+
toolName: row.tool_name,
|
|
454
|
+
serverName: row.server_name === UNKNOWN_SERVER ? undefined : row.server_name,
|
|
455
|
+
window: row.window,
|
|
456
|
+
dimensions: JSON.parse(row.dims),
|
|
457
|
+
invocations: row.invocations,
|
|
458
|
+
failures: row.failures,
|
|
459
|
+
attempts: row.attempts,
|
|
460
|
+
errorCodes: JSON.parse(row.error_codes),
|
|
461
|
+
durationSum: row.duration_sum,
|
|
462
|
+
durationCount: row.duration_count,
|
|
463
|
+
durationHistogram: JSON.parse(row.duration_hist),
|
|
464
|
+
tokenInSum: row.token_in_sum,
|
|
465
|
+
tokenOutSum: row.token_out_sum,
|
|
466
|
+
tokenCount: row.token_count,
|
|
467
|
+
costSum: row.cost_sum,
|
|
468
|
+
ewmaFailureRate: row.ewma_failure_rate ?? undefined,
|
|
469
|
+
ewmaDurationMs: row.ewma_duration_ms ?? undefined,
|
|
470
|
+
firstSeen: row.first_seen ?? "",
|
|
471
|
+
lastSeen: row.last_seen ?? "",
|
|
472
|
+
exemplars: JSON.parse(row.exemplars),
|
|
473
|
+
};
|
|
474
|
+
}
|
|
475
|
+
/** Fixed duration histogram buckets (upper bound in ms); the last bucket is overflow. */
|
|
476
|
+
const DURATION_BUCKETS_MS = [50, 100, 250, 500, 1000, 2500, 5000, 10000];
|
|
477
|
+
const DURATION_BUCKET_COUNT = DURATION_BUCKETS_MS.length + 1;
|
|
478
|
+
/** EWMA smoothing factor for recency-weighted failure rate / duration. */
|
|
479
|
+
const EWMA_ALPHA = 0.2;
|
|
480
|
+
/** How many recent event ids a cell keeps for drill-down. */
|
|
481
|
+
const EXEMPLAR_LIMIT = 5;
|
|
482
|
+
/** Token usage, preferring the explicit `usage` field and falling back to `cost`. */
|
|
483
|
+
function eventTokens(event) {
|
|
484
|
+
if (event.usage && (event.usage.inputTokens !== undefined || event.usage.outputTokens !== undefined)) {
|
|
485
|
+
return event.usage;
|
|
486
|
+
}
|
|
487
|
+
return { inputTokens: event.cost?.inputTokens, outputTokens: event.cost?.outputTokens };
|
|
488
|
+
}
|
|
489
|
+
/** The bounded set of dimension tuples an event contributes to. */
|
|
490
|
+
function cellDimensionsFor(event, model = event.model) {
|
|
491
|
+
const dims = [{}];
|
|
492
|
+
if (model)
|
|
493
|
+
dims.push({ model });
|
|
494
|
+
if (event.decoding) {
|
|
495
|
+
dims.push({
|
|
496
|
+
...(model ? { model } : {}),
|
|
497
|
+
decodingProfile: event.decoding.profile,
|
|
498
|
+
resolverVersion: event.decoding.resolverVersion,
|
|
499
|
+
});
|
|
500
|
+
}
|
|
501
|
+
return dims;
|
|
502
|
+
}
|
|
503
|
+
/** Stable key for a dimension tuple (sorted keys). */
|
|
504
|
+
function dimsKey(dims) {
|
|
505
|
+
return JSON.stringify(Object.keys(dims)
|
|
506
|
+
.sort()
|
|
507
|
+
.map((key) => [key, dims[key]]));
|
|
508
|
+
}
|
|
509
|
+
/** Hourly retention-window key for an ISO timestamp (UTC). */
|
|
510
|
+
function windowKey(iso) {
|
|
511
|
+
return `hour:${iso.slice(0, 13)}`;
|
|
512
|
+
}
|
|
513
|
+
function durationBucketIndex(ms) {
|
|
514
|
+
for (let i = 0; i < DURATION_BUCKETS_MS.length; i += 1) {
|
|
515
|
+
if (ms <= DURATION_BUCKETS_MS[i])
|
|
516
|
+
return i;
|
|
517
|
+
}
|
|
518
|
+
return DURATION_BUCKETS_MS.length;
|
|
519
|
+
}
|
|
520
|
+
/** Fold one event into a metric cell (creating it when absent). */
|
|
521
|
+
function foldMetricCell(existing, event, dimensions, window, now) {
|
|
522
|
+
const failed = event.status === "failed";
|
|
523
|
+
const failure = failed ? 1 : 0;
|
|
524
|
+
const duration = typeof event.durationMs === "number" ? event.durationMs : undefined;
|
|
525
|
+
const tokens = eventTokens(event);
|
|
526
|
+
const hasTokens = tokens.inputTokens !== undefined || tokens.outputTokens !== undefined;
|
|
527
|
+
const cost = event.cost?.amount;
|
|
528
|
+
const base = existing ?? {
|
|
529
|
+
toolName: event.toolName,
|
|
530
|
+
serverName: event.serverName,
|
|
531
|
+
window,
|
|
532
|
+
dimensions,
|
|
533
|
+
invocations: 0,
|
|
534
|
+
failures: 0,
|
|
535
|
+
attempts: 0,
|
|
536
|
+
errorCodes: {},
|
|
537
|
+
durationSum: 0,
|
|
538
|
+
durationCount: 0,
|
|
539
|
+
durationHistogram: new Array(DURATION_BUCKET_COUNT).fill(0),
|
|
540
|
+
tokenInSum: 0,
|
|
541
|
+
tokenOutSum: 0,
|
|
542
|
+
tokenCount: 0,
|
|
543
|
+
costSum: 0,
|
|
544
|
+
firstSeen: now,
|
|
545
|
+
lastSeen: now,
|
|
546
|
+
exemplars: [],
|
|
547
|
+
};
|
|
548
|
+
const errorCodes = { ...base.errorCodes };
|
|
549
|
+
if (failed) {
|
|
550
|
+
const code = event.error?.code ?? "unknown";
|
|
551
|
+
errorCodes[code] = (errorCodes[code] ?? 0) + 1;
|
|
552
|
+
}
|
|
553
|
+
const histogram = [...base.durationHistogram];
|
|
554
|
+
while (histogram.length < DURATION_BUCKET_COUNT)
|
|
555
|
+
histogram.push(0);
|
|
556
|
+
if (duration !== undefined)
|
|
557
|
+
histogram[durationBucketIndex(duration)] = (histogram[durationBucketIndex(duration)] ?? 0) + 1;
|
|
558
|
+
return {
|
|
559
|
+
...base,
|
|
560
|
+
dimensions,
|
|
561
|
+
invocations: base.invocations + 1,
|
|
562
|
+
failures: base.failures + failure,
|
|
563
|
+
attempts: base.attempts + (event.attempts ?? 1),
|
|
564
|
+
errorCodes,
|
|
565
|
+
durationSum: base.durationSum + (duration ?? 0),
|
|
566
|
+
durationCount: base.durationCount + (duration !== undefined ? 1 : 0),
|
|
567
|
+
durationHistogram: histogram,
|
|
568
|
+
tokenInSum: base.tokenInSum + (tokens.inputTokens ?? 0),
|
|
569
|
+
tokenOutSum: base.tokenOutSum + (tokens.outputTokens ?? 0),
|
|
570
|
+
tokenCount: base.tokenCount + (hasTokens ? 1 : 0),
|
|
571
|
+
costSum: base.costSum + (cost !== undefined && Number.isFinite(cost) ? cost : 0),
|
|
572
|
+
ewmaFailureRate: base.ewmaFailureRate === undefined
|
|
573
|
+
? failure
|
|
574
|
+
: base.ewmaFailureRate + EWMA_ALPHA * (failure - base.ewmaFailureRate),
|
|
575
|
+
ewmaDurationMs: duration === undefined
|
|
576
|
+
? base.ewmaDurationMs
|
|
577
|
+
: base.ewmaDurationMs === undefined
|
|
578
|
+
? duration
|
|
579
|
+
: base.ewmaDurationMs + EWMA_ALPHA * (duration - base.ewmaDurationMs),
|
|
580
|
+
lastSeen: now,
|
|
581
|
+
exemplars: [...base.exemplars, event.id].slice(-EXEMPLAR_LIMIT),
|
|
582
|
+
};
|
|
583
|
+
}
|
|
171
584
|
//# sourceMappingURL=store.js.map
|
package/dist/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adaptivemcp/memory",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Persistent operational knowledge for Adaptive MCP, backed by SQLite (node:sqlite).",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -17,16 +17,16 @@
|
|
|
17
17
|
"dist",
|
|
18
18
|
"README.md"
|
|
19
19
|
],
|
|
20
|
-
"scripts": {
|
|
21
|
-
"build": "tsc -p tsconfig.json",
|
|
22
|
-
"test": "vitest run --config ../../vitest.config.ts"
|
|
23
|
-
},
|
|
24
20
|
"dependencies": {
|
|
25
|
-
"@adaptivemcp/spec": "
|
|
21
|
+
"@adaptivemcp/spec": "0.4.0"
|
|
26
22
|
},
|
|
27
23
|
"devDependencies": {
|
|
28
24
|
"@types/node": "^22.0.0",
|
|
29
25
|
"typescript": "^5.6.0",
|
|
30
26
|
"vitest": "^2.1.0"
|
|
27
|
+
},
|
|
28
|
+
"scripts": {
|
|
29
|
+
"build": "tsc -p tsconfig.json",
|
|
30
|
+
"test": "vitest run --config ../../vitest.config.ts"
|
|
31
31
|
}
|
|
32
|
-
}
|
|
32
|
+
}
|