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,389 @@
1
+ import{l as i,j as e,ao as r,r as o,p as a,ap as c}from"./main-B1fyog77.js";const d=[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]],h=i("chevron-left",d),l=[{path:"/prototype/narrative-walkthrough",label:"Narrative Walkthrough"},{path:"/prototype/walkthrough-headers",label:"Header Variations"},{path:"/prototype/section-headers",label:"Section Headers"},{path:"/prototype/moment-cards",label:"Moment Cards"},{path:"/prototype/file-tree",label:"Contextual File Tree"},{path:"/prototype/scrollycoding",label:"Scrollycoding"},{path:"/prototype/codehike-experiment",label:"CodeHike Experiment"},{path:"/prototype/walkthrough-showcase",label:"Walkthrough Showcase"},{path:"/prototype/smart-menu",label:"Smart Menu"}];function p(){const[t,n]=o.useState(!0);return e.jsx("div",{className:"fixed bottom-4 right-4 z-50",children:t?e.jsxs("button",{onClick:()=>n(!1),className:"flex items-center gap-2 px-3 py-2 rounded-lg bg-zinc-900/90 backdrop-blur-sm border border-zinc-700 text-zinc-400 text-xs font-mono hover:text-zinc-200 hover:border-zinc-500 transition-all shadow-lg",children:[e.jsx("span",{children:"Prototypes"}),e.jsx(h,{size:14})]}):e.jsxs("div",{className:"rounded-xl bg-zinc-900/95 backdrop-blur-sm border border-zinc-700 shadow-xl overflow-hidden",children:[e.jsxs("div",{className:"px-3 py-2 border-b border-zinc-800 flex items-center justify-between",children:[e.jsx("span",{className:"text-[10px] font-display text-zinc-500 uppercase tracking-wider",children:"Prototypes"}),e.jsx("button",{onClick:()=>n(!0),className:"text-zinc-500 hover:text-zinc-300",children:e.jsx(a,{size:14})})]}),e.jsx("div",{className:"p-2 space-y-1",children:l.map(s=>e.jsxs("a",{href:s.path,target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-2 px-2 py-1.5 rounded text-xs text-zinc-400 hover:text-zinc-200 hover:bg-zinc-800 transition-colors",children:[e.jsx(c,{size:12}),s.label]},s.path))})]})})}const g={sessionId:"8c3c3f2e",title:"Implementing Session Branching with Branch Point Indicators",summary:"Building the ability to create new sessions from any point in conversation history, with visual indicators showing where branches occurred.",totalTurns:43,generatedAt:new Date().toISOString(),fileTree:[{name:"src",path:"src",type:"directory",children:[{name:"services",path:"src/services",type:"directory",description:"Backend business logic",children:[{name:"session-info-service.ts",path:"session-info-service.ts",type:"file",description:"SQLite CRUD for session metadata"},{name:"claude-history-reader.ts",path:"claude-history-reader.ts",type:"file",description:"Reads session JSONL files"}]},{name:"routes",path:"src/routes",type:"directory",description:"REST API endpoints",children:[{name:"session.routes.ts",path:"session.routes.ts",type:"file",description:"Session CRUD endpoints"}]},{name:"components",path:"src/components",type:"directory",description:"React UI components",children:[{name:"BranchIndicator.tsx",path:"BranchIndicator.tsx",type:"file",description:"Shows branch count on messages"},{name:"MessageActions.tsx",path:"MessageActions.tsx",type:"file",description:"Right-click menu for messages"}]}]}],phases:[{name:"Discovery & Validation",narrative:"The session began with understanding the user's request and validating the approach. The core insight was that branching should work from any turn, not just the most recent one.",siblingFiles:[{path:"src/services/insights-coordinator.ts",name:"insights-coordinator.ts",description:"Coordinates insight generation events"},{path:"src/services/insights-computer.ts",name:"insights-computer.ts",description:"LLM calls for AI-generated metadata"},{path:"src/services/stream-manager.ts",name:"stream-manager.ts",description:"SSE broadcast to connected clients"}],directoryDescriptions:{src:"Application source code","src/services":"Backend business logic and data access"},keyMoments:[{turn:1,tag:"discovery",headline:"Understanding the branching requirement",narrative:'User wants to branch from any point in history, not just continue from the end. This requires tracking which message is the "branch point" for each session.',userSaid:"I want to be able to create a new session starting from any message in the conversation",code:void 0},{turn:5,tag:"discovery",headline:"Identified existing continuation_session_id field",code:[{file:"src/services/session-info-service.ts",language:"typescript",description:"SQLite CRUD for session metadata, insights, and turn summaries",before:"// existing file",after:`interface SessionInfo {
2
+ sessionId: string;
3
+ customName?: string;
4
+ // Existing field - tracks parent session
5
+ continuation_session_id?: string;
6
+ // NEW: Track which message we branched from
7
+ branch_point_message_id?: string;
8
+ }`,narrative:"Found that sessions already track their parent via continuation_session_id, but we need to also track the specific message they branched from with a new branch_point_message_id field.",linkedPhrases:[{phrase:"continuation_session_id",lines:"5",tooltip:"Existing field that links to the parent session"},{phrase:"branch_point_message_id",lines:"7",tooltip:"New field we're adding to track the exact message"}],contextBefore:`import { Database } from 'better-sqlite3';
9
+ import { logger } from '../utils/logger';
10
+
11
+ // Session metadata stored in SQLite`,contextAfter:`interface SessionInsights {
12
+ purpose?: string;
13
+ milestones?: Milestone[];
14
+ currentState?: string;
15
+ }`,hiddenLinesBefore:18,hiddenLinesAfter:412,changeStartLine:23,changeEndLine:30,fullFileBefore:`/**
16
+ * Session Info Service
17
+ *
18
+ * Manages session metadata in SQLite database.
19
+ */
20
+
21
+ import { Database } from 'better-sqlite3';
22
+ import { logger } from '../utils/logger';
23
+ import * as path from 'path';
24
+ import * as os from 'os';
25
+
26
+ const DB_PATH = path.join(os.homedir(), '.claudia', 'session-info.db');
27
+
28
+ // Session metadata stored in SQLite
29
+ interface SessionInfo {
30
+ sessionId: string;
31
+ customName?: string;
32
+ pinned?: boolean;
33
+ archived?: boolean;
34
+ createdAt?: string;
35
+ updatedAt?: string;
36
+ // Existing field - tracks parent session
37
+ continuation_session_id?: string;
38
+ }
39
+
40
+ interface SessionInsights {
41
+ purpose?: string;
42
+ milestones?: Milestone[];
43
+ currentState?: string;
44
+ }
45
+
46
+ interface Milestone {
47
+ id: string;
48
+ label: string;
49
+ completed: boolean;
50
+ }
51
+
52
+ export class SessionInfoService {
53
+ private static instance: SessionInfoService;
54
+ private db: Database;
55
+
56
+ private constructor() {
57
+ this.db = new Database(DB_PATH);
58
+ this.runMigrations();
59
+ }
60
+
61
+ static getInstance(): SessionInfoService {
62
+ if (!SessionInfoService.instance) {
63
+ SessionInfoService.instance = new SessionInfoService();
64
+ }
65
+ return SessionInfoService.instance;
66
+ }
67
+
68
+ getSession(sessionId: string): SessionInfo | null {
69
+ const row = this.db.prepare('SELECT * FROM sessions WHERE session_id = ?').get(sessionId);
70
+ return row ? this.rowToSession(row) : null;
71
+ }
72
+
73
+ updateSession(sessionId: string, updates: Partial<SessionInfo>): void {
74
+ // ... implementation
75
+ }
76
+ }`,fullFileAfter:`/**
77
+ * Session Info Service
78
+ *
79
+ * Manages session metadata in SQLite database.
80
+ */
81
+
82
+ import { Database } from 'better-sqlite3';
83
+ import { logger } from '../utils/logger';
84
+ import * as path from 'path';
85
+ import * as os from 'os';
86
+
87
+ const DB_PATH = path.join(os.homedir(), '.claudia', 'session-info.db');
88
+
89
+ // Session metadata stored in SQLite
90
+ interface SessionInfo {
91
+ sessionId: string;
92
+ customName?: string;
93
+ pinned?: boolean;
94
+ archived?: boolean;
95
+ createdAt?: string;
96
+ updatedAt?: string;
97
+ // Existing field - tracks parent session
98
+ continuation_session_id?: string;
99
+ // NEW: Track which message we branched from
100
+ branch_point_message_id?: string;
101
+ }
102
+
103
+ interface SessionInsights {
104
+ purpose?: string;
105
+ milestones?: Milestone[];
106
+ currentState?: string;
107
+ }
108
+
109
+ interface Milestone {
110
+ id: string;
111
+ label: string;
112
+ completed: boolean;
113
+ }
114
+
115
+ export class SessionInfoService {
116
+ private static instance: SessionInfoService;
117
+ private db: Database;
118
+
119
+ private constructor() {
120
+ this.db = new Database(DB_PATH);
121
+ this.runMigrations();
122
+ }
123
+
124
+ static getInstance(): SessionInfoService {
125
+ if (!SessionInfoService.instance) {
126
+ SessionInfoService.instance = new SessionInfoService();
127
+ }
128
+ return SessionInfoService.instance;
129
+ }
130
+
131
+ getSession(sessionId: string): SessionInfo | null {
132
+ const row = this.db.prepare('SELECT * FROM sessions WHERE session_id = ?').get(sessionId);
133
+ return row ? this.rowToSession(row) : null;
134
+ }
135
+
136
+ updateSession(sessionId: string, updates: Partial<SessionInfo>): void {
137
+ // ... implementation
138
+ }
139
+ }`}]}]},{name:"Core Implementation",narrative:"With the design validated, implementation began on the database schema, service layer, and API endpoints.",siblingFiles:[{path:"src/services/session-info-service.ts",name:"session-info-service.ts",description:"SQLite CRUD for session metadata"},{path:"src/routes/conversation.routes.ts",name:"conversation.routes.ts",description:"Chat message and prompt endpoints"},{path:"src/routes/system.routes.ts",name:"system.routes.ts",description:"Health checks and server info"},{path:"src/web/chat/components/MessageBubble.tsx",name:"MessageBubble.tsx",description:"Individual message rendering"},{path:"src/web/chat/components/ConversationView.tsx",name:"ConversationView.tsx",description:"Main chat view container"}],directoryDescriptions:{src:"Application source code","src/services":"Backend business logic and data access","src/routes":"REST API endpoint handlers","src/web":"Frontend React application","src/web/chat":"Chat UI module","src/web/chat/components":"React UI components"},keyMoments:[{turn:12,tag:"implement",headline:"Added branch_point_message_id column to sessions table",code:[{file:"src/services/session-info-service.ts",language:"typescript",before:"// existing file",after:`// Migration: Add branch point tracking
140
+ db.exec(\`
141
+ ALTER TABLE sessions
142
+ ADD COLUMN branch_point_message_id TEXT;
143
+ \`);`,focusLines:"3:4",explanation:"SQLite migration to add the new column for tracking branch points.",contextBefore:` private runMigrations(): void {
144
+ const version = this.db.pragma('user_version', { simple: true }) as number;
145
+
146
+ if (version < 1) {`,contextAfter:` }
147
+
148
+ if (version < 2) {
149
+ // Add insights columns
150
+ db.exec(\`ALTER TABLE sessions ADD COLUMN purpose TEXT;\`);`,hiddenLinesBefore:82,hiddenLinesAfter:350}]},{turn:18,tag:"implement",headline:"Created getBranchesForSession API endpoint",narrative:"API endpoint to fetch all branches that originated from a given session.",code:[{file:"src/routes/session.routes.ts",language:"typescript",description:"REST API endpoints for session CRUD, archiving, and branching",after:`router.get('/api/sessions/:sessionId/branches', async (req, res) => {
151
+ const { sessionId } = req.params;
152
+ const branches = sessionInfoService.getBranchesFrom(sessionId);
153
+ res.json({ branches });
154
+ });`,explanation:"REST endpoint for the frontend to query branch information.",contextBefore:`router.delete('/api/sessions/:sessionId', async (req, res) => {
155
+ const { sessionId } = req.params;
156
+ await sessionInfoService.deleteSession(sessionId);
157
+ res.status(204).send();
158
+ });`,contextAfter:`router.post('/api/sessions/:sessionId/archive', async (req, res) => {
159
+ const { sessionId } = req.params;
160
+ await sessionInfoService.archiveSession(sessionId);
161
+ res.json({ success: true });
162
+ });`,hiddenLinesBefore:138,hiddenLinesAfter:25,changeStartLine:142,changeEndLine:147,fullFileBefore:`/**
163
+ * Session Routes
164
+ *
165
+ * REST API endpoints for session management.
166
+ */
167
+
168
+ import { Router } from 'express';
169
+ import { SessionInfoService } from '../services/session-info-service';
170
+
171
+ const router = Router();
172
+ const sessionInfoService = SessionInfoService.getInstance();
173
+
174
+ // List all sessions
175
+ router.get('/api/sessions', async (req, res) => {
176
+ const sessions = await sessionInfoService.getAllSessions();
177
+ res.json({ sessions });
178
+ });
179
+
180
+ // Get single session
181
+ router.get('/api/sessions/:sessionId', async (req, res) => {
182
+ const { sessionId } = req.params;
183
+ const session = await sessionInfoService.getSession(sessionId);
184
+ if (!session) {
185
+ return res.status(404).json({ error: 'Session not found' });
186
+ }
187
+ res.json(session);
188
+ });
189
+
190
+ // Update session
191
+ router.patch('/api/sessions/:sessionId', async (req, res) => {
192
+ const { sessionId } = req.params;
193
+ const updates = req.body;
194
+ await sessionInfoService.updateSession(sessionId, updates);
195
+ res.json({ success: true });
196
+ });
197
+
198
+ // Delete session
199
+ router.delete('/api/sessions/:sessionId', async (req, res) => {
200
+ const { sessionId } = req.params;
201
+ await sessionInfoService.deleteSession(sessionId);
202
+ res.status(204).send();
203
+ });
204
+
205
+ // Archive session
206
+ router.post('/api/sessions/:sessionId/archive', async (req, res) => {
207
+ const { sessionId } = req.params;
208
+ await sessionInfoService.archiveSession(sessionId);
209
+ res.json({ success: true });
210
+ });
211
+
212
+ export default router;`,fullFileAfter:`/**
213
+ * Session Routes
214
+ *
215
+ * REST API endpoints for session management.
216
+ */
217
+
218
+ import { Router } from 'express';
219
+ import { SessionInfoService } from '../services/session-info-service';
220
+
221
+ const router = Router();
222
+ const sessionInfoService = SessionInfoService.getInstance();
223
+
224
+ // List all sessions
225
+ router.get('/api/sessions', async (req, res) => {
226
+ const sessions = await sessionInfoService.getAllSessions();
227
+ res.json({ sessions });
228
+ });
229
+
230
+ // Get single session
231
+ router.get('/api/sessions/:sessionId', async (req, res) => {
232
+ const { sessionId } = req.params;
233
+ const session = await sessionInfoService.getSession(sessionId);
234
+ if (!session) {
235
+ return res.status(404).json({ error: 'Session not found' });
236
+ }
237
+ res.json(session);
238
+ });
239
+
240
+ // Update session
241
+ router.patch('/api/sessions/:sessionId', async (req, res) => {
242
+ const { sessionId } = req.params;
243
+ const updates = req.body;
244
+ await sessionInfoService.updateSession(sessionId, updates);
245
+ res.json({ success: true });
246
+ });
247
+
248
+ // Delete session
249
+ router.delete('/api/sessions/:sessionId', async (req, res) => {
250
+ const { sessionId } = req.params;
251
+ await sessionInfoService.deleteSession(sessionId);
252
+ res.status(204).send();
253
+ });
254
+
255
+ // Get branches from a session
256
+ router.get('/api/sessions/:sessionId/branches', async (req, res) => {
257
+ const { sessionId } = req.params;
258
+ const branches = sessionInfoService.getBranchesFrom(sessionId);
259
+ res.json({ branches });
260
+ });
261
+
262
+ // Archive session
263
+ router.post('/api/sessions/:sessionId/archive', async (req, res) => {
264
+ const { sessionId } = req.params;
265
+ await sessionInfoService.archiveSession(sessionId);
266
+ res.json({ success: true });
267
+ });
268
+
269
+ export default router;`}]},{turn:23,tag:"implement",headline:"Built branch indicator component",code:[{file:"src/web/chat/components/BranchIndicator.tsx",language:"tsx",description:"Visual indicator showing branch count for messages",status:"added",after:`function BranchIndicator({ messageId, branches }: Props) {
270
+ const branchesFromHere = branches.filter(
271
+ b => b.branchPointMessageId === messageId
272
+ );
273
+
274
+ if (branchesFromHere.length === 0) return null;
275
+
276
+ return (
277
+ <div className="flex items-center gap-1 text-xs text-zinc-500">
278
+ <GitBranch size={12} />
279
+ <span>{branchesFromHere.length} branch(es)</span>
280
+ </div>
281
+ );
282
+ }`,narrative:"The component filters branches to find ones originating from this message, then renders a count. The early return handles the common case where most messages have no branches.",linkedPhrases:[{phrase:"filters branches",lines:"2:4",tooltip:"Finds branches where this message is the branch point"},{phrase:"early return",lines:"6",tooltip:"Optimization: most messages have no branches"},{phrase:"renders a count",lines:"8:12"}],contextBefore:`import { GitBranch } from 'lucide-react';
283
+
284
+ interface Props {
285
+ messageId: string;
286
+ branches: Branch[];
287
+ }`,contextAfter:"export default BranchIndicator;",hiddenLinesBefore:1,hiddenLinesAfter:5,changeStartLine:12,changeEndLine:25,fullFileBefore:`/**
288
+ * Branch Indicator
289
+ *
290
+ * Shows the number of branches that originated from a specific message.
291
+ */
292
+
293
+ import { GitBranch } from 'lucide-react';
294
+
295
+ interface Branch {
296
+ sessionId: string;
297
+ branchPointMessageId: string;
298
+ createdAt: string;
299
+ }
300
+
301
+ interface Props {
302
+ messageId: string;
303
+ branches: Branch[];
304
+ }
305
+
306
+ // Placeholder - component will be implemented
307
+ function BranchIndicator({ messageId, branches }: Props) {
308
+ return null;
309
+ }
310
+
311
+ export default BranchIndicator;`,fullFileAfter:`/**
312
+ * Branch Indicator
313
+ *
314
+ * Shows the number of branches that originated from a specific message.
315
+ */
316
+
317
+ import { GitBranch } from 'lucide-react';
318
+
319
+ interface Branch {
320
+ sessionId: string;
321
+ branchPointMessageId: string;
322
+ createdAt: string;
323
+ }
324
+
325
+ interface Props {
326
+ messageId: string;
327
+ branches: Branch[];
328
+ }
329
+
330
+ function BranchIndicator({ messageId, branches }: Props) {
331
+ const branchesFromHere = branches.filter(
332
+ b => b.branchPointMessageId === messageId
333
+ );
334
+
335
+ if (branchesFromHere.length === 0) return null;
336
+
337
+ return (
338
+ <div className="flex items-center gap-1 text-xs text-zinc-500">
339
+ <GitBranch size={12} />
340
+ <span>{branchesFromHere.length} branch(es)</span>
341
+ </div>
342
+ );
343
+ }
344
+
345
+ export default BranchIndicator;`}]}]},{name:"The Branch Indicator Rabbit Hole",narrative:"What started as a simple UI addition turned into a debugging session. The branch indicators weren't appearing even though the data was correct.",siblingFiles:[{path:"src/web/chat/components/MessageActions.tsx",name:"MessageActions.tsx",description:"Right-click context menu for messages"},{path:"src/services/sessions/session-cache.ts",name:"session-cache.ts",description:"In-memory session data cache"}],directoryDescriptions:{src:"Application source code","src/services":"Backend business logic and data access","src/services/sessions":"Session management and history","src/web/chat/components":"React UI components"},keyMoments:[{turn:28,tag:"friction",headline:"Branch indicators not showing up",narrative:"The component was rendering but the indicators weren't visible. Spent time checking CSS, data flow, and component mounting.",userSaid:"the branch indicator isnt showing up"},{turn:31,tag:"discovery",headline:"Found the root cause: message ID mismatch",code:[{file:"src/web/chat/components/BranchIndicator.tsx",language:"typescript",before:"// existing file",after:`// Message IDs from Claude use 'msg_' prefix, but we store without it
346
+ const normalizedId = messageId.replace(/^msg_/, '');
347
+ const branchesFromHere = branches.filter(
348
+ b => b.branchPointMessageId === normalizedId
349
+ );`,narrative:"The messageId from Claude includes a msg_ prefix, but we were storing IDs without it. The fix strips the prefix before comparison using normalizedId.",linkedPhrases:[{phrase:"msg_ prefix",lines:"1:2",tooltip:"Claude's message IDs look like msg_abc123"},{phrase:"normalizedId",lines:"2",tooltip:"Strip the prefix to match our stored format"}]}]},{turn:35,tag:"pivot",headline:"Discovered pagination was hiding branch point messages",narrative:"Even with the ID fix, indicators still weren't showing. The branch point message was often not in the visible paginated window.",userSaid:"still not showing. maybe its not in the current view?"},{turn:39,tag:"fix",headline:"Fixed pagination to include branch point messages",code:[{file:"src/services/sessions/claude-history-reader.ts",language:"typescript",after:`async getMessages(sessionId: string, options: {
350
+ limit?: number;
351
+ branchPointMessageId?: string
352
+ }): Promise<Message[]> {
353
+ const messages = await this.fetchPaginated(sessionId, options.limit);
354
+
355
+ // Always include the branch point if it exists and isn't already included
356
+ if (options.branchPointMessageId) {
357
+ const hasBranchPoint = messages.some(
358
+ m => m.id === options.branchPointMessageId
359
+ );
360
+ if (!hasBranchPoint) {
361
+ const branchPoint = await this.fetchMessage(
362
+ sessionId,
363
+ options.branchPointMessageId
364
+ );
365
+ if (branchPoint) {
366
+ messages.unshift(branchPoint);
367
+ }
368
+ }
369
+ }
370
+
371
+ return messages;
372
+ }`,narrative:"The fix adds an optional branchPointMessageId parameter. After fetching paginated messages, we check if the branch point is already included. If not, we fetch it separately and prepend it to the array with unshift.",linkedPhrases:[{phrase:"branchPointMessageId parameter",lines:"3",tooltip:"Optional - only used for branched sessions"},{phrase:"check if the branch point is already included",lines:"9:11"},{phrase:"fetch it separately",lines:"13:16",tooltip:"Single message fetch by ID"},{phrase:"unshift",lines:"18",tooltip:"Prepend to array so it appears first"}]}]},{turn:42,tag:"implement",headline:"Removed deprecated branch helper utility",narrative:"With branch handling now built into the history reader, the old helper module was no longer needed.",code:[{file:"src/utils/branch-helpers.ts",language:"typescript",description:"Deprecated helper functions for branch point detection",status:"deleted",before:`/**
373
+ * Branch Helpers
374
+ *
375
+ * Utility functions for branch point detection.
376
+ * @deprecated Use ClaudeHistoryReader.getMessagesWithBranchPoint instead
377
+ */
378
+
379
+ export function findBranchPointIndex(messages: Message[], branchId: string): number {
380
+ return messages.findIndex(m => m.id === branchId);
381
+ }
382
+
383
+ export function isBranchPoint(message: Message, branches: Branch[]): boolean {
384
+ return branches.some(b => b.branchPointMessageId === message.id);
385
+ }
386
+
387
+ export function getBranchesForMessage(messageId: string, branches: Branch[]): Branch[] {
388
+ return branches.filter(b => b.branchPointMessageId === messageId);
389
+ }`,after:""}]}]}],outcome:{summary:'Session branching now works from any point in conversation history. Users can right-click any message and select "Branch from here" to create a new session. Branch points are marked with a visual indicator, and the indicator persists even when the branch point would normally be outside the paginated view.',filesChanged:["session-info-service.ts","session.routes.ts","BranchIndicator.tsx","claude-history-reader.ts","MessageActions.tsx","branch-helpers.ts"],linesAdded:156,linesRemoved:41},editorial:{heading:"What Made This Hard",content:`The implementation itself was straightforward, but the debugging revealed subtle assumptions. The message ID format mismatch would have been caught earlier with consistent ID handling. The pagination issue highlighted that "recent messages" pagination doesn't work well for features that reference specific historical messages - they need explicit inclusion.`}};function u(){return e.jsxs(e.Fragment,{children:[e.jsx(r,{walkthrough:g}),e.jsx(p,{})]})}export{u as NarrativeWalkthroughDemo,u as default};
@@ -0,0 +1 @@
1
+ import{l as v,j as e,aj as h,O as b,T as u,f as z,ah as y,ak as w,o as k,aq as C,n as T}from"./main-B1fyog77.js";import{T as F}from"./target-Cf92wDTW.js";import{B as A}from"./brain-BXIZKtOZ.js";const O=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]],N=v("circle-check",O);function m(i){const t=[];for(const r of i){const s=r.path.split("/");let a=t;for(let n=0;n<s.length;n++){const d=s[n],p=n===s.length-1,j=s.slice(0,n+1).join("/");let o=a.find(f=>f.name===d);o||(o={name:d,path:j,type:p?"file":"directory",children:p?void 0:[],fileInfo:p?r:void 0},a.push(o)),!p&&o.children&&(a=o.children)}}const c=r=>r.sort((s,a)=>s.type!==a.type?s.type==="directory"?-1:1:s.name.localeCompare(a.name)).map(s=>({...s,children:s.children?c(s.children):void 0}));return c(t)}const l={summary:'Session branching now works from any point in conversation history. Users can right-click any message and select "Branch from here" to create a new session that preserves context up to that point.',files:[{path:"src/services/session-info-service.ts",type:"modified",linesAdded:45,linesRemoved:8},{path:"src/routes/session.routes.ts",type:"modified",linesAdded:32,linesRemoved:0},{path:"src/components/BranchIndicator.tsx",type:"added",linesAdded:67},{path:"src/services/claude-history-reader.ts",type:"modified",linesAdded:12,linesRemoved:15}],totalLinesAdded:156,totalLinesRemoved:23,insight:{heading:"What Made This Hard",content:`The pagination issue highlighted that "recent messages" pagination doesn't work well for features that reference specific historical messages - they need explicit inclusion.`}};function x({node:i,depth:t=0}){const c=s=>{switch(s){case"added":return e.jsx(T,{size:14,className:"text-emerald-500"});case"deleted":return e.jsx(C,{size:14,className:"text-red-500"});case"modified":return e.jsx(k,{size:14,className:"text-amber-500"})}};if(i.type==="directory")return e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center gap-1.5 py-0.5 text-zinc-500",style:{paddingLeft:`${t*16}px`},children:[e.jsx(y,{size:14,className:"text-zinc-600"}),e.jsx("span",{className:"text-sm font-mono",children:i.name})]}),i.children?.map((s,a)=>e.jsx(x,{node:s,depth:t+1},a))]});const r=i.fileInfo;return e.jsxs("div",{className:"flex items-center gap-1.5 py-0.5 text-zinc-400 group",style:{paddingLeft:`${t*16}px`},children:[r?c(r.type):e.jsx(w,{size:14,className:"text-zinc-600"}),e.jsx("span",{className:"text-sm font-mono",children:i.name}),r&&(r.linesAdded||r.linesRemoved)&&e.jsxs("span",{className:"text-xs font-mono text-zinc-600 ml-auto",children:[r.linesAdded?e.jsxs("span",{className:"text-emerald-600",children:["+",r.linesAdded]}):null,r.linesAdded&&r.linesRemoved?" ":null,r.linesRemoved?e.jsxs("span",{className:"text-red-600",children:["-",r.linesRemoved]}):null]})]})}function R({summary:i,files:t,totalLinesAdded:c,totalLinesRemoved:r,insight:s}){const a=m(t);return e.jsxs("section",{className:"border-t border-zinc-800 pt-12 mt-12",children:[e.jsx("div",{className:"text-emerald-400 text-sm font-medium mb-3 uppercase tracking-wider",children:"Outcome"}),e.jsx("p",{className:"text-xl text-zinc-200 leading-relaxed mb-8",children:i}),e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsxs("div",{className:"border border-border/30 rounded-lg p-3 bg-card/20",children:[e.jsxs("div",{className:"text-[11px] uppercase tracking-wider text-muted-foreground/60 mb-2 flex items-center gap-1.5",children:[e.jsx(h,{size:12}),"Changes",e.jsxs("span",{className:"ml-auto font-mono",children:[e.jsxs("span",{className:"text-emerald-500",children:["+",c]})," ",e.jsxs("span",{className:"text-red-500",children:["-",r]})]})]}),e.jsx("div",{className:"space-y-0",children:a.map((n,d)=>e.jsx(x,{node:n},d))})]}),e.jsxs("div",{className:"border border-amber-500/20 rounded-lg p-3 bg-amber-500/5",children:[e.jsxs("div",{className:"text-[11px] uppercase tracking-wider text-amber-400/80 mb-2 flex items-center gap-1.5",children:[e.jsx(b,{size:12}),s.heading]}),e.jsx("div",{className:"text-sm leading-relaxed text-foreground/80",children:s.content})]})]})]})}function I({summary:i,files:t,totalLinesAdded:c,totalLinesRemoved:r,insight:s}){const a=m(t);return e.jsxs("section",{className:"border-t border-zinc-800 pt-12 mt-12",children:[e.jsxs("div",{className:"flex items-start gap-4 mb-8",children:[e.jsx("div",{className:"w-8 h-8 rounded-full bg-emerald-500/10 border border-emerald-500/30 flex items-center justify-center shrink-0",children:e.jsx(N,{size:16,className:"text-emerald-400"})}),e.jsxs("div",{children:[e.jsx("div",{className:"text-xs font-display font-bold text-emerald-400 uppercase tracking-wider mb-2",children:"Complete"}),e.jsx("p",{className:"text-zinc-300 leading-relaxed",children:i})]})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsxs("div",{className:"rounded-xl border border-zinc-800 bg-zinc-900/50 overflow-hidden",children:[e.jsxs("div",{className:"px-4 py-2.5 border-b border-zinc-800 flex items-center gap-2",children:[e.jsx(h,{size:14,className:"text-zinc-500"}),e.jsx("span",{className:"text-xs font-medium text-zinc-400 uppercase tracking-wider",children:"Changes"}),e.jsxs("span",{className:"ml-auto text-xs font-mono text-zinc-600",children:[e.jsxs("span",{className:"text-emerald-500",children:["+",c]})," ",e.jsxs("span",{className:"text-red-500",children:["-",r]})]})]}),e.jsx("div",{className:"py-2 px-3",children:a.map((n,d)=>e.jsx(x,{node:n},d))})]}),e.jsxs("div",{className:"rounded-xl border border-amber-500/20 bg-amber-500/5 overflow-hidden",children:[e.jsxs("div",{className:"px-4 py-2.5 border-b border-amber-500/20 flex items-center gap-2",children:[e.jsx(b,{size:14,className:"text-amber-400"}),e.jsx("span",{className:"text-xs font-medium text-amber-400 uppercase tracking-wider",children:s.heading})]}),e.jsx("div",{className:"p-4",children:e.jsx("p",{className:"text-sm text-zinc-300 leading-relaxed",children:s.content})})]})]})]})}function S({summary:i,files:t,totalLinesAdded:c,totalLinesRemoved:r,insight:s}){const a=m(t);return e.jsxs("section",{className:"border-t border-zinc-800 pt-12 mt-12",children:[e.jsxs("div",{className:"text-[10px] font-display font-bold text-zinc-500 uppercase tracking-wider mb-4 flex items-center gap-2",children:[e.jsx(N,{size:12,className:"text-emerald-500"}),"Result"]}),e.jsx("p",{className:"text-lg text-zinc-200 leading-relaxed mb-6",children:i}),e.jsxs("div",{className:"border-l-2 border-amber-500/50 pl-4 mb-8",children:[e.jsx("div",{className:"text-[10px] font-display font-bold text-amber-400 uppercase tracking-wider mb-1",children:s.heading}),e.jsx("p",{className:"text-sm text-zinc-400 leading-relaxed",children:s.content})]}),e.jsxs("div",{className:"flex items-start gap-6",children:[e.jsxs("div",{className:"text-xs font-mono text-zinc-600 shrink-0 pt-0.5",children:[t.length," files",e.jsxs("div",{className:"mt-1",children:[e.jsxs("span",{className:"text-emerald-500",children:["+",c]})," ",e.jsxs("span",{className:"text-red-500",children:["-",r]})]})]}),e.jsx("div",{className:"flex-1 border-l border-zinc-800/50 pl-4",children:a.map((n,d)=>e.jsx(x,{node:n},d))})]})]})}function V({summary:i,files:t,totalLinesAdded:c,totalLinesRemoved:r,insight:s}){const a=m(t);return e.jsxs("section",{className:"border-t border-zinc-800 pt-12 mt-12",children:[e.jsxs("div",{className:"mb-10",children:[e.jsxs("div",{className:"inline-flex items-center gap-2 px-3 py-1 rounded-full bg-amber-500/10 border border-amber-500/20 mb-4",children:[e.jsx(u,{size:12,className:"text-amber-400"}),e.jsx("span",{className:"text-[10px] font-display font-bold text-amber-400 uppercase tracking-wider",children:s.heading})]}),e.jsx("p",{className:"text-xl text-zinc-100 leading-relaxed",children:s.content})]}),e.jsx("p",{className:"text-zinc-500 leading-relaxed mb-8",children:i}),e.jsxs("div",{className:"pt-6 border-t border-zinc-800/50",children:[e.jsxs("div",{className:"text-[10px] font-display text-zinc-600 uppercase tracking-wider mb-2 flex items-center gap-4",children:[e.jsxs("span",{children:[t.length," files changed"]}),e.jsxs("span",{children:[e.jsxs("span",{className:"text-emerald-600",children:["+",c]})," ",e.jsxs("span",{className:"text-red-600",children:["-",r]})]})]}),e.jsx("div",{className:"space-y-0",children:a.map((n,d)=>e.jsx(x,{node:n},d))})]})]})}function L({summary:i,files:t,totalLinesAdded:c,totalLinesRemoved:r,insight:s}){const a=m(t);return e.jsxs("section",{className:"border-t border-zinc-800 pt-12 mt-12",children:[e.jsxs("div",{className:"flex items-center gap-4 mb-6",children:[e.jsx("div",{className:"w-10 h-10 rounded-full bg-zinc-800 border border-zinc-700 flex items-center justify-center text-emerald-400 text-lg",children:e.jsx(N,{size:20})}),e.jsx("h2",{className:"text-2xl font-bold text-zinc-100",children:"Done"})]}),e.jsx("p",{className:"text-zinc-400 text-lg leading-relaxed mb-8 ml-14",children:i}),e.jsxs("div",{className:"ml-14 space-y-6",children:[e.jsxs("div",{className:"p-4 rounded-lg bg-amber-500/5 border border-amber-500/20",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[e.jsx(b,{size:14,className:"text-amber-400"}),e.jsx("span",{className:"text-xs font-display font-bold text-amber-400 uppercase tracking-wider",children:s.heading})]}),e.jsx("p",{className:"text-sm text-zinc-300 leading-relaxed",children:s.content})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"text-[10px] font-display text-zinc-600 uppercase tracking-wider mb-2 flex items-center gap-2",children:[e.jsx(h,{size:10}),t.length," files · ",e.jsxs("span",{className:"text-emerald-500",children:["+",c]})," ",e.jsxs("span",{className:"text-red-500",children:["-",r]})]}),a.map((n,d)=>e.jsx(x,{node:n},d))]})]})]})}function B({summary:i,files:t,totalLinesAdded:c,totalLinesRemoved:r,insight:s}){const a=m(t);return e.jsxs("section",{className:"border-t border-zinc-800 pt-12 mt-12",children:[e.jsx("div",{className:"text-emerald-400 text-sm font-medium mb-3 uppercase tracking-wider",children:"Result"}),e.jsx("p",{className:"text-xl text-zinc-200 leading-relaxed mb-8",children:i}),e.jsxs("div",{className:"flex gap-8",children:[e.jsxs("div",{className:"w-56 shrink-0",children:[e.jsxs("div",{className:"text-[10px] font-display text-zinc-600 uppercase tracking-wider mb-3 flex items-center justify-between",children:[e.jsx("span",{children:"Changes"}),e.jsxs("span",{children:[e.jsxs("span",{className:"text-emerald-500",children:["+",c]})," ",e.jsxs("span",{className:"text-red-500",children:["-",r]})]})]}),e.jsx("div",{className:"border-l border-zinc-800 pl-3",children:a.map((n,d)=>e.jsx(x,{node:n},d))})]}),e.jsxs("div",{className:"flex-1 border-l border-amber-500/30 pl-6",children:[e.jsxs("div",{className:"text-[10px] font-display font-bold text-amber-400 uppercase tracking-wider mb-3 flex items-center gap-2",children:[e.jsx(b,{size:12}),s.heading]}),e.jsx("p",{className:"text-zinc-300 leading-relaxed",children:s.content})]})]})]})}function P({summary:i,files:t,totalLinesAdded:c,totalLinesRemoved:r,insight:s}){const a=m(t);return e.jsxs("section",{className:"border-t border-zinc-800 pt-12 mt-12 space-y-6",children:[e.jsx("p",{className:"text-zinc-200 leading-relaxed",children:i}),e.jsxs("div",{className:"p-4 rounded-lg bg-amber-500/5 border border-amber-500/20",children:[e.jsxs("div",{className:"text-[11px] font-display font-bold text-amber-400 uppercase tracking-wider mb-2 flex items-center gap-2",children:[e.jsx(b,{size:12}),s.heading]}),e.jsx("p",{className:"text-sm text-zinc-300 leading-relaxed",children:s.content})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"text-[11px] font-display text-zinc-500 uppercase tracking-wider mb-2 flex items-center gap-4",children:[e.jsxs("span",{className:"flex items-center gap-1.5",children:[e.jsx(h,{size:12}),t.length," files"]}),e.jsxs("span",{children:[e.jsxs("span",{className:"text-emerald-500",children:["+",c]})," ",e.jsxs("span",{className:"text-red-500",children:["-",r]})]})]}),a.map((n,d)=>e.jsx(x,{node:n},d))]})]})}const D={hard:{icon:u,colorClass:"text-amber-400",borderClass:"border-amber-500/20",bgClass:"bg-amber-500/5"},learned:{icon:A,colorClass:"text-purple-400",borderClass:"border-purple-500/20",bgClass:"bg-purple-500/5"},surprising:{icon:z,colorClass:"text-cyan-400",borderClass:"border-cyan-500/20",bgClass:"bg-cyan-500/5"},pattern:{icon:F,colorClass:"text-emerald-400",borderClass:"border-emerald-500/20",bgClass:"bg-emerald-500/5"}};function g({summary:i,files:t,totalLinesAdded:c,totalLinesRemoved:r,insight:s,insightType:a="hard"}){const n=m(t),d=D[a],p=d.icon;return e.jsxs("section",{className:"border-t border-zinc-800 pt-12 mt-12",children:[e.jsxs("div",{className:"flex items-center gap-4 mb-6",children:[e.jsx("div",{className:"text-emerald-400 text-sm font-medium uppercase tracking-wider",children:"Result"}),e.jsxs("div",{className:"text-[10px] font-mono text-zinc-600",children:[t.length," files · ",e.jsxs("span",{className:"text-emerald-500",children:["+",c]})," ",e.jsxs("span",{className:"text-red-500",children:["-",r]})]})]}),e.jsx("p",{className:"text-zinc-300 leading-relaxed mb-8",children:i}),e.jsxs("div",{className:"grid grid-cols-5 gap-6",children:[e.jsxs("div",{className:"col-span-2 border border-border/30 rounded-lg p-3 bg-card/20",children:[e.jsxs("div",{className:"text-[11px] uppercase tracking-wider text-muted-foreground/60 mb-2 flex items-center gap-1.5",children:[e.jsx(h,{size:12}),"Changed"]}),n.map((j,o)=>e.jsx(x,{node:j},o))]}),e.jsxs("div",{className:`col-span-3 p-4 rounded-lg ${d.bgClass} border ${d.borderClass}`,children:[e.jsxs("div",{className:`text-[11px] uppercase tracking-wider mb-2 flex items-center gap-1.5 ${d.colorClass}`,children:[e.jsx(p,{size:12}),s.heading]}),e.jsx("p",{className:"text-sm text-zinc-300 leading-relaxed",children:s.content})]})]})]})}function H(){return e.jsx("div",{className:"min-h-dvh bg-zinc-950 text-zinc-100",children:e.jsxs("div",{className:"max-w-4xl mx-auto px-8 py-12",children:[e.jsx("h1",{className:"text-3xl font-bold mb-2",children:"Outcome Section Variations"}),e.jsx("p",{className:"text-zinc-500 mb-12",children:"Following style guide patterns. Files as minimal tree with git info. Insight heading can vary per session."}),e.jsxs("div",{className:"space-y-24",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-xs font-display text-emerald-400 mb-4 uppercase tracking-wider",children:"A: LabeledPanel Style"}),e.jsx("p",{className:"text-xs text-zinc-600 mb-4",children:"Two panels side-by-side using LabeledPanel structure from InsightsPanel"}),e.jsx("div",{className:"p-6 rounded-xl border border-zinc-800 bg-zinc-900/30",children:e.jsx(R,{...l})})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-xs font-display text-emerald-400 mb-4 uppercase tracking-wider",children:"B: Card Container Style"}),e.jsx("p",{className:"text-xs text-zinc-600 mb-4",children:"Cards with headers, following CrossSessionSidebar card pattern"}),e.jsx("div",{className:"p-6 rounded-xl border border-zinc-800 bg-zinc-900/30",children:e.jsx(I,{...l})})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-xs font-display text-emerald-400 mb-4 uppercase tracking-wider",children:"C: Inline Compact"}),e.jsx("p",{className:"text-xs text-zinc-600 mb-4",children:"Blockquote insight, files as side column"}),e.jsx("div",{className:"p-6 rounded-xl border border-zinc-800 bg-zinc-900/30",children:e.jsx(S,{...l})})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-xs font-display text-emerald-400 mb-4 uppercase tracking-wider",children:"D: Insight-First"}),e.jsx("p",{className:"text-xs text-zinc-600 mb-4",children:"The kernel/insight is the hero - pill badge, large text"}),e.jsx("div",{className:"p-6 rounded-xl border border-zinc-800 bg-zinc-900/30",children:e.jsx(V,{...l})})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-xs font-display text-emerald-400 mb-4 uppercase tracking-wider",children:"E: Phase Style"}),e.jsx("p",{className:"text-xs text-zinc-600 mb-4",children:"Matches phase section pattern with circle + indented content"}),e.jsx("div",{className:"p-6 rounded-xl border border-zinc-800 bg-zinc-900/30",children:e.jsx(L,{...l})})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-xs font-display text-emerald-400 mb-4 uppercase tracking-wider",children:"F: Two-Column Editorial"}),e.jsx("p",{className:"text-xs text-zinc-600 mb-4",children:"Narrow files column, wide insight column with border separator"}),e.jsx("div",{className:"p-6 rounded-xl border border-zinc-800 bg-zinc-900/30",children:e.jsx(B,{...l})})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-xs font-display text-emerald-400 mb-4 uppercase tracking-wider",children:"G: Stacked Full-Width"}),e.jsx("p",{className:"text-xs text-zinc-600 mb-4",children:"Three distinct blocks stacked vertically"}),e.jsx("div",{className:"p-6 rounded-xl border border-zinc-800 bg-zinc-900/30",children:e.jsx(P,{...l})})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-xs font-display text-emerald-400 mb-4 uppercase tracking-wider",children:"H: Insight Type Variants"}),e.jsx("p",{className:"text-xs text-zinc-600 mb-4",children:"Shows how insight type affects styling (amber/purple/cyan/emerald)"}),e.jsx("div",{className:"p-6 rounded-xl border border-zinc-800 bg-zinc-900/30",children:e.jsx(g,{...l,insightType:"hard"})}),e.jsx("div",{className:"mt-4 p-6 rounded-xl border border-zinc-800 bg-zinc-900/30",children:e.jsx(g,{...l,insightType:"learned",insight:{heading:"Key Learning",content:l.insight.content}})}),e.jsx("div",{className:"mt-4 p-6 rounded-xl border border-zinc-800 bg-zinc-900/30",children:e.jsx(g,{...l,insightType:"surprising",insight:{heading:"Unexpected Discovery",content:l.insight.content}})})]})]})]})})}export{R as OutcomeVariationA,I as OutcomeVariationB,S as OutcomeVariationC,V as OutcomeVariationD,L as OutcomeVariationE,B as OutcomeVariationF,P as OutcomeVariationG,g as OutcomeVariationH,H as OutcomeVariationsShowcase,H as default};
@@ -0,0 +1 @@
1
+ import{j as e,r as a,c as p,p as m,q as y,X as k,C as h,h as N,s as v}from"./main-B1fyog77.js";const w=[{pattern:"Bash(npm install lodash)",description:"Only this exact operation"},{pattern:"Bash(npm install *)",description:'Any "npm install" command'},{pattern:"Bash(npm *)",description:'Any "npm" command'},{pattern:"Bash",description:"All bash operations"}],A=[{pattern:"Write(src/components/Button.tsx)",description:"Only this exact operation"},{pattern:"Write(src/components/*.tsx)",description:"Any .tsx file in src/components"},{pattern:"Write(src/**/*.tsx)",description:"Any .tsx file under src/"},{pattern:"Write(*.tsx)",description:"Any .tsx file"},{pattern:"Write",description:"All write operations"}];function u({toolName:b,summary:o,patterns:n}){const[t,g]=a.useState(!1),[s,f]=a.useState(!1),[r,i]=a.useState("session");return e.jsxs("div",{className:"border border-amber-500/30 rounded-lg overflow-hidden bg-amber-500/5",children:[e.jsxs("div",{className:"bg-amber-500/10 px-4 py-3 flex items-center gap-4",children:[e.jsxs("button",{onClick:()=>g(!t),className:"flex items-center gap-3 flex-1 min-w-0 text-left",children:[t?e.jsx(p,{size:14,className:"text-amber-400 shrink-0"}):e.jsx(m,{size:14,className:"text-amber-400 shrink-0"}),e.jsx(y,{size:16,className:"text-amber-400 shrink-0"}),e.jsx("span",{className:"font-display text-xs font-bold text-amber-400 uppercase tracking-wider shrink-0",children:b}),e.jsx("span",{className:"text-muted-foreground/40 shrink-0",children:"·"}),e.jsx("span",{className:`text-sm text-foreground/70 font-mono ${t?"":"truncate"}`,children:o})]}),e.jsxs("div",{className:"flex items-center gap-2 shrink-0",children:[e.jsxs("button",{className:"group flex items-center gap-1.5 px-3 py-1.5 rounded-sm bg-background/80 border border-border/30 text-muted-foreground text-xs font-display uppercase tracking-wider hover:border-red-500/30 hover:text-red-400 transition-colors",children:[e.jsx(k,{size:12}),"Deny"]}),e.jsxs("button",{className:"group flex items-center gap-1.5 px-3 py-1.5 rounded-sm bg-background/80 border border-emerald-500/30 text-emerald-400 text-xs font-display uppercase tracking-wider hover:border-emerald-400 hover:bg-emerald-500/5 transition-colors",children:[e.jsx(h,{size:12}),"Allow"]}),e.jsxs("button",{onClick:()=>f(!s),className:`group flex items-center gap-1.5 px-3 py-1.5 rounded-sm bg-background/80 border text-xs font-display uppercase tracking-wider transition-colors ${s?"border-sky-400 text-sky-400 bg-sky-500/5":"border-sky-500/30 text-sky-400 hover:border-sky-400 hover:bg-sky-500/5"}`,children:[s?e.jsx(p,{size:12}):e.jsx(m,{size:12}),"Allow Always"]})]})]}),t&&!s&&e.jsx("div",{className:"border-t border-amber-500/20 px-4 py-3 bg-background/50",children:e.jsx("pre",{className:"font-mono text-sm text-foreground whitespace-pre-wrap break-all bg-neutral-950 rounded p-3",children:o})}),s&&e.jsxs("div",{className:"border-t border-amber-500/20 bg-background/30",children:[e.jsxs("div",{className:"px-4 py-3 border-b border-border/20 flex items-center gap-4",children:[e.jsx("span",{className:"text-xs text-muted-foreground uppercase tracking-wider",children:"Remember for:"}),e.jsxs("div",{className:"flex gap-1 bg-muted/10 rounded p-0.5",children:[e.jsxs("button",{onClick:()=>i("session"),className:`flex items-center gap-1.5 px-3 py-1.5 rounded text-xs font-medium transition-colors ${r==="session"?"bg-sky-500/20 text-sky-400":"text-muted-foreground hover:text-foreground"}`,children:[e.jsx(N,{size:12}),"This Session"]}),e.jsxs("button",{onClick:()=>i("global"),className:`flex items-center gap-1.5 px-3 py-1.5 rounded text-xs font-medium transition-colors ${r==="global"?"bg-violet-500/20 text-violet-400":"text-muted-foreground hover:text-foreground"}`,children:[e.jsx(v,{size:12}),"Always"]})]})]}),e.jsx("div",{className:"py-2",children:n.map(({pattern:l,description:j},d)=>{const c=d===0,x=d===n.length-1&&n.length>1;return e.jsxs("button",{className:"w-full text-left px-4 py-2.5 hover:bg-accent/30 transition-colors flex items-center gap-3 group",children:[e.jsx("div",{className:`w-2 h-2 rounded-full shrink-0 ${c?"bg-emerald-400":x?"bg-amber-400":"bg-muted-foreground/30"}`}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("span",{className:"font-mono text-xs text-foreground/80",children:l}),e.jsx("span",{className:"text-[11px] text-muted-foreground block mt-0.5",children:j})]}),c&&e.jsx("span",{className:"text-[9px] uppercase tracking-wider text-emerald-400/70 bg-emerald-500/10 px-1.5 py-0.5 rounded shrink-0",children:"safest"}),x&&e.jsx("span",{className:"text-[9px] uppercase tracking-wider text-amber-400/70 bg-amber-500/10 px-1.5 py-0.5 rounded shrink-0",children:"broad"}),e.jsx(h,{size:14,className:`shrink-0 opacity-0 group-hover:opacity-100 transition-opacity ${r==="session"?"text-sky-400":"text-violet-400"}`})]},l)})}),e.jsx("div",{className:"px-4 py-2 border-t border-border/20 text-[10px] text-muted-foreground",children:r==="session"?e.jsx("span",{children:"Pattern will be allowed for this session only"}):e.jsx("span",{children:"Pattern will be saved and allowed in all future sessions"})})]})]})}function z(){return e.jsx("div",{className:"min-h-dvh bg-background p-8",children:e.jsxs("div",{className:"max-w-4xl mx-auto space-y-8",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold text-foreground mb-2",children:"Permission Pattern Picker"}),e.jsx("p",{className:"text-muted-foreground",children:'Final design - click "Allow Always" to expand'})]}),e.jsxs("section",{className:"space-y-4",children:[e.jsx("h2",{className:"text-lg font-semibold text-foreground",children:"Bash Command Example"}),e.jsx(u,{toolName:"Bash",summary:"npm install lodash",patterns:w})]}),e.jsxs("section",{className:"space-y-4",children:[e.jsx("h2",{className:"text-lg font-semibold text-foreground",children:"File Write Example"}),e.jsx(u,{toolName:"Write",summary:"src/components/Button.tsx",patterns:A})]})]})})}export{z as PermissionPatternPickerPrototype,z as default};
@@ -0,0 +1 @@
1
+ import{r as x,j as e,t as m,R as S,u as C,X as b,C as c,S as N,F as P,v as f,w as z,q as v,c as y,p as k,x as w}from"./main-B1fyog77.js";const l=[{id:"perm-bash-1",streamingId:"mock-stream",toolName:"Bash",toolInput:{command:"npm run build",description:"Build the project"},timestamp:new Date().toISOString(),status:"pending"},{id:"perm-edit-1",streamingId:"mock-stream",toolName:"Edit",toolInput:{file_path:"/home/jason/cui-custom/src/server.ts",old_string:"const PORT = 3000;",new_string:"const PORT = process.env.PORT || 3000;"},timestamp:new Date().toISOString(),status:"pending"},{id:"perm-read-1",streamingId:"mock-stream",toolName:"Read",toolInput:{file_path:"/home/jason/cui-custom/package.json"},timestamp:new Date().toISOString(),status:"pending"},{id:"perm-grep-1",streamingId:"mock-stream",toolName:"Grep",toolInput:{pattern:"permission",path:"/home/jason/cui-custom/src"},timestamp:new Date().toISOString(),status:"pending"}],j={Bash:z,Edit:f,Write:f,Read:P,Grep:N,Glob:N};function u(t,a){switch(t){case"Bash":return a.command||"";case"Read":case"Write":case"Edit":return a.file_path||"";case"Grep":return`"${a.pattern}" in ${a.path}`;default:return""}}function D({permission:t,onApprove:a,onDeny:n}){const[s,r]=x.useState(!0),o=j[t.toolName]||m,d=u(t.toolName,t.toolInput);return e.jsxs("div",{className:"border border-amber-500/30 rounded-lg p-4 bg-amber-500/5",children:[e.jsxs("div",{className:"text-xs uppercase tracking-wider text-amber-400/70 mb-2 flex items-center gap-2",children:[e.jsx(v,{size:12}),"Permission Request"]}),e.jsxs("div",{className:"flex items-start gap-3 mb-3",children:[e.jsx("div",{className:"p-2 rounded bg-card/30 border border-border/20",children:e.jsx(o,{size:16,className:"text-muted-foreground"})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("div",{className:"text-sm font-medium text-foreground/80",children:t.toolName}),e.jsx("div",{className:"text-xs text-muted-foreground/60 font-mono truncate",children:d})]})]}),e.jsxs("button",{onClick:()=>r(!s),className:"text-xs text-muted-foreground/50 hover:text-muted-foreground/70 flex items-center gap-1 mb-3",children:[s?e.jsx(y,{size:12}):e.jsx(k,{size:12}),s?"Hide details":"Show details"]}),s&&e.jsx("div",{className:"mb-4 p-3 rounded bg-card/20 border border-border/20",children:e.jsx(w,{toolName:t.toolName,toolInput:t.toolInput})}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("button",{onClick:a,className:"flex items-center gap-1.5 px-3 py-1.5 rounded text-xs bg-emerald-500/20 text-emerald-400 hover:bg-emerald-500/30 transition-colors",children:[e.jsx(c,{size:12}),"Allow"]}),e.jsx("button",{onClick:n,className:"px-3 py-1.5 rounded text-xs text-muted-foreground hover:text-red-400 hover:bg-red-500/10 transition-colors",children:"Deny"})]})]})}function A({permission:t,onApprove:a,onDeny:n}){const s=j[t.toolName]||m,r=u(t.toolName,t.toolInput);return e.jsxs("div",{className:"border border-border/30 rounded-lg p-4 bg-card/20",children:[e.jsxs("p",{className:"text-xs text-muted-foreground/60 leading-relaxed mb-2 italic",children:['"Claude wants to execute a ',t.toolName.toLowerCase(),' operation"']}),e.jsxs("div",{className:"flex items-center gap-2 mb-3",children:[e.jsx(s,{size:14,className:"text-muted-foreground/70 shrink-0"}),e.jsx("code",{className:"text-sm text-foreground/80 font-mono truncate",children:r})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("button",{onClick:a,className:"flex items-center gap-1.5 px-3 py-1.5 rounded text-xs bg-emerald-500/20 text-emerald-400 hover:bg-emerald-500/30 transition-colors",children:[e.jsx(c,{size:12}),"Allow"]}),e.jsx("button",{onClick:n,className:"px-3 py-1.5 rounded text-xs text-muted-foreground hover:text-red-400 hover:bg-red-500/10 transition-colors",children:"Deny"})]})]})}function R({permission:t,onApprove:a,onDeny:n}){const[s,r]=x.useState(!1),o=u(t.toolName,t.toolInput);return e.jsxs("div",{className:"border border-amber-500/30 rounded-lg overflow-hidden bg-amber-500/5",children:[e.jsxs("div",{className:"bg-amber-500/10 px-4 py-3 flex items-center gap-4",children:[e.jsxs("button",{onClick:()=>r(!s),className:"flex items-center gap-3 flex-1 min-w-0 text-left",children:[s?e.jsx(y,{size:14,className:"text-amber-400 shrink-0"}):e.jsx(k,{size:14,className:"text-amber-400 shrink-0"}),e.jsx(v,{size:16,className:"text-amber-400 shrink-0"}),e.jsx("span",{className:"font-display text-xs font-bold text-amber-400 uppercase tracking-wider shrink-0",children:t.toolName}),e.jsx("span",{className:"text-muted-foreground/40 shrink-0",children:"·"}),e.jsx("span",{className:`text-sm text-foreground/70 font-mono ${s?"":"truncate"}`,children:o})]}),e.jsxs("div",{className:"flex items-center gap-2 shrink-0",children:[e.jsxs("button",{onClick:d=>{d.stopPropagation(),n()},className:"group flex items-center gap-1.5 px-3 py-1.5 rounded-sm bg-background/80 border border-border/30 text-muted-foreground text-xs font-display uppercase tracking-wider hover:border-red-500/30 hover:text-red-400 transition-colors",children:[e.jsx(b,{size:12}),"Deny"]}),e.jsxs("button",{onClick:d=>{d.stopPropagation(),a()},className:"group flex items-center gap-1.5 px-3 py-1.5 rounded-sm bg-background/80 border border-emerald-500/30 text-emerald-400 text-xs font-display uppercase tracking-wider hover:border-emerald-400 hover:bg-emerald-500/5 transition-colors",children:[e.jsx(c,{size:12}),"Allow"]})]})]}),s&&e.jsx("div",{className:"border-t border-amber-500/20 px-4 py-3 bg-background/50",children:e.jsx(w,{toolName:t.toolName,toolInput:t.toolInput})})]})}function O({permissions:t,onApprove:a,onDeny:n,onApproveAll:s}){return t.length===0?null:e.jsxs("div",{className:"border border-border/30 rounded-lg bg-card/20 overflow-hidden",children:[e.jsxs("div",{className:"px-4 py-3 border-b border-border/20 flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"text-xs uppercase tracking-wider text-muted-foreground/50",children:"Pending Permissions"}),e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded bg-amber-500/20 text-amber-400 tabular-nums",children:t.length})]}),e.jsx("button",{onClick:s,className:"text-xs text-emerald-400/70 hover:text-emerald-400 transition-colors",children:"Allow all"})]}),e.jsx("div",{className:"divide-y divide-border/10",children:t.map(r=>{const o=j[r.toolName]||m,d=u(r.toolName,r.toolInput);return e.jsxs("div",{className:"px-4 py-3 flex items-center gap-3 hover:bg-card/30 transition-colors",children:[e.jsx(o,{size:14,className:"text-muted-foreground/50 shrink-0"}),e.jsx("div",{className:"flex-1 min-w-0",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-xs font-medium text-foreground/70",children:r.toolName}),e.jsx("span",{className:"text-xs text-muted-foreground/40 font-mono truncate",children:d})]})}),e.jsxs("div",{className:"flex items-center gap-1 shrink-0",children:[e.jsx("button",{onClick:()=>n(r.id),className:"p-1.5 rounded text-muted-foreground/50 hover:text-red-400 hover:bg-red-500/10 transition-colors",title:"Deny",children:e.jsx(b,{size:12})}),e.jsx("button",{onClick:()=>a(r.id),className:"p-1.5 rounded text-emerald-400/70 hover:text-emerald-400 hover:bg-emerald-500/10 transition-colors",title:"Allow",children:e.jsx(c,{size:12})})]})]},r.id)})})]})}function E(){const[t,a]=x.useState(l[0]),[n,s]=x.useState(l),r=i=>{const p=i||t.id;s(g=>g.filter(h=>h.id!==p))},o=i=>{const p=i||t.id;s(g=>g.filter(h=>h.id!==p))},d=()=>{s([])},I=()=>{a(l[0]),s(l)};return e.jsxs("div",{className:"min-h-dvh bg-background",children:[e.jsxs("header",{className:"sticky top-0 z-20 flex items-center justify-between px-4 py-3 h-[60px] bg-background border-b border-border/50 relative overflow-hidden",children:[e.jsx("div",{className:"absolute inset-0 bg-[linear-gradient(rgba(0,255,255,0.03)_1px,transparent_1px),linear-gradient(90deg,rgba(0,255,255,0.03)_1px,transparent_1px)] bg-[size:20px_20px] pointer-events-none"}),e.jsxs("div",{className:"relative flex items-center gap-2",children:[e.jsx(m,{size:18,className:"text-amber-400"}),e.jsx("span",{className:"font-mono text-sm font-bold text-amber-400 tracking-wider",children:"PERMISSIONS"}),e.jsx("span",{className:"font-display text-[10px] text-muted-foreground/50 uppercase tracking-widest",children:"[PROTOTYPE]"})]}),e.jsxs("button",{onClick:I,className:"relative flex items-center gap-2 px-3 py-1.5 rounded-sm bg-background/80 border border-border/30 text-muted-foreground text-xs font-display uppercase tracking-wider hover:border-cyan-500/30 hover:text-cyan-400 transition-colors",children:[e.jsx(S,{size:12}),"Reset"]})]}),e.jsxs("div",{className:"p-6 max-w-5xl mx-auto space-y-8",children:[e.jsx("div",{className:"flex flex-wrap gap-2",children:l.map(i=>e.jsx("button",{onClick:()=>a(i),className:`px-3 py-1.5 text-xs font-display uppercase tracking-wider rounded-sm border transition-colors ${t.id===i.id?"border-cyan-500/50 text-cyan-400 bg-cyan-500/10":"border-border/30 text-muted-foreground hover:border-border/50 hover:text-foreground/80"}`,children:i.toolName},i.id))}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-8",children:[e.jsxs("div",{className:"space-y-3",children:[e.jsx("div",{className:"text-xs uppercase tracking-wider text-muted-foreground/50",children:"A: Labeled Panel Style"}),e.jsx(D,{permission:t,onApprove:()=>r(),onDeny:()=>o()})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("div",{className:"text-xs uppercase tracking-wider text-muted-foreground/50",children:"B: Recommendation Card Style"}),e.jsx(A,{permission:t,onApprove:()=>r(),onDeny:()=>o()})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("div",{className:"text-xs uppercase tracking-wider text-muted-foreground/50",children:"C: Header Banner Style"}),e.jsx(R,{permission:t,onApprove:()=>r(),onDeny:()=>o()})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("div",{className:"text-xs uppercase tracking-wider text-muted-foreground/50",children:"D: Batched Queue Style"}),e.jsx(O,{permissions:n,onApprove:r,onDeny:o,onApproveAll:d})]})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("div",{className:"text-xs uppercase tracking-wider text-muted-foreground/50",children:"Current: Built-in PermissionDialog"}),e.jsx("div",{className:"relative border border-border/30 rounded-lg bg-card/20 p-4 min-h-[280px]",children:e.jsxs("div",{className:"absolute bottom-4 left-4 right-4",children:[e.jsx(C,{permissionRequest:t,isVisible:!0}),e.jsxs("div",{className:"mt-3 flex gap-2 justify-end",children:[e.jsxs("button",{className:"flex items-center gap-1.5 px-3 py-1.5 rounded text-xs text-muted-foreground hover:text-red-400 hover:bg-red-500/10 transition-colors",children:[e.jsx(b,{size:12}),"Deny"]}),e.jsxs("button",{className:"flex items-center gap-1.5 px-3 py-1.5 rounded text-xs bg-emerald-500/20 text-emerald-400 hover:bg-emerald-500/30 transition-colors",children:[e.jsx(c,{size:12}),"Allow"]})]})]})})]})]})]})}export{E as PermissionPrototype,E as default};