engram-mcp-server 1.2.8 → 1.4.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.
Files changed (288) hide show
  1. package/README.md +131 -24
  2. package/dist/constants.d.ts +12 -1
  3. package/dist/constants.d.ts.map +1 -1
  4. package/dist/constants.js +19 -1
  5. package/dist/constants.js.map +1 -1
  6. package/dist/database.d.ts +9 -0
  7. package/dist/database.d.ts.map +1 -1
  8. package/dist/database.js +16 -0
  9. package/dist/database.js.map +1 -1
  10. package/dist/index.js +16 -1
  11. package/dist/index.js.map +1 -1
  12. package/dist/installer/config-writer.d.ts +11 -2
  13. package/dist/installer/config-writer.d.ts.map +1 -1
  14. package/dist/installer/config-writer.js +28 -3
  15. package/dist/installer/config-writer.js.map +1 -1
  16. package/dist/installer/ide-detector.d.ts.map +1 -1
  17. package/dist/installer/ide-detector.js +10 -6
  18. package/dist/installer/ide-detector.js.map +1 -1
  19. package/dist/installer/index.d.ts.map +1 -1
  20. package/dist/installer/index.js +156 -23
  21. package/dist/installer/index.js.map +1 -1
  22. package/dist/repositories/changes.repo.d.ts.map +1 -1
  23. package/dist/repositories/changes.repo.js +5 -3
  24. package/dist/repositories/changes.repo.js.map +1 -1
  25. package/dist/repositories/config.repo.d.ts +5 -0
  26. package/dist/repositories/config.repo.d.ts.map +1 -1
  27. package/dist/repositories/config.repo.js +8 -0
  28. package/dist/repositories/config.repo.js.map +1 -1
  29. package/dist/repositories/decisions.repo.d.ts +8 -0
  30. package/dist/repositories/decisions.repo.d.ts.map +1 -1
  31. package/dist/repositories/decisions.repo.js +23 -0
  32. package/dist/repositories/decisions.repo.js.map +1 -1
  33. package/dist/repositories/file-notes.repo.d.ts +9 -0
  34. package/dist/repositories/file-notes.repo.d.ts.map +1 -1
  35. package/dist/repositories/file-notes.repo.js +22 -4
  36. package/dist/repositories/file-notes.repo.js.map +1 -1
  37. package/dist/response.d.ts +1 -0
  38. package/dist/response.d.ts.map +1 -1
  39. package/dist/response.js.map +1 -1
  40. package/dist/services/index.d.ts +2 -0
  41. package/dist/services/index.d.ts.map +1 -1
  42. package/dist/services/index.js +1 -0
  43. package/dist/services/index.js.map +1 -1
  44. package/dist/services/update.service.d.ts +29 -0
  45. package/dist/services/update.service.d.ts.map +1 -0
  46. package/dist/services/update.service.js +166 -0
  47. package/dist/services/update.service.js.map +1 -0
  48. package/dist/tools/backup.d.ts.map +1 -1
  49. package/dist/tools/backup.js +20 -45
  50. package/dist/tools/backup.js.map +1 -1
  51. package/dist/tools/changes.d.ts.map +1 -1
  52. package/dist/tools/changes.js +24 -33
  53. package/dist/tools/changes.js.map +1 -1
  54. package/dist/tools/compaction.d.ts.map +1 -1
  55. package/dist/tools/compaction.js +19 -72
  56. package/dist/tools/compaction.js.map +1 -1
  57. package/dist/tools/conventions.d.ts.map +1 -1
  58. package/dist/tools/conventions.js +9 -18
  59. package/dist/tools/conventions.js.map +1 -1
  60. package/dist/tools/decisions.d.ts.map +1 -1
  61. package/dist/tools/decisions.js +71 -45
  62. package/dist/tools/decisions.js.map +1 -1
  63. package/dist/tools/export-import.d.ts.map +1 -1
  64. package/dist/tools/export-import.js +21 -35
  65. package/dist/tools/export-import.js.map +1 -1
  66. package/dist/tools/file-notes.d.ts.map +1 -1
  67. package/dist/tools/file-notes.js +58 -36
  68. package/dist/tools/file-notes.js.map +1 -1
  69. package/dist/tools/intelligence.d.ts.map +1 -1
  70. package/dist/tools/intelligence.js +109 -164
  71. package/dist/tools/intelligence.js.map +1 -1
  72. package/dist/tools/milestones.d.ts.map +1 -1
  73. package/dist/tools/milestones.js +6 -10
  74. package/dist/tools/milestones.js.map +1 -1
  75. package/dist/tools/scheduler.d.ts.map +1 -1
  76. package/dist/tools/scheduler.js +42 -89
  77. package/dist/tools/scheduler.js.map +1 -1
  78. package/dist/tools/sessions.d.ts.map +1 -1
  79. package/dist/tools/sessions.js +131 -226
  80. package/dist/tools/sessions.js.map +1 -1
  81. package/dist/tools/stats.d.ts.map +1 -1
  82. package/dist/tools/stats.js +169 -8
  83. package/dist/tools/stats.js.map +1 -1
  84. package/dist/tools/tasks.d.ts.map +1 -1
  85. package/dist/tools/tasks.js +9 -20
  86. package/dist/tools/tasks.js.map +1 -1
  87. package/dist/utils.d.ts +9 -0
  88. package/dist/utils.d.ts.map +1 -1
  89. package/dist/utils.js +18 -0
  90. package/dist/utils.js.map +1 -1
  91. package/package.json +60 -52
  92. package/scripts/inject-release-notes.js +66 -0
  93. package/dist/installer.d.ts +0 -2
  94. package/dist/installer.d.ts.map +0 -1
  95. package/dist/installer.js +0 -315
  96. package/dist/installer.js.map +0 -1
  97. package/dist/src/constants.d.ts +0 -21
  98. package/dist/src/constants.d.ts.map +0 -1
  99. package/dist/src/constants.js +0 -81
  100. package/dist/src/constants.js.map +0 -1
  101. package/dist/src/database.d.ts +0 -32
  102. package/dist/src/database.d.ts.map +0 -1
  103. package/dist/src/database.js +0 -143
  104. package/dist/src/database.js.map +0 -1
  105. package/dist/src/errors.d.ts +0 -40
  106. package/dist/src/errors.d.ts.map +0 -1
  107. package/dist/src/errors.js +0 -63
  108. package/dist/src/errors.js.map +0 -1
  109. package/dist/src/index.d.ts +0 -3
  110. package/dist/src/index.d.ts.map +0 -1
  111. package/dist/src/index.js +0 -89
  112. package/dist/src/index.js.map +0 -1
  113. package/dist/src/installer/config-writer.d.ts +0 -25
  114. package/dist/src/installer/config-writer.d.ts.map +0 -1
  115. package/dist/src/installer/config-writer.js +0 -86
  116. package/dist/src/installer/config-writer.js.map +0 -1
  117. package/dist/src/installer/ide-configs.d.ts +0 -19
  118. package/dist/src/installer/ide-configs.d.ts.map +0 -1
  119. package/dist/src/installer/ide-configs.js +0 -131
  120. package/dist/src/installer/ide-configs.js.map +0 -1
  121. package/dist/src/installer/ide-detector.d.ts +0 -6
  122. package/dist/src/installer/ide-detector.d.ts.map +0 -1
  123. package/dist/src/installer/ide-detector.js +0 -45
  124. package/dist/src/installer/ide-detector.js.map +0 -1
  125. package/dist/src/installer/index.d.ts +0 -2
  126. package/dist/src/installer/index.d.ts.map +0 -1
  127. package/dist/src/installer/index.js +0 -229
  128. package/dist/src/installer/index.js.map +0 -1
  129. package/dist/src/logger.d.ts +0 -10
  130. package/dist/src/logger.d.ts.map +0 -1
  131. package/dist/src/logger.js +0 -51
  132. package/dist/src/logger.js.map +0 -1
  133. package/dist/src/migrations.d.ts +0 -4
  134. package/dist/src/migrations.d.ts.map +0 -1
  135. package/dist/src/migrations.js +0 -343
  136. package/dist/src/migrations.js.map +0 -1
  137. package/dist/src/repositories/changes.repo.d.ts +0 -35
  138. package/dist/src/repositories/changes.repo.d.ts.map +0 -1
  139. package/dist/src/repositories/changes.repo.js +0 -53
  140. package/dist/src/repositories/changes.repo.js.map +0 -1
  141. package/dist/src/repositories/config.repo.d.ts +0 -11
  142. package/dist/src/repositories/config.repo.d.ts.map +0 -1
  143. package/dist/src/repositories/config.repo.js +0 -38
  144. package/dist/src/repositories/config.repo.js.map +0 -1
  145. package/dist/src/repositories/conventions.repo.d.ts +0 -15
  146. package/dist/src/repositories/conventions.repo.d.ts.map +0 -1
  147. package/dist/src/repositories/conventions.repo.js +0 -39
  148. package/dist/src/repositories/conventions.repo.js.map +0 -1
  149. package/dist/src/repositories/decisions.repo.d.ts +0 -19
  150. package/dist/src/repositories/decisions.repo.d.ts.map +0 -1
  151. package/dist/src/repositories/decisions.repo.js +0 -48
  152. package/dist/src/repositories/decisions.repo.js.map +0 -1
  153. package/dist/src/repositories/events.repo.d.ts +0 -34
  154. package/dist/src/repositories/events.repo.d.ts.map +0 -1
  155. package/dist/src/repositories/events.repo.js +0 -71
  156. package/dist/src/repositories/events.repo.js.map +0 -1
  157. package/dist/src/repositories/file-notes.repo.d.ts +0 -26
  158. package/dist/src/repositories/file-notes.repo.d.ts.map +0 -1
  159. package/dist/src/repositories/file-notes.repo.js +0 -55
  160. package/dist/src/repositories/file-notes.repo.js.map +0 -1
  161. package/dist/src/repositories/index.d.ts +0 -38
  162. package/dist/src/repositories/index.d.ts.map +0 -1
  163. package/dist/src/repositories/index.js +0 -41
  164. package/dist/src/repositories/index.js.map +0 -1
  165. package/dist/src/repositories/milestones.repo.d.ts +0 -10
  166. package/dist/src/repositories/milestones.repo.d.ts.map +0 -1
  167. package/dist/src/repositories/milestones.repo.js +0 -20
  168. package/dist/src/repositories/milestones.repo.js.map +0 -1
  169. package/dist/src/repositories/sessions.repo.d.ts +0 -27
  170. package/dist/src/repositories/sessions.repo.d.ts.map +0 -1
  171. package/dist/src/repositories/sessions.repo.js +0 -61
  172. package/dist/src/repositories/sessions.repo.js.map +0 -1
  173. package/dist/src/repositories/snapshot.repo.d.ts +0 -11
  174. package/dist/src/repositories/snapshot.repo.d.ts.map +0 -1
  175. package/dist/src/repositories/snapshot.repo.js +0 -17
  176. package/dist/src/repositories/snapshot.repo.js.map +0 -1
  177. package/dist/src/repositories/tasks.repo.d.ts +0 -40
  178. package/dist/src/repositories/tasks.repo.d.ts.map +0 -1
  179. package/dist/src/repositories/tasks.repo.js +0 -90
  180. package/dist/src/repositories/tasks.repo.js.map +0 -1
  181. package/dist/src/response.d.ts +0 -28
  182. package/dist/src/response.d.ts.map +0 -1
  183. package/dist/src/response.js +0 -38
  184. package/dist/src/response.js.map +0 -1
  185. package/dist/src/scripts/install-hooks.d.ts +0 -3
  186. package/dist/src/scripts/install-hooks.d.ts.map +0 -1
  187. package/dist/src/scripts/install-hooks.js +0 -89
  188. package/dist/src/scripts/install-hooks.js.map +0 -1
  189. package/dist/src/services/compaction.service.d.ts +0 -27
  190. package/dist/src/services/compaction.service.d.ts.map +0 -1
  191. package/dist/src/services/compaction.service.js +0 -93
  192. package/dist/src/services/compaction.service.js.map +0 -1
  193. package/dist/src/services/event-trigger.service.d.ts +0 -24
  194. package/dist/src/services/event-trigger.service.d.ts.map +0 -1
  195. package/dist/src/services/event-trigger.service.js +0 -60
  196. package/dist/src/services/event-trigger.service.js.map +0 -1
  197. package/dist/src/services/git.service.d.ts +0 -20
  198. package/dist/src/services/git.service.d.ts.map +0 -1
  199. package/dist/src/services/git.service.js +0 -88
  200. package/dist/src/services/git.service.js.map +0 -1
  201. package/dist/src/services/index.d.ts +0 -5
  202. package/dist/src/services/index.d.ts.map +0 -1
  203. package/dist/src/services/index.js +0 -8
  204. package/dist/src/services/index.js.map +0 -1
  205. package/dist/src/services/project-scan.service.d.ts +0 -19
  206. package/dist/src/services/project-scan.service.d.ts.map +0 -1
  207. package/dist/src/services/project-scan.service.js +0 -66
  208. package/dist/src/services/project-scan.service.js.map +0 -1
  209. package/dist/src/tools/backup.d.ts +0 -3
  210. package/dist/src/tools/backup.d.ts.map +0 -1
  211. package/dist/src/tools/backup.js +0 -191
  212. package/dist/src/tools/backup.js.map +0 -1
  213. package/dist/src/tools/changes.d.ts +0 -3
  214. package/dist/src/tools/changes.d.ts.map +0 -1
  215. package/dist/src/tools/changes.js +0 -97
  216. package/dist/src/tools/changes.js.map +0 -1
  217. package/dist/src/tools/compaction.d.ts +0 -3
  218. package/dist/src/tools/compaction.d.ts.map +0 -1
  219. package/dist/src/tools/compaction.js +0 -151
  220. package/dist/src/tools/compaction.js.map +0 -1
  221. package/dist/src/tools/conventions.d.ts +0 -3
  222. package/dist/src/tools/conventions.d.ts.map +0 -1
  223. package/dist/src/tools/conventions.js +0 -121
  224. package/dist/src/tools/conventions.js.map +0 -1
  225. package/dist/src/tools/decisions.d.ts +0 -3
  226. package/dist/src/tools/decisions.d.ts.map +0 -1
  227. package/dist/src/tools/decisions.js +0 -136
  228. package/dist/src/tools/decisions.js.map +0 -1
  229. package/dist/src/tools/export-import.d.ts +0 -3
  230. package/dist/src/tools/export-import.d.ts.map +0 -1
  231. package/dist/src/tools/export-import.js +0 -180
  232. package/dist/src/tools/export-import.js.map +0 -1
  233. package/dist/src/tools/file-notes.d.ts +0 -3
  234. package/dist/src/tools/file-notes.d.ts.map +0 -1
  235. package/dist/src/tools/file-notes.js +0 -104
  236. package/dist/src/tools/file-notes.js.map +0 -1
  237. package/dist/src/tools/intelligence.d.ts +0 -3
  238. package/dist/src/tools/intelligence.d.ts.map +0 -1
  239. package/dist/src/tools/intelligence.js +0 -427
  240. package/dist/src/tools/intelligence.js.map +0 -1
  241. package/dist/src/tools/milestones.d.ts +0 -3
  242. package/dist/src/tools/milestones.d.ts.map +0 -1
  243. package/dist/src/tools/milestones.js +0 -71
  244. package/dist/src/tools/milestones.js.map +0 -1
  245. package/dist/src/tools/scheduler.d.ts +0 -3
  246. package/dist/src/tools/scheduler.d.ts.map +0 -1
  247. package/dist/src/tools/scheduler.js +0 -363
  248. package/dist/src/tools/scheduler.js.map +0 -1
  249. package/dist/src/tools/sessions.d.ts +0 -3
  250. package/dist/src/tools/sessions.d.ts.map +0 -1
  251. package/dist/src/tools/sessions.js +0 -356
  252. package/dist/src/tools/sessions.js.map +0 -1
  253. package/dist/src/tools/stats.d.ts +0 -3
  254. package/dist/src/tools/stats.d.ts.map +0 -1
  255. package/dist/src/tools/stats.js +0 -63
  256. package/dist/src/tools/stats.js.map +0 -1
  257. package/dist/src/tools/tasks.d.ts +0 -3
  258. package/dist/src/tools/tasks.d.ts.map +0 -1
  259. package/dist/src/tools/tasks.js +0 -206
  260. package/dist/src/tools/tasks.js.map +0 -1
  261. package/dist/src/types.d.ts +0 -170
  262. package/dist/src/types.d.ts.map +0 -1
  263. package/dist/src/types.js +0 -5
  264. package/dist/src/types.js.map +0 -1
  265. package/dist/src/utils.d.ts +0 -58
  266. package/dist/src/utils.d.ts.map +0 -1
  267. package/dist/src/utils.js +0 -190
  268. package/dist/src/utils.js.map +0 -1
  269. package/dist/tests/helpers/test-db.d.ts +0 -12
  270. package/dist/tests/helpers/test-db.d.ts.map +0 -1
  271. package/dist/tests/helpers/test-db.js +0 -149
  272. package/dist/tests/helpers/test-db.js.map +0 -1
  273. package/dist/tests/installer/installer.test.d.ts +0 -2
  274. package/dist/tests/installer/installer.test.d.ts.map +0 -1
  275. package/dist/tests/installer/installer.test.js +0 -160
  276. package/dist/tests/installer/installer.test.js.map +0 -1
  277. package/dist/tests/repositories/repos.test.d.ts +0 -2
  278. package/dist/tests/repositories/repos.test.d.ts.map +0 -1
  279. package/dist/tests/repositories/repos.test.js +0 -220
  280. package/dist/tests/repositories/repos.test.js.map +0 -1
  281. package/dist/tools/maintenance.d.ts +0 -3
  282. package/dist/tools/maintenance.d.ts.map +0 -1
  283. package/dist/tools/maintenance.js +0 -647
  284. package/dist/tools/maintenance.js.map +0 -1
  285. package/dist/tools/memory.d.ts +0 -3
  286. package/dist/tools/memory.d.ts.map +0 -1
  287. package/dist/tools/memory.js +0 -446
  288. 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":"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"}
@@ -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"}