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.
Files changed (296) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +109 -0
  3. package/dist/cli-parser.d.ts +11 -0
  4. package/dist/cli-parser.d.ts.map +1 -0
  5. package/dist/cli-parser.js +57 -0
  6. package/dist/cli-parser.js.map +1 -0
  7. package/dist/cui-server.d.ts +69 -0
  8. package/dist/cui-server.d.ts.map +1 -0
  9. package/dist/cui-server.js +705 -0
  10. package/dist/cui-server.js.map +1 -0
  11. package/dist/mcp-server/claudia-tools.d.ts +15 -0
  12. package/dist/mcp-server/claudia-tools.d.ts.map +1 -0
  13. package/dist/mcp-server/claudia-tools.js +366 -0
  14. package/dist/mcp-server/claudia-tools.js.map +1 -0
  15. package/dist/mcp-server/index.d.ts +3 -0
  16. package/dist/mcp-server/index.d.ts.map +1 -0
  17. package/dist/mcp-server/index.js +176 -0
  18. package/dist/mcp-server/index.js.map +1 -0
  19. package/dist/middleware/auth.d.ts +18 -0
  20. package/dist/middleware/auth.d.ts.map +1 -0
  21. package/dist/middleware/auth.js +136 -0
  22. package/dist/middleware/auth.js.map +1 -0
  23. package/dist/middleware/cors-setup.d.ts +7 -0
  24. package/dist/middleware/cors-setup.d.ts.map +1 -0
  25. package/dist/middleware/cors-setup.js +8 -0
  26. package/dist/middleware/cors-setup.js.map +1 -0
  27. package/dist/middleware/error-handler.d.ts +4 -0
  28. package/dist/middleware/error-handler.d.ts.map +1 -0
  29. package/dist/middleware/error-handler.js +27 -0
  30. package/dist/middleware/error-handler.js.map +1 -0
  31. package/dist/middleware/query-parser.d.ts +11 -0
  32. package/dist/middleware/query-parser.d.ts.map +1 -0
  33. package/dist/middleware/query-parser.js +68 -0
  34. package/dist/middleware/query-parser.js.map +1 -0
  35. package/dist/middleware/request-logger.d.ts +4 -0
  36. package/dist/middleware/request-logger.d.ts.map +1 -0
  37. package/dist/middleware/request-logger.js +29 -0
  38. package/dist/middleware/request-logger.js.map +1 -0
  39. package/dist/process-daemon/index.d.ts +14 -0
  40. package/dist/process-daemon/index.d.ts.map +1 -0
  41. package/dist/process-daemon/index.js +51 -0
  42. package/dist/process-daemon/index.js.map +1 -0
  43. package/dist/process-daemon/process-daemon.d.ts +78 -0
  44. package/dist/process-daemon/process-daemon.d.ts.map +1 -0
  45. package/dist/process-daemon/process-daemon.js +568 -0
  46. package/dist/process-daemon/process-daemon.js.map +1 -0
  47. package/dist/process-daemon/process-manager-client.d.ts +108 -0
  48. package/dist/process-daemon/process-manager-client.d.ts.map +1 -0
  49. package/dist/process-daemon/process-manager-client.js +314 -0
  50. package/dist/process-daemon/process-manager-client.js.map +1 -0
  51. package/dist/process-daemon/process-manager-interface.d.ts +47 -0
  52. package/dist/process-daemon/process-manager-interface.d.ts.map +1 -0
  53. package/dist/process-daemon/process-manager-interface.js +8 -0
  54. package/dist/process-daemon/process-manager-interface.js.map +1 -0
  55. package/dist/process-daemon/test-daemon.d.ts +12 -0
  56. package/dist/process-daemon/test-daemon.d.ts.map +1 -0
  57. package/dist/process-daemon/test-daemon.js +81 -0
  58. package/dist/process-daemon/test-daemon.js.map +1 -0
  59. package/dist/process-daemon/types.d.ts +85 -0
  60. package/dist/process-daemon/types.d.ts.map +1 -0
  61. package/dist/process-daemon/types.js +8 -0
  62. package/dist/process-daemon/types.js.map +1 -0
  63. package/dist/routes/claudia.routes.d.ts +10 -0
  64. package/dist/routes/claudia.routes.d.ts.map +1 -0
  65. package/dist/routes/claudia.routes.js +123 -0
  66. package/dist/routes/claudia.routes.js.map +1 -0
  67. package/dist/routes/config.routes.d.ts +4 -0
  68. package/dist/routes/config.routes.d.ts.map +1 -0
  69. package/dist/routes/config.routes.js +27 -0
  70. package/dist/routes/config.routes.js.map +1 -0
  71. package/dist/routes/conversation.routes.d.ts +8 -0
  72. package/dist/routes/conversation.routes.d.ts.map +1 -0
  73. package/dist/routes/conversation.routes.js +870 -0
  74. package/dist/routes/conversation.routes.js.map +1 -0
  75. package/dist/routes/filesystem.routes.d.ts +4 -0
  76. package/dist/routes/filesystem.routes.d.ts.map +1 -0
  77. package/dist/routes/filesystem.routes.js +86 -0
  78. package/dist/routes/filesystem.routes.js.map +1 -0
  79. package/dist/routes/gemini.routes.d.ts +4 -0
  80. package/dist/routes/gemini.routes.d.ts.map +1 -0
  81. package/dist/routes/gemini.routes.js +93 -0
  82. package/dist/routes/gemini.routes.js.map +1 -0
  83. package/dist/routes/insights.routes.d.ts +17 -0
  84. package/dist/routes/insights.routes.d.ts.map +1 -0
  85. package/dist/routes/insights.routes.js +417 -0
  86. package/dist/routes/insights.routes.js.map +1 -0
  87. package/dist/routes/license.routes.d.ts +3 -0
  88. package/dist/routes/license.routes.d.ts.map +1 -0
  89. package/dist/routes/license.routes.js +111 -0
  90. package/dist/routes/license.routes.js.map +1 -0
  91. package/dist/routes/log.routes.d.ts +3 -0
  92. package/dist/routes/log.routes.d.ts.map +1 -0
  93. package/dist/routes/log.routes.js +65 -0
  94. package/dist/routes/log.routes.js.map +1 -0
  95. package/dist/routes/notifications.routes.d.ts +4 -0
  96. package/dist/routes/notifications.routes.d.ts.map +1 -0
  97. package/dist/routes/notifications.routes.js +71 -0
  98. package/dist/routes/notifications.routes.js.map +1 -0
  99. package/dist/routes/permission.routes.d.ts +4 -0
  100. package/dist/routes/permission.routes.d.ts.map +1 -0
  101. package/dist/routes/permission.routes.js +116 -0
  102. package/dist/routes/permission.routes.js.map +1 -0
  103. package/dist/routes/question.routes.d.ts +8 -0
  104. package/dist/routes/question.routes.d.ts.map +1 -0
  105. package/dist/routes/question.routes.js +82 -0
  106. package/dist/routes/question.routes.js.map +1 -0
  107. package/dist/routes/streaming.routes.d.ts +4 -0
  108. package/dist/routes/streaming.routes.d.ts.map +1 -0
  109. package/dist/routes/streaming.routes.js +28 -0
  110. package/dist/routes/streaming.routes.js.map +1 -0
  111. package/dist/routes/system.routes.d.ts +5 -0
  112. package/dist/routes/system.routes.d.ts.map +1 -0
  113. package/dist/routes/system.routes.js +103 -0
  114. package/dist/routes/system.routes.js.map +1 -0
  115. package/dist/routes/working-directories.routes.d.ts +4 -0
  116. package/dist/routes/working-directories.routes.d.ts.map +1 -0
  117. package/dist/routes/working-directories.routes.js +25 -0
  118. package/dist/routes/working-directories.routes.js.map +1 -0
  119. package/dist/server.d.ts +3 -0
  120. package/dist/server.d.ts.map +1 -0
  121. package/dist/server.js +34 -0
  122. package/dist/server.js.map +1 -0
  123. package/dist/services/ToolMetricsService.d.ts +53 -0
  124. package/dist/services/ToolMetricsService.d.ts.map +1 -0
  125. package/dist/services/ToolMetricsService.js +230 -0
  126. package/dist/services/ToolMetricsService.js.map +1 -0
  127. package/dist/services/anthropic-service.d.ts +186 -0
  128. package/dist/services/anthropic-service.d.ts.map +1 -0
  129. package/dist/services/anthropic-service.js +1132 -0
  130. package/dist/services/anthropic-service.js.map +1 -0
  131. package/dist/services/claude-history-reader.d.ts +126 -0
  132. package/dist/services/claude-history-reader.d.ts.map +1 -0
  133. package/dist/services/claude-history-reader.js +717 -0
  134. package/dist/services/claude-history-reader.js.map +1 -0
  135. package/dist/services/claude-process-manager.d.ts +108 -0
  136. package/dist/services/claude-process-manager.d.ts.map +1 -0
  137. package/dist/services/claude-process-manager.js +909 -0
  138. package/dist/services/claude-process-manager.js.map +1 -0
  139. package/dist/services/claude-router-service.d.ts +19 -0
  140. package/dist/services/claude-router-service.d.ts.map +1 -0
  141. package/dist/services/claude-router-service.js +160 -0
  142. package/dist/services/claude-router-service.js.map +1 -0
  143. package/dist/services/claudia-service.d.ts +77 -0
  144. package/dist/services/claudia-service.d.ts.map +1 -0
  145. package/dist/services/claudia-service.js +194 -0
  146. package/dist/services/claudia-service.js.map +1 -0
  147. package/dist/services/commands-service.d.ts +18 -0
  148. package/dist/services/commands-service.d.ts.map +1 -0
  149. package/dist/services/commands-service.js +76 -0
  150. package/dist/services/commands-service.js.map +1 -0
  151. package/dist/services/config-service.d.ts +68 -0
  152. package/dist/services/config-service.d.ts.map +1 -0
  153. package/dist/services/config-service.js +429 -0
  154. package/dist/services/config-service.js.map +1 -0
  155. package/dist/services/conversation-cache.d.ts +86 -0
  156. package/dist/services/conversation-cache.d.ts.map +1 -0
  157. package/dist/services/conversation-cache.js +235 -0
  158. package/dist/services/conversation-cache.js.map +1 -0
  159. package/dist/services/conversation-status-manager.d.ts +98 -0
  160. package/dist/services/conversation-status-manager.d.ts.map +1 -0
  161. package/dist/services/conversation-status-manager.js +295 -0
  162. package/dist/services/conversation-status-manager.js.map +1 -0
  163. package/dist/services/cost-tracker.d.ts +87 -0
  164. package/dist/services/cost-tracker.d.ts.map +1 -0
  165. package/dist/services/cost-tracker.js +335 -0
  166. package/dist/services/cost-tracker.js.map +1 -0
  167. package/dist/services/file-system-service.d.ts +61 -0
  168. package/dist/services/file-system-service.d.ts.map +1 -0
  169. package/dist/services/file-system-service.js +348 -0
  170. package/dist/services/file-system-service.js.map +1 -0
  171. package/dist/services/gemini-service.d.ts +72 -0
  172. package/dist/services/gemini-service.d.ts.map +1 -0
  173. package/dist/services/gemini-service.js +431 -0
  174. package/dist/services/gemini-service.js.map +1 -0
  175. package/dist/services/insight-queue.d.ts +99 -0
  176. package/dist/services/insight-queue.d.ts.map +1 -0
  177. package/dist/services/insight-queue.js +277 -0
  178. package/dist/services/insight-queue.js.map +1 -0
  179. package/dist/services/insights-service.d.ts +102 -0
  180. package/dist/services/insights-service.d.ts.map +1 -0
  181. package/dist/services/insights-service.js +1152 -0
  182. package/dist/services/insights-service.js.map +1 -0
  183. package/dist/services/json-lines-parser.d.ts +19 -0
  184. package/dist/services/json-lines-parser.d.ts.map +1 -0
  185. package/dist/services/json-lines-parser.js +56 -0
  186. package/dist/services/json-lines-parser.js.map +1 -0
  187. package/dist/services/license-service.d.ts +69 -0
  188. package/dist/services/license-service.d.ts.map +1 -0
  189. package/dist/services/license-service.js +330 -0
  190. package/dist/services/license-service.js.map +1 -0
  191. package/dist/services/log-formatter.d.ts +5 -0
  192. package/dist/services/log-formatter.d.ts.map +1 -0
  193. package/dist/services/log-formatter.js +77 -0
  194. package/dist/services/log-formatter.js.map +1 -0
  195. package/dist/services/log-stream-buffer.d.ts +11 -0
  196. package/dist/services/log-stream-buffer.d.ts.map +1 -0
  197. package/dist/services/log-stream-buffer.js +36 -0
  198. package/dist/services/log-stream-buffer.js.map +1 -0
  199. package/dist/services/logger.d.ts +71 -0
  200. package/dist/services/logger.d.ts.map +1 -0
  201. package/dist/services/logger.js +215 -0
  202. package/dist/services/logger.js.map +1 -0
  203. package/dist/services/mcp-config-generator.d.ts +32 -0
  204. package/dist/services/mcp-config-generator.d.ts.map +1 -0
  205. package/dist/services/mcp-config-generator.js +126 -0
  206. package/dist/services/mcp-config-generator.js.map +1 -0
  207. package/dist/services/message-filter.d.ts +22 -0
  208. package/dist/services/message-filter.d.ts.map +1 -0
  209. package/dist/services/message-filter.js +57 -0
  210. package/dist/services/message-filter.js.map +1 -0
  211. package/dist/services/notification-service.d.ts +45 -0
  212. package/dist/services/notification-service.d.ts.map +1 -0
  213. package/dist/services/notification-service.js +184 -0
  214. package/dist/services/notification-service.js.map +1 -0
  215. package/dist/services/permission-tracker.d.ts +67 -0
  216. package/dist/services/permission-tracker.d.ts.map +1 -0
  217. package/dist/services/permission-tracker.js +161 -0
  218. package/dist/services/permission-tracker.js.map +1 -0
  219. package/dist/services/process-manager-factory.d.ts +81 -0
  220. package/dist/services/process-manager-factory.d.ts.map +1 -0
  221. package/dist/services/process-manager-factory.js +211 -0
  222. package/dist/services/process-manager-factory.js.map +1 -0
  223. package/dist/services/question-tracker.d.ts +47 -0
  224. package/dist/services/question-tracker.d.ts.map +1 -0
  225. package/dist/services/question-tracker.js +105 -0
  226. package/dist/services/question-tracker.js.map +1 -0
  227. package/dist/services/session-activity-watcher.d.ts +33 -0
  228. package/dist/services/session-activity-watcher.d.ts.map +1 -0
  229. package/dist/services/session-activity-watcher.js +194 -0
  230. package/dist/services/session-activity-watcher.js.map +1 -0
  231. package/dist/services/session-info-service.d.ts +228 -0
  232. package/dist/services/session-info-service.d.ts.map +1 -0
  233. package/dist/services/session-info-service.js +920 -0
  234. package/dist/services/session-info-service.js.map +1 -0
  235. package/dist/services/session-insights-service.d.ts +119 -0
  236. package/dist/services/session-insights-service.d.ts.map +1 -0
  237. package/dist/services/session-insights-service.js +889 -0
  238. package/dist/services/session-insights-service.js.map +1 -0
  239. package/dist/services/stream-manager.d.ts +62 -0
  240. package/dist/services/stream-manager.d.ts.map +1 -0
  241. package/dist/services/stream-manager.js +239 -0
  242. package/dist/services/stream-manager.js.map +1 -0
  243. package/dist/services/web-push-service.d.ts +48 -0
  244. package/dist/services/web-push-service.d.ts.map +1 -0
  245. package/dist/services/web-push-service.js +186 -0
  246. package/dist/services/web-push-service.js.map +1 -0
  247. package/dist/services/working-directories-service.d.ts +19 -0
  248. package/dist/services/working-directories-service.d.ts.map +1 -0
  249. package/dist/services/working-directories-service.js +103 -0
  250. package/dist/services/working-directories-service.js.map +1 -0
  251. package/dist/types/config.d.ts +111 -0
  252. package/dist/types/config.d.ts.map +1 -0
  253. package/dist/types/config.js +14 -0
  254. package/dist/types/config.js.map +1 -0
  255. package/dist/types/express.d.ts +5 -0
  256. package/dist/types/express.d.ts.map +1 -0
  257. package/dist/types/express.js +2 -0
  258. package/dist/types/express.js.map +1 -0
  259. package/dist/types/index.d.ts +325 -0
  260. package/dist/types/index.d.ts.map +1 -0
  261. package/dist/types/index.js +18 -0
  262. package/dist/types/index.js.map +1 -0
  263. package/dist/types/insights.d.ts +99 -0
  264. package/dist/types/insights.d.ts.map +1 -0
  265. package/dist/types/insights.js +7 -0
  266. package/dist/types/insights.js.map +1 -0
  267. package/dist/types/license.d.ts +70 -0
  268. package/dist/types/license.d.ts.map +1 -0
  269. package/dist/types/license.js +5 -0
  270. package/dist/types/license.js.map +1 -0
  271. package/dist/types/router-config.d.ts +13 -0
  272. package/dist/types/router-config.d.ts.map +1 -0
  273. package/dist/types/router-config.js +2 -0
  274. package/dist/types/router-config.js.map +1 -0
  275. package/dist/utils/constants.d.ts +26 -0
  276. package/dist/utils/constants.d.ts.map +1 -0
  277. package/dist/utils/constants.js +28 -0
  278. package/dist/utils/constants.js.map +1 -0
  279. package/dist/utils/machine-id.d.ts +7 -0
  280. package/dist/utils/machine-id.d.ts.map +1 -0
  281. package/dist/utils/machine-id.js +76 -0
  282. package/dist/utils/machine-id.js.map +1 -0
  283. package/dist/utils/server-startup.d.ts +13 -0
  284. package/dist/utils/server-startup.d.ts.map +1 -0
  285. package/dist/utils/server-startup.js +20 -0
  286. package/dist/utils/server-startup.js.map +1 -0
  287. package/dist/web/assets/main-DAc2rjJ2.css +1 -0
  288. package/dist/web/assets/main-DvlZ02mT.js +137 -0
  289. package/dist/web/favicon.png +0 -0
  290. package/dist/web/favicon.svg +22 -0
  291. package/dist/web/icon-192x192.png +0 -0
  292. package/dist/web/icon-512x512.png +0 -0
  293. package/dist/web/index.html +36 -0
  294. package/dist/web/manifest.json +61 -0
  295. package/package.json +174 -0
  296. package/scripts/postinstall.js +30 -0
@@ -0,0 +1,417 @@
1
+ /**
2
+ * Session insights routes - AI-powered session analysis, refresh, and observability.
3
+ *
4
+ * Endpoints:
5
+ * - GET /:sessionId/insights - Get insights for a session
6
+ * - POST /:sessionId/generate-name - Generate AI session name
7
+ * - POST /refresh - Refresh insights for all sessions (smart or force)
8
+ * - POST /activity-check - Lightweight heartbeat with mtime tracking
9
+ * - POST /pulse - 5-minute lightweight edit-check
10
+ * - GET /debug/:sessionId - Observability endpoint
11
+ * - GET /stats - Global insights stats
12
+ */
13
+ import { Router } from 'express';
14
+ import { CUIError } from '../types/index.js';
15
+ import { ClaudeHistoryReader } from '../services/claude-history-reader.js';
16
+ import { createLogger } from '../services/logger.js';
17
+ import { geminiService } from '../services/gemini-service.js';
18
+ import { SessionInsightsService } from '../services/session-insights-service.js';
19
+ import { getCostTracker } from '../services/cost-tracker.js';
20
+ export function createInsightsRoutes(historyReader, sessionInfoService) {
21
+ const router = Router();
22
+ const logger = createLogger('InsightsRoutes');
23
+ const insightsService = new SessionInsightsService(historyReader, sessionInfoService);
24
+ // Get session insights (todo state, progress, theme)
25
+ router.get('/:sessionId/insights', async (req, res, next) => {
26
+ const requestId = req.requestId;
27
+ const { sessionId } = req.params;
28
+ const quick = req.query.quick === 'true';
29
+ logger.info('[API] Get insights request', {
30
+ requestId,
31
+ sessionId: sessionId.slice(0, 8),
32
+ quick,
33
+ timestamp: new Date().toISOString()
34
+ });
35
+ try {
36
+ const insights = quick
37
+ ? await insightsService.getInsightsQuick(sessionId)
38
+ : await insightsService.getInsights(sessionId);
39
+ logger.info('[API] Insights retrieved and returning', {
40
+ requestId,
41
+ sessionId: sessionId.slice(0, 8),
42
+ hasInsights: !!insights,
43
+ hasMission: !!insights.context?.mission,
44
+ missionPreview: insights.context?.mission?.slice(0, 50),
45
+ milestoneCount: insights.milestones?.length || 0,
46
+ panelCount: insights.panels?.length || 0,
47
+ theme: insights.theme
48
+ });
49
+ res.json(insights);
50
+ }
51
+ catch (error) {
52
+ logger.debug('Get session insights failed', {
53
+ requestId,
54
+ sessionId,
55
+ error: error instanceof Error ? error.message : String(error)
56
+ });
57
+ next(error);
58
+ }
59
+ });
60
+ // Generate AI-powered session name
61
+ router.post('/:sessionId/generate-name', async (req, res, next) => {
62
+ const requestId = req.requestId;
63
+ const { sessionId } = req.params;
64
+ logger.debug('Generate session name request', { requestId, sessionId });
65
+ try {
66
+ const { messages } = await historyReader.fetchConversationDirect(sessionId);
67
+ if (messages.length === 0) {
68
+ throw new CUIError('NO_MESSAGES', 'No messages found in conversation', 400);
69
+ }
70
+ // Format messages into text for the AI
71
+ const relevantMessages = messages.slice(0, 6);
72
+ const conversationText = relevantMessages
73
+ .map(m => {
74
+ const content = m.message?.content;
75
+ let textContent = '';
76
+ if (typeof content === 'string') {
77
+ textContent = content;
78
+ }
79
+ else if (Array.isArray(content)) {
80
+ textContent = content
81
+ .filter((block) => typeof block === 'object' && block !== null && 'type' in block && block.type === 'text' && 'text' in block)
82
+ .map(block => block.text)
83
+ .join(' ');
84
+ }
85
+ return `${m.type}: ${textContent.slice(0, 500)}`;
86
+ })
87
+ .join('\n\n');
88
+ const result = await geminiService.generateSessionName(conversationText);
89
+ await sessionInfoService.updateCustomName(sessionId, result.name);
90
+ logger.info('Session name generated successfully', {
91
+ requestId,
92
+ sessionId,
93
+ generatedName: result.name
94
+ });
95
+ res.json({ success: true, sessionId, name: result.name });
96
+ }
97
+ catch (error) {
98
+ logger.debug('Generate session name failed', {
99
+ requestId,
100
+ sessionId,
101
+ error: error instanceof Error ? error.message : String(error)
102
+ });
103
+ next(error);
104
+ }
105
+ });
106
+ // Force regenerate insights for all active sessions
107
+ // When force=true, bypasses event-driven system and forces immediate regeneration
108
+ router.post('/refresh', async (req, res, next) => {
109
+ try {
110
+ // Handle both string 'true' and boolean true (depending on how query params are parsed)
111
+ const force = req.query.force === 'true' || req.query.force === true;
112
+ if (!force) {
113
+ // Non-force refresh is now event-driven
114
+ logger.debug('Insights refresh is event-driven (use force=true to regenerate)', {
115
+ requestId: req.requestId
116
+ });
117
+ return res.json({
118
+ success: true,
119
+ message: 'Insights refresh is now event-driven',
120
+ refreshed: 0,
121
+ mode: 'event-driven'
122
+ });
123
+ }
124
+ // Force regeneration: find all active manual sessions and regenerate
125
+ logger.info('Force regenerating insights for all active sessions', {
126
+ requestId: req.requestId
127
+ });
128
+ const reader = new ClaudeHistoryReader();
129
+ const { conversations } = await reader.listConversations({ archived: false });
130
+ // Filter to active manual (non-automated) sessions
131
+ const activeSessions = conversations.filter((s) => s.status === 'active' &&
132
+ !s.automated);
133
+ let regenerated = 0;
134
+ const errors = [];
135
+ for (const session of activeSessions) {
136
+ try {
137
+ logger.debug('Force regenerating insights', {
138
+ sessionId: session.sessionId.slice(0, 8),
139
+ requestId: req.requestId
140
+ });
141
+ const insights = await insightsService.computeInsights(session.sessionId);
142
+ await insightsService.cacheInsights(session.sessionId, insights);
143
+ regenerated++;
144
+ }
145
+ catch (error) {
146
+ logger.error('Failed to regenerate insights', {
147
+ sessionId: session.sessionId.slice(0, 8),
148
+ error: error instanceof Error ? error.message : String(error),
149
+ requestId: req.requestId
150
+ });
151
+ errors.push({
152
+ sessionId: session.sessionId.slice(0, 8),
153
+ error: error instanceof Error ? error.message : String(error)
154
+ });
155
+ }
156
+ }
157
+ res.json({
158
+ success: true,
159
+ message: `Force regenerated insights for ${regenerated} session(s)`,
160
+ regenerated,
161
+ total: activeSessions.length,
162
+ errors: errors.length > 0 ? errors : undefined
163
+ });
164
+ }
165
+ catch (error) {
166
+ logger.error('Force refresh failed', {
167
+ error: error instanceof Error ? error.message : String(error),
168
+ requestId: req.requestId
169
+ });
170
+ next(error);
171
+ }
172
+ });
173
+ // Lightweight activity check - returns file mtimes and current actions for sessions
174
+ router.post('/activity-check', async (req, res, next) => {
175
+ try {
176
+ const { sessionIds, knownMtimes, previouslyActiveSessionIds } = req.body;
177
+ if (!sessionIds || !Array.isArray(sessionIds)) {
178
+ res.status(400).json({ error: 'sessionIds array required' });
179
+ return;
180
+ }
181
+ const mtimes = await historyReader.getSessionFileMtimes(sessionIds);
182
+ const mtimesResult = {};
183
+ const now = Date.now();
184
+ const ACTIVE_THRESHOLD_MS = 120000; // 2 minutes
185
+ mtimes.forEach((mtime, sessionId) => {
186
+ mtimesResult[sessionId] = mtime;
187
+ });
188
+ // Detect active sessions based on recent file activity
189
+ const mtimeActiveSessionIds = sessionIds.filter(id => {
190
+ const mtime = mtimesResult[id];
191
+ return mtime !== undefined && (now - mtime) < ACTIVE_THRESHOLD_MS;
192
+ });
193
+ // Also check for sessions with active processes
194
+ const sessionsToCheckForProcess = sessionIds.filter(id => !mtimeActiveSessionIds.includes(id));
195
+ const processActiveSessionIds = sessionsToCheckForProcess.length > 0
196
+ ? await historyReader.getSessionsWithActiveProcesses(sessionsToCheckForProcess)
197
+ : new Set();
198
+ const activeSessionIds = [
199
+ ...mtimeActiveSessionIds,
200
+ ...Array.from(processActiveSessionIds)
201
+ ];
202
+ if (processActiveSessionIds.size > 0) {
203
+ logger.info('Process detection found active sessions with stale mtimes', {
204
+ count: processActiveSessionIds.size,
205
+ sessionIds: Array.from(processActiveSessionIds).map(id => id.slice(0, 8))
206
+ });
207
+ }
208
+ // Detect sessions that just became inactive
209
+ const justBecameInactive = [];
210
+ if (previouslyActiveSessionIds && previouslyActiveSessionIds.length > 0) {
211
+ const currentActiveSet = new Set(activeSessionIds);
212
+ for (const sessionId of previouslyActiveSessionIds) {
213
+ if (!currentActiveSet.has(sessionId)) {
214
+ justBecameInactive.push(sessionId);
215
+ }
216
+ }
217
+ if (justBecameInactive.length > 0) {
218
+ logger.info('Sessions just became inactive - triggering insights refresh', {
219
+ count: justBecameInactive.length,
220
+ sessionIds: justBecameInactive.map(id => id.slice(0, 8))
221
+ });
222
+ }
223
+ }
224
+ // Track sessions with changed mtimes
225
+ const changedSessionIds = sessionIds.filter(id => {
226
+ const newMtime = mtimesResult[id];
227
+ const oldMtime = knownMtimes?.[id];
228
+ return newMtime !== undefined && (oldMtime === undefined || newMtime !== oldMtime);
229
+ });
230
+ logger.info('Activity check', {
231
+ sessionCount: sessionIds.length,
232
+ changedCount: changedSessionIds.length,
233
+ activeCount: activeSessionIds.length,
234
+ hasKnownMtimes: !!knownMtimes && Object.keys(knownMtimes).length > 0
235
+ });
236
+ // Detect stale cache
237
+ const staleCacheSessionIds = [];
238
+ const allCachedInsights = await insightsService.getCachedInsightsForSessions(sessionIds);
239
+ logger.debug('Checking for stale cache', {
240
+ changedCount: changedSessionIds.length,
241
+ cachedCount: allCachedInsights.size
242
+ });
243
+ for (const sessionId of changedSessionIds) {
244
+ const cached = allCachedInsights.get(sessionId);
245
+ if (cached?.computedAt) {
246
+ const cachedAt = new Date(cached.computedAt).getTime();
247
+ const mtime = mtimesResult[sessionId];
248
+ const isStale = mtime && mtime > cachedAt;
249
+ if (isStale) {
250
+ staleCacheSessionIds.push(sessionId);
251
+ logger.info('Found stale cache', {
252
+ sessionId: sessionId.slice(0, 8),
253
+ cachedAt: new Date(cachedAt).toISOString(),
254
+ fileMtime: new Date(mtime).toISOString(),
255
+ ageSeconds: Math.round((mtime - cachedAt) / 1000)
256
+ });
257
+ }
258
+ }
259
+ }
260
+ const sessionsNeedingRefresh = [...new Set([...staleCacheSessionIds, ...justBecameInactive])];
261
+ if (sessionsNeedingRefresh.length > 0) {
262
+ // Filter out automated sessions - only generate insights for active manual sessions
263
+ const manualSessionsNeedingRefresh = [];
264
+ for (const sessionId of sessionsNeedingRefresh) {
265
+ const isAutomated = await insightsService.isAutomatedSession(sessionId);
266
+ if (!isAutomated) {
267
+ manualSessionsNeedingRefresh.push(sessionId);
268
+ }
269
+ }
270
+ if (manualSessionsNeedingRefresh.length > 0) {
271
+ logger.info('Triggering background insight refresh (manual sessions only)', {
272
+ count: manualSessionsNeedingRefresh.length,
273
+ filtered: sessionsNeedingRefresh.length - manualSessionsNeedingRefresh.length,
274
+ sessionIds: manualSessionsNeedingRefresh.map(id => id.slice(0, 8))
275
+ });
276
+ insightsService.recomputeStaleInsights(manualSessionsNeedingRefresh, 2).catch(err => logger.warn('Background insight refresh failed', { error: err }));
277
+ }
278
+ else {
279
+ logger.debug('Skipping insight refresh - all sessions are automated', {
280
+ totalNeedingRefresh: sessionsNeedingRefresh.length
281
+ });
282
+ }
283
+ }
284
+ // Include insight timestamps so frontend can detect when insights were updated
285
+ // (patched_at changes when insights are patched, even if the session file didn't change)
286
+ const insightMtimes = {};
287
+ for (const [sessionId, cached] of allCachedInsights.entries()) {
288
+ const timestamp = cached.patchedAt || cached.computedAt;
289
+ if (timestamp) {
290
+ insightMtimes[sessionId] = new Date(timestamp).getTime();
291
+ }
292
+ }
293
+ res.json({ mtimes: mtimesResult, activeSessionIds, insightMtimes });
294
+ }
295
+ catch (error) {
296
+ next(error);
297
+ }
298
+ });
299
+ // Pulse refresh - DEPRECATED: Now handled by event-driven system
300
+ // This endpoint is kept as a no-op for backwards compatibility
301
+ router.post('/pulse', async (req, res, _next) => {
302
+ logger.debug('Pulse refresh endpoint called (deprecated - event-driven system handles this)', {
303
+ requestId: req.requestId
304
+ });
305
+ // Return success with no updates - the event-driven system handles insights updates now
306
+ res.json({ success: true, updated: 0, unchanged: 0, skippedAutomated: 0, results: {} });
307
+ });
308
+ // Insights observability endpoint
309
+ router.get('/debug/:sessionId', async (req, res, next) => {
310
+ const requestId = req.requestId;
311
+ const { sessionId } = req.params;
312
+ try {
313
+ const cached = await sessionInfoService.getInsights(sessionId);
314
+ const auditHistory = sessionInfoService.getAuditHistory(sessionId, 20);
315
+ const { messages } = await historyReader.fetchConversationDirect(sessionId);
316
+ const currentMessageCount = messages.length;
317
+ const computedAt = cached?.computed_at ? new Date(cached.computed_at).getTime() : 0;
318
+ const ageMinutes = computedAt ? Math.round((Date.now() - computedAt) / (1000 * 60)) : null;
319
+ const messagesSinceCached = cached?.message_count ? currentMessageCount - cached.message_count : null;
320
+ res.json({
321
+ sessionId,
322
+ cached: cached ? {
323
+ mission: cached.context?.mission || cached.description,
324
+ theme: cached.theme,
325
+ milestones: cached.milestones,
326
+ panels: cached.panels,
327
+ messageCount: cached.message_count,
328
+ computedAt: cached.computed_at,
329
+ stale: cached.stale
330
+ } : null,
331
+ staleness: {
332
+ ageMinutes,
333
+ currentMessageCount,
334
+ cachedMessageCount: cached?.message_count || null,
335
+ messagesSinceCached
336
+ },
337
+ auditHistory: auditHistory.map(a => ({
338
+ action: a.action,
339
+ reason: a.reason,
340
+ missionChanged: a.oldMission !== a.newMission,
341
+ themeChanged: a.oldTheme !== a.newTheme,
342
+ createdAt: a.createdAt
343
+ }))
344
+ });
345
+ }
346
+ catch (error) {
347
+ logger.error('Insights debug failed', { requestId, sessionId, error });
348
+ next(error);
349
+ }
350
+ });
351
+ // Global insights stats
352
+ router.get('/stats', async (req, res, next) => {
353
+ const requestId = req.requestId;
354
+ try {
355
+ const allAudits = sessionInfoService.getAllAuditHistory(100);
356
+ const actionCounts = {};
357
+ for (const audit of allAudits) {
358
+ actionCounts[audit.action] = (actionCounts[audit.action] || 0) + 1;
359
+ }
360
+ res.json({
361
+ recentAudits: allAudits.length,
362
+ actionCounts,
363
+ recentActivity: allAudits.slice(0, 10).map(a => ({
364
+ sessionId: a.sessionId,
365
+ action: a.action,
366
+ reason: a.reason,
367
+ createdAt: a.createdAt
368
+ }))
369
+ });
370
+ }
371
+ catch (error) {
372
+ logger.error('Insights stats failed', { requestId, error });
373
+ next(error);
374
+ }
375
+ });
376
+ // LLM cost summary - shows costs by time period, operation, and model
377
+ router.get('/costs', async (req, res, next) => {
378
+ const requestId = req.requestId;
379
+ try {
380
+ const costTracker = getCostTracker();
381
+ const summary = costTracker.getSummary();
382
+ logger.info('Cost summary requested', {
383
+ requestId,
384
+ todayCalls: summary.today.calls,
385
+ todayCost: `$${summary.today.estimatedCostUsd.toFixed(2)}`,
386
+ allTimeCost: `$${summary.allTime.estimatedCostUsd.toFixed(2)}`,
387
+ });
388
+ res.json(summary);
389
+ }
390
+ catch (error) {
391
+ logger.error('Cost summary failed', { requestId, error });
392
+ next(error);
393
+ }
394
+ });
395
+ // Per-session LLM costs
396
+ router.get('/costs/:sessionId', async (req, res, next) => {
397
+ const requestId = req.requestId;
398
+ const { sessionId } = req.params;
399
+ try {
400
+ const costTracker = getCostTracker();
401
+ const costs = costTracker.getSessionCosts(sessionId);
402
+ logger.debug('Session costs requested', {
403
+ requestId,
404
+ sessionId: sessionId.slice(0, 8),
405
+ calls: costs.calls,
406
+ cost: `$${costs.estimatedCostUsd.toFixed(4)}`,
407
+ });
408
+ res.json(costs);
409
+ }
410
+ catch (error) {
411
+ logger.error('Session costs failed', { requestId, sessionId, error });
412
+ next(error);
413
+ }
414
+ });
415
+ return router;
416
+ }
417
+ //# sourceMappingURL=insights.routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insights.routes.js","sourceRoot":"","sources":["../../src/routes/insights.routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Router } from 'express';
2
+ export declare function createLicenseRoutes(): Router;
3
+ //# sourceMappingURL=license.routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"license.routes.d.ts","sourceRoot":"","sources":["../../src/routes/license.routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AAIpD,wBAAgB,mBAAmB,IAAI,MAAM,CAgH5C"}
@@ -0,0 +1,111 @@
1
+ import { Router } from 'express';
2
+ import { licenseService } from '../services/license-service.js';
3
+ import { createLogger } from '../services/logger.js';
4
+ export function createLicenseRoutes() {
5
+ const router = Router();
6
+ const logger = createLogger('LicenseRoutes');
7
+ /**
8
+ * GET /api/license
9
+ * Get current license information and limits
10
+ */
11
+ router.get('/', async (req, res) => {
12
+ try {
13
+ const validation = await licenseService.validate();
14
+ const limits = await licenseService.getLimits();
15
+ const isBetaMode = licenseService.isBetaMode();
16
+ res.json({
17
+ tier: validation.tier,
18
+ limits,
19
+ isBetaMode,
20
+ license: validation.license
21
+ ? {
22
+ email: validation.license.email,
23
+ tier: validation.license.tier,
24
+ expiresAt: validation.license.expiresAt,
25
+ activatedAt: validation.license.activatedAt,
26
+ }
27
+ : null,
28
+ });
29
+ }
30
+ catch (error) {
31
+ logger.error('Failed to get license', { error });
32
+ res.status(500).json({
33
+ error: 'Failed to retrieve license information',
34
+ });
35
+ }
36
+ });
37
+ /**
38
+ * POST /api/license/activate
39
+ * Activate a license token
40
+ *
41
+ * Body: { token: string }
42
+ */
43
+ router.post('/activate', async (req, res) => {
44
+ try {
45
+ const { token } = req.body;
46
+ if (!token) {
47
+ return res.status(400).json({
48
+ error: 'Missing required field: token',
49
+ });
50
+ }
51
+ const result = await licenseService.activate(token);
52
+ if (!result.valid) {
53
+ return res.status(400).json({
54
+ error: result.error || 'Invalid license token',
55
+ });
56
+ }
57
+ res.json({
58
+ success: true,
59
+ tier: result.tier,
60
+ license: result.license
61
+ ? {
62
+ email: result.license.email,
63
+ tier: result.license.tier,
64
+ expiresAt: result.license.expiresAt,
65
+ activatedAt: result.license.activatedAt,
66
+ }
67
+ : null,
68
+ });
69
+ }
70
+ catch (error) {
71
+ logger.error('Failed to activate license', { error });
72
+ res.status(500).json({
73
+ error: 'Failed to activate license',
74
+ });
75
+ }
76
+ });
77
+ /**
78
+ * POST /api/license/deactivate
79
+ * Deactivate the current license
80
+ */
81
+ router.post('/deactivate', async (req, res) => {
82
+ try {
83
+ await licenseService.deactivate();
84
+ res.json({ success: true });
85
+ }
86
+ catch (error) {
87
+ logger.error('Failed to deactivate license', { error });
88
+ res.status(500).json({
89
+ error: 'Failed to deactivate license',
90
+ });
91
+ }
92
+ });
93
+ /**
94
+ * GET /api/license/limits
95
+ * Get current license limits
96
+ */
97
+ router.get('/limits', async (req, res) => {
98
+ try {
99
+ const limits = await licenseService.getLimits();
100
+ res.json(limits);
101
+ }
102
+ catch (error) {
103
+ logger.error('Failed to get license limits', { error });
104
+ res.status(500).json({
105
+ error: 'Failed to retrieve license limits',
106
+ });
107
+ }
108
+ });
109
+ return router;
110
+ }
111
+ //# sourceMappingURL=license.routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"license.routes.js","sourceRoot":"","sources":["../../src/routes/license.routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Router } from 'express';
2
+ export declare function createLogRoutes(): Router;
3
+ //# sourceMappingURL=log.routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.routes.d.ts","sourceRoot":"","sources":["../../src/routes/log.routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAW,MAAM,SAAS,CAAC;AAK1C,wBAAgB,eAAe,IAAI,MAAM,CAwExC"}
@@ -0,0 +1,65 @@
1
+ import { Router } from 'express';
2
+ import { logStreamBuffer } from '../services/log-stream-buffer.js';
3
+ import { createLogger } from '../services/logger.js';
4
+ export function createLogRoutes() {
5
+ const router = Router();
6
+ const logger = createLogger('LogRoutes');
7
+ // Get recent logs
8
+ router.get('/recent', (req, res) => {
9
+ const requestId = req.requestId;
10
+ const limit = req.query.limit !== undefined ? req.query.limit : 100;
11
+ logger.debug('Get recent logs request', {
12
+ requestId,
13
+ limit
14
+ });
15
+ try {
16
+ const logs = logStreamBuffer.getRecentLogs(limit);
17
+ res.json({ logs });
18
+ }
19
+ catch (error) {
20
+ logger.error('Failed to get recent logs', error, { requestId });
21
+ res.status(500).json({ error: 'Failed to retrieve logs' });
22
+ }
23
+ });
24
+ // Stream logs via SSE
25
+ router.get('/stream', (req, res) => {
26
+ const requestId = req.requestId;
27
+ logger.debug('Log stream connection request', {
28
+ requestId,
29
+ headers: {
30
+ 'accept': req.headers.accept,
31
+ 'user-agent': req.headers['user-agent']
32
+ }
33
+ });
34
+ // Set SSE headers
35
+ res.writeHead(200, {
36
+ 'Content-Type': 'text/event-stream',
37
+ 'Cache-Control': 'no-cache',
38
+ 'Connection': 'keep-alive',
39
+ 'X-Accel-Buffering': 'no' // Disable proxy buffering
40
+ });
41
+ // Send initial connection confirmation
42
+ res.write('data: {"type":"connected"}\n\n');
43
+ // Create log listener
44
+ const logListener = (logLine) => {
45
+ res.write(`data: ${logLine}\n\n`);
46
+ };
47
+ // Subscribe to log events
48
+ logStreamBuffer.on('log', logListener);
49
+ // Handle client disconnect
50
+ req.on('close', () => {
51
+ logger.debug('Log stream connection closed', { requestId });
52
+ logStreamBuffer.removeListener('log', logListener);
53
+ });
54
+ // Send heartbeat every 30 seconds to keep connection alive
55
+ const heartbeat = setInterval(() => {
56
+ res.write(':heartbeat\n\n');
57
+ }, 30000);
58
+ // Clean up heartbeat on disconnect
59
+ req.on('close', () => {
60
+ clearInterval(heartbeat);
61
+ });
62
+ });
63
+ return router;
64
+ }
65
+ //# sourceMappingURL=log.routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.routes.js","sourceRoot":"","sources":["../../src/routes/log.routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Router } from 'express';
2
+ import { WebPushService } from '../services/web-push-service.js';
3
+ export declare function createNotificationsRoutes(webPush: WebPushService): Router;
4
+ //# sourceMappingURL=notifications.routes.d.ts.map