mcp-context-sync 1.0.11 → 1.0.12
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/cli.js +57 -49
- package/dist/cli.js.map +1 -1
- package/dist/db/connection.d.ts +10 -1
- package/dist/db/connection.js +59 -23
- package/dist/db/connection.js.map +1 -1
- package/dist/db/json-adapter.d.ts +47 -0
- package/dist/db/json-adapter.js +235 -0
- package/dist/db/json-adapter.js.map +1 -0
- package/dist/db/sqlite-adapter.d.ts +37 -0
- package/dist/db/sqlite-adapter.js +78 -0
- package/dist/db/sqlite-adapter.js.map +1 -0
- package/dist/db/storage.d.ts +41 -0
- package/dist/db/storage.js +9 -0
- package/dist/db/storage.js.map +1 -0
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/resources/project-decisions.d.ts +2 -2
- package/dist/resources/project-decisions.js +3 -4
- package/dist/resources/project-decisions.js.map +1 -1
- package/dist/resources/project-snapshot.d.ts +2 -2
- package/dist/resources/project-snapshot.js +3 -4
- package/dist/resources/project-snapshot.js.map +1 -1
- package/dist/resources/status.d.ts +2 -2
- package/dist/resources/status.js +1 -2
- package/dist/resources/status.js.map +1 -1
- package/dist/tools/amend-snapshot.d.ts +2 -2
- package/dist/tools/amend-snapshot.js +9 -10
- package/dist/tools/amend-snapshot.js.map +1 -1
- package/dist/tools/get-history.d.ts +2 -2
- package/dist/tools/get-history.js +3 -4
- package/dist/tools/get-history.js.map +1 -1
- package/dist/tools/list-projects.d.ts +2 -2
- package/dist/tools/list-projects.js +1 -2
- package/dist/tools/list-projects.js.map +1 -1
- package/dist/tools/log-decision.d.ts +2 -2
- package/dist/tools/log-decision.js +2 -3
- package/dist/tools/log-decision.js.map +1 -1
- package/dist/tools/resume.d.ts +2 -2
- package/dist/tools/resume.js +7 -8
- package/dist/tools/resume.js.map +1 -1
- package/dist/tools/search-snapshots.d.ts +2 -2
- package/dist/tools/search-snapshots.js +2 -3
- package/dist/tools/search-snapshots.js.map +1 -1
- package/dist/tools/sync.d.ts +2 -2
- package/dist/tools/sync.js +5 -6
- package/dist/tools/sync.js.map +1 -1
- package/package.json +4 -2
- package/scripts/postinstall.cjs +14 -34
- package/scripts/preinstall.cjs +13 -86
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JsonAdapter — StorageAdapter backed by plain JSON files.
|
|
3
|
+
*
|
|
4
|
+
* Falls back to this when better-sqlite3 is unavailable (e.g. environments
|
|
5
|
+
* where native modules cannot be compiled).
|
|
6
|
+
*
|
|
7
|
+
* Data lives in the same directory as the SQLite DB:
|
|
8
|
+
* ~/.agents/context-sync/data/{projects,snapshots,decisions,handoffs}.json
|
|
9
|
+
*/
|
|
10
|
+
import { mkdirSync, readFileSync, writeFileSync, existsSync } from 'node:fs';
|
|
11
|
+
import { join } from 'node:path';
|
|
12
|
+
// ─── Helpers ───────────────────────────────────────────────────────
|
|
13
|
+
function readJsonArray(filePath) {
|
|
14
|
+
if (!existsSync(filePath))
|
|
15
|
+
return [];
|
|
16
|
+
try {
|
|
17
|
+
const raw = readFileSync(filePath, 'utf-8');
|
|
18
|
+
const parsed = JSON.parse(raw);
|
|
19
|
+
return Array.isArray(parsed) ? parsed : [];
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return [];
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function flush(filePath, data) {
|
|
26
|
+
writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');
|
|
27
|
+
}
|
|
28
|
+
// ─── Adapter ───────────────────────────────────────────────────────
|
|
29
|
+
export class JsonAdapter {
|
|
30
|
+
backend = 'json';
|
|
31
|
+
dataDir;
|
|
32
|
+
projectsPath;
|
|
33
|
+
snapshotsPath;
|
|
34
|
+
decisionsPath;
|
|
35
|
+
handoffsPath;
|
|
36
|
+
projects;
|
|
37
|
+
snapshots;
|
|
38
|
+
decisions;
|
|
39
|
+
handoffs;
|
|
40
|
+
constructor(dataDir) {
|
|
41
|
+
this.dataDir = dataDir;
|
|
42
|
+
mkdirSync(dataDir, { recursive: true });
|
|
43
|
+
this.projectsPath = join(dataDir, 'projects.json');
|
|
44
|
+
this.snapshotsPath = join(dataDir, 'snapshots.json');
|
|
45
|
+
this.decisionsPath = join(dataDir, 'decisions.json');
|
|
46
|
+
this.handoffsPath = join(dataDir, 'handoffs.json');
|
|
47
|
+
this.projects = readJsonArray(this.projectsPath);
|
|
48
|
+
this.snapshots = readJsonArray(this.snapshotsPath);
|
|
49
|
+
this.decisions = readJsonArray(this.decisionsPath);
|
|
50
|
+
this.handoffs = readJsonArray(this.handoffsPath);
|
|
51
|
+
}
|
|
52
|
+
// ─── Projects ──────────────────────────────────────────────────
|
|
53
|
+
upsertProject(id, normalizedPath, displayName) {
|
|
54
|
+
const existing = this.projects.find((p) => p.id === id);
|
|
55
|
+
if (existing) {
|
|
56
|
+
return existing;
|
|
57
|
+
}
|
|
58
|
+
const now = new Date().toISOString();
|
|
59
|
+
const row = {
|
|
60
|
+
id,
|
|
61
|
+
normalized_path: normalizedPath,
|
|
62
|
+
display_name: displayName,
|
|
63
|
+
created_at: now,
|
|
64
|
+
last_synced_at: null,
|
|
65
|
+
snapshot_count: 0,
|
|
66
|
+
handoff_count: 0,
|
|
67
|
+
};
|
|
68
|
+
this.projects.push(row);
|
|
69
|
+
flush(this.projectsPath, this.projects);
|
|
70
|
+
return row;
|
|
71
|
+
}
|
|
72
|
+
getProject(id) {
|
|
73
|
+
return this.projects.find((p) => p.id === id);
|
|
74
|
+
}
|
|
75
|
+
listProjects() {
|
|
76
|
+
return [...this.projects].sort((a, b) => {
|
|
77
|
+
const aTime = a.last_synced_at ?? '';
|
|
78
|
+
const bTime = b.last_synced_at ?? '';
|
|
79
|
+
return bTime.localeCompare(aTime);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
updateProjectSyncStats(projectId) {
|
|
83
|
+
const project = this.projects.find((p) => p.id === projectId);
|
|
84
|
+
if (!project)
|
|
85
|
+
return;
|
|
86
|
+
const now = new Date().toISOString();
|
|
87
|
+
project.last_synced_at = now;
|
|
88
|
+
project.snapshot_count = this.snapshots.filter((s) => s.project_id === projectId).length;
|
|
89
|
+
project.handoff_count = this.handoffs.filter((h) => h.project_id === projectId).length;
|
|
90
|
+
flush(this.projectsPath, this.projects);
|
|
91
|
+
}
|
|
92
|
+
// ─── Snapshots ─────────────────────────────────────────────────
|
|
93
|
+
getNextSequenceNumber(projectId) {
|
|
94
|
+
const seqs = this.snapshots
|
|
95
|
+
.filter((s) => s.project_id === projectId)
|
|
96
|
+
.map((s) => s.sequence_number);
|
|
97
|
+
return seqs.length === 0 ? 1 : Math.max(...seqs) + 1;
|
|
98
|
+
}
|
|
99
|
+
insertSnapshot(snapshot) {
|
|
100
|
+
const row = {
|
|
101
|
+
...snapshot,
|
|
102
|
+
amended_at: null,
|
|
103
|
+
amended_by: null,
|
|
104
|
+
};
|
|
105
|
+
this.snapshots.push(row);
|
|
106
|
+
flush(this.snapshotsPath, this.snapshots);
|
|
107
|
+
}
|
|
108
|
+
getLatestSnapshot(projectId) {
|
|
109
|
+
return [...this.snapshots]
|
|
110
|
+
.filter((s) => s.project_id === projectId)
|
|
111
|
+
.sort((a, b) => b.sequence_number - a.sequence_number)[0];
|
|
112
|
+
}
|
|
113
|
+
getSnapshotById(snapshotId) {
|
|
114
|
+
return this.snapshots.find((s) => s.id === snapshotId);
|
|
115
|
+
}
|
|
116
|
+
getSnapshotsByProject(projectId, limit) {
|
|
117
|
+
return [...this.snapshots]
|
|
118
|
+
.filter((s) => s.project_id === projectId)
|
|
119
|
+
.sort((a, b) => b.sequence_number - a.sequence_number)
|
|
120
|
+
.slice(0, limit);
|
|
121
|
+
}
|
|
122
|
+
updateSnapshot(snapshotId, fields) {
|
|
123
|
+
const snap = this.snapshots.find((s) => s.id === snapshotId);
|
|
124
|
+
if (!snap)
|
|
125
|
+
return;
|
|
126
|
+
for (const [key, value] of Object.entries(fields)) {
|
|
127
|
+
if (value !== undefined) {
|
|
128
|
+
snap[key] = value;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
flush(this.snapshotsPath, this.snapshots);
|
|
132
|
+
}
|
|
133
|
+
searchSnapshots(query, projectId, agent, since, until, limit = 20) {
|
|
134
|
+
const q = query.toLowerCase();
|
|
135
|
+
const searchFields = [
|
|
136
|
+
'summary',
|
|
137
|
+
'tasks_completed',
|
|
138
|
+
'tasks_remaining',
|
|
139
|
+
'decisions',
|
|
140
|
+
'next_steps',
|
|
141
|
+
'tags',
|
|
142
|
+
];
|
|
143
|
+
return this.snapshots
|
|
144
|
+
.filter((s) => {
|
|
145
|
+
// Text match across string fields
|
|
146
|
+
const matches = searchFields.some((field) => {
|
|
147
|
+
const val = s[field];
|
|
148
|
+
return typeof val === 'string' && val.toLowerCase().includes(q);
|
|
149
|
+
});
|
|
150
|
+
if (!matches)
|
|
151
|
+
return false;
|
|
152
|
+
// Filters
|
|
153
|
+
if (projectId && s.project_id !== projectId)
|
|
154
|
+
return false;
|
|
155
|
+
if (agent && s.agent !== agent)
|
|
156
|
+
return false;
|
|
157
|
+
if (since && s.created_at < since)
|
|
158
|
+
return false;
|
|
159
|
+
if (until && s.created_at > until)
|
|
160
|
+
return false;
|
|
161
|
+
return true;
|
|
162
|
+
})
|
|
163
|
+
.sort((a, b) => b.created_at.localeCompare(a.created_at))
|
|
164
|
+
.slice(0, limit);
|
|
165
|
+
}
|
|
166
|
+
// ─── Decisions ─────────────────────────────────────────────────
|
|
167
|
+
insertDecision(row) {
|
|
168
|
+
this.decisions.push(row);
|
|
169
|
+
flush(this.decisionsPath, this.decisions);
|
|
170
|
+
}
|
|
171
|
+
getDecisionsByProject(projectId, limit = 50) {
|
|
172
|
+
return [...this.decisions]
|
|
173
|
+
.filter((d) => d.project_id === projectId)
|
|
174
|
+
.sort((a, b) => b.created_at.localeCompare(a.created_at))
|
|
175
|
+
.slice(0, limit);
|
|
176
|
+
}
|
|
177
|
+
// ─── Handoffs ──────────────────────────────────────────────────
|
|
178
|
+
insertHandoff(row) {
|
|
179
|
+
this.handoffs.push(row);
|
|
180
|
+
flush(this.handoffsPath, this.handoffs);
|
|
181
|
+
}
|
|
182
|
+
getHandoffsByProject(projectId, limit = 20) {
|
|
183
|
+
return [...this.handoffs]
|
|
184
|
+
.filter((h) => h.project_id === projectId)
|
|
185
|
+
.sort((a, b) => b.created_at.localeCompare(a.created_at))
|
|
186
|
+
.slice(0, limit);
|
|
187
|
+
}
|
|
188
|
+
// ─── Stats ─────────────────────────────────────────────────────
|
|
189
|
+
getProjectAgents(projectId) {
|
|
190
|
+
const agents = new Set();
|
|
191
|
+
for (const s of this.snapshots) {
|
|
192
|
+
if (s.project_id === projectId) {
|
|
193
|
+
agents.add(s.agent);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return [...agents].sort();
|
|
197
|
+
}
|
|
198
|
+
getTotalCounts() {
|
|
199
|
+
return {
|
|
200
|
+
projects: this.projects.length,
|
|
201
|
+
snapshots: this.snapshots.length,
|
|
202
|
+
handoffs: this.handoffs.length,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
// ─── Lifecycle ─────────────────────────────────────────────────
|
|
206
|
+
transaction(fn) {
|
|
207
|
+
return () => {
|
|
208
|
+
// Save shallow copies for rollback on error
|
|
209
|
+
const projectsBackup = [...this.projects];
|
|
210
|
+
const snapshotsBackup = [...this.snapshots];
|
|
211
|
+
const decisionsBackup = [...this.decisions];
|
|
212
|
+
const handoffsBackup = [...this.handoffs];
|
|
213
|
+
try {
|
|
214
|
+
return fn();
|
|
215
|
+
}
|
|
216
|
+
catch (err) {
|
|
217
|
+
// Restore from backup
|
|
218
|
+
this.projects = projectsBackup;
|
|
219
|
+
this.snapshots = snapshotsBackup;
|
|
220
|
+
this.decisions = decisionsBackup;
|
|
221
|
+
this.handoffs = handoffsBackup;
|
|
222
|
+
// Re-flush to disk to undo any partial writes
|
|
223
|
+
flush(this.projectsPath, this.projects);
|
|
224
|
+
flush(this.snapshotsPath, this.snapshots);
|
|
225
|
+
flush(this.decisionsPath, this.decisions);
|
|
226
|
+
flush(this.handoffsPath, this.handoffs);
|
|
227
|
+
throw err;
|
|
228
|
+
}
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
close() {
|
|
232
|
+
// No-op: data is already flushed on each write
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=json-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-adapter.js","sourceRoot":"","sources":["../../src/db/json-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SqliteAdapter — StorageAdapter backed by better-sqlite3.
|
|
3
|
+
*
|
|
4
|
+
* Every method delegates to the corresponding function in queries.ts,
|
|
5
|
+
* passing the internal Database instance as the first argument.
|
|
6
|
+
*/
|
|
7
|
+
import type Database from 'better-sqlite3';
|
|
8
|
+
import type { StorageAdapter } from './storage.js';
|
|
9
|
+
import type { SnapshotRow, DecisionRow, HandoffRow, ProjectRow } from '../lib/types.js';
|
|
10
|
+
export declare class SqliteAdapter implements StorageAdapter {
|
|
11
|
+
readonly backend: "sqlite";
|
|
12
|
+
private readonly db;
|
|
13
|
+
constructor(db: Database.Database);
|
|
14
|
+
upsertProject(id: string, normalizedPath: string, displayName: string): ProjectRow;
|
|
15
|
+
getProject(id: string): ProjectRow | undefined;
|
|
16
|
+
listProjects(): ProjectRow[];
|
|
17
|
+
updateProjectSyncStats(projectId: string): void;
|
|
18
|
+
getNextSequenceNumber(projectId: string): number;
|
|
19
|
+
insertSnapshot(snapshot: Omit<SnapshotRow, 'amended_at' | 'amended_by'>): void;
|
|
20
|
+
getLatestSnapshot(projectId: string): SnapshotRow | undefined;
|
|
21
|
+
getSnapshotById(snapshotId: string): SnapshotRow | undefined;
|
|
22
|
+
getSnapshotsByProject(projectId: string, limit: number): SnapshotRow[];
|
|
23
|
+
updateSnapshot(snapshotId: string, fields: Partial<Pick<SnapshotRow, 'tasks_completed' | 'tasks_remaining' | 'decisions' | 'next_steps' | 'blockers' | 'tags' | 'amended_at' | 'amended_by'>>): void;
|
|
24
|
+
searchSnapshots(query: string, projectId?: string, agent?: string, since?: string, until?: string, limit?: number): SnapshotRow[];
|
|
25
|
+
insertDecision(row: DecisionRow): void;
|
|
26
|
+
getDecisionsByProject(projectId: string, limit?: number): DecisionRow[];
|
|
27
|
+
insertHandoff(row: HandoffRow): void;
|
|
28
|
+
getHandoffsByProject(projectId: string, limit?: number): HandoffRow[];
|
|
29
|
+
getProjectAgents(projectId: string): string[];
|
|
30
|
+
getTotalCounts(): {
|
|
31
|
+
projects: number;
|
|
32
|
+
snapshots: number;
|
|
33
|
+
handoffs: number;
|
|
34
|
+
};
|
|
35
|
+
transaction<T>(fn: () => T): () => T;
|
|
36
|
+
close(): void;
|
|
37
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SqliteAdapter — StorageAdapter backed by better-sqlite3.
|
|
3
|
+
*
|
|
4
|
+
* Every method delegates to the corresponding function in queries.ts,
|
|
5
|
+
* passing the internal Database instance as the first argument.
|
|
6
|
+
*/
|
|
7
|
+
import { upsertProject, getProject, listProjects, updateProjectSyncStats, getNextSequenceNumber, insertSnapshot, getLatestSnapshot, getSnapshotById, getSnapshotsByProject, updateSnapshot, searchSnapshots, insertDecision, getDecisionsByProject, insertHandoff, getHandoffsByProject, getProjectAgents, getTotalCounts, } from './queries.js';
|
|
8
|
+
export class SqliteAdapter {
|
|
9
|
+
backend = 'sqlite';
|
|
10
|
+
db;
|
|
11
|
+
constructor(db) {
|
|
12
|
+
this.db = db;
|
|
13
|
+
}
|
|
14
|
+
// ─── Projects ──────────────────────────────────────────────────
|
|
15
|
+
upsertProject(id, normalizedPath, displayName) {
|
|
16
|
+
return upsertProject(this.db, id, normalizedPath, displayName);
|
|
17
|
+
}
|
|
18
|
+
getProject(id) {
|
|
19
|
+
return getProject(this.db, id);
|
|
20
|
+
}
|
|
21
|
+
listProjects() {
|
|
22
|
+
return listProjects(this.db);
|
|
23
|
+
}
|
|
24
|
+
updateProjectSyncStats(projectId) {
|
|
25
|
+
updateProjectSyncStats(this.db, projectId);
|
|
26
|
+
}
|
|
27
|
+
// ─── Snapshots ─────────────────────────────────────────────────
|
|
28
|
+
getNextSequenceNumber(projectId) {
|
|
29
|
+
return getNextSequenceNumber(this.db, projectId);
|
|
30
|
+
}
|
|
31
|
+
insertSnapshot(snapshot) {
|
|
32
|
+
insertSnapshot(this.db, snapshot);
|
|
33
|
+
}
|
|
34
|
+
getLatestSnapshot(projectId) {
|
|
35
|
+
return getLatestSnapshot(this.db, projectId);
|
|
36
|
+
}
|
|
37
|
+
getSnapshotById(snapshotId) {
|
|
38
|
+
return getSnapshotById(this.db, snapshotId);
|
|
39
|
+
}
|
|
40
|
+
getSnapshotsByProject(projectId, limit) {
|
|
41
|
+
return getSnapshotsByProject(this.db, projectId, limit);
|
|
42
|
+
}
|
|
43
|
+
updateSnapshot(snapshotId, fields) {
|
|
44
|
+
updateSnapshot(this.db, snapshotId, fields);
|
|
45
|
+
}
|
|
46
|
+
searchSnapshots(query, projectId, agent, since, until, limit = 20) {
|
|
47
|
+
return searchSnapshots(this.db, query, projectId, agent, since, until, limit);
|
|
48
|
+
}
|
|
49
|
+
// ─── Decisions ─────────────────────────────────────────────────
|
|
50
|
+
insertDecision(row) {
|
|
51
|
+
insertDecision(this.db, row);
|
|
52
|
+
}
|
|
53
|
+
getDecisionsByProject(projectId, limit = 50) {
|
|
54
|
+
return getDecisionsByProject(this.db, projectId, limit);
|
|
55
|
+
}
|
|
56
|
+
// ─── Handoffs ──────────────────────────────────────────────────
|
|
57
|
+
insertHandoff(row) {
|
|
58
|
+
insertHandoff(this.db, row);
|
|
59
|
+
}
|
|
60
|
+
getHandoffsByProject(projectId, limit = 20) {
|
|
61
|
+
return getHandoffsByProject(this.db, projectId, limit);
|
|
62
|
+
}
|
|
63
|
+
// ─── Stats ─────────────────────────────────────────────────────
|
|
64
|
+
getProjectAgents(projectId) {
|
|
65
|
+
return getProjectAgents(this.db, projectId);
|
|
66
|
+
}
|
|
67
|
+
getTotalCounts() {
|
|
68
|
+
return getTotalCounts(this.db);
|
|
69
|
+
}
|
|
70
|
+
// ─── Lifecycle ─────────────────────────────────────────────────
|
|
71
|
+
transaction(fn) {
|
|
72
|
+
return this.db.transaction(fn);
|
|
73
|
+
}
|
|
74
|
+
close() {
|
|
75
|
+
this.db.close();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=sqlite-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-adapter.js","sourceRoot":"","sources":["../../src/db/sqlite-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StorageAdapter — backend-agnostic interface for context-sync persistence.
|
|
3
|
+
*
|
|
4
|
+
* Every method mirrors an exported function from queries.ts but without the
|
|
5
|
+
* leading `db` parameter. Implementations: SqliteAdapter (better-sqlite3)
|
|
6
|
+
* and JsonAdapter (plain JSON files).
|
|
7
|
+
*/
|
|
8
|
+
export type { ProjectRow, SnapshotRow, DecisionRow, HandoffRow, } from '../lib/types.js';
|
|
9
|
+
import type { ProjectRow, SnapshotRow, DecisionRow, HandoffRow } from '../lib/types.js';
|
|
10
|
+
export interface StorageAdapter {
|
|
11
|
+
/** Identifies the backing store for doctor/diagnostics. */
|
|
12
|
+
readonly backend: 'sqlite' | 'json';
|
|
13
|
+
upsertProject(id: string, normalizedPath: string, displayName: string): ProjectRow;
|
|
14
|
+
getProject(id: string): ProjectRow | undefined;
|
|
15
|
+
listProjects(): ProjectRow[];
|
|
16
|
+
updateProjectSyncStats(projectId: string): void;
|
|
17
|
+
getNextSequenceNumber(projectId: string): number;
|
|
18
|
+
insertSnapshot(snapshot: Omit<SnapshotRow, 'amended_at' | 'amended_by'>): void;
|
|
19
|
+
getLatestSnapshot(projectId: string): SnapshotRow | undefined;
|
|
20
|
+
getSnapshotById(snapshotId: string): SnapshotRow | undefined;
|
|
21
|
+
getSnapshotsByProject(projectId: string, limit: number): SnapshotRow[];
|
|
22
|
+
updateSnapshot(snapshotId: string, fields: Partial<Pick<SnapshotRow, 'tasks_completed' | 'tasks_remaining' | 'decisions' | 'next_steps' | 'blockers' | 'tags' | 'amended_at' | 'amended_by'>>): void;
|
|
23
|
+
searchSnapshots(query: string, projectId?: string, agent?: string, since?: string, until?: string, limit?: number): SnapshotRow[];
|
|
24
|
+
insertDecision(row: DecisionRow): void;
|
|
25
|
+
getDecisionsByProject(projectId: string, limit?: number): DecisionRow[];
|
|
26
|
+
insertHandoff(row: HandoffRow): void;
|
|
27
|
+
getHandoffsByProject(projectId: string, limit?: number): HandoffRow[];
|
|
28
|
+
getProjectAgents(projectId: string): string[];
|
|
29
|
+
getTotalCounts(): {
|
|
30
|
+
projects: number;
|
|
31
|
+
snapshots: number;
|
|
32
|
+
handoffs: number;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Returns a callable that, when invoked, executes `fn` inside a
|
|
36
|
+
* transaction (matching better-sqlite3's `db.transaction(fn)` pattern).
|
|
37
|
+
*/
|
|
38
|
+
transaction<T>(fn: () => T): () => T;
|
|
39
|
+
/** Release any resources held by the adapter. */
|
|
40
|
+
close(): void;
|
|
41
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StorageAdapter — backend-agnostic interface for context-sync persistence.
|
|
3
|
+
*
|
|
4
|
+
* Every method mirrors an exported function from queries.ts but without the
|
|
5
|
+
* leading `db` parameter. Implementations: SqliteAdapter (better-sqlite3)
|
|
6
|
+
* and JsonAdapter (plain JSON files).
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/db/storage.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
3
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
-
import {
|
|
4
|
+
import { getStorage, closeStorage } from './db/connection.js';
|
|
5
5
|
import { registerSyncTool } from './tools/sync.js';
|
|
6
6
|
import { registerResumeTool } from './tools/resume.js';
|
|
7
7
|
import { registerLogDecisionTool } from './tools/log-decision.js';
|
|
@@ -13,7 +13,7 @@ import { registerStatusResource } from './resources/status.js';
|
|
|
13
13
|
import { registerProjectSnapshotResource } from './resources/project-snapshot.js';
|
|
14
14
|
import { registerProjectDecisionsResource } from './resources/project-decisions.js';
|
|
15
15
|
async function main() {
|
|
16
|
-
const db =
|
|
16
|
+
const db = getStorage();
|
|
17
17
|
const server = new McpServer({
|
|
18
18
|
name: 'context-sync',
|
|
19
19
|
version: '1.0.0',
|
|
@@ -35,11 +35,11 @@ async function main() {
|
|
|
35
35
|
await server.connect(transport);
|
|
36
36
|
// Cleanup on exit
|
|
37
37
|
process.on('SIGINT', () => {
|
|
38
|
-
|
|
38
|
+
closeStorage();
|
|
39
39
|
process.exit(0);
|
|
40
40
|
});
|
|
41
41
|
process.on('SIGTERM', () => {
|
|
42
|
-
|
|
42
|
+
closeStorage();
|
|
43
43
|
process.exit(0);
|
|
44
44
|
});
|
|
45
45
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,+BAA+B,EAAE,MAAM,iCAAiC,CAAC;AAClF,OAAO,EAAE,gCAAgC,EAAE,MAAM,kCAAkC,CAAC;AAEpF,KAAK,UAAU,IAAI;IACjB,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;IAExB,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,QAAQ;IACR,gBAAgB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC7B,kBAAkB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC/B,uBAAuB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACpC,sBAAsB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACnC,wBAAwB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACrC,2BAA2B,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACxC,yBAAyB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAEtC,YAAY;IACZ,sBAAsB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACnC,+BAA+B,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC5C,gCAAgC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAE7C,oBAAoB;IACpB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,kBAAkB;IAClB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,YAAY,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QACzB,YAAY,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { type McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
-
import type
|
|
3
|
-
export declare function registerProjectDecisionsResource(server: McpServer, db:
|
|
2
|
+
import type { StorageAdapter } from '../db/storage.js';
|
|
3
|
+
export declare function registerProjectDecisionsResource(server: McpServer, db: StorageAdapter): void;
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
-
import { listProjects, getDecisionsByProject } from '../db/queries.js';
|
|
3
2
|
export function registerProjectDecisionsResource(server, db) {
|
|
4
3
|
server.registerResource('project-decisions', new ResourceTemplate('context-sync://project/{projectId}/decisions', {
|
|
5
4
|
list: async () => {
|
|
6
|
-
const projects = listProjects(
|
|
5
|
+
const projects = db.listProjects();
|
|
7
6
|
return {
|
|
8
7
|
resources: projects.map((p) => ({
|
|
9
8
|
uri: `context-sync://project/${p.id}/decisions`,
|
|
@@ -19,7 +18,7 @@ export function registerProjectDecisionsResource(server, db) {
|
|
|
19
18
|
mimeType: 'text/markdown',
|
|
20
19
|
}, async (uri, { projectId }) => {
|
|
21
20
|
const pid = projectId;
|
|
22
|
-
const decisions = getDecisionsByProject(
|
|
21
|
+
const decisions = db.getDecisionsByProject(pid);
|
|
23
22
|
if (decisions.length === 0) {
|
|
24
23
|
return {
|
|
25
24
|
contents: [
|
|
@@ -31,7 +30,7 @@ export function registerProjectDecisionsResource(server, db) {
|
|
|
31
30
|
],
|
|
32
31
|
};
|
|
33
32
|
}
|
|
34
|
-
const projects = listProjects(
|
|
33
|
+
const projects = db.listProjects();
|
|
35
34
|
const project = projects.find((p) => p.id === pid);
|
|
36
35
|
const displayName = project?.display_name ?? pid;
|
|
37
36
|
const lines = [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-decisions.js","sourceRoot":"","sources":["../../src/resources/project-decisions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAkB,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"project-decisions.js","sourceRoot":"","sources":["../../src/resources/project-decisions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAkB,MAAM,yCAAyC,CAAC;AAG3F,MAAM,UAAU,gCAAgC,CAC9C,MAAiB,EACjB,EAAkB;IAElB,MAAM,CAAC,gBAAgB,CACrB,mBAAmB,EACnB,IAAI,gBAAgB,CAAC,8CAA8C,EAAE;QACnE,IAAI,EAAE,KAAK,IAAI,EAAE;YACf,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC;YACnC,OAAO;gBACL,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC9B,GAAG,EAAE,0BAA0B,CAAC,CAAC,EAAE,YAAY;oBAC/C,IAAI,EAAE,GAAG,CAAC,CAAC,YAAY,iBAAiB;oBACxC,WAAW,EAAE,8BAA8B,CAAC,CAAC,YAAY,EAAE;oBAC3D,QAAQ,EAAE,eAAwB;iBACnC,CAAC,CAAC;aACJ,CAAC;QACJ,CAAC;KACF,CAAC,EACF;QACE,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EACT,uEAAuE;QACzE,QAAQ,EAAE,eAAe;KAC1B,EACD,KAAK,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;QAC3B,MAAM,GAAG,GAAG,SAAmB,CAAC;QAChC,MAAM,SAAS,GAAG,EAAE,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC;QAEhD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO;gBACL,QAAQ,EAAE;oBACR;wBACE,GAAG,EAAE,GAAG,CAAC,IAAI;wBACb,QAAQ,EAAE,YAAY;wBACtB,IAAI,EAAE,yCAAyC;qBAChD;iBACF;aACF,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;QACnD,MAAM,WAAW,GAAG,OAAO,EAAE,YAAY,IAAI,GAAG,CAAC;QAEjD,MAAM,KAAK,GAAa;YACtB,mBAAmB,WAAW,EAAE;YAChC,EAAE;SACH,CAAC;QAEF,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;YAC1C,IAAI,CAAC,CAAC,QAAQ;gBAAE,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC5D,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;YAC9C,MAAM,IAAI,GAAa,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;YAClD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpB,KAAK,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnD,CAAC;YACD,MAAM,KAAK,GAAa,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;YACpD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,KAAK,CAAC,IAAI,CAAC,gBAAgB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACxE,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QAED,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,QAAQ,EAAE,eAAe;oBACzB,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;iBACvB;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { type McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
-
import type
|
|
3
|
-
export declare function registerProjectSnapshotResource(server: McpServer, db:
|
|
2
|
+
import type { StorageAdapter } from '../db/storage.js';
|
|
3
|
+
export declare function registerProjectSnapshotResource(server: McpServer, db: StorageAdapter): void;
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
-
import { listProjects, getLatestSnapshot, } from '../db/queries.js';
|
|
3
2
|
import { renderSnapshotMarkdown } from '../lib/snapshot-renderer.js';
|
|
4
3
|
export function registerProjectSnapshotResource(server, db) {
|
|
5
4
|
server.registerResource('project-snapshot', new ResourceTemplate('context-sync://project/{projectId}/latest', {
|
|
6
5
|
list: async () => {
|
|
7
|
-
const projects = listProjects(
|
|
6
|
+
const projects = db.listProjects();
|
|
8
7
|
return {
|
|
9
8
|
resources: projects.map((p) => ({
|
|
10
9
|
uri: `context-sync://project/${p.id}/latest`,
|
|
@@ -20,7 +19,7 @@ export function registerProjectSnapshotResource(server, db) {
|
|
|
20
19
|
mimeType: 'text/markdown',
|
|
21
20
|
}, async (uri, { projectId }) => {
|
|
22
21
|
const pid = projectId;
|
|
23
|
-
const snapshot = getLatestSnapshot(
|
|
22
|
+
const snapshot = db.getLatestSnapshot(pid);
|
|
24
23
|
if (!snapshot) {
|
|
25
24
|
return {
|
|
26
25
|
contents: [
|
|
@@ -32,7 +31,7 @@ export function registerProjectSnapshotResource(server, db) {
|
|
|
32
31
|
],
|
|
33
32
|
};
|
|
34
33
|
}
|
|
35
|
-
const projects = listProjects(
|
|
34
|
+
const projects = db.listProjects();
|
|
36
35
|
const project = projects.find((p) => p.id === pid);
|
|
37
36
|
const displayName = project?.display_name ?? pid;
|
|
38
37
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-snapshot.js","sourceRoot":"","sources":["../../src/resources/project-snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAkB,MAAM,yCAAyC,CAAC;AAE3F,OAAO,
|
|
1
|
+
{"version":3,"file":"project-snapshot.js","sourceRoot":"","sources":["../../src/resources/project-snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAkB,MAAM,yCAAyC,CAAC;AAE3F,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE,MAAM,UAAU,+BAA+B,CAC7C,MAAiB,EACjB,EAAkB;IAElB,MAAM,CAAC,gBAAgB,CACrB,kBAAkB,EAClB,IAAI,gBAAgB,CAAC,2CAA2C,EAAE;QAChE,IAAI,EAAE,KAAK,IAAI,EAAE;YACf,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC;YACnC,OAAO;gBACL,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC9B,GAAG,EAAE,0BAA0B,CAAC,CAAC,EAAE,SAAS;oBAC5C,IAAI,EAAE,GAAG,CAAC,CAAC,YAAY,oBAAoB;oBAC3C,WAAW,EAAE,oCAAoC,CAAC,CAAC,YAAY,EAAE;oBACjE,QAAQ,EAAE,eAAwB;iBACnC,CAAC,CAAC;aACJ,CAAC;QACJ,CAAC;KACF,CAAC,EACF;QACE,KAAK,EAAE,yBAAyB;QAChC,WAAW,EAAE,yDAAyD;QACtE,QAAQ,EAAE,eAAe;KAC1B,EACD,KAAK,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;QAC3B,MAAM,GAAG,GAAG,SAAmB,CAAC;QAChC,MAAM,QAAQ,GAAG,EAAE,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAE3C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO;gBACL,QAAQ,EAAE;oBACR;wBACE,GAAG,EAAE,GAAG,CAAC,IAAI;wBACb,QAAQ,EAAE,YAAY;wBACtB,IAAI,EAAE,sCAAsC;qBAC7C;iBACF;aACF,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;QACnD,MAAM,WAAW,GAAG,OAAO,EAAE,YAAY,IAAI,GAAG,CAAC;QAEjD,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,QAAQ,EAAE,eAAe;oBACzB,IAAI,EAAE,sBAAsB,CAAC,QAAQ,EAAE,WAAW,CAAC;iBACpD;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
-
import type
|
|
3
|
-
export declare function registerStatusResource(server: McpServer, db:
|
|
2
|
+
import type { StorageAdapter } from '../db/storage.js';
|
|
3
|
+
export declare function registerStatusResource(server: McpServer, db: StorageAdapter): void;
|
package/dist/resources/status.js
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import { getTotalCounts } from '../db/queries.js';
|
|
2
1
|
export function registerStatusResource(server, db) {
|
|
3
2
|
server.registerResource('server-status', 'context-sync://status', {
|
|
4
3
|
title: 'Context Sync Server Status',
|
|
5
4
|
description: 'Server version, total projects, snapshots, and handoffs',
|
|
6
5
|
mimeType: 'application/json',
|
|
7
6
|
}, async (uri) => {
|
|
8
|
-
const counts = getTotalCounts(
|
|
7
|
+
const counts = db.getTotalCounts();
|
|
9
8
|
return {
|
|
10
9
|
contents: [
|
|
11
10
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/resources/status.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/resources/status.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,sBAAsB,CACpC,MAAiB,EACjB,EAAkB;IAElB,MAAM,CAAC,gBAAgB,CACrB,eAAe,EACf,uBAAuB,EACvB;QACE,KAAK,EAAE,4BAA4B;QACnC,WAAW,EAAE,yDAAyD;QACtE,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;QACZ,MAAM,MAAM,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC;QACnC,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;wBACE,OAAO,EAAE,OAAO;wBAChB,aAAa,EAAE,MAAM,CAAC,QAAQ;wBAC9B,cAAc,EAAE,MAAM,CAAC,SAAS;wBAChC,aAAa,EAAE,MAAM,CAAC,QAAQ;qBAC/B,EACD,IAAI,EACJ,CAAC,CACF;iBACF;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
-
import type
|
|
3
|
-
export declare function registerAmendSnapshotTool(server: McpServer, db:
|
|
2
|
+
import type { StorageAdapter } from '../db/storage.js';
|
|
3
|
+
export declare function registerAmendSnapshotTool(server: McpServer, db: StorageAdapter): void;
|