memctx 1.0.4 → 1.0.7

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 (47) hide show
  1. package/dashboard/dist/assets/html2canvas.esm-ezMWrafe.js +22 -0
  2. package/dashboard/dist/assets/index-B83_W4qH.css +1 -0
  3. package/dashboard/dist/assets/index-DDN6Gx1_.js +628 -0
  4. package/dashboard/dist/assets/{index.es-Dqk41Tqn.js → index.es-D85_UUf8.js} +15 -2
  5. package/dashboard/dist/assets/{jszip.min-DxDw9jtU.js → jszip.min-CSBY1G_D.js} +11 -1
  6. package/dashboard/dist/assets/purify.es-BgtpMKW3.js +2 -0
  7. package/dashboard/dist/index.html +2 -2
  8. package/dist/src/api/health.js +2 -1
  9. package/dist/src/api/health.js.map +1 -1
  10. package/dist/src/api/hook.js +3 -0
  11. package/dist/src/api/hook.js.map +1 -1
  12. package/dist/src/api/logs.js +3 -2
  13. package/dist/src/api/logs.js.map +1 -1
  14. package/dist/src/api/observations.js +2 -1
  15. package/dist/src/api/observations.js.map +1 -1
  16. package/dist/src/api/resync.js +3 -3
  17. package/dist/src/api/resync.js.map +1 -1
  18. package/dist/src/api/sessions.js +59 -0
  19. package/dist/src/api/sessions.js.map +1 -1
  20. package/dist/src/api/settings.js +3 -2
  21. package/dist/src/api/settings.js.map +1 -1
  22. package/dist/src/db/queries.d.ts +2 -0
  23. package/dist/src/db/queries.js +34 -4
  24. package/dist/src/db/queries.js.map +1 -1
  25. package/dist/src/db/schema.d.ts +1 -1
  26. package/dist/src/db/schema.js +7 -1
  27. package/dist/src/db/schema.js.map +1 -1
  28. package/dist/src/index.js +18 -0
  29. package/dist/src/index.js.map +1 -1
  30. package/dist/src/middleware/rate-limit.d.ts +8 -0
  31. package/dist/src/middleware/rate-limit.js +48 -0
  32. package/dist/src/middleware/rate-limit.js.map +1 -0
  33. package/dist/src/services/activity-tracker.d.ts +7 -0
  34. package/dist/src/services/activity-tracker.js +37 -0
  35. package/dist/src/services/activity-tracker.js.map +1 -0
  36. package/dist/src/services/logger.js +24 -1
  37. package/dist/src/services/logger.js.map +1 -1
  38. package/dist/src/services/project-detector.js +31 -4
  39. package/dist/src/services/project-detector.js.map +1 -1
  40. package/dist/src/services/stale-session-worker.d.ts +11 -0
  41. package/dist/src/services/stale-session-worker.js +90 -0
  42. package/dist/src/services/stale-session-worker.js.map +1 -0
  43. package/package.json +7 -7
  44. package/dashboard/dist/assets/html2canvas.esm-DXEQVQnt.js +0 -5
  45. package/dashboard/dist/assets/index-dFfiO3rw.js +0 -136
  46. package/dashboard/dist/assets/index-gazvDspk.css +0 -1
  47. package/dashboard/dist/assets/purify.es-CovBOfck.js +0 -2
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.staleSessionWorker = exports.StaleSessionWorker = void 0;
4
+ const queries_1 = require("../db/queries");
5
+ const summarization_queue_1 = require("./summarization-queue");
6
+ const broadcast_1 = require("../ws/broadcast");
7
+ const logger_1 = require("./logger");
8
+ class StaleSessionWorker {
9
+ intervalId = null;
10
+ CHECK_INTERVAL = 30 * 60 * 1000; // 30 minutes
11
+ STALE_THRESHOLD = 8 * 60 * 60; // 8 hours
12
+ isRunning = false;
13
+ start() {
14
+ if (this.isRunning) {
15
+ console.log('[StaleSessionWorker] Already running');
16
+ return;
17
+ }
18
+ this.isRunning = true;
19
+ console.log('[StaleSessionWorker] Starting worker');
20
+ // Run immediately on start
21
+ this.checkStaleSessions();
22
+ // Then run every CHECK_INTERVAL
23
+ this.intervalId = setInterval(() => this.checkStaleSessions(), this.CHECK_INTERVAL);
24
+ }
25
+ stop() {
26
+ if (this.intervalId) {
27
+ clearInterval(this.intervalId);
28
+ this.intervalId = null;
29
+ }
30
+ this.isRunning = false;
31
+ console.log('[StaleSessionWorker] Stopped');
32
+ }
33
+ async checkStaleSessions() {
34
+ try {
35
+ const now = Math.floor(Date.now() / 1000);
36
+ const staleThreshold = now - this.STALE_THRESHOLD;
37
+ console.log(`[StaleSessionWorker] Checking for stale sessions (threshold: ${new Date(staleThreshold * 1000).toISOString()})`);
38
+ const staleSessions = queries_1.queries.getStaleSessions(staleThreshold);
39
+ if (staleSessions.length === 0) {
40
+ console.log('[StaleSessionWorker] No stale sessions found');
41
+ return;
42
+ }
43
+ console.log(`[StaleSessionWorker] Found ${staleSessions.length} stale sessions`);
44
+ for (const session of staleSessions) {
45
+ await this.endStaleSession(session);
46
+ }
47
+ }
48
+ catch (error) {
49
+ logger_1.logger.error('StaleSessionWorker', 'Check failed', { error: error.message });
50
+ console.error('[StaleSessionWorker] Error:', error);
51
+ }
52
+ }
53
+ async endStaleSession(session) {
54
+ try {
55
+ console.log(`[StaleSessionWorker] Auto-ending session ${session.id.slice(0, 8)}`);
56
+ // Mark as completed and auto-ended
57
+ queries_1.queries.updateSession(session.id, {
58
+ status: 'completed',
59
+ ended_at: session.last_activity || Math.floor(Date.now() / 1000),
60
+ auto_ended: 1
61
+ });
62
+ // Queue for summarization
63
+ if (session.transcript_path) {
64
+ console.log(`[StaleSessionWorker] Queuing summarization for ${session.id.slice(0, 8)}`);
65
+ summarization_queue_1.summarizationQueue.enqueue({
66
+ sessionId: session.id,
67
+ transcriptPath: session.transcript_path,
68
+ projectId: session.project_id,
69
+ priority: 'normal'
70
+ });
71
+ }
72
+ // Broadcast event
73
+ (0, broadcast_1.broadcast)({
74
+ type: 'session_auto_ended',
75
+ session_id: session.id
76
+ });
77
+ logger_1.logger.info('StaleSessionWorker', `Auto-ended session ${session.id}`, {
78
+ last_activity: session.last_activity,
79
+ project_id: session.project_id
80
+ });
81
+ }
82
+ catch (error) {
83
+ logger_1.logger.error('StaleSessionWorker', `Failed to end session ${session.id}`, { error: error.message });
84
+ console.error(`[StaleSessionWorker] Failed to end session ${session.id}:`, error);
85
+ }
86
+ }
87
+ }
88
+ exports.StaleSessionWorker = StaleSessionWorker;
89
+ exports.staleSessionWorker = new StaleSessionWorker();
90
+ //# sourceMappingURL=stale-session-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stale-session-worker.js","sourceRoot":"","sources":["../../../src/services/stale-session-worker.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "memctx",
3
- "version": "1.0.4",
3
+ "version": "1.0.7",
4
4
  "description": "Autonomous session memory for Claude Code - automatically captures, analyzes, and summarizes your development sessions",
5
5
  "author": "Fahad Aziz Qureshi <info@memctx.dev> (https://memctx.dev)",
6
6
  "license": "MIT",
@@ -49,19 +49,19 @@
49
49
  "typecheck": "tsc -p tsconfig.json --noEmit"
50
50
  },
51
51
  "dependencies": {
52
- "@anthropic-ai/sdk": "^0.26.0",
52
+ "@anthropic-ai/sdk": "^0.82.0",
53
53
  "@types/better-sqlite3": "^7.6.13",
54
54
  "better-sqlite3": "^12.8.0",
55
- "chokidar": "^3.6.0",
56
- "express": "^4.19.2",
57
- "p-queue": "^8.0.1",
55
+ "chokidar": "^5.0.0",
56
+ "express": "^5.2.1",
57
+ "p-queue": "^9.1.2",
58
58
  "ws": "^8.17.0"
59
59
  },
60
60
  "devDependencies": {
61
- "@types/express": "^4.17.21",
61
+ "@types/express": "^5.0.6",
62
62
  "@types/node": "^20.12.0",
63
63
  "@types/ws": "^8.5.10",
64
64
  "tsx": "catalog:",
65
- "typescript": "~5.9.2"
65
+ "typescript": "~6.0.2"
66
66
  }
67
67
  }