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.
- package/README.md +12 -1
- package/dist/constants.d.ts +1 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +6 -1
- package/dist/constants.js.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/installer/ide-detector.d.ts.map +1 -1
- package/dist/installer/ide-detector.js +10 -6
- package/dist/installer/ide-detector.js.map +1 -1
- package/dist/installer/index.d.ts.map +1 -1
- package/dist/installer/index.js +79 -15
- package/dist/installer/index.js.map +1 -1
- package/package.json +6 -3
- package/dist/installer.d.ts +0 -2
- package/dist/installer.d.ts.map +0 -1
- package/dist/installer.js +0 -315
- package/dist/installer.js.map +0 -1
- package/dist/src/constants.d.ts +0 -21
- package/dist/src/constants.d.ts.map +0 -1
- package/dist/src/constants.js +0 -81
- package/dist/src/constants.js.map +0 -1
- package/dist/src/database.d.ts +0 -32
- package/dist/src/database.d.ts.map +0 -1
- package/dist/src/database.js +0 -143
- package/dist/src/database.js.map +0 -1
- package/dist/src/errors.d.ts +0 -40
- package/dist/src/errors.d.ts.map +0 -1
- package/dist/src/errors.js +0 -63
- package/dist/src/errors.js.map +0 -1
- package/dist/src/index.d.ts +0 -3
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js +0 -89
- package/dist/src/index.js.map +0 -1
- package/dist/src/installer/config-writer.d.ts +0 -25
- package/dist/src/installer/config-writer.d.ts.map +0 -1
- package/dist/src/installer/config-writer.js +0 -86
- package/dist/src/installer/config-writer.js.map +0 -1
- package/dist/src/installer/ide-configs.d.ts +0 -19
- package/dist/src/installer/ide-configs.d.ts.map +0 -1
- package/dist/src/installer/ide-configs.js +0 -131
- package/dist/src/installer/ide-configs.js.map +0 -1
- package/dist/src/installer/ide-detector.d.ts +0 -6
- package/dist/src/installer/ide-detector.d.ts.map +0 -1
- package/dist/src/installer/ide-detector.js +0 -45
- package/dist/src/installer/ide-detector.js.map +0 -1
- package/dist/src/installer/index.d.ts +0 -2
- package/dist/src/installer/index.d.ts.map +0 -1
- package/dist/src/installer/index.js +0 -229
- package/dist/src/installer/index.js.map +0 -1
- package/dist/src/logger.d.ts +0 -10
- package/dist/src/logger.d.ts.map +0 -1
- package/dist/src/logger.js +0 -51
- package/dist/src/logger.js.map +0 -1
- package/dist/src/migrations.d.ts +0 -4
- package/dist/src/migrations.d.ts.map +0 -1
- package/dist/src/migrations.js +0 -343
- package/dist/src/migrations.js.map +0 -1
- package/dist/src/repositories/changes.repo.d.ts +0 -35
- package/dist/src/repositories/changes.repo.d.ts.map +0 -1
- package/dist/src/repositories/changes.repo.js +0 -53
- package/dist/src/repositories/changes.repo.js.map +0 -1
- package/dist/src/repositories/config.repo.d.ts +0 -11
- package/dist/src/repositories/config.repo.d.ts.map +0 -1
- package/dist/src/repositories/config.repo.js +0 -38
- package/dist/src/repositories/config.repo.js.map +0 -1
- package/dist/src/repositories/conventions.repo.d.ts +0 -15
- package/dist/src/repositories/conventions.repo.d.ts.map +0 -1
- package/dist/src/repositories/conventions.repo.js +0 -39
- package/dist/src/repositories/conventions.repo.js.map +0 -1
- package/dist/src/repositories/decisions.repo.d.ts +0 -19
- package/dist/src/repositories/decisions.repo.d.ts.map +0 -1
- package/dist/src/repositories/decisions.repo.js +0 -48
- package/dist/src/repositories/decisions.repo.js.map +0 -1
- package/dist/src/repositories/events.repo.d.ts +0 -34
- package/dist/src/repositories/events.repo.d.ts.map +0 -1
- package/dist/src/repositories/events.repo.js +0 -71
- package/dist/src/repositories/events.repo.js.map +0 -1
- package/dist/src/repositories/file-notes.repo.d.ts +0 -26
- package/dist/src/repositories/file-notes.repo.d.ts.map +0 -1
- package/dist/src/repositories/file-notes.repo.js +0 -55
- package/dist/src/repositories/file-notes.repo.js.map +0 -1
- package/dist/src/repositories/index.d.ts +0 -38
- package/dist/src/repositories/index.d.ts.map +0 -1
- package/dist/src/repositories/index.js +0 -41
- package/dist/src/repositories/index.js.map +0 -1
- package/dist/src/repositories/milestones.repo.d.ts +0 -10
- package/dist/src/repositories/milestones.repo.d.ts.map +0 -1
- package/dist/src/repositories/milestones.repo.js +0 -20
- package/dist/src/repositories/milestones.repo.js.map +0 -1
- package/dist/src/repositories/sessions.repo.d.ts +0 -27
- package/dist/src/repositories/sessions.repo.d.ts.map +0 -1
- package/dist/src/repositories/sessions.repo.js +0 -61
- package/dist/src/repositories/sessions.repo.js.map +0 -1
- package/dist/src/repositories/snapshot.repo.d.ts +0 -11
- package/dist/src/repositories/snapshot.repo.d.ts.map +0 -1
- package/dist/src/repositories/snapshot.repo.js +0 -17
- package/dist/src/repositories/snapshot.repo.js.map +0 -1
- package/dist/src/repositories/tasks.repo.d.ts +0 -40
- package/dist/src/repositories/tasks.repo.d.ts.map +0 -1
- package/dist/src/repositories/tasks.repo.js +0 -90
- package/dist/src/repositories/tasks.repo.js.map +0 -1
- package/dist/src/response.d.ts +0 -28
- package/dist/src/response.d.ts.map +0 -1
- package/dist/src/response.js +0 -38
- package/dist/src/response.js.map +0 -1
- package/dist/src/scripts/install-hooks.d.ts +0 -3
- package/dist/src/scripts/install-hooks.d.ts.map +0 -1
- package/dist/src/scripts/install-hooks.js +0 -89
- package/dist/src/scripts/install-hooks.js.map +0 -1
- package/dist/src/services/compaction.service.d.ts +0 -27
- package/dist/src/services/compaction.service.d.ts.map +0 -1
- package/dist/src/services/compaction.service.js +0 -93
- package/dist/src/services/compaction.service.js.map +0 -1
- package/dist/src/services/event-trigger.service.d.ts +0 -24
- package/dist/src/services/event-trigger.service.d.ts.map +0 -1
- package/dist/src/services/event-trigger.service.js +0 -60
- package/dist/src/services/event-trigger.service.js.map +0 -1
- package/dist/src/services/git.service.d.ts +0 -20
- package/dist/src/services/git.service.d.ts.map +0 -1
- package/dist/src/services/git.service.js +0 -88
- package/dist/src/services/git.service.js.map +0 -1
- package/dist/src/services/index.d.ts +0 -5
- package/dist/src/services/index.d.ts.map +0 -1
- package/dist/src/services/index.js +0 -8
- package/dist/src/services/index.js.map +0 -1
- package/dist/src/services/project-scan.service.d.ts +0 -19
- package/dist/src/services/project-scan.service.d.ts.map +0 -1
- package/dist/src/services/project-scan.service.js +0 -66
- package/dist/src/services/project-scan.service.js.map +0 -1
- package/dist/src/tools/backup.d.ts +0 -3
- package/dist/src/tools/backup.d.ts.map +0 -1
- package/dist/src/tools/backup.js +0 -191
- package/dist/src/tools/backup.js.map +0 -1
- package/dist/src/tools/changes.d.ts +0 -3
- package/dist/src/tools/changes.d.ts.map +0 -1
- package/dist/src/tools/changes.js +0 -97
- package/dist/src/tools/changes.js.map +0 -1
- package/dist/src/tools/compaction.d.ts +0 -3
- package/dist/src/tools/compaction.d.ts.map +0 -1
- package/dist/src/tools/compaction.js +0 -151
- package/dist/src/tools/compaction.js.map +0 -1
- package/dist/src/tools/conventions.d.ts +0 -3
- package/dist/src/tools/conventions.d.ts.map +0 -1
- package/dist/src/tools/conventions.js +0 -121
- package/dist/src/tools/conventions.js.map +0 -1
- package/dist/src/tools/decisions.d.ts +0 -3
- package/dist/src/tools/decisions.d.ts.map +0 -1
- package/dist/src/tools/decisions.js +0 -136
- package/dist/src/tools/decisions.js.map +0 -1
- package/dist/src/tools/export-import.d.ts +0 -3
- package/dist/src/tools/export-import.d.ts.map +0 -1
- package/dist/src/tools/export-import.js +0 -180
- package/dist/src/tools/export-import.js.map +0 -1
- package/dist/src/tools/file-notes.d.ts +0 -3
- package/dist/src/tools/file-notes.d.ts.map +0 -1
- package/dist/src/tools/file-notes.js +0 -104
- package/dist/src/tools/file-notes.js.map +0 -1
- package/dist/src/tools/intelligence.d.ts +0 -3
- package/dist/src/tools/intelligence.d.ts.map +0 -1
- package/dist/src/tools/intelligence.js +0 -427
- package/dist/src/tools/intelligence.js.map +0 -1
- package/dist/src/tools/milestones.d.ts +0 -3
- package/dist/src/tools/milestones.d.ts.map +0 -1
- package/dist/src/tools/milestones.js +0 -71
- package/dist/src/tools/milestones.js.map +0 -1
- package/dist/src/tools/scheduler.d.ts +0 -3
- package/dist/src/tools/scheduler.d.ts.map +0 -1
- package/dist/src/tools/scheduler.js +0 -363
- package/dist/src/tools/scheduler.js.map +0 -1
- package/dist/src/tools/sessions.d.ts +0 -3
- package/dist/src/tools/sessions.d.ts.map +0 -1
- package/dist/src/tools/sessions.js +0 -356
- package/dist/src/tools/sessions.js.map +0 -1
- package/dist/src/tools/stats.d.ts +0 -3
- package/dist/src/tools/stats.d.ts.map +0 -1
- package/dist/src/tools/stats.js +0 -63
- package/dist/src/tools/stats.js.map +0 -1
- package/dist/src/tools/tasks.d.ts +0 -3
- package/dist/src/tools/tasks.d.ts.map +0 -1
- package/dist/src/tools/tasks.js +0 -206
- package/dist/src/tools/tasks.js.map +0 -1
- package/dist/src/types.d.ts +0 -170
- package/dist/src/types.d.ts.map +0 -1
- package/dist/src/types.js +0 -5
- package/dist/src/types.js.map +0 -1
- package/dist/src/utils.d.ts +0 -58
- package/dist/src/utils.d.ts.map +0 -1
- package/dist/src/utils.js +0 -190
- package/dist/src/utils.js.map +0 -1
- package/dist/tests/helpers/test-db.d.ts +0 -12
- package/dist/tests/helpers/test-db.d.ts.map +0 -1
- package/dist/tests/helpers/test-db.js +0 -149
- package/dist/tests/helpers/test-db.js.map +0 -1
- package/dist/tests/installer/installer.test.d.ts +0 -2
- package/dist/tests/installer/installer.test.d.ts.map +0 -1
- package/dist/tests/installer/installer.test.js +0 -160
- package/dist/tests/installer/installer.test.js.map +0 -1
- package/dist/tests/repositories/repos.test.d.ts +0 -2
- package/dist/tests/repositories/repos.test.d.ts.map +0 -1
- package/dist/tests/repositories/repos.test.js +0 -220
- package/dist/tests/repositories/repos.test.js.map +0 -1
- package/dist/tools/maintenance.d.ts +0 -3
- package/dist/tools/maintenance.d.ts.map +0 -1
- package/dist/tools/maintenance.js +0 -647
- package/dist/tools/maintenance.js.map +0 -1
- package/dist/tools/memory.d.ts +0 -3
- package/dist/tools/memory.d.ts.map +0 -1
- package/dist/tools/memory.js +0 -446
- 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 +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"}
|
package/dist/src/tools/stats.js
DELETED
|
@@ -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 +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"}
|