lattice-orchestrator 0.7.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 (440) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +58 -0
  3. package/config/logrotate.conf +15 -0
  4. package/dist/cli-parser.d.ts +11 -0
  5. package/dist/cli-parser.d.ts.map +1 -0
  6. package/dist/cli-parser.js +48 -0
  7. package/dist/cli-parser.js.map +1 -0
  8. package/dist/lattice-server.d.ts +70 -0
  9. package/dist/lattice-server.d.ts.map +1 -0
  10. package/dist/lattice-server.js +969 -0
  11. package/dist/lattice-server.js.map +1 -0
  12. package/dist/mcp-server/index.d.ts +3 -0
  13. package/dist/mcp-server/index.d.ts.map +1 -0
  14. package/dist/mcp-server/index.js +190 -0
  15. package/dist/mcp-server/index.js.map +1 -0
  16. package/dist/mcp-server/lattice-tools.d.ts +15 -0
  17. package/dist/mcp-server/lattice-tools.d.ts.map +1 -0
  18. package/dist/mcp-server/lattice-tools.js +366 -0
  19. package/dist/mcp-server/lattice-tools.js.map +1 -0
  20. package/dist/middleware/cors-setup.d.ts +7 -0
  21. package/dist/middleware/cors-setup.d.ts.map +1 -0
  22. package/dist/middleware/cors-setup.js +8 -0
  23. package/dist/middleware/cors-setup.js.map +1 -0
  24. package/dist/middleware/error-handler.d.ts +4 -0
  25. package/dist/middleware/error-handler.d.ts.map +1 -0
  26. package/dist/middleware/error-handler.js +27 -0
  27. package/dist/middleware/error-handler.js.map +1 -0
  28. package/dist/middleware/query-parser.d.ts +11 -0
  29. package/dist/middleware/query-parser.d.ts.map +1 -0
  30. package/dist/middleware/query-parser.js +68 -0
  31. package/dist/middleware/query-parser.js.map +1 -0
  32. package/dist/middleware/request-logger.d.ts +4 -0
  33. package/dist/middleware/request-logger.d.ts.map +1 -0
  34. package/dist/middleware/request-logger.js +6 -0
  35. package/dist/middleware/request-logger.js.map +1 -0
  36. package/dist/process-daemon/index.d.ts +14 -0
  37. package/dist/process-daemon/index.d.ts.map +1 -0
  38. package/dist/process-daemon/index.js +51 -0
  39. package/dist/process-daemon/index.js.map +1 -0
  40. package/dist/process-daemon/process-daemon.d.ts +101 -0
  41. package/dist/process-daemon/process-daemon.d.ts.map +1 -0
  42. package/dist/process-daemon/process-daemon.js +846 -0
  43. package/dist/process-daemon/process-daemon.js.map +1 -0
  44. package/dist/process-daemon/process-manager-client.d.ts +123 -0
  45. package/dist/process-daemon/process-manager-client.d.ts.map +1 -0
  46. package/dist/process-daemon/process-manager-client.js +329 -0
  47. package/dist/process-daemon/process-manager-client.js.map +1 -0
  48. package/dist/process-daemon/process-manager-interface.d.ts +61 -0
  49. package/dist/process-daemon/process-manager-interface.d.ts.map +1 -0
  50. package/dist/process-daemon/process-manager-interface.js +8 -0
  51. package/dist/process-daemon/process-manager-interface.js.map +1 -0
  52. package/dist/process-daemon/test-daemon.d.ts +12 -0
  53. package/dist/process-daemon/test-daemon.d.ts.map +1 -0
  54. package/dist/process-daemon/test-daemon.js +81 -0
  55. package/dist/process-daemon/test-daemon.js.map +1 -0
  56. package/dist/process-daemon/types.d.ts +97 -0
  57. package/dist/process-daemon/types.d.ts.map +1 -0
  58. package/dist/process-daemon/types.js +8 -0
  59. package/dist/process-daemon/types.js.map +1 -0
  60. package/dist/routes/analysis.routes.d.ts +13 -0
  61. package/dist/routes/analysis.routes.d.ts.map +1 -0
  62. package/dist/routes/analysis.routes.js +520 -0
  63. package/dist/routes/analysis.routes.js.map +1 -0
  64. package/dist/routes/config.routes.d.ts +4 -0
  65. package/dist/routes/config.routes.d.ts.map +1 -0
  66. package/dist/routes/config.routes.js +27 -0
  67. package/dist/routes/config.routes.js.map +1 -0
  68. package/dist/routes/conversation.routes.d.ts +43 -0
  69. package/dist/routes/conversation.routes.d.ts.map +1 -0
  70. package/dist/routes/conversation.routes.js +79 -0
  71. package/dist/routes/conversation.routes.js.map +1 -0
  72. package/dist/routes/filesystem.routes.d.ts +4 -0
  73. package/dist/routes/filesystem.routes.d.ts.map +1 -0
  74. package/dist/routes/filesystem.routes.js +86 -0
  75. package/dist/routes/filesystem.routes.js.map +1 -0
  76. package/dist/routes/insights.routes.d.ts +17 -0
  77. package/dist/routes/insights.routes.d.ts.map +1 -0
  78. package/dist/routes/insights.routes.js +633 -0
  79. package/dist/routes/insights.routes.js.map +1 -0
  80. package/dist/routes/lattice.routes.d.ts +10 -0
  81. package/dist/routes/lattice.routes.d.ts.map +1 -0
  82. package/dist/routes/lattice.routes.js +123 -0
  83. package/dist/routes/lattice.routes.js.map +1 -0
  84. package/dist/routes/license.routes.d.ts +3 -0
  85. package/dist/routes/license.routes.d.ts.map +1 -0
  86. package/dist/routes/license.routes.js +95 -0
  87. package/dist/routes/license.routes.js.map +1 -0
  88. package/dist/routes/log.routes.d.ts +3 -0
  89. package/dist/routes/log.routes.d.ts.map +1 -0
  90. package/dist/routes/log.routes.js +184 -0
  91. package/dist/routes/log.routes.js.map +1 -0
  92. package/dist/routes/pending-question.routes.d.ts +9 -0
  93. package/dist/routes/pending-question.routes.d.ts.map +1 -0
  94. package/dist/routes/pending-question.routes.js +162 -0
  95. package/dist/routes/pending-question.routes.js.map +1 -0
  96. package/dist/routes/permission.routes.d.ts +18 -0
  97. package/dist/routes/permission.routes.d.ts.map +1 -0
  98. package/dist/routes/permission.routes.js +370 -0
  99. package/dist/routes/permission.routes.js.map +1 -0
  100. package/dist/routes/process-events.routes.d.ts +9 -0
  101. package/dist/routes/process-events.routes.d.ts.map +1 -0
  102. package/dist/routes/process-events.routes.js +141 -0
  103. package/dist/routes/process-events.routes.js.map +1 -0
  104. package/dist/routes/prototype.routes.d.ts +9 -0
  105. package/dist/routes/prototype.routes.d.ts.map +1 -0
  106. package/dist/routes/prototype.routes.js +757 -0
  107. package/dist/routes/prototype.routes.js.map +1 -0
  108. package/dist/routes/question.routes.d.ts +8 -0
  109. package/dist/routes/question.routes.d.ts.map +1 -0
  110. package/dist/routes/question.routes.js +83 -0
  111. package/dist/routes/question.routes.js.map +1 -0
  112. package/dist/routes/session-control.routes.d.ts +29 -0
  113. package/dist/routes/session-control.routes.d.ts.map +1 -0
  114. package/dist/routes/session-control.routes.js +455 -0
  115. package/dist/routes/session-control.routes.js.map +1 -0
  116. package/dist/routes/session-lifecycle.routes.d.ts +21 -0
  117. package/dist/routes/session-lifecycle.routes.d.ts.map +1 -0
  118. package/dist/routes/session-lifecycle.routes.js +256 -0
  119. package/dist/routes/session-lifecycle.routes.js.map +1 -0
  120. package/dist/routes/session-query.routes.d.ts +25 -0
  121. package/dist/routes/session-query.routes.d.ts.map +1 -0
  122. package/dist/routes/session-query.routes.js +363 -0
  123. package/dist/routes/session-query.routes.js.map +1 -0
  124. package/dist/routes/session-stream.routes.d.ts +21 -0
  125. package/dist/routes/session-stream.routes.d.ts.map +1 -0
  126. package/dist/routes/session-stream.routes.js +235 -0
  127. package/dist/routes/session-stream.routes.js.map +1 -0
  128. package/dist/routes/streaming.routes.d.ts +4 -0
  129. package/dist/routes/streaming.routes.d.ts.map +1 -0
  130. package/dist/routes/streaming.routes.js +33 -0
  131. package/dist/routes/streaming.routes.js.map +1 -0
  132. package/dist/routes/system.routes.d.ts +7 -0
  133. package/dist/routes/system.routes.d.ts.map +1 -0
  134. package/dist/routes/system.routes.js +214 -0
  135. package/dist/routes/system.routes.js.map +1 -0
  136. package/dist/routes/walkthrough.routes.d.ts +19 -0
  137. package/dist/routes/walkthrough.routes.d.ts.map +1 -0
  138. package/dist/routes/walkthrough.routes.js +688 -0
  139. package/dist/routes/walkthrough.routes.js.map +1 -0
  140. package/dist/routes/working-directories.routes.d.ts +4 -0
  141. package/dist/routes/working-directories.routes.d.ts.map +1 -0
  142. package/dist/routes/working-directories.routes.js +25 -0
  143. package/dist/routes/working-directories.routes.js.map +1 -0
  144. package/dist/server.d.ts +3 -0
  145. package/dist/server.d.ts.map +1 -0
  146. package/dist/server.js +34 -0
  147. package/dist/server.js.map +1 -0
  148. package/dist/services/ToolMetricsService.d.ts +53 -0
  149. package/dist/services/ToolMetricsService.d.ts.map +1 -0
  150. package/dist/services/ToolMetricsService.js +230 -0
  151. package/dist/services/ToolMetricsService.js.map +1 -0
  152. package/dist/services/claude-router-service.d.ts +19 -0
  153. package/dist/services/claude-router-service.d.ts.map +1 -0
  154. package/dist/services/claude-router-service.js +160 -0
  155. package/dist/services/claude-router-service.js.map +1 -0
  156. package/dist/services/commands-service.d.ts +20 -0
  157. package/dist/services/commands-service.d.ts.map +1 -0
  158. package/dist/services/commands-service.js +115 -0
  159. package/dist/services/commands-service.js.map +1 -0
  160. package/dist/services/connection-debug-logger.d.ts +85 -0
  161. package/dist/services/connection-debug-logger.d.ts.map +1 -0
  162. package/dist/services/connection-debug-logger.js +221 -0
  163. package/dist/services/connection-debug-logger.js.map +1 -0
  164. package/dist/services/debug-log.d.ts +6 -0
  165. package/dist/services/debug-log.d.ts.map +1 -0
  166. package/dist/services/debug-log.js +27 -0
  167. package/dist/services/debug-log.js.map +1 -0
  168. package/dist/services/gemini-service.d.ts +35 -0
  169. package/dist/services/gemini-service.d.ts.map +1 -0
  170. package/dist/services/gemini-service.js +256 -0
  171. package/dist/services/gemini-service.js.map +1 -0
  172. package/dist/services/infrastructure/config-service.d.ts +79 -0
  173. package/dist/services/infrastructure/config-service.d.ts.map +1 -0
  174. package/dist/services/infrastructure/config-service.js +431 -0
  175. package/dist/services/infrastructure/config-service.js.map +1 -0
  176. package/dist/services/infrastructure/cost-tracker.d.ts +112 -0
  177. package/dist/services/infrastructure/cost-tracker.d.ts.map +1 -0
  178. package/dist/services/infrastructure/cost-tracker.js +423 -0
  179. package/dist/services/infrastructure/cost-tracker.js.map +1 -0
  180. package/dist/services/infrastructure/file-system-service.d.ts +61 -0
  181. package/dist/services/infrastructure/file-system-service.d.ts.map +1 -0
  182. package/dist/services/infrastructure/file-system-service.js +348 -0
  183. package/dist/services/infrastructure/file-system-service.js.map +1 -0
  184. package/dist/services/infrastructure/log-formatter.d.ts +5 -0
  185. package/dist/services/infrastructure/log-formatter.d.ts.map +1 -0
  186. package/dist/services/infrastructure/log-formatter.js +77 -0
  187. package/dist/services/infrastructure/log-formatter.js.map +1 -0
  188. package/dist/services/infrastructure/log-stream-buffer.d.ts +11 -0
  189. package/dist/services/infrastructure/log-stream-buffer.d.ts.map +1 -0
  190. package/dist/services/infrastructure/log-stream-buffer.js +36 -0
  191. package/dist/services/infrastructure/log-stream-buffer.js.map +1 -0
  192. package/dist/services/infrastructure/logger.d.ts +71 -0
  193. package/dist/services/infrastructure/logger.d.ts.map +1 -0
  194. package/dist/services/infrastructure/logger.js +215 -0
  195. package/dist/services/infrastructure/logger.js.map +1 -0
  196. package/dist/services/infrastructure/service-registry.d.ts +86 -0
  197. package/dist/services/infrastructure/service-registry.d.ts.map +1 -0
  198. package/dist/services/infrastructure/service-registry.js +162 -0
  199. package/dist/services/infrastructure/service-registry.js.map +1 -0
  200. package/dist/services/infrastructure/stream-manager.d.ts +87 -0
  201. package/dist/services/infrastructure/stream-manager.d.ts.map +1 -0
  202. package/dist/services/infrastructure/stream-manager.js +436 -0
  203. package/dist/services/infrastructure/stream-manager.js.map +1 -0
  204. package/dist/services/infrastructure/timing.d.ts +72 -0
  205. package/dist/services/infrastructure/timing.d.ts.map +1 -0
  206. package/dist/services/infrastructure/timing.js +115 -0
  207. package/dist/services/infrastructure/timing.js.map +1 -0
  208. package/dist/services/insights/anthropic-service.d.ts +224 -0
  209. package/dist/services/insights/anthropic-service.d.ts.map +1 -0
  210. package/dist/services/insights/anthropic-service.js +1062 -0
  211. package/dist/services/insights/anthropic-service.js.map +1 -0
  212. package/dist/services/insights/insight-audit-repository.d.ts +119 -0
  213. package/dist/services/insights/insight-audit-repository.d.ts.map +1 -0
  214. package/dist/services/insights/insight-audit-repository.js +242 -0
  215. package/dist/services/insights/insight-audit-repository.js.map +1 -0
  216. package/dist/services/insights/insight-queue.d.ts +99 -0
  217. package/dist/services/insights/insight-queue.d.ts.map +1 -0
  218. package/dist/services/insights/insight-queue.js +277 -0
  219. package/dist/services/insights/insight-queue.js.map +1 -0
  220. package/dist/services/insights/insights-computer.d.ts +132 -0
  221. package/dist/services/insights/insights-computer.d.ts.map +1 -0
  222. package/dist/services/insights/insights-computer.js +936 -0
  223. package/dist/services/insights/insights-computer.js.map +1 -0
  224. package/dist/services/insights/insights-coordinator.d.ts +165 -0
  225. package/dist/services/insights/insights-coordinator.d.ts.map +1 -0
  226. package/dist/services/insights/insights-coordinator.js +1678 -0
  227. package/dist/services/insights/insights-coordinator.js.map +1 -0
  228. package/dist/services/insights/insights-event-log.d.ts +196 -0
  229. package/dist/services/insights/insights-event-log.d.ts.map +1 -0
  230. package/dist/services/insights/insights-event-log.js +319 -0
  231. package/dist/services/insights/insights-event-log.js.map +1 -0
  232. package/dist/services/lattice-service.d.ts +77 -0
  233. package/dist/services/lattice-service.d.ts.map +1 -0
  234. package/dist/services/lattice-service.js +195 -0
  235. package/dist/services/lattice-service.js.map +1 -0
  236. package/dist/services/license-service.d.ts +69 -0
  237. package/dist/services/license-service.d.ts.map +1 -0
  238. package/dist/services/license-service.js +330 -0
  239. package/dist/services/license-service.js.map +1 -0
  240. package/dist/services/mcp-config-generator.d.ts +32 -0
  241. package/dist/services/mcp-config-generator.d.ts.map +1 -0
  242. package/dist/services/mcp-config-generator.js +126 -0
  243. package/dist/services/mcp-config-generator.js.map +1 -0
  244. package/dist/services/message-filter.d.ts +22 -0
  245. package/dist/services/message-filter.d.ts.map +1 -0
  246. package/dist/services/message-filter.js +57 -0
  247. package/dist/services/message-filter.js.map +1 -0
  248. package/dist/services/notification-service.d.ts +45 -0
  249. package/dist/services/notification-service.d.ts.map +1 -0
  250. package/dist/services/notification-service.js +184 -0
  251. package/dist/services/notification-service.js.map +1 -0
  252. package/dist/services/pending-question-service.d.ts +97 -0
  253. package/dist/services/pending-question-service.d.ts.map +1 -0
  254. package/dist/services/pending-question-service.js +223 -0
  255. package/dist/services/pending-question-service.js.map +1 -0
  256. package/dist/services/permission-event-log.d.ts +136 -0
  257. package/dist/services/permission-event-log.d.ts.map +1 -0
  258. package/dist/services/permission-event-log.js +252 -0
  259. package/dist/services/permission-event-log.js.map +1 -0
  260. package/dist/services/permission-pattern-matcher.d.ts +82 -0
  261. package/dist/services/permission-pattern-matcher.d.ts.map +1 -0
  262. package/dist/services/permission-pattern-matcher.js +294 -0
  263. package/dist/services/permission-pattern-matcher.js.map +1 -0
  264. package/dist/services/permission-tracker.d.ts +67 -0
  265. package/dist/services/permission-tracker.d.ts.map +1 -0
  266. package/dist/services/permission-tracker.js +162 -0
  267. package/dist/services/permission-tracker.js.map +1 -0
  268. package/dist/services/process/claude-process-manager.d.ts +142 -0
  269. package/dist/services/process/claude-process-manager.d.ts.map +1 -0
  270. package/dist/services/process/claude-process-manager.js +1218 -0
  271. package/dist/services/process/claude-process-manager.js.map +1 -0
  272. package/dist/services/process/conversation-status-manager.d.ts +110 -0
  273. package/dist/services/process/conversation-status-manager.d.ts.map +1 -0
  274. package/dist/services/process/conversation-status-manager.js +349 -0
  275. package/dist/services/process/conversation-status-manager.js.map +1 -0
  276. package/dist/services/process/json-lines-parser.d.ts +19 -0
  277. package/dist/services/process/json-lines-parser.d.ts.map +1 -0
  278. package/dist/services/process/json-lines-parser.js +59 -0
  279. package/dist/services/process/json-lines-parser.js.map +1 -0
  280. package/dist/services/process/process-event-log.d.ts +263 -0
  281. package/dist/services/process/process-event-log.d.ts.map +1 -0
  282. package/dist/services/process/process-event-log.js +509 -0
  283. package/dist/services/process/process-event-log.js.map +1 -0
  284. package/dist/services/process/process-manager-factory.d.ts +109 -0
  285. package/dist/services/process/process-manager-factory.d.ts.map +1 -0
  286. package/dist/services/process/process-manager-factory.js +338 -0
  287. package/dist/services/process/process-manager-factory.js.map +1 -0
  288. package/dist/services/question-tracker.d.ts +51 -0
  289. package/dist/services/question-tracker.d.ts.map +1 -0
  290. package/dist/services/question-tracker.js +111 -0
  291. package/dist/services/question-tracker.js.map +1 -0
  292. package/dist/services/sessions/claude-history-reader.d.ts +139 -0
  293. package/dist/services/sessions/claude-history-reader.d.ts.map +1 -0
  294. package/dist/services/sessions/claude-history-reader.js +864 -0
  295. package/dist/services/sessions/claude-history-reader.js.map +1 -0
  296. package/dist/services/sessions/conversation-cache.d.ts +98 -0
  297. package/dist/services/sessions/conversation-cache.d.ts.map +1 -0
  298. package/dist/services/sessions/conversation-cache.js +329 -0
  299. package/dist/services/sessions/conversation-cache.js.map +1 -0
  300. package/dist/services/sessions/session-activity-watcher.d.ts +67 -0
  301. package/dist/services/sessions/session-activity-watcher.d.ts.map +1 -0
  302. package/dist/services/sessions/session-activity-watcher.js +236 -0
  303. package/dist/services/sessions/session-activity-watcher.js.map +1 -0
  304. package/dist/services/sessions/session-analysis-service.d.ts +72 -0
  305. package/dist/services/sessions/session-analysis-service.d.ts.map +1 -0
  306. package/dist/services/sessions/session-analysis-service.js +373 -0
  307. package/dist/services/sessions/session-analysis-service.js.map +1 -0
  308. package/dist/services/sessions/session-branch-service.d.ts +76 -0
  309. package/dist/services/sessions/session-branch-service.d.ts.map +1 -0
  310. package/dist/services/sessions/session-branch-service.js +355 -0
  311. package/dist/services/sessions/session-branch-service.js.map +1 -0
  312. package/dist/services/sessions/session-info-service.d.ts +455 -0
  313. package/dist/services/sessions/session-info-service.d.ts.map +1 -0
  314. package/dist/services/sessions/session-info-service.js +1640 -0
  315. package/dist/services/sessions/session-info-service.js.map +1 -0
  316. package/dist/services/sessions/session-marks-repository.d.ts +78 -0
  317. package/dist/services/sessions/session-marks-repository.d.ts.map +1 -0
  318. package/dist/services/sessions/session-marks-repository.js +263 -0
  319. package/dist/services/sessions/session-marks-repository.js.map +1 -0
  320. package/dist/services/sessions/session-marks-service.d.ts +137 -0
  321. package/dist/services/sessions/session-marks-service.d.ts.map +1 -0
  322. package/dist/services/sessions/session-marks-service.js +562 -0
  323. package/dist/services/sessions/session-marks-service.js.map +1 -0
  324. package/dist/services/sessions/session-review-service.d.ts +98 -0
  325. package/dist/services/sessions/session-review-service.d.ts.map +1 -0
  326. package/dist/services/sessions/session-review-service.js +629 -0
  327. package/dist/services/sessions/session-review-service.js.map +1 -0
  328. package/dist/services/sessions/turn-capture-service.d.ts +83 -0
  329. package/dist/services/sessions/turn-capture-service.d.ts.map +1 -0
  330. package/dist/services/sessions/turn-capture-service.js +477 -0
  331. package/dist/services/sessions/turn-capture-service.js.map +1 -0
  332. package/dist/services/sessions/turn-repository.d.ts +48 -0
  333. package/dist/services/sessions/turn-repository.d.ts.map +1 -0
  334. package/dist/services/sessions/turn-repository.js +103 -0
  335. package/dist/services/sessions/turn-repository.js.map +1 -0
  336. package/dist/services/walkthrough-service.d.ts +226 -0
  337. package/dist/services/walkthrough-service.d.ts.map +1 -0
  338. package/dist/services/walkthrough-service.js +1112 -0
  339. package/dist/services/walkthrough-service.js.map +1 -0
  340. package/dist/services/walkthrough-skill-prompt.d.ts +34 -0
  341. package/dist/services/walkthrough-skill-prompt.d.ts.map +1 -0
  342. package/dist/services/walkthrough-skill-prompt.js +313 -0
  343. package/dist/services/walkthrough-skill-prompt.js.map +1 -0
  344. package/dist/services/web-push-service.d.ts +48 -0
  345. package/dist/services/web-push-service.d.ts.map +1 -0
  346. package/dist/services/web-push-service.js +186 -0
  347. package/dist/services/web-push-service.js.map +1 -0
  348. package/dist/services/working-directories-service.d.ts +19 -0
  349. package/dist/services/working-directories-service.d.ts.map +1 -0
  350. package/dist/services/working-directories-service.js +103 -0
  351. package/dist/services/working-directories-service.js.map +1 -0
  352. package/dist/types/config.d.ts +122 -0
  353. package/dist/types/config.d.ts.map +1 -0
  354. package/dist/types/config.js +21 -0
  355. package/dist/types/config.js.map +1 -0
  356. package/dist/types/express.d.ts +5 -0
  357. package/dist/types/express.d.ts.map +1 -0
  358. package/dist/types/express.js +2 -0
  359. package/dist/types/express.js.map +1 -0
  360. package/dist/types/index.d.ts +400 -0
  361. package/dist/types/index.d.ts.map +1 -0
  362. package/dist/types/index.js +41 -0
  363. package/dist/types/index.js.map +1 -0
  364. package/dist/types/insights.d.ts +176 -0
  365. package/dist/types/insights.d.ts.map +1 -0
  366. package/dist/types/insights.js +23 -0
  367. package/dist/types/insights.js.map +1 -0
  368. package/dist/types/license.d.ts +70 -0
  369. package/dist/types/license.d.ts.map +1 -0
  370. package/dist/types/license.js +5 -0
  371. package/dist/types/license.js.map +1 -0
  372. package/dist/types/router-config.d.ts +13 -0
  373. package/dist/types/router-config.d.ts.map +1 -0
  374. package/dist/types/router-config.js +2 -0
  375. package/dist/types/router-config.js.map +1 -0
  376. package/dist/utils/constants.d.ts +26 -0
  377. package/dist/utils/constants.d.ts.map +1 -0
  378. package/dist/utils/constants.js +28 -0
  379. package/dist/utils/constants.js.map +1 -0
  380. package/dist/utils/machine-id.d.ts +7 -0
  381. package/dist/utils/machine-id.d.ts.map +1 -0
  382. package/dist/utils/machine-id.js +76 -0
  383. package/dist/utils/machine-id.js.map +1 -0
  384. package/dist/utils/server-startup.d.ts +11 -0
  385. package/dist/utils/server-startup.d.ts.map +1 -0
  386. package/dist/utils/server-startup.js +9 -0
  387. package/dist/utils/server-startup.js.map +1 -0
  388. package/dist/utils/update-check.d.ts +13 -0
  389. package/dist/utils/update-check.d.ts.map +1 -0
  390. package/dist/utils/update-check.js +90 -0
  391. package/dist/utils/update-check.js.map +1 -0
  392. package/dist/web/assets/ArchivedCardPrototype-S9ifiasa.js +5 -0
  393. package/dist/web/assets/BannerGallery-B__rJV6F.js +1 -0
  394. package/dist/web/assets/BannerPrototype-DBKP9Uiu.js +52 -0
  395. package/dist/web/assets/CodeHikeExperiment-B8jjWAFy.js +15 -0
  396. package/dist/web/assets/ContextTooltipVariations-DzklAFam.js +1 -0
  397. package/dist/web/assets/FontShowcasePrototype-KIMEWeP2.js +13 -0
  398. package/dist/web/assets/GeometricGallery-DddlWhHK.js +1 -0
  399. package/dist/web/assets/HistoryWalkthroughPrototype-DeniRRdw.js +18 -0
  400. package/dist/web/assets/InlineWalkthroughPrototype-Csd5r_Hk.js +1 -0
  401. package/dist/web/assets/MarkButtonPrototype-CxhxE0RP.js +1 -0
  402. package/dist/web/assets/MenuStylesPrototype-D7neA6YM.js +1 -0
  403. package/dist/web/assets/MomentCardVariations-2GT7GyFn.js +1 -0
  404. package/dist/web/assets/MomentHeaderVariations-DhGEw4XC.js +1 -0
  405. package/dist/web/assets/NarrativeWalkthroughDemo-B5C566fu.js +389 -0
  406. package/dist/web/assets/OutcomeVariations-BrZfsVcs.js +1 -0
  407. package/dist/web/assets/PermissionPatternPickerPrototype-CBOhe2Me.js +1 -0
  408. package/dist/web/assets/PermissionPrototype-BcF-a5an.js +1 -0
  409. package/dist/web/assets/PipelineGallery-BJhyM0rx.js +1 -0
  410. package/dist/web/assets/ScopeHeaderPrototype-GD1HNfaO.js +1 -0
  411. package/dist/web/assets/ScopeHeaderStylesPrototype-aa4uNJJ1.js +1 -0
  412. package/dist/web/assets/ScrollycodingPrototype-CKW1bf72.js +70 -0
  413. package/dist/web/assets/SectionHeaderVariations-DM8vUwfj.js +1 -0
  414. package/dist/web/assets/SemanticGallery-CtQEo7St.js +1 -0
  415. package/dist/web/assets/SessionCardPrototype-CgHCIMHe.js +1 -0
  416. package/dist/web/assets/SessionSidebarVariations-DMQL3Azj.js +3 -0
  417. package/dist/web/assets/SessionStartPrototype-Cwsv01Rr.js +1 -0
  418. package/dist/web/assets/SmartMenuPrototype-Br37Qbs_.js +1 -0
  419. package/dist/web/assets/StyleGallery-rZgrploB.js +1 -0
  420. package/dist/web/assets/TimelineCardPrototype-lzPc5mhe.js +19 -0
  421. package/dist/web/assets/ToolbarPrototype-Dm4BNZra.js +1 -0
  422. package/dist/web/assets/TooltipExperiment-Dy8QzTIP.js +13 -0
  423. package/dist/web/assets/WalkthroughCTAPrototype-uHoovujd.js +1 -0
  424. package/dist/web/assets/WalkthroughHeaderVariations-Do7Di1g1.js +1 -0
  425. package/dist/web/assets/WalkthroughShowcase-sGmRoPoM.js +112 -0
  426. package/dist/web/assets/arrow-right-D46Nx1mC.js +1 -0
  427. package/dist/web/assets/brain-BXIZKtOZ.js +1 -0
  428. package/dist/web/assets/grid-3x3-Cb81B62m.js +1 -0
  429. package/dist/web/assets/main-B1fyog77.js +321 -0
  430. package/dist/web/assets/main-C2PK2Klg.css +1 -0
  431. package/dist/web/assets/semantic-variations-Bd-W7ea2.js +1 -0
  432. package/dist/web/assets/target-Cf92wDTW.js +1 -0
  433. package/dist/web/favicon.png +0 -0
  434. package/dist/web/favicon.svg +22 -0
  435. package/dist/web/icon-192x192.png +0 -0
  436. package/dist/web/icon-512x512.png +0 -0
  437. package/dist/web/index.html +45 -0
  438. package/dist/web/manifest.json +61 -0
  439. package/package.json +192 -0
  440. package/scripts/postinstall.js +60 -0
@@ -0,0 +1,363 @@
1
+ /**
2
+ * Session Query Routes - Read-only session queries.
3
+ *
4
+ * Extracted from conversation.routes.ts for maintainability.
5
+ *
6
+ * ROUTES:
7
+ * GET / - List all conversations with pagination
8
+ * GET /active - Get active session IDs (lightweight)
9
+ * GET /:sessionId - Get conversation details and messages
10
+ */
11
+ import { Router } from 'express';
12
+ import { LatticeError, asClaudeSessionId, } from '../types/index.js';
13
+ import { createLogger } from '../services/infrastructure/logger.js';
14
+ import { createTimer } from '../services/infrastructure/timing.js';
15
+ import { connectionDebugLogger } from '../services/connection-debug-logger.js';
16
+ import { SessionBranchService } from '../services/sessions/session-branch-service.js';
17
+ const logger = createLogger('SessionQueryRoutes');
18
+ export function createSessionQueryRoutes(deps) {
19
+ const { historyReader, conversationStatusManager, sessionInfoService, toolMetricsService, insightsComputer } = deps;
20
+ const router = Router();
21
+ // List conversations
22
+ router.get('/', async (req, res, next) => {
23
+ const requestId = req.requestId;
24
+ const timer = createTimer('listConversations', logger);
25
+ logger.debug('List conversations request', {
26
+ requestId,
27
+ query: req.query
28
+ });
29
+ try {
30
+ const result = await historyReader.listConversations(req.query);
31
+ timer.mark('listConversations');
32
+ const isArchiveView = req.query.archived === true;
33
+ // Update status for each conversation based on active streams
34
+ const conversationsWithStatus = result.conversations.map(conversation => {
35
+ const claudeSessionId = asClaudeSessionId(conversation.sessionId);
36
+ const status = conversationStatusManager.getConversationStatus(claudeSessionId);
37
+ const baseConversation = {
38
+ ...conversation,
39
+ status
40
+ };
41
+ // Add toolMetrics if available
42
+ const metrics = toolMetricsService.getMetrics(conversation.sessionId);
43
+ if (metrics) {
44
+ baseConversation.toolMetrics = metrics;
45
+ }
46
+ // Add streamingId if conversation is ongoing
47
+ if (status === 'ongoing') {
48
+ const streamingId = conversationStatusManager.getStreamingId(claudeSessionId);
49
+ if (streamingId) {
50
+ connectionDebugLogger.log('SessionQueryRoutes', 'list-ongoing-session', {
51
+ sessionId: conversation.sessionId.slice(0, 8),
52
+ streamingId: streamingId.slice(0, 8),
53
+ });
54
+ return { ...baseConversation, streamingId };
55
+ }
56
+ else {
57
+ // Status says ongoing but no streamingId - this shouldn't happen
58
+ connectionDebugLogger.log('SessionQueryRoutes', 'list-ongoing-no-streaming-id', {
59
+ sessionId: conversation.sessionId.slice(0, 8),
60
+ trackedSessions: conversationStatusManager.getActiveSessionIds().map(s => s.slice(0, 8)),
61
+ });
62
+ }
63
+ }
64
+ return baseConversation;
65
+ });
66
+ timer.mark('statusMapping');
67
+ // Get all active sessions and add optimistic conversations for those not in history
68
+ // But only when NOT viewing archive (active sessions shouldn't appear in archive view)
69
+ const existingSessionIds = new Set(conversationsWithStatus.map(c => c.sessionId));
70
+ const conversationsNotInHistory = isArchiveView
71
+ ? []
72
+ : conversationStatusManager.getConversationsNotInHistory(existingSessionIds);
73
+ // Combine history conversations with active ones not in history
74
+ const allConversations = [...conversationsWithStatus, ...conversationsNotInHistory];
75
+ // Ensure session info entries exist for all conversations
76
+ try {
77
+ await sessionInfoService.syncMissingSessions(allConversations.map(c => c.sessionId));
78
+ }
79
+ catch (syncError) {
80
+ logger.debug('Failed to sync session info', {
81
+ requestId,
82
+ error: syncError instanceof Error ? syncError.message : String(syncError)
83
+ });
84
+ }
85
+ timer.mark('syncMissingSessions');
86
+ // Fetch cached insights for all sessions in one DB call
87
+ const sessionIds = allConversations.map(c => c.sessionId);
88
+ let cachedInsights = new Map();
89
+ try {
90
+ cachedInsights = await insightsComputer.getCachedInsightsForSessions(sessionIds);
91
+ // If we have sessions without cached insights, compute them in background
92
+ const missingSessions = sessionIds.filter(id => !cachedInsights.has(id));
93
+ if (missingSessions.length > 0) {
94
+ logger.debug('Computing missing insights in background', { count: missingSessions.length });
95
+ // Fire and forget - don't block the response
96
+ insightsComputer.computeMissingInsights(missingSessions, 3).catch(err => logger.debug('Background insights computation failed', { error: err }));
97
+ }
98
+ }
99
+ catch (insightsError) {
100
+ logger.debug('Failed to fetch cached insights', {
101
+ requestId,
102
+ error: insightsError instanceof Error ? insightsError.message : String(insightsError)
103
+ });
104
+ }
105
+ timer.mark('getCachedInsights');
106
+ // Attach insights to each conversation
107
+ const conversationsWithInsights = allConversations.map(conv => ({
108
+ ...conv,
109
+ insights: cachedInsights.get(conv.sessionId) || undefined
110
+ }));
111
+ // Log timing with context
112
+ timer.end({
113
+ requestId,
114
+ conversationCount: conversationsWithInsights.length,
115
+ historyConversations: conversationsWithStatus.length,
116
+ conversationsNotInHistory: conversationsNotInHistory.length,
117
+ totalFound: result.total,
118
+ activeConversations: conversationsWithInsights.filter(c => c.status === 'ongoing').length,
119
+ withInsights: cachedInsights.size,
120
+ archived: isArchiveView,
121
+ });
122
+ res.json({
123
+ conversations: conversationsWithInsights,
124
+ total: result.total + conversationsNotInHistory.length // Update total to include conversations not in history
125
+ });
126
+ }
127
+ catch (error) {
128
+ logger.debug('List conversations failed', {
129
+ requestId,
130
+ error: error instanceof Error ? error.message : String(error)
131
+ });
132
+ next(error);
133
+ }
134
+ });
135
+ // Get active sessions only (lightweight endpoint for checking current activity)
136
+ // Returns just the currently running sessions without pagination or history lookup
137
+ router.get('/active', async (req, res, next) => {
138
+ const requestId = req.requestId;
139
+ logger.debug('Get active conversations request', { requestId });
140
+ try {
141
+ // Get active session data directly from status manager (fast, in-memory)
142
+ const activeSessionIds = conversationStatusManager.getActiveSessionIds();
143
+ if (activeSessionIds.length === 0) {
144
+ logger.debug('No active sessions', { requestId });
145
+ res.json({ conversations: [], total: 0 });
146
+ return;
147
+ }
148
+ // Build response with minimal data needed for active session display
149
+ const activeConversations = activeSessionIds.map(sessionId => {
150
+ const streamingId = conversationStatusManager.getStreamingId(sessionId);
151
+ const context = conversationStatusManager.getConversationContext(sessionId);
152
+ return {
153
+ sessionId,
154
+ streamingId,
155
+ status: 'ongoing',
156
+ projectPath: context?.workingDirectory,
157
+ initialPrompt: context?.initialPrompt?.slice(0, 200), // Truncate for response size
158
+ startedAt: context?.timestamp,
159
+ model: context?.model,
160
+ };
161
+ });
162
+ logger.debug('Active conversations retrieved', {
163
+ requestId,
164
+ count: activeConversations.length
165
+ });
166
+ res.json({
167
+ conversations: activeConversations,
168
+ total: activeConversations.length
169
+ });
170
+ }
171
+ catch (error) {
172
+ logger.debug('Get active conversations failed', {
173
+ requestId,
174
+ error: error instanceof Error ? error.message : String(error)
175
+ });
176
+ next(error);
177
+ }
178
+ });
179
+ // Get conversation status only (lightweight endpoint for navigation)
180
+ // Returns status + streamingId without loading conversation history
181
+ router.get('/:sessionId/status', async (req, res, next) => {
182
+ const requestId = req.requestId;
183
+ const claudeSessionId = asClaudeSessionId(req.params.sessionId);
184
+ logger.debug('Get conversation status request', {
185
+ requestId,
186
+ sessionId: claudeSessionId,
187
+ });
188
+ try {
189
+ const status = conversationStatusManager.getConversationStatus(claudeSessionId);
190
+ const streamingId = conversationStatusManager.getStreamingId(claudeSessionId);
191
+ res.json({
192
+ sessionId: claudeSessionId,
193
+ status,
194
+ streamingId: streamingId ?? null,
195
+ });
196
+ }
197
+ catch (error) {
198
+ logger.debug('Get conversation status failed', {
199
+ requestId,
200
+ sessionId: claudeSessionId,
201
+ error: error instanceof Error ? error.message : String(error)
202
+ });
203
+ next(error);
204
+ }
205
+ });
206
+ // Get conversation details
207
+ // Supports pagination via query params:
208
+ // ?limit=N - return only the last N messages (default: all)
209
+ // ?before=messageId - return messages before this message ID (for loading older messages)
210
+ router.get('/:sessionId', async (req, res, next) => {
211
+ const requestId = req.requestId;
212
+ const claudeSessionId = asClaudeSessionId(req.params.sessionId);
213
+ const limit = req.query.limit ? parseInt(req.query.limit, 10) : undefined;
214
+ const before = req.query.before;
215
+ const traceId = req.headers['x-trace-id'];
216
+ const timer = createTimer('getConversationDetails', logger);
217
+ const requestStart = Date.now();
218
+ logger.info('Get conversation details request', {
219
+ requestId,
220
+ traceId,
221
+ sessionId: claudeSessionId,
222
+ limit,
223
+ before
224
+ });
225
+ try {
226
+ // First try to fetch from history using fast direct lookup
227
+ try {
228
+ const { messages: allMessages, metadata } = await historyReader.fetchConversationDirect(claudeSessionId);
229
+ timer.mark('fetchDirect');
230
+ // Apply pagination if requested
231
+ let messages = allMessages;
232
+ let hasMore = false;
233
+ let oldestMessageId;
234
+ const totalMessages = allMessages.length;
235
+ if (limit || before) {
236
+ // If 'before' is specified, find that message and take messages before it
237
+ let endIndex = allMessages.length;
238
+ if (before) {
239
+ const beforeIndex = allMessages.findIndex(m => m.uuid === before);
240
+ if (beforeIndex > 0) {
241
+ endIndex = beforeIndex;
242
+ }
243
+ }
244
+ // Apply limit - take the last N messages up to endIndex
245
+ const effectiveLimit = limit || 50;
246
+ const startIndex = Math.max(0, endIndex - effectiveLimit);
247
+ messages = allMessages.slice(startIndex, endIndex);
248
+ hasMore = startIndex > 0;
249
+ oldestMessageId = messages.length > 0 ? messages[0].uuid : undefined;
250
+ }
251
+ // Get session info (for branch lineage etc)
252
+ const sessionInfo = await sessionInfoService.getSessionInfo(claudeSessionId);
253
+ // Get branch children (sessions that branched from this one)
254
+ const branchChildren = sessionInfoService.getBranchChildren(claudeSessionId);
255
+ // If this is a branched session, compute the branch point message ID
256
+ // This is needed because the UI may not have loaded all messages (pagination)
257
+ let branchPointMessageId;
258
+ if (sessionInfo?.branched_from_session_id && sessionInfo?.branched_at_turn) {
259
+ const branchService = SessionBranchService.getInstance();
260
+ const messageId = await branchService.getBranchPointMessageId(claudeSessionId, sessionInfo.branched_at_turn);
261
+ if (messageId) {
262
+ branchPointMessageId = messageId;
263
+ }
264
+ }
265
+ const response = {
266
+ sessionId: claudeSessionId,
267
+ messages,
268
+ summary: metadata.summary,
269
+ projectPath: metadata.projectPath,
270
+ metadata: {
271
+ totalDuration: metadata.totalDuration,
272
+ model: metadata.model
273
+ },
274
+ totalMessages,
275
+ hasMore,
276
+ oldestMessageId,
277
+ sessionInfo,
278
+ branchChildren: branchChildren.length > 0 ? branchChildren : undefined,
279
+ branchPointMessageId,
280
+ };
281
+ // Add toolMetrics if available
282
+ const metrics = toolMetricsService.getMetrics(claudeSessionId);
283
+ if (metrics) {
284
+ response.toolMetrics = metrics;
285
+ }
286
+ // Check if this session is currently active (CUI-spawned with streamingId)
287
+ const activeStreamingId = conversationStatusManager.getStreamingId(claudeSessionId);
288
+ if (activeStreamingId) {
289
+ response.status = 'ongoing';
290
+ response.streamingId = activeStreamingId;
291
+ }
292
+ else {
293
+ response.status = 'completed';
294
+ }
295
+ logger.debug('Conversation details retrieved from history', {
296
+ requestId,
297
+ sessionId: claudeSessionId,
298
+ messageCount: response.messages.length,
299
+ totalMessages,
300
+ hasMore,
301
+ hasSummary: !!response.summary,
302
+ projectPath: response.projectPath
303
+ });
304
+ const durationMs = Date.now() - requestStart;
305
+ if (durationMs > 1000) {
306
+ logger.warn('Slow conversation details response', {
307
+ requestId,
308
+ traceId,
309
+ sessionId: claudeSessionId,
310
+ durationMs,
311
+ messageCount: response.messages.length,
312
+ totalMessages,
313
+ hasMore,
314
+ limit,
315
+ before,
316
+ });
317
+ }
318
+ // Log timing for all requests when traceId present (navigation debugging)
319
+ if (traceId) {
320
+ logger.info('Conversation details response', {
321
+ traceId,
322
+ sessionId: claudeSessionId,
323
+ durationMs,
324
+ messageCount: response.messages.length,
325
+ });
326
+ }
327
+ res.json(response);
328
+ }
329
+ catch (historyError) {
330
+ // If not found in history, check if it's an active session
331
+ if (historyError instanceof LatticeError && historyError.code === 'CONVERSATION_NOT_FOUND') {
332
+ const activeDetails = conversationStatusManager.getActiveConversationDetails(claudeSessionId);
333
+ if (activeDetails) {
334
+ logger.debug('Conversation details created for active session', {
335
+ requestId,
336
+ sessionId: claudeSessionId,
337
+ projectPath: activeDetails.projectPath
338
+ });
339
+ res.json(activeDetails);
340
+ }
341
+ else {
342
+ // Not found in history and not active
343
+ throw historyError;
344
+ }
345
+ }
346
+ else {
347
+ // Other errors, re-throw
348
+ throw historyError;
349
+ }
350
+ }
351
+ }
352
+ catch (error) {
353
+ logger.debug('Get conversation details failed', {
354
+ requestId,
355
+ sessionId: claudeSessionId,
356
+ error: error instanceof Error ? error.message : String(error)
357
+ });
358
+ next(error);
359
+ }
360
+ });
361
+ return router;
362
+ }
363
+ //# sourceMappingURL=session-query.routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-query.routes.js","sourceRoot":"","sources":["../../src/routes/session-query.routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Session Stream Routes - SSE endpoint for real-time activity updates.
3
+ *
4
+ * Extracted from conversation.routes.ts for maintainability.
5
+ * This is the most complex single endpoint - handles real-time updates
6
+ * for activity, insights, turns, and current work.
7
+ *
8
+ * ROUTES:
9
+ * GET /activity-stream - SSE stream for real-time updates
10
+ */
11
+ import { Router } from 'express';
12
+ import { ClaudeHistoryReader } from '../services/sessions/claude-history-reader.js';
13
+ import { ConversationStatusManager } from '../services/process/conversation-status-manager.js';
14
+ import { InsightsComputer } from '../services/insights/insights-computer.js';
15
+ export interface SessionStreamRoutesDeps {
16
+ historyReader: ClaudeHistoryReader;
17
+ conversationStatusManager: ConversationStatusManager;
18
+ insightsComputer: InsightsComputer;
19
+ }
20
+ export declare function createSessionStreamRoutes(deps: SessionStreamRoutesDeps): Router;
21
+ //# sourceMappingURL=session-stream.routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-stream.routes.d.ts","sourceRoot":"","sources":["../../src/routes/session-stream.routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAC;AACnF,OAAO,EAAE,yBAAyB,EAAE,MAAM,mDAAmD,CAAC;AAI9F,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AAI5E,MAAM,WAAW,uBAAuB;IACtC,aAAa,EAAE,mBAAmB,CAAC;IACnC,yBAAyB,EAAE,yBAAyB,CAAC;IACrD,gBAAgB,EAAE,gBAAgB,CAAC;CACpC;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,uBAAuB,GAAG,MAAM,CA0O/E"}
@@ -0,0 +1,235 @@
1
+ /**
2
+ * Session Stream Routes - SSE endpoint for real-time activity updates.
3
+ *
4
+ * Extracted from conversation.routes.ts for maintainability.
5
+ * This is the most complex single endpoint - handles real-time updates
6
+ * for activity, insights, turns, and current work.
7
+ *
8
+ * ROUTES:
9
+ * GET /activity-stream - SSE stream for real-time updates
10
+ */
11
+ import { Router } from 'express';
12
+ import { createLogger } from '../services/infrastructure/logger.js';
13
+ import { debugLog } from '../services/debug-log.js';
14
+ import { connectionDebugLogger } from '../services/connection-debug-logger.js';
15
+ const logger = createLogger('SessionStreamRoutes');
16
+ export function createSessionStreamRoutes(deps) {
17
+ const { historyReader, conversationStatusManager, insightsComputer } = deps;
18
+ const router = Router();
19
+ // SSE endpoint for real-time activity updates
20
+ // Clients subscribe to receive instant updates when files change
21
+ router.get('/activity-stream', (req, res) => {
22
+ const requestId = req.requestId;
23
+ logger.debug('Activity stream client connected', { requestId });
24
+ // Configure SSE headers
25
+ res.setHeader('Content-Type', 'text/event-stream');
26
+ res.setHeader('Cache-Control', 'no-cache');
27
+ res.setHeader('X-Accel-Buffering', 'no');
28
+ res.setHeader('Connection', 'keep-alive');
29
+ // Flush headers immediately so client knows connection is established
30
+ res.flushHeaders();
31
+ // Track cleanup state to handle early disconnection
32
+ // These get populated as listeners are added, so cleanup only removes what was added
33
+ let cleanupCalled = false;
34
+ let keepAliveInterval = null;
35
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
36
+ let watcher = null;
37
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
38
+ let onActivity = null;
39
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
40
+ let onInsights = null;
41
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
42
+ let onTurnCaptured = null;
43
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
44
+ let onCurrentWork = null;
45
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
46
+ let onCurrentWorkClear = null;
47
+ let onSessionEnded = null;
48
+ // Register cleanup BEFORE any async operations to prevent listener leaks
49
+ const cleanup = () => {
50
+ if (cleanupCalled)
51
+ return;
52
+ cleanupCalled = true;
53
+ logger.debug('Activity stream client disconnected', { requestId });
54
+ if (keepAliveInterval) {
55
+ clearInterval(keepAliveInterval);
56
+ }
57
+ if (watcher) {
58
+ if (onActivity)
59
+ watcher.off('activity', onActivity);
60
+ if (onInsights)
61
+ watcher.off('insights', onInsights);
62
+ if (onTurnCaptured)
63
+ watcher.off('turn-captured', onTurnCaptured);
64
+ if (onCurrentWork)
65
+ watcher.off('current-work', onCurrentWork);
66
+ if (onCurrentWorkClear)
67
+ watcher.off('current-work-clear', onCurrentWorkClear);
68
+ }
69
+ if (onSessionEnded) {
70
+ conversationStatusManager.off('session-ended', onSessionEnded);
71
+ }
72
+ };
73
+ // Register cleanup handler BEFORE any async work
74
+ req.on('close', cleanup);
75
+ // Import and get the watcher
76
+ import('../services/sessions/session-activity-watcher.js').then(async ({ getSessionActivityWatcher }) => {
77
+ // Check if client already disconnected during import
78
+ if (cleanupCalled)
79
+ return;
80
+ watcher = getSessionActivityWatcher();
81
+ // Start the watcher if not already running
82
+ watcher.start();
83
+ // Send initial connection confirmation
84
+ res.write(`data: ${JSON.stringify({ type: 'connected', timestamp: Date.now() })}\n\n`);
85
+ // Seed initial state: send action history for all recent sessions
86
+ try {
87
+ if (cleanupCalled)
88
+ return;
89
+ const { conversations } = await historyReader.listConversations({ limit: 50, sortBy: 'updated', order: 'desc', archived: false });
90
+ const recentSessions = conversations.map(c => c.sessionId);
91
+ for (const sessionId of recentSessions) {
92
+ if (cleanupCalled)
93
+ return;
94
+ try {
95
+ const { messages } = await historyReader.fetchConversationDirect(sessionId);
96
+ if (messages.length === 0)
97
+ continue;
98
+ const recentActions = insightsComputer.extractRecentActions(messages, 14);
99
+ if (recentActions.length > 0) {
100
+ const initialUpdate = {
101
+ type: 'activity',
102
+ sessionId,
103
+ recentActions,
104
+ timestamp: Date.now()
105
+ };
106
+ res.write(`data: ${JSON.stringify(initialUpdate)}\n\n`);
107
+ }
108
+ }
109
+ catch (err) {
110
+ // Skip sessions with errors
111
+ logger.debug('Failed to seed initial state for session', { sessionId: sessionId.slice(0, 8), err });
112
+ }
113
+ }
114
+ }
115
+ catch (err) {
116
+ logger.warn('Failed to seed initial activity state', { err });
117
+ }
118
+ // Seed insights timestamps so reconnecting clients can detect missed updates
119
+ try {
120
+ if (cleanupCalled)
121
+ return;
122
+ const sessionIds = (await historyReader.listConversations({ limit: 50, sortBy: 'updated', order: 'desc', archived: false })).conversations.map(c => c.sessionId);
123
+ const cachedInsights = await insightsComputer.getCachedInsightsForSessions(sessionIds);
124
+ const insightsTimestamps = {};
125
+ for (const [sessionId, insights] of cachedInsights.entries()) {
126
+ if (insights.computedAt) {
127
+ insightsTimestamps[sessionId] = insights.computedAt;
128
+ }
129
+ }
130
+ if (Object.keys(insightsTimestamps).length > 0) {
131
+ res.write(`data: ${JSON.stringify({ type: 'insights-status', timestamps: insightsTimestamps })}\n\n`);
132
+ }
133
+ }
134
+ catch (err) {
135
+ logger.warn('Failed to seed insights timestamps', { err });
136
+ }
137
+ // Check again before adding listeners
138
+ if (cleanupCalled)
139
+ return;
140
+ // Forward activity updates to this client
141
+ onActivity = (update) => {
142
+ res.write(`data: ${JSON.stringify({ type: 'activity', ...update })}\n\n`);
143
+ };
144
+ // Forward insights updates to this client
145
+ onInsights = (update) => {
146
+ // Rename 'type' to 'insightType' to avoid collision with SSE event type
147
+ const { type: insightType, ...rest } = update;
148
+ logger.info('[SSE] Sending insights update', {
149
+ traceId: update.traceId,
150
+ sessionId: update.sessionId.slice(0, 8),
151
+ insightType,
152
+ hasIdentityImage: !!update.identityImage
153
+ });
154
+ debugLog('[SSE] Sending insights update to client', {
155
+ traceId: update.traceId,
156
+ sessionId: update.sessionId.slice(0, 8),
157
+ insightType,
158
+ timestamp: update.timestamp
159
+ });
160
+ res.write(`data: ${JSON.stringify({ type: 'insights', insightType, ...rest })}\n\n`);
161
+ };
162
+ watcher.on('activity', onActivity);
163
+ watcher.on('insights', onInsights);
164
+ // Forward session-ended events so clients know immediately when a session stops
165
+ onSessionEnded = (data) => {
166
+ logger.info('[SSE] Sending session-ended', {
167
+ sessionId: data.claudeSessionId.slice(0, 8),
168
+ streamingId: data.streamingId.slice(0, 8)
169
+ });
170
+ connectionDebugLogger.log('ActivityStream', 'session-ended-broadcast', {
171
+ sessionId: data.claudeSessionId.slice(0, 8),
172
+ streamingId: data.streamingId.slice(0, 8),
173
+ });
174
+ res.write(`data: ${JSON.stringify({
175
+ type: 'session-ended',
176
+ sessionId: data.claudeSessionId,
177
+ streamingId: data.streamingId,
178
+ timestamp: Date.now()
179
+ })}\n\n`);
180
+ };
181
+ conversationStatusManager.on('session-ended', onSessionEnded);
182
+ // Forward turn-captured events for real-time history updates
183
+ onTurnCaptured = (data) => {
184
+ logger.info('[SSE] Sending turn-captured', {
185
+ sessionId: data.sessionId.slice(0, 8)
186
+ });
187
+ res.write(`data: ${JSON.stringify({
188
+ type: 'turn-captured',
189
+ sessionId: data.sessionId,
190
+ turn: data.turn,
191
+ timestamp: Date.now()
192
+ })}\n\n`);
193
+ };
194
+ watcher.on('turn-captured', onTurnCaptured);
195
+ // Forward current-work events (what user just asked Claude to do)
196
+ onCurrentWork = (data) => {
197
+ logger.info('[SSE] Sending current-work', {
198
+ sessionId: data.sessionId.slice(0, 8),
199
+ summaryPreview: data.summary.slice(0, 40)
200
+ });
201
+ res.write(`data: ${JSON.stringify({
202
+ type: 'current-work',
203
+ sessionId: data.sessionId,
204
+ summary: data.summary,
205
+ userMessage: data.userMessage,
206
+ startedAt: data.startedAt,
207
+ timestamp: Date.now()
208
+ })}\n\n`);
209
+ };
210
+ watcher.on('current-work', onCurrentWork);
211
+ // Forward current-work-clear events (when Claude finishes)
212
+ onCurrentWorkClear = (data) => {
213
+ logger.info('[SSE] Sending current-work-clear', {
214
+ sessionId: data.sessionId.slice(0, 8)
215
+ });
216
+ res.write(`data: ${JSON.stringify({
217
+ type: 'current-work-clear',
218
+ sessionId: data.sessionId,
219
+ clearedAt: data.clearedAt,
220
+ timestamp: Date.now()
221
+ })}\n\n`);
222
+ };
223
+ watcher.on('current-work-clear', onCurrentWorkClear);
224
+ // Keep-alive ping every 30 seconds
225
+ keepAliveInterval = setInterval(() => {
226
+ res.write(`data: ${JSON.stringify({ type: 'ping', timestamp: Date.now() })}\n\n`);
227
+ }, 30000);
228
+ }).catch((error) => {
229
+ logger.error('Activity stream failed to initialize watcher', { requestId, error });
230
+ res.write(`data: ${JSON.stringify({ type: 'error', error: 'Failed to initialize activity watcher' })}\n\n`);
231
+ });
232
+ });
233
+ return router;
234
+ }
235
+ //# sourceMappingURL=session-stream.routes.js.map