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,83 @@
1
+ /**
2
+ * Turn Capture Service
3
+ *
4
+ * Captures structured turn summaries after each Claude process completes.
5
+ * A "turn" is one user message + Claude's complete response.
6
+ *
7
+ * Triggered by process-closed events, extracts the last exchange from JSONL,
8
+ * and uses Haiku to generate a structured summary for:
9
+ * 1. Contextualisation - understanding where you are in the work
10
+ * 2. Post-session learning - feeding to Opus for recommendations
11
+ */
12
+ export type TerminationReason = 'normal_completion' | 'user_stop' | 'force_killed' | 'process_crash';
13
+ export interface Turn {
14
+ id: string;
15
+ sessionId: string;
16
+ turnNumber: number;
17
+ timestamp: string;
18
+ headline: string;
19
+ actions: string[];
20
+ tag: string;
21
+ icon: string;
22
+ exitCode: number | null;
23
+ terminationReason: TerminationReason;
24
+ toolCount: number;
25
+ incomplete: boolean;
26
+ }
27
+ export declare class TurnCaptureService {
28
+ private static instance;
29
+ private client;
30
+ private historyReader;
31
+ private sessionInfoService;
32
+ private constructor();
33
+ static getInstance(): TurnCaptureService;
34
+ private getClient;
35
+ /**
36
+ * Derive termination reason from exit code.
37
+ */
38
+ private deriveTerminationReason;
39
+ /**
40
+ * Capture a turn after Claude process completes.
41
+ * Called from process-closed event handler.
42
+ */
43
+ captureTurn(sessionId: string, exitCode: number | null, terminationReason?: TerminationReason): Promise<Turn | null>;
44
+ /**
45
+ * Backfill turn context for marks that were created during an in-progress turn.
46
+ * Delegates to SessionMarksService.
47
+ */
48
+ private backfillMarksForTurn;
49
+ /**
50
+ * Check if a message contains actual human text (not just tool results).
51
+ */
52
+ private hasHumanText;
53
+ /**
54
+ * Extract a compact summary of a tool result for turn capture.
55
+ * Focuses on outcomes (success/failure, key data) not full content.
56
+ */
57
+ private summarizeToolResult;
58
+ /**
59
+ * Extract the last HUMAN user message + Claude response from messages.
60
+ * In Claude Code, most "user" messages are tool_results, not human input.
61
+ * We need to find the last user message that contains actual text content.
62
+ * Also captures file changes from Edit/Write tool calls for walkthrough generation.
63
+ */
64
+ private extractLastTurn;
65
+ /**
66
+ * Use Haiku to generate a structured turn summary.
67
+ */
68
+ private summarizeTurn;
69
+ /**
70
+ * Save a turn to the database and update session's last termination reason.
71
+ */
72
+ private saveTurn;
73
+ /**
74
+ * Get all turns for a session.
75
+ */
76
+ getTurnsForSession(sessionId: string): Promise<Turn[]>;
77
+ /**
78
+ * Map database row to Turn object.
79
+ */
80
+ private mapTurnRow;
81
+ private truncate;
82
+ }
83
+ //# sourceMappingURL=turn-capture-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-capture-service.d.ts","sourceRoot":"","sources":["../../../src/services/sessions/turn-capture-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAiBH,MAAM,MAAM,iBAAiB,GACzB,mBAAmB,GACnB,WAAW,GACX,cAAc,GACd,eAAe,CAAC;AAEpB,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAGlB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAGlB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IAGb,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;CACrB;AAqBD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAqB;IAC5C,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,kBAAkB,CAAqB;IAE/C,OAAO;IAKP,MAAM,CAAC,WAAW,IAAI,kBAAkB;IAOxC,OAAO,CAAC,SAAS;IAajB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAO/B;;;OAGG;IACG,WAAW,CACf,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,iBAAiB,CAAC,EAAE,iBAAiB,GACpC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IA6FvB;;;OAGG;YACW,oBAAoB;IAgBlC;;OAEG;IACH,OAAO,CAAC,YAAY;IAapB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAkD3B;;;;;OAKG;IACH,OAAO,CAAC,eAAe;IAuIvB;;OAEG;YACW,aAAa;IA8F3B;;OAEG;YACW,QAAQ;IAqBtB;;OAEG;IACG,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAM5D;;OAEG;IACH,OAAO,CAAC,UAAU;IAiBlB,OAAO,CAAC,QAAQ;CAIjB"}
@@ -0,0 +1,477 @@
1
+ /**
2
+ * Turn Capture Service
3
+ *
4
+ * Captures structured turn summaries after each Claude process completes.
5
+ * A "turn" is one user message + Claude's complete response.
6
+ *
7
+ * Triggered by process-closed events, extracts the last exchange from JSONL,
8
+ * and uses Haiku to generate a structured summary for:
9
+ * 1. Contextualisation - understanding where you are in the work
10
+ * 2. Post-session learning - feeding to Opus for recommendations
11
+ */
12
+ import Anthropic from '@anthropic-ai/sdk';
13
+ import * as fs from 'fs';
14
+ import * as path from 'path';
15
+ import * as os from 'os';
16
+ import { createLogger } from '../infrastructure/logger.js';
17
+ import { ClaudeHistoryReader } from '../sessions/claude-history-reader.js';
18
+ import { SessionInfoService } from '../sessions/session-info-service.js';
19
+ const logger = createLogger('TurnCaptureService');
20
+ // =============================================================================
21
+ // Service
22
+ // =============================================================================
23
+ export class TurnCaptureService {
24
+ static instance;
25
+ client = null;
26
+ historyReader;
27
+ sessionInfoService;
28
+ constructor() {
29
+ this.historyReader = new ClaudeHistoryReader();
30
+ this.sessionInfoService = SessionInfoService.getInstance();
31
+ }
32
+ static getInstance() {
33
+ if (!TurnCaptureService.instance) {
34
+ TurnCaptureService.instance = new TurnCaptureService();
35
+ }
36
+ return TurnCaptureService.instance;
37
+ }
38
+ getClient() {
39
+ if (!this.client) {
40
+ const configPath = path.join(os.homedir(), '.claudia', 'config.json');
41
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
42
+ const apiKey = config.anthropic?.apiKey || process.env.ANTHROPIC_API_KEY;
43
+ if (!apiKey) {
44
+ throw new Error('Anthropic API key not configured. Set it in Settings or via ANTHROPIC_API_KEY environment variable.');
45
+ }
46
+ this.client = new Anthropic({ apiKey });
47
+ }
48
+ return this.client;
49
+ }
50
+ /**
51
+ * Derive termination reason from exit code.
52
+ */
53
+ deriveTerminationReason(exitCode) {
54
+ if (exitCode === 0)
55
+ return 'normal_completion';
56
+ if (exitCode === 143)
57
+ return 'user_stop'; // SIGTERM = 128 + 15
58
+ if (exitCode === 137)
59
+ return 'force_killed'; // SIGKILL = 128 + 9
60
+ return 'process_crash';
61
+ }
62
+ /**
63
+ * Capture a turn after Claude process completes.
64
+ * Called from process-closed event handler.
65
+ */
66
+ async captureTurn(sessionId, exitCode, terminationReason) {
67
+ const startTime = Date.now();
68
+ const reason = terminationReason ?? this.deriveTerminationReason(exitCode);
69
+ logger.info('Capturing turn', { sessionId: sessionId.slice(0, 8), exitCode, terminationReason: reason });
70
+ try {
71
+ // Fetch conversation messages
72
+ const { messages } = await this.historyReader.fetchConversationDirect(sessionId);
73
+ if (messages.length === 0) {
74
+ logger.debug('No messages in conversation, skipping turn capture');
75
+ return null;
76
+ }
77
+ // Extract the last turn (last user message + Claude's response)
78
+ const lastTurn = this.extractLastTurn(messages);
79
+ if (!lastTurn) {
80
+ logger.debug('Could not extract last turn');
81
+ return null;
82
+ }
83
+ // Get existing turns for context
84
+ const existingTurns = await this.getTurnsForSession(sessionId);
85
+ const turnNumber = existingTurns.length + 1;
86
+ // Generate structured summary with Haiku (include previous turns for context)
87
+ const summary = await this.summarizeTurn(lastTurn.userMessage, lastTurn.claudeResponse, lastTurn.toolUses, existingTurns.slice(-5) // Last 5 turns for context
88
+ );
89
+ const turn = {
90
+ id: `turn-${sessionId.slice(0, 8)}-${turnNumber}-${Date.now()}`,
91
+ sessionId,
92
+ turnNumber,
93
+ timestamp: new Date().toISOString(),
94
+ headline: summary.headline,
95
+ actions: summary.actions,
96
+ tag: summary.tag,
97
+ icon: summary.icon,
98
+ exitCode,
99
+ terminationReason: reason,
100
+ toolCount: lastTurn.toolUses.length,
101
+ incomplete: reason !== 'normal_completion',
102
+ };
103
+ // Persist to database
104
+ await this.saveTurn(turn);
105
+ // Save file changes for walkthrough generation
106
+ if (lastTurn.fileChanges.length > 0) {
107
+ const timestamp = turn.timestamp;
108
+ for (const change of lastTurn.fileChanges) {
109
+ try {
110
+ this.sessionInfoService.insertFileChange({
111
+ sessionId,
112
+ turnNumber,
113
+ toolName: change.toolName,
114
+ filePath: change.filePath,
115
+ oldString: change.oldString,
116
+ newString: change.newString,
117
+ timestamp,
118
+ });
119
+ }
120
+ catch (err) {
121
+ logger.warn('Failed to save file change', { sessionId: sessionId.slice(0, 8), filePath: change.filePath, error: err });
122
+ }
123
+ }
124
+ logger.debug('Saved file changes', { sessionId: sessionId.slice(0, 8), turnNumber, count: lastTurn.fileChanges.length });
125
+ }
126
+ // Backfill turn context for any marks created during this turn
127
+ await this.backfillMarksForTurn(sessionId, turnNumber);
128
+ const elapsed = Date.now() - startTime;
129
+ logger.info('Turn captured', {
130
+ sessionId: sessionId.slice(0, 8),
131
+ turnNumber,
132
+ tag: turn.tag,
133
+ terminationReason: reason,
134
+ fileChangeCount: lastTurn.fileChanges.length,
135
+ elapsedMs: elapsed,
136
+ });
137
+ return turn;
138
+ }
139
+ catch (error) {
140
+ logger.error('Failed to capture turn', error, { sessionId: sessionId.slice(0, 8) });
141
+ return null;
142
+ }
143
+ }
144
+ /**
145
+ * Backfill turn context for marks that were created during an in-progress turn.
146
+ * Delegates to SessionMarksService.
147
+ */
148
+ async backfillMarksForTurn(sessionId, turnNumber) {
149
+ try {
150
+ // Lazy import to avoid circular dependency
151
+ const { SessionMarksService } = await import('./session-marks-service.js');
152
+ const marksService = SessionMarksService.getInstance();
153
+ await marksService.backfillTurnContext(sessionId, turnNumber);
154
+ }
155
+ catch (error) {
156
+ // Non-fatal - don't fail turn capture if backfill fails
157
+ logger.warn('Failed to backfill marks for turn', {
158
+ sessionId: sessionId.slice(0, 8),
159
+ turnNumber,
160
+ error: error instanceof Error ? error.message : String(error),
161
+ });
162
+ }
163
+ }
164
+ /**
165
+ * Check if a message contains actual human text (not just tool results).
166
+ */
167
+ hasHumanText(msg) {
168
+ const content = msg.message?.content;
169
+ if (typeof content === 'string' && content.trim()) {
170
+ return true;
171
+ }
172
+ if (Array.isArray(content)) {
173
+ return content.some(block => typeof block === 'object' && block !== null && block.type === 'text' && 'text' in block);
174
+ }
175
+ return false;
176
+ }
177
+ /**
178
+ * Extract a compact summary of a tool result for turn capture.
179
+ * Focuses on outcomes (success/failure, key data) not full content.
180
+ */
181
+ summarizeToolResult(toolName, result) {
182
+ const resultStr = typeof result === 'string' ? result : JSON.stringify(result);
183
+ // For Edit/Write - just report success/failure and file path
184
+ if (toolName === 'Edit' || toolName === 'Write') {
185
+ if (resultStr.includes('has been updated') || resultStr.includes('successfully')) {
186
+ return '✓ success';
187
+ }
188
+ if (resultStr.includes('error') || resultStr.includes('failed')) {
189
+ return '✗ ' + this.truncate(resultStr, 80);
190
+ }
191
+ return '✓ done';
192
+ }
193
+ // For Bash - capture exit status and key output
194
+ if (toolName === 'Bash') {
195
+ if (resultStr.includes('error') || resultStr.includes('Error') || resultStr.includes('failed')) {
196
+ return '✗ ' + this.truncate(resultStr, 100);
197
+ }
198
+ // Check for common success patterns
199
+ if (resultStr.includes('built in') || resultStr.includes('success') || resultStr.length < 50) {
200
+ return '✓ ' + this.truncate(resultStr, 80);
201
+ }
202
+ return this.truncate(resultStr, 80);
203
+ }
204
+ // For Grep/Glob - report match counts
205
+ if (toolName === 'Grep' || toolName === 'Glob') {
206
+ const matchCount = (resultStr.match(/\n/g) || []).length;
207
+ if (matchCount > 0) {
208
+ return `found ${matchCount} matches`;
209
+ }
210
+ if (resultStr.includes('No matches') || resultStr.includes('No files')) {
211
+ return 'no matches';
212
+ }
213
+ return this.truncate(resultStr, 60);
214
+ }
215
+ // For Read - just confirm it worked
216
+ if (toolName === 'Read') {
217
+ if (resultStr.length > 100) {
218
+ return `✓ read ${Math.round(resultStr.length / 1000)}k chars`;
219
+ }
220
+ return '✓ read';
221
+ }
222
+ // Default: truncate
223
+ return this.truncate(resultStr, 80);
224
+ }
225
+ /**
226
+ * Extract the last HUMAN user message + Claude response from messages.
227
+ * In Claude Code, most "user" messages are tool_results, not human input.
228
+ * We need to find the last user message that contains actual text content.
229
+ * Also captures file changes from Edit/Write tool calls for walkthrough generation.
230
+ */
231
+ extractLastTurn(messages) {
232
+ // Find the last user message that has actual human text (not just tool_result)
233
+ let lastHumanIdx = -1;
234
+ for (let i = messages.length - 1; i >= 0; i--) {
235
+ if (messages[i].type === 'user' && this.hasHumanText(messages[i])) {
236
+ lastHumanIdx = i;
237
+ break;
238
+ }
239
+ }
240
+ if (lastHumanIdx === -1) {
241
+ logger.debug('No human message found in conversation');
242
+ return null;
243
+ }
244
+ // Extract user message content from the nested message object
245
+ const userMsg = messages[lastHumanIdx];
246
+ let userMessage = '';
247
+ const userContent = userMsg.message?.content;
248
+ if (typeof userContent === 'string') {
249
+ userMessage = userContent;
250
+ }
251
+ else if (Array.isArray(userContent)) {
252
+ userMessage = userContent
253
+ .filter((block) => typeof block === 'object' && block !== null && block.type === 'text')
254
+ .map(block => block.text)
255
+ .join('\n');
256
+ }
257
+ // Collect Claude's response (everything after the human message)
258
+ // Track tool_use blocks and their results for richer context
259
+ const claudeMessages = messages.slice(lastHumanIdx + 1);
260
+ const toolUses = [];
261
+ const pendingTools = new Map();
262
+ const fileChanges = [];
263
+ let claudeResponse = '';
264
+ for (const msg of claudeMessages) {
265
+ const content = msg.message?.content;
266
+ if (!Array.isArray(content)) {
267
+ if (msg.type === 'assistant' && typeof content === 'string') {
268
+ claudeResponse += content + '\n';
269
+ }
270
+ continue;
271
+ }
272
+ for (const block of content) {
273
+ if (typeof block !== 'object' || block === null)
274
+ continue;
275
+ if (msg.type === 'assistant') {
276
+ if (block.type === 'text' && 'text' in block) {
277
+ claudeResponse += block.text + '\n';
278
+ }
279
+ else if (block.type === 'tool_use' && 'name' in block && 'id' in block) {
280
+ const toolBlock = block;
281
+ // Extract key info from input based on tool type
282
+ let inputSummary = '';
283
+ const input = toolBlock.input;
284
+ if (toolBlock.name === 'Edit' || toolBlock.name === 'Write' || toolBlock.name === 'Read') {
285
+ inputSummary = input.file_path || '';
286
+ }
287
+ else if (toolBlock.name === 'Bash') {
288
+ inputSummary = this.truncate(input.command || '', 60);
289
+ }
290
+ else if (toolBlock.name === 'Grep') {
291
+ inputSummary = `"${input.pattern || ''}"`;
292
+ }
293
+ else {
294
+ inputSummary = this.truncate(JSON.stringify(input), 60);
295
+ }
296
+ // Store full input for Edit/Write to capture file changes
297
+ const fullInput = (toolBlock.name === 'Edit' || toolBlock.name === 'Write') ? input : undefined;
298
+ pendingTools.set(toolBlock.id, { name: toolBlock.name, input: inputSummary, fullInput });
299
+ }
300
+ }
301
+ else if (msg.type === 'user' && block.type === 'tool_result' && 'tool_use_id' in block) {
302
+ // Match tool result to its tool_use
303
+ const resultBlock = block;
304
+ const tool = pendingTools.get(resultBlock.tool_use_id);
305
+ if (tool) {
306
+ const resultSummary = this.summarizeToolResult(tool.name, resultBlock.content);
307
+ toolUses.push(`${tool.name}(${tool.input}) → ${resultSummary}`);
308
+ // Capture file changes for Edit/Write (only on success)
309
+ if ((tool.name === 'Edit' || tool.name === 'Write') && tool.fullInput && resultSummary.startsWith('✓')) {
310
+ const filePath = tool.fullInput.file_path;
311
+ const oldString = tool.name === 'Edit' ? tool.fullInput.old_string : null;
312
+ const newString = (tool.fullInput.new_string ?? tool.fullInput.content);
313
+ if (filePath && newString) {
314
+ fileChanges.push({
315
+ toolName: tool.name,
316
+ filePath,
317
+ oldString,
318
+ newString,
319
+ });
320
+ }
321
+ }
322
+ pendingTools.delete(resultBlock.tool_use_id);
323
+ }
324
+ }
325
+ }
326
+ }
327
+ // Add any tools that didn't get results (interrupted?)
328
+ for (const [_id, tool] of pendingTools) {
329
+ toolUses.push(`${tool.name}(${tool.input}) → (no result)`);
330
+ }
331
+ logger.info('Extracted turn', {
332
+ userMessagePreview: userMessage.slice(0, 50),
333
+ claudeResponseLen: claudeResponse.length,
334
+ toolUseCount: toolUses.length,
335
+ toolUseSamples: toolUses.slice(0, 3), // Show first 3 tool uses for debugging
336
+ fileChangeCount: fileChanges.length,
337
+ });
338
+ return {
339
+ userMessage: this.truncate(userMessage, 2000),
340
+ claudeResponse: this.truncate(claudeResponse.trim(), 2000),
341
+ toolUses,
342
+ fileChanges,
343
+ };
344
+ }
345
+ /**
346
+ * Use Haiku to generate a structured turn summary.
347
+ */
348
+ async summarizeTurn(userMessage, claudeResponse, toolUses, previousTurns = []) {
349
+ const client = this.getClient();
350
+ // Log what we're sending to Haiku
351
+ logger.debug('Summarizing turn', {
352
+ userMessageLen: userMessage.length,
353
+ claudeResponseLen: claudeResponse.length,
354
+ toolUseCount: toolUses.length,
355
+ previousTurnCount: previousTurns.length,
356
+ userMessagePreview: userMessage.slice(0, 100),
357
+ });
358
+ const toolUsesStr = toolUses.length > 0
359
+ ? `\nTool uses (${toolUses.length} total):\n${toolUses.slice(0, 10).map(t => `- ${t}`).join('\n')}`
360
+ : '\n(No tool uses)';
361
+ // Build context from previous turns
362
+ const contextStr = previousTurns.length > 0
363
+ ? `\nPREVIOUS TURNS (for context):\n${previousTurns.map(t => `- ${t.icon} [${t.tag}] ${t.headline}`).join('\n')}\n`
364
+ : '';
365
+ const prompt = `You are summarizing a coding session exchange. Output ONLY valid JSON, no other text.
366
+ ${contextStr}
367
+ CURRENT USER MESSAGE:
368
+ ${userMessage || '(empty message)'}
369
+
370
+ CLAUDE'S RESPONSE:
371
+ ${claudeResponse || '(no response captured)'}${toolUsesStr}
372
+
373
+ OUTPUT FORMAT - Return ONLY this JSON structure:
374
+ {"headline": "5-10 word summary of user intent", "actions": ["what claude did 1", "what claude did 2"], "tag": "discuss", "icon": "💬"}
375
+
376
+ VALID TAGS (text only, no emoji): decision | fix | pivot | discovery | friction | explore | implement | refactor | debug | discuss
377
+ ICONS: ⚖️ 🔧 🔄 💡 🚧 🔍 🏗️ ♻️ 🐛 💬
378
+
379
+ JSON ONLY:`;
380
+ try {
381
+ const response = await client.messages.create({
382
+ model: 'claude-haiku-4-5-20251001',
383
+ max_tokens: 500,
384
+ temperature: 0,
385
+ messages: [{ role: 'user', content: prompt }],
386
+ });
387
+ const textContent = response.content.find(block => block.type === 'text');
388
+ if (!textContent || textContent.type !== 'text') {
389
+ throw new Error('No text response from Haiku');
390
+ }
391
+ let jsonText = textContent.text.trim();
392
+ // Strip markdown code blocks if present
393
+ if (jsonText.startsWith('```')) {
394
+ jsonText = jsonText.replace(/^```(?:json)?\n?/, '').replace(/\n?```$/, '');
395
+ }
396
+ // Fix common JSON escape issues from Haiku (invalid escapes like \' or control chars)
397
+ jsonText = jsonText
398
+ .replace(/\\'/g, "'") // \' is not valid JSON escape
399
+ .replace(/[\x00-\x1F\x7F]/g, ' '); // Control characters
400
+ const parsed = JSON.parse(jsonText);
401
+ // Strip any emoji from tag (Haiku sometimes includes the emoji in the tag field)
402
+ // Include Variation_Selector for compound emojis like 🏗️ (U+1F3D7 + U+FE0F)
403
+ const cleanTag = (parsed.tag || 'discuss').replace(/[\p{Extended_Pictographic}\p{Variation_Selector}\s]+$/u, '').trim();
404
+ return {
405
+ headline: parsed.headline || 'Unknown action',
406
+ actions: Array.isArray(parsed.actions) ? parsed.actions : [],
407
+ tag: cleanTag || 'discuss',
408
+ icon: parsed.icon || '💬',
409
+ };
410
+ }
411
+ catch (error) {
412
+ logger.error('Failed to summarize turn with Haiku', error);
413
+ // Return a default summary
414
+ return {
415
+ headline: 'Exchange captured',
416
+ actions: ['Details unavailable'],
417
+ tag: 'discuss',
418
+ icon: '💬',
419
+ };
420
+ }
421
+ }
422
+ /**
423
+ * Save a turn to the database and update session's last termination reason.
424
+ */
425
+ async saveTurn(turn) {
426
+ await this.sessionInfoService.initialize();
427
+ await this.sessionInfoService.saveTurn({
428
+ id: turn.id,
429
+ session_id: turn.sessionId,
430
+ turn_number: turn.turnNumber,
431
+ timestamp: turn.timestamp,
432
+ headline: turn.headline,
433
+ actions: JSON.stringify(turn.actions),
434
+ tag: turn.tag,
435
+ icon: turn.icon,
436
+ exit_code: turn.exitCode,
437
+ termination_reason: turn.terminationReason,
438
+ tool_count: turn.toolCount,
439
+ incomplete: turn.incomplete ? 1 : 0,
440
+ });
441
+ // Also update the session's last termination reason for sidebar display
442
+ await this.sessionInfoService.setLastTerminationReason(turn.sessionId, turn.terminationReason);
443
+ }
444
+ /**
445
+ * Get all turns for a session.
446
+ */
447
+ async getTurnsForSession(sessionId) {
448
+ await this.sessionInfoService.initialize();
449
+ const rows = await this.sessionInfoService.getTurns(sessionId);
450
+ return rows.map(this.mapTurnRow);
451
+ }
452
+ /**
453
+ * Map database row to Turn object.
454
+ */
455
+ mapTurnRow(row) {
456
+ return {
457
+ id: row.id,
458
+ sessionId: row.session_id,
459
+ turnNumber: row.turn_number,
460
+ timestamp: row.timestamp,
461
+ headline: row.headline,
462
+ actions: JSON.parse(row.actions),
463
+ tag: row.tag,
464
+ icon: row.icon,
465
+ exitCode: row.exit_code,
466
+ terminationReason: row.termination_reason || 'normal_completion',
467
+ toolCount: row.tool_count,
468
+ incomplete: row.incomplete === 1,
469
+ };
470
+ }
471
+ truncate(str, maxLen) {
472
+ if (str.length <= maxLen)
473
+ return str;
474
+ return str.slice(0, maxLen - 3) + '...';
475
+ }
476
+ }
477
+ //# sourceMappingURL=turn-capture-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-capture-service.js","sourceRoot":"","sources":["../../../src/services/sessions/turn-capture-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * TurnRepository - Per-turn summaries and metadata.
3
+ *
4
+ * Extracted from SessionInfoService to separate turn tracking from session management.
5
+ * Each turn represents one assistant response with its headline, actions, and metadata.
6
+ *
7
+ * Tables managed:
8
+ * - session_turns
9
+ */
10
+ import Database from 'better-sqlite3';
11
+ export interface TurnRecord {
12
+ id: string;
13
+ session_id: string;
14
+ turn_number: number;
15
+ timestamp: string;
16
+ headline: string;
17
+ actions: string;
18
+ tag: string;
19
+ icon: string;
20
+ exit_code: number | null;
21
+ termination_reason: string;
22
+ tool_count: number;
23
+ incomplete: number;
24
+ }
25
+ export declare class TurnRepository {
26
+ private db;
27
+ private logger;
28
+ constructor(db: Database.Database);
29
+ /**
30
+ * Save a turn to the database.
31
+ */
32
+ save(turn: TurnRecord): Promise<void>;
33
+ /**
34
+ * Get all turns for a session, ordered by turn number.
35
+ * Supports both full session IDs and short prefixes.
36
+ */
37
+ getForSession(sessionId: string): Promise<TurnRecord[]>;
38
+ /**
39
+ * Get turn count for a session (without fetching all data).
40
+ */
41
+ getCount(sessionId: string): Promise<number>;
42
+ /**
43
+ * Copy turns from one session to another (used for branching).
44
+ * Only copies turns up to and including maxTurnNumber.
45
+ */
46
+ copyForBranch(sourceSessionId: string, newSessionId: string, maxTurnNumber: number): Promise<number>;
47
+ }
48
+ //# sourceMappingURL=turn-repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-repository.d.ts","sourceRoot":"","sources":["../../../src/services/sessions/turn-repository.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAGtC,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,cAAc;IAGb,OAAO,CAAC,EAAE;IAFtB,OAAO,CAAC,MAAM,CAAS;gBAEH,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAIzC;;OAEG;IACG,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAgC3C;;;OAGG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAe7D;;OAEG;IACG,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAalD;;;OAGG;IACG,aAAa,CAAC,eAAe,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAyB3G"}