spiracha 1.5.0 → 2.1.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 (401) hide show
  1. package/AGENTS.md +114 -205
  2. package/README.md +94 -269
  3. package/apps/ui/AGENTS.md +17 -7
  4. package/apps/ui/README.md +52 -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 +245 -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 +125 -0
  11. package/apps/ui/src/components/breadcrumbs.tsx +71 -0
  12. package/apps/ui/src/components/claude-code-sessions-table.tsx +150 -0
  13. package/apps/ui/src/components/claude-code-workspaces-table.tsx +57 -0
  14. package/apps/ui/src/components/cursor-threads-table.tsx +152 -0
  15. package/apps/ui/src/components/cursor-workspaces-table.tsx +140 -0
  16. package/apps/ui/src/components/data-table.tsx +243 -0
  17. package/apps/ui/src/components/delete-confirm-dialog.tsx +88 -0
  18. package/apps/ui/src/components/export-dialog.tsx +174 -0
  19. package/apps/ui/src/components/grok-sessions-table.tsx +146 -0
  20. package/apps/ui/src/components/grok-workspaces-table.tsx +53 -0
  21. package/apps/ui/src/components/json-panel.tsx +17 -0
  22. package/apps/ui/src/components/kiro-sessions-table.tsx +148 -0
  23. package/apps/ui/src/components/kiro-workspaces-table.tsx +53 -0
  24. package/apps/ui/src/components/list-search-input.tsx +18 -0
  25. package/apps/ui/src/components/loading-panel.tsx +23 -0
  26. package/apps/ui/src/components/metadata-section.tsx +31 -0
  27. package/apps/ui/src/components/metric-card.tsx +19 -0
  28. package/apps/ui/src/components/opencode-sessions-table.tsx +164 -0
  29. package/apps/ui/src/components/opencode-workspaces-table.tsx +57 -0
  30. package/apps/ui/src/components/page-header.tsx +39 -0
  31. package/apps/ui/src/components/projects-loading-state.tsx +74 -0
  32. package/apps/ui/src/components/projects-table.tsx +108 -0
  33. package/apps/ui/src/components/qoder-sessions-table.tsx +133 -0
  34. package/apps/ui/src/components/qoder-workspaces-table.tsx +57 -0
  35. package/apps/ui/src/components/recent-threads-list.tsx +52 -0
  36. package/apps/ui/src/components/reload-error-panel.tsx +20 -0
  37. package/apps/ui/src/components/selection-actions-toolbar.tsx +80 -0
  38. package/apps/ui/src/components/text-document-panel.tsx +19 -0
  39. package/apps/ui/src/components/theme-toggle.tsx +48 -0
  40. package/apps/ui/src/components/threads-table.tsx +165 -0
  41. package/apps/ui/src/components/transcript-view.tsx +648 -0
  42. package/apps/ui/src/components/ui/alert-dialog.tsx +160 -0
  43. package/apps/ui/src/components/ui/badge.tsx +45 -0
  44. package/apps/ui/src/components/ui/button.tsx +62 -0
  45. package/apps/ui/src/components/ui/checkbox.tsx +29 -0
  46. package/apps/ui/src/components/ui/dialog.tsx +137 -0
  47. package/apps/ui/src/components/ui/dropdown-menu.tsx +217 -0
  48. package/apps/ui/src/components/ui/input.tsx +21 -0
  49. package/apps/ui/src/components/ui/scroll-area.tsx +46 -0
  50. package/apps/ui/src/components/ui/select.tsx +163 -0
  51. package/apps/ui/src/components/ui/separator.tsx +28 -0
  52. package/apps/ui/src/components/ui/sheet.tsx +107 -0
  53. package/apps/ui/src/components/ui/skeleton.tsx +7 -0
  54. package/apps/ui/src/components/ui/table.tsx +76 -0
  55. package/apps/ui/src/components/ui/tabs.tsx +71 -0
  56. package/apps/ui/src/components/ui/tooltip.tsx +44 -0
  57. package/apps/ui/src/integrations/tanstack-query/devtools.tsx +6 -0
  58. package/apps/ui/src/integrations/tanstack-query/root-provider.tsx +10 -0
  59. package/apps/ui/src/lib/antigravity-conversation-state.ts +41 -0
  60. package/apps/ui/src/lib/antigravity-queries.ts +33 -0
  61. package/apps/ui/src/lib/antigravity-server.ts +273 -0
  62. package/apps/ui/src/lib/antigravity-transcript-events.ts +343 -0
  63. package/apps/ui/src/lib/claude-code-queries.ts +34 -0
  64. package/apps/ui/src/lib/claude-code-server.ts +243 -0
  65. package/apps/ui/src/lib/claude-code-transcript-events.ts +161 -0
  66. package/apps/ui/src/lib/codex-queries.ts +82 -0
  67. package/apps/ui/src/lib/codex-server.ts +291 -0
  68. package/apps/ui/src/lib/cursor-queries.ts +37 -0
  69. package/apps/ui/src/lib/cursor-server.ts +315 -0
  70. package/apps/ui/src/lib/cursor-transcript-events.ts +229 -0
  71. package/apps/ui/src/lib/download.ts +166 -0
  72. package/apps/ui/src/lib/formatters.ts +147 -0
  73. package/apps/ui/src/lib/grok-queries.ts +22 -0
  74. package/apps/ui/src/lib/grok-server.ts +169 -0
  75. package/apps/ui/src/lib/grok-transcript-events.ts +149 -0
  76. package/apps/ui/src/lib/kiro-queries.ts +22 -0
  77. package/apps/ui/src/lib/kiro-server.ts +151 -0
  78. package/apps/ui/src/lib/kiro-transcript-events.ts +113 -0
  79. package/apps/ui/src/lib/opencode-queries.ts +37 -0
  80. package/apps/ui/src/lib/opencode-server.ts +151 -0
  81. package/apps/ui/src/lib/opencode-transcript-events.ts +221 -0
  82. package/apps/ui/src/lib/package-metadata.ts +16 -0
  83. package/apps/ui/src/lib/path-utils.ts +13 -0
  84. package/apps/ui/src/lib/qoder-queries.ts +22 -0
  85. package/apps/ui/src/lib/qoder-server.ts +135 -0
  86. package/apps/ui/src/lib/qoder-transcript-events.ts +139 -0
  87. package/apps/ui/src/lib/route-search.ts +182 -0
  88. package/apps/ui/src/lib/settings-store.tsx +59 -0
  89. package/apps/ui/src/lib/source-session-export-server.ts +139 -0
  90. package/apps/ui/src/lib/text-filter.ts +22 -0
  91. package/apps/ui/src/lib/thread-id.ts +3 -0
  92. package/apps/ui/src/lib/thread-transcript-load.ts +15 -0
  93. package/apps/ui/src/lib/thread-transcript-stats.ts +57 -0
  94. package/apps/ui/src/lib/utils.ts +7 -0
  95. package/apps/ui/src/lib/workspace-delete-navigation.ts +12 -0
  96. package/apps/ui/src/routeTree.gen.ts +837 -0
  97. package/apps/ui/src/router.tsx +20 -0
  98. package/apps/ui/src/routes/$threadId.tsx +22 -0
  99. package/apps/ui/src/routes/__root.tsx +127 -0
  100. package/apps/ui/src/routes/analytics.tsx +143 -0
  101. package/apps/ui/src/routes/antigravity-conversations.$conversationId.tsx +504 -0
  102. package/apps/ui/src/routes/antigravity.$workspaceKey.tsx +365 -0
  103. package/apps/ui/src/routes/antigravity.index.tsx +51 -0
  104. package/apps/ui/src/routes/api.v1.conversation-query.ts +12 -0
  105. package/apps/ui/src/routes/api.v1.conversations.$source.$id.export.ts +12 -0
  106. package/apps/ui/src/routes/api.v1.conversations.$source.$id.ts +16 -0
  107. package/apps/ui/src/routes/api.v1.conversations.delete.ts +12 -0
  108. package/apps/ui/src/routes/api.v1.conversations.export.ts +12 -0
  109. package/apps/ui/src/routes/api.v1.conversations.ts +12 -0
  110. package/apps/ui/src/routes/api.v1.resolve.ts +12 -0
  111. package/apps/ui/src/routes/api.v1.sources.ts +12 -0
  112. package/apps/ui/src/routes/claude-code-sessions.$sessionId.tsx +468 -0
  113. package/apps/ui/src/routes/claude-code.$workspaceKey.tsx +274 -0
  114. package/apps/ui/src/routes/claude-code.index.tsx +48 -0
  115. package/apps/ui/src/routes/codex.$project.tsx +390 -0
  116. package/apps/ui/src/routes/codex.index.tsx +116 -0
  117. package/apps/ui/src/routes/cursor-threads.$composerId.tsx +435 -0
  118. package/apps/ui/src/routes/cursor.$workspaceKey.tsx +426 -0
  119. package/apps/ui/src/routes/cursor.index.tsx +120 -0
  120. package/apps/ui/src/routes/grok-sessions.$sessionId.tsx +388 -0
  121. package/apps/ui/src/routes/grok.$workspaceKey.tsx +301 -0
  122. package/apps/ui/src/routes/grok.index.tsx +48 -0
  123. package/apps/ui/src/routes/index.tsx +124 -0
  124. package/apps/ui/src/routes/kiro-sessions.$sessionId.tsx +396 -0
  125. package/apps/ui/src/routes/kiro.$workspaceKey.tsx +303 -0
  126. package/apps/ui/src/routes/kiro.index.tsx +48 -0
  127. package/apps/ui/src/routes/opencode-sessions.$sessionId.tsx +420 -0
  128. package/apps/ui/src/routes/opencode.$workspaceKey.tsx +327 -0
  129. package/apps/ui/src/routes/opencode.index.tsx +61 -0
  130. package/apps/ui/src/routes/qoder-sessions.$sessionId.tsx +344 -0
  131. package/apps/ui/src/routes/qoder.$workspaceKey.tsx +186 -0
  132. package/apps/ui/src/routes/qoder.index.tsx +48 -0
  133. package/apps/ui/src/routes/settings.tsx +91 -0
  134. package/apps/ui/src/routes/threads.$threadId.tsx +1103 -0
  135. package/apps/ui/src/styles.css +122 -0
  136. package/apps/ui/tsconfig.json +29 -0
  137. package/apps/ui/vite.config.ts +84 -0
  138. package/bin/spiracha.ts +32 -0
  139. package/package.json +54 -80
  140. package/src/client.ts +423 -0
  141. package/src/lib/antigravity-db.ts +414 -44
  142. package/src/lib/antigravity-exporter-types.ts +4 -0
  143. package/src/lib/antigravity-projects.ts +201 -0
  144. package/src/lib/claude-code-db.ts +498 -32
  145. package/src/lib/claude-code-exporter-types.ts +5 -0
  146. package/src/lib/claude-code-transcript-phase.ts +60 -1
  147. package/src/lib/claude-code-transcript.ts +8 -5
  148. package/src/lib/codex-analytics.ts +1 -1
  149. package/src/lib/codex-browser-db.ts +410 -74
  150. package/src/lib/codex-browser-export.ts +29 -41
  151. package/src/lib/codex-browser-types.ts +1 -1
  152. package/src/lib/codex-thread-cache.ts +41 -13
  153. package/src/lib/codex-thread-parser.ts +86 -35
  154. package/src/lib/{codex-exporter-types.ts → codex-thread-types.ts} +2 -30
  155. package/src/lib/codex-transcript-filter.ts +31 -0
  156. package/src/lib/{codex-exporter-transcript.ts → codex-transcript-renderer.ts} +104 -48
  157. package/src/lib/concurrency.ts +41 -0
  158. package/src/lib/conversation-api.ts +1172 -0
  159. package/src/lib/conversation-data/adapter-helpers.ts +110 -0
  160. package/src/lib/conversation-data/antigravity-adapter.ts +167 -0
  161. package/src/lib/conversation-data/claude-code-adapter.ts +206 -0
  162. package/src/lib/conversation-data/codex-adapter.ts +269 -0
  163. package/src/lib/conversation-data/cursor-adapter.ts +205 -0
  164. package/src/lib/conversation-data/grok-adapter.ts +210 -0
  165. package/src/lib/conversation-data/index.ts +386 -0
  166. package/src/lib/conversation-data/kiro-adapter.ts +174 -0
  167. package/src/lib/conversation-data/message-selector.ts +37 -0
  168. package/src/lib/conversation-data/opencode-adapter.ts +202 -0
  169. package/src/lib/conversation-data/path-match.ts +79 -0
  170. package/src/lib/conversation-data/qoder-adapter.ts +255 -0
  171. package/src/lib/conversation-data/types.ts +159 -0
  172. package/src/lib/conversation-zip-export.ts +57 -0
  173. package/src/lib/cursor-db.ts +100 -25
  174. package/src/lib/cursor-exporter-types.ts +0 -19
  175. package/src/lib/grok-db.ts +1026 -0
  176. package/src/lib/grok-exporter-types.ts +110 -0
  177. package/src/lib/grok-transcript-phase.ts +52 -0
  178. package/src/lib/grok-transcript.ts +154 -0
  179. package/src/lib/kiro-db.ts +52 -1
  180. package/src/lib/model-label.ts +11 -3
  181. package/src/lib/opencode-db.ts +598 -55
  182. package/src/lib/opencode-transcript.ts +8 -5
  183. package/src/lib/qoder-acp-client.ts +268 -0
  184. package/src/lib/qoder-db.ts +1601 -0
  185. package/src/lib/qoder-exporter-types.ts +114 -0
  186. package/src/lib/qoder-transcript-phase.ts +41 -0
  187. package/src/lib/qoder-transcript.ts +112 -0
  188. package/src/lib/shared.ts +12 -0
  189. package/src/lib/transcript-load-limiter.ts +82 -0
  190. package/src/lib/ui-cache.ts +43 -17
  191. package/src/lib/ui-export-archive.ts +60 -0
  192. package/apps/ui/dist/client/assets/_threadId-CAIeH5mq.js +0 -1
  193. package/apps/ui/dist/client/assets/analytics-DOy1b6Sh.js +0 -1
  194. package/apps/ui/dist/client/assets/antigravity-conversations._conversationId-DqySVO2K.js +0 -7
  195. package/apps/ui/dist/client/assets/antigravity-conversations._conversationId-KAcXtNxI.js +0 -1
  196. package/apps/ui/dist/client/assets/antigravity-keychain-panel-B77qJz6f.js +0 -1
  197. package/apps/ui/dist/client/assets/antigravity._workspaceKey-B3NM6gRH.js +0 -1
  198. package/apps/ui/dist/client/assets/antigravity._workspaceKey-ByitGWki.js +0 -1
  199. package/apps/ui/dist/client/assets/antigravity.index-DP9JC2P9.js +0 -1
  200. package/apps/ui/dist/client/assets/antigravity.index-DgW25FEV.js +0 -1
  201. package/apps/ui/dist/client/assets/badge-C3i4OKs8.js +0 -1
  202. package/apps/ui/dist/client/assets/checkbox-CdHitXWQ.js +0 -1
  203. package/apps/ui/dist/client/assets/claude-code-sessions._sessionId-8pQ55ci2.js +0 -1
  204. package/apps/ui/dist/client/assets/claude-code-sessions._sessionId-DVz5UmtU.js +0 -1
  205. package/apps/ui/dist/client/assets/claude-code._workspaceKey-BBKskSum.js +0 -1
  206. package/apps/ui/dist/client/assets/claude-code._workspaceKey-OkikMUFs.js +0 -1
  207. package/apps/ui/dist/client/assets/claude-code.index-Cwu76dbb.js +0 -1
  208. package/apps/ui/dist/client/assets/claude-code.index-D6eMd08t.js +0 -1
  209. package/apps/ui/dist/client/assets/createServerFn-B-KkwmHU.js +0 -3
  210. package/apps/ui/dist/client/assets/cursor-threads._composerId-CmBFclK8.js +0 -1
  211. package/apps/ui/dist/client/assets/cursor-threads._composerId-hBWlP1D-.js +0 -1
  212. package/apps/ui/dist/client/assets/cursor._workspaceKey-BFPkIRi-.js +0 -1
  213. package/apps/ui/dist/client/assets/cursor._workspaceKey-CaAZjGmm.js +0 -1
  214. package/apps/ui/dist/client/assets/cursor.index-8y4o20kb.js +0 -2
  215. package/apps/ui/dist/client/assets/cursor.index-CrnMwDCi.js +0 -1
  216. package/apps/ui/dist/client/assets/data-table-Br78_dk3.js +0 -4
  217. package/apps/ui/dist/client/assets/delete-confirm-dialog-Bxs07u-j.js +0 -7
  218. package/apps/ui/dist/client/assets/dist-B9pyYCVU.js +0 -1
  219. package/apps/ui/dist/client/assets/dist-BrJhN2A0.js +0 -5
  220. package/apps/ui/dist/client/assets/dist-Cmd3AIfD.js +0 -1
  221. package/apps/ui/dist/client/assets/dist-DvMS2965.js +0 -1
  222. package/apps/ui/dist/client/assets/download-Bf0QJKD3.js +0 -1
  223. package/apps/ui/dist/client/assets/dropdown-menu-D5cvPaZt.js +0 -1
  224. package/apps/ui/dist/client/assets/es2015-ad6040dw.js +0 -41
  225. package/apps/ui/dist/client/assets/export-dialog-Dr8d2MqD.js +0 -1
  226. package/apps/ui/dist/client/assets/formatters-BtqyrX_c.js +0 -1
  227. package/apps/ui/dist/client/assets/index-C-STgIH4.js +0 -166
  228. package/apps/ui/dist/client/assets/jsx-runtime-DGeXAQPT.js +0 -1
  229. package/apps/ui/dist/client/assets/kiro-sessions._sessionId-CKgfJ7GR.js +0 -1
  230. package/apps/ui/dist/client/assets/kiro-sessions._sessionId-zvIJHtQF.js +0 -1
  231. package/apps/ui/dist/client/assets/kiro._workspaceKey-DhVuJuZB.js +0 -1
  232. package/apps/ui/dist/client/assets/kiro._workspaceKey-QArsjkTY.js +0 -1
  233. package/apps/ui/dist/client/assets/kiro.index-C-fr4m7i.js +0 -1
  234. package/apps/ui/dist/client/assets/kiro.index-OYgAdtZd.js +0 -1
  235. package/apps/ui/dist/client/assets/metric-card-Dplm0ZiM.js +0 -1
  236. package/apps/ui/dist/client/assets/opencode-sessions._sessionId-DLjiTst-.js +0 -1
  237. package/apps/ui/dist/client/assets/opencode-sessions._sessionId-biBwrRbt.js +0 -8
  238. package/apps/ui/dist/client/assets/opencode._workspaceKey-C7OIzMOJ.js +0 -1
  239. package/apps/ui/dist/client/assets/opencode._workspaceKey-sBakX0oI.js +0 -1
  240. package/apps/ui/dist/client/assets/opencode.index-Bl_kNs9N.js +0 -1
  241. package/apps/ui/dist/client/assets/opencode.index-CN53bVmb.js +0 -1
  242. package/apps/ui/dist/client/assets/page-header-Cwa3p6Tl.js +0 -1
  243. package/apps/ui/dist/client/assets/preload-helper-B8fFrdxC.js +0 -1
  244. package/apps/ui/dist/client/assets/projects._project-D8WloxQN.js +0 -1
  245. package/apps/ui/dist/client/assets/projects._project-DSDwH4NF.js +0 -1
  246. package/apps/ui/dist/client/assets/projects.index-5xRtuJdX.js +0 -3
  247. package/apps/ui/dist/client/assets/projects.index-DEfhWqa8.js +0 -1
  248. package/apps/ui/dist/client/assets/react-dom-DL96Jor4.js +0 -1
  249. package/apps/ui/dist/client/assets/refresh-ccw-BgKjOiA6.js +0 -1
  250. package/apps/ui/dist/client/assets/reload-error-panel-AHqu0akK.js +0 -1
  251. package/apps/ui/dist/client/assets/routes-DnzF_9CX.js +0 -1
  252. package/apps/ui/dist/client/assets/scroll-text-fM0sMOB3.js +0 -1
  253. package/apps/ui/dist/client/assets/select-CYF6pF37.js +0 -1
  254. package/apps/ui/dist/client/assets/settings-Dx70jgP_.js +0 -1
  255. package/apps/ui/dist/client/assets/sqlite-error-B6uZjUe8.js +0 -1
  256. package/apps/ui/dist/client/assets/styles-B7Zi9EFA.css +0 -1
  257. package/apps/ui/dist/client/assets/tabs-CmuhkT-c.js +0 -7
  258. package/apps/ui/dist/client/assets/text-filter-DVAZySUS.js +0 -2
  259. package/apps/ui/dist/client/assets/thread-transcript-stats-BUNz6u7F.js +0 -1
  260. package/apps/ui/dist/client/assets/threads._threadId-BB9tTsV4.js +0 -1
  261. package/apps/ui/dist/client/assets/threads._threadId-BMRSFow3.js +0 -1
  262. package/apps/ui/dist/client/assets/useMutation-BSFult2i.js +0 -1
  263. package/apps/ui/dist/client/assets/useQuery-CjINKZf1.js +0 -1
  264. package/apps/ui/dist/server/assets/_tanstack-start-manifest_v-CQ8Jjs3B.js +0 -387
  265. package/apps/ui/dist/server/assets/_threadId-B6SrBR9E.js +0 -6
  266. package/apps/ui/dist/server/assets/analytics-CYP_LT5Y.js +0 -16
  267. package/apps/ui/dist/server/assets/analytics-CtpOMVMO.js +0 -146
  268. package/apps/ui/dist/server/assets/antigravity-conversation-state-HgzS302O.js +0 -16
  269. package/apps/ui/dist/server/assets/antigravity-conversations._conversationId-BKOyL2T6.js +0 -613
  270. package/apps/ui/dist/server/assets/antigravity-conversations._conversationId-D426O-64.js +0 -11
  271. package/apps/ui/dist/server/assets/antigravity-conversations._conversationId-eS87Dx7g.js +0 -20
  272. package/apps/ui/dist/server/assets/antigravity-db-Bh8_U9uw.js +0 -580
  273. package/apps/ui/dist/server/assets/antigravity-keychain-DOiuHDwK.js +0 -126
  274. package/apps/ui/dist/server/assets/antigravity-keychain-panel-CC7FLmAK.js +0 -55
  275. package/apps/ui/dist/server/assets/antigravity-queries-CGrJO9Vr.js +0 -37
  276. package/apps/ui/dist/server/assets/antigravity-server-CHRjVFqN.js +0 -114
  277. package/apps/ui/dist/server/assets/antigravity._workspaceKey-3m_MzNFA.js +0 -11
  278. package/apps/ui/dist/server/assets/antigravity._workspaceKey-B0QeYUOh.js +0 -28
  279. package/apps/ui/dist/server/assets/antigravity._workspaceKey-C3kP-qyN.js +0 -210
  280. package/apps/ui/dist/server/assets/antigravity.index-CPCYkqCi.js +0 -104
  281. package/apps/ui/dist/server/assets/antigravity.index-DudTB3Tq.js +0 -11
  282. package/apps/ui/dist/server/assets/badge-EvdhKK_Z.js +0 -26
  283. package/apps/ui/dist/server/assets/button-CmTDnzOn.js +0 -46
  284. package/apps/ui/dist/server/assets/checkbox-C0hovF41.js +0 -19
  285. package/apps/ui/dist/server/assets/claude-code-db-Ik3VStKZ.js +0 -361
  286. package/apps/ui/dist/server/assets/claude-code-queries-Cgzi4K-e.js +0 -37
  287. package/apps/ui/dist/server/assets/claude-code-server-PfraClXS.js +0 -72
  288. package/apps/ui/dist/server/assets/claude-code-sessions._sessionId-C55oe6zj.js +0 -18
  289. package/apps/ui/dist/server/assets/claude-code-sessions._sessionId-D1RYYi3j.js +0 -473
  290. package/apps/ui/dist/server/assets/claude-code-sessions._sessionId-DSvPLEUL.js +0 -11
  291. package/apps/ui/dist/server/assets/claude-code-transcript-C-bxh3cS.js +0 -139
  292. package/apps/ui/dist/server/assets/claude-code-transcript-phase-DmUMc8VU.js +0 -10
  293. package/apps/ui/dist/server/assets/claude-code._workspaceKey-B5Xg_-tE.js +0 -28
  294. package/apps/ui/dist/server/assets/claude-code._workspaceKey-BPlzyXPa.js +0 -11
  295. package/apps/ui/dist/server/assets/claude-code._workspaceKey-DqDve2wl.js +0 -191
  296. package/apps/ui/dist/server/assets/claude-code.index-B7yYR7dD.js +0 -92
  297. package/apps/ui/dist/server/assets/claude-code.index-BUHThG1W.js +0 -11
  298. package/apps/ui/dist/server/assets/codex-queries-CtgeZ7VL.js +0 -99
  299. package/apps/ui/dist/server/assets/codex-server-CGXU4H8-.js +0 -2294
  300. package/apps/ui/dist/server/assets/concurrency-VXtYvlGh.js +0 -18
  301. package/apps/ui/dist/server/assets/createServerRpc-CF_DEwnm.js +0 -12
  302. package/apps/ui/dist/server/assets/createSsrRpc-C754NPki.js +0 -16
  303. package/apps/ui/dist/server/assets/cursor-db-CZnYy7aT.js +0 -830
  304. package/apps/ui/dist/server/assets/cursor-exporter-types-CI3goo-c.js +0 -34
  305. package/apps/ui/dist/server/assets/cursor-queries-NCIM0Nat.js +0 -67
  306. package/apps/ui/dist/server/assets/cursor-recovery-CXpO8KcD.js +0 -361
  307. package/apps/ui/dist/server/assets/cursor-server-DNu52A3K.js +0 -213
  308. package/apps/ui/dist/server/assets/cursor-threads._composerId-BB0Y_Mao.js +0 -11
  309. package/apps/ui/dist/server/assets/cursor-threads._composerId-Ckn6ItHI.js +0 -582
  310. package/apps/ui/dist/server/assets/cursor-threads._composerId-p9-ARAzc.js +0 -18
  311. package/apps/ui/dist/server/assets/cursor-transcript-B7tGnqtn.js +0 -125
  312. package/apps/ui/dist/server/assets/cursor._workspaceKey-CZuohIUL.js +0 -28
  313. package/apps/ui/dist/server/assets/cursor._workspaceKey-DPp5JSjy.js +0 -401
  314. package/apps/ui/dist/server/assets/cursor._workspaceKey-nmg3YIOQ.js +0 -11
  315. package/apps/ui/dist/server/assets/cursor.index-CcsX7DG0.js +0 -11
  316. package/apps/ui/dist/server/assets/cursor.index-DkWT-mxw.js +0 -189
  317. package/apps/ui/dist/server/assets/data-table-Cdct823O.js +0 -189
  318. package/apps/ui/dist/server/assets/delete-confirm-dialog-BcBNCxWB.js +0 -144
  319. package/apps/ui/dist/server/assets/download-DMmiy1xf.js +0 -92
  320. package/apps/ui/dist/server/assets/dropdown-menu-Dy_9t6TN.js +0 -36
  321. package/apps/ui/dist/server/assets/empty-plugin-adapters-B3lHh1La.js +0 -5
  322. package/apps/ui/dist/server/assets/export-dialog-D88ze9Gy.js +0 -240
  323. package/apps/ui/dist/server/assets/formatters-FJaGZgJk.js +0 -91
  324. package/apps/ui/dist/server/assets/kiro-db--fXrED_-.js +0 -552
  325. package/apps/ui/dist/server/assets/kiro-queries-CzNlM2ok.js +0 -37
  326. package/apps/ui/dist/server/assets/kiro-server-9WRxg2Au.js +0 -72
  327. package/apps/ui/dist/server/assets/kiro-sessions._sessionId-CRY2c7YO.js +0 -11
  328. package/apps/ui/dist/server/assets/kiro-sessions._sessionId-F1UlwxmR.js +0 -449
  329. package/apps/ui/dist/server/assets/kiro-sessions._sessionId-bvTulT7C.js +0 -18
  330. package/apps/ui/dist/server/assets/kiro-transcript-DoekQBaH.js +0 -112
  331. package/apps/ui/dist/server/assets/kiro-transcript-phase-CJG40nQg.js +0 -27
  332. package/apps/ui/dist/server/assets/kiro._workspaceKey-BDe9sQwo.js +0 -11
  333. package/apps/ui/dist/server/assets/kiro._workspaceKey-CJsjgNwO.js +0 -28
  334. package/apps/ui/dist/server/assets/kiro._workspaceKey-D_-4Qb7y.js +0 -193
  335. package/apps/ui/dist/server/assets/kiro.index-C__-UROk.js +0 -11
  336. package/apps/ui/dist/server/assets/kiro.index-CmTbqeYj.js +0 -93
  337. package/apps/ui/dist/server/assets/loading-panel-BGFnWseS.js +0 -27
  338. package/apps/ui/dist/server/assets/metric-card-ByEeLu0r.js +0 -23
  339. package/apps/ui/dist/server/assets/model-label-B1NWGc65.js +0 -13
  340. package/apps/ui/dist/server/assets/opencode-db-BM7KjOzc.js +0 -397
  341. package/apps/ui/dist/server/assets/opencode-queries-BeNYXnQv.js +0 -50
  342. package/apps/ui/dist/server/assets/opencode-server-BpQ_kRze.js +0 -72
  343. package/apps/ui/dist/server/assets/opencode-sessions._sessionId-CGQ-t0vD.js +0 -518
  344. package/apps/ui/dist/server/assets/opencode-sessions._sessionId-D8Q7in_Z.js +0 -18
  345. package/apps/ui/dist/server/assets/opencode-sessions._sessionId-DKOvi0lV.js +0 -11
  346. package/apps/ui/dist/server/assets/opencode-think-tags-CAoD-EcZ.js +0 -87
  347. package/apps/ui/dist/server/assets/opencode-transcript-BNTcGNym.js +0 -141
  348. package/apps/ui/dist/server/assets/opencode-transcript-phase-OqLkiQD0.js +0 -32
  349. package/apps/ui/dist/server/assets/opencode._workspaceKey-BdqcWHw1.js +0 -11
  350. package/apps/ui/dist/server/assets/opencode._workspaceKey-CfH96HTT.js +0 -28
  351. package/apps/ui/dist/server/assets/opencode._workspaceKey-DdbHPDrO.js +0 -207
  352. package/apps/ui/dist/server/assets/opencode.index-BbVzkJXP.js +0 -11
  353. package/apps/ui/dist/server/assets/opencode.index-Vh_Gq_1L.js +0 -93
  354. package/apps/ui/dist/server/assets/page-header-VNSaM3xd.js +0 -29
  355. package/apps/ui/dist/server/assets/path-transforms-DL2IwtYd.js +0 -31
  356. package/apps/ui/dist/server/assets/projects._project-4io5LO0E.js +0 -20
  357. package/apps/ui/dist/server/assets/projects._project-Bshqk7JA.js +0 -12
  358. package/apps/ui/dist/server/assets/projects._project-D6ZoGhJ8.js +0 -395
  359. package/apps/ui/dist/server/assets/projects.index-BLXOx5eL.js +0 -12
  360. package/apps/ui/dist/server/assets/projects.index-BkLiF2FF.js +0 -182
  361. package/apps/ui/dist/server/assets/projects.index-DesYXwfi.js +0 -14
  362. package/apps/ui/dist/server/assets/reload-error-panel-BJMxY3U1.js +0 -25
  363. package/apps/ui/dist/server/assets/route-search-ts4W9MJ9.js +0 -38
  364. package/apps/ui/dist/server/assets/router-Sac2DGk6.js +0 -518
  365. package/apps/ui/dist/server/assets/routes-Bsact1uB.js +0 -184
  366. package/apps/ui/dist/server/assets/routes-BzkJgq4W.js +0 -34
  367. package/apps/ui/dist/server/assets/select-GW76p-ld.js +0 -76
  368. package/apps/ui/dist/server/assets/settings-OayxIYQQ.js +0 -100
  369. package/apps/ui/dist/server/assets/settings-store-DpEJEQ7M.js +0 -52
  370. package/apps/ui/dist/server/assets/shared-DyhChtHf.js +0 -137
  371. package/apps/ui/dist/server/assets/source-session-export-server-DNutCawb.js +0 -38
  372. package/apps/ui/dist/server/assets/sqlite-error-LZDrnxdd.js +0 -13
  373. package/apps/ui/dist/server/assets/start-B_HFwkkk.js +0 -4
  374. package/apps/ui/dist/server/assets/tabs-DkaChNVg.js +0 -501
  375. package/apps/ui/dist/server/assets/text-filter-CGKxMCKt.js +0 -36
  376. package/apps/ui/dist/server/assets/thread-transcript-stats-Dh34mt2u.js +0 -45
  377. package/apps/ui/dist/server/assets/threads._threadId-BSSK4nkI.js +0 -26
  378. package/apps/ui/dist/server/assets/threads._threadId-BeXEc4Lo.js +0 -648
  379. package/apps/ui/dist/server/assets/threads._threadId-Ci0S4mKU.js +0 -18
  380. package/apps/ui/dist/server/assets/ui-export-files-BHLX9bhN.js +0 -83
  381. package/apps/ui/dist/server/assets/utils-C_uf36nf.js +0 -8
  382. package/apps/ui/dist/server/server.js +0 -5895
  383. package/bin/codex-chats-claude.js +0 -5
  384. package/bin/codex-chats.js +0 -5
  385. package/bin/spiracha.js +0 -5
  386. package/src/export-chats.ts +0 -120
  387. package/src/export-claude.ts +0 -36
  388. package/src/export-cursor.ts +0 -244
  389. package/src/lib/claude-exporter.ts +0 -864
  390. package/src/lib/codex-exporter-cli.ts +0 -277
  391. package/src/lib/codex-exporter-db.ts +0 -319
  392. package/src/lib/codex-exporter.ts +0 -115
  393. package/src/lib/cursor-exporter.ts +0 -266
  394. package/src/lib/interactive-cli.ts +0 -433
  395. package/src/lib/native-open.ts +0 -54
  396. package/src/mcp-server.ts +0 -137
  397. package/src/spiracha.ts +0 -116
  398. package/src/ui-cli.ts +0 -310
  399. /package/apps/ui/{dist/client → public}/icon.svg +0 -0
  400. /package/apps/ui/{dist/client → public}/manifest.json +0 -0
  401. /package/apps/ui/{dist/client → public}/robots.txt +0 -0
@@ -0,0 +1,504 @@
1
+ import { useMutation, useQueryClient, useSuspenseQuery } from '@tanstack/react-query';
2
+ import { createFileRoute, Link, useNavigate } from '@tanstack/react-router';
3
+ import { Download, ScrollText, Trash2 } from 'lucide-react';
4
+ import { useMemo, useState } from 'react';
5
+ import { AntigravityKeychainPanel } from '#/components/antigravity-keychain-panel';
6
+ import { Breadcrumbs } from '#/components/breadcrumbs';
7
+ import { DeleteConfirmDialog } from '#/components/delete-confirm-dialog';
8
+ import { JsonPanel } from '#/components/json-panel';
9
+ import { LoadingPanel } from '#/components/loading-panel';
10
+ import { MetadataSection } from '#/components/metadata-section';
11
+ import { MetricCard } from '#/components/metric-card';
12
+ import { PageHeader } from '#/components/page-header';
13
+ import { ReloadErrorPanel } from '#/components/reload-error-panel';
14
+ import { TextDocumentPanel } from '#/components/text-document-panel';
15
+ import { DEFAULT_SHOW_USER_MESSAGES, TranscriptView } from '#/components/transcript-view';
16
+ import { Button } from '#/components/ui/button';
17
+ import { Checkbox } from '#/components/ui/checkbox';
18
+ import { Tabs, TabsContent, TabsList, TabsTrigger } from '#/components/ui/tabs';
19
+ import { canExportAntigravityConversation } from '#/lib/antigravity-conversation-state';
20
+ import {
21
+ antigravityConversationDetailQueryOptions,
22
+ antigravityDecryptionQueryOptions,
23
+ } from '#/lib/antigravity-queries';
24
+ import {
25
+ deleteAntigravityConversationFn,
26
+ exportAntigravityArtifactsFn,
27
+ exportAntigravityConversationFn,
28
+ type getAntigravityConversationDetailFn,
29
+ } from '#/lib/antigravity-server';
30
+ import {
31
+ antigravityMarkdownToThreadEvents,
32
+ getAntigravityThreadTranscriptStats,
33
+ } from '#/lib/antigravity-transcript-events';
34
+ import { downloadTextFile } from '#/lib/download';
35
+ import { formatBytes, formatDateTime, formatNumber } from '#/lib/formatters';
36
+
37
+ type AntigravityConversationDetail = Awaited<ReturnType<typeof getAntigravityConversationDetailFn>>;
38
+
39
+ type TranscriptControlsProps = {
40
+ rawJsonDisabled?: boolean;
41
+ showCommentary: boolean;
42
+ showExtraEvents: boolean;
43
+ showRawJson: boolean;
44
+ showToolCalls: boolean;
45
+ showUserMessages: boolean;
46
+ onShowCommentaryChange: (checked: boolean) => void;
47
+ onShowExtraEventsChange: (checked: boolean) => void;
48
+ onShowRawJsonChange: (checked: boolean) => void;
49
+ onShowToolCallsChange: (checked: boolean) => void;
50
+ onShowUserMessagesChange: (checked: boolean) => void;
51
+ };
52
+
53
+ const buildConversationMetadata = (detail: AntigravityConversationDetail) => {
54
+ return [
55
+ { label: 'Conversation ID', value: <span data-mono="true">{detail.conversation.conversationId}</span> },
56
+ {
57
+ label: 'Workspace',
58
+ value: (
59
+ <Link
60
+ className="text-[var(--accent)]"
61
+ params={{ workspaceKey: detail.conversationGroup.key }}
62
+ to="/antigravity/$workspaceKey"
63
+ >
64
+ {detail.conversationGroup.label}
65
+ </Link>
66
+ ),
67
+ },
68
+ {
69
+ label: 'Created',
70
+ value: <span suppressHydrationWarning>{formatDateTime(detail.conversation.createdAtMs)}</span>,
71
+ },
72
+ {
73
+ label: 'Updated',
74
+ value: <span suppressHydrationWarning>{formatDateTime(detail.conversation.lastUpdatedAtMs)}</span>,
75
+ },
76
+ { label: 'Transcript source', value: detail.conversation.transcriptSource ?? 'n/a' },
77
+ { label: 'Conversation path', value: detail.conversation.conversationPath ?? 'n/a' },
78
+ { label: 'Transcript path', value: detail.conversation.transcriptPath ?? 'n/a' },
79
+ { label: 'Summary path', value: detail.conversation.summaryPath ?? 'n/a' },
80
+ { label: 'Source root', value: detail.conversation.sourceRoot ?? 'n/a' },
81
+ ];
82
+ };
83
+
84
+ const buildTranscriptStatsItems = (
85
+ detail: AntigravityConversationDetail,
86
+ events: ReturnType<typeof antigravityMarkdownToThreadEvents>,
87
+ ) => {
88
+ if (detail.transcriptLocked) {
89
+ return [
90
+ { label: 'Transcript load', value: 'Transcript is locked until Antigravity Keychain access is enabled.' },
91
+ ];
92
+ }
93
+
94
+ if (!detail.conversationMarkdown) {
95
+ return [{ label: 'Transcript load', value: 'No renderable transcript content was found.' }];
96
+ }
97
+
98
+ const stats = getAntigravityThreadTranscriptStats(events);
99
+ return [
100
+ { label: 'Event kinds', value: [...new Set(events.map((event) => event.kind))].join(', ') || 'n/a' },
101
+ { label: 'Messages', value: formatNumber(stats.messageCount) },
102
+ { label: 'User messages', value: formatNumber(stats.userMessageCount) },
103
+ { label: 'Assistant messages', value: formatNumber(stats.assistantMessageCount) },
104
+ { label: 'Commentary updates', value: formatNumber(stats.commentaryCount) },
105
+ { label: 'Final answers', value: formatNumber(stats.finalAnswerCount) },
106
+ { label: 'Tool calls', value: formatNumber(stats.toolCallCount) },
107
+ { label: 'Tool outputs', value: formatNumber(stats.toolOutputCount) },
108
+ ];
109
+ };
110
+
111
+ const getConversationSizeLabel = (detail: AntigravityConversationDetail): string => {
112
+ if (detail.conversation.totalBytes > 0) {
113
+ return formatBytes(detail.conversation.totalBytes);
114
+ }
115
+
116
+ return detail.conversation.summaryPath ? 'Summary' : formatBytes(detail.conversation.totalBytes);
117
+ };
118
+
119
+ export const Route = createFileRoute('/antigravity-conversations/$conversationId')({
120
+ component: AntigravityConversationDetailPage,
121
+ errorComponent: AntigravityConversationDetailErrorComponent,
122
+ loader: async ({ context, params }) => {
123
+ await Promise.all([
124
+ context.queryClient.ensureQueryData(antigravityDecryptionQueryOptions()),
125
+ context.queryClient.ensureQueryData(antigravityConversationDetailQueryOptions(params.conversationId)),
126
+ ]);
127
+ },
128
+ pendingComponent: () => (
129
+ <LoadingPanel
130
+ description="Loading the Antigravity conversation transcript, artifact data, and workspace context."
131
+ title="Loading conversation"
132
+ />
133
+ ),
134
+ });
135
+
136
+ function AntigravityConversationDetailErrorComponent({ error }: { error: Error }) {
137
+ return <ReloadErrorPanel description={error.message} title="Failed to load Antigravity conversation" />;
138
+ }
139
+
140
+ function AntigravityConversationHeaderActions({
141
+ canExportArtifacts,
142
+ canExportConversation,
143
+ exportArtifactsPending,
144
+ exportConversationPending,
145
+ showConversationExport,
146
+ onDeleteConversation,
147
+ onExportArtifacts,
148
+ onExportConversation,
149
+ }: {
150
+ canExportArtifacts: boolean;
151
+ canExportConversation: boolean;
152
+ exportArtifactsPending: boolean;
153
+ exportConversationPending: boolean;
154
+ showConversationExport: boolean;
155
+ onDeleteConversation: () => void;
156
+ onExportArtifacts: () => void;
157
+ onExportConversation: () => void;
158
+ }) {
159
+ return (
160
+ <div className="flex flex-wrap gap-2">
161
+ {showConversationExport ? (
162
+ <Button
163
+ className="rounded-full"
164
+ disabled={!canExportConversation || exportConversationPending}
165
+ type="button"
166
+ variant="outline"
167
+ onClick={onExportConversation}
168
+ >
169
+ <Download className="mr-2 size-4" />
170
+ Export conversation
171
+ </Button>
172
+ ) : null}
173
+ {canExportArtifacts ? (
174
+ <Button
175
+ className="rounded-full"
176
+ disabled={exportArtifactsPending}
177
+ type="button"
178
+ variant="outline"
179
+ onClick={onExportArtifacts}
180
+ >
181
+ <ScrollText className="mr-2 size-4" />
182
+ Export artifacts
183
+ </Button>
184
+ ) : null}
185
+ <Button
186
+ className="rounded-full border-[var(--destructive)]/20 text-[var(--destructive)]"
187
+ type="button"
188
+ variant="outline"
189
+ onClick={onDeleteConversation}
190
+ >
191
+ <Trash2 className="mr-2 size-4" />
192
+ Delete
193
+ </Button>
194
+ </div>
195
+ );
196
+ }
197
+
198
+ const AntigravityTranscriptControls = ({
199
+ rawJsonDisabled = false,
200
+ showCommentary,
201
+ showExtraEvents,
202
+ showRawJson,
203
+ showToolCalls,
204
+ showUserMessages,
205
+ onShowCommentaryChange,
206
+ onShowExtraEventsChange,
207
+ onShowRawJsonChange,
208
+ onShowToolCallsChange,
209
+ onShowUserMessagesChange,
210
+ }: TranscriptControlsProps) => {
211
+ return (
212
+ <div className="flex flex-wrap gap-4 rounded-xl border border-[var(--border)] bg-[var(--panel)] px-4 py-3 shadow-[var(--panel-shadow)]">
213
+ <div className="flex items-center gap-2 text-sm">
214
+ <Checkbox
215
+ checked={showToolCalls}
216
+ id="antigravity-transcript-show-tool-calls"
217
+ onCheckedChange={(checked) => onShowToolCallsChange(checked === true)}
218
+ />
219
+ <label htmlFor="antigravity-transcript-show-tool-calls">Show tool calls</label>
220
+ </div>
221
+ <div className="flex items-center gap-2 text-sm">
222
+ <Checkbox
223
+ checked={showCommentary}
224
+ id="antigravity-transcript-show-commentary"
225
+ onCheckedChange={(checked) => onShowCommentaryChange(checked === true)}
226
+ />
227
+ <label htmlFor="antigravity-transcript-show-commentary">Show commentary</label>
228
+ </div>
229
+ <div className="flex items-center gap-2 text-sm">
230
+ <Checkbox
231
+ checked={showExtraEvents}
232
+ id="antigravity-transcript-show-extra-events"
233
+ onCheckedChange={(checked) => onShowExtraEventsChange(checked === true)}
234
+ />
235
+ <label htmlFor="antigravity-transcript-show-extra-events">Show extra events</label>
236
+ </div>
237
+ <div className="flex items-center gap-2 text-sm">
238
+ <Checkbox
239
+ checked={showRawJson}
240
+ disabled={rawJsonDisabled}
241
+ id="antigravity-transcript-show-raw-json"
242
+ onCheckedChange={(checked) => onShowRawJsonChange(checked === true)}
243
+ />
244
+ <label htmlFor="antigravity-transcript-show-raw-json">Raw JSON</label>
245
+ </div>
246
+ <div className="flex items-center gap-2 text-sm">
247
+ <Checkbox
248
+ checked={showUserMessages}
249
+ id="antigravity-transcript-show-user-messages"
250
+ onCheckedChange={(checked) => onShowUserMessagesChange(checked === true)}
251
+ />
252
+ <label htmlFor="antigravity-transcript-show-user-messages">User</label>
253
+ </div>
254
+ </div>
255
+ );
256
+ };
257
+
258
+ function EmptyAntigravityTranscript({ detail }: { detail: AntigravityConversationDetail }) {
259
+ return (
260
+ <section className="rounded-[1.6rem] border border-[var(--border)] bg-[var(--panel)] p-5 shadow-[var(--panel-shadow)]">
261
+ <h3 className="font-semibold text-[var(--muted-foreground)] text-sm uppercase tracking-[0.18em]">
262
+ Transcript
263
+ </h3>
264
+ <p className="mt-4 text-[var(--muted-foreground)] text-sm">
265
+ {detail.transcriptLocked
266
+ ? 'Unlock Antigravity transcript export to inspect the rendered conversation content here.'
267
+ : detail.artifactsMarkdown
268
+ ? 'No transcript preview is available for this conversation. Generated artifacts are available in the Raw tab.'
269
+ : 'No transcript preview is available for this conversation.'}
270
+ </p>
271
+ </section>
272
+ );
273
+ }
274
+
275
+ function AntigravityRawPanels({
276
+ detail,
277
+ events,
278
+ }: {
279
+ detail: AntigravityConversationDetail;
280
+ events: ReturnType<typeof antigravityMarkdownToThreadEvents>;
281
+ }) {
282
+ return (
283
+ <div className="space-y-4">
284
+ <JsonPanel title="Conversation summary" value={detail.conversation} />
285
+ <JsonPanel title="Transcript events" value={events} />
286
+ {detail.conversationMarkdown ? (
287
+ <TextDocumentPanel
288
+ content={detail.conversationMarkdown}
289
+ description="Rendered transcript Markdown used for export."
290
+ title="Transcript Markdown"
291
+ />
292
+ ) : null}
293
+ {detail.artifactsMarkdown ? (
294
+ <TextDocumentPanel
295
+ content={detail.artifactsMarkdown}
296
+ description="Generated artifacts."
297
+ title="Artifacts"
298
+ />
299
+ ) : null}
300
+ </div>
301
+ );
302
+ }
303
+
304
+ function AntigravityConversationDetailPage() {
305
+ const navigate = useNavigate();
306
+ const queryClient = useQueryClient();
307
+ const decryptionState = useSuspenseQuery(antigravityDecryptionQueryOptions()).data;
308
+ const detail = useSuspenseQuery(antigravityConversationDetailQueryOptions(Route.useParams().conversationId)).data;
309
+ const [deleteOpen, setDeleteOpen] = useState(false);
310
+ const [showToolCalls, setShowToolCalls] = useState(false);
311
+ const [showCommentary, setShowCommentary] = useState(false);
312
+ const [showExtraEvents, setShowExtraEvents] = useState(false);
313
+ const [showRawJson, setShowRawJson] = useState(false);
314
+ const [showUserMessages, setShowUserMessages] = useState(DEFAULT_SHOW_USER_MESSAGES);
315
+ const transcriptEvents = useMemo(
316
+ () => antigravityMarkdownToThreadEvents(detail.conversationMarkdown),
317
+ [detail.conversationMarkdown],
318
+ );
319
+ const canExportConversation = canExportAntigravityConversation(
320
+ detail.conversation,
321
+ Boolean(decryptionState?.isUnlocked),
322
+ );
323
+ const canExportArtifacts = detail.artifactsMarkdown !== null;
324
+ const showConversationExport = canExportConversation || detail.transcriptLocked;
325
+
326
+ const exportConversationMutation = useMutation({
327
+ mutationFn: () =>
328
+ exportAntigravityConversationFn({ data: { conversationId: detail.conversation.conversationId } }),
329
+ onSuccess: (result) => {
330
+ downloadTextFile(result.filename, result.content, 'text/markdown; charset=utf-8');
331
+ },
332
+ });
333
+
334
+ const exportArtifactsMutation = useMutation({
335
+ mutationFn: () =>
336
+ exportAntigravityArtifactsFn({ data: { conversationId: detail.conversation.conversationId } }),
337
+ onSuccess: (result) => {
338
+ downloadTextFile(result.filename, result.content, 'text/markdown; charset=utf-8');
339
+ },
340
+ });
341
+
342
+ const deleteConversationMutation = useMutation({
343
+ mutationFn: () =>
344
+ deleteAntigravityConversationFn({ data: { conversationId: detail.conversation.conversationId } }),
345
+ onSuccess: async () => {
346
+ await Promise.all([
347
+ queryClient.invalidateQueries({ queryKey: ['antigravity-workspaces'] }),
348
+ queryClient.invalidateQueries({
349
+ queryKey: ['antigravity-conversations', detail.conversationGroup.key],
350
+ }),
351
+ queryClient.invalidateQueries({
352
+ queryKey: ['antigravity-conversation', detail.conversation.conversationId],
353
+ }),
354
+ ]);
355
+ navigate({
356
+ params: { workspaceKey: detail.conversationGroup.key },
357
+ to: '/antigravity/$workspaceKey',
358
+ });
359
+ },
360
+ });
361
+
362
+ return (
363
+ <div className="space-y-6">
364
+ <PageHeader
365
+ actions={
366
+ <AntigravityConversationHeaderActions
367
+ canExportArtifacts={canExportArtifacts}
368
+ canExportConversation={canExportConversation}
369
+ exportArtifactsPending={exportArtifactsMutation.isPending}
370
+ exportConversationPending={exportConversationMutation.isPending}
371
+ showConversationExport={showConversationExport}
372
+ onDeleteConversation={() => setDeleteOpen(true)}
373
+ onExportArtifacts={() => exportArtifactsMutation.mutate()}
374
+ onExportConversation={() => exportConversationMutation.mutate()}
375
+ />
376
+ }
377
+ breadcrumb={
378
+ <Breadcrumbs
379
+ items={[
380
+ { label: 'Antigravity', to: '/antigravity' },
381
+ {
382
+ label: detail.conversationGroup.label,
383
+ params: { workspaceKey: detail.conversationGroup.key },
384
+ to: '/antigravity/$workspaceKey',
385
+ },
386
+ { label: detail.conversation.title },
387
+ ]}
388
+ />
389
+ }
390
+ eyebrow="Antigravity conversation"
391
+ subtitle="Conversation detail for the selected Antigravity workspace session."
392
+ title={detail.conversation.title}
393
+ />
394
+
395
+ <AntigravityKeychainPanel />
396
+
397
+ <div className="grid gap-3 md:grid-cols-2 xl:grid-cols-4">
398
+ <MetricCard label="Transcript entries" value={formatNumber(detail.conversation.transcriptEntryCount)} />
399
+ <MetricCard label="Artifacts" value={formatNumber(detail.conversation.artifactCount)} />
400
+ <MetricCard label="Size" value={getConversationSizeLabel(detail)} />
401
+ <MetricCard
402
+ helper={detail.conversation.transcriptSource ?? 'summary'}
403
+ label="Indexed items"
404
+ value={formatNumber(detail.conversation.indexedItemCount ?? 0)}
405
+ />
406
+ </div>
407
+
408
+ <Tabs className="space-y-4" defaultValue="transcript">
409
+ <TabsList className="grid w-fit min-w-[24rem] grid-cols-3 rounded-full border border-[var(--border)] bg-[var(--panel)] p-1">
410
+ <TabsTrigger className="rounded-full px-5 text-sm" value="transcript">
411
+ Transcript
412
+ </TabsTrigger>
413
+ <TabsTrigger className="rounded-full px-5 text-sm" value="metadata">
414
+ Metadata
415
+ </TabsTrigger>
416
+ <TabsTrigger className="rounded-full px-5 text-sm" value="raw">
417
+ Raw
418
+ </TabsTrigger>
419
+ </TabsList>
420
+
421
+ <TabsContent className="space-y-3" value="transcript">
422
+ <AntigravityTranscriptControls
423
+ rawJsonDisabled={transcriptEvents.length === 0}
424
+ showCommentary={showCommentary}
425
+ showExtraEvents={showExtraEvents}
426
+ showRawJson={showRawJson}
427
+ showToolCalls={showToolCalls}
428
+ showUserMessages={showUserMessages}
429
+ onShowCommentaryChange={setShowCommentary}
430
+ onShowExtraEventsChange={setShowExtraEvents}
431
+ onShowRawJsonChange={setShowRawJson}
432
+ onShowToolCallsChange={setShowToolCalls}
433
+ onShowUserMessagesChange={setShowUserMessages}
434
+ />
435
+ {transcriptEvents.length > 0 ? (
436
+ <TranscriptView
437
+ assistantModel={null}
438
+ events={transcriptEvents}
439
+ projectPath={detail.conversation.workspaceFolder}
440
+ showCommentary={showCommentary}
441
+ showExtraEvents={showExtraEvents}
442
+ showRawJson={showRawJson}
443
+ showToolCalls={showToolCalls}
444
+ showUserMessages={showUserMessages}
445
+ />
446
+ ) : (
447
+ <EmptyAntigravityTranscript detail={detail} />
448
+ )}
449
+ </TabsContent>
450
+
451
+ <TabsContent value="metadata">
452
+ <div className="grid gap-4 xl:grid-cols-[0.95fr_1.05fr]">
453
+ <MetadataSection items={buildConversationMetadata(detail)} title="Conversation metadata" />
454
+ <MetadataSection
455
+ items={buildTranscriptStatsItems(detail, transcriptEvents)}
456
+ title="Transcript stats"
457
+ />
458
+ </div>
459
+ </TabsContent>
460
+
461
+ <TabsContent value="raw">
462
+ <AntigravityRawPanels detail={detail} events={transcriptEvents} />
463
+ </TabsContent>
464
+ </Tabs>
465
+
466
+ {exportConversationMutation.isError ? (
467
+ <p className="text-[var(--destructive)] text-sm">
468
+ {exportConversationMutation.error instanceof Error
469
+ ? exportConversationMutation.error.message
470
+ : 'Conversation export failed'}
471
+ </p>
472
+ ) : null}
473
+
474
+ {exportArtifactsMutation.isError ? (
475
+ <p className="text-[var(--destructive)] text-sm">
476
+ {exportArtifactsMutation.error instanceof Error
477
+ ? exportArtifactsMutation.error.message
478
+ : 'Artifact export failed'}
479
+ </p>
480
+ ) : null}
481
+
482
+ <DeleteConfirmDialog
483
+ confirmLabel={deleteConversationMutation.isPending ? 'Deleting...' : 'Delete conversation'}
484
+ description="Permanently delete this Antigravity conversation from disk. This removes its summary entry, conversation file, transcript logs, and generated artifacts."
485
+ errorMessage={
486
+ deleteConversationMutation.isError
487
+ ? deleteConversationMutation.error instanceof Error
488
+ ? deleteConversationMutation.error.message
489
+ : 'Conversation delete failed'
490
+ : null
491
+ }
492
+ open={deleteOpen}
493
+ title="Delete this Antigravity conversation?"
494
+ onConfirm={() => deleteConversationMutation.mutate()}
495
+ onOpenChange={(open) => {
496
+ setDeleteOpen(open);
497
+ if (!open) {
498
+ deleteConversationMutation.reset();
499
+ }
500
+ }}
501
+ />
502
+ </div>
503
+ );
504
+ }