engram-mcp-server 1.2.8 → 1.2.9

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.
Files changed (210) hide show
  1. package/README.md +12 -1
  2. package/dist/constants.d.ts +1 -1
  3. package/dist/constants.d.ts.map +1 -1
  4. package/dist/constants.js +6 -1
  5. package/dist/constants.js.map +1 -1
  6. package/dist/index.js +7 -1
  7. package/dist/index.js.map +1 -1
  8. package/dist/installer/ide-detector.d.ts.map +1 -1
  9. package/dist/installer/ide-detector.js +10 -6
  10. package/dist/installer/ide-detector.js.map +1 -1
  11. package/dist/installer/index.d.ts.map +1 -1
  12. package/dist/installer/index.js +79 -15
  13. package/dist/installer/index.js.map +1 -1
  14. package/package.json +6 -3
  15. package/dist/installer.d.ts +0 -2
  16. package/dist/installer.d.ts.map +0 -1
  17. package/dist/installer.js +0 -315
  18. package/dist/installer.js.map +0 -1
  19. package/dist/src/constants.d.ts +0 -21
  20. package/dist/src/constants.d.ts.map +0 -1
  21. package/dist/src/constants.js +0 -81
  22. package/dist/src/constants.js.map +0 -1
  23. package/dist/src/database.d.ts +0 -32
  24. package/dist/src/database.d.ts.map +0 -1
  25. package/dist/src/database.js +0 -143
  26. package/dist/src/database.js.map +0 -1
  27. package/dist/src/errors.d.ts +0 -40
  28. package/dist/src/errors.d.ts.map +0 -1
  29. package/dist/src/errors.js +0 -63
  30. package/dist/src/errors.js.map +0 -1
  31. package/dist/src/index.d.ts +0 -3
  32. package/dist/src/index.d.ts.map +0 -1
  33. package/dist/src/index.js +0 -89
  34. package/dist/src/index.js.map +0 -1
  35. package/dist/src/installer/config-writer.d.ts +0 -25
  36. package/dist/src/installer/config-writer.d.ts.map +0 -1
  37. package/dist/src/installer/config-writer.js +0 -86
  38. package/dist/src/installer/config-writer.js.map +0 -1
  39. package/dist/src/installer/ide-configs.d.ts +0 -19
  40. package/dist/src/installer/ide-configs.d.ts.map +0 -1
  41. package/dist/src/installer/ide-configs.js +0 -131
  42. package/dist/src/installer/ide-configs.js.map +0 -1
  43. package/dist/src/installer/ide-detector.d.ts +0 -6
  44. package/dist/src/installer/ide-detector.d.ts.map +0 -1
  45. package/dist/src/installer/ide-detector.js +0 -45
  46. package/dist/src/installer/ide-detector.js.map +0 -1
  47. package/dist/src/installer/index.d.ts +0 -2
  48. package/dist/src/installer/index.d.ts.map +0 -1
  49. package/dist/src/installer/index.js +0 -229
  50. package/dist/src/installer/index.js.map +0 -1
  51. package/dist/src/logger.d.ts +0 -10
  52. package/dist/src/logger.d.ts.map +0 -1
  53. package/dist/src/logger.js +0 -51
  54. package/dist/src/logger.js.map +0 -1
  55. package/dist/src/migrations.d.ts +0 -4
  56. package/dist/src/migrations.d.ts.map +0 -1
  57. package/dist/src/migrations.js +0 -343
  58. package/dist/src/migrations.js.map +0 -1
  59. package/dist/src/repositories/changes.repo.d.ts +0 -35
  60. package/dist/src/repositories/changes.repo.d.ts.map +0 -1
  61. package/dist/src/repositories/changes.repo.js +0 -53
  62. package/dist/src/repositories/changes.repo.js.map +0 -1
  63. package/dist/src/repositories/config.repo.d.ts +0 -11
  64. package/dist/src/repositories/config.repo.d.ts.map +0 -1
  65. package/dist/src/repositories/config.repo.js +0 -38
  66. package/dist/src/repositories/config.repo.js.map +0 -1
  67. package/dist/src/repositories/conventions.repo.d.ts +0 -15
  68. package/dist/src/repositories/conventions.repo.d.ts.map +0 -1
  69. package/dist/src/repositories/conventions.repo.js +0 -39
  70. package/dist/src/repositories/conventions.repo.js.map +0 -1
  71. package/dist/src/repositories/decisions.repo.d.ts +0 -19
  72. package/dist/src/repositories/decisions.repo.d.ts.map +0 -1
  73. package/dist/src/repositories/decisions.repo.js +0 -48
  74. package/dist/src/repositories/decisions.repo.js.map +0 -1
  75. package/dist/src/repositories/events.repo.d.ts +0 -34
  76. package/dist/src/repositories/events.repo.d.ts.map +0 -1
  77. package/dist/src/repositories/events.repo.js +0 -71
  78. package/dist/src/repositories/events.repo.js.map +0 -1
  79. package/dist/src/repositories/file-notes.repo.d.ts +0 -26
  80. package/dist/src/repositories/file-notes.repo.d.ts.map +0 -1
  81. package/dist/src/repositories/file-notes.repo.js +0 -55
  82. package/dist/src/repositories/file-notes.repo.js.map +0 -1
  83. package/dist/src/repositories/index.d.ts +0 -38
  84. package/dist/src/repositories/index.d.ts.map +0 -1
  85. package/dist/src/repositories/index.js +0 -41
  86. package/dist/src/repositories/index.js.map +0 -1
  87. package/dist/src/repositories/milestones.repo.d.ts +0 -10
  88. package/dist/src/repositories/milestones.repo.d.ts.map +0 -1
  89. package/dist/src/repositories/milestones.repo.js +0 -20
  90. package/dist/src/repositories/milestones.repo.js.map +0 -1
  91. package/dist/src/repositories/sessions.repo.d.ts +0 -27
  92. package/dist/src/repositories/sessions.repo.d.ts.map +0 -1
  93. package/dist/src/repositories/sessions.repo.js +0 -61
  94. package/dist/src/repositories/sessions.repo.js.map +0 -1
  95. package/dist/src/repositories/snapshot.repo.d.ts +0 -11
  96. package/dist/src/repositories/snapshot.repo.d.ts.map +0 -1
  97. package/dist/src/repositories/snapshot.repo.js +0 -17
  98. package/dist/src/repositories/snapshot.repo.js.map +0 -1
  99. package/dist/src/repositories/tasks.repo.d.ts +0 -40
  100. package/dist/src/repositories/tasks.repo.d.ts.map +0 -1
  101. package/dist/src/repositories/tasks.repo.js +0 -90
  102. package/dist/src/repositories/tasks.repo.js.map +0 -1
  103. package/dist/src/response.d.ts +0 -28
  104. package/dist/src/response.d.ts.map +0 -1
  105. package/dist/src/response.js +0 -38
  106. package/dist/src/response.js.map +0 -1
  107. package/dist/src/scripts/install-hooks.d.ts +0 -3
  108. package/dist/src/scripts/install-hooks.d.ts.map +0 -1
  109. package/dist/src/scripts/install-hooks.js +0 -89
  110. package/dist/src/scripts/install-hooks.js.map +0 -1
  111. package/dist/src/services/compaction.service.d.ts +0 -27
  112. package/dist/src/services/compaction.service.d.ts.map +0 -1
  113. package/dist/src/services/compaction.service.js +0 -93
  114. package/dist/src/services/compaction.service.js.map +0 -1
  115. package/dist/src/services/event-trigger.service.d.ts +0 -24
  116. package/dist/src/services/event-trigger.service.d.ts.map +0 -1
  117. package/dist/src/services/event-trigger.service.js +0 -60
  118. package/dist/src/services/event-trigger.service.js.map +0 -1
  119. package/dist/src/services/git.service.d.ts +0 -20
  120. package/dist/src/services/git.service.d.ts.map +0 -1
  121. package/dist/src/services/git.service.js +0 -88
  122. package/dist/src/services/git.service.js.map +0 -1
  123. package/dist/src/services/index.d.ts +0 -5
  124. package/dist/src/services/index.d.ts.map +0 -1
  125. package/dist/src/services/index.js +0 -8
  126. package/dist/src/services/index.js.map +0 -1
  127. package/dist/src/services/project-scan.service.d.ts +0 -19
  128. package/dist/src/services/project-scan.service.d.ts.map +0 -1
  129. package/dist/src/services/project-scan.service.js +0 -66
  130. package/dist/src/services/project-scan.service.js.map +0 -1
  131. package/dist/src/tools/backup.d.ts +0 -3
  132. package/dist/src/tools/backup.d.ts.map +0 -1
  133. package/dist/src/tools/backup.js +0 -191
  134. package/dist/src/tools/backup.js.map +0 -1
  135. package/dist/src/tools/changes.d.ts +0 -3
  136. package/dist/src/tools/changes.d.ts.map +0 -1
  137. package/dist/src/tools/changes.js +0 -97
  138. package/dist/src/tools/changes.js.map +0 -1
  139. package/dist/src/tools/compaction.d.ts +0 -3
  140. package/dist/src/tools/compaction.d.ts.map +0 -1
  141. package/dist/src/tools/compaction.js +0 -151
  142. package/dist/src/tools/compaction.js.map +0 -1
  143. package/dist/src/tools/conventions.d.ts +0 -3
  144. package/dist/src/tools/conventions.d.ts.map +0 -1
  145. package/dist/src/tools/conventions.js +0 -121
  146. package/dist/src/tools/conventions.js.map +0 -1
  147. package/dist/src/tools/decisions.d.ts +0 -3
  148. package/dist/src/tools/decisions.d.ts.map +0 -1
  149. package/dist/src/tools/decisions.js +0 -136
  150. package/dist/src/tools/decisions.js.map +0 -1
  151. package/dist/src/tools/export-import.d.ts +0 -3
  152. package/dist/src/tools/export-import.d.ts.map +0 -1
  153. package/dist/src/tools/export-import.js +0 -180
  154. package/dist/src/tools/export-import.js.map +0 -1
  155. package/dist/src/tools/file-notes.d.ts +0 -3
  156. package/dist/src/tools/file-notes.d.ts.map +0 -1
  157. package/dist/src/tools/file-notes.js +0 -104
  158. package/dist/src/tools/file-notes.js.map +0 -1
  159. package/dist/src/tools/intelligence.d.ts +0 -3
  160. package/dist/src/tools/intelligence.d.ts.map +0 -1
  161. package/dist/src/tools/intelligence.js +0 -427
  162. package/dist/src/tools/intelligence.js.map +0 -1
  163. package/dist/src/tools/milestones.d.ts +0 -3
  164. package/dist/src/tools/milestones.d.ts.map +0 -1
  165. package/dist/src/tools/milestones.js +0 -71
  166. package/dist/src/tools/milestones.js.map +0 -1
  167. package/dist/src/tools/scheduler.d.ts +0 -3
  168. package/dist/src/tools/scheduler.d.ts.map +0 -1
  169. package/dist/src/tools/scheduler.js +0 -363
  170. package/dist/src/tools/scheduler.js.map +0 -1
  171. package/dist/src/tools/sessions.d.ts +0 -3
  172. package/dist/src/tools/sessions.d.ts.map +0 -1
  173. package/dist/src/tools/sessions.js +0 -356
  174. package/dist/src/tools/sessions.js.map +0 -1
  175. package/dist/src/tools/stats.d.ts +0 -3
  176. package/dist/src/tools/stats.d.ts.map +0 -1
  177. package/dist/src/tools/stats.js +0 -63
  178. package/dist/src/tools/stats.js.map +0 -1
  179. package/dist/src/tools/tasks.d.ts +0 -3
  180. package/dist/src/tools/tasks.d.ts.map +0 -1
  181. package/dist/src/tools/tasks.js +0 -206
  182. package/dist/src/tools/tasks.js.map +0 -1
  183. package/dist/src/types.d.ts +0 -170
  184. package/dist/src/types.d.ts.map +0 -1
  185. package/dist/src/types.js +0 -5
  186. package/dist/src/types.js.map +0 -1
  187. package/dist/src/utils.d.ts +0 -58
  188. package/dist/src/utils.d.ts.map +0 -1
  189. package/dist/src/utils.js +0 -190
  190. package/dist/src/utils.js.map +0 -1
  191. package/dist/tests/helpers/test-db.d.ts +0 -12
  192. package/dist/tests/helpers/test-db.d.ts.map +0 -1
  193. package/dist/tests/helpers/test-db.js +0 -149
  194. package/dist/tests/helpers/test-db.js.map +0 -1
  195. package/dist/tests/installer/installer.test.d.ts +0 -2
  196. package/dist/tests/installer/installer.test.d.ts.map +0 -1
  197. package/dist/tests/installer/installer.test.js +0 -160
  198. package/dist/tests/installer/installer.test.js.map +0 -1
  199. package/dist/tests/repositories/repos.test.d.ts +0 -2
  200. package/dist/tests/repositories/repos.test.d.ts.map +0 -1
  201. package/dist/tests/repositories/repos.test.js +0 -220
  202. package/dist/tests/repositories/repos.test.js.map +0 -1
  203. package/dist/tools/maintenance.d.ts +0 -3
  204. package/dist/tools/maintenance.d.ts.map +0 -1
  205. package/dist/tools/maintenance.js +0 -647
  206. package/dist/tools/maintenance.js.map +0 -1
  207. package/dist/tools/memory.d.ts +0 -3
  208. package/dist/tools/memory.d.ts.map +0 -1
  209. package/dist/tools/memory.js +0 -446
  210. package/dist/tools/memory.js.map +0 -1
@@ -1,356 +0,0 @@
1
- // ============================================================================
2
- // Engram MCP Server — Session Management Tools
3
- // ============================================================================
4
- import { z } from "zod";
5
- import * as fs from "fs";
6
- import * as path from "path";
7
- import { getDb, now, getCurrentSessionId, getLastCompletedSession, getProjectRoot, backupDatabase } from "../database.js";
8
- import { getGitLogSince, getGitBranch, getGitHead, isGitRepo, minutesSince, scanFileTree, detectLayer, safeJsonParse } from "../utils.js";
9
- import { TOOL_PREFIX, SNAPSHOT_TTL_MINUTES, COMPACTION_THRESHOLD_SESSIONS, DB_DIR_NAME, MAX_FILE_TREE_DEPTH } from "../constants.js";
10
- import { log } from "../logger.js";
11
- export function registerSessionTools(server) {
12
- // ─── START SESSION ──────────────────────────────────────────────────
13
- server.registerTool(`${TOOL_PREFIX}_start_session`, {
14
- title: "Start Session",
15
- description: `Begin a new working session. Returns full context: previous session summary, all changes since last session (both agent-recorded and git-detected), active architectural decisions, enforced conventions, and open tasks. Call this FIRST when starting work on a project.
16
-
17
- Args:
18
- - agent_name (string, optional): Identifier for the agent (e.g., "copilot", "claude-code", "cursor")
19
- - resume_task (string, optional): If resuming a specific task, provide its title to auto-focus context
20
-
21
- Returns:
22
- SessionContext object with previous session info, changes, decisions, conventions, and open tasks.`,
23
- inputSchema: {
24
- agent_name: z.string().default("unknown").describe("Name of the agent starting the session"),
25
- resume_task: z.string().optional().describe("Title of a task to resume, for focused context"),
26
- },
27
- annotations: {
28
- readOnlyHint: false,
29
- destructiveHint: false,
30
- idempotentHint: false,
31
- openWorldHint: false,
32
- },
33
- }, async ({ agent_name, resume_task }) => {
34
- const db = getDb();
35
- const projectRoot = getProjectRoot();
36
- const timestamp = now();
37
- // Check for an already-open session and close it
38
- const openSession = getCurrentSessionId();
39
- if (openSession) {
40
- db.prepare("UPDATE sessions SET ended_at = ?, summary = ? WHERE id = ?")
41
- .run(timestamp, "(auto-closed: new session started)", openSession);
42
- }
43
- // Get previous session context
44
- const lastSession = getLastCompletedSession();
45
- // Create new session
46
- const result = db.prepare("INSERT INTO sessions (started_at, agent_name, project_root) VALUES (?, ?, ?)").run(timestamp, agent_name, projectRoot);
47
- const sessionId = result.lastInsertRowid;
48
- // ─── Auto-compaction ────────────────────────────────────
49
- let autoCompacted = false;
50
- try {
51
- // Check config for threshold (fallback to constant)
52
- let threshold = COMPACTION_THRESHOLD_SESSIONS;
53
- try {
54
- const configRow = db.prepare("SELECT value FROM config WHERE key = 'compact_threshold'").get();
55
- if (configRow)
56
- threshold = parseInt(configRow.value, 10);
57
- }
58
- catch { /* config table may not exist yet */ }
59
- const totalSessions = db.prepare("SELECT COUNT(*) as c FROM sessions WHERE ended_at IS NOT NULL").get().c;
60
- if (totalSessions > threshold) {
61
- // Check if auto_compact is enabled
62
- let autoCompactEnabled = true;
63
- try {
64
- const autoRow = db.prepare("SELECT value FROM config WHERE key = 'auto_compact'").get();
65
- if (autoRow)
66
- autoCompactEnabled = autoRow.value === 'true';
67
- }
68
- catch { /* default to enabled */ }
69
- if (autoCompactEnabled) {
70
- log.info(`Auto-compacting: ${totalSessions} sessions exceed threshold of ${threshold}`);
71
- try {
72
- backupDatabase();
73
- }
74
- catch { /* best effort */ }
75
- // Compact: keep recent sessions, summarize old changes
76
- const cutoff = db.prepare("SELECT id FROM sessions ORDER BY id DESC LIMIT 1 OFFSET ?").get(threshold);
77
- if (cutoff) {
78
- const doCompact = db.transaction(() => {
79
- const oldSessions = db.prepare("SELECT id FROM sessions WHERE id <= ? AND ended_at IS NOT NULL").all(cutoff.id);
80
- for (const s of oldSessions) {
81
- const changes = db.prepare("SELECT change_type, file_path, description FROM changes WHERE session_id = ? AND file_path != '(compacted)'").all(s.id);
82
- if (changes.length > 0) {
83
- const summary = changes.map(c => `[${c.change_type}] ${c.file_path}`).join("; ");
84
- db.prepare("INSERT INTO changes (session_id, timestamp, file_path, change_type, description, impact_scope) VALUES (?, ?, ?, ?, ?, ?)").run(s.id, now(), "(compacted)", "modified", `Compacted ${changes.length} changes: ${summary.slice(0, 2000)}`, "global");
85
- }
86
- db.prepare("DELETE FROM changes WHERE session_id = ? AND file_path != '(compacted)'").run(s.id);
87
- }
88
- });
89
- doCompact();
90
- autoCompacted = true;
91
- log.info("Auto-compaction complete.");
92
- }
93
- }
94
- }
95
- }
96
- catch (e) {
97
- log.warn(`Auto-compaction skipped: ${e}`);
98
- }
99
- // Gather changes since last session
100
- let recordedChanges = [];
101
- let gitLog = "";
102
- if (lastSession?.ended_at) {
103
- recordedChanges = db.prepare("SELECT * FROM changes WHERE timestamp > ? ORDER BY timestamp").all(lastSession.ended_at);
104
- if (isGitRepo(projectRoot)) {
105
- gitLog = getGitLogSince(projectRoot, lastSession.ended_at);
106
- }
107
- }
108
- // Active decisions
109
- const activeDecisions = db.prepare("SELECT * FROM decisions WHERE status = 'active' ORDER BY timestamp DESC LIMIT 20").all();
110
- // Active conventions
111
- const activeConventions = db.prepare("SELECT * FROM conventions WHERE enforced = 1 ORDER BY category, id").all();
112
- // Open tasks
113
- let openTasks;
114
- if (resume_task) {
115
- openTasks = db.prepare("SELECT * FROM tasks WHERE status NOT IN ('done', 'cancelled') AND title LIKE ? ORDER BY priority, created_at").all(`%${resume_task}%`);
116
- // If specific task not found, return all open tasks
117
- if (openTasks.length === 0) {
118
- openTasks = db.prepare("SELECT * FROM tasks WHERE status NOT IN ('done', 'cancelled') ORDER BY priority, created_at").all();
119
- }
120
- }
121
- else {
122
- openTasks = db.prepare("SELECT * FROM tasks WHERE status NOT IN ('done', 'cancelled') ORDER BY priority, created_at LIMIT 15").all();
123
- }
124
- // ─── Auto Project Scan ───────────────────────────────────
125
- let projectSnapshot = null;
126
- try {
127
- const cached = db.prepare("SELECT * FROM snapshot_cache WHERE key = 'project_structure'").get();
128
- const snapshotAge = cached ? minutesSince(cached.updated_at) : null;
129
- if (cached && snapshotAge !== null && snapshotAge < SNAPSHOT_TTL_MINUTES) {
130
- // Serve from cache
131
- projectSnapshot = safeJsonParse(cached.value, null);
132
- }
133
- else {
134
- // Stale or missing — perform a fresh scan
135
- const fileTree = scanFileTree(projectRoot, MAX_FILE_TREE_DEPTH);
136
- const layerDist = {};
137
- for (const f of fileTree) {
138
- if (f.endsWith("/"))
139
- continue;
140
- const layer = detectLayer(f);
141
- layerDist[layer] = (layerDist[layer] || 0) + 1;
142
- }
143
- const fileNotes = db.prepare("SELECT * FROM file_notes ORDER BY file_path").all();
144
- const decisions = db.prepare("SELECT * FROM decisions WHERE status = 'active' ORDER BY timestamp DESC LIMIT 20").all();
145
- const conventions = db.prepare("SELECT * FROM conventions WHERE enforced = 1 ORDER BY category").all();
146
- projectSnapshot = {
147
- project_root: projectRoot,
148
- file_tree: fileTree,
149
- total_files: fileTree.filter((f) => !f.endsWith("/")).length,
150
- file_notes: fileNotes,
151
- recent_decisions: decisions,
152
- active_conventions: conventions,
153
- layer_distribution: layerDist,
154
- generated_at: now(),
155
- };
156
- // Persist to cache
157
- db.prepare("INSERT OR REPLACE INTO snapshot_cache (key, value, updated_at, ttl_minutes) VALUES ('project_structure', ?, ?, ?)").run(JSON.stringify(projectSnapshot), now(), SNAPSHOT_TTL_MINUTES);
158
- }
159
- }
160
- catch { /* scan is best-effort — never block session start */ }
161
- // ─── Ingest git-changes.log (from post-commit hook) ─────
162
- let gitHookLog = "";
163
- try {
164
- const hookLogPath = path.join(projectRoot, DB_DIR_NAME, "git-changes.log");
165
- if (fs.existsSync(hookLogPath)) {
166
- const raw = fs.readFileSync(hookLogPath, "utf-8");
167
- // Only include entries since last session
168
- if (lastSession?.ended_at) {
169
- const lines = raw.split("\n");
170
- const cutoffDate = new Date(lastSession.ended_at);
171
- const relevantBlocks = [];
172
- let inBlock = false;
173
- let blockLines = [];
174
- let blockDate = null;
175
- for (const line of lines) {
176
- if (line.startsWith("--- COMMIT")) {
177
- if (inBlock && blockDate && blockDate > cutoffDate) {
178
- relevantBlocks.push(blockLines.join("\n"));
179
- }
180
- inBlock = true;
181
- blockLines = [line];
182
- blockDate = null;
183
- }
184
- else if (inBlock && line.startsWith("date:")) {
185
- blockLines.push(line);
186
- try {
187
- blockDate = new Date(line.replace("date:", "").trim());
188
- }
189
- catch { /* skip */ }
190
- }
191
- else if (inBlock) {
192
- blockLines.push(line);
193
- }
194
- }
195
- // Flush last block
196
- if (inBlock && blockDate && blockDate > cutoffDate) {
197
- relevantBlocks.push(blockLines.join("\n"));
198
- }
199
- gitHookLog = relevantBlocks.join("\n\n");
200
- }
201
- else {
202
- // First session — include last 20 lines as a hint
203
- gitHookLog = raw.split("\n").slice(-20).join("\n");
204
- }
205
- }
206
- }
207
- catch { /* git-changes.log is optional */ }
208
- // Snapshot age (for message)
209
- const snapshotAge = projectSnapshot ? 0 : null;
210
- // Git context
211
- const gitBranch = isGitRepo(projectRoot) ? getGitBranch(projectRoot) : null;
212
- const gitHead = isGitRepo(projectRoot) ? getGitHead(projectRoot) : null;
213
- // ─── Check Scheduled Event Triggers ──────────────────────────
214
- let triggeredEvents = [];
215
- try {
216
- const timestamp = now();
217
- // Auto-trigger 'next_session' events
218
- db.prepare(`UPDATE scheduled_events SET status = 'triggered', triggered_at = ?
219
- WHERE status = 'pending' AND trigger_type = 'next_session'`).run(timestamp);
220
- // Auto-trigger 'datetime' events that have passed
221
- db.prepare(`UPDATE scheduled_events SET status = 'triggered', triggered_at = ?
222
- WHERE status = 'pending' AND trigger_type = 'datetime' AND trigger_value <= ?`).run(timestamp, timestamp);
223
- // Auto-trigger 'every_session' recurring events
224
- db.prepare(`UPDATE scheduled_events SET status = 'triggered', triggered_at = ?
225
- WHERE status = 'pending' AND recurrence = 'every_session'`).run(timestamp);
226
- // Fetch all triggered events
227
- triggeredEvents = db.prepare(`SELECT * FROM scheduled_events WHERE status = 'triggered'
228
- ORDER BY CASE priority WHEN 'critical' THEN 0 WHEN 'high' THEN 1 WHEN 'medium' THEN 2 WHEN 'low' THEN 3 END`).all();
229
- }
230
- catch { /* scheduled_events table may not exist yet */ }
231
- // Build response
232
- const context = {
233
- session_id: sessionId,
234
- previous_session: lastSession
235
- ? {
236
- id: lastSession.id,
237
- summary: lastSession.summary,
238
- ended_at: lastSession.ended_at,
239
- agent: lastSession.agent_name,
240
- }
241
- : null,
242
- changes_since_last: {
243
- recorded: recordedChanges,
244
- git_log: gitLog,
245
- },
246
- active_decisions: activeDecisions,
247
- active_conventions: activeConventions,
248
- open_tasks: openTasks,
249
- project_snapshot_age_minutes: snapshotAge,
250
- git: { branch: gitBranch, head: gitHead },
251
- project_snapshot: projectSnapshot,
252
- git_hook_log: gitHookLog || undefined,
253
- triggered_events: triggeredEvents.length > 0 ? triggeredEvents : undefined,
254
- message: lastSession
255
- ? `Session #${sessionId} started. Resuming from session #${lastSession.id} (${lastSession.agent_name}, ended ${lastSession.ended_at}). ${recordedChanges.length} recorded changes since then.${autoCompacted ? " [Auto-compacted old sessions.]" : ""}${projectSnapshot ? ` Project snapshot included (${projectSnapshot.total_files} files).` : ""}${triggeredEvents.length > 0 ? ` ⚡ ${triggeredEvents.length} scheduled event(s) triggered — review and acknowledge.` : ""}`
256
- : `Session #${sessionId} started. This is the first session — no prior memory.${projectSnapshot ? ` Project snapshot included (${projectSnapshot.total_files} files).` : ""}`,
257
- };
258
- return {
259
- content: [{ type: "text", text: JSON.stringify(context, null, 2) }],
260
- };
261
- });
262
- // ─── END SESSION ────────────────────────────────────────────────────
263
- server.registerTool(`${TOOL_PREFIX}_end_session`, {
264
- title: "End Session",
265
- description: `End the current working session with a summary of accomplishments. The summary is critical — it becomes the starting context for the next session. Be specific about what was done, what's pending, and any blockers.
266
-
267
- Args:
268
- - summary (string): Detailed summary of what was accomplished this session
269
- - tags (array of strings, optional): Tags for categorizing the session (e.g., "refactoring", "feature/auth", "bugfix")
270
-
271
- Returns:
272
- Confirmation with session stats.`,
273
- inputSchema: {
274
- summary: z.string().min(10).describe("Detailed summary of session accomplishments, pending work, and blockers"),
275
- tags: z.array(z.string()).optional().describe("Tags for session categorization"),
276
- },
277
- annotations: {
278
- readOnlyHint: false,
279
- destructiveHint: false,
280
- idempotentHint: true,
281
- openWorldHint: false,
282
- },
283
- }, async ({ summary, tags }) => {
284
- const db = getDb();
285
- const timestamp = now();
286
- const sessionId = getCurrentSessionId();
287
- if (!sessionId) {
288
- return {
289
- isError: true,
290
- content: [{ type: "text", text: "No active session to end. Start one with engram_start_session first." }],
291
- };
292
- }
293
- // Get session stats before closing
294
- const changeCount = db.prepare("SELECT COUNT(*) as c FROM changes WHERE session_id = ?").get(sessionId).c;
295
- const decisionCount = db.prepare("SELECT COUNT(*) as c FROM decisions WHERE session_id = ?").get(sessionId).c;
296
- const tasksDone = db.prepare("SELECT COUNT(*) as c FROM tasks WHERE session_id = ? AND status = 'done'").get(sessionId).c;
297
- // Close the session
298
- db.prepare("UPDATE sessions SET ended_at = ?, summary = ?, tags = ? WHERE id = ?")
299
- .run(timestamp, summary, tags ? JSON.stringify(tags) : null, sessionId);
300
- return {
301
- content: [{
302
- type: "text",
303
- text: JSON.stringify({
304
- message: `Session #${sessionId} ended successfully.`,
305
- stats: {
306
- changes_recorded: changeCount,
307
- decisions_made: decisionCount,
308
- tasks_completed: tasksDone,
309
- },
310
- summary,
311
- }, null, 2),
312
- }],
313
- };
314
- });
315
- // ─── GET SESSION HISTORY ────────────────────────────────────────────
316
- server.registerTool(`${TOOL_PREFIX}_get_session_history`, {
317
- title: "Get Session History",
318
- description: `Retrieve past session summaries to understand project evolution over time.
319
-
320
- Args:
321
- - limit (number, optional): Max sessions to return (default 10)
322
- - agent_name (string, optional): Filter by specific agent
323
- - offset (number, optional): Skip N sessions for pagination
324
-
325
- Returns:
326
- Array of past sessions with summaries, timestamps, and tags.`,
327
- inputSchema: {
328
- limit: z.number().int().min(1).max(50).default(10).describe("Max sessions to return"),
329
- agent_name: z.string().optional().describe("Filter by agent name"),
330
- offset: z.number().int().min(0).default(0).describe("Pagination offset"),
331
- },
332
- annotations: {
333
- readOnlyHint: true,
334
- destructiveHint: false,
335
- idempotentHint: true,
336
- openWorldHint: false,
337
- },
338
- }, async ({ limit, agent_name, offset }) => {
339
- const db = getDb();
340
- let sessions;
341
- if (agent_name) {
342
- sessions = db.prepare("SELECT * FROM sessions WHERE agent_name = ? ORDER BY id DESC LIMIT ? OFFSET ?").all(agent_name, limit, offset);
343
- }
344
- else {
345
- sessions = db.prepare("SELECT * FROM sessions ORDER BY id DESC LIMIT ? OFFSET ?").all(limit, offset);
346
- }
347
- const total = db.prepare("SELECT COUNT(*) as c FROM sessions").get().c;
348
- return {
349
- content: [{
350
- type: "text",
351
- text: JSON.stringify({ sessions, total, has_more: offset + limit < total }, null, 2),
352
- }],
353
- };
354
- });
355
- }
356
- //# sourceMappingURL=sessions.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../../src/tools/sessions.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,+CAA+C;AAC/C,+EAA+E;AAG/E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,cAAc,EAAe,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACvI,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC1I,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,6BAA6B,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACrI,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAGnC,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,uEAAuE;IACvE,MAAM,CAAC,YAAY,CACjB,GAAG,WAAW,gBAAgB,EAC9B;QACE,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE;;;;;;;qGAOkF;QAC/F,WAAW,EAAE;YACX,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,wCAAwC,CAAC;YAC5F,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;SAC9F;QACD,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,KAAK;YACrB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE,EAAE;QACpC,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QACnB,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;QACrC,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC;QAExB,iDAAiD;QACjD,MAAM,WAAW,GAAG,mBAAmB,EAAE,CAAC;QAC1C,IAAI,WAAW,EAAE,CAAC;YAChB,EAAE,CAAC,OAAO,CAAC,4DAA4D,CAAC;iBACrE,GAAG,CAAC,SAAS,EAAE,oCAAoC,EAAE,WAAW,CAAC,CAAC;QACvE,CAAC;QAED,+BAA+B;QAC/B,MAAM,WAAW,GAAG,uBAAuB,EAAE,CAAC;QAE9C,qBAAqB;QACrB,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CACvB,8EAA8E,CAC/E,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QAC1C,MAAM,SAAS,GAAG,MAAM,CAAC,eAAyB,CAAC;QAEnD,2DAA2D;QAC3D,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC;YACH,oDAAoD;YACpD,IAAI,SAAS,GAAG,6BAA6B,CAAC;YAC9C,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC,0DAA0D,CAAC,CAAC,GAAG,EAAmC,CAAC;gBAChI,IAAI,SAAS;oBAAE,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC3D,CAAC;YAAC,MAAM,CAAC,CAAC,oCAAoC,CAAC,CAAC;YAEhD,MAAM,aAAa,GAAI,EAAE,CAAC,OAAO,CAAC,+DAA+D,CAAC,CAAC,GAAG,EAAoB,CAAC,CAAC,CAAC;YAC7H,IAAI,aAAa,GAAG,SAAS,EAAE,CAAC;gBAC9B,mCAAmC;gBACnC,IAAI,kBAAkB,GAAG,IAAI,CAAC;gBAC9B,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,qDAAqD,CAAC,CAAC,GAAG,EAAmC,CAAC;oBACzH,IAAI,OAAO;wBAAE,kBAAkB,GAAG,OAAO,CAAC,KAAK,KAAK,MAAM,CAAC;gBAC7D,CAAC;gBAAC,MAAM,CAAC,CAAC,wBAAwB,CAAC,CAAC;gBAEpC,IAAI,kBAAkB,EAAE,CAAC;oBACvB,GAAG,CAAC,IAAI,CAAC,oBAAoB,aAAa,iCAAiC,SAAS,EAAE,CAAC,CAAC;oBACxF,IAAI,CAAC;wBAAC,cAAc,EAAE,CAAC;oBAAC,CAAC;oBAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;oBAErD,uDAAuD;oBACvD,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CACvB,2DAA2D,CAC5D,CAAC,GAAG,CAAC,SAAS,CAA+B,CAAC;oBAE/C,IAAI,MAAM,EAAE,CAAC;wBACX,MAAM,SAAS,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;4BACpC,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAC5B,gEAAgE,CACjE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAA0B,CAAC;4BAE1C,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;gCAC5B,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CACxB,6GAA6G,CAC9G,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAA2E,CAAC;gCAEtF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oCACvB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oCACjF,EAAE,CAAC,OAAO,CACR,0HAA0H,CAC3H,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,OAAO,CAAC,MAAM,aAAa,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;gCAC5H,CAAC;gCACD,EAAE,CAAC,OAAO,CAAC,yEAAyE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;4BAClG,CAAC;wBACH,CAAC,CAAC,CAAC;wBACH,SAAS,EAAE,CAAC;wBACZ,aAAa,GAAG,IAAI,CAAC;wBACrB,GAAG,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;oBACxC,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,GAAG,CAAC,IAAI,CAAC,4BAA4B,CAAC,EAAE,CAAC,CAAC;QAC5C,CAAC;QAED,oCAAoC;QACpC,IAAI,eAAe,GAAgB,EAAE,CAAC;QACtC,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,IAAI,WAAW,EAAE,QAAQ,EAAE,CAAC;YAC1B,eAAe,GAAG,EAAE,CAAC,OAAO,CAC1B,8DAA8D,CAC/D,CAAC,GAAG,CAAC,WAAW,CAAC,QAAQ,CAA6B,CAAC;YAExD,IAAI,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC3B,MAAM,GAAG,cAAc,CAAC,WAAW,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QAED,mBAAmB;QACnB,MAAM,eAAe,GAAG,EAAE,CAAC,OAAO,CAChC,kFAAkF,CACnF,CAAC,GAAG,EAAgC,CAAC;QAEtC,qBAAqB;QACrB,MAAM,iBAAiB,GAAG,EAAE,CAAC,OAAO,CAClC,oEAAoE,CACrE,CAAC,GAAG,EAAkC,CAAC;QAExC,aAAa;QACb,IAAI,SAAoB,CAAC;QACzB,IAAI,WAAW,EAAE,CAAC;YAChB,SAAS,GAAG,EAAE,CAAC,OAAO,CACpB,8GAA8G,CAC/G,CAAC,GAAG,CAAC,IAAI,WAAW,GAAG,CAA2B,CAAC;YACpD,oDAAoD;YACpD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,SAAS,GAAG,EAAE,CAAC,OAAO,CACpB,6FAA6F,CAC9F,CAAC,GAAG,EAA4B,CAAC;YACpC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,SAAS,GAAG,EAAE,CAAC,OAAO,CACpB,sGAAsG,CACvG,CAAC,GAAG,EAA4B,CAAC;QACpC,CAAC;QAED,4DAA4D;QAC5D,IAAI,eAAe,GAA2B,IAAI,CAAC;QACnD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,8DAA8D,CAAC,CAAC,GAAG,EAAuD,CAAC;YACrJ,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAEpE,IAAI,MAAM,IAAI,WAAW,KAAK,IAAI,IAAI,WAAW,GAAG,oBAAoB,EAAE,CAAC;gBACzE,mBAAmB;gBACnB,eAAe,GAAG,aAAa,CAAkB,MAAM,CAAC,KAAK,EAAE,IAAkC,CAAC,CAAC;YACrG,CAAC;iBAAM,CAAC;gBACN,0CAA0C;gBAC1C,MAAM,QAAQ,GAAG,YAAY,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;gBAChE,MAAM,SAAS,GAA2B,EAAE,CAAC;gBAC7C,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;oBACzB,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;wBAAE,SAAS;oBAC9B,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;oBAC7B,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;gBACjD,CAAC;gBACD,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC,GAAG,EAAE,CAAC;gBAClF,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC,kFAAkF,CAAC,CAAC,GAAG,EAAE,CAAC;gBACvH,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAAC,gEAAgE,CAAC,CAAC,GAAG,EAAE,CAAC;gBAEvG,eAAe,GAAG;oBAChB,YAAY,EAAE,WAAW;oBACzB,SAAS,EAAE,QAAQ;oBACnB,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM;oBACpE,UAAU,EAAE,SAAS;oBACrB,gBAAgB,EAAE,SAAS;oBAC3B,kBAAkB,EAAE,WAAW;oBAC/B,kBAAkB,EAAE,SAAS;oBAC7B,YAAY,EAAE,GAAG,EAAE;iBACU,CAAC;gBAEhC,mBAAmB;gBACnB,EAAE,CAAC,OAAO,CACR,mHAAmH,CACpH,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE,GAAG,EAAE,EAAE,oBAAoB,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,qDAAqD,CAAC,CAAC;QAEjE,2DAA2D;QAC3D,IAAI,UAAU,GAAG,EAAE,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC;YAC3E,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC/B,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;gBAClD,0CAA0C;gBAC1C,IAAI,WAAW,EAAE,QAAQ,EAAE,CAAC;oBAC1B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAC9B,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;oBAClD,MAAM,cAAc,GAAa,EAAE,CAAC;oBACpC,IAAI,OAAO,GAAG,KAAK,CAAC;oBACpB,IAAI,UAAU,GAAa,EAAE,CAAC;oBAC9B,IAAI,SAAS,GAAgB,IAAI,CAAC;oBAElC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;wBACzB,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;4BAClC,IAAI,OAAO,IAAI,SAAS,IAAI,SAAS,GAAG,UAAU,EAAE,CAAC;gCACnD,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;4BAC7C,CAAC;4BACD,OAAO,GAAG,IAAI,CAAC;4BACf,UAAU,GAAG,CAAC,IAAI,CAAC,CAAC;4BACpB,SAAS,GAAG,IAAI,CAAC;wBACnB,CAAC;6BAAM,IAAI,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;4BAC/C,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;4BACtB,IAAI,CAAC;gCAAC,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;4BAAC,CAAC;4BAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;wBACtF,CAAC;6BAAM,IAAI,OAAO,EAAE,CAAC;4BACnB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBACxB,CAAC;oBACH,CAAC;oBACD,mBAAmB;oBACnB,IAAI,OAAO,IAAI,SAAS,IAAI,SAAS,GAAG,UAAU,EAAE,CAAC;wBACnD,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;oBAC7C,CAAC;oBACD,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC3C,CAAC;qBAAM,CAAC;oBACN,kDAAkD;oBAClD,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACrD,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,iCAAiC,CAAC,CAAC;QAE7C,6BAA6B;QAC7B,MAAM,WAAW,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAE/C,cAAc;QACd,MAAM,SAAS,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5E,MAAM,OAAO,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAExE,gEAAgE;QAChE,IAAI,eAAe,GAAwB,EAAE,CAAC;QAC9C,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC;YAExB,qCAAqC;YACrC,EAAE,CAAC,OAAO,CACR;sEAC4D,CAC7D,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAEjB,kDAAkD;YAClD,EAAE,CAAC,OAAO,CACR;yFAC+E,CAChF,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YAE5B,gDAAgD;YAChD,EAAE,CAAC,OAAO,CACR;qEAC2D,CAC5D,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAEjB,6BAA6B;YAC7B,eAAe,GAAG,EAAE,CAAC,OAAO,CAC1B;uHAC6G,CAC9G,CAAC,GAAG,EAAsC,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC,CAAC,8CAA8C,CAAC,CAAC;QAE1D,iBAAiB;QACjB,MAAM,OAAO,GAKT;YACF,UAAU,EAAE,SAAS;YACrB,gBAAgB,EAAE,WAAW;gBAC3B,CAAC,CAAC;oBACA,EAAE,EAAE,WAAW,CAAC,EAAE;oBAClB,OAAO,EAAE,WAAW,CAAC,OAAO;oBAC5B,QAAQ,EAAE,WAAW,CAAC,QAAQ;oBAC9B,KAAK,EAAE,WAAW,CAAC,UAAU;iBAC9B;gBACD,CAAC,CAAC,IAAI;YACR,kBAAkB,EAAE;gBAClB,QAAQ,EAAE,eAAe;gBACzB,OAAO,EAAE,MAAM;aAChB;YACD,gBAAgB,EAAE,eAAe;YACjC,kBAAkB,EAAE,iBAAiB;YACrC,UAAU,EAAE,SAAS;YACrB,4BAA4B,EAAE,WAAW;YACzC,GAAG,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE;YACzC,gBAAgB,EAAE,eAAe;YACjC,YAAY,EAAE,UAAU,IAAI,SAAS;YACrC,gBAAgB,EAAE,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS;YAC1E,OAAO,EAAE,WAAW;gBAClB,CAAC,CAAC,YAAY,SAAS,oCAAoC,WAAW,CAAC,EAAE,KAAK,WAAW,CAAC,UAAU,WAAW,WAAW,CAAC,QAAQ,MAAM,eAAe,CAAC,MAAM,gCAAgC,aAAa,CAAC,CAAC,CAAC,iCAAiC,CAAC,CAAC,CAAC,EAAE,GAAG,eAAe,CAAC,CAAC,CAAC,+BAA+B,eAAe,CAAC,WAAW,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,eAAe,CAAC,MAAM,yDAAyD,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC/c,CAAC,CAAC,YAAY,SAAS,yDAAyD,eAAe,CAAC,CAAC,CAAC,+BAA+B,eAAe,CAAC,WAAW,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE;SAChL,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACpE,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,uEAAuE;IACvE,MAAM,CAAC,YAAY,CACjB,GAAG,WAAW,cAAc,EAC5B;QACE,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE;;;;;;;mCAOgB;QAC7B,WAAW,EAAE;YACX,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,yEAAyE,CAAC;YAC/G,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;SACjF;QACD,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE;QAC1B,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QACnB,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC;QACxB,MAAM,SAAS,GAAG,mBAAmB,EAAE,CAAC;QAExC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,sEAAsE,EAAE,CAAC;aAC1G,CAAC;QACJ,CAAC;QAED,mCAAmC;QACnC,MAAM,WAAW,GAAI,EAAE,CAAC,OAAO,CAAC,wDAAwD,CAAC,CAAC,GAAG,CAAC,SAAS,CAAmB,CAAC,CAAC,CAAC;QAC7H,MAAM,aAAa,GAAI,EAAE,CAAC,OAAO,CAAC,0DAA0D,CAAC,CAAC,GAAG,CAAC,SAAS,CAAmB,CAAC,CAAC,CAAC;QACjI,MAAM,SAAS,GAAI,EAAE,CAAC,OAAO,CAAC,0EAA0E,CAAC,CAAC,GAAG,CAAC,SAAS,CAAmB,CAAC,CAAC,CAAC;QAE7I,oBAAoB;QACpB,EAAE,CAAC,OAAO,CAAC,sEAAsE,CAAC;aAC/E,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAE1E,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,OAAO,EAAE,YAAY,SAAS,sBAAsB;wBACpD,KAAK,EAAE;4BACL,gBAAgB,EAAE,WAAW;4BAC7B,cAAc,EAAE,aAAa;4BAC7B,eAAe,EAAE,SAAS;yBAC3B;wBACD,OAAO;qBACR,EAAE,IAAI,EAAE,CAAC,CAAC;iBACZ,CAAC;SACH,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,uEAAuE;IACvE,MAAM,CAAC,YAAY,CACjB,GAAG,WAAW,sBAAsB,EACpC;QACE,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EAAE;;;;;;;;+DAQ4C;QACzD,WAAW,EAAE;YACX,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC;YACrF,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;YAClE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC;SACzE;QACD,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE;QACtC,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QAEnB,IAAI,QAAQ,CAAC;QACb,IAAI,UAAU,EAAE,CAAC;YACf,QAAQ,GAAG,EAAE,CAAC,OAAO,CACnB,+EAA+E,CAChF,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG,EAAE,CAAC,OAAO,CACnB,0DAA0D,CAC3D,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACvB,CAAC;QAED,MAAM,KAAK,GAAI,EAAE,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC,GAAG,EAAoB,CAAC,CAAC,CAAC;QAE1F,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,GAAG,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;iBACrF,CAAC;SACH,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1,3 +0,0 @@
1
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function registerStatsTools(server: McpServer): void;
3
- //# sourceMappingURL=stats.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../../src/tools/stats.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoE1D"}
@@ -1,63 +0,0 @@
1
- // ============================================================================
2
- // Engram MCP Server — Stats Tool
3
- // ============================================================================
4
- import { getDb, getDbSizeKb } from "../database.js";
5
- import { TOOL_PREFIX } from "../constants.js";
6
- export function registerStatsTools(server) {
7
- server.registerTool(`${TOOL_PREFIX}_stats`, {
8
- title: "Memory Statistics",
9
- description: `Get a comprehensive overview of everything stored in Engram's memory: session count, changes, decisions, file notes, conventions, tasks, milestones, most-changed files, and database size.
10
-
11
- Returns:
12
- MemoryStats object with counts and insights.`,
13
- inputSchema: {},
14
- annotations: {
15
- readOnlyHint: true,
16
- destructiveHint: false,
17
- idempotentHint: true,
18
- openWorldHint: false,
19
- },
20
- }, async () => {
21
- const db = getDb();
22
- const count = (table) => db.prepare(`SELECT COUNT(*) as c FROM ${table}`).get().c;
23
- const oldest = db.prepare("SELECT started_at FROM sessions ORDER BY id ASC LIMIT 1").get();
24
- const newest = db.prepare("SELECT started_at FROM sessions ORDER BY id DESC LIMIT 1").get();
25
- const mostChanged = db.prepare(`
26
- SELECT file_path, COUNT(*) as change_count
27
- FROM changes GROUP BY file_path ORDER BY change_count DESC LIMIT 10
28
- `).all();
29
- const layerDist = db.prepare(`
30
- SELECT layer, COUNT(*) as count FROM file_notes WHERE layer IS NOT NULL GROUP BY layer ORDER BY count DESC
31
- `).all();
32
- const tasksByStatus = db.prepare(`
33
- SELECT status, COUNT(*) as count FROM tasks GROUP BY status ORDER BY count DESC
34
- `).all();
35
- let schemaVersion = 0;
36
- try {
37
- const vRow = db.prepare("SELECT value FROM schema_meta WHERE key = 'version'").get();
38
- schemaVersion = vRow ? parseInt(vRow.value, 10) : 0;
39
- }
40
- catch { /* no schema_meta */ }
41
- const stats = {
42
- total_sessions: count("sessions"),
43
- total_changes: count("changes"),
44
- total_decisions: count("decisions"),
45
- total_file_notes: count("file_notes"),
46
- total_conventions: count("conventions"),
47
- total_tasks: count("tasks"),
48
- total_milestones: count("milestones"),
49
- oldest_session: oldest?.started_at || null,
50
- newest_session: newest?.started_at || null,
51
- most_changed_files: mostChanged,
52
- database_size_kb: getDbSizeKb(),
53
- layer_distribution: layerDist,
54
- tasks_by_status: tasksByStatus,
55
- schema_version: schemaVersion,
56
- engine: "better-sqlite3 (WAL mode)",
57
- };
58
- return {
59
- content: [{ type: "text", text: JSON.stringify(stats, null, 2) }],
60
- };
61
- });
62
- }
63
- //# sourceMappingURL=stats.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../../src/tools/stats.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,iCAAiC;AACjC,+EAA+E;AAG/E,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAChD,MAAM,CAAC,YAAY,CACf,GAAG,WAAW,QAAQ,EACtB;QACI,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EAAE;;;+CAGsB;QACnC,WAAW,EAAE,EAAE;QACf,WAAW,EAAE;YACT,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACvB;KACJ,EACD,KAAK,IAAI,EAAE;QACP,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QAEnB,MAAM,KAAK,GAAG,CAAC,KAAa,EAAU,EAAE,CACnC,EAAE,CAAC,OAAO,CAAC,6BAA6B,KAAK,EAAE,CAAC,CAAC,GAAG,EAAoB,CAAC,CAAC,CAAC;QAEhF,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,yDAAyD,CAAC,CAAC,GAAG,EAAwC,CAAC;QACjI,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,0DAA0D,CAAC,CAAC,GAAG,EAAwC,CAAC;QAElI,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAAC;;;OAGpC,CAAC,CAAC,GAAG,EAAwD,CAAC;QAEzD,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC;;OAElC,CAAC,CAAC,GAAG,EAA6C,CAAC;QAE9C,MAAM,aAAa,GAAG,EAAE,CAAC,OAAO,CAAC;;OAEtC,CAAC,CAAC,GAAG,EAA8C,CAAC;QAE/C,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,qDAAqD,CAAC,CAAC,GAAG,EAAmC,CAAC;YACtH,aAAa,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC;QAEhC,MAAM,KAAK,GAAG;YACV,cAAc,EAAE,KAAK,CAAC,UAAU,CAAC;YACjC,aAAa,EAAE,KAAK,CAAC,SAAS,CAAC;YAC/B,eAAe,EAAE,KAAK,CAAC,WAAW,CAAC;YACnC,gBAAgB,EAAE,KAAK,CAAC,YAAY,CAAC;YACrC,iBAAiB,EAAE,KAAK,CAAC,aAAa,CAAC;YACvC,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC;YAC3B,gBAAgB,EAAE,KAAK,CAAC,YAAY,CAAC;YACrC,cAAc,EAAE,MAAM,EAAE,UAAU,IAAI,IAAI;YAC1C,cAAc,EAAE,MAAM,EAAE,UAAU,IAAI,IAAI;YAC1C,kBAAkB,EAAE,WAAW;YAC/B,gBAAgB,EAAE,WAAW,EAAE;YAC/B,kBAAkB,EAAE,SAAS;YAC7B,eAAe,EAAE,aAAa;YAC9B,cAAc,EAAE,aAAa;YAC7B,MAAM,EAAE,2BAA2B;SACtC,CAAC;QAEF,OAAO;YACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACpE,CAAC;IACN,CAAC,CACJ,CAAC;AACN,CAAC"}
@@ -1,3 +0,0 @@
1
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function registerTaskTools(server: McpServer): void;
3
- //# sourceMappingURL=tasks.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../../src/tools/tasks.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA4MzD"}