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,629 @@
1
+ /**
2
+ * Session Review Service
3
+ *
4
+ * Generates post-session analysis with narrative summary and recommendations
5
+ * for Claude improvements (CLAUDE.md, hooks, skills).
6
+ *
7
+ * Uses turns (session history) as the primary data source.
8
+ */
9
+ import Anthropic from '@anthropic-ai/sdk';
10
+ import * as fs from 'fs';
11
+ import * as path from 'path';
12
+ import * as os from 'os';
13
+ import { execSync } from 'child_process';
14
+ import { createLogger } from '../infrastructure/logger.js';
15
+ import { SessionAnalysisService } from './session-analysis-service.js';
16
+ import { SessionInfoService } from '../sessions/session-info-service.js';
17
+ import { TurnCaptureService } from '../sessions/turn-capture-service.js';
18
+ import { ClaudeHistoryReader } from '../sessions/claude-history-reader.js';
19
+ import { SessionMarksService } from './session-marks-service.js';
20
+ const logger = createLogger('SessionReviewService');
21
+ // =============================================================================
22
+ // Service
23
+ // =============================================================================
24
+ export class SessionReviewService {
25
+ static instance;
26
+ client = null;
27
+ analysisService;
28
+ sessionInfoService;
29
+ turnCaptureService;
30
+ historyReader;
31
+ sessionMarksService;
32
+ constructor() {
33
+ this.analysisService = SessionAnalysisService.getInstance();
34
+ this.sessionInfoService = SessionInfoService.getInstance();
35
+ this.turnCaptureService = TurnCaptureService.getInstance();
36
+ this.historyReader = new ClaudeHistoryReader();
37
+ this.sessionMarksService = SessionMarksService.getInstance();
38
+ }
39
+ static getInstance() {
40
+ if (!SessionReviewService.instance) {
41
+ SessionReviewService.instance = new SessionReviewService();
42
+ }
43
+ return SessionReviewService.instance;
44
+ }
45
+ getClient() {
46
+ if (!this.client) {
47
+ const configPath = path.join(os.homedir(), '.claudia', 'config.json');
48
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
49
+ const apiKey = config.anthropic?.apiKey || process.env.ANTHROPIC_API_KEY;
50
+ if (!apiKey) {
51
+ throw new Error('Anthropic API key not configured. Set it in Settings or via ANTHROPIC_API_KEY environment variable.');
52
+ }
53
+ this.client = new Anthropic({ apiKey });
54
+ }
55
+ return this.client;
56
+ }
57
+ async analyzeForReview(sessionIdInput) {
58
+ logger.info('Starting session review analysis', { sessionId: sessionIdInput.slice(0, 8) });
59
+ // Initialize services
60
+ await this.analysisService.initialize();
61
+ await this.sessionInfoService.initialize();
62
+ // Resolve short session ID to full ID (needed for FK constraints)
63
+ const sessionId = await this.sessionInfoService.resolveSessionId(sessionIdInput) || sessionIdInput;
64
+ if (sessionId !== sessionIdInput) {
65
+ logger.debug('Resolved session ID', { from: sessionIdInput, to: sessionId.slice(0, 8) });
66
+ }
67
+ // Get metrics from analysis service
68
+ const metricsResult = await this.analysisService.extractMetrics(sessionId);
69
+ const metrics = metricsResult.metrics || {};
70
+ // Get context from cached insights (for mission/project info)
71
+ const cachedInsights = await this.sessionInfoService.getInsights(sessionId);
72
+ const context = cachedInsights?.context || null;
73
+ // Get turns (session history) - primary source for narrative
74
+ const turns = await this.turnCaptureService.getTurnsForSession(sessionId);
75
+ // Get user-flagged session marks (v2 - supports multiple mark types with turn context)
76
+ const sessionMarks = await this.sessionMarksService.getMarksForSession(sessionId);
77
+ // Get project path and recent commits to avoid stale recommendations
78
+ const projectPath = await this.historyReader.getConversationWorkingDirectory(sessionId);
79
+ const recentCommits = projectPath ? this.getRecentCommits(projectPath, 24) : [];
80
+ // Get file changes for richer context
81
+ const fileChanges = this.sessionInfoService.getFileChanges(sessionId);
82
+ const fileChangeSummaries = this.summarizeFileChanges(fileChanges);
83
+ logger.info('Session review data retrieved', {
84
+ sessionId: sessionId.slice(0, 8),
85
+ turnCount: turns.length,
86
+ sessionMarkCount: sessionMarks.length,
87
+ markTypes: [...new Set(sessionMarks.map(m => m.markType))],
88
+ projectPath,
89
+ recentCommitCount: recentCommits.length,
90
+ fileChangeCount: fileChanges.length,
91
+ filesChanged: fileChangeSummaries.length,
92
+ });
93
+ // Run LLM analysis using turns as primary source
94
+ const llmResult = await this.runLLMAnalysis({
95
+ context,
96
+ turns,
97
+ metrics,
98
+ sessionMarks,
99
+ recentCommits,
100
+ fileChangeSummaries,
101
+ });
102
+ // Format duration - metrics come from extractMetrics which returns camelCase
103
+ const metricsAny = metrics;
104
+ const durationMin = metricsAny.durationMinutes || 0;
105
+ return {
106
+ summary: llmResult.summary,
107
+ groupedEvents: llmResult.groupedEvents,
108
+ metrics: {
109
+ duration: `${durationMin} min`,
110
+ messages: metricsAny.messageCount || 0,
111
+ toolUses: metricsAny.toolUseCount || 0,
112
+ errors: metricsAny.errorCount || 0,
113
+ filesEdited: metricsAny.fileEditCount || 0,
114
+ },
115
+ recommendations: llmResult.recommendations.map((rec, i) => ({
116
+ ...rec,
117
+ id: `rec-${sessionId.slice(0, 8)}-${i}`,
118
+ priorOccurrences: 0, // TODO: Check DB for prior similar recommendations
119
+ })),
120
+ rootCauses: llmResult.rootCauses || [],
121
+ claudeAnalysis: llmResult.claudeAnalysis || {
122
+ strengths: [],
123
+ weaknesses: [],
124
+ keyInsight: 'Analysis unavailable',
125
+ },
126
+ userFeedback: llmResult.userFeedback || {
127
+ effective: [],
128
+ opportunities: [],
129
+ keyInsight: 'Analysis unavailable',
130
+ },
131
+ };
132
+ }
133
+ async runLLMAnalysis(data) {
134
+ const client = this.getClient();
135
+ // Log input data for debugging
136
+ logger.info('Session review input data', {
137
+ context: data.context,
138
+ turnCount: data.turns.length,
139
+ metrics: data.metrics,
140
+ sessionMarkCount: data.sessionMarks?.length || 0,
141
+ markTypes: data.sessionMarks ? [...new Set(data.sessionMarks.map(m => m.markType))] : [],
142
+ });
143
+ // Build context from insights
144
+ const mission = data.context?.mission || 'Unknown goal';
145
+ const project = data.context?.project || 'Unknown project';
146
+ // Format turns as the session narrative
147
+ const turnsStr = data.turns.length > 0
148
+ ? data.turns.map(t => `[${t.icon} ${t.tag}] ${t.headline}\n → ${t.actions.join(' → ')}`).join('\n\n')
149
+ : 'No turns captured';
150
+ // Format session marks using the mark type registry
151
+ const marksSection = data.sessionMarks && data.sessionMarks.length > 0
152
+ ? this.sessionMarksService.formatMarksForAnalysis(data.sessionMarks)
153
+ : '';
154
+ // Format file changes for richer context
155
+ const fileChangesSection = this.formatFileChangesForPrompt(data.fileChangeSummaries || []);
156
+ // Identify friction/pivot/debug turns that need extra context
157
+ const frictionTurns = data.turns.filter(t => ['friction', 'pivot', 'debug', 'fix'].includes(t.tag) || t.incomplete);
158
+ const frictionContext = this.formatFrictionTurnsForPrompt(frictionTurns);
159
+ const prompt = `You are analyzing a completed coding session from multiple perspectives. The user directed a Claude Code session - giving instructions and making decisions while Claude executed.
160
+
161
+ ## Session Context
162
+ - **Project:** ${project}
163
+ - **Mission:** ${mission}
164
+
165
+ ## What Happened (Turn by Turn)
166
+ Each entry = one user request + Claude's response:
167
+
168
+ ${turnsStr}
169
+
170
+ ## Stats
171
+ - ${data.metrics.messageCount || '?'} messages, ${data.metrics.toolUseCount || '?'} tool uses, ${data.metrics.errorCount || '?'} errors
172
+ - ${data.metrics.fileEditCount || '?'} files modified over ${data.metrics.durationMinutes || '?'} minutes
173
+ ${fileChangesSection}${frictionContext}${marksSection ? `
174
+ ${marksSection}
175
+
176
+ **IMPORTANT**: The user took deliberate action to flag these moments. Strongly prioritize addressing what these marks represent in your analysis. Each mark type has a specific analysis goal listed above - follow those goals.
177
+ ` : ''}${data.recentCommits && data.recentCommits.length > 0 ? `
178
+ ## 🔧 Recent Commits (Last 24 Hours)
179
+ These commits were made to this project recently (possibly by other sessions or manual work). **DO NOT recommend something that was already fixed by one of these commits.**
180
+
181
+ ${data.recentCommits.map(c => `- ${c}`).join('\n')}
182
+
183
+ **CRITICAL**: If a commit message suggests a fix was made (e.g., "fix loading spinner", "separate button states"), DO NOT recommend that same fix. The problem has already been resolved.
184
+ ` : ''}
185
+ ## Your Analysis
186
+
187
+ Analyze this session from four perspectives:
188
+
189
+ ### 1. Summary
190
+ Help the user remember what this session was about:
191
+ - **goal**: What you set out to do (plain language, 1 sentence)
192
+ - **outcome**: What actually happened - key pivots, final result. (1-2 sentences)
193
+
194
+ ### 2. Narrative Bullets (groupedEvents)
195
+ Organize into three categories:
196
+
197
+ 1. **friction** - Obstacles hit while doing the work: getting blocked, debugging something unexpected, fighting tooling, wrong assumptions that cost time. Things that slowed progress in THIS session.
198
+ 2. **built** - Tangible results that persist: code written, features added, configs changed. NOT exploration, NOT temporary work.
199
+ 3. **learned** - Significant new understanding gained: how something actually works, why an approach failed, codebase patterns discovered. Must be new information from this session.
200
+
201
+ **Categories can be EMPTY.** Don't force things. Keep bullets SHORT but meaningful (under 12 words).
202
+
203
+ ### 3. Recommendations (0-3)
204
+ Generate recommendations that will help in FUTURE sessions, not just describe what you learned here.
205
+
206
+ **THE ANTI-HINDSIGHT TEST**: For each potential recommendation, ask yourself:
207
+ "Would this advice be useful to someone BEFORE they knew what went wrong?"
208
+
209
+ ❌ BAD (hindsight-driven, fails the test):
210
+ - "Check React Router's v7_startTransition flag" — only know to check this because we found it
211
+ - "Verify font imports are present" — only know to check because that was the bug
212
+ - "Add validation for X" — where X is the specific thing that broke
213
+
214
+ ✅ GOOD (forward-looking, passes the test):
215
+ - "When debugging UI freezes, add RAF heartbeat logging early to distinguish main thread blocking from scheduler delays"
216
+ - "For CSS issues where styles appear correct, check Network tab for failed resource loads before debugging specifics"
217
+ - "Before integrating with external APIs, create a minimal proof-of-concept to validate key operations work"
218
+
219
+ **THE RECURRENCE TEST**: Also ask: "How likely is this exact situation to happen again?"
220
+ - One-off typos, config mistakes, or specific bugs you just fixed → NO RECOMMENDATION (it's done)
221
+ - Patterns that affect a class of similar work → MAYBE worth recommending
222
+ - Workflow gaps that will affect many future sessions → WORTH recommending
223
+
224
+ **If the session was routine work with no real friction, return an empty array.** Most debugging sessions don't need recommendations — the fix IS the outcome.
225
+
226
+ ### 4. Root Causes (ONLY if there were significant problems)
227
+ **Return an empty array unless the session had real friction worth analyzing.**
228
+ If there were meaningful problems, dig deeper for each:
229
+ - What visibly went wrong? (surface)
230
+ - What's the fundamental issue underneath? (root)
231
+ - How could this have been prevented? (preventable)
232
+
233
+ Smooth sessions = empty rootCauses array. Don't manufacture problems.
234
+
235
+ ### 5. Claude's Performance (ONLY if there's valuable insight)
236
+ **Return empty arrays and generic keyInsight if Claude performed fine.**
237
+ Only populate if there's something genuinely useful to communicate:
238
+ - **strengths**: Notable things Claude did well (empty if nothing stood out)
239
+ - **weaknesses**: Where Claude could have done better (empty if fine)
240
+ - **keyInsight**: One concrete thing to do differently (or "No notable issues" if session went well)
241
+
242
+ Don't force criticism. A smooth session can have empty strengths/weaknesses.
243
+
244
+ ### 6. User Effectiveness (ONLY if there's valuable insight)
245
+ **Return empty arrays and generic keyInsight if the user directed well.**
246
+ Only populate if there's something genuinely useful to communicate:
247
+ - **effective**: What worked well in their approach (empty if nothing notable)
248
+ - **opportunities**: Where different behavior might have helped (empty if fine)
249
+ - **keyInsight**: One tip for the user (or "Session directed well" if nothing to add)
250
+
251
+ Don't force feedback. A well-directed session can have empty arrays.
252
+
253
+ ---
254
+
255
+ Return JSON:
256
+ {
257
+ "summary": {
258
+ "goal": "...",
259
+ "outcome": "..."
260
+ },
261
+ "groupedEvents": {
262
+ "friction": [{ "text": "...", "icon": "💥" }, ...],
263
+ "built": [{ "text": "...", "icon": "🔧" }, ...],
264
+ "learned": [{ "text": "...", "icon": "💡" }, ...]
265
+ },
266
+ "recommendations": [
267
+ {
268
+ "observation": "What you noticed in the session",
269
+ "suggestion": "What to do about it",
270
+ "why": "How this helps"
271
+ }
272
+ ],
273
+ "rootCauses": [
274
+ {
275
+ "surface": "What went wrong",
276
+ "root": "The fundamental issue",
277
+ "preventable": "How to avoid this"
278
+ }
279
+ ],
280
+ "claudeAnalysis": {
281
+ "strengths": ["..."],
282
+ "weaknesses": ["..."],
283
+ "keyInsight": "One thing Claude should do differently"
284
+ },
285
+ "userFeedback": {
286
+ "effective": ["..."],
287
+ "opportunities": ["..."],
288
+ "keyInsight": "One tip for the user"
289
+ }
290
+ }
291
+
292
+ Icons for groupedEvents: 💥⚠️🤔🐛🚧 (friction), 🔧✏️🎨🚀📊⚙️ (built), 💡✅🎯⚖️🏁 (learned)
293
+
294
+ Be specific and reference actual events from the session. Empty arrays are fine if a section doesn't apply.`;
295
+ // Log the full prompt
296
+ logger.info('Session review prompt', { prompt });
297
+ try {
298
+ const response = await client.messages.create({
299
+ model: 'claude-opus-4-5-20251101', // Use Opus for high-quality synthesis
300
+ max_tokens: 2000,
301
+ temperature: 0.3,
302
+ messages: [{ role: 'user', content: prompt }],
303
+ });
304
+ const text = response.content[0].type === 'text' ? response.content[0].text : '';
305
+ // Log the raw response
306
+ logger.info('Session review LLM response', { text });
307
+ const jsonMatch = text.match(/\{[\s\S]*\}/);
308
+ if (!jsonMatch) {
309
+ logger.error('No JSON in LLM response', { text: text.slice(0, 200) });
310
+ return this.getDefaultAnalysis();
311
+ }
312
+ const parsed = JSON.parse(jsonMatch[0]);
313
+ // Log the parsed result
314
+ logger.info('Session review parsed result', { parsed });
315
+ // Filter out recommendations that are already addressed by recent commits
316
+ if (parsed.recommendations?.length > 0 && data.recentCommits && data.recentCommits.length > 0) {
317
+ parsed.recommendations = await this.filterAlreadyAddressedRecommendations(parsed.recommendations, data.recentCommits);
318
+ }
319
+ return parsed;
320
+ }
321
+ catch (err) {
322
+ logger.error('LLM analysis failed', { error: err instanceof Error ? err.message : String(err) });
323
+ return this.getDefaultAnalysis();
324
+ }
325
+ }
326
+ getDefaultAnalysis() {
327
+ return {
328
+ summary: {
329
+ goal: 'Unknown',
330
+ outcome: 'Session analysis unavailable',
331
+ },
332
+ groupedEvents: {
333
+ friction: [],
334
+ built: [],
335
+ learned: [{ text: 'Session analysis unavailable', icon: '❓' }],
336
+ },
337
+ recommendations: [],
338
+ rootCauses: [],
339
+ claudeAnalysis: {
340
+ strengths: [],
341
+ weaknesses: [],
342
+ keyInsight: 'Analysis unavailable',
343
+ },
344
+ userFeedback: {
345
+ effective: [],
346
+ opportunities: [],
347
+ keyInsight: 'Analysis unavailable',
348
+ },
349
+ };
350
+ }
351
+ /**
352
+ * Use Haiku to filter out recommendations that appear to already be addressed
353
+ * by recent commits. This catches cases where Opus didn't make the connection
354
+ * between a general commit message and a specific recommendation.
355
+ */
356
+ async filterAlreadyAddressedRecommendations(recommendations, recentCommits) {
357
+ if (recommendations.length === 0)
358
+ return recommendations;
359
+ logger.info('Running recommendation deduplication', {
360
+ recommendationCount: recommendations.length,
361
+ commitCount: recentCommits.length,
362
+ });
363
+ const client = this.getClient();
364
+ const prompt = `Check if any of these recommendations have ALREADY been addressed by the recent commits.
365
+
366
+ ## Recent Commits
367
+ ${recentCommits.map(c => `- ${c}`).join('\n')}
368
+
369
+ ## Recommendations to Check
370
+ ${recommendations.map((r, i) => `${i + 1}. ${r.suggestion}`).join('\n')}
371
+
372
+ For each recommendation, determine if a commit appears to address the same issue.
373
+ Be generous in matching - if a commit mentions "validation" and a recommendation mentions "add validation for X", that counts as addressed.
374
+
375
+ Return JSON array of indices (0-based) that should be KEPT (not yet addressed):
376
+ {"keep": [0, 2]}
377
+
378
+ If all should be kept: {"keep": [0, 1, ...]}
379
+ If none should be kept: {"keep": []}
380
+
381
+ JSON only:`;
382
+ try {
383
+ const response = await client.messages.create({
384
+ model: 'claude-haiku-4-5-20251001',
385
+ max_tokens: 200,
386
+ temperature: 0,
387
+ messages: [{ role: 'user', content: prompt }],
388
+ });
389
+ const text = response.content[0].type === 'text' ? response.content[0].text : '';
390
+ const jsonMatch = text.match(/\{[\s\S]*\}/);
391
+ if (!jsonMatch) {
392
+ logger.warn('Could not parse deduplication response, keeping all recommendations');
393
+ return recommendations;
394
+ }
395
+ const parsed = JSON.parse(jsonMatch[0]);
396
+ const keepIndices = new Set(parsed.keep);
397
+ const filtered = recommendations.filter((_, i) => keepIndices.has(i));
398
+ const removedCount = recommendations.length - filtered.length;
399
+ logger.info('Recommendation deduplication complete', {
400
+ original: recommendations.length,
401
+ kept: filtered.length,
402
+ removed: removedCount,
403
+ keepIndices: parsed.keep,
404
+ });
405
+ return filtered;
406
+ }
407
+ catch (err) {
408
+ logger.warn('Recommendation deduplication failed, keeping all', {
409
+ error: err instanceof Error ? err.message : String(err),
410
+ });
411
+ return recommendations;
412
+ }
413
+ }
414
+ /**
415
+ * Get recent git commits from the project directory.
416
+ * This helps the LLM avoid recommending fixes that were already made.
417
+ */
418
+ getRecentCommits(projectPath, hours = 24) {
419
+ try {
420
+ // Check if it's a git repo
421
+ execSync('git rev-parse --git-dir', { cwd: projectPath, stdio: 'pipe' });
422
+ // Get commits from the last N hours with their messages and changed files
423
+ const since = `${hours} hours ago`;
424
+ const output = execSync(`git log --since="${since}" --pretty=format:"%h %s" --name-only 2>/dev/null | head -100`, { cwd: projectPath, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });
425
+ if (!output.trim()) {
426
+ return [];
427
+ }
428
+ // Parse output into readable format
429
+ const lines = output.trim().split('\n');
430
+ const commits = [];
431
+ let currentCommit = '';
432
+ let currentFiles = [];
433
+ for (const line of lines) {
434
+ if (line.match(/^[a-f0-9]{7,} /)) {
435
+ // New commit line
436
+ if (currentCommit) {
437
+ commits.push(`${currentCommit}${currentFiles.length > 0 ? ` (files: ${currentFiles.slice(0, 5).join(', ')}${currentFiles.length > 5 ? '...' : ''})` : ''}`);
438
+ }
439
+ currentCommit = line;
440
+ currentFiles = [];
441
+ }
442
+ else if (line.trim()) {
443
+ // File path
444
+ currentFiles.push(line.trim());
445
+ }
446
+ }
447
+ // Don't forget the last commit
448
+ if (currentCommit) {
449
+ commits.push(`${currentCommit}${currentFiles.length > 0 ? ` (files: ${currentFiles.slice(0, 5).join(', ')}${currentFiles.length > 5 ? '...' : ''})` : ''}`);
450
+ }
451
+ logger.info('Retrieved recent commits', { projectPath, commitCount: commits.length });
452
+ return commits;
453
+ }
454
+ catch (err) {
455
+ logger.debug('Could not get recent commits (not a git repo or git error)', {
456
+ projectPath,
457
+ error: err instanceof Error ? err.message : String(err)
458
+ });
459
+ return [];
460
+ }
461
+ }
462
+ /**
463
+ * Summarize file changes into a digestible format for the LLM.
464
+ * Groups by file and computes line statistics.
465
+ */
466
+ summarizeFileChanges(changes) {
467
+ const byFile = new Map();
468
+ for (const change of changes) {
469
+ const existing = byFile.get(change.filePath) || [];
470
+ existing.push(change);
471
+ byFile.set(change.filePath, existing);
472
+ }
473
+ const summaries = [];
474
+ for (const [filePath, fileChanges] of byFile) {
475
+ // Compute relative path
476
+ const relativePath = filePath
477
+ .replace(/^\/home\/jason\/(claudia|cui-custom)\//, '')
478
+ .replace(/^\/home\/jason\//, '~/');
479
+ // Collect turn numbers
480
+ const turnNumbers = [...new Set(fileChanges.map(c => c.turnNumber))].sort((a, b) => a - b);
481
+ // Count edits vs writes
482
+ const editCount = fileChanges.filter(c => c.toolName === 'Edit').length;
483
+ const writeCount = fileChanges.filter(c => c.toolName === 'Write').length;
484
+ // Compute line stats
485
+ let linesAdded = 0;
486
+ let linesRemoved = 0;
487
+ for (const change of fileChanges) {
488
+ const newLines = (change.newString.match(/\n/g) || []).length + 1;
489
+ const oldLines = change.oldString ? (change.oldString.match(/\n/g) || []).length + 1 : 0;
490
+ if (change.toolName === 'Write') {
491
+ linesAdded += newLines;
492
+ }
493
+ else {
494
+ linesAdded += Math.max(0, newLines - oldLines);
495
+ linesRemoved += Math.max(0, oldLines - newLines);
496
+ }
497
+ }
498
+ // Generate a brief change summary from the first meaningful edit
499
+ const changeSummary = this.generateChangeSummary(fileChanges);
500
+ summaries.push({
501
+ relativePath,
502
+ turnNumbers,
503
+ editCount,
504
+ writeCount,
505
+ linesAdded,
506
+ linesRemoved,
507
+ changeSummary,
508
+ });
509
+ }
510
+ // Sort by first turn number
511
+ return summaries.sort((a, b) => a.turnNumbers[0] - b.turnNumbers[0]);
512
+ }
513
+ /**
514
+ * Generate a brief summary of what changed in a file.
515
+ * Looks at the actual code changes to describe the modification.
516
+ */
517
+ generateChangeSummary(changes) {
518
+ // Find first non-trivial edit
519
+ const meaningfulChange = changes.find(c => {
520
+ if (c.toolName === 'Write')
521
+ return true;
522
+ // Skip tiny whitespace-only edits
523
+ const oldTrimmed = (c.oldString || '').trim();
524
+ const newTrimmed = c.newString.trim();
525
+ return oldTrimmed !== newTrimmed && newTrimmed.length > 10;
526
+ });
527
+ if (!meaningfulChange) {
528
+ return 'minor changes';
529
+ }
530
+ if (meaningfulChange.toolName === 'Write') {
531
+ // New file - describe what it contains
532
+ const content = meaningfulChange.newString;
533
+ if (content.includes('export function'))
534
+ return 'new function/utility';
535
+ if (content.includes('export class'))
536
+ return 'new class';
537
+ if (content.includes('export const') || content.includes('export interface'))
538
+ return 'new types/constants';
539
+ if (content.includes('describe(') || content.includes('test('))
540
+ return 'new tests';
541
+ return 'new file';
542
+ }
543
+ // Edit - try to describe the change
544
+ const oldStr = meaningfulChange.oldString || '';
545
+ const newStr = meaningfulChange.newString;
546
+ // Look for common patterns
547
+ if (!oldStr && newStr.includes('import'))
548
+ return 'added imports';
549
+ if (newStr.includes('try {') && !oldStr.includes('try {'))
550
+ return 'added error handling';
551
+ if (newStr.includes('await') && !oldStr.includes('await'))
552
+ return 'made async';
553
+ if (newStr.includes('if (') && !oldStr.includes('if ('))
554
+ return 'added conditionals';
555
+ if (newStr.length > oldStr.length * 1.5)
556
+ return 'expanded logic';
557
+ if (newStr.length < oldStr.length * 0.7)
558
+ return 'simplified/removed code';
559
+ // Check for function/variable renames
560
+ const oldFuncs = oldStr.match(/function\s+(\w+)/g) || [];
561
+ const newFuncs = newStr.match(/function\s+(\w+)/g) || [];
562
+ if (oldFuncs.length > 0 && newFuncs.length > 0 && oldFuncs[0] !== newFuncs[0]) {
563
+ return 'renamed function';
564
+ }
565
+ return 'modified';
566
+ }
567
+ /**
568
+ * Format file changes section for the prompt.
569
+ */
570
+ formatFileChangesForPrompt(summaries) {
571
+ if (summaries.length === 0) {
572
+ return '';
573
+ }
574
+ const lines = [
575
+ '',
576
+ '## Code Changes Made',
577
+ 'These are the actual files that were modified during the session:',
578
+ '',
579
+ ];
580
+ for (const summary of summaries) {
581
+ const stats = [];
582
+ if (summary.editCount > 0)
583
+ stats.push(`${summary.editCount} edit${summary.editCount > 1 ? 's' : ''}`);
584
+ if (summary.writeCount > 0)
585
+ stats.push(summary.writeCount > 1 ? `${summary.writeCount} writes` : 'new file');
586
+ const lineStats = [];
587
+ if (summary.linesAdded > 0)
588
+ lineStats.push(`+${summary.linesAdded}`);
589
+ if (summary.linesRemoved > 0)
590
+ lineStats.push(`-${summary.linesRemoved}`);
591
+ const turnInfo = summary.turnNumbers.length === 1
592
+ ? `turn ${summary.turnNumbers[0]}`
593
+ : `turns ${summary.turnNumbers[0]}-${summary.turnNumbers[summary.turnNumbers.length - 1]}`;
594
+ lines.push(`- **${summary.relativePath}** (${stats.join(', ')}, ${lineStats.join('/')}, ${turnInfo})`);
595
+ lines.push(` → ${summary.changeSummary}`);
596
+ }
597
+ lines.push('');
598
+ return lines.join('\n');
599
+ }
600
+ /**
601
+ * Format friction/pivot/debug turns with extra context for better recommendations.
602
+ */
603
+ formatFrictionTurnsForPrompt(frictionTurns) {
604
+ if (frictionTurns.length === 0) {
605
+ return '';
606
+ }
607
+ const lines = [
608
+ '',
609
+ '## Notable Moments (friction, pivots, fixes)',
610
+ 'These turns involved challenges or course corrections - important context for recommendations:',
611
+ '',
612
+ ];
613
+ for (const turn of frictionTurns) {
614
+ const status = turn.incomplete ? ' (INTERRUPTED)' : '';
615
+ const reason = turn.terminationReason !== 'normal_completion'
616
+ ? ` [${turn.terminationReason.replace('_', ' ')}]`
617
+ : '';
618
+ lines.push(`**Turn ${turn.turnNumber} [${turn.tag}]${status}${reason}:** ${turn.headline}`);
619
+ // Include more detail from actions
620
+ if (turn.actions.length > 0) {
621
+ const actionStr = turn.actions.slice(0, 5).map(a => ` - ${a}`).join('\n');
622
+ lines.push(actionStr);
623
+ }
624
+ lines.push('');
625
+ }
626
+ return lines.join('\n');
627
+ }
628
+ }
629
+ //# sourceMappingURL=session-review-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-review-service.js","sourceRoot":"","sources":["../../../src/services/sessions/session-review-service.ts"],"names":[],"mappings":"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"}