memctx 1.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 (151) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +289 -0
  3. package/dist/bin/claudectx.d.ts +2 -0
  4. package/dist/bin/claudectx.js +304 -0
  5. package/dist/bin/claudectx.js.map +1 -0
  6. package/dist/installer/daemon.d.ts +3 -0
  7. package/dist/installer/daemon.js +80 -0
  8. package/dist/installer/daemon.js.map +1 -0
  9. package/dist/installer/patch-settings.d.ts +2 -0
  10. package/dist/installer/patch-settings.js +83 -0
  11. package/dist/installer/patch-settings.js.map +1 -0
  12. package/dist/src/api/consolidate.d.ts +3 -0
  13. package/dist/src/api/consolidate.js +29 -0
  14. package/dist/src/api/consolidate.js.map +1 -0
  15. package/dist/src/api/context.d.ts +1 -0
  16. package/dist/src/api/context.js +26 -0
  17. package/dist/src/api/context.js.map +1 -0
  18. package/dist/src/api/force-end-session.d.ts +2 -0
  19. package/dist/src/api/force-end-session.js +60 -0
  20. package/dist/src/api/force-end-session.js.map +1 -0
  21. package/dist/src/api/health.d.ts +1 -0
  22. package/dist/src/api/health.js +27 -0
  23. package/dist/src/api/health.js.map +1 -0
  24. package/dist/src/api/hook.d.ts +2 -0
  25. package/dist/src/api/hook.js +187 -0
  26. package/dist/src/api/hook.js.map +1 -0
  27. package/dist/src/api/logs.d.ts +2 -0
  28. package/dist/src/api/logs.js +66 -0
  29. package/dist/src/api/logs.js.map +1 -0
  30. package/dist/src/api/memory.d.ts +2 -0
  31. package/dist/src/api/memory.js +93 -0
  32. package/dist/src/api/memory.js.map +1 -0
  33. package/dist/src/api/metrics.d.ts +3 -0
  34. package/dist/src/api/metrics.js +58 -0
  35. package/dist/src/api/metrics.js.map +1 -0
  36. package/dist/src/api/observations.d.ts +1 -0
  37. package/dist/src/api/observations.js +31 -0
  38. package/dist/src/api/observations.js.map +1 -0
  39. package/dist/src/api/projects.d.ts +1 -0
  40. package/dist/src/api/projects.js +29 -0
  41. package/dist/src/api/projects.js.map +1 -0
  42. package/dist/src/api/resync.d.ts +3 -0
  43. package/dist/src/api/resync.js +188 -0
  44. package/dist/src/api/resync.js.map +1 -0
  45. package/dist/src/api/search.d.ts +1 -0
  46. package/dist/src/api/search.js +36 -0
  47. package/dist/src/api/search.js.map +1 -0
  48. package/dist/src/api/sessions.d.ts +1 -0
  49. package/dist/src/api/sessions.js +137 -0
  50. package/dist/src/api/sessions.js.map +1 -0
  51. package/dist/src/api/settings.d.ts +2 -0
  52. package/dist/src/api/settings.js +90 -0
  53. package/dist/src/api/settings.js.map +1 -0
  54. package/dist/src/api/tags.d.ts +1 -0
  55. package/dist/src/api/tags.js +89 -0
  56. package/dist/src/api/tags.js.map +1 -0
  57. package/dist/src/config.d.ts +17 -0
  58. package/dist/src/config.js +39 -0
  59. package/dist/src/config.js.map +1 -0
  60. package/dist/src/db/client.d.ts +3 -0
  61. package/dist/src/db/client.js +38 -0
  62. package/dist/src/db/client.js.map +1 -0
  63. package/dist/src/db/migrate.d.ts +1 -0
  64. package/dist/src/db/migrate.js +56 -0
  65. package/dist/src/db/migrate.js.map +1 -0
  66. package/dist/src/db/migrations/001_add_memory_tables.sql +149 -0
  67. package/dist/src/db/migrations/002_add_project_id_to_memory.sql +25 -0
  68. package/dist/src/db/migrations/003_enhance_sessions_schema.sql +27 -0
  69. package/dist/src/db/migrations/004_add_bookmarks.sql +5 -0
  70. package/dist/src/db/migrations/005_add_tags.sql +21 -0
  71. package/dist/src/db/migrations/006_add_notes.sql +2 -0
  72. package/dist/src/db/migrations/007_add_archived.sql +2 -0
  73. package/dist/src/db/queries.d.ts +104 -0
  74. package/dist/src/db/queries.js +432 -0
  75. package/dist/src/db/queries.js.map +1 -0
  76. package/dist/src/db/schema.d.ts +1 -0
  77. package/dist/src/db/schema.js +81 -0
  78. package/dist/src/db/schema.js.map +1 -0
  79. package/dist/src/hooks/post-tool-use.d.ts +1 -0
  80. package/dist/src/hooks/post-tool-use.js +23 -0
  81. package/dist/src/hooks/post-tool-use.js.map +1 -0
  82. package/dist/src/hooks/pre-compact.d.ts +1 -0
  83. package/dist/src/hooks/pre-compact.js +18 -0
  84. package/dist/src/hooks/pre-compact.js.map +1 -0
  85. package/dist/src/hooks/session-end.d.ts +1 -0
  86. package/dist/src/hooks/session-end.js +20 -0
  87. package/dist/src/hooks/session-end.js.map +1 -0
  88. package/dist/src/hooks/session-start.d.ts +1 -0
  89. package/dist/src/hooks/session-start.js +32 -0
  90. package/dist/src/hooks/session-start.js.map +1 -0
  91. package/dist/src/hooks/stop.d.ts +1 -0
  92. package/dist/src/hooks/stop.js +22 -0
  93. package/dist/src/hooks/stop.js.map +1 -0
  94. package/dist/src/hooks/user-prompt-submit.d.ts +1 -0
  95. package/dist/src/hooks/user-prompt-submit.js +18 -0
  96. package/dist/src/hooks/user-prompt-submit.js.map +1 -0
  97. package/dist/src/hooks/utils.d.ts +3 -0
  98. package/dist/src/hooks/utils.js +96 -0
  99. package/dist/src/hooks/utils.js.map +1 -0
  100. package/dist/src/index.d.ts +1 -0
  101. package/dist/src/index.js +92 -0
  102. package/dist/src/index.js.map +1 -0
  103. package/dist/src/services/auto-summarizer.d.ts +5 -0
  104. package/dist/src/services/auto-summarizer.js +50 -0
  105. package/dist/src/services/auto-summarizer.js.map +1 -0
  106. package/dist/src/services/claude-md-updater.d.ts +1 -0
  107. package/dist/src/services/claude-md-updater.js +43 -0
  108. package/dist/src/services/claude-md-updater.js.map +1 -0
  109. package/dist/src/services/context-builder.d.ts +1 -0
  110. package/dist/src/services/context-builder.js +97 -0
  111. package/dist/src/services/context-builder.js.map +1 -0
  112. package/dist/src/services/fuzzy-task-matcher.d.ts +37 -0
  113. package/dist/src/services/fuzzy-task-matcher.js +96 -0
  114. package/dist/src/services/fuzzy-task-matcher.js.map +1 -0
  115. package/dist/src/services/logger.d.ts +20 -0
  116. package/dist/src/services/logger.js +43 -0
  117. package/dist/src/services/logger.js.map +1 -0
  118. package/dist/src/services/memory-consolidator.d.ts +32 -0
  119. package/dist/src/services/memory-consolidator.js +192 -0
  120. package/dist/src/services/memory-consolidator.js.map +1 -0
  121. package/dist/src/services/memory-decay.d.ts +16 -0
  122. package/dist/src/services/memory-decay.js +79 -0
  123. package/dist/src/services/memory-decay.js.map +1 -0
  124. package/dist/src/services/metrics.d.ts +58 -0
  125. package/dist/src/services/metrics.js +100 -0
  126. package/dist/src/services/metrics.js.map +1 -0
  127. package/dist/src/services/project-detector.d.ts +5 -0
  128. package/dist/src/services/project-detector.js +43 -0
  129. package/dist/src/services/project-detector.js.map +1 -0
  130. package/dist/src/services/queue.d.ts +2 -0
  131. package/dist/src/services/queue.js +16 -0
  132. package/dist/src/services/queue.js.map +1 -0
  133. package/dist/src/services/session-timeout.d.ts +1 -0
  134. package/dist/src/services/session-timeout.js +50 -0
  135. package/dist/src/services/session-timeout.js.map +1 -0
  136. package/dist/src/services/summarization-queue.d.ts +43 -0
  137. package/dist/src/services/summarization-queue.js +150 -0
  138. package/dist/src/services/summarization-queue.js.map +1 -0
  139. package/dist/src/services/summarizer.d.ts +2 -0
  140. package/dist/src/services/summarizer.js +239 -0
  141. package/dist/src/services/summarizer.js.map +1 -0
  142. package/dist/src/services/transcript-reader.d.ts +9 -0
  143. package/dist/src/services/transcript-reader.js +50 -0
  144. package/dist/src/services/transcript-reader.js.map +1 -0
  145. package/dist/src/services/watcher.d.ts +1 -0
  146. package/dist/src/services/watcher.js +34 -0
  147. package/dist/src/services/watcher.js.map +1 -0
  148. package/dist/src/ws/broadcast.d.ts +3 -0
  149. package/dist/src/ws/broadcast.js +24 -0
  150. package/dist/src/ws/broadcast.js.map +1 -0
  151. package/package.json +66 -0
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ /**
3
+ * Metrics Tracking System
4
+ * Tracks performance and usage metrics
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.metricsTracker = exports.MetricsTracker = void 0;
8
+ class MetricsTracker {
9
+ metrics = {
10
+ summarizations: {
11
+ total: 0,
12
+ successful: 0,
13
+ failed: 0,
14
+ avgDuration: 0
15
+ },
16
+ sessions: {
17
+ total: 0,
18
+ active: 0,
19
+ completed: 0
20
+ },
21
+ memory: {
22
+ preferences: 0,
23
+ knowledge: 0,
24
+ patterns: 0,
25
+ tasks: 0
26
+ },
27
+ queue: {
28
+ high: 0,
29
+ normal: 0,
30
+ low: 0
31
+ }
32
+ };
33
+ summarizationDurations = [];
34
+ /**
35
+ * Record summarization attempt
36
+ */
37
+ recordSummarization(success, duration) {
38
+ this.metrics.summarizations.total++;
39
+ if (success) {
40
+ this.metrics.summarizations.successful++;
41
+ this.summarizationDurations.push(duration);
42
+ // Keep only last 100 durations for average
43
+ if (this.summarizationDurations.length > 100) {
44
+ this.summarizationDurations.shift();
45
+ }
46
+ // Calculate average
47
+ const sum = this.summarizationDurations.reduce((a, b) => a + b, 0);
48
+ this.metrics.summarizations.avgDuration = Math.round(sum / this.summarizationDurations.length);
49
+ }
50
+ else {
51
+ this.metrics.summarizations.failed++;
52
+ }
53
+ }
54
+ /**
55
+ * Update session counts
56
+ */
57
+ updateSessionCounts(total, active, completed) {
58
+ this.metrics.sessions.total = total;
59
+ this.metrics.sessions.active = active;
60
+ this.metrics.sessions.completed = completed;
61
+ }
62
+ /**
63
+ * Update memory counts
64
+ */
65
+ updateMemoryCounts(preferences, knowledge, patterns, tasks) {
66
+ this.metrics.memory.preferences = preferences;
67
+ this.metrics.memory.knowledge = knowledge;
68
+ this.metrics.memory.patterns = patterns;
69
+ this.metrics.memory.tasks = tasks;
70
+ }
71
+ /**
72
+ * Update queue counts
73
+ */
74
+ updateQueueCounts(high, normal, low) {
75
+ this.metrics.queue.high = high;
76
+ this.metrics.queue.normal = normal;
77
+ this.metrics.queue.low = low;
78
+ }
79
+ /**
80
+ * Get all metrics
81
+ */
82
+ getMetrics() {
83
+ return { ...this.metrics };
84
+ }
85
+ /**
86
+ * Reset metrics
87
+ */
88
+ reset() {
89
+ this.metrics = {
90
+ summarizations: { total: 0, successful: 0, failed: 0, avgDuration: 0 },
91
+ sessions: { total: 0, active: 0, completed: 0 },
92
+ memory: { preferences: 0, knowledge: 0, patterns: 0, tasks: 0 },
93
+ queue: { high: 0, normal: 0, low: 0 }
94
+ };
95
+ this.summarizationDurations = [];
96
+ }
97
+ }
98
+ exports.MetricsTracker = MetricsTracker;
99
+ exports.metricsTracker = new MetricsTracker();
100
+ //# sourceMappingURL=metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../../src/services/metrics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function detectProject(cwd: string): Promise<{
2
+ id: string;
3
+ name: string;
4
+ root_path: string;
5
+ }>;
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.detectProject = detectProject;
7
+ const crypto_1 = require("crypto");
8
+ const child_process_1 = require("child_process");
9
+ const path_1 = __importDefault(require("path"));
10
+ const queries_1 = require("../db/queries");
11
+ async function detectProject(cwd) {
12
+ let rootPath = cwd;
13
+ let gitRemote = null;
14
+ try {
15
+ const gitRoot = (0, child_process_1.execSync)('git rev-parse --show-toplevel', {
16
+ cwd,
17
+ encoding: 'utf8',
18
+ stdio: ['pipe', 'pipe', 'pipe']
19
+ }).trim();
20
+ rootPath = gitRoot;
21
+ try {
22
+ gitRemote = (0, child_process_1.execSync)('git remote get-url origin', {
23
+ cwd: gitRoot,
24
+ encoding: 'utf8',
25
+ stdio: ['pipe', 'pipe', 'pipe']
26
+ }).trim();
27
+ }
28
+ catch { }
29
+ }
30
+ catch {
31
+ // Not a git repo — use cwd
32
+ }
33
+ const projectId = (0, crypto_1.createHash)('sha256').update(rootPath).digest('hex').slice(0, 16);
34
+ const projectName = path_1.default.basename(rootPath);
35
+ queries_1.queries.upsertProject({
36
+ id: projectId,
37
+ name: projectName,
38
+ root_path: rootPath,
39
+ git_remote: gitRemote
40
+ });
41
+ return { id: projectId, name: projectName, root_path: rootPath };
42
+ }
43
+ //# sourceMappingURL=project-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-detector.js","sourceRoot":"","sources":["../../../src/services/project-detector.ts"],"names":[],"mappings":";;;;;AAKA,sCAkCC;AAvCD,mCAAmC;AACnC,iDAAwC;AACxC,gDAAuB;AACvB,2CAAuC;AAEhC,KAAK,UAAU,aAAa,CAAC,GAAW;IAC7C,IAAI,QAAQ,GAAG,GAAG,CAAA;IAClB,IAAI,SAAS,GAAkB,IAAI,CAAA;IAEnC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAA,wBAAQ,EAAC,+BAA+B,EAAE;YACxD,GAAG;YACH,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC,IAAI,EAAE,CAAA;QACT,QAAQ,GAAG,OAAO,CAAA;QAElB,IAAI,CAAC;YACH,SAAS,GAAG,IAAA,wBAAQ,EAAC,2BAA2B,EAAE;gBAChD,GAAG,EAAE,OAAO;gBACZ,QAAQ,EAAE,MAAM;gBAChB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;aAChC,CAAC,CAAC,IAAI,EAAE,CAAA;QACX,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,2BAA2B;IAC7B,CAAC;IAED,MAAM,SAAS,GAAG,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAClF,MAAM,WAAW,GAAG,cAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAE3C,iBAAO,CAAC,aAAa,CAAC;QACpB,EAAE,EAAE,SAAS;QACb,IAAI,EAAE,WAAW;QACjB,SAAS,EAAE,QAAQ;QACnB,UAAU,EAAE,SAAS;KACtB,CAAC,CAAA;IAEF,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAA;AAClE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function enqueue<T>(fn: () => Promise<T>): Promise<T>;
2
+ export declare function getQueueSize(): number;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.enqueue = enqueue;
7
+ exports.getQueueSize = getQueueSize;
8
+ const p_queue_1 = __importDefault(require("p-queue"));
9
+ const queue = new p_queue_1.default({ concurrency: 1 });
10
+ function enqueue(fn) {
11
+ return queue.add(fn);
12
+ }
13
+ function getQueueSize() {
14
+ return queue.size + queue.pending;
15
+ }
16
+ //# sourceMappingURL=queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.js","sourceRoot":"","sources":["../../../src/services/queue.ts"],"names":[],"mappings":";;;;;AAIA,0BAEC;AAED,oCAEC;AAVD,sDAA4B;AAE5B,MAAM,KAAK,GAAG,IAAI,iBAAM,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAA;AAE5C,SAAgB,OAAO,CAAI,EAAoB;IAC7C,OAAO,KAAK,CAAC,GAAG,CAAC,EAAE,CAAe,CAAA;AACpC,CAAC;AAED,SAAgB,YAAY;IAC1B,OAAO,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,OAAO,CAAA;AACnC,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function startSessionTimeoutChecker(): void;
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.startSessionTimeoutChecker = startSessionTimeoutChecker;
4
+ const queries_1 = require("../db/queries");
5
+ const broadcast_1 = require("../ws/broadcast");
6
+ const logger_1 = require("./logger");
7
+ const summarization_queue_1 = require("./summarization-queue");
8
+ const INACTIVITY_TIMEOUT = 5 * 60; // 5 minutes in seconds
9
+ function startSessionTimeoutChecker() {
10
+ setInterval(() => {
11
+ try {
12
+ const now = Math.floor(Date.now() / 1000);
13
+ const cutoff = now - INACTIVITY_TIMEOUT;
14
+ // Find active sessions with no recent activity
15
+ const activeSessions = queries_1.queries.getActiveSessions();
16
+ for (const session of activeSessions) {
17
+ const lastActivity = session.last_activity || session.started_at;
18
+ if (lastActivity < cutoff) {
19
+ console.log(`[SessionTimeout] Marking inactive session as completed: ${session.id.slice(0, 8)}`);
20
+ console.log(`[SessionTimeout] Last activity: ${new Date(lastActivity * 1000).toISOString()}`);
21
+ queries_1.queries.updateSession(session.id, {
22
+ ended_at: lastActivity + 60, // Mark as ended 1 minute after last activity
23
+ status: 'completed'
24
+ });
25
+ (0, broadcast_1.broadcast)({
26
+ type: 'session_end',
27
+ session_id: session.id,
28
+ reason: 'inactivity_timeout'
29
+ });
30
+ // Queue for summarization if transcript exists
31
+ if (session.transcript_path) {
32
+ console.log(`[SessionTimeout] Queuing summarization for: ${session.id.slice(0, 8)}`);
33
+ summarization_queue_1.summarizationQueue.enqueue({
34
+ sessionId: session.id,
35
+ transcriptPath: session.transcript_path,
36
+ projectId: session.project_id,
37
+ priority: 'normal'
38
+ });
39
+ }
40
+ logger_1.logger.info('SessionTimeout', `Session ${session.id} marked as completed due to inactivity`);
41
+ }
42
+ }
43
+ }
44
+ catch (err) {
45
+ console.error('[SessionTimeout] Error checking inactive sessions:', err);
46
+ }
47
+ }, 60 * 1000); // Check every minute
48
+ console.log('[SessionTimeout] Session timeout checker started (5 minute inactivity threshold)');
49
+ }
50
+ //# sourceMappingURL=session-timeout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-timeout.js","sourceRoot":"","sources":["../../../src/services/session-timeout.ts"],"names":[],"mappings":";;AAOA,gEA+CC;AAtDD,2CAAuC;AACvC,+CAA2C;AAC3C,qCAAiC;AACjC,+DAA0D;AAE1D,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,CAAA,CAAC,uBAAuB;AAEzD,SAAgB,0BAA0B;IACxC,WAAW,CAAC,GAAG,EAAE;QACf,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAA;YACzC,MAAM,MAAM,GAAG,GAAG,GAAG,kBAAkB,CAAA;YAEvC,+CAA+C;YAC/C,MAAM,cAAc,GAAG,iBAAO,CAAC,iBAAiB,EAAE,CAAA;YAElD,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;gBACrC,MAAM,YAAY,GAAG,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,UAAU,CAAA;gBAEhE,IAAI,YAAY,GAAG,MAAM,EAAE,CAAC;oBAC1B,OAAO,CAAC,GAAG,CAAC,2DAA2D,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAA;oBAChG,OAAO,CAAC,GAAG,CAAC,mCAAmC,IAAI,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;oBAE7F,iBAAO,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,EAAE;wBAChC,QAAQ,EAAE,YAAY,GAAG,EAAE,EAAE,6CAA6C;wBAC1E,MAAM,EAAE,WAAW;qBACpB,CAAC,CAAA;oBAEF,IAAA,qBAAS,EAAC;wBACR,IAAI,EAAE,aAAa;wBACnB,UAAU,EAAE,OAAO,CAAC,EAAE;wBACtB,MAAM,EAAE,oBAAoB;qBAC7B,CAAC,CAAA;oBAEF,+CAA+C;oBAC/C,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;wBAC5B,OAAO,CAAC,GAAG,CAAC,+CAA+C,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAA;wBACpF,wCAAkB,CAAC,OAAO,CAAC;4BACzB,SAAS,EAAE,OAAO,CAAC,EAAE;4BACrB,cAAc,EAAE,OAAO,CAAC,eAAe;4BACvC,SAAS,EAAE,OAAO,CAAC,UAAU;4BAC7B,QAAQ,EAAE,QAAQ;yBACnB,CAAC,CAAA;oBACJ,CAAC;oBAED,eAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,WAAW,OAAO,CAAC,EAAE,wCAAwC,CAAC,CAAA;gBAC9F,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,oDAAoD,EAAE,GAAG,CAAC,CAAA;QAC1E,CAAC;IACH,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,CAAA,CAAC,qBAAqB;IAEnC,OAAO,CAAC,GAAG,CAAC,kFAAkF,CAAC,CAAA;AACjG,CAAC"}
@@ -0,0 +1,43 @@
1
+ interface SummarizationJob {
2
+ sessionId: string;
3
+ transcriptPath: string;
4
+ projectId: string;
5
+ priority: 'high' | 'normal' | 'low';
6
+ attempts: number;
7
+ createdAt: number;
8
+ }
9
+ /**
10
+ * Priority Queue for Summarization Jobs
11
+ * Manages job scheduling with retry logic
12
+ */
13
+ export declare class SummarizationQueue {
14
+ private highPriorityQueue;
15
+ private normalPriorityQueue;
16
+ private lowPriorityQueue;
17
+ private processing;
18
+ private maxRetries;
19
+ private retryDelays;
20
+ /**
21
+ * Add job to appropriate queue
22
+ */
23
+ enqueue(job: Omit<SummarizationJob, 'attempts' | 'createdAt'>): void;
24
+ /**
25
+ * Get next job from highest priority queue
26
+ */
27
+ private dequeue;
28
+ /**
29
+ * Process next job in queue
30
+ */
31
+ private processNext;
32
+ /**
33
+ * Get queue stats
34
+ */
35
+ getStats(): {
36
+ high: number;
37
+ normal: number;
38
+ low: number;
39
+ processing: boolean;
40
+ };
41
+ }
42
+ export declare const summarizationQueue: SummarizationQueue;
43
+ export {};
@@ -0,0 +1,150 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.summarizationQueue = exports.SummarizationQueue = void 0;
37
+ const queries_1 = require("../db/queries");
38
+ /**
39
+ * Priority Queue for Summarization Jobs
40
+ * Manages job scheduling with retry logic
41
+ */
42
+ class SummarizationQueue {
43
+ highPriorityQueue = [];
44
+ normalPriorityQueue = [];
45
+ lowPriorityQueue = [];
46
+ processing = false;
47
+ maxRetries = 3;
48
+ retryDelays = [5000, 15000, 60000]; // 5s, 15s, 60s
49
+ /**
50
+ * Add job to appropriate queue
51
+ */
52
+ enqueue(job) {
53
+ const fullJob = {
54
+ ...job,
55
+ attempts: 0,
56
+ createdAt: Date.now()
57
+ };
58
+ switch (job.priority) {
59
+ case 'high':
60
+ this.highPriorityQueue.push(fullJob);
61
+ break;
62
+ case 'low':
63
+ this.lowPriorityQueue.push(fullJob);
64
+ break;
65
+ default:
66
+ this.normalPriorityQueue.push(fullJob);
67
+ }
68
+ console.log(`[Queue] Enqueued ${job.priority} priority job for session ${job.sessionId}`);
69
+ this.processNext();
70
+ }
71
+ /**
72
+ * Get next job from highest priority queue
73
+ */
74
+ dequeue() {
75
+ if (this.highPriorityQueue.length > 0) {
76
+ return this.highPriorityQueue.shift();
77
+ }
78
+ if (this.normalPriorityQueue.length > 0) {
79
+ return this.normalPriorityQueue.shift();
80
+ }
81
+ if (this.lowPriorityQueue.length > 0) {
82
+ return this.lowPriorityQueue.shift();
83
+ }
84
+ return null;
85
+ }
86
+ /**
87
+ * Process next job in queue
88
+ */
89
+ async processNext() {
90
+ if (this.processing)
91
+ return;
92
+ const job = this.dequeue();
93
+ if (!job)
94
+ return;
95
+ this.processing = true;
96
+ try {
97
+ console.log(`[Queue] Processing job for session ${job.sessionId} (attempt ${job.attempts + 1}/${this.maxRetries})`);
98
+ // Import here to avoid circular dependency
99
+ const { summarizeSession } = await Promise.resolve().then(() => __importStar(require('./summarizer')));
100
+ await summarizeSession(job.sessionId, job.transcriptPath, job.projectId);
101
+ console.log(`[Queue] Successfully processed session ${job.sessionId}`);
102
+ }
103
+ catch (error) {
104
+ console.error(`[Queue] Job failed for session ${job.sessionId}:`, error.message);
105
+ // Retry logic
106
+ if (job.attempts < this.maxRetries - 1) {
107
+ job.attempts++;
108
+ const delay = this.retryDelays[job.attempts - 1] || this.retryDelays[this.retryDelays.length - 1];
109
+ console.log(`[Queue] Retrying session ${job.sessionId} in ${delay}ms (attempt ${job.attempts + 1}/${this.maxRetries})`);
110
+ setTimeout(() => {
111
+ // Re-enqueue with same priority
112
+ switch (job.priority) {
113
+ case 'high':
114
+ this.highPriorityQueue.push(job);
115
+ break;
116
+ case 'low':
117
+ this.lowPriorityQueue.push(job);
118
+ break;
119
+ default:
120
+ this.normalPriorityQueue.push(job);
121
+ }
122
+ this.processing = false;
123
+ this.processNext();
124
+ }, delay);
125
+ return;
126
+ }
127
+ else {
128
+ console.error(`[Queue] Max retries reached for session ${job.sessionId}, giving up`);
129
+ // Mark session as completed even if summarization failed
130
+ queries_1.queries.updateSession(job.sessionId, { status: 'completed' });
131
+ }
132
+ }
133
+ this.processing = false;
134
+ this.processNext();
135
+ }
136
+ /**
137
+ * Get queue stats
138
+ */
139
+ getStats() {
140
+ return {
141
+ high: this.highPriorityQueue.length,
142
+ normal: this.normalPriorityQueue.length,
143
+ low: this.lowPriorityQueue.length,
144
+ processing: this.processing
145
+ };
146
+ }
147
+ }
148
+ exports.SummarizationQueue = SummarizationQueue;
149
+ exports.summarizationQueue = new SummarizationQueue();
150
+ //# sourceMappingURL=summarization-queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summarization-queue.js","sourceRoot":"","sources":["../../../src/services/summarization-queue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function summarizeSession(sessionId: string, transcriptPath: string, projectId: string): Promise<void>;
2
+ export declare function snapshotSession(sessionId: string, transcriptPath: string, projectId: string): Promise<void>;