claudia-orchestrator 0.1.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.
- package/LICENSE +201 -0
- package/README.md +109 -0
- package/dist/cli-parser.d.ts +11 -0
- package/dist/cli-parser.d.ts.map +1 -0
- package/dist/cli-parser.js +57 -0
- package/dist/cli-parser.js.map +1 -0
- package/dist/cui-server.d.ts +69 -0
- package/dist/cui-server.d.ts.map +1 -0
- package/dist/cui-server.js +705 -0
- package/dist/cui-server.js.map +1 -0
- package/dist/mcp-server/claudia-tools.d.ts +15 -0
- package/dist/mcp-server/claudia-tools.d.ts.map +1 -0
- package/dist/mcp-server/claudia-tools.js +366 -0
- package/dist/mcp-server/claudia-tools.js.map +1 -0
- package/dist/mcp-server/index.d.ts +3 -0
- package/dist/mcp-server/index.d.ts.map +1 -0
- package/dist/mcp-server/index.js +176 -0
- package/dist/mcp-server/index.js.map +1 -0
- package/dist/middleware/auth.d.ts +18 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +136 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/cors-setup.d.ts +7 -0
- package/dist/middleware/cors-setup.d.ts.map +1 -0
- package/dist/middleware/cors-setup.js +8 -0
- package/dist/middleware/cors-setup.js.map +1 -0
- package/dist/middleware/error-handler.d.ts +4 -0
- package/dist/middleware/error-handler.d.ts.map +1 -0
- package/dist/middleware/error-handler.js +27 -0
- package/dist/middleware/error-handler.js.map +1 -0
- package/dist/middleware/query-parser.d.ts +11 -0
- package/dist/middleware/query-parser.d.ts.map +1 -0
- package/dist/middleware/query-parser.js +68 -0
- package/dist/middleware/query-parser.js.map +1 -0
- package/dist/middleware/request-logger.d.ts +4 -0
- package/dist/middleware/request-logger.d.ts.map +1 -0
- package/dist/middleware/request-logger.js +29 -0
- package/dist/middleware/request-logger.js.map +1 -0
- package/dist/process-daemon/index.d.ts +14 -0
- package/dist/process-daemon/index.d.ts.map +1 -0
- package/dist/process-daemon/index.js +51 -0
- package/dist/process-daemon/index.js.map +1 -0
- package/dist/process-daemon/process-daemon.d.ts +78 -0
- package/dist/process-daemon/process-daemon.d.ts.map +1 -0
- package/dist/process-daemon/process-daemon.js +568 -0
- package/dist/process-daemon/process-daemon.js.map +1 -0
- package/dist/process-daemon/process-manager-client.d.ts +108 -0
- package/dist/process-daemon/process-manager-client.d.ts.map +1 -0
- package/dist/process-daemon/process-manager-client.js +314 -0
- package/dist/process-daemon/process-manager-client.js.map +1 -0
- package/dist/process-daemon/process-manager-interface.d.ts +47 -0
- package/dist/process-daemon/process-manager-interface.d.ts.map +1 -0
- package/dist/process-daemon/process-manager-interface.js +8 -0
- package/dist/process-daemon/process-manager-interface.js.map +1 -0
- package/dist/process-daemon/test-daemon.d.ts +12 -0
- package/dist/process-daemon/test-daemon.d.ts.map +1 -0
- package/dist/process-daemon/test-daemon.js +81 -0
- package/dist/process-daemon/test-daemon.js.map +1 -0
- package/dist/process-daemon/types.d.ts +85 -0
- package/dist/process-daemon/types.d.ts.map +1 -0
- package/dist/process-daemon/types.js +8 -0
- package/dist/process-daemon/types.js.map +1 -0
- package/dist/routes/claudia.routes.d.ts +10 -0
- package/dist/routes/claudia.routes.d.ts.map +1 -0
- package/dist/routes/claudia.routes.js +123 -0
- package/dist/routes/claudia.routes.js.map +1 -0
- package/dist/routes/config.routes.d.ts +4 -0
- package/dist/routes/config.routes.d.ts.map +1 -0
- package/dist/routes/config.routes.js +27 -0
- package/dist/routes/config.routes.js.map +1 -0
- package/dist/routes/conversation.routes.d.ts +8 -0
- package/dist/routes/conversation.routes.d.ts.map +1 -0
- package/dist/routes/conversation.routes.js +870 -0
- package/dist/routes/conversation.routes.js.map +1 -0
- package/dist/routes/filesystem.routes.d.ts +4 -0
- package/dist/routes/filesystem.routes.d.ts.map +1 -0
- package/dist/routes/filesystem.routes.js +86 -0
- package/dist/routes/filesystem.routes.js.map +1 -0
- package/dist/routes/gemini.routes.d.ts +4 -0
- package/dist/routes/gemini.routes.d.ts.map +1 -0
- package/dist/routes/gemini.routes.js +93 -0
- package/dist/routes/gemini.routes.js.map +1 -0
- package/dist/routes/insights.routes.d.ts +17 -0
- package/dist/routes/insights.routes.d.ts.map +1 -0
- package/dist/routes/insights.routes.js +417 -0
- package/dist/routes/insights.routes.js.map +1 -0
- package/dist/routes/license.routes.d.ts +3 -0
- package/dist/routes/license.routes.d.ts.map +1 -0
- package/dist/routes/license.routes.js +111 -0
- package/dist/routes/license.routes.js.map +1 -0
- package/dist/routes/log.routes.d.ts +3 -0
- package/dist/routes/log.routes.d.ts.map +1 -0
- package/dist/routes/log.routes.js +65 -0
- package/dist/routes/log.routes.js.map +1 -0
- package/dist/routes/notifications.routes.d.ts +4 -0
- package/dist/routes/notifications.routes.d.ts.map +1 -0
- package/dist/routes/notifications.routes.js +71 -0
- package/dist/routes/notifications.routes.js.map +1 -0
- package/dist/routes/permission.routes.d.ts +4 -0
- package/dist/routes/permission.routes.d.ts.map +1 -0
- package/dist/routes/permission.routes.js +116 -0
- package/dist/routes/permission.routes.js.map +1 -0
- package/dist/routes/question.routes.d.ts +8 -0
- package/dist/routes/question.routes.d.ts.map +1 -0
- package/dist/routes/question.routes.js +82 -0
- package/dist/routes/question.routes.js.map +1 -0
- package/dist/routes/streaming.routes.d.ts +4 -0
- package/dist/routes/streaming.routes.d.ts.map +1 -0
- package/dist/routes/streaming.routes.js +28 -0
- package/dist/routes/streaming.routes.js.map +1 -0
- package/dist/routes/system.routes.d.ts +5 -0
- package/dist/routes/system.routes.d.ts.map +1 -0
- package/dist/routes/system.routes.js +103 -0
- package/dist/routes/system.routes.js.map +1 -0
- package/dist/routes/working-directories.routes.d.ts +4 -0
- package/dist/routes/working-directories.routes.d.ts.map +1 -0
- package/dist/routes/working-directories.routes.js +25 -0
- package/dist/routes/working-directories.routes.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +34 -0
- package/dist/server.js.map +1 -0
- package/dist/services/ToolMetricsService.d.ts +53 -0
- package/dist/services/ToolMetricsService.d.ts.map +1 -0
- package/dist/services/ToolMetricsService.js +230 -0
- package/dist/services/ToolMetricsService.js.map +1 -0
- package/dist/services/anthropic-service.d.ts +186 -0
- package/dist/services/anthropic-service.d.ts.map +1 -0
- package/dist/services/anthropic-service.js +1132 -0
- package/dist/services/anthropic-service.js.map +1 -0
- package/dist/services/claude-history-reader.d.ts +126 -0
- package/dist/services/claude-history-reader.d.ts.map +1 -0
- package/dist/services/claude-history-reader.js +717 -0
- package/dist/services/claude-history-reader.js.map +1 -0
- package/dist/services/claude-process-manager.d.ts +108 -0
- package/dist/services/claude-process-manager.d.ts.map +1 -0
- package/dist/services/claude-process-manager.js +909 -0
- package/dist/services/claude-process-manager.js.map +1 -0
- package/dist/services/claude-router-service.d.ts +19 -0
- package/dist/services/claude-router-service.d.ts.map +1 -0
- package/dist/services/claude-router-service.js +160 -0
- package/dist/services/claude-router-service.js.map +1 -0
- package/dist/services/claudia-service.d.ts +77 -0
- package/dist/services/claudia-service.d.ts.map +1 -0
- package/dist/services/claudia-service.js +194 -0
- package/dist/services/claudia-service.js.map +1 -0
- package/dist/services/commands-service.d.ts +18 -0
- package/dist/services/commands-service.d.ts.map +1 -0
- package/dist/services/commands-service.js +76 -0
- package/dist/services/commands-service.js.map +1 -0
- package/dist/services/config-service.d.ts +68 -0
- package/dist/services/config-service.d.ts.map +1 -0
- package/dist/services/config-service.js +429 -0
- package/dist/services/config-service.js.map +1 -0
- package/dist/services/conversation-cache.d.ts +86 -0
- package/dist/services/conversation-cache.d.ts.map +1 -0
- package/dist/services/conversation-cache.js +235 -0
- package/dist/services/conversation-cache.js.map +1 -0
- package/dist/services/conversation-status-manager.d.ts +98 -0
- package/dist/services/conversation-status-manager.d.ts.map +1 -0
- package/dist/services/conversation-status-manager.js +295 -0
- package/dist/services/conversation-status-manager.js.map +1 -0
- package/dist/services/cost-tracker.d.ts +87 -0
- package/dist/services/cost-tracker.d.ts.map +1 -0
- package/dist/services/cost-tracker.js +335 -0
- package/dist/services/cost-tracker.js.map +1 -0
- package/dist/services/file-system-service.d.ts +61 -0
- package/dist/services/file-system-service.d.ts.map +1 -0
- package/dist/services/file-system-service.js +348 -0
- package/dist/services/file-system-service.js.map +1 -0
- package/dist/services/gemini-service.d.ts +72 -0
- package/dist/services/gemini-service.d.ts.map +1 -0
- package/dist/services/gemini-service.js +431 -0
- package/dist/services/gemini-service.js.map +1 -0
- package/dist/services/insight-queue.d.ts +99 -0
- package/dist/services/insight-queue.d.ts.map +1 -0
- package/dist/services/insight-queue.js +277 -0
- package/dist/services/insight-queue.js.map +1 -0
- package/dist/services/insights-service.d.ts +102 -0
- package/dist/services/insights-service.d.ts.map +1 -0
- package/dist/services/insights-service.js +1152 -0
- package/dist/services/insights-service.js.map +1 -0
- package/dist/services/json-lines-parser.d.ts +19 -0
- package/dist/services/json-lines-parser.d.ts.map +1 -0
- package/dist/services/json-lines-parser.js +56 -0
- package/dist/services/json-lines-parser.js.map +1 -0
- package/dist/services/license-service.d.ts +69 -0
- package/dist/services/license-service.d.ts.map +1 -0
- package/dist/services/license-service.js +330 -0
- package/dist/services/license-service.js.map +1 -0
- package/dist/services/log-formatter.d.ts +5 -0
- package/dist/services/log-formatter.d.ts.map +1 -0
- package/dist/services/log-formatter.js +77 -0
- package/dist/services/log-formatter.js.map +1 -0
- package/dist/services/log-stream-buffer.d.ts +11 -0
- package/dist/services/log-stream-buffer.d.ts.map +1 -0
- package/dist/services/log-stream-buffer.js +36 -0
- package/dist/services/log-stream-buffer.js.map +1 -0
- package/dist/services/logger.d.ts +71 -0
- package/dist/services/logger.d.ts.map +1 -0
- package/dist/services/logger.js +215 -0
- package/dist/services/logger.js.map +1 -0
- package/dist/services/mcp-config-generator.d.ts +32 -0
- package/dist/services/mcp-config-generator.d.ts.map +1 -0
- package/dist/services/mcp-config-generator.js +126 -0
- package/dist/services/mcp-config-generator.js.map +1 -0
- package/dist/services/message-filter.d.ts +22 -0
- package/dist/services/message-filter.d.ts.map +1 -0
- package/dist/services/message-filter.js +57 -0
- package/dist/services/message-filter.js.map +1 -0
- package/dist/services/notification-service.d.ts +45 -0
- package/dist/services/notification-service.d.ts.map +1 -0
- package/dist/services/notification-service.js +184 -0
- package/dist/services/notification-service.js.map +1 -0
- package/dist/services/permission-tracker.d.ts +67 -0
- package/dist/services/permission-tracker.d.ts.map +1 -0
- package/dist/services/permission-tracker.js +161 -0
- package/dist/services/permission-tracker.js.map +1 -0
- package/dist/services/process-manager-factory.d.ts +81 -0
- package/dist/services/process-manager-factory.d.ts.map +1 -0
- package/dist/services/process-manager-factory.js +211 -0
- package/dist/services/process-manager-factory.js.map +1 -0
- package/dist/services/question-tracker.d.ts +47 -0
- package/dist/services/question-tracker.d.ts.map +1 -0
- package/dist/services/question-tracker.js +105 -0
- package/dist/services/question-tracker.js.map +1 -0
- package/dist/services/session-activity-watcher.d.ts +33 -0
- package/dist/services/session-activity-watcher.d.ts.map +1 -0
- package/dist/services/session-activity-watcher.js +194 -0
- package/dist/services/session-activity-watcher.js.map +1 -0
- package/dist/services/session-info-service.d.ts +228 -0
- package/dist/services/session-info-service.d.ts.map +1 -0
- package/dist/services/session-info-service.js +920 -0
- package/dist/services/session-info-service.js.map +1 -0
- package/dist/services/session-insights-service.d.ts +119 -0
- package/dist/services/session-insights-service.d.ts.map +1 -0
- package/dist/services/session-insights-service.js +889 -0
- package/dist/services/session-insights-service.js.map +1 -0
- package/dist/services/stream-manager.d.ts +62 -0
- package/dist/services/stream-manager.d.ts.map +1 -0
- package/dist/services/stream-manager.js +239 -0
- package/dist/services/stream-manager.js.map +1 -0
- package/dist/services/web-push-service.d.ts +48 -0
- package/dist/services/web-push-service.d.ts.map +1 -0
- package/dist/services/web-push-service.js +186 -0
- package/dist/services/web-push-service.js.map +1 -0
- package/dist/services/working-directories-service.d.ts +19 -0
- package/dist/services/working-directories-service.d.ts.map +1 -0
- package/dist/services/working-directories-service.js +103 -0
- package/dist/services/working-directories-service.js.map +1 -0
- package/dist/types/config.d.ts +111 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +14 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/express.d.ts +5 -0
- package/dist/types/express.d.ts.map +1 -0
- package/dist/types/express.js +2 -0
- package/dist/types/express.js.map +1 -0
- package/dist/types/index.d.ts +325 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +18 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/insights.d.ts +99 -0
- package/dist/types/insights.d.ts.map +1 -0
- package/dist/types/insights.js +7 -0
- package/dist/types/insights.js.map +1 -0
- package/dist/types/license.d.ts +70 -0
- package/dist/types/license.d.ts.map +1 -0
- package/dist/types/license.js +5 -0
- package/dist/types/license.js.map +1 -0
- package/dist/types/router-config.d.ts +13 -0
- package/dist/types/router-config.d.ts.map +1 -0
- package/dist/types/router-config.js +2 -0
- package/dist/types/router-config.js.map +1 -0
- package/dist/utils/constants.d.ts +26 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +28 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/machine-id.d.ts +7 -0
- package/dist/utils/machine-id.d.ts.map +1 -0
- package/dist/utils/machine-id.js +76 -0
- package/dist/utils/machine-id.js.map +1 -0
- package/dist/utils/server-startup.d.ts +13 -0
- package/dist/utils/server-startup.d.ts.map +1 -0
- package/dist/utils/server-startup.js +20 -0
- package/dist/utils/server-startup.js.map +1 -0
- package/dist/web/assets/main-DAc2rjJ2.css +1 -0
- package/dist/web/assets/main-DvlZ02mT.js +137 -0
- package/dist/web/favicon.png +0 -0
- package/dist/web/favicon.svg +22 -0
- package/dist/web/icon-192x192.png +0 -0
- package/dist/web/icon-512x512.png +0 -0
- package/dist/web/index.html +36 -0
- package/dist/web/manifest.json +61 -0
- package/package.json +174 -0
- package/scripts/postinstall.js +30 -0
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* InsightQueue - Serializes insight operations per session to eliminate race conditions.
|
|
3
|
+
*
|
|
4
|
+
* The Problem This Solves:
|
|
5
|
+
* Previously, background regenerations could race with patches:
|
|
6
|
+
* T+0s: Patch starts (Haiku)
|
|
7
|
+
* T+1s: Background regen starts (Opus)
|
|
8
|
+
* T+5s: Patch completes, writes to cache
|
|
9
|
+
* T+8s: Regen completes, merge decision uses stale snapshot, overwrites patch
|
|
10
|
+
*
|
|
11
|
+
* The Solution:
|
|
12
|
+
* All insight operations go through this queue. Operations for the same session
|
|
13
|
+
* are serialized - a REFRESH can't start until the PATCH completes.
|
|
14
|
+
*
|
|
15
|
+
* Key Design Decisions:
|
|
16
|
+
* - One queue per session (different sessions can run in parallel)
|
|
17
|
+
* - Operations coalesce (if PATCH is queued and another PATCH comes in, skip the new one)
|
|
18
|
+
* - Priority ordering: PATCH > GENERATE > REFRESH
|
|
19
|
+
* - In-memory only (operations are idempotent, no need for persistence)
|
|
20
|
+
*/
|
|
21
|
+
import { EventEmitter } from 'events';
|
|
22
|
+
import { createLogger } from './logger.js';
|
|
23
|
+
// Priority ordering: lower number = higher priority
|
|
24
|
+
const PRIORITY_ORDER = {
|
|
25
|
+
high: 0,
|
|
26
|
+
normal: 1,
|
|
27
|
+
low: 2,
|
|
28
|
+
};
|
|
29
|
+
// Type ordering within same priority: PATCH > GENERATE > REFRESH
|
|
30
|
+
const TYPE_ORDER = {
|
|
31
|
+
PATCH: 0,
|
|
32
|
+
GENERATE: 1,
|
|
33
|
+
REFRESH: 2,
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Compare two operations for queue ordering.
|
|
37
|
+
* Returns negative if a should come before b.
|
|
38
|
+
*/
|
|
39
|
+
function compareOperations(a, b) {
|
|
40
|
+
// First by priority
|
|
41
|
+
const priorityDiff = PRIORITY_ORDER[a.priority] - PRIORITY_ORDER[b.priority];
|
|
42
|
+
if (priorityDiff !== 0)
|
|
43
|
+
return priorityDiff;
|
|
44
|
+
// Then by type
|
|
45
|
+
const typeDiff = TYPE_ORDER[a.type] - TYPE_ORDER[b.type];
|
|
46
|
+
if (typeDiff !== 0)
|
|
47
|
+
return typeDiff;
|
|
48
|
+
// Finally by enqueue time (FIFO within same priority+type)
|
|
49
|
+
return a.enqueuedAt - b.enqueuedAt;
|
|
50
|
+
}
|
|
51
|
+
export class InsightQueue extends EventEmitter {
|
|
52
|
+
logger;
|
|
53
|
+
queues = new Map();
|
|
54
|
+
processing = new Set();
|
|
55
|
+
// Track what operation type is currently being processed per session
|
|
56
|
+
processingType = new Map();
|
|
57
|
+
stats = {
|
|
58
|
+
totalEnqueued: 0,
|
|
59
|
+
totalProcessed: 0,
|
|
60
|
+
totalSkipped: 0,
|
|
61
|
+
byType: { GENERATE: 0, PATCH: 0, REFRESH: 0 },
|
|
62
|
+
byTrigger: {},
|
|
63
|
+
};
|
|
64
|
+
// Executor function - injected to avoid circular dependencies
|
|
65
|
+
executor = null;
|
|
66
|
+
constructor() {
|
|
67
|
+
super();
|
|
68
|
+
this.logger = createLogger('InsightQueue');
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Set the executor function that processes operations.
|
|
72
|
+
* This is injected to break the circular dependency between queue and handler.
|
|
73
|
+
*/
|
|
74
|
+
setExecutor(executor) {
|
|
75
|
+
this.executor = executor;
|
|
76
|
+
this.logger.info('Executor set');
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Enqueue an insight operation.
|
|
80
|
+
* Operations are coalesced (duplicate type+session skipped) and prioritized.
|
|
81
|
+
*/
|
|
82
|
+
enqueue(op) {
|
|
83
|
+
const operation = {
|
|
84
|
+
...op,
|
|
85
|
+
enqueuedAt: Date.now(),
|
|
86
|
+
};
|
|
87
|
+
const queue = this.queues.get(op.sessionId) || [];
|
|
88
|
+
// Coalesce: skip if same operation type is already queued OR currently processing
|
|
89
|
+
const isQueued = queue.some(q => q.type === op.type);
|
|
90
|
+
const isProcessing = this.processingType.get(op.sessionId) === op.type;
|
|
91
|
+
if (isQueued || isProcessing) {
|
|
92
|
+
this.stats.totalSkipped++;
|
|
93
|
+
this.logger.debug('Operation coalesced', {
|
|
94
|
+
sessionId: op.sessionId.slice(0, 8),
|
|
95
|
+
type: op.type,
|
|
96
|
+
trigger: op.trigger,
|
|
97
|
+
reason: isProcessing ? 'already_processing' : 'already_queued',
|
|
98
|
+
queueLength: queue.length,
|
|
99
|
+
});
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
// Add to queue and sort by priority
|
|
103
|
+
queue.push(operation);
|
|
104
|
+
queue.sort(compareOperations);
|
|
105
|
+
this.queues.set(op.sessionId, queue);
|
|
106
|
+
// Update stats
|
|
107
|
+
this.stats.totalEnqueued++;
|
|
108
|
+
this.stats.byType[op.type]++;
|
|
109
|
+
this.stats.byTrigger[op.trigger] = (this.stats.byTrigger[op.trigger] || 0) + 1;
|
|
110
|
+
this.logger.info('Operation enqueued', {
|
|
111
|
+
sessionId: op.sessionId.slice(0, 8),
|
|
112
|
+
type: op.type,
|
|
113
|
+
priority: op.priority,
|
|
114
|
+
trigger: op.trigger,
|
|
115
|
+
queueLength: queue.length,
|
|
116
|
+
traceId: op.traceId,
|
|
117
|
+
});
|
|
118
|
+
// Emit event for monitoring
|
|
119
|
+
this.emit('enqueued', operation);
|
|
120
|
+
// Start processing if not already running
|
|
121
|
+
this.processNext(op.sessionId);
|
|
122
|
+
return true;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Process the next operation in a session's queue.
|
|
126
|
+
* This is the serialization point - only one operation per session at a time.
|
|
127
|
+
*/
|
|
128
|
+
async processNext(sessionId) {
|
|
129
|
+
// Already processing this session - wait for current operation to complete
|
|
130
|
+
if (this.processing.has(sessionId)) {
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
const queue = this.queues.get(sessionId);
|
|
134
|
+
if (!queue || queue.length === 0) {
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
if (!this.executor) {
|
|
138
|
+
this.logger.error('No executor set - cannot process operations');
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
// Mark as processing
|
|
142
|
+
this.processing.add(sessionId);
|
|
143
|
+
const op = queue.shift();
|
|
144
|
+
this.processingType.set(sessionId, op.type);
|
|
145
|
+
const startTime = Date.now();
|
|
146
|
+
this.logger.info('Processing operation', {
|
|
147
|
+
sessionId: sessionId.slice(0, 8),
|
|
148
|
+
type: op.type,
|
|
149
|
+
trigger: op.trigger,
|
|
150
|
+
waitTimeMs: startTime - op.enqueuedAt,
|
|
151
|
+
traceId: op.traceId,
|
|
152
|
+
});
|
|
153
|
+
// Emit event for monitoring
|
|
154
|
+
this.emit('processing', op);
|
|
155
|
+
try {
|
|
156
|
+
await this.executor(op);
|
|
157
|
+
const durationMs = Date.now() - startTime;
|
|
158
|
+
this.stats.totalProcessed++;
|
|
159
|
+
this.logger.info('Operation completed', {
|
|
160
|
+
sessionId: sessionId.slice(0, 8),
|
|
161
|
+
type: op.type,
|
|
162
|
+
trigger: op.trigger,
|
|
163
|
+
durationMs,
|
|
164
|
+
traceId: op.traceId,
|
|
165
|
+
});
|
|
166
|
+
// Emit event for monitoring
|
|
167
|
+
this.emit('completed', { ...op, durationMs });
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
const durationMs = Date.now() - startTime;
|
|
171
|
+
this.logger.error('Operation failed', {
|
|
172
|
+
sessionId: sessionId.slice(0, 8),
|
|
173
|
+
type: op.type,
|
|
174
|
+
trigger: op.trigger,
|
|
175
|
+
durationMs,
|
|
176
|
+
error: error instanceof Error ? error.message : String(error),
|
|
177
|
+
traceId: op.traceId,
|
|
178
|
+
});
|
|
179
|
+
// Emit event for monitoring
|
|
180
|
+
this.emit('failed', { ...op, durationMs, error });
|
|
181
|
+
}
|
|
182
|
+
finally {
|
|
183
|
+
// Mark as no longer processing
|
|
184
|
+
this.processing.delete(sessionId);
|
|
185
|
+
this.processingType.delete(sessionId);
|
|
186
|
+
// Process next in queue (if any)
|
|
187
|
+
this.processNext(sessionId);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Get the current queue for a session (for debugging/UI).
|
|
192
|
+
*/
|
|
193
|
+
getQueue(sessionId) {
|
|
194
|
+
return [...(this.queues.get(sessionId) || [])];
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Check if a session is currently being processed.
|
|
198
|
+
*/
|
|
199
|
+
isProcessing(sessionId) {
|
|
200
|
+
return this.processing.has(sessionId);
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Get the operation type currently being processed for a session.
|
|
204
|
+
*/
|
|
205
|
+
getProcessingType(sessionId) {
|
|
206
|
+
return this.processingType.get(sessionId);
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Get the number of pending operations for a session.
|
|
210
|
+
*/
|
|
211
|
+
getPendingCount(sessionId) {
|
|
212
|
+
return this.queues.get(sessionId)?.length || 0;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Get all sessions with pending operations.
|
|
216
|
+
*/
|
|
217
|
+
getActiveSessionIds() {
|
|
218
|
+
return Array.from(this.queues.keys()).filter(sessionId => (this.queues.get(sessionId)?.length || 0) > 0 || this.processing.has(sessionId));
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Get queue statistics.
|
|
222
|
+
*/
|
|
223
|
+
getStats() {
|
|
224
|
+
return { ...this.stats };
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Clear the queue for a session (e.g., when session is archived).
|
|
228
|
+
*/
|
|
229
|
+
clearSession(sessionId) {
|
|
230
|
+
const queue = this.queues.get(sessionId);
|
|
231
|
+
if (queue && queue.length > 0) {
|
|
232
|
+
this.logger.info('Clearing session queue', {
|
|
233
|
+
sessionId: sessionId.slice(0, 8),
|
|
234
|
+
droppedOperations: queue.length,
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
this.queues.delete(sessionId);
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Shutdown the queue (for graceful server shutdown).
|
|
241
|
+
* Waits for in-flight operations to complete but doesn't process new ones.
|
|
242
|
+
*/
|
|
243
|
+
async shutdown(timeoutMs = 30000) {
|
|
244
|
+
this.logger.info('Shutting down insight queue', {
|
|
245
|
+
processingCount: this.processing.size,
|
|
246
|
+
pendingCount: Array.from(this.queues.values()).reduce((sum, q) => sum + q.length, 0),
|
|
247
|
+
});
|
|
248
|
+
// Clear all pending queues
|
|
249
|
+
this.queues.clear();
|
|
250
|
+
// Wait for in-flight operations to complete
|
|
251
|
+
const startTime = Date.now();
|
|
252
|
+
while (this.processing.size > 0 && Date.now() - startTime < timeoutMs) {
|
|
253
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
254
|
+
}
|
|
255
|
+
if (this.processing.size > 0) {
|
|
256
|
+
this.logger.warn('Shutdown timed out with operations still processing', {
|
|
257
|
+
remainingCount: this.processing.size,
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
this.logger.info('Insight queue shutdown complete');
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
// Singleton instance
|
|
266
|
+
let instance = null;
|
|
267
|
+
export function getInsightQueue() {
|
|
268
|
+
if (!instance) {
|
|
269
|
+
instance = new InsightQueue();
|
|
270
|
+
}
|
|
271
|
+
return instance;
|
|
272
|
+
}
|
|
273
|
+
// For testing - allows resetting the singleton
|
|
274
|
+
export function resetInsightQueue() {
|
|
275
|
+
instance = null;
|
|
276
|
+
}
|
|
277
|
+
//# sourceMappingURL=insight-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insight-queue.js","sourceRoot":"","sources":["../../src/services/insight-queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* InsightsService - Unified event-driven insights system.
|
|
3
|
+
*
|
|
4
|
+
* This consolidates InsightsEventCoordinator + InsightsEventHandler into a single service.
|
|
5
|
+
* It handles:
|
|
6
|
+
* 1. Watching for session activity (file changes in ~/.claude/projects)
|
|
7
|
+
* 2. Tracking session state (action counts, timing, etc.)
|
|
8
|
+
* 3. Triggering insight generation and patching via InsightQueue
|
|
9
|
+
* 4. Executing LLM operations (generation, quick check, patch)
|
|
10
|
+
*
|
|
11
|
+
* Architecture V2 Features:
|
|
12
|
+
* - InsightQueue for serialization (eliminates race conditions)
|
|
13
|
+
* - Haiku-heavy patches (cheap quick checks, targeted updates)
|
|
14
|
+
* - Ownership model for REFRESH (deterministic field ownership)
|
|
15
|
+
*/
|
|
16
|
+
import { EventEmitter } from 'events';
|
|
17
|
+
interface SessionState {
|
|
18
|
+
actionCount: number;
|
|
19
|
+
lastActionAt: number;
|
|
20
|
+
lastCheckAt: number;
|
|
21
|
+
insightsGeneratedAt?: number;
|
|
22
|
+
insightsPatchedAt?: number;
|
|
23
|
+
regenTimerId?: NodeJS.Timeout;
|
|
24
|
+
completionCheckTimer?: NodeJS.Timeout;
|
|
25
|
+
quickCheckDebounceTimer?: NodeJS.Timeout;
|
|
26
|
+
lastResponseTimestamp?: number;
|
|
27
|
+
}
|
|
28
|
+
export declare class InsightsService extends EventEmitter {
|
|
29
|
+
private logger;
|
|
30
|
+
private historyReader;
|
|
31
|
+
private sessionInfoService;
|
|
32
|
+
private insightsComputeService;
|
|
33
|
+
private projectsDir;
|
|
34
|
+
private watchers;
|
|
35
|
+
private debounceTimers;
|
|
36
|
+
private isWatching;
|
|
37
|
+
private sessionStates;
|
|
38
|
+
private lastKnownMessageCounts;
|
|
39
|
+
private pendingGenerations;
|
|
40
|
+
private pendingQuickChecks;
|
|
41
|
+
private pendingActionEvents;
|
|
42
|
+
private pendingGenerateEvents;
|
|
43
|
+
constructor();
|
|
44
|
+
/**
|
|
45
|
+
* Initialize the insights service. Call once at startup.
|
|
46
|
+
*/
|
|
47
|
+
initialize(): void;
|
|
48
|
+
/**
|
|
49
|
+
* Stop the insights service. Call at shutdown.
|
|
50
|
+
*/
|
|
51
|
+
stop(): void;
|
|
52
|
+
private startWatching;
|
|
53
|
+
private watchDirectory;
|
|
54
|
+
private watchProjectDirectory;
|
|
55
|
+
private handleFileChange;
|
|
56
|
+
private processSessionUpdate;
|
|
57
|
+
/**
|
|
58
|
+
* Handle action event - determine if/how to trigger patch checking
|
|
59
|
+
*/
|
|
60
|
+
private handleSessionAction;
|
|
61
|
+
private extractActions;
|
|
62
|
+
private extractFilename;
|
|
63
|
+
private enqueueGenerate;
|
|
64
|
+
private enqueueAction;
|
|
65
|
+
private mapReasonToTrigger;
|
|
66
|
+
private executeQueueOperation;
|
|
67
|
+
private executeGenerate;
|
|
68
|
+
/**
|
|
69
|
+
* Apply deterministic ownership model for REFRESH operations.
|
|
70
|
+
* - Haiku owns (keep cached): currentState, milestones, recentActions
|
|
71
|
+
* - Opus owns (use fresh): context, panels, tags, theme
|
|
72
|
+
* - Notable: accumulates (merge, don't replace)
|
|
73
|
+
*/
|
|
74
|
+
private applyOwnershipModel;
|
|
75
|
+
private mergeNotableEvents;
|
|
76
|
+
private executeAction;
|
|
77
|
+
private doQuickCheck;
|
|
78
|
+
private doPatch;
|
|
79
|
+
private applyPatches;
|
|
80
|
+
/**
|
|
81
|
+
* Called when insights have been generated for a session
|
|
82
|
+
*/
|
|
83
|
+
private markInsightsGenerated;
|
|
84
|
+
private markInsightsPatched;
|
|
85
|
+
private markQuickCheckPerformed;
|
|
86
|
+
private startRegenTimer;
|
|
87
|
+
/**
|
|
88
|
+
* Clean up tracking for a session (call when archived or idle)
|
|
89
|
+
*/
|
|
90
|
+
cleanupSession(sessionId: string): void;
|
|
91
|
+
/**
|
|
92
|
+
* Get the current state for a session (for debugging/UI)
|
|
93
|
+
*/
|
|
94
|
+
getSessionState(sessionId: string): SessionState | undefined;
|
|
95
|
+
}
|
|
96
|
+
export declare function getInsightsService(): InsightsService;
|
|
97
|
+
/**
|
|
98
|
+
* Initialize the insights service. Call once at server startup.
|
|
99
|
+
*/
|
|
100
|
+
export declare function initializeInsightsService(): void;
|
|
101
|
+
export {};
|
|
102
|
+
//# sourceMappingURL=insights-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insights-service.d.ts","sourceRoot":"","sources":["../../src/services/insights-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAkBtC,UAAU,YAAY;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC;IAC9B,oBAAoB,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC;IACtC,uBAAuB,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC;IACzC,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AA6ED,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,sBAAsB,CAAyB;IACvD,OAAO,CAAC,WAAW,CAAS;IAG5B,OAAO,CAAC,QAAQ,CAAwC;IACxD,OAAO,CAAC,cAAc,CAA0C;IAChE,OAAO,CAAC,UAAU,CAAS;IAG3B,OAAO,CAAC,aAAa,CAAwC;IAC7D,OAAO,CAAC,sBAAsB,CAAkC;IAGhE,OAAO,CAAC,kBAAkB,CAA0B;IACpD,OAAO,CAAC,kBAAkB,CAA0B;IAGpD,OAAO,CAAC,mBAAmB,CAAuC;IAClE,OAAO,CAAC,qBAAqB,CAAyC;;IAkBtE;;OAEG;IACH,UAAU,IAAI,IAAI;IAWlB;;OAEG;IACH,IAAI,IAAI,IAAI;IA8BZ,OAAO,CAAC,aAAa;IAyBrB,OAAO,CAAC,cAAc;IAiBtB,OAAO,CAAC,qBAAqB;IAe7B,OAAO,CAAC,gBAAgB;YAmBV,oBAAoB;IA8JlC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAyF3B,OAAO,CAAC,cAAc;IAwGtB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,aAAa;IAiBrB,OAAO,CAAC,kBAAkB;YAWZ,qBAAqB;YA4CrB,eAAe;IAmE7B;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IA2B3B,OAAO,CAAC,kBAAkB;YA8BZ,aAAa;YAoIb,YAAY;YAeZ,OAAO;YAoFP,YAAY;IA0J1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAsB7B,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,uBAAuB;IAO/B,OAAO,CAAC,eAAe;IAwBvB;;OAEG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAsCvC;;OAEG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;CAG7D;AAQD,wBAAgB,kBAAkB,IAAI,eAAe,CAKpD;AAED;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,IAAI,CAGhD"}
|