statecli-mcp-server 0.1.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,306 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.StateStorage = void 0;
40
+ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
41
+ const uuid_1 = require("uuid");
42
+ const fs = __importStar(require("fs"));
43
+ const path = __importStar(require("path"));
44
+ const types_1 = require("./types");
45
+ class StateStorage {
46
+ db;
47
+ config;
48
+ constructor(config = {}) {
49
+ this.config = { ...types_1.DEFAULT_CONFIG, ...config };
50
+ const dbPath = this.config.storage.path;
51
+ const dbDir = path.dirname(dbPath);
52
+ if (!fs.existsSync(dbDir)) {
53
+ fs.mkdirSync(dbDir, { recursive: true });
54
+ }
55
+ this.db = new better_sqlite3_1.default(dbPath);
56
+ this.initializeSchema();
57
+ }
58
+ initializeSchema() {
59
+ this.db.exec(`
60
+ CREATE TABLE IF NOT EXISTS state_changes (
61
+ id TEXT PRIMARY KEY,
62
+ entity TEXT NOT NULL,
63
+ entity_type TEXT NOT NULL,
64
+ entity_id TEXT NOT NULL,
65
+ timestamp TEXT NOT NULL,
66
+ before_state TEXT,
67
+ after_state TEXT NOT NULL,
68
+ actor TEXT DEFAULT 'system',
69
+ checkpoint_name TEXT,
70
+ created_at INTEGER DEFAULT (strftime('%s', 'now'))
71
+ );
72
+
73
+ CREATE INDEX IF NOT EXISTS idx_entity ON state_changes(entity);
74
+ CREATE INDEX IF NOT EXISTS idx_entity_type ON state_changes(entity_type);
75
+ CREATE INDEX IF NOT EXISTS idx_timestamp ON state_changes(timestamp);
76
+ CREATE INDEX IF NOT EXISTS idx_actor ON state_changes(actor);
77
+
78
+ CREATE TABLE IF NOT EXISTS checkpoints (
79
+ id TEXT PRIMARY KEY,
80
+ entity TEXT NOT NULL,
81
+ name TEXT NOT NULL,
82
+ timestamp TEXT NOT NULL,
83
+ state TEXT NOT NULL,
84
+ created_at INTEGER DEFAULT (strftime('%s', 'now'))
85
+ );
86
+
87
+ CREATE INDEX IF NOT EXISTS idx_checkpoint_entity ON checkpoints(entity);
88
+ CREATE INDEX IF NOT EXISTS idx_checkpoint_name ON checkpoints(name);
89
+ `);
90
+ }
91
+ track(entityType, entityId, state, actor = 'system', checkpointName) {
92
+ const entity = `${entityType}:${entityId}`;
93
+ const id = (0, uuid_1.v4)();
94
+ const timestamp = new Date().toISOString();
95
+ const lastChange = this.getLastChange(entity);
96
+ const before = lastChange?.after || null;
97
+ const stmt = this.db.prepare(`
98
+ INSERT INTO state_changes (id, entity, entity_type, entity_id, timestamp, before_state, after_state, actor, checkpoint_name)
99
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
100
+ `);
101
+ stmt.run(id, entity, entityType, entityId, timestamp, before ? JSON.stringify(before) : null, JSON.stringify(state), actor, checkpointName || null);
102
+ this.enforceRetention(entity);
103
+ return {
104
+ id,
105
+ entity,
106
+ entityType,
107
+ entityId,
108
+ timestamp,
109
+ before,
110
+ after: state,
111
+ actor,
112
+ checkpointName
113
+ };
114
+ }
115
+ getLastChange(entity) {
116
+ const stmt = this.db.prepare(`
117
+ SELECT * FROM state_changes
118
+ WHERE entity = ?
119
+ ORDER BY timestamp DESC
120
+ LIMIT 1
121
+ `);
122
+ const row = stmt.get(entity);
123
+ if (!row)
124
+ return null;
125
+ return this.rowToStateChange(row);
126
+ }
127
+ rowToStateChange(row) {
128
+ return {
129
+ id: row.id,
130
+ entity: row.entity,
131
+ entityType: row.entity_type,
132
+ entityId: row.entity_id,
133
+ timestamp: row.timestamp,
134
+ before: row.before_state ? JSON.parse(row.before_state) : null,
135
+ after: JSON.parse(row.after_state),
136
+ actor: row.actor,
137
+ checkpointName: row.checkpoint_name || undefined
138
+ };
139
+ }
140
+ getChanges(entity, options = {}) {
141
+ let query = 'SELECT * FROM state_changes WHERE entity = ?';
142
+ const params = [entity];
143
+ if (options.actor) {
144
+ query += ' AND actor = ?';
145
+ params.push(options.actor);
146
+ }
147
+ if (options.since) {
148
+ const sinceDate = this.parseSince(options.since);
149
+ query += ' AND timestamp >= ?';
150
+ params.push(sinceDate.toISOString());
151
+ }
152
+ query += ' ORDER BY timestamp ASC';
153
+ if (options.limit) {
154
+ query += ' LIMIT ?';
155
+ params.push(options.limit);
156
+ }
157
+ const stmt = this.db.prepare(query);
158
+ const rows = stmt.all(...params);
159
+ return rows.map(row => this.rowToStateChange(row));
160
+ }
161
+ getChangesByPattern(pattern, options = {}) {
162
+ const sqlPattern = pattern.replace(/\*/g, '%');
163
+ let query = 'SELECT * FROM state_changes WHERE entity LIKE ?';
164
+ const params = [sqlPattern];
165
+ if (options.actor) {
166
+ query += ' AND actor = ?';
167
+ params.push(options.actor);
168
+ }
169
+ if (options.since) {
170
+ const sinceDate = this.parseSince(options.since);
171
+ query += ' AND timestamp >= ?';
172
+ params.push(sinceDate.toISOString());
173
+ }
174
+ query += ' ORDER BY timestamp ASC';
175
+ if (options.limit) {
176
+ query += ' LIMIT ?';
177
+ params.push(options.limit);
178
+ }
179
+ const stmt = this.db.prepare(query);
180
+ const rows = stmt.all(...params);
181
+ return rows.map(row => this.rowToStateChange(row));
182
+ }
183
+ parseSince(since) {
184
+ const now = new Date();
185
+ const match = since.match(/^(\d+)\s*(h|hour|hours|d|day|days|m|min|minutes?|s|sec|seconds?)\s*ago$/i);
186
+ if (match) {
187
+ const value = parseInt(match[1], 10);
188
+ const unit = match[2].toLowerCase();
189
+ if (unit.startsWith('h')) {
190
+ now.setHours(now.getHours() - value);
191
+ }
192
+ else if (unit.startsWith('d')) {
193
+ now.setDate(now.getDate() - value);
194
+ }
195
+ else if (unit.startsWith('m')) {
196
+ now.setMinutes(now.getMinutes() - value);
197
+ }
198
+ else if (unit.startsWith('s')) {
199
+ now.setSeconds(now.getSeconds() - value);
200
+ }
201
+ return now;
202
+ }
203
+ return new Date(since);
204
+ }
205
+ undo(entity, steps = 1) {
206
+ const changes = this.getChanges(entity);
207
+ if (changes.length === 0) {
208
+ return { undone: [], restoredState: null };
209
+ }
210
+ const toUndo = changes.slice(-steps);
211
+ const ids = toUndo.map(c => c.id);
212
+ const deleteStmt = this.db.prepare(`
213
+ DELETE FROM state_changes WHERE id IN (${ids.map(() => '?').join(',')})
214
+ `);
215
+ deleteStmt.run(...ids);
216
+ const lastRemaining = this.getLastChange(entity);
217
+ const restoredState = lastRemaining?.after || null;
218
+ return { undone: toUndo, restoredState };
219
+ }
220
+ createCheckpoint(entity, name) {
221
+ const id = (0, uuid_1.v4)();
222
+ const timestamp = new Date().toISOString();
223
+ const lastChange = this.getLastChange(entity);
224
+ const state = lastChange?.after || {};
225
+ const stmt = this.db.prepare(`
226
+ INSERT INTO checkpoints (id, entity, name, timestamp, state)
227
+ VALUES (?, ?, ?, ?, ?)
228
+ `);
229
+ stmt.run(id, entity, name, timestamp, JSON.stringify(state));
230
+ return { id, entity, name, timestamp, state };
231
+ }
232
+ getCheckpoint(entity, name) {
233
+ const stmt = this.db.prepare(`
234
+ SELECT * FROM checkpoints
235
+ WHERE entity = ? AND name = ?
236
+ ORDER BY timestamp DESC
237
+ LIMIT 1
238
+ `);
239
+ const row = stmt.get(entity, name);
240
+ if (!row)
241
+ return null;
242
+ return {
243
+ id: row.id,
244
+ entity: row.entity,
245
+ name: row.name,
246
+ timestamp: row.timestamp,
247
+ state: JSON.parse(row.state)
248
+ };
249
+ }
250
+ restoreCheckpoint(entity, name) {
251
+ const checkpoint = this.getCheckpoint(entity, name);
252
+ if (!checkpoint) {
253
+ return { restored: false, checkpoint: null };
254
+ }
255
+ const deleteStmt = this.db.prepare(`
256
+ DELETE FROM state_changes
257
+ WHERE entity = ? AND timestamp > ?
258
+ `);
259
+ deleteStmt.run(entity, checkpoint.timestamp);
260
+ return { restored: true, checkpoint };
261
+ }
262
+ listEntities() {
263
+ const stmt = this.db.prepare(`
264
+ SELECT DISTINCT entity FROM state_changes ORDER BY entity
265
+ `);
266
+ const rows = stmt.all();
267
+ return rows.map(row => row.entity);
268
+ }
269
+ enforceRetention(entity) {
270
+ const maxChanges = this.config.retention.maxChangesPerEntity;
271
+ const countStmt = this.db.prepare(`
272
+ SELECT COUNT(*) as count FROM state_changes WHERE entity = ?
273
+ `);
274
+ const { count } = countStmt.get(entity);
275
+ if (count > maxChanges) {
276
+ const deleteCount = count - maxChanges;
277
+ const deleteStmt = this.db.prepare(`
278
+ DELETE FROM state_changes
279
+ WHERE id IN (
280
+ SELECT id FROM state_changes
281
+ WHERE entity = ?
282
+ ORDER BY timestamp ASC
283
+ LIMIT ?
284
+ )
285
+ `);
286
+ deleteStmt.run(entity, deleteCount);
287
+ }
288
+ const retentionDays = this.config.retention.days;
289
+ const cutoffDate = new Date();
290
+ cutoffDate.setDate(cutoffDate.getDate() - retentionDays);
291
+ const cleanupStmt = this.db.prepare(`
292
+ DELETE FROM state_changes
293
+ WHERE timestamp < ?
294
+ `);
295
+ cleanupStmt.run(cutoffDate.toISOString());
296
+ }
297
+ getCurrentState(entity) {
298
+ const lastChange = this.getLastChange(entity);
299
+ return lastChange?.after || null;
300
+ }
301
+ close() {
302
+ this.db.close();
303
+ }
304
+ }
305
+ exports.StateStorage = StateStorage;
306
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ export interface StateChange {
2
+ id: string;
3
+ entity: string;
4
+ entityType: string;
5
+ entityId: string;
6
+ timestamp: string;
7
+ before: Record<string, unknown> | null;
8
+ after: Record<string, unknown>;
9
+ actor: string;
10
+ checkpointName?: string;
11
+ }
12
+ export interface Checkpoint {
13
+ id: string;
14
+ entity: string;
15
+ name: string;
16
+ timestamp: string;
17
+ state: Record<string, unknown>;
18
+ }
19
+ export interface ReplayResult {
20
+ entity: string;
21
+ changes: Array<{
22
+ timestamp: string;
23
+ step: number;
24
+ before: Record<string, unknown> | null;
25
+ after: Record<string, unknown>;
26
+ actor: string;
27
+ checkpointName?: string;
28
+ }>;
29
+ summary: string;
30
+ suggestedNextActions: string[];
31
+ }
32
+ export interface UndoResult {
33
+ entity: string;
34
+ stepsUndone: number;
35
+ restoredState: Record<string, unknown> | null;
36
+ summary: string;
37
+ }
38
+ export interface CheckpointResult {
39
+ id: string;
40
+ entity: string;
41
+ name: string;
42
+ timestamp: string;
43
+ summary: string;
44
+ }
45
+ export interface LogResult {
46
+ entity: string;
47
+ changes: StateChange[];
48
+ summary: string;
49
+ }
50
+ export interface TrackResult {
51
+ id: string;
52
+ entity: string;
53
+ timestamp: string;
54
+ summary: string;
55
+ }
56
+ export interface StateCLIConfig {
57
+ storage: {
58
+ type: 'local';
59
+ path: string;
60
+ };
61
+ autoTrack: {
62
+ enabled: boolean;
63
+ patterns: string[];
64
+ };
65
+ retention: {
66
+ days: number;
67
+ maxChangesPerEntity: number;
68
+ };
69
+ }
70
+ export declare const DEFAULT_CONFIG: StateCLIConfig;
71
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACvC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,KAAK,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;QACvC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/B,KAAK,EAAE,MAAM,CAAC;QACd,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC,CAAC;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC9C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE;QACP,IAAI,EAAE,OAAO,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,SAAS,EAAE;QACT,OAAO,EAAE,OAAO,CAAC;QACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;IACF,SAAS,EAAE;QACT,IAAI,EAAE,MAAM,CAAC;QACb,mBAAmB,EAAE,MAAM,CAAC;KAC7B,CAAC;CACH;AAED,eAAO,MAAM,cAAc,EAAE,cAa5B,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_CONFIG = void 0;
4
+ exports.DEFAULT_CONFIG = {
5
+ storage: {
6
+ type: 'local',
7
+ path: '.statecli/state.db'
8
+ },
9
+ autoTrack: {
10
+ enabled: true,
11
+ patterns: ['*']
12
+ },
13
+ retention: {
14
+ days: 30,
15
+ maxChangesPerEntity: 1000
16
+ }
17
+ };
18
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AA6Ea,QAAA,cAAc,GAAmB;IAC5C,OAAO,EAAE;QACP,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,oBAAoB;KAC3B;IACD,SAAS,EAAE;QACT,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,CAAC,GAAG,CAAC;KAChB;IACD,SAAS,EAAE;QACT,IAAI,EAAE,EAAE;QACR,mBAAmB,EAAE,IAAI;KAC1B;CACF,CAAC"}
package/package.json ADDED
@@ -0,0 +1,77 @@
1
+ {
2
+ "name": "statecli-mcp-server",
3
+ "version": "0.1.0",
4
+ "description": "MCP Server for State Replay & Self-Debugging - Memory, replay, and undo capability for AI agents",
5
+ "main": "./dist/index.js",
6
+ "bin": {
7
+ "statecli": "./dist/cli.js",
8
+ "statecli-mcp-server": "./dist/index.js"
9
+ },
10
+ "types": "./dist/index.d.ts",
11
+ "scripts": {
12
+ "build": "tsc",
13
+ "start": "node dist/index.js",
14
+ "dev": "ts-node src/index.ts",
15
+ "cli": "ts-node src/cli.ts",
16
+ "test": "jest",
17
+ "test:watch": "jest --watch",
18
+ "prepublishOnly": "npm run build"
19
+ },
20
+ "keywords": [
21
+ "state-management",
22
+ "state-replay",
23
+ "time-travel-debugging",
24
+ "undo",
25
+ "rollback",
26
+ "checkpoint",
27
+ "agent-memory",
28
+ "agent-introspection",
29
+ "self-debugging",
30
+ "ai-agent-tools",
31
+ "mcp-server",
32
+ "model-context-protocol",
33
+ "autonomous-agents",
34
+ "agent-observability",
35
+ "state-tracking",
36
+ "langchain-tools",
37
+ "autogpt-plugins",
38
+ "crewai-tools"
39
+ ],
40
+ "author": "",
41
+ "license": "MIT",
42
+ "dependencies": {
43
+ "@modelcontextprotocol/sdk": "^1.0.0",
44
+ "better-sqlite3": "^11.0.0",
45
+ "commander": "^12.0.0",
46
+ "uuid": "^9.0.0"
47
+ },
48
+ "devDependencies": {
49
+ "@types/better-sqlite3": "^7.6.8",
50
+ "@types/jest": "^29.5.12",
51
+ "@types/node": "^20.11.0",
52
+ "@types/uuid": "^9.0.7",
53
+ "jest": "^29.7.0",
54
+ "ts-jest": "^29.1.2",
55
+ "ts-node": "^10.9.2",
56
+ "typescript": "^5.3.3"
57
+ },
58
+ "engines": {
59
+ "node": ">=18.0.0"
60
+ },
61
+ "files": [
62
+ "dist/**/*",
63
+ "README.md",
64
+ "LICENSE"
65
+ ],
66
+ "repository": {
67
+ "type": "git",
68
+ "url": "git+https://github.com/statecli/mcp-server.git"
69
+ },
70
+ "bugs": {
71
+ "url": "https://github.com/statecli/mcp-server/issues"
72
+ },
73
+ "homepage": "https://github.com/statecli/mcp-server#readme",
74
+ "publishConfig": {
75
+ "access": "public"
76
+ }
77
+ }