spiracha 1.5.0 → 2.0.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 (365) hide show
  1. package/AGENTS.md +114 -205
  2. package/README.md +89 -269
  3. package/apps/ui/AGENTS.md +17 -7
  4. package/apps/ui/README.md +34 -8
  5. package/apps/ui/components.json +21 -0
  6. package/apps/ui/package.json +65 -0
  7. package/apps/ui/src/components/antigravity-conversations-table.tsx +206 -0
  8. package/apps/ui/src/components/antigravity-keychain-panel.tsx +76 -0
  9. package/apps/ui/src/components/antigravity-workspaces-table.tsx +63 -0
  10. package/apps/ui/src/components/app-shell.tsx +124 -0
  11. package/apps/ui/src/components/breadcrumbs.tsx +53 -0
  12. package/apps/ui/src/components/claude-code-sessions-table.tsx +114 -0
  13. package/apps/ui/src/components/claude-code-workspaces-table.tsx +55 -0
  14. package/apps/ui/src/components/cursor-threads-table.tsx +189 -0
  15. package/apps/ui/src/components/cursor-workspaces-table.tsx +140 -0
  16. package/apps/ui/src/components/data-table.tsx +241 -0
  17. package/apps/ui/src/components/delete-confirm-dialog.tsx +88 -0
  18. package/apps/ui/src/components/export-dialog.tsx +184 -0
  19. package/apps/ui/src/components/json-panel.tsx +17 -0
  20. package/apps/ui/src/components/kiro-sessions-table.tsx +112 -0
  21. package/apps/ui/src/components/kiro-workspaces-table.tsx +53 -0
  22. package/apps/ui/src/components/list-search-input.tsx +18 -0
  23. package/apps/ui/src/components/loading-panel.tsx +23 -0
  24. package/apps/ui/src/components/metadata-section.tsx +31 -0
  25. package/apps/ui/src/components/metric-card.tsx +19 -0
  26. package/apps/ui/src/components/opencode-sessions-table.tsx +128 -0
  27. package/apps/ui/src/components/opencode-workspaces-table.tsx +57 -0
  28. package/apps/ui/src/components/page-header.tsx +33 -0
  29. package/apps/ui/src/components/projects-loading-state.tsx +74 -0
  30. package/apps/ui/src/components/projects-table.tsx +108 -0
  31. package/apps/ui/src/components/qoder-sessions-table.tsx +112 -0
  32. package/apps/ui/src/components/qoder-workspaces-table.tsx +53 -0
  33. package/apps/ui/src/components/recent-threads-list.tsx +52 -0
  34. package/apps/ui/src/components/reload-error-panel.tsx +20 -0
  35. package/apps/ui/src/components/text-document-panel.tsx +19 -0
  36. package/apps/ui/src/components/theme-toggle.tsx +48 -0
  37. package/apps/ui/src/components/threads-table.tsx +202 -0
  38. package/apps/ui/src/components/transcript-view.tsx +552 -0
  39. package/apps/ui/src/components/ui/alert-dialog.tsx +160 -0
  40. package/apps/ui/src/components/ui/badge.tsx +45 -0
  41. package/apps/ui/src/components/ui/button.tsx +62 -0
  42. package/apps/ui/src/components/ui/checkbox.tsx +29 -0
  43. package/apps/ui/src/components/ui/dialog.tsx +137 -0
  44. package/apps/ui/src/components/ui/dropdown-menu.tsx +217 -0
  45. package/apps/ui/src/components/ui/input.tsx +21 -0
  46. package/apps/ui/src/components/ui/scroll-area.tsx +46 -0
  47. package/apps/ui/src/components/ui/select.tsx +163 -0
  48. package/apps/ui/src/components/ui/separator.tsx +28 -0
  49. package/apps/ui/src/components/ui/sheet.tsx +107 -0
  50. package/apps/ui/src/components/ui/skeleton.tsx +7 -0
  51. package/apps/ui/src/components/ui/table.tsx +76 -0
  52. package/apps/ui/src/components/ui/tabs.tsx +71 -0
  53. package/apps/ui/src/components/ui/tooltip.tsx +44 -0
  54. package/apps/ui/src/integrations/tanstack-query/devtools.tsx +6 -0
  55. package/apps/ui/src/integrations/tanstack-query/root-provider.tsx +10 -0
  56. package/apps/ui/src/lib/antigravity-conversation-state.ts +28 -0
  57. package/apps/ui/src/lib/antigravity-queries.ts +33 -0
  58. package/apps/ui/src/lib/antigravity-server.ts +128 -0
  59. package/apps/ui/src/lib/antigravity-transcript-events.ts +335 -0
  60. package/apps/ui/src/lib/claude-code-queries.ts +26 -0
  61. package/apps/ui/src/lib/claude-code-server.ts +75 -0
  62. package/apps/ui/src/lib/claude-code-transcript-events.ts +154 -0
  63. package/apps/ui/src/lib/codex-queries.ts +66 -0
  64. package/apps/ui/src/lib/codex-server.ts +209 -0
  65. package/apps/ui/src/lib/cursor-queries.ts +37 -0
  66. package/apps/ui/src/lib/cursor-server.ts +272 -0
  67. package/apps/ui/src/lib/cursor-transcript-events.ts +229 -0
  68. package/apps/ui/src/lib/download.ts +166 -0
  69. package/apps/ui/src/lib/formatters.ts +149 -0
  70. package/apps/ui/src/lib/kiro-queries.ts +22 -0
  71. package/apps/ui/src/lib/kiro-server.ts +73 -0
  72. package/apps/ui/src/lib/kiro-transcript-events.ts +113 -0
  73. package/apps/ui/src/lib/opencode-queries.ts +37 -0
  74. package/apps/ui/src/lib/opencode-server.ts +73 -0
  75. package/apps/ui/src/lib/opencode-transcript-events.ts +221 -0
  76. package/apps/ui/src/lib/package-metadata.ts +16 -0
  77. package/apps/ui/src/lib/path-utils.ts +13 -0
  78. package/apps/ui/src/lib/qoder-queries.ts +22 -0
  79. package/apps/ui/src/lib/qoder-server.ts +79 -0
  80. package/apps/ui/src/lib/qoder-transcript-events.ts +139 -0
  81. package/apps/ui/src/lib/route-search.ts +68 -0
  82. package/apps/ui/src/lib/settings-store.tsx +59 -0
  83. package/apps/ui/src/lib/source-session-export-server.ts +56 -0
  84. package/apps/ui/src/lib/text-filter.ts +22 -0
  85. package/apps/ui/src/lib/thread-id.ts +3 -0
  86. package/apps/ui/src/lib/thread-transcript-stats.ts +57 -0
  87. package/apps/ui/src/lib/utils.ts +7 -0
  88. package/apps/ui/src/routeTree.gen.ts +730 -0
  89. package/apps/ui/src/router.tsx +20 -0
  90. package/apps/ui/src/routes/$threadId.tsx +22 -0
  91. package/apps/ui/src/routes/__root.tsx +127 -0
  92. package/apps/ui/src/routes/analytics.tsx +143 -0
  93. package/apps/ui/src/routes/antigravity-conversations.$conversationId.tsx +438 -0
  94. package/apps/ui/src/routes/antigravity.$workspaceKey.tsx +127 -0
  95. package/apps/ui/src/routes/antigravity.index.tsx +51 -0
  96. package/apps/ui/src/routes/api.v1.conversation-query.ts +12 -0
  97. package/apps/ui/src/routes/api.v1.conversations.$source.$id.export.ts +12 -0
  98. package/apps/ui/src/routes/api.v1.conversations.$source.$id.ts +12 -0
  99. package/apps/ui/src/routes/api.v1.conversations.ts +12 -0
  100. package/apps/ui/src/routes/api.v1.resolve.ts +12 -0
  101. package/apps/ui/src/routes/api.v1.sources.ts +12 -0
  102. package/apps/ui/src/routes/claude-code-sessions.$sessionId.tsx +342 -0
  103. package/apps/ui/src/routes/claude-code.$workspaceKey.tsx +135 -0
  104. package/apps/ui/src/routes/claude-code.index.tsx +48 -0
  105. package/apps/ui/src/routes/codex.$project.tsx +390 -0
  106. package/apps/ui/src/routes/codex.index.tsx +116 -0
  107. package/apps/ui/src/routes/cursor-threads.$composerId.tsx +435 -0
  108. package/apps/ui/src/routes/cursor.$workspaceKey.tsx +416 -0
  109. package/apps/ui/src/routes/cursor.index.tsx +120 -0
  110. package/apps/ui/src/routes/index.tsx +124 -0
  111. package/apps/ui/src/routes/kiro-sessions.$sessionId.tsx +345 -0
  112. package/apps/ui/src/routes/kiro.$workspaceKey.tsx +136 -0
  113. package/apps/ui/src/routes/kiro.index.tsx +48 -0
  114. package/apps/ui/src/routes/opencode-sessions.$sessionId.tsx +334 -0
  115. package/apps/ui/src/routes/opencode.$workspaceKey.tsx +135 -0
  116. package/apps/ui/src/routes/opencode.index.tsx +48 -0
  117. package/apps/ui/src/routes/qoder-sessions.$sessionId.tsx +341 -0
  118. package/apps/ui/src/routes/qoder.$workspaceKey.tsx +139 -0
  119. package/apps/ui/src/routes/qoder.index.tsx +48 -0
  120. package/apps/ui/src/routes/settings.tsx +91 -0
  121. package/apps/ui/src/routes/threads.$threadId.tsx +619 -0
  122. package/apps/ui/src/styles.css +122 -0
  123. package/apps/ui/tsconfig.json +29 -0
  124. package/apps/ui/vite.config.ts +84 -0
  125. package/bin/spiracha.ts +32 -0
  126. package/package.json +46 -73
  127. package/src/client.ts +290 -0
  128. package/src/lib/antigravity-db.ts +213 -19
  129. package/src/lib/antigravity-exporter-types.ts +1 -0
  130. package/src/lib/codex-analytics.ts +1 -1
  131. package/src/lib/codex-browser-db.ts +410 -74
  132. package/src/lib/codex-browser-export.ts +6 -14
  133. package/src/lib/codex-browser-types.ts +1 -1
  134. package/src/lib/{codex-exporter-types.ts → codex-thread-types.ts} +2 -30
  135. package/src/lib/{codex-exporter-transcript.ts → codex-transcript-renderer.ts} +64 -28
  136. package/src/lib/conversation-api.ts +792 -0
  137. package/src/lib/conversation-data/adapter-helpers.ts +110 -0
  138. package/src/lib/conversation-data/antigravity-adapter.ts +148 -0
  139. package/src/lib/conversation-data/claude-code-adapter.ts +175 -0
  140. package/src/lib/conversation-data/codex-adapter.ts +245 -0
  141. package/src/lib/conversation-data/cursor-adapter.ts +171 -0
  142. package/src/lib/conversation-data/index.ts +311 -0
  143. package/src/lib/conversation-data/kiro-adapter.ts +140 -0
  144. package/src/lib/conversation-data/message-selector.ts +37 -0
  145. package/src/lib/conversation-data/opencode-adapter.ts +180 -0
  146. package/src/lib/conversation-data/path-match.ts +79 -0
  147. package/src/lib/conversation-data/qoder-adapter.ts +230 -0
  148. package/src/lib/conversation-data/types.ts +116 -0
  149. package/src/lib/cursor-db.ts +67 -21
  150. package/src/lib/cursor-exporter-types.ts +0 -19
  151. package/src/lib/qoder-acp-client.ts +268 -0
  152. package/src/lib/qoder-db.ts +1601 -0
  153. package/src/lib/qoder-exporter-types.ts +114 -0
  154. package/src/lib/qoder-transcript-phase.ts +41 -0
  155. package/src/lib/qoder-transcript.ts +112 -0
  156. package/apps/ui/dist/client/assets/_threadId-CAIeH5mq.js +0 -1
  157. package/apps/ui/dist/client/assets/analytics-DOy1b6Sh.js +0 -1
  158. package/apps/ui/dist/client/assets/antigravity-conversations._conversationId-DqySVO2K.js +0 -7
  159. package/apps/ui/dist/client/assets/antigravity-conversations._conversationId-KAcXtNxI.js +0 -1
  160. package/apps/ui/dist/client/assets/antigravity-keychain-panel-B77qJz6f.js +0 -1
  161. package/apps/ui/dist/client/assets/antigravity._workspaceKey-B3NM6gRH.js +0 -1
  162. package/apps/ui/dist/client/assets/antigravity._workspaceKey-ByitGWki.js +0 -1
  163. package/apps/ui/dist/client/assets/antigravity.index-DP9JC2P9.js +0 -1
  164. package/apps/ui/dist/client/assets/antigravity.index-DgW25FEV.js +0 -1
  165. package/apps/ui/dist/client/assets/badge-C3i4OKs8.js +0 -1
  166. package/apps/ui/dist/client/assets/checkbox-CdHitXWQ.js +0 -1
  167. package/apps/ui/dist/client/assets/claude-code-sessions._sessionId-8pQ55ci2.js +0 -1
  168. package/apps/ui/dist/client/assets/claude-code-sessions._sessionId-DVz5UmtU.js +0 -1
  169. package/apps/ui/dist/client/assets/claude-code._workspaceKey-BBKskSum.js +0 -1
  170. package/apps/ui/dist/client/assets/claude-code._workspaceKey-OkikMUFs.js +0 -1
  171. package/apps/ui/dist/client/assets/claude-code.index-Cwu76dbb.js +0 -1
  172. package/apps/ui/dist/client/assets/claude-code.index-D6eMd08t.js +0 -1
  173. package/apps/ui/dist/client/assets/createServerFn-B-KkwmHU.js +0 -3
  174. package/apps/ui/dist/client/assets/cursor-threads._composerId-CmBFclK8.js +0 -1
  175. package/apps/ui/dist/client/assets/cursor-threads._composerId-hBWlP1D-.js +0 -1
  176. package/apps/ui/dist/client/assets/cursor._workspaceKey-BFPkIRi-.js +0 -1
  177. package/apps/ui/dist/client/assets/cursor._workspaceKey-CaAZjGmm.js +0 -1
  178. package/apps/ui/dist/client/assets/cursor.index-8y4o20kb.js +0 -2
  179. package/apps/ui/dist/client/assets/cursor.index-CrnMwDCi.js +0 -1
  180. package/apps/ui/dist/client/assets/data-table-Br78_dk3.js +0 -4
  181. package/apps/ui/dist/client/assets/delete-confirm-dialog-Bxs07u-j.js +0 -7
  182. package/apps/ui/dist/client/assets/dist-B9pyYCVU.js +0 -1
  183. package/apps/ui/dist/client/assets/dist-BrJhN2A0.js +0 -5
  184. package/apps/ui/dist/client/assets/dist-Cmd3AIfD.js +0 -1
  185. package/apps/ui/dist/client/assets/dist-DvMS2965.js +0 -1
  186. package/apps/ui/dist/client/assets/download-Bf0QJKD3.js +0 -1
  187. package/apps/ui/dist/client/assets/dropdown-menu-D5cvPaZt.js +0 -1
  188. package/apps/ui/dist/client/assets/es2015-ad6040dw.js +0 -41
  189. package/apps/ui/dist/client/assets/export-dialog-Dr8d2MqD.js +0 -1
  190. package/apps/ui/dist/client/assets/formatters-BtqyrX_c.js +0 -1
  191. package/apps/ui/dist/client/assets/index-C-STgIH4.js +0 -166
  192. package/apps/ui/dist/client/assets/jsx-runtime-DGeXAQPT.js +0 -1
  193. package/apps/ui/dist/client/assets/kiro-sessions._sessionId-CKgfJ7GR.js +0 -1
  194. package/apps/ui/dist/client/assets/kiro-sessions._sessionId-zvIJHtQF.js +0 -1
  195. package/apps/ui/dist/client/assets/kiro._workspaceKey-DhVuJuZB.js +0 -1
  196. package/apps/ui/dist/client/assets/kiro._workspaceKey-QArsjkTY.js +0 -1
  197. package/apps/ui/dist/client/assets/kiro.index-C-fr4m7i.js +0 -1
  198. package/apps/ui/dist/client/assets/kiro.index-OYgAdtZd.js +0 -1
  199. package/apps/ui/dist/client/assets/metric-card-Dplm0ZiM.js +0 -1
  200. package/apps/ui/dist/client/assets/opencode-sessions._sessionId-DLjiTst-.js +0 -1
  201. package/apps/ui/dist/client/assets/opencode-sessions._sessionId-biBwrRbt.js +0 -8
  202. package/apps/ui/dist/client/assets/opencode._workspaceKey-C7OIzMOJ.js +0 -1
  203. package/apps/ui/dist/client/assets/opencode._workspaceKey-sBakX0oI.js +0 -1
  204. package/apps/ui/dist/client/assets/opencode.index-Bl_kNs9N.js +0 -1
  205. package/apps/ui/dist/client/assets/opencode.index-CN53bVmb.js +0 -1
  206. package/apps/ui/dist/client/assets/page-header-Cwa3p6Tl.js +0 -1
  207. package/apps/ui/dist/client/assets/preload-helper-B8fFrdxC.js +0 -1
  208. package/apps/ui/dist/client/assets/projects._project-D8WloxQN.js +0 -1
  209. package/apps/ui/dist/client/assets/projects._project-DSDwH4NF.js +0 -1
  210. package/apps/ui/dist/client/assets/projects.index-5xRtuJdX.js +0 -3
  211. package/apps/ui/dist/client/assets/projects.index-DEfhWqa8.js +0 -1
  212. package/apps/ui/dist/client/assets/react-dom-DL96Jor4.js +0 -1
  213. package/apps/ui/dist/client/assets/refresh-ccw-BgKjOiA6.js +0 -1
  214. package/apps/ui/dist/client/assets/reload-error-panel-AHqu0akK.js +0 -1
  215. package/apps/ui/dist/client/assets/routes-DnzF_9CX.js +0 -1
  216. package/apps/ui/dist/client/assets/scroll-text-fM0sMOB3.js +0 -1
  217. package/apps/ui/dist/client/assets/select-CYF6pF37.js +0 -1
  218. package/apps/ui/dist/client/assets/settings-Dx70jgP_.js +0 -1
  219. package/apps/ui/dist/client/assets/sqlite-error-B6uZjUe8.js +0 -1
  220. package/apps/ui/dist/client/assets/styles-B7Zi9EFA.css +0 -1
  221. package/apps/ui/dist/client/assets/tabs-CmuhkT-c.js +0 -7
  222. package/apps/ui/dist/client/assets/text-filter-DVAZySUS.js +0 -2
  223. package/apps/ui/dist/client/assets/thread-transcript-stats-BUNz6u7F.js +0 -1
  224. package/apps/ui/dist/client/assets/threads._threadId-BB9tTsV4.js +0 -1
  225. package/apps/ui/dist/client/assets/threads._threadId-BMRSFow3.js +0 -1
  226. package/apps/ui/dist/client/assets/useMutation-BSFult2i.js +0 -1
  227. package/apps/ui/dist/client/assets/useQuery-CjINKZf1.js +0 -1
  228. package/apps/ui/dist/server/assets/_tanstack-start-manifest_v-CQ8Jjs3B.js +0 -387
  229. package/apps/ui/dist/server/assets/_threadId-B6SrBR9E.js +0 -6
  230. package/apps/ui/dist/server/assets/analytics-CYP_LT5Y.js +0 -16
  231. package/apps/ui/dist/server/assets/analytics-CtpOMVMO.js +0 -146
  232. package/apps/ui/dist/server/assets/antigravity-conversation-state-HgzS302O.js +0 -16
  233. package/apps/ui/dist/server/assets/antigravity-conversations._conversationId-BKOyL2T6.js +0 -613
  234. package/apps/ui/dist/server/assets/antigravity-conversations._conversationId-D426O-64.js +0 -11
  235. package/apps/ui/dist/server/assets/antigravity-conversations._conversationId-eS87Dx7g.js +0 -20
  236. package/apps/ui/dist/server/assets/antigravity-db-Bh8_U9uw.js +0 -580
  237. package/apps/ui/dist/server/assets/antigravity-keychain-DOiuHDwK.js +0 -126
  238. package/apps/ui/dist/server/assets/antigravity-keychain-panel-CC7FLmAK.js +0 -55
  239. package/apps/ui/dist/server/assets/antigravity-queries-CGrJO9Vr.js +0 -37
  240. package/apps/ui/dist/server/assets/antigravity-server-CHRjVFqN.js +0 -114
  241. package/apps/ui/dist/server/assets/antigravity._workspaceKey-3m_MzNFA.js +0 -11
  242. package/apps/ui/dist/server/assets/antigravity._workspaceKey-B0QeYUOh.js +0 -28
  243. package/apps/ui/dist/server/assets/antigravity._workspaceKey-C3kP-qyN.js +0 -210
  244. package/apps/ui/dist/server/assets/antigravity.index-CPCYkqCi.js +0 -104
  245. package/apps/ui/dist/server/assets/antigravity.index-DudTB3Tq.js +0 -11
  246. package/apps/ui/dist/server/assets/badge-EvdhKK_Z.js +0 -26
  247. package/apps/ui/dist/server/assets/button-CmTDnzOn.js +0 -46
  248. package/apps/ui/dist/server/assets/checkbox-C0hovF41.js +0 -19
  249. package/apps/ui/dist/server/assets/claude-code-db-Ik3VStKZ.js +0 -361
  250. package/apps/ui/dist/server/assets/claude-code-queries-Cgzi4K-e.js +0 -37
  251. package/apps/ui/dist/server/assets/claude-code-server-PfraClXS.js +0 -72
  252. package/apps/ui/dist/server/assets/claude-code-sessions._sessionId-C55oe6zj.js +0 -18
  253. package/apps/ui/dist/server/assets/claude-code-sessions._sessionId-D1RYYi3j.js +0 -473
  254. package/apps/ui/dist/server/assets/claude-code-sessions._sessionId-DSvPLEUL.js +0 -11
  255. package/apps/ui/dist/server/assets/claude-code-transcript-C-bxh3cS.js +0 -139
  256. package/apps/ui/dist/server/assets/claude-code-transcript-phase-DmUMc8VU.js +0 -10
  257. package/apps/ui/dist/server/assets/claude-code._workspaceKey-B5Xg_-tE.js +0 -28
  258. package/apps/ui/dist/server/assets/claude-code._workspaceKey-BPlzyXPa.js +0 -11
  259. package/apps/ui/dist/server/assets/claude-code._workspaceKey-DqDve2wl.js +0 -191
  260. package/apps/ui/dist/server/assets/claude-code.index-B7yYR7dD.js +0 -92
  261. package/apps/ui/dist/server/assets/claude-code.index-BUHThG1W.js +0 -11
  262. package/apps/ui/dist/server/assets/codex-queries-CtgeZ7VL.js +0 -99
  263. package/apps/ui/dist/server/assets/codex-server-CGXU4H8-.js +0 -2294
  264. package/apps/ui/dist/server/assets/concurrency-VXtYvlGh.js +0 -18
  265. package/apps/ui/dist/server/assets/createServerRpc-CF_DEwnm.js +0 -12
  266. package/apps/ui/dist/server/assets/createSsrRpc-C754NPki.js +0 -16
  267. package/apps/ui/dist/server/assets/cursor-db-CZnYy7aT.js +0 -830
  268. package/apps/ui/dist/server/assets/cursor-exporter-types-CI3goo-c.js +0 -34
  269. package/apps/ui/dist/server/assets/cursor-queries-NCIM0Nat.js +0 -67
  270. package/apps/ui/dist/server/assets/cursor-recovery-CXpO8KcD.js +0 -361
  271. package/apps/ui/dist/server/assets/cursor-server-DNu52A3K.js +0 -213
  272. package/apps/ui/dist/server/assets/cursor-threads._composerId-BB0Y_Mao.js +0 -11
  273. package/apps/ui/dist/server/assets/cursor-threads._composerId-Ckn6ItHI.js +0 -582
  274. package/apps/ui/dist/server/assets/cursor-threads._composerId-p9-ARAzc.js +0 -18
  275. package/apps/ui/dist/server/assets/cursor-transcript-B7tGnqtn.js +0 -125
  276. package/apps/ui/dist/server/assets/cursor._workspaceKey-CZuohIUL.js +0 -28
  277. package/apps/ui/dist/server/assets/cursor._workspaceKey-DPp5JSjy.js +0 -401
  278. package/apps/ui/dist/server/assets/cursor._workspaceKey-nmg3YIOQ.js +0 -11
  279. package/apps/ui/dist/server/assets/cursor.index-CcsX7DG0.js +0 -11
  280. package/apps/ui/dist/server/assets/cursor.index-DkWT-mxw.js +0 -189
  281. package/apps/ui/dist/server/assets/data-table-Cdct823O.js +0 -189
  282. package/apps/ui/dist/server/assets/delete-confirm-dialog-BcBNCxWB.js +0 -144
  283. package/apps/ui/dist/server/assets/download-DMmiy1xf.js +0 -92
  284. package/apps/ui/dist/server/assets/dropdown-menu-Dy_9t6TN.js +0 -36
  285. package/apps/ui/dist/server/assets/empty-plugin-adapters-B3lHh1La.js +0 -5
  286. package/apps/ui/dist/server/assets/export-dialog-D88ze9Gy.js +0 -240
  287. package/apps/ui/dist/server/assets/formatters-FJaGZgJk.js +0 -91
  288. package/apps/ui/dist/server/assets/kiro-db--fXrED_-.js +0 -552
  289. package/apps/ui/dist/server/assets/kiro-queries-CzNlM2ok.js +0 -37
  290. package/apps/ui/dist/server/assets/kiro-server-9WRxg2Au.js +0 -72
  291. package/apps/ui/dist/server/assets/kiro-sessions._sessionId-CRY2c7YO.js +0 -11
  292. package/apps/ui/dist/server/assets/kiro-sessions._sessionId-F1UlwxmR.js +0 -449
  293. package/apps/ui/dist/server/assets/kiro-sessions._sessionId-bvTulT7C.js +0 -18
  294. package/apps/ui/dist/server/assets/kiro-transcript-DoekQBaH.js +0 -112
  295. package/apps/ui/dist/server/assets/kiro-transcript-phase-CJG40nQg.js +0 -27
  296. package/apps/ui/dist/server/assets/kiro._workspaceKey-BDe9sQwo.js +0 -11
  297. package/apps/ui/dist/server/assets/kiro._workspaceKey-CJsjgNwO.js +0 -28
  298. package/apps/ui/dist/server/assets/kiro._workspaceKey-D_-4Qb7y.js +0 -193
  299. package/apps/ui/dist/server/assets/kiro.index-C__-UROk.js +0 -11
  300. package/apps/ui/dist/server/assets/kiro.index-CmTbqeYj.js +0 -93
  301. package/apps/ui/dist/server/assets/loading-panel-BGFnWseS.js +0 -27
  302. package/apps/ui/dist/server/assets/metric-card-ByEeLu0r.js +0 -23
  303. package/apps/ui/dist/server/assets/model-label-B1NWGc65.js +0 -13
  304. package/apps/ui/dist/server/assets/opencode-db-BM7KjOzc.js +0 -397
  305. package/apps/ui/dist/server/assets/opencode-queries-BeNYXnQv.js +0 -50
  306. package/apps/ui/dist/server/assets/opencode-server-BpQ_kRze.js +0 -72
  307. package/apps/ui/dist/server/assets/opencode-sessions._sessionId-CGQ-t0vD.js +0 -518
  308. package/apps/ui/dist/server/assets/opencode-sessions._sessionId-D8Q7in_Z.js +0 -18
  309. package/apps/ui/dist/server/assets/opencode-sessions._sessionId-DKOvi0lV.js +0 -11
  310. package/apps/ui/dist/server/assets/opencode-think-tags-CAoD-EcZ.js +0 -87
  311. package/apps/ui/dist/server/assets/opencode-transcript-BNTcGNym.js +0 -141
  312. package/apps/ui/dist/server/assets/opencode-transcript-phase-OqLkiQD0.js +0 -32
  313. package/apps/ui/dist/server/assets/opencode._workspaceKey-BdqcWHw1.js +0 -11
  314. package/apps/ui/dist/server/assets/opencode._workspaceKey-CfH96HTT.js +0 -28
  315. package/apps/ui/dist/server/assets/opencode._workspaceKey-DdbHPDrO.js +0 -207
  316. package/apps/ui/dist/server/assets/opencode.index-BbVzkJXP.js +0 -11
  317. package/apps/ui/dist/server/assets/opencode.index-Vh_Gq_1L.js +0 -93
  318. package/apps/ui/dist/server/assets/page-header-VNSaM3xd.js +0 -29
  319. package/apps/ui/dist/server/assets/path-transforms-DL2IwtYd.js +0 -31
  320. package/apps/ui/dist/server/assets/projects._project-4io5LO0E.js +0 -20
  321. package/apps/ui/dist/server/assets/projects._project-Bshqk7JA.js +0 -12
  322. package/apps/ui/dist/server/assets/projects._project-D6ZoGhJ8.js +0 -395
  323. package/apps/ui/dist/server/assets/projects.index-BLXOx5eL.js +0 -12
  324. package/apps/ui/dist/server/assets/projects.index-BkLiF2FF.js +0 -182
  325. package/apps/ui/dist/server/assets/projects.index-DesYXwfi.js +0 -14
  326. package/apps/ui/dist/server/assets/reload-error-panel-BJMxY3U1.js +0 -25
  327. package/apps/ui/dist/server/assets/route-search-ts4W9MJ9.js +0 -38
  328. package/apps/ui/dist/server/assets/router-Sac2DGk6.js +0 -518
  329. package/apps/ui/dist/server/assets/routes-Bsact1uB.js +0 -184
  330. package/apps/ui/dist/server/assets/routes-BzkJgq4W.js +0 -34
  331. package/apps/ui/dist/server/assets/select-GW76p-ld.js +0 -76
  332. package/apps/ui/dist/server/assets/settings-OayxIYQQ.js +0 -100
  333. package/apps/ui/dist/server/assets/settings-store-DpEJEQ7M.js +0 -52
  334. package/apps/ui/dist/server/assets/shared-DyhChtHf.js +0 -137
  335. package/apps/ui/dist/server/assets/source-session-export-server-DNutCawb.js +0 -38
  336. package/apps/ui/dist/server/assets/sqlite-error-LZDrnxdd.js +0 -13
  337. package/apps/ui/dist/server/assets/start-B_HFwkkk.js +0 -4
  338. package/apps/ui/dist/server/assets/tabs-DkaChNVg.js +0 -501
  339. package/apps/ui/dist/server/assets/text-filter-CGKxMCKt.js +0 -36
  340. package/apps/ui/dist/server/assets/thread-transcript-stats-Dh34mt2u.js +0 -45
  341. package/apps/ui/dist/server/assets/threads._threadId-BSSK4nkI.js +0 -26
  342. package/apps/ui/dist/server/assets/threads._threadId-BeXEc4Lo.js +0 -648
  343. package/apps/ui/dist/server/assets/threads._threadId-Ci0S4mKU.js +0 -18
  344. package/apps/ui/dist/server/assets/ui-export-files-BHLX9bhN.js +0 -83
  345. package/apps/ui/dist/server/assets/utils-C_uf36nf.js +0 -8
  346. package/apps/ui/dist/server/server.js +0 -5895
  347. package/bin/codex-chats-claude.js +0 -5
  348. package/bin/codex-chats.js +0 -5
  349. package/bin/spiracha.js +0 -5
  350. package/src/export-chats.ts +0 -120
  351. package/src/export-claude.ts +0 -36
  352. package/src/export-cursor.ts +0 -244
  353. package/src/lib/claude-exporter.ts +0 -864
  354. package/src/lib/codex-exporter-cli.ts +0 -277
  355. package/src/lib/codex-exporter-db.ts +0 -319
  356. package/src/lib/codex-exporter.ts +0 -115
  357. package/src/lib/cursor-exporter.ts +0 -266
  358. package/src/lib/interactive-cli.ts +0 -433
  359. package/src/lib/native-open.ts +0 -54
  360. package/src/mcp-server.ts +0 -137
  361. package/src/spiracha.ts +0 -116
  362. package/src/ui-cli.ts +0 -310
  363. /package/apps/ui/{dist/client → public}/icon.svg +0 -0
  364. /package/apps/ui/{dist/client → public}/manifest.json +0 -0
  365. /package/apps/ui/{dist/client → public}/robots.txt +0 -0
@@ -1,501 +0,0 @@
1
- import { t as applyPathTransforms$1 } from "./path-transforms-DL2IwtYd.js";
2
- import { t as cn } from "./utils-C_uf36nf.js";
3
- import { t as Button } from "./button-CmTDnzOn.js";
4
- import { n as useSettings } from "./settings-store-DpEJEQ7M.js";
5
- import { t as Checkbox$1 } from "./checkbox-C0hovF41.js";
6
- import { a as formatModelLabel, r as formatDateTime } from "./formatters-FJaGZgJk.js";
7
- import { t as Badge } from "./badge-EvdhKK_Z.js";
8
- import { useEffect, useMemo, useRef, useState } from "react";
9
- import { Link } from "@tanstack/react-router";
10
- import { jsx, jsxs } from "react/jsx-runtime";
11
- import { Check, ChevronRight, Copy } from "lucide-react";
12
- import { cva } from "class-variance-authority";
13
- import { Tabs } from "radix-ui";
14
- import { useVirtualizer } from "@tanstack/react-virtual";
15
- //#region src/components/breadcrumbs.tsx
16
- var isLinkItem = (item) => {
17
- return "to" in item;
18
- };
19
- var Breadcrumbs = ({ items }) => {
20
- return /* @__PURE__ */ jsx("nav", {
21
- "aria-label": "Breadcrumb",
22
- className: "flex flex-wrap items-center gap-1 text-sm",
23
- children: items.map((item, index) => {
24
- const content = isLinkItem(item) ? /* @__PURE__ */ jsx(Link, {
25
- className: "text-[var(--muted-foreground)] transition hover:text-[var(--foreground)]",
26
- params: item.params,
27
- to: item.to,
28
- children: item.label
29
- }) : /* @__PURE__ */ jsx("span", {
30
- "aria-current": "page",
31
- className: "font-medium text-[var(--foreground)]",
32
- children: item.label
33
- });
34
- return /* @__PURE__ */ jsxs("div", {
35
- className: "flex items-center gap-1",
36
- children: [index > 0 ? /* @__PURE__ */ jsx(ChevronRight, { className: "size-3.5 text-[var(--muted-foreground)]" }) : null, content]
37
- }, isLinkItem(item) ? `${item.label}-${item.to}-${index}` : `${item.label}-current-${index}`);
38
- })
39
- });
40
- };
41
- //#endregion
42
- //#region src/components/json-panel.tsx
43
- function JsonPanel({ title, value }) {
44
- return /* @__PURE__ */ jsxs("section", {
45
- className: "rounded-[1.6rem] border border-[var(--border)] bg-[var(--panel)] p-5 shadow-[var(--panel-shadow)]",
46
- children: [/* @__PURE__ */ jsx("h3", {
47
- className: "font-semibold text-[var(--muted-foreground)] text-sm uppercase tracking-[0.18em]",
48
- children: title
49
- }), /* @__PURE__ */ jsx("pre", {
50
- className: "mt-4 overflow-x-auto rounded-2xl border border-[var(--border)] bg-[var(--code-background)] p-4 text-[var(--code-foreground)] text-xs leading-5",
51
- children: JSON.stringify(value, null, 2)
52
- })]
53
- });
54
- }
55
- //#endregion
56
- //#region src/components/metadata-section.tsx
57
- function MetadataSection({ items, title }) {
58
- return /* @__PURE__ */ jsxs("section", {
59
- className: "rounded-[1.6rem] border border-[var(--border)] bg-[var(--panel)] p-5 shadow-[var(--panel-shadow)]",
60
- children: [/* @__PURE__ */ jsx("h3", {
61
- className: "font-semibold text-[var(--muted-foreground)] text-sm uppercase tracking-[0.18em]",
62
- children: title
63
- }), /* @__PURE__ */ jsx("dl", {
64
- className: "mt-4 space-y-3",
65
- children: items.map((item) => /* @__PURE__ */ jsxs("div", {
66
- className: "grid gap-1 sm:grid-cols-[11rem_1fr] sm:items-start",
67
- children: [/* @__PURE__ */ jsx("dt", {
68
- className: "font-medium text-[var(--muted-foreground)] text-xs uppercase tracking-[0.14em]",
69
- children: item.label
70
- }), /* @__PURE__ */ jsx("dd", {
71
- className: "min-w-0 text-sm leading-6",
72
- children: item.value
73
- })]
74
- }, item.label))
75
- })]
76
- });
77
- }
78
- //#endregion
79
- //#region src/lib/path-utils.ts
80
- var applyPathTransforms = (text, settings, projectPath) => {
81
- return applyPathTransforms$1(text, {
82
- ...settings,
83
- projectPath
84
- });
85
- };
86
- //#endregion
87
- //#region src/components/transcript-view.tsx
88
- var isCommentaryMessage = (event) => event.kind === "message" && event.role === "assistant" && event.phase === "commentary";
89
- var shouldShowEvent = (event, showToolCalls, showExtraEvents, showCommentary, showUserMessages) => {
90
- if (isCommentaryMessage(event) && !showCommentary) return false;
91
- if (event.kind === "message") {
92
- if (event.role === "user" && !showUserMessages) return false;
93
- return !event.isHiddenByDefault || showExtraEvents;
94
- }
95
- if (event.kind === "tool_call" || event.kind === "tool_output") return showToolCalls;
96
- return showExtraEvents;
97
- };
98
- var getEventTone = (event) => {
99
- if (event.kind === "message" && event.role === "assistant") return "border-[var(--accent)]/40 bg-[var(--panel)]";
100
- if (event.kind === "message" && event.role === "user") return "border-[var(--border)] bg-[var(--panel-secondary)]";
101
- if (event.kind === "tool_call" || event.kind === "tool_output") return "border-[var(--border)] bg-[var(--code-background)]";
102
- return "border-[var(--border)] bg-[var(--panel-secondary)]/80";
103
- };
104
- var getMessageTitle = (event, assistantModel) => {
105
- const modelLabel = formatModelLabel(event.model ?? assistantModel);
106
- if (event.variant === "agent_message") return event.role === "assistant" ? modelLabel : "Assistant update";
107
- if (event.role === "assistant") return modelLabel;
108
- return event.role === "system" ? "System" : "User";
109
- };
110
- var assertNever = (value) => {
111
- throw new Error(`Unhandled transcript event kind: ${JSON.stringify(value)}`);
112
- };
113
- var getNonMessageTitle = (event) => {
114
- switch (event.kind) {
115
- case "tool_call": return `Tool call: ${event.name}`;
116
- case "tool_output": return "Tool output";
117
- case "task_started": return "Task started";
118
- case "task_complete": return "Task complete";
119
- case "token_count": return "Token update";
120
- case "reasoning": return "Reasoning";
121
- case "web_search": return "Web search";
122
- default: return assertNever(event);
123
- }
124
- };
125
- var getEventTitle = (event, assistantModel) => event.kind === "message" ? getMessageTitle(event, assistantModel) : getNonMessageTitle(event);
126
- var copyToClipboard = async (text) => {
127
- if (typeof navigator !== "undefined" && navigator.clipboard) try {
128
- await navigator.clipboard.writeText(text);
129
- return true;
130
- } catch {}
131
- return false;
132
- };
133
- var getEventMarkdownBody = (event, transform) => {
134
- switch (event.kind) {
135
- case "message": return transform(event.text || "No text content");
136
- case "tool_call": return [event.command ?? event.name, event.workdir].filter((value) => Boolean(value)).map(transform).join("\n\n");
137
- case "tool_output": return transform(event.summary || event.outputText || "");
138
- case "task_started": return `Context window: ${event.modelContextWindow ?? "n/a"}\n\nCollaboration mode: ${event.collaborationModeKind ?? "n/a"}`;
139
- case "task_complete": return `Duration: ${event.durationMs ?? "n/a"} ms\n\nFirst token: ${event.timeToFirstTokenMs ?? "n/a"} ms`;
140
- case "token_count": return JSON.stringify(event.rateLimits, null, 2);
141
- case "reasoning": return event.summary.join(" ") || "Reasoning content is not directly available.";
142
- case "web_search": return [`Phase: ${event.phase}${event.status ? ` · ${event.status}` : ""}`, event.query ? transform(event.query) : null].filter(Boolean).join("\n\n");
143
- }
144
- };
145
- var getEventMarkdown = (event, assistantModel, transform) => `## ${getEventTitle(event, assistantModel)}\n\n${getEventMarkdownBody(event, transform)}`;
146
- var buildEventKey = (event, index) => {
147
- if (event.kind === "tool_call") return `${event.kind}-${event.sequence}-${event.callId ?? event.timestamp ?? event.name}-${index}`;
148
- if (event.kind === "tool_output") return `${event.kind}-${event.sequence}-${event.callId ?? event.timestamp ?? "output"}-${index}`;
149
- if (event.kind === "message") return `${event.kind}-${event.sequence}-${event.variant}-${event.timestamp ?? event.role}-${index}`;
150
- return `${event.kind}-${event.sequence}-${event.timestamp ?? "event"}-${index}`;
151
- };
152
- var renderMessageBody = (event, t) => /* @__PURE__ */ jsx("p", {
153
- className: "min-w-0 whitespace-pre-wrap break-words text-sm leading-6 [overflow-wrap:anywhere]",
154
- children: t(event.text || "No text content")
155
- });
156
- var renderToolCallBody = (event, t) => /* @__PURE__ */ jsxs("div", {
157
- className: "space-y-2 text-sm",
158
- children: [/* @__PURE__ */ jsx("p", {
159
- className: "min-w-0 break-words font-medium [overflow-wrap:anywhere]",
160
- children: t(event.command ?? event.name)
161
- }), event.workdir ? /* @__PURE__ */ jsx("p", {
162
- className: "font-mono text-[var(--muted-foreground)] text-xs",
163
- children: t(event.workdir)
164
- }) : null]
165
- });
166
- var renderToolOutputBody = (event, t) => /* @__PURE__ */ jsx("p", {
167
- className: "min-w-0 whitespace-pre-wrap break-words text-sm leading-6 [overflow-wrap:anywhere]",
168
- children: t(event.summary || event.outputText || "")
169
- });
170
- var renderTaskStartedBody = (event) => /* @__PURE__ */ jsxs("div", {
171
- className: "text-[var(--muted-foreground)] text-sm",
172
- children: [
173
- "Context window: ",
174
- event.modelContextWindow ?? "n/a",
175
- " · Collaboration mode: ",
176
- event.collaborationModeKind ?? "n/a"
177
- ]
178
- });
179
- var renderTaskCompleteBody = (event) => /* @__PURE__ */ jsxs("div", {
180
- className: "text-[var(--muted-foreground)] text-sm",
181
- children: [
182
- "Duration: ",
183
- event.durationMs ?? "n/a",
184
- " ms · First token: ",
185
- event.timeToFirstTokenMs ?? "n/a",
186
- " ms"
187
- ]
188
- });
189
- var renderTokenCountBody = (event) => /* @__PURE__ */ jsx("pre", {
190
- className: "overflow-x-auto text-xs leading-5",
191
- children: JSON.stringify(event.rateLimits, null, 2)
192
- });
193
- var renderReasoningBody = (event) => /* @__PURE__ */ jsxs("div", {
194
- className: "space-y-2 text-sm",
195
- children: [/* @__PURE__ */ jsx("p", { children: event.summary.join(" ") || "Reasoning content is not directly available." }), event.hasEncryptedContent ? /* @__PURE__ */ jsx("p", {
196
- className: "text-[var(--muted-foreground)] text-xs",
197
- children: "Encrypted reasoning payload captured."
198
- }) : null]
199
- });
200
- var renderWebSearchBody = (event) => /* @__PURE__ */ jsxs("div", {
201
- className: "space-y-2 text-sm",
202
- children: [/* @__PURE__ */ jsxs("p", { children: [
203
- "Phase: ",
204
- event.phase,
205
- event.status ? ` · ${event.status}` : ""
206
- ] }), event.query ? /* @__PURE__ */ jsx("p", {
207
- className: "text-[var(--muted-foreground)]",
208
- children: event.query
209
- }) : null]
210
- });
211
- var renderEventBody = (event, t) => {
212
- switch (event.kind) {
213
- case "message": return renderMessageBody(event, t);
214
- case "tool_call": return renderToolCallBody(event, t);
215
- case "tool_output": return renderToolOutputBody(event, t);
216
- case "task_started": return renderTaskStartedBody(event);
217
- case "task_complete": return renderTaskCompleteBody(event);
218
- case "token_count": return renderTokenCountBody(event);
219
- case "reasoning": return renderReasoningBody(event);
220
- case "web_search": return renderWebSearchBody(event);
221
- }
222
- };
223
- function TranscriptEventCard({ assistantModel, copied, event, isSelected, showRawJson, transform, onCopy, onSelectionChange }) {
224
- return /* @__PURE__ */ jsxs("article", {
225
- className: cn("min-w-0 overflow-hidden rounded-xl border p-3.5 shadow-[var(--panel-shadow)]", isSelected && "ring-2 ring-[var(--accent)]/35", getEventTone(event)),
226
- children: [
227
- /* @__PURE__ */ jsxs("div", {
228
- className: "flex flex-wrap items-start justify-between gap-2",
229
- children: [/* @__PURE__ */ jsxs("div", {
230
- className: "flex min-w-0 flex-1 flex-wrap items-center gap-2",
231
- children: [
232
- /* @__PURE__ */ jsx(Checkbox$1, {
233
- "aria-label": `Select ${getEventTitle(event, assistantModel)}`,
234
- checked: isSelected,
235
- onCheckedChange: (checked) => onSelectionChange(event, checked === true)
236
- }),
237
- /* @__PURE__ */ jsx("h3", {
238
- className: "min-w-0 break-words font-semibold text-sm [overflow-wrap:anywhere]",
239
- children: getEventTitle(event, assistantModel)
240
- }),
241
- event.kind === "message" && event.phase ? /* @__PURE__ */ jsx(Badge, {
242
- variant: "outline",
243
- children: event.phase
244
- }) : null,
245
- event.kind !== "message" ? /* @__PURE__ */ jsx(Badge, {
246
- variant: "outline",
247
- children: event.kind.replaceAll("_", " ")
248
- }) : null
249
- ]
250
- }), event.timestamp ? /* @__PURE__ */ jsx("p", {
251
- className: "shrink-0 text-[var(--muted-foreground)] text-xs",
252
- suppressHydrationWarning: true,
253
- children: formatDateTime(event.timestamp)
254
- }) : null]
255
- }),
256
- /* @__PURE__ */ jsx("div", {
257
- className: "mt-2.5 min-w-0",
258
- children: renderEventBody(event, transform)
259
- }),
260
- /* @__PURE__ */ jsx("div", {
261
- className: "mt-3 flex justify-end",
262
- children: /* @__PURE__ */ jsx(Button, {
263
- "aria-label": "Copy message",
264
- className: "text-[var(--muted-foreground)] hover:bg-[var(--panel-secondary)] hover:text-[var(--foreground)]",
265
- size: "icon-xs",
266
- variant: "ghost",
267
- onClick: () => onCopy(event),
268
- children: copied ? /* @__PURE__ */ jsx(Check, { className: "text-[var(--accent)]" }) : /* @__PURE__ */ jsx(Copy, {})
269
- })
270
- }),
271
- showRawJson ? /* @__PURE__ */ jsx("pre", {
272
- className: "mt-3 overflow-x-auto rounded-lg border border-[var(--border)] bg-[var(--code-background)] p-3 text-[var(--code-foreground)] text-xs leading-5",
273
- children: JSON.stringify(event.raw, null, 2)
274
- }) : null
275
- ]
276
- });
277
- }
278
- function TranscriptView({ assistantModel, events, projectPath, showCommentary, showExtraEvents, showRawJson, showToolCalls, showUserMessages = true }) {
279
- const { settings } = useSettings();
280
- const visibleEvents = useMemo(() => events.filter((event) => shouldShowEvent(event, showToolCalls, showExtraEvents, showCommentary, showUserMessages)), [
281
- events,
282
- showCommentary,
283
- showExtraEvents,
284
- showToolCalls,
285
- showUserMessages
286
- ]);
287
- const [copiedEventKeys, setCopiedEventKeys] = useState([]);
288
- const [copiedSelection, setCopiedSelection] = useState(false);
289
- const [copyErrorMessage, setCopyErrorMessage] = useState(null);
290
- const [selectedEventKeys, setSelectedEventKeys] = useState([]);
291
- const parentRef = useRef(null);
292
- const timeoutIdsRef = useRef([]);
293
- const useVirtualList = visibleEvents.length > 40;
294
- const eventKeyByEvent = useMemo(() => new Map(events.map((event, index) => [event, buildEventKey(event, index)])), [events]);
295
- const getEventKey = (event) => eventKeyByEvent.get(event) ?? buildEventKey(event, -1);
296
- const transform = (text) => applyPathTransforms(text, settings, projectPath);
297
- const visibleEventKeys = useMemo(() => visibleEvents.map((event) => eventKeyByEvent.get(event) ?? buildEventKey(event, -1)), [visibleEvents, eventKeyByEvent]);
298
- const visibleEventKeySet = useMemo(() => new Set(visibleEventKeys), [visibleEventKeys]);
299
- const selectedEventKeySet = useMemo(() => new Set(selectedEventKeys), [selectedEventKeys]);
300
- const virtualizer = useVirtualizer({
301
- count: useVirtualList ? visibleEvents.length : 0,
302
- estimateSize: () => 160,
303
- getItemKey: (index) => getEventKey(visibleEvents[index]) ?? `event-${index}`,
304
- getScrollElement: () => parentRef.current,
305
- measureElement: (element) => element.getBoundingClientRect().height,
306
- overscan: 8
307
- });
308
- useEffect(() => {
309
- return () => {
310
- for (const timeoutId of timeoutIdsRef.current) window.clearTimeout(timeoutId);
311
- timeoutIdsRef.current = [];
312
- };
313
- }, []);
314
- useEffect(() => {
315
- setSelectedEventKeys((current) => {
316
- const next = current.filter((key) => visibleEventKeySet.has(key));
317
- return next.length === current.length ? current : next;
318
- });
319
- }, [visibleEventKeySet]);
320
- const scheduleTimeout = (callback, delayMs) => {
321
- const timeoutId = window.setTimeout(() => {
322
- timeoutIdsRef.current = timeoutIdsRef.current.filter((entry) => entry !== timeoutId);
323
- callback();
324
- }, delayMs);
325
- timeoutIdsRef.current.push(timeoutId);
326
- };
327
- const showCopyFailure = () => {
328
- setCopyErrorMessage("Copy failed");
329
- scheduleTimeout(() => {
330
- setCopyErrorMessage((current) => current === "Copy failed" ? null : current);
331
- }, 1500);
332
- };
333
- const visibleSelectedKeys = useMemo(() => selectedEventKeys.filter((key) => visibleEventKeySet.has(key)), [selectedEventKeys, visibleEventKeySet]);
334
- const visibleSelectedKeySet = useMemo(() => new Set(visibleSelectedKeys), [visibleSelectedKeys]);
335
- const allVisibleSelected = visibleEvents.length > 0 && visibleSelectedKeys.length === visibleEvents.length;
336
- const handleSelectionChange = (event, checked) => {
337
- const key = getEventKey(event);
338
- setSelectedEventKeys((current) => checked ? current.includes(key) ? current : [...current, key] : current.filter((entry) => entry !== key));
339
- };
340
- const handleToggleAllVisible = (checked) => {
341
- setSelectedEventKeys((current) => checked ? [...new Set([...current.filter((key) => !visibleEventKeySet.has(key)), ...visibleEventKeys])] : current.filter((key) => !visibleEventKeySet.has(key)));
342
- };
343
- const handleCopyEvent = async (event) => {
344
- if (!await copyToClipboard(getEventMarkdown(event, assistantModel, transform))) {
345
- showCopyFailure();
346
- return;
347
- }
348
- const key = getEventKey(event);
349
- setCopiedEventKeys((current) => [...new Set([...current, key])]);
350
- scheduleTimeout(() => {
351
- setCopiedEventKeys((current) => current.filter((entry) => entry !== key));
352
- }, 1500);
353
- };
354
- const handleCopySelected = async () => {
355
- const selectedEvents = visibleEvents.filter((event) => visibleSelectedKeySet.has(getEventKey(event)));
356
- if (selectedEvents.length === 0) return;
357
- if (!await copyToClipboard(selectedEvents.map((event) => getEventMarkdown(event, assistantModel, transform)).join("\n\n"))) {
358
- showCopyFailure();
359
- return;
360
- }
361
- setCopiedSelection(true);
362
- scheduleTimeout(() => {
363
- setCopiedSelection(false);
364
- }, 1500);
365
- };
366
- if (useVirtualList) return /* @__PURE__ */ jsxs("div", {
367
- ref: parentRef,
368
- className: "h-[70vh] overflow-auto rounded-xl border border-[var(--border)] bg-[var(--panel)] p-3",
369
- children: [/* @__PURE__ */ jsxs("div", {
370
- className: "sticky top-0 z-10 mb-3 flex items-center justify-between rounded-xl border border-[var(--border)] bg-[var(--panel)]/95 px-3 py-2 backdrop-blur",
371
- children: [/* @__PURE__ */ jsxs("div", {
372
- className: "flex items-center gap-2",
373
- children: [
374
- /* @__PURE__ */ jsx(Checkbox$1, {
375
- "aria-label": "Select visible messages",
376
- checked: allVisibleSelected,
377
- onCheckedChange: (checked) => handleToggleAllVisible(checked === true)
378
- }),
379
- /* @__PURE__ */ jsxs("span", {
380
- className: "text-[var(--muted-foreground)] text-sm",
381
- children: [visibleSelectedKeys.length, " selected"]
382
- }),
383
- copyErrorMessage ? /* @__PURE__ */ jsx("span", {
384
- className: "text-[var(--destructive)] text-sm",
385
- children: copyErrorMessage
386
- }) : null
387
- ]
388
- }), /* @__PURE__ */ jsxs(Button, {
389
- "aria-label": "Copy selected messages",
390
- className: "hover:bg-[var(--panel-secondary)] hover:text-[var(--foreground)]",
391
- disabled: visibleSelectedKeys.length === 0,
392
- size: "sm",
393
- variant: "outline",
394
- onClick: () => void handleCopySelected(),
395
- children: [copiedSelection ? /* @__PURE__ */ jsx(Check, { className: "text-[var(--accent)]" }) : /* @__PURE__ */ jsx(Copy, {}), copiedSelection ? "Copied" : "Copy"]
396
- })]
397
- }), /* @__PURE__ */ jsx("div", {
398
- className: "relative w-full",
399
- style: { height: `${virtualizer.getTotalSize()}px` },
400
- children: virtualizer.getVirtualItems().map((item) => /* @__PURE__ */ jsx("div", {
401
- ref: virtualizer.measureElement,
402
- "data-index": item.index,
403
- className: "absolute top-0 left-0 w-full pb-3.5",
404
- style: { transform: `translateY(${item.start}px)` },
405
- children: /* @__PURE__ */ jsx(TranscriptEventCard, {
406
- assistantModel,
407
- copied: copiedEventKeys.includes(getEventKey(visibleEvents[item.index])),
408
- event: visibleEvents[item.index],
409
- isSelected: selectedEventKeySet.has(getEventKey(visibleEvents[item.index])),
410
- showRawJson,
411
- transform,
412
- onCopy: (event) => void handleCopyEvent(event),
413
- onSelectionChange: handleSelectionChange
414
- })
415
- }, item.key))
416
- })]
417
- });
418
- return /* @__PURE__ */ jsxs("div", {
419
- className: "space-y-3.5",
420
- children: [/* @__PURE__ */ jsxs("div", {
421
- className: "sticky top-0 z-10 flex items-center justify-between rounded-xl border border-[var(--border)] bg-[var(--panel)]/95 px-3 py-2 backdrop-blur",
422
- children: [/* @__PURE__ */ jsxs("div", {
423
- className: "flex items-center gap-2",
424
- children: [
425
- /* @__PURE__ */ jsx(Checkbox$1, {
426
- "aria-label": "Select visible messages",
427
- checked: allVisibleSelected,
428
- onCheckedChange: (checked) => handleToggleAllVisible(checked === true)
429
- }),
430
- /* @__PURE__ */ jsxs("span", {
431
- className: "text-[var(--muted-foreground)] text-sm",
432
- children: [visibleSelectedKeys.length, " selected"]
433
- }),
434
- copyErrorMessage ? /* @__PURE__ */ jsx("span", {
435
- className: "text-[var(--destructive)] text-sm",
436
- children: copyErrorMessage
437
- }) : null
438
- ]
439
- }), /* @__PURE__ */ jsxs(Button, {
440
- "aria-label": "Copy selected messages",
441
- className: "hover:bg-[var(--panel-secondary)] hover:text-[var(--foreground)]",
442
- disabled: visibleSelectedKeys.length === 0,
443
- size: "sm",
444
- variant: "outline",
445
- onClick: () => void handleCopySelected(),
446
- children: [copiedSelection ? /* @__PURE__ */ jsx(Check, { className: "text-[var(--accent)]" }) : /* @__PURE__ */ jsx(Copy, {}), copiedSelection ? "Copied" : "Copy"]
447
- })]
448
- }), visibleEvents.map((event) => /* @__PURE__ */ jsx(TranscriptEventCard, {
449
- assistantModel,
450
- copied: copiedEventKeys.includes(getEventKey(event)),
451
- event,
452
- isSelected: selectedEventKeySet.has(getEventKey(event)),
453
- showRawJson,
454
- transform,
455
- onCopy: (selectedEvent) => void handleCopyEvent(selectedEvent),
456
- onSelectionChange: handleSelectionChange
457
- }, getEventKey(event)))]
458
- });
459
- }
460
- //#endregion
461
- //#region src/components/ui/tabs.tsx
462
- function Tabs$1({ className, orientation = "horizontal", ...props }) {
463
- return /* @__PURE__ */ jsx(Tabs.Root, {
464
- "data-slot": "tabs",
465
- "data-orientation": orientation,
466
- orientation,
467
- className: cn("group/tabs flex gap-2 data-[orientation=horizontal]:flex-col", className),
468
- ...props
469
- });
470
- }
471
- var tabsListVariants = cva("group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] text-muted-foreground group-data-[orientation=horizontal]/tabs:min-h-11 group-data-[orientation=vertical]/tabs:h-fit group-data-[orientation=vertical]/tabs:flex-col data-[variant=line]:rounded-none", {
472
- defaultVariants: { variant: "default" },
473
- variants: { variant: {
474
- default: "bg-muted",
475
- line: "gap-1 bg-transparent"
476
- } }
477
- });
478
- function TabsList({ className, variant = "default", ...props }) {
479
- return /* @__PURE__ */ jsx(Tabs.List, {
480
- "data-slot": "tabs-list",
481
- "data-variant": variant,
482
- className: cn(tabsListVariants({ variant }), className),
483
- ...props
484
- });
485
- }
486
- function TabsTrigger({ className, ...props }) {
487
- return /* @__PURE__ */ jsx(Tabs.Trigger, {
488
- "data-slot": "tabs-trigger",
489
- className: cn("relative inline-flex h-auto min-h-9 min-w-0 flex-1 items-center justify-center gap-1.5 whitespace-nowrap rounded-md border border-transparent px-3 py-2 font-medium text-foreground/60 text-sm transition-all hover:text-foreground focus-visible:border-ring focus-visible:outline-1 focus-visible:outline-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 group-data-[orientation=vertical]/tabs:w-full group-data-[orientation=vertical]/tabs:justify-start group-data-[variant=default]/tabs-list:data-[state=active]:shadow-sm group-data-[variant=line]/tabs-list:data-[state=active]:shadow-none dark:text-muted-foreground dark:hover:text-foreground [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0", "group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent dark:group-data-[variant=line]/tabs-list:data-[state=active]:border-transparent dark:group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent", "data-[state=active]:bg-background data-[state=active]:text-foreground dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 dark:data-[state=active]:text-foreground", "after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-[orientation=horizontal]/tabs:after:inset-x-0 group-data-[orientation=vertical]/tabs:after:inset-y-0 group-data-[orientation=vertical]/tabs:after:-right-1 group-data-[orientation=horizontal]/tabs:after:bottom-[-3px] group-data-[orientation=horizontal]/tabs:after:h-0.5 group-data-[orientation=vertical]/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-[state=active]:after:opacity-100", className),
490
- ...props
491
- });
492
- }
493
- function TabsContent({ className, ...props }) {
494
- return /* @__PURE__ */ jsx(Tabs.Content, {
495
- "data-slot": "tabs-content",
496
- className: cn("flex-1 outline-none", className),
497
- ...props
498
- });
499
- }
500
- //#endregion
501
- export { TranscriptView as a, Breadcrumbs as c, TabsTrigger as i, TabsContent as n, MetadataSection as o, TabsList as r, JsonPanel as s, Tabs$1 as t };
@@ -1,36 +0,0 @@
1
- import { t as cn } from "./utils-C_uf36nf.js";
2
- import { jsx } from "react/jsx-runtime";
3
- //#region src/components/ui/input.tsx
4
- function Input({ className, type, ...props }) {
5
- return /* @__PURE__ */ jsx("input", {
6
- type,
7
- "data-slot": "input",
8
- className: cn("h-9 w-full min-w-0 rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-xs outline-none transition-[color,box-shadow] selection:bg-primary selection:text-primary-foreground file:inline-flex file:h-7 file:border-0 file:bg-transparent file:font-medium file:text-foreground file:text-sm placeholder:text-muted-foreground disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm dark:bg-input/30", "focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50", "aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40", className),
9
- ...props
10
- });
11
- }
12
- //#endregion
13
- //#region src/components/list-search-input.tsx
14
- function ListSearchInput({ placeholder, value, onValueChange }) {
15
- return /* @__PURE__ */ jsx(Input, {
16
- className: "h-10 w-full rounded-full border-[var(--border)] bg-[var(--panel)] px-4 sm:w-[20rem]",
17
- placeholder,
18
- value,
19
- onChange: (event) => onValueChange(event.target.value)
20
- });
21
- }
22
- //#endregion
23
- //#region src/lib/text-filter.ts
24
- var normalizeSearchToken = (value) => value.trim().toLowerCase();
25
- var tokenizeSearchQuery = (query) => {
26
- const normalized = normalizeSearchToken(query);
27
- return normalized ? normalized.split(/\s+/u).filter(Boolean) : [];
28
- };
29
- var matchesTextQuery = (query, values) => {
30
- const tokens = tokenizeSearchQuery(query);
31
- if (tokens.length === 0) return true;
32
- const haystack = values.filter((value) => value !== null && value !== void 0).map((value) => String(value).toLowerCase()).join("\n");
33
- return tokens.every((token) => haystack.includes(token));
34
- };
35
- //#endregion
36
- export { ListSearchInput as n, matchesTextQuery as t };
@@ -1,45 +0,0 @@
1
- //#region src/lib/thread-transcript-stats.ts
2
- var EXEC_TOOL_NAMES = new Set([
3
- "bash",
4
- "exec",
5
- "execute",
6
- "execute_command",
7
- "run_command",
8
- "shell",
9
- "terminal"
10
- ]);
11
- var isExecToolName = (name) => {
12
- return EXEC_TOOL_NAMES.has((name ?? "").trim().toLowerCase());
13
- };
14
- var updateMessageStats = (stats, event) => {
15
- stats.messageCount += 1;
16
- if (event.role === "assistant") stats.assistantMessageCount += 1;
17
- if (event.role === "user") stats.userMessageCount += 1;
18
- if (event.phase === "commentary") stats.commentaryCount += 1;
19
- if (event.phase === "final_answer") stats.finalAnswerCount += 1;
20
- };
21
- var getThreadTranscriptStats = (events) => {
22
- const stats = {
23
- assistantMessageCount: 0,
24
- commentaryCount: 0,
25
- execCommandCount: 0,
26
- finalAnswerCount: 0,
27
- messageCount: 0,
28
- toolCallCount: 0,
29
- toolOutputCount: 0,
30
- userMessageCount: 0,
31
- webSearchEventCount: 0
32
- };
33
- for (const event of events) {
34
- if (event.kind === "message") updateMessageStats(stats, event);
35
- if (event.kind === "tool_call") {
36
- stats.toolCallCount += 1;
37
- if (isExecToolName(event.name)) stats.execCommandCount += 1;
38
- }
39
- if (event.kind === "tool_output") stats.toolOutputCount += 1;
40
- if (event.kind === "web_search") stats.webSearchEventCount += 1;
41
- }
42
- return stats;
43
- };
44
- //#endregion
45
- export { getThreadTranscriptStats as t };
@@ -1,26 +0,0 @@
1
- import { jsx, jsxs } from "react/jsx-runtime";
2
- //#region src/routes/threads.$threadId.tsx?tsr-split=errorComponent
3
- function ThreadErrorComponent({ error }) {
4
- const isSqlite = error.message.includes("unable to open database") || error.message.includes("database is locked");
5
- return /* @__PURE__ */ jsxs("div", {
6
- className: "rounded-xl border border-[var(--border)] bg-[var(--panel)] px-6 py-10 text-center",
7
- children: [
8
- /* @__PURE__ */ jsx("p", {
9
- className: "font-medium text-[var(--destructive)] text-sm",
10
- children: isSqlite ? "Database unavailable" : "Failed to load thread"
11
- }),
12
- /* @__PURE__ */ jsx("p", {
13
- className: "mt-2 text-[var(--muted-foreground)] text-sm",
14
- children: isSqlite ? "Codex may have an exclusive lock on the database. Reload to retry." : error.message
15
- }),
16
- /* @__PURE__ */ jsx("button", {
17
- className: "mt-4 text-[var(--accent)] text-sm underline-offset-2 hover:underline",
18
- type: "button",
19
- onClick: () => window.location.reload(),
20
- children: "Reload"
21
- })
22
- ]
23
- });
24
- }
25
- //#endregion
26
- export { ThreadErrorComponent as errorComponent };