@adaptivemcp/memory 0.2.4 → 0.3.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/dist/index.d.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  export * from "./store.js";
2
+ export * from "./migrations.js";
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -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
@@ -1,2 +1,3 @@
1
1
  export * from "./store.js";
2
+ export * from "./migrations.js";
2
3
  //# sourceMappingURL=index.js.map
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,EAOjC,CAAC;AAEF,mGAAmG;AACnG,wBAAgB,aAAa,CAAC,EAAE,EAAE,YAAY,EAAE,UAAU,GAAE,SAAS,EAAe,GAAG,IAAI,CAkB1F"}
@@ -0,0 +1,69 @@
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
+ /** Applies every migration in `migrations` that hasn't already been recorded, in version order. */
53
+ export function runMigrations(db, migrations = MIGRATIONS) {
54
+ db.exec(`CREATE TABLE IF NOT EXISTS schema_migrations (
55
+ version INTEGER PRIMARY KEY,
56
+ name TEXT NOT NULL,
57
+ applied_at TEXT NOT NULL
58
+ )`);
59
+ const applied = new Set(db.prepare(`SELECT version FROM schema_migrations`).all().map((r) => r.version));
60
+ const ordered = [...migrations].sort((a, b) => a.version - b.version);
61
+ const insert = db.prepare(`INSERT INTO schema_migrations (version, name, applied_at) VALUES (?, ?, ?)`);
62
+ for (const migration of ordered) {
63
+ if (applied.has(migration.version))
64
+ continue;
65
+ migration.up(db);
66
+ insert.run(migration.version, migration.name, new Date().toISOString());
67
+ }
68
+ }
69
+ //# 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;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,24 @@
1
1
  import { type DatabaseSyncOptions } from "node:sqlite";
2
- import type { Annotation, Insight, Recommendation, RecommendationType, Store, ToolExecutionEvent, ToolRecord } from "@adaptivemcp/spec";
2
+ import type { Annotation, Insight, 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
+ };
7
22
  }
8
23
  /**
9
24
  * SQLite-backed store for Adaptive MCP.
@@ -14,11 +29,35 @@ export interface MemoryStoreOptions {
14
29
  */
15
30
  export declare class MemoryStore implements Store {
16
31
  private db;
32
+ private readonly isMemory;
33
+ private readonly retention?;
34
+ private lastPrunedAt;
17
35
  constructor(options?: MemoryStoreOptions);
18
36
  close(): void;
19
- /** Ensure a tool record exists, seeding it with an empty annotation. */
37
+ /**
38
+ * Ensure a tool record exists, seeding it with an empty annotation.
39
+ *
40
+ * - When `serverName` is omitted, reuses whatever record already exists for
41
+ * that `toolName` (any server) rather than creating a second,
42
+ * disconnected row — callers that don't know the server shouldn't
43
+ * fragment a tool they've already ensured elsewhere with a known server.
44
+ * - When `serverName` is given but no exact match exists, "claims" an
45
+ * unclaimed record (one created by a serverName-less caller, e.g. a human
46
+ * annotation set before any execution was observed) instead of
47
+ * fragmenting it into a second row — the first time a server becomes
48
+ * known for a tool, its prior annotation/insights/recommendations carry
49
+ * forward onto that server's row.
50
+ */
20
51
  ensureTool(toolName: string, serverName?: string): ToolRecord;
21
- getTool(toolName: string): ToolRecord | undefined;
52
+ /** Reassign an unclaimed row's `server_name` in place once it's learned. */
53
+ private claimServer;
54
+ /**
55
+ * Read a single tool record. When `serverName` is given, looks up the exact
56
+ * `(toolName, serverName)` row. Otherwise falls back to the most recently
57
+ * updated row with that `toolName` — correct as long as the name isn't
58
+ * shared across servers, ambiguous (but non-crashing) if it is.
59
+ */
60
+ getTool(toolName: string, serverName?: string): ToolRecord | undefined;
22
61
  allTools(): ToolRecord[];
23
62
  /** Persist a human-written annotation (the static metadata layer). */
24
63
  setAnnotation(annotation: Annotation): ToolRecord;
@@ -31,9 +70,40 @@ export declare class MemoryStore implements Store {
31
70
  * orchestration, and approval packages so each adaptation pass recomputes its
32
71
  * own recommendations instead of appending duplicates on every observation.
33
72
  */
34
- clearRecommendations(toolName: string, type: RecommendationType): ToolRecord;
73
+ clearRecommendations(toolName: string, type: RecommendationType, serverName?: string): ToolRecord;
35
74
  /** Fold a tool execution event into the persisted stats. */
36
75
  recordExecution(event: ToolExecutionEvent): ToolRecord;
76
+ /** `server_name` is part of the primary key, so it's matched in WHERE, not reassigned in SET. */
37
77
  private write;
78
+ /** Record an execution node in the graph. */
79
+ recordExecutionNode(node: ExecutionNode): ExecutionNode;
80
+ /**
81
+ * Delete execution nodes older than `olderThanMs`. Does not cascade-clean
82
+ * dangling `parent_id`/`children_ids` references left on surviving rows —
83
+ * acceptable for a best-effort retention pass; callers relying on strict
84
+ * graph integrity should prune with generous windows.
85
+ */
86
+ pruneExecutionNodes(olderThanMs: number, now?: number): {
87
+ deleted: number;
88
+ };
89
+ private maybeOpportunisticPrune;
90
+ /** Get an execution node by ID. */
91
+ getExecutionNode(id: string): ExecutionNode | undefined;
92
+ /** Get all nodes for a session. */
93
+ getNodesBySession(sessionId: string): ExecutionNode[];
94
+ /** Get all nodes for a workflow (across sessions). */
95
+ getNodesByWorkflow(workflowId: string): ExecutionNode[];
96
+ /** Get every distinct workflow ID that has at least one recorded execution node. */
97
+ getWorkflowIds(): string[];
98
+ /** Get children of a node. */
99
+ getChildren(parentId: string): ExecutionNode[];
100
+ /** Get parent of a node. */
101
+ getParent(childId: string): ExecutionNode | undefined;
102
+ /** Get root nodes (no parent) for a session. */
103
+ getRootNodes(sessionId: string): ExecutionNode[];
104
+ /** Get leaf nodes (no children) for a session. */
105
+ getLeafNodes(sessionId: string): ExecutionNode[];
106
+ /** Update children IDs of a parent node. */
107
+ updateChildrenIds(parentId: string, childrenIds: string[]): void;
38
108
  }
39
109
  //# sourceMappingURL=store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,KAAK,EACV,UAAU,EACV,OAAO,EACP,cAAc,EACd,kBAAkB,EAClB,KAAK,EACL,kBAAkB,EAClB,UAAU,EAEX,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,kBAAkB;IACjC,+EAA+E;IAC/E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,mBAAmB,CAAC;CACjC;AAwBD;;;;;;GAMG;AACH,qBAAa,WAAY,YAAW,KAAK;IACvC,OAAO,CAAC,EAAE,CAAe;gBAEb,OAAO,GAAE,kBAAuB;IAK5C,KAAK,IAAI,IAAI;IAIb,wEAAwE;IACxE,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,UAAU;IA+B7D,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAOjD,QAAQ,IAAI,UAAU,EAAE;IAOxB,sEAAsE;IACtE,aAAa,CAAC,UAAU,EAAE,UAAU,GAAG,UAAU;IAWjD,+DAA+D;IAC/D,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU;IAYxC,oCAAoC;IACpC,iBAAiB,CAAC,GAAG,EAAE,cAAc,GAAG,UAAU;IAWlD;;;;OAIG;IACH,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,GAAG,UAAU;IAW5E,4DAA4D;IAC5D,eAAe,CAAC,KAAK,EAAE,kBAAkB,GAAG,UAAU;IAatD,OAAO,CAAC,KAAK;CAiBd"}
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,21 @@
1
1
  import { DatabaseSync } from "node:sqlite";
2
- const SCHEMA = `
3
- CREATE TABLE IF NOT EXISTS tools (
4
- tool_name TEXT PRIMARY KEY,
5
- server_name TEXT,
6
- annotation TEXT NOT NULL,
7
- insights TEXT NOT NULL DEFAULT '[]',
8
- recommendations TEXT NOT NULL DEFAULT '[]',
9
- stats TEXT NOT NULL DEFAULT '{}',
10
- updated_at TEXT NOT NULL
11
- );
12
- `;
2
+ import { runMigrations } from "./migrations.js";
3
+ const DEFAULT_PRAGMAS = {
4
+ journalMode: "WAL",
5
+ synchronous: "NORMAL",
6
+ busyTimeoutMs: 5000,
7
+ };
8
+ /** Opportunistic pruning is throttled to at most once per this interval, to avoid a DELETE scan on every write. */
9
+ const RETENTION_CHECK_INTERVAL_MS = 60 * 60 * 1000;
10
+ /**
11
+ * `server_name` is part of the primary key, not just a stored column: two
12
+ * different MCP servers may expose a tool with the same name, and keying on
13
+ * `tool_name` alone would let one server's record silently overwrite the
14
+ * other's. It defaults to `''` (rather than being nullable) because SQLite
15
+ * treats every NULL as distinct in a UNIQUE/PRIMARY KEY index, which would
16
+ * defeat the composite key for the common case where the server is unknown.
17
+ */
18
+ const UNKNOWN_SERVER = "";
13
19
  /**
14
20
  * SQLite-backed store for Adaptive MCP.
15
21
  *
@@ -19,23 +25,54 @@ CREATE TABLE IF NOT EXISTS tools (
19
25
  */
20
26
  export class MemoryStore {
21
27
  db;
28
+ isMemory;
29
+ retention;
30
+ lastPrunedAt = 0;
22
31
  constructor(options = {}) {
23
- this.db = new DatabaseSync(options.path ?? ":memory:", options.dbOptions ?? {});
24
- this.db.exec(SCHEMA);
32
+ const path = options.path ?? ":memory:";
33
+ this.isMemory = path === ":memory:";
34
+ this.retention = options.retention;
35
+ this.db = new DatabaseSync(path, options.dbOptions ?? {});
36
+ const pragmas = { ...DEFAULT_PRAGMAS, ...options.pragmas };
37
+ if (!this.isMemory) {
38
+ this.db.exec(`PRAGMA journal_mode = ${pragmas.journalMode}`);
39
+ }
40
+ this.db.exec(`PRAGMA synchronous = ${pragmas.synchronous}`);
41
+ this.db.exec(`PRAGMA foreign_keys = ON`);
42
+ this.db.exec(`PRAGMA busy_timeout = ${pragmas.busyTimeoutMs}`);
43
+ runMigrations(this.db);
25
44
  }
26
45
  close() {
27
46
  this.db.close();
28
47
  }
29
- /** Ensure a tool record exists, seeding it with an empty annotation. */
48
+ /**
49
+ * Ensure a tool record exists, seeding it with an empty annotation.
50
+ *
51
+ * - When `serverName` is omitted, reuses whatever record already exists for
52
+ * that `toolName` (any server) rather than creating a second,
53
+ * disconnected row — callers that don't know the server shouldn't
54
+ * fragment a tool they've already ensured elsewhere with a known server.
55
+ * - When `serverName` is given but no exact match exists, "claims" an
56
+ * unclaimed record (one created by a serverName-less caller, e.g. a human
57
+ * annotation set before any execution was observed) instead of
58
+ * fragmenting it into a second row — the first time a server becomes
59
+ * known for a tool, its prior annotation/insights/recommendations carry
60
+ * forward onto that server's row.
61
+ */
30
62
  ensureTool(toolName, serverName) {
31
- const existing = this.getTool(toolName);
63
+ const existing = this.getTool(toolName, serverName);
32
64
  if (existing)
33
65
  return existing;
66
+ if (serverName !== undefined) {
67
+ const unclaimed = this.getTool(toolName, UNKNOWN_SERVER);
68
+ if (unclaimed)
69
+ return this.claimServer(unclaimed, serverName);
70
+ }
34
71
  const now = new Date().toISOString();
35
72
  const record = {
36
73
  toolName,
37
74
  serverName,
38
- annotation: { toolName },
75
+ annotation: { toolName, serverName },
39
76
  insights: [],
40
77
  recommendations: [],
41
78
  stats: emptyStats(),
@@ -44,24 +81,47 @@ export class MemoryStore {
44
81
  this.db
45
82
  .prepare(`INSERT INTO tools (tool_name, server_name, annotation, insights, recommendations, stats, updated_at)
46
83
  VALUES (?, ?, ?, ?, ?, ?, ?)`)
47
- .run(toolName, serverName ?? null, JSON.stringify(record.annotation), JSON.stringify(record.insights), JSON.stringify(record.recommendations), JSON.stringify(record.stats), now);
84
+ .run(toolName, serverName ?? UNKNOWN_SERVER, JSON.stringify(record.annotation), JSON.stringify(record.insights), JSON.stringify(record.recommendations), JSON.stringify(record.stats), now);
48
85
  return record;
49
86
  }
50
- getTool(toolName) {
51
- const row = this.db
52
- .prepare(`SELECT * FROM tools WHERE tool_name = ?`)
53
- .get(toolName);
87
+ /** Reassign an unclaimed row's `server_name` in place once it's learned. */
88
+ claimServer(record, serverName) {
89
+ const updated = {
90
+ ...record,
91
+ serverName,
92
+ annotation: { ...record.annotation, serverName },
93
+ updatedAt: new Date().toISOString(),
94
+ };
95
+ this.db
96
+ .prepare(`UPDATE tools SET server_name = ?, annotation = ?, updated_at = ? WHERE tool_name = ? AND server_name = ?`)
97
+ .run(serverName, JSON.stringify(updated.annotation), updated.updatedAt, record.toolName, UNKNOWN_SERVER);
98
+ return updated;
99
+ }
100
+ /**
101
+ * Read a single tool record. When `serverName` is given, looks up the exact
102
+ * `(toolName, serverName)` row. Otherwise falls back to the most recently
103
+ * updated row with that `toolName` — correct as long as the name isn't
104
+ * shared across servers, ambiguous (but non-crashing) if it is.
105
+ */
106
+ getTool(toolName, serverName) {
107
+ const row = serverName !== undefined
108
+ ? this.db
109
+ .prepare(`SELECT * FROM tools WHERE tool_name = ? AND server_name = ?`)
110
+ .get(toolName, serverName)
111
+ : this.db
112
+ .prepare(`SELECT * FROM tools WHERE tool_name = ? ORDER BY updated_at DESC LIMIT 1`)
113
+ .get(toolName);
54
114
  return row ? deserialize(row) : undefined;
55
115
  }
56
116
  allTools() {
57
117
  const rows = this.db
58
- .prepare(`SELECT * FROM tools ORDER BY tool_name`)
118
+ .prepare(`SELECT * FROM tools ORDER BY tool_name, server_name`)
59
119
  .all();
60
120
  return rows.map(deserialize);
61
121
  }
62
122
  /** Persist a human-written annotation (the static metadata layer). */
63
123
  setAnnotation(annotation) {
64
- const record = this.ensureTool(annotation.toolName);
124
+ const record = this.ensureTool(annotation.toolName, annotation.serverName);
65
125
  const updated = {
66
126
  ...record,
67
127
  annotation: { ...record.annotation, ...annotation },
@@ -72,7 +132,7 @@ export class MemoryStore {
72
132
  }
73
133
  /** Record a learned insight derived from observed behavior. */
74
134
  addInsight(insight) {
75
- const record = this.ensureTool(insight.toolName);
135
+ const record = this.ensureTool(insight.toolName, insight.serverName);
76
136
  const insights = [...record.insights.filter((i) => i.key !== insight.key), insight];
77
137
  const updated = {
78
138
  ...record,
@@ -84,7 +144,7 @@ export class MemoryStore {
84
144
  }
85
145
  /** Store a suggested adaptation. */
86
146
  addRecommendation(rec) {
87
- const record = this.ensureTool(rec.toolName);
147
+ const record = this.ensureTool(rec.toolName, rec.serverName);
88
148
  const updated = {
89
149
  ...record,
90
150
  recommendations: [...record.recommendations, rec],
@@ -98,8 +158,8 @@ export class MemoryStore {
98
158
  * orchestration, and approval packages so each adaptation pass recomputes its
99
159
  * own recommendations instead of appending duplicates on every observation.
100
160
  */
101
- clearRecommendations(toolName, type) {
102
- const record = this.ensureTool(toolName);
161
+ clearRecommendations(toolName, type, serverName) {
162
+ const record = this.ensureTool(toolName, serverName);
103
163
  const updated = {
104
164
  ...record,
105
165
  recommendations: record.recommendations.filter((r) => r.type !== type),
@@ -121,14 +181,133 @@ export class MemoryStore {
121
181
  this.write(updated);
122
182
  return updated;
123
183
  }
184
+ /** `server_name` is part of the primary key, so it's matched in WHERE, not reassigned in SET. */
124
185
  write(record) {
125
186
  this.db
126
187
  .prepare(`UPDATE tools
127
- SET server_name = ?, annotation = ?, insights = ?, recommendations = ?, stats = ?, updated_at = ?
128
- WHERE tool_name = ?`)
129
- .run(record.serverName ?? null, JSON.stringify(record.annotation), JSON.stringify(record.insights), JSON.stringify(record.recommendations), JSON.stringify(record.stats), record.updatedAt, record.toolName);
188
+ SET annotation = ?, insights = ?, recommendations = ?, stats = ?, updated_at = ?
189
+ WHERE tool_name = ? AND server_name = ?`)
190
+ .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);
191
+ }
192
+ /** Record an execution node in the graph. */
193
+ recordExecutionNode(node) {
194
+ this.db
195
+ .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)
196
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
197
+ .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);
198
+ this.maybeOpportunisticPrune();
199
+ return node;
200
+ }
201
+ /**
202
+ * Delete execution nodes older than `olderThanMs`. Does not cascade-clean
203
+ * dangling `parent_id`/`children_ids` references left on surviving rows —
204
+ * acceptable for a best-effort retention pass; callers relying on strict
205
+ * graph integrity should prune with generous windows.
206
+ */
207
+ pruneExecutionNodes(olderThanMs, now = Date.now()) {
208
+ const cutoff = new Date(now - olderThanMs).toISOString();
209
+ const result = this.db.prepare(`DELETE FROM execution_nodes WHERE timestamp < ?`).run(cutoff);
210
+ this.lastPrunedAt = now;
211
+ return { deleted: Number(result.changes) };
212
+ }
213
+ maybeOpportunisticPrune() {
214
+ if (!this.retention)
215
+ return;
216
+ const now = Date.now();
217
+ if (now - this.lastPrunedAt < RETENTION_CHECK_INTERVAL_MS)
218
+ return;
219
+ this.pruneExecutionNodes(this.retention.maxAgeMs, now);
220
+ }
221
+ /** Get an execution node by ID. */
222
+ getExecutionNode(id) {
223
+ const row = this.db
224
+ .prepare(`SELECT * FROM execution_nodes WHERE id = ?`)
225
+ .get(id);
226
+ return row ? deserializeExecutionNode(row) : undefined;
227
+ }
228
+ /** Get all nodes for a session. */
229
+ getNodesBySession(sessionId) {
230
+ const rows = this.db
231
+ .prepare(`SELECT * FROM execution_nodes WHERE session_id = ? ORDER BY timestamp`)
232
+ .all(sessionId);
233
+ return rows.map(deserializeExecutionNode);
234
+ }
235
+ /** Get all nodes for a workflow (across sessions). */
236
+ getNodesByWorkflow(workflowId) {
237
+ const rows = this.db
238
+ .prepare(`SELECT * FROM execution_nodes WHERE workflow_id = ? ORDER BY timestamp`)
239
+ .all(workflowId);
240
+ return rows.map(deserializeExecutionNode);
241
+ }
242
+ /** Get every distinct workflow ID that has at least one recorded execution node. */
243
+ getWorkflowIds() {
244
+ const rows = this.db
245
+ .prepare(`SELECT DISTINCT workflow_id FROM execution_nodes WHERE workflow_id IS NOT NULL`)
246
+ .all();
247
+ return rows.map((r) => r.workflow_id);
248
+ }
249
+ /** Get children of a node. */
250
+ getChildren(parentId) {
251
+ const parent = this.getExecutionNode(parentId);
252
+ if (!parent)
253
+ return [];
254
+ const childIds = parent.childrenIds;
255
+ if (childIds.length === 0)
256
+ return [];
257
+ const placeholders = childIds.map(() => "?").join(",");
258
+ const rows = this.db
259
+ .prepare(`SELECT * FROM execution_nodes WHERE id IN (${placeholders})`)
260
+ .all(...childIds);
261
+ return rows.map(deserializeExecutionNode);
262
+ }
263
+ /** Get parent of a node. */
264
+ getParent(childId) {
265
+ const child = this.getExecutionNode(childId);
266
+ if (!child || !child.parentId)
267
+ return undefined;
268
+ return this.getExecutionNode(child.parentId);
269
+ }
270
+ /** Get root nodes (no parent) for a session. */
271
+ getRootNodes(sessionId) {
272
+ const rows = this.db
273
+ .prepare(`SELECT * FROM execution_nodes WHERE session_id = ? AND parent_id IS NULL ORDER BY timestamp`)
274
+ .all(sessionId);
275
+ return rows.map(deserializeExecutionNode);
276
+ }
277
+ /** Get leaf nodes (no children) for a session. */
278
+ getLeafNodes(sessionId) {
279
+ const rows = this.db
280
+ .prepare(`SELECT * FROM execution_nodes WHERE session_id = ? AND children_ids = '[]' ORDER BY timestamp`)
281
+ .all(sessionId);
282
+ return rows.map(deserializeExecutionNode);
283
+ }
284
+ /** Update children IDs of a parent node. */
285
+ updateChildrenIds(parentId, childrenIds) {
286
+ this.db
287
+ .prepare(`UPDATE execution_nodes SET children_ids = ? WHERE id = ?`)
288
+ .run(JSON.stringify(childrenIds), parentId);
130
289
  }
131
290
  }
291
+ function deserializeExecutionNode(row) {
292
+ return {
293
+ id: row.id,
294
+ toolName: row.tool_name,
295
+ serverName: row.server_name ?? undefined,
296
+ sessionId: row.session_id,
297
+ workflowId: row.workflow_id ?? undefined,
298
+ parentId: row.parent_id ?? undefined,
299
+ childrenIds: JSON.parse(row.children_ids),
300
+ timestamp: row.timestamp,
301
+ durationMs: row.duration_ms ?? undefined,
302
+ status: row.status,
303
+ input: row.input ? JSON.parse(row.input) : undefined,
304
+ output: row.output ? JSON.parse(row.output) : undefined,
305
+ error: row.error ? JSON.parse(row.error) : undefined,
306
+ model: row.model ?? undefined,
307
+ cost: row.cost ? JSON.parse(row.cost) : undefined,
308
+ metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
309
+ };
310
+ }
132
311
  function emptyStats() {
133
312
  return {
134
313
  invocations: 0,
@@ -137,6 +316,7 @@ function emptyStats() {
137
316
  avgDurationMs: null,
138
317
  totalCost: 0,
139
318
  lastObservedAt: null,
319
+ avgOutputTokens: undefined,
140
320
  };
141
321
  }
142
322
  function foldEvent(stats, event) {
@@ -148,6 +328,10 @@ function foldEvent(stats, event) {
148
328
  ? (prevAvg * (invocations - 1) + durations[0]) / invocations
149
329
  : stats.avgDurationMs;
150
330
  const totalCost = stats.totalCost + (event.cost?.amount ?? 0);
331
+ // Track average output tokens for context cost
332
+ const outputTokens = event.cost?.outputTokens ?? 0;
333
+ const prevAvgTokens = stats.avgOutputTokens ?? 0;
334
+ const avgOutputTokens = (prevAvgTokens * (invocations - 1) + outputTokens) / invocations;
151
335
  return {
152
336
  invocations,
153
337
  failures,
@@ -155,12 +339,13 @@ function foldEvent(stats, event) {
155
339
  avgDurationMs,
156
340
  totalCost,
157
341
  lastObservedAt: event.timestamp,
342
+ avgOutputTokens,
158
343
  };
159
344
  }
160
345
  function deserialize(row) {
161
346
  return {
162
347
  toolName: row.tool_name,
163
- serverName: row.server_name ?? undefined,
348
+ serverName: row.server_name === UNKNOWN_SERVER ? undefined : row.server_name,
164
349
  annotation: JSON.parse(row.annotation),
165
350
  insights: JSON.parse(row.insights),
166
351
  recommendations: JSON.parse(row.recommendations),
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.2.4",
3
+ "version": "0.3.0",
4
4
  "description": "Persistent operational knowledge for Adaptive MCP, backed by SQLite (node:sqlite).",
5
5
  "license": "MIT",
6
6
  "type": "module",