@adaptivemcp/memory 0.2.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.
@@ -0,0 +1,2 @@
1
+ export * from "./store.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export * from "./store.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { type DatabaseSyncOptions } from "node:sqlite";
2
+ import type { Annotation, Insight, Recommendation, RecommendationType, ToolExecutionEvent, ToolRecord } from "@adaptivemcp/spec";
3
+ export interface MemoryStoreOptions {
4
+ /** Path to the SQLite database file. Use ":memory:" for an in-memory store. */
5
+ path?: string;
6
+ dbOptions?: DatabaseSyncOptions;
7
+ }
8
+ /**
9
+ * SQLite-backed single source of truth for Adaptive MCP.
10
+ *
11
+ * All tool metadata — annotations, learned insights, recommendations, and raw
12
+ * stats — is persisted here. The YAML tools-metadata view is a *derived*
13
+ * projection of this store, never the source of truth.
14
+ */
15
+ export declare class MemoryStore {
16
+ private db;
17
+ constructor(options?: MemoryStoreOptions);
18
+ close(): void;
19
+ /** Ensure a tool record exists, seeding it with an empty annotation. */
20
+ ensureTool(toolName: string, serverName?: string): ToolRecord;
21
+ getTool(toolName: string): ToolRecord | undefined;
22
+ allTools(): ToolRecord[];
23
+ /** Persist a human-written annotation (the static metadata layer). */
24
+ setAnnotation(annotation: Annotation): ToolRecord;
25
+ /** Record a learned insight derived from observed behavior. */
26
+ addInsight(insight: Insight): ToolRecord;
27
+ /** Store a suggested adaptation. */
28
+ addRecommendation(rec: Recommendation): ToolRecord;
29
+ /**
30
+ * Remove all recommendations of a given type for a tool. Used by the routing,
31
+ * orchestration, and approval packages so each adaptation pass recomputes its
32
+ * own recommendations instead of appending duplicates on every observation.
33
+ */
34
+ clearRecommendations(toolName: string, type: RecommendationType): ToolRecord;
35
+ /** Fold a tool execution event into the persisted stats. */
36
+ recordExecution(event: ToolExecutionEvent): ToolRecord;
37
+ private write;
38
+ }
39
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +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,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,WAAW;IACtB,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"}
package/dist/store.js ADDED
@@ -0,0 +1,171 @@
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
+ `;
13
+ /**
14
+ * SQLite-backed single source of truth for Adaptive MCP.
15
+ *
16
+ * All tool metadata — annotations, learned insights, recommendations, and raw
17
+ * stats — is persisted here. The YAML tools-metadata view is a *derived*
18
+ * projection of this store, never the source of truth.
19
+ */
20
+ export class MemoryStore {
21
+ db;
22
+ constructor(options = {}) {
23
+ this.db = new DatabaseSync(options.path ?? ":memory:", options.dbOptions ?? {});
24
+ this.db.exec(SCHEMA);
25
+ }
26
+ close() {
27
+ this.db.close();
28
+ }
29
+ /** Ensure a tool record exists, seeding it with an empty annotation. */
30
+ ensureTool(toolName, serverName) {
31
+ const existing = this.getTool(toolName);
32
+ if (existing)
33
+ return existing;
34
+ const now = new Date().toISOString();
35
+ const record = {
36
+ toolName,
37
+ serverName,
38
+ annotation: { toolName },
39
+ insights: [],
40
+ recommendations: [],
41
+ stats: emptyStats(),
42
+ updatedAt: now,
43
+ };
44
+ this.db
45
+ .prepare(`INSERT INTO tools (tool_name, server_name, annotation, insights, recommendations, stats, updated_at)
46
+ VALUES (?, ?, ?, ?, ?, ?, ?)`)
47
+ .run(toolName, serverName ?? null, JSON.stringify(record.annotation), JSON.stringify(record.insights), JSON.stringify(record.recommendations), JSON.stringify(record.stats), now);
48
+ return record;
49
+ }
50
+ getTool(toolName) {
51
+ const row = this.db
52
+ .prepare(`SELECT * FROM tools WHERE tool_name = ?`)
53
+ .get(toolName);
54
+ return row ? deserialize(row) : undefined;
55
+ }
56
+ allTools() {
57
+ const rows = this.db
58
+ .prepare(`SELECT * FROM tools ORDER BY tool_name`)
59
+ .all();
60
+ return rows.map(deserialize);
61
+ }
62
+ /** Persist a human-written annotation (the static metadata layer). */
63
+ setAnnotation(annotation) {
64
+ const record = this.ensureTool(annotation.toolName);
65
+ const updated = {
66
+ ...record,
67
+ annotation: { ...record.annotation, ...annotation },
68
+ updatedAt: new Date().toISOString(),
69
+ };
70
+ this.write(updated);
71
+ return updated;
72
+ }
73
+ /** Record a learned insight derived from observed behavior. */
74
+ addInsight(insight) {
75
+ const record = this.ensureTool(insight.toolName);
76
+ const insights = [...record.insights.filter((i) => i.key !== insight.key), insight];
77
+ const updated = {
78
+ ...record,
79
+ insights,
80
+ updatedAt: new Date().toISOString(),
81
+ };
82
+ this.write(updated);
83
+ return updated;
84
+ }
85
+ /** Store a suggested adaptation. */
86
+ addRecommendation(rec) {
87
+ const record = this.ensureTool(rec.toolName);
88
+ const updated = {
89
+ ...record,
90
+ recommendations: [...record.recommendations, rec],
91
+ updatedAt: new Date().toISOString(),
92
+ };
93
+ this.write(updated);
94
+ return updated;
95
+ }
96
+ /**
97
+ * Remove all recommendations of a given type for a tool. Used by the routing,
98
+ * orchestration, and approval packages so each adaptation pass recomputes its
99
+ * own recommendations instead of appending duplicates on every observation.
100
+ */
101
+ clearRecommendations(toolName, type) {
102
+ const record = this.ensureTool(toolName);
103
+ const updated = {
104
+ ...record,
105
+ recommendations: record.recommendations.filter((r) => r.type !== type),
106
+ updatedAt: new Date().toISOString(),
107
+ };
108
+ this.write(updated);
109
+ return updated;
110
+ }
111
+ /** Fold a tool execution event into the persisted stats. */
112
+ recordExecution(event) {
113
+ const record = this.ensureTool(event.toolName, event.serverName);
114
+ const stats = foldEvent(record.stats, event);
115
+ const updated = {
116
+ ...record,
117
+ serverName: record.serverName ?? event.serverName,
118
+ stats,
119
+ updatedAt: new Date().toISOString(),
120
+ };
121
+ this.write(updated);
122
+ return updated;
123
+ }
124
+ write(record) {
125
+ this.db
126
+ .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);
130
+ }
131
+ }
132
+ function emptyStats() {
133
+ return {
134
+ invocations: 0,
135
+ failures: 0,
136
+ failureRate: 0,
137
+ avgDurationMs: null,
138
+ totalCost: 0,
139
+ lastObservedAt: null,
140
+ };
141
+ }
142
+ function foldEvent(stats, event) {
143
+ const invocations = stats.invocations + 1;
144
+ const failures = stats.failures + (event.status === "failed" ? 1 : 0);
145
+ const durations = event.durationMs != null ? [event.durationMs] : [];
146
+ const prevAvg = stats.avgDurationMs ?? 0;
147
+ const avgDurationMs = durations.length > 0
148
+ ? (prevAvg * (invocations - 1) + durations[0]) / invocations
149
+ : stats.avgDurationMs;
150
+ const totalCost = stats.totalCost + (event.cost?.amount ?? 0);
151
+ return {
152
+ invocations,
153
+ failures,
154
+ failureRate: failures / invocations,
155
+ avgDurationMs,
156
+ totalCost,
157
+ lastObservedAt: event.timestamp,
158
+ };
159
+ }
160
+ function deserialize(row) {
161
+ return {
162
+ toolName: row.tool_name,
163
+ serverName: row.server_name ?? undefined,
164
+ annotation: JSON.parse(row.annotation),
165
+ insights: JSON.parse(row.insights),
166
+ recommendations: JSON.parse(row.recommendations),
167
+ stats: JSON.parse(row.stats),
168
+ updatedAt: row.updated_at,
169
+ };
170
+ }
171
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "@adaptivemcp/memory",
3
+ "version": "0.2.0",
4
+ "description": "Persistent operational knowledge for Adaptive MCP, backed by SQLite (node:sqlite).",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "scripts": {
19
+ "build": "tsc -p tsconfig.json",
20
+ "test": "vitest run --config ../../vitest.config.ts"
21
+ },
22
+ "dependencies": {
23
+ "@adaptivemcp/spec": "workspace:*"
24
+ },
25
+ "devDependencies": {
26
+ "@types/node": "^22.0.0",
27
+ "typescript": "^5.6.0",
28
+ "vitest": "^2.1.0"
29
+ }
30
+ }