memory-journal-mcp 4.4.2 → 5.0.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 (291) hide show
  1. package/.github/workflows/codeql.yml +1 -6
  2. package/.github/workflows/docker-publish.yml +15 -49
  3. package/.github/workflows/lint-and-test.yml +1 -1
  4. package/.github/workflows/secrets-scanning.yml +4 -3
  5. package/.github/workflows/security-update.yml +3 -3
  6. package/CHANGELOG.md +213 -0
  7. package/CONTRIBUTING.md +132 -97
  8. package/DOCKER_README.md +184 -235
  9. package/Dockerfile +27 -24
  10. package/README.md +218 -190
  11. package/SECURITY.md +27 -35
  12. package/dist/cli.js +16 -1
  13. package/dist/cli.js.map +1 -1
  14. package/dist/constants/ServerInstructions.d.ts +5 -1
  15. package/dist/constants/ServerInstructions.d.ts.map +1 -1
  16. package/dist/constants/ServerInstructions.js +133 -73
  17. package/dist/constants/ServerInstructions.js.map +1 -1
  18. package/dist/constants/icons.d.ts +2 -2
  19. package/dist/constants/icons.d.ts.map +1 -1
  20. package/dist/constants/icons.js +7 -6
  21. package/dist/constants/icons.js.map +1 -1
  22. package/dist/database/SqliteAdapter.d.ts +37 -24
  23. package/dist/database/SqliteAdapter.d.ts.map +1 -1
  24. package/dist/database/SqliteAdapter.js +319 -157
  25. package/dist/database/SqliteAdapter.js.map +1 -1
  26. package/dist/database/schema.d.ts +45 -0
  27. package/dist/database/schema.d.ts.map +1 -0
  28. package/dist/database/schema.js +92 -0
  29. package/dist/database/schema.js.map +1 -0
  30. package/dist/filtering/ToolFilter.d.ts +1 -1
  31. package/dist/filtering/ToolFilter.d.ts.map +1 -1
  32. package/dist/filtering/ToolFilter.js +13 -2
  33. package/dist/filtering/ToolFilter.js.map +1 -1
  34. package/dist/github/GitHubIntegration.d.ts.map +1 -1
  35. package/dist/github/GitHubIntegration.js +1 -3
  36. package/dist/github/GitHubIntegration.js.map +1 -1
  37. package/dist/handlers/prompts/github.d.ts +12 -0
  38. package/dist/handlers/prompts/github.d.ts.map +1 -0
  39. package/dist/handlers/prompts/github.js +178 -0
  40. package/dist/handlers/prompts/github.js.map +1 -0
  41. package/dist/handlers/prompts/index.d.ts +23 -2
  42. package/dist/handlers/prompts/index.d.ts.map +1 -1
  43. package/dist/handlers/prompts/index.js +7 -432
  44. package/dist/handlers/prompts/index.js.map +1 -1
  45. package/dist/handlers/prompts/workflow.d.ts +12 -0
  46. package/dist/handlers/prompts/workflow.d.ts.map +1 -0
  47. package/dist/handlers/prompts/workflow.js +277 -0
  48. package/dist/handlers/prompts/workflow.js.map +1 -0
  49. package/dist/handlers/resources/core.d.ts +11 -0
  50. package/dist/handlers/resources/core.d.ts.map +1 -0
  51. package/dist/handlers/resources/core.js +433 -0
  52. package/dist/handlers/resources/core.js.map +1 -0
  53. package/dist/handlers/resources/github.d.ts +11 -0
  54. package/dist/handlers/resources/github.d.ts.map +1 -0
  55. package/dist/handlers/resources/github.js +314 -0
  56. package/dist/handlers/resources/github.js.map +1 -0
  57. package/dist/handlers/resources/graph.d.ts +11 -0
  58. package/dist/handlers/resources/graph.d.ts.map +1 -0
  59. package/dist/handlers/resources/graph.js +204 -0
  60. package/dist/handlers/resources/graph.js.map +1 -0
  61. package/dist/handlers/resources/index.d.ts +5 -20
  62. package/dist/handlers/resources/index.d.ts.map +1 -1
  63. package/dist/handlers/resources/index.js +16 -1278
  64. package/dist/handlers/resources/index.js.map +1 -1
  65. package/dist/handlers/resources/shared.d.ts +60 -0
  66. package/dist/handlers/resources/shared.d.ts.map +1 -0
  67. package/dist/handlers/resources/shared.js +49 -0
  68. package/dist/handlers/resources/shared.js.map +1 -0
  69. package/dist/handlers/resources/team.d.ts +13 -0
  70. package/dist/handlers/resources/team.d.ts.map +1 -0
  71. package/dist/handlers/resources/team.js +119 -0
  72. package/dist/handlers/resources/team.js.map +1 -0
  73. package/dist/handlers/resources/templates.d.ts +13 -0
  74. package/dist/handlers/resources/templates.d.ts.map +1 -0
  75. package/dist/handlers/resources/templates.js +310 -0
  76. package/dist/handlers/resources/templates.js.map +1 -0
  77. package/dist/handlers/tools/admin.d.ts +8 -0
  78. package/dist/handlers/tools/admin.d.ts.map +1 -0
  79. package/dist/handlers/tools/admin.js +270 -0
  80. package/dist/handlers/tools/admin.js.map +1 -0
  81. package/dist/handlers/tools/analytics.d.ts +8 -0
  82. package/dist/handlers/tools/analytics.d.ts.map +1 -0
  83. package/dist/handlers/tools/analytics.js +256 -0
  84. package/dist/handlers/tools/analytics.js.map +1 -0
  85. package/dist/handlers/tools/backup.d.ts +8 -0
  86. package/dist/handlers/tools/backup.d.ts.map +1 -0
  87. package/dist/handlers/tools/backup.js +224 -0
  88. package/dist/handlers/tools/backup.js.map +1 -0
  89. package/dist/handlers/tools/core.d.ts +9 -0
  90. package/dist/handlers/tools/core.d.ts.map +1 -0
  91. package/dist/handlers/tools/core.js +326 -0
  92. package/dist/handlers/tools/core.js.map +1 -0
  93. package/dist/handlers/tools/export.d.ts +8 -0
  94. package/dist/handlers/tools/export.d.ts.map +1 -0
  95. package/dist/handlers/tools/export.js +89 -0
  96. package/dist/handlers/tools/export.js.map +1 -0
  97. package/dist/handlers/tools/github/helpers.d.ts +34 -0
  98. package/dist/handlers/tools/github/helpers.d.ts.map +1 -0
  99. package/dist/handlers/tools/github/helpers.js +52 -0
  100. package/dist/handlers/tools/github/helpers.js.map +1 -0
  101. package/dist/handlers/tools/github/insights-tools.d.ts +8 -0
  102. package/dist/handlers/tools/github/insights-tools.d.ts.map +1 -0
  103. package/dist/handlers/tools/github/insights-tools.js +104 -0
  104. package/dist/handlers/tools/github/insights-tools.js.map +1 -0
  105. package/dist/handlers/tools/github/issue-tools.d.ts +8 -0
  106. package/dist/handlers/tools/github/issue-tools.d.ts.map +1 -0
  107. package/dist/handlers/tools/github/issue-tools.js +359 -0
  108. package/dist/handlers/tools/github/issue-tools.js.map +1 -0
  109. package/dist/handlers/tools/github/kanban-tools.d.ts +8 -0
  110. package/dist/handlers/tools/github/kanban-tools.d.ts.map +1 -0
  111. package/dist/handlers/tools/github/kanban-tools.js +108 -0
  112. package/dist/handlers/tools/github/kanban-tools.js.map +1 -0
  113. package/dist/handlers/tools/github/milestone-tools.d.ts +9 -0
  114. package/dist/handlers/tools/github/milestone-tools.d.ts.map +1 -0
  115. package/dist/handlers/tools/github/milestone-tools.js +302 -0
  116. package/dist/handlers/tools/github/milestone-tools.js.map +1 -0
  117. package/dist/handlers/tools/github/mutation-tools.d.ts +12 -0
  118. package/dist/handlers/tools/github/mutation-tools.d.ts.map +1 -0
  119. package/dist/handlers/tools/github/mutation-tools.js +15 -0
  120. package/dist/handlers/tools/github/mutation-tools.js.map +1 -0
  121. package/dist/handlers/tools/github/read-tools.d.ts +8 -0
  122. package/dist/handlers/tools/github/read-tools.d.ts.map +1 -0
  123. package/dist/handlers/tools/github/read-tools.js +260 -0
  124. package/dist/handlers/tools/github/read-tools.js.map +1 -0
  125. package/dist/handlers/tools/github/schemas.d.ts +467 -0
  126. package/dist/handlers/tools/github/schemas.d.ts.map +1 -0
  127. package/dist/handlers/tools/github/schemas.js +335 -0
  128. package/dist/handlers/tools/github/schemas.js.map +1 -0
  129. package/dist/handlers/tools/github.d.ts +14 -0
  130. package/dist/handlers/tools/github.d.ts.map +1 -0
  131. package/dist/handlers/tools/github.js +28 -0
  132. package/dist/handlers/tools/github.js.map +1 -0
  133. package/dist/handlers/tools/index.d.ts +15 -20
  134. package/dist/handlers/tools/index.d.ts.map +1 -1
  135. package/dist/handlers/tools/index.js +117 -2909
  136. package/dist/handlers/tools/index.js.map +1 -1
  137. package/dist/handlers/tools/relationships.d.ts +8 -0
  138. package/dist/handlers/tools/relationships.d.ts.map +1 -0
  139. package/dist/handlers/tools/relationships.js +308 -0
  140. package/dist/handlers/tools/relationships.js.map +1 -0
  141. package/dist/handlers/tools/schemas.d.ts +108 -0
  142. package/dist/handlers/tools/schemas.d.ts.map +1 -0
  143. package/dist/handlers/tools/schemas.js +122 -0
  144. package/dist/handlers/tools/schemas.js.map +1 -0
  145. package/dist/handlers/tools/search.d.ts +8 -0
  146. package/dist/handlers/tools/search.d.ts.map +1 -0
  147. package/dist/handlers/tools/search.js +282 -0
  148. package/dist/handlers/tools/search.js.map +1 -0
  149. package/dist/handlers/tools/team.d.ts +11 -0
  150. package/dist/handlers/tools/team.d.ts.map +1 -0
  151. package/dist/handlers/tools/team.js +239 -0
  152. package/dist/handlers/tools/team.js.map +1 -0
  153. package/dist/server/McpServer.d.ts +4 -0
  154. package/dist/server/McpServer.d.ts.map +1 -1
  155. package/dist/server/McpServer.js +48 -297
  156. package/dist/server/McpServer.js.map +1 -1
  157. package/dist/server/Scheduler.d.ts +91 -0
  158. package/dist/server/Scheduler.d.ts.map +1 -0
  159. package/dist/server/Scheduler.js +201 -0
  160. package/dist/server/Scheduler.js.map +1 -0
  161. package/dist/transports/http.d.ts +66 -0
  162. package/dist/transports/http.d.ts.map +1 -0
  163. package/dist/transports/http.js +519 -0
  164. package/dist/transports/http.js.map +1 -0
  165. package/dist/types/entities.d.ts +101 -0
  166. package/dist/types/entities.d.ts.map +1 -0
  167. package/dist/types/entities.js +5 -0
  168. package/dist/types/entities.js.map +1 -0
  169. package/dist/types/filtering.d.ts +34 -0
  170. package/dist/types/filtering.d.ts.map +1 -0
  171. package/dist/types/filtering.js +5 -0
  172. package/dist/types/filtering.js.map +1 -0
  173. package/dist/types/github.d.ts +166 -0
  174. package/dist/types/github.d.ts.map +1 -0
  175. package/dist/types/github.js +5 -0
  176. package/dist/types/github.js.map +1 -0
  177. package/dist/types/index.d.ts +35 -292
  178. package/dist/types/index.d.ts.map +1 -1
  179. package/dist/types/index.js +2 -2
  180. package/dist/types/index.js.map +1 -1
  181. package/dist/utils/error-helpers.d.ts +37 -0
  182. package/dist/utils/error-helpers.d.ts.map +1 -0
  183. package/dist/utils/error-helpers.js +47 -0
  184. package/dist/utils/error-helpers.js.map +1 -0
  185. package/dist/utils/logger.d.ts.map +1 -1
  186. package/dist/utils/logger.js +6 -3
  187. package/dist/utils/logger.js.map +1 -1
  188. package/dist/utils/security-utils.d.ts +0 -21
  189. package/dist/utils/security-utils.d.ts.map +1 -1
  190. package/dist/utils/security-utils.js +0 -47
  191. package/dist/utils/security-utils.js.map +1 -1
  192. package/dist/vector/VectorSearchManager.d.ts.map +1 -1
  193. package/dist/vector/VectorSearchManager.js +9 -32
  194. package/dist/vector/VectorSearchManager.js.map +1 -1
  195. package/docker-compose.yml +11 -2
  196. package/hooks/README.md +107 -0
  197. package/hooks/cursor/hooks.json +10 -0
  198. package/hooks/cursor/memory-journal.mdc +22 -0
  199. package/hooks/cursor/session-end.sh +19 -0
  200. package/hooks/kilo-code/session-end-mode.json +11 -0
  201. package/hooks/kiro/session-end.md +13 -0
  202. package/mcp-config-example.json +1 -0
  203. package/package.json +11 -9
  204. package/playwright.config.ts +29 -0
  205. package/releases/v4.5.0.md +116 -0
  206. package/releases/v5.0.0.md +105 -0
  207. package/scripts/generate-server-instructions.ts +176 -0
  208. package/scripts/server-instructions-function-body.ts +77 -0
  209. package/server.json +3 -3
  210. package/src/cli.ts +45 -1
  211. package/src/constants/ServerInstructions.ts +133 -73
  212. package/src/constants/icons.ts +8 -7
  213. package/src/constants/server-instructions.md +268 -0
  214. package/src/database/SqliteAdapter.ts +358 -192
  215. package/src/database/schema.ts +125 -0
  216. package/src/filtering/ToolFilter.ts +13 -2
  217. package/src/github/GitHubIntegration.ts +1 -3
  218. package/src/handlers/prompts/github.ts +209 -0
  219. package/src/handlers/prompts/index.ts +10 -499
  220. package/src/handlers/prompts/workflow.ts +314 -0
  221. package/src/handlers/resources/core.ts +528 -0
  222. package/src/handlers/resources/github.ts +358 -0
  223. package/src/handlers/resources/graph.ts +254 -0
  224. package/src/handlers/resources/index.ts +23 -1570
  225. package/src/handlers/resources/shared.ts +103 -0
  226. package/src/handlers/resources/team.ts +133 -0
  227. package/src/handlers/resources/templates.ts +374 -0
  228. package/src/handlers/tools/admin.ts +285 -0
  229. package/src/handlers/tools/analytics.ts +301 -0
  230. package/src/handlers/tools/backup.ts +242 -0
  231. package/src/handlers/tools/core.ts +350 -0
  232. package/src/handlers/tools/export.ts +115 -0
  233. package/src/handlers/tools/github/helpers.ts +86 -0
  234. package/src/handlers/tools/github/insights-tools.ts +119 -0
  235. package/src/handlers/tools/github/issue-tools.ts +439 -0
  236. package/src/handlers/tools/github/kanban-tools.ts +134 -0
  237. package/src/handlers/tools/github/milestone-tools.ts +392 -0
  238. package/src/handlers/tools/github/mutation-tools.ts +17 -0
  239. package/src/handlers/tools/github/read-tools.ts +328 -0
  240. package/src/handlers/tools/github/schemas.ts +369 -0
  241. package/src/handlers/tools/github.ts +36 -0
  242. package/src/handlers/tools/index.ts +144 -3325
  243. package/src/handlers/tools/relationships.ts +358 -0
  244. package/src/handlers/tools/schemas.ts +132 -0
  245. package/src/handlers/tools/search.ts +343 -0
  246. package/src/handlers/tools/team.ts +273 -0
  247. package/src/server/McpServer.ts +63 -358
  248. package/src/server/Scheduler.ts +278 -0
  249. package/src/transports/http.ts +635 -0
  250. package/src/types/entities.ts +145 -0
  251. package/src/types/filtering.ts +54 -0
  252. package/src/types/github.ts +180 -0
  253. package/src/types/index.ts +67 -375
  254. package/src/utils/error-helpers.ts +52 -0
  255. package/src/utils/logger.ts +6 -3
  256. package/src/utils/security-utils.ts +0 -52
  257. package/src/vector/VectorSearchManager.ts +9 -33
  258. package/tests/constants/icons.test.ts +1 -2
  259. package/tests/constants/server-instructions.test.ts +30 -4
  260. package/tests/database/sqlite-adapter.test.ts +91 -7
  261. package/tests/e2e/auth.spec.ts +154 -0
  262. package/tests/e2e/health.spec.ts +63 -0
  263. package/tests/e2e/protocols.spec.ts +134 -0
  264. package/tests/e2e/resources.spec.ts +103 -0
  265. package/tests/e2e/scheduler.spec.ts +79 -0
  266. package/tests/e2e/security.spec.ts +91 -0
  267. package/tests/e2e/sessions.spec.ts +95 -0
  268. package/tests/e2e/stateless.spec.ts +121 -0
  269. package/tests/e2e/tools.spec.ts +111 -0
  270. package/tests/filtering/tool-filter.test.ts +46 -0
  271. package/tests/handlers/error-path-coverage.test.ts +324 -0
  272. package/tests/handlers/github-resource-handlers.test.ts +453 -0
  273. package/tests/handlers/github-tool-handlers.test.ts +899 -0
  274. package/tests/handlers/prompt-handler-coverage.test.ts +106 -0
  275. package/tests/handlers/prompt-handlers.test.ts +40 -0
  276. package/tests/handlers/resource-handler-coverage.test.ts +181 -0
  277. package/tests/handlers/resource-handlers.test.ts +33 -9
  278. package/tests/handlers/search-tool-handlers.test.ts +272 -0
  279. package/tests/handlers/targeted-gap-closure.test.ts +387 -0
  280. package/tests/handlers/team-resource-handlers.test.ts +156 -0
  281. package/tests/handlers/team-tool-handlers.test.ts +301 -0
  282. package/tests/handlers/tool-handler-coverage.test.ts +469 -0
  283. package/tests/handlers/tool-handlers.test.ts +2 -2
  284. package/tests/security/sql-injection.test.ts +3 -54
  285. package/tests/server/mcp-server.test.ts +503 -8
  286. package/tests/server/scheduler.test.ts +400 -0
  287. package/tests/transports/http-transport.test.ts +620 -0
  288. package/tests/vector/vector-search-manager.test.ts +60 -0
  289. package/vitest.config.ts +4 -1
  290. package/.memory-journal-team.db +0 -0
  291. package/.vscode/settings.json +0 -84
@@ -0,0 +1,201 @@
1
+ /**
2
+ * Memory Journal MCP Server - Scheduler
3
+ *
4
+ * Lightweight in-process scheduler for periodic maintenance jobs.
5
+ * Only meaningful for HTTP/SSE transport (long-lived server processes).
6
+ * Uses setInterval for simplicity — no external dependencies.
7
+ */
8
+ import { logger } from '../utils/logger.js';
9
+ // ============================================================================
10
+ // Scheduler
11
+ // ============================================================================
12
+ /**
13
+ * Scheduler — runs periodic maintenance jobs for long-lived server processes.
14
+ *
15
+ * Jobs:
16
+ * - **backup**: Exports database to timestamped file, then prunes old backups.
17
+ * - **vacuum**: Runs `PRAGMA optimize` and flushes database to disk.
18
+ * - **rebuild-index**: Rebuilds vector search index from all entries.
19
+ */
20
+ export class Scheduler {
21
+ options;
22
+ db;
23
+ vectorManager;
24
+ timers = [];
25
+ started = false;
26
+ constructor(options, db, vectorManager) {
27
+ this.options = options;
28
+ this.db = db;
29
+ this.vectorManager = vectorManager ?? null;
30
+ }
31
+ /**
32
+ * Start all enabled scheduled jobs.
33
+ * Each job runs on its own interval and failures are isolated.
34
+ */
35
+ start() {
36
+ if (this.started) {
37
+ logger.warning('Scheduler already started, ignoring duplicate start()', {
38
+ module: 'Scheduler',
39
+ });
40
+ return;
41
+ }
42
+ this.started = true;
43
+ const { backupIntervalMinutes, vacuumIntervalMinutes, rebuildIndexIntervalMinutes } = this.options;
44
+ if (backupIntervalMinutes > 0) {
45
+ this.scheduleJob('backup', backupIntervalMinutes, () => this.runBackup());
46
+ }
47
+ if (vacuumIntervalMinutes > 0) {
48
+ this.scheduleJob('vacuum', vacuumIntervalMinutes, () => this.runVacuumOptimize());
49
+ }
50
+ if (rebuildIndexIntervalMinutes > 0) {
51
+ if (this.vectorManager) {
52
+ this.scheduleJob('rebuild-index', rebuildIndexIntervalMinutes, () => this.runRebuildIndex());
53
+ }
54
+ else {
55
+ logger.warning('rebuild-index-interval specified but vector manager not available, skipping', { module: 'Scheduler' });
56
+ }
57
+ }
58
+ if (this.timers.length > 0) {
59
+ const summary = this.timers.map((t) => `${t.name} (${String(t.intervalMinutes)}min)`);
60
+ logger.info(`Scheduler started: ${summary.join(', ')}`, { module: 'Scheduler' });
61
+ }
62
+ else {
63
+ logger.info('Scheduler started with no jobs enabled', { module: 'Scheduler' });
64
+ }
65
+ }
66
+ /**
67
+ * Stop all scheduled jobs and clear timers.
68
+ * Safe to call multiple times.
69
+ */
70
+ stop() {
71
+ for (const job of this.timers) {
72
+ clearInterval(job.timer);
73
+ }
74
+ if (this.timers.length > 0) {
75
+ logger.info(`Scheduler stopped, cleared ${String(this.timers.length)} job(s)`, {
76
+ module: 'Scheduler',
77
+ });
78
+ }
79
+ this.timers.length = 0;
80
+ this.started = false;
81
+ }
82
+ /**
83
+ * Get the current status of all scheduled jobs.
84
+ */
85
+ getStatus() {
86
+ return {
87
+ active: this.started,
88
+ jobs: this.timers.map((t) => ({
89
+ name: t.name,
90
+ enabled: true,
91
+ intervalMinutes: t.intervalMinutes,
92
+ lastRun: t.lastRun?.toISOString() ?? null,
93
+ lastResult: t.lastResult,
94
+ lastError: t.lastError,
95
+ nextRun: t.lastRun
96
+ ? new Date(t.lastRun.getTime() + t.intervalMinutes * 60_000).toISOString()
97
+ : new Date(Date.now() + t.intervalMinutes * 60_000).toISOString(),
98
+ runCount: t.runCount,
99
+ })),
100
+ };
101
+ }
102
+ // ========================================================================
103
+ // Private — Job scheduling
104
+ // ========================================================================
105
+ /**
106
+ * Schedule a recurring job.
107
+ */
108
+ scheduleJob(name, intervalMinutes, fn) {
109
+ const intervalMs = intervalMinutes * 60_000;
110
+ const jobTimer = {
111
+ name,
112
+ intervalMinutes,
113
+ timer: setInterval(() => {
114
+ void this.executeJob(jobTimer, fn);
115
+ }, intervalMs),
116
+ lastRun: null,
117
+ lastResult: null,
118
+ lastError: null,
119
+ runCount: 0,
120
+ };
121
+ this.timers.push(jobTimer);
122
+ }
123
+ /**
124
+ * Execute a job with error isolation and status tracking.
125
+ */
126
+ async executeJob(job, fn) {
127
+ const startTime = Date.now();
128
+ try {
129
+ await fn();
130
+ job.lastRun = new Date(startTime);
131
+ job.lastResult = 'success';
132
+ job.lastError = null;
133
+ job.runCount++;
134
+ }
135
+ catch (error) {
136
+ job.lastRun = new Date(startTime);
137
+ job.lastResult = 'error';
138
+ job.lastError = error instanceof Error ? error.message : String(error);
139
+ job.runCount++;
140
+ logger.error(`Scheduled job '${job.name}' failed`, {
141
+ module: 'Scheduler',
142
+ operation: job.name,
143
+ error: job.lastError,
144
+ });
145
+ }
146
+ }
147
+ // ========================================================================
148
+ // Private — Job implementations
149
+ // ========================================================================
150
+ /**
151
+ * Backup job: export database to file, then cleanup old backups.
152
+ */
153
+ async runBackup() {
154
+ const result = this.db.exportToFile();
155
+ logger.info('Scheduled backup created', {
156
+ module: 'Scheduler',
157
+ operation: 'backup',
158
+ context: { filename: result.filename, sizeBytes: result.sizeBytes },
159
+ });
160
+ const cleanup = this.db.deleteOldBackups(this.options.keepBackups);
161
+ if (cleanup.deleted.length > 0) {
162
+ logger.info(`Backup cleanup: deleted ${String(cleanup.deleted.length)}, kept ${String(cleanup.kept)}`, {
163
+ module: 'Scheduler',
164
+ operation: 'backup-cleanup',
165
+ });
166
+ }
167
+ await Promise.resolve();
168
+ }
169
+ /**
170
+ * Vacuum/optimize job: run PRAGMA optimize and flush to disk.
171
+ *
172
+ * Note: sql.js uses an in-memory database. PRAGMA optimize updates
173
+ * internal statistics, and flushSave() ensures the disk file is current.
174
+ * A full VACUUM on sql.js only compacts the in-memory representation.
175
+ */
176
+ async runVacuumOptimize() {
177
+ const rawDb = this.db.getRawDb();
178
+ rawDb.run('PRAGMA optimize');
179
+ this.db.flushSave();
180
+ logger.info('Scheduled database optimize completed', {
181
+ module: 'Scheduler',
182
+ operation: 'vacuum',
183
+ });
184
+ await Promise.resolve();
185
+ }
186
+ /**
187
+ * Rebuild index job: full vector index rebuild from database entries.
188
+ */
189
+ async runRebuildIndex() {
190
+ if (!this.vectorManager) {
191
+ return;
192
+ }
193
+ const count = await this.vectorManager.rebuildIndex(this.db);
194
+ logger.info(`Scheduled vector index rebuild: ${String(count)} entries indexed`, {
195
+ module: 'Scheduler',
196
+ operation: 'rebuild-index',
197
+ context: { entriesIndexed: count },
198
+ });
199
+ }
200
+ }
201
+ //# sourceMappingURL=Scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Scheduler.js","sourceRoot":"","sources":["../../src/server/Scheduler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Memory Journal MCP Server - HTTP Transport
3
+ *
4
+ * Dual-protocol HTTP transport:
5
+ * - `/mcp` — Streamable HTTP transport (MCP 2025-03-26)
6
+ * - `/sse` + `/messages` — Legacy SSE transport (MCP 2024-11-05)
7
+ *
8
+ * Modes:
9
+ * - Stateful (default): Multi-session management with SSE streaming
10
+ * - Stateless (opt-in): Lightweight serverless-compatible mode
11
+ *
12
+ * Security: headers, CORS, rate limiting, body size enforcement.
13
+ */
14
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
15
+ import type { Scheduler } from '../server/Scheduler.js';
16
+ /**
17
+ * HTTP transport configuration
18
+ */
19
+ export interface HttpTransportConfig {
20
+ port: number;
21
+ host: string;
22
+ corsOrigin: string;
23
+ stateless: boolean;
24
+ authToken?: string;
25
+ }
26
+ /**
27
+ * HTTP Transport for Memory Journal MCP Server
28
+ *
29
+ * Supports two transport protocols simultaneously:
30
+ * 1. Streamable HTTP (MCP 2025-03-26) via `/mcp` — preferred for modern clients
31
+ * 2. Legacy SSE (MCP 2024-11-05) via `/sse` + `/messages` — backward compatibility
32
+ */
33
+ export declare class HttpTransport {
34
+ private readonly app;
35
+ private readonly config;
36
+ private readonly transports;
37
+ private readonly sseTransports;
38
+ private readonly sessionLastActivity;
39
+ private httpServer;
40
+ private sessionSweepTimer;
41
+ constructor(config: HttpTransportConfig);
42
+ /**
43
+ * Initialize and start the HTTP transport
44
+ */
45
+ start(server: McpServer, scheduler: Scheduler | null): Promise<void>;
46
+ /**
47
+ * Graceful shutdown
48
+ */
49
+ stop(scheduler: Scheduler | null): Promise<void>;
50
+ /**
51
+ * Setup stateless transport (single transport, no session management)
52
+ */
53
+ private setupStateless;
54
+ /** Update the last-activity timestamp for a session */
55
+ private touchSession;
56
+ /**
57
+ * Setup stateful transport (multi-session, SSE streaming)
58
+ */
59
+ private setupStateful;
60
+ /**
61
+ * Setup Legacy SSE endpoints for backward compatibility.
62
+ * Stateful mode only.
63
+ */
64
+ private setupLegacySSE;
65
+ }
66
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/transports/http.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAOxE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AASvD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;;;;;GAMG;AACH,qBAAa,aAAa;IACtB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAmD;IAC9E,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAwC;IACtE,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA4B;IAChE,OAAO,CAAC,UAAU,CAA6C;IAC/D,OAAO,CAAC,iBAAiB,CAA8C;gBAE3D,MAAM,EAAE,mBAAmB;IAKvC;;OAEG;IACG,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IA4J1E;;OAEG;IACG,IAAI,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAyDtD;;OAEG;YACW,cAAc;IAwC5B,uDAAuD;IACvD,OAAO,CAAC,YAAY;IAIpB;;OAEG;IACH,OAAO,CAAC,aAAa;IA0MrB;;;OAGG;IACH,OAAO,CAAC,cAAc;CA4FzB"}