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,125 +0,0 @@
1
- import { a as cleanExtractedText, g as renderSection, h as renderMetadataBlock, l as formatInlineLiteral, m as renderDocumentTitle, o as cleanInlineTitle, p as renderCodeBlock } from "./shared-DyhChtHf.js";
2
- //#region ../../src/lib/cursor-transcript.ts
3
- var TOOL_RESULT_PREVIEW_LIMIT = 4e3;
4
- var MIN_DATE_MS = -864e13;
5
- var MAX_DATE_MS = 864e13;
6
- var formatUnixMillis = (value) => {
7
- if (value === null || value === void 0 || !Number.isFinite(value) || value < MIN_DATE_MS || value > MAX_DATE_MS) return null;
8
- return new Date(value).toISOString();
9
- };
10
- var prettyToolArguments = (argumentsText) => {
11
- if (!argumentsText) return null;
12
- try {
13
- return JSON.stringify(JSON.parse(argumentsText), null, 2);
14
- } catch {
15
- return argumentsText;
16
- }
17
- };
18
- var truncateResult = (resultText) => {
19
- if (resultText.length <= TOOL_RESULT_PREVIEW_LIMIT) return resultText;
20
- return `${resultText.slice(0, TOOL_RESULT_PREVIEW_LIMIT)}\n... (truncated)`;
21
- };
22
- var renderCursorToolCall = (toolCall, outputFormat) => {
23
- const lines = [`Tool: ${formatInlineLiteral(toolCall.name, outputFormat)}`];
24
- if (toolCall.status) lines.push(`Status: ${toolCall.status}`);
25
- const args = prettyToolArguments(toolCall.argumentsText);
26
- if (args) lines.push("", "Arguments:", "", renderCodeBlock(args, outputFormat));
27
- const result = toolCall.resultText?.trim();
28
- if (result) lines.push("", "Result:", "", renderCodeBlock(truncateResult(result), outputFormat));
29
- return renderSection("Tool Call", lines.join("\n"), outputFormat);
30
- };
31
- var renderUserBubble = (bubble, outputFormat) => {
32
- const text = cleanExtractedText(bubble.text).trim();
33
- return text ? renderSection("User", text, outputFormat) : "";
34
- };
35
- var renderAssistantBubble = (bubble, options) => {
36
- const blocks = [];
37
- if (options.includeCommentary && bubble.thinking?.trim()) {
38
- const reasoning = cleanExtractedText(bubble.thinking).trim();
39
- if (reasoning) blocks.push(renderSection("Reasoning", reasoning, options.outputFormat));
40
- }
41
- const text = cleanExtractedText(bubble.text).trim();
42
- if (text) blocks.push(renderSection("Assistant", text, options.outputFormat));
43
- if (options.includeTools && bubble.toolCall) blocks.push(renderCursorToolCall(bubble.toolCall, options.outputFormat));
44
- return blocks;
45
- };
46
- var renderCursorBubble = (bubble, options) => {
47
- if (bubble.kind === "user") {
48
- const block = renderUserBubble(bubble, options.outputFormat);
49
- return block ? [block] : [];
50
- }
51
- if (bubble.kind === "assistant") return renderAssistantBubble(bubble, options);
52
- return [];
53
- };
54
- var getThreadTitle = (head) => {
55
- if (head.name) return cleanInlineTitle(head.name);
56
- return head.composerId;
57
- };
58
- var buildMetadataEntries = (transcript) => {
59
- const { head } = transcript;
60
- return [
61
- {
62
- key: "exported_from",
63
- value: "cursor_global_storage_bubbles"
64
- },
65
- {
66
- key: "composer_id",
67
- value: head.composerId
68
- },
69
- {
70
- key: "title",
71
- value: head.name
72
- },
73
- {
74
- key: "mode",
75
- value: head.mode
76
- },
77
- {
78
- key: "created_at_unix_ms",
79
- value: head.createdAtMs
80
- },
81
- {
82
- key: "created_at_iso",
83
- value: formatUnixMillis(head.createdAtMs)
84
- },
85
- {
86
- key: "last_updated_at_unix_ms",
87
- value: head.lastUpdatedAtMs
88
- },
89
- {
90
- key: "last_updated_at_iso",
91
- value: formatUnixMillis(head.lastUpdatedAtMs)
92
- },
93
- {
94
- key: "rendered_message_count",
95
- value: transcript.renderableBubbleCount
96
- },
97
- {
98
- key: "omitted_message_count",
99
- value: transcript.omittedBubbleCount > 0 ? transcript.omittedBubbleCount : null
100
- }
101
- ];
102
- };
103
- var buildTruncationNotice = (transcript, outputFormat) => {
104
- if (transcript.omittedBubbleCount <= 0) return "";
105
- const orderedCount = transcript.head.orderedBubbleIds.length;
106
- return renderSection("Note", [
107
- `Cursor indexed only the most recent ${orderedCount} of`,
108
- `${orderedCount + transcript.omittedBubbleCount} stored messages for this thread,`,
109
- "so earlier messages are not part of its conversation index and are not included here."
110
- ].join(" "), outputFormat);
111
- };
112
- var renderCursorTranscript = (transcript, options) => {
113
- const sections = [];
114
- for (const bubble of transcript.bubbles) sections.push(...renderCursorBubble(bubble, options));
115
- if (sections.length === 0) return null;
116
- return `${[
117
- renderDocumentTitle(getThreadTitle(transcript.head), options.outputFormat),
118
- "",
119
- options.includeMetadata ? renderMetadataBlock(buildMetadataEntries(transcript), options.outputFormat) : "",
120
- buildTruncationNotice(transcript, options.outputFormat),
121
- ...sections
122
- ].filter(Boolean).join("\n").trimEnd()}\n`;
123
- };
124
- //#endregion
125
- export { renderCursorTranscript };
@@ -1,28 +0,0 @@
1
- import { n as cursorThreadsQueryOptions, r as cursorWorkspacesQueryOptions } from "./cursor-queries-NCIM0Nat.js";
2
- import { t as LoadingPanel } from "./loading-panel-BGFnWseS.js";
3
- import { createFileRoute, lazyRouteComponent } from "@tanstack/react-router";
4
- import { jsx } from "react/jsx-runtime";
5
- //#region src/routes/cursor.$workspaceKey.tsx?tsr-shared=1
6
- var findWorkspaceOrThrow = (workspaces, workspaceKey) => {
7
- const workspace = workspaces.find((candidate) => candidate.key === workspaceKey);
8
- if (!workspace) throw new Error(`Cursor workspace not found: ${workspaceKey}`);
9
- return workspace;
10
- };
11
- //#endregion
12
- //#region src/routes/cursor.$workspaceKey.tsx
13
- var $$splitErrorComponentImporter = () => import("./cursor._workspaceKey-nmg3YIOQ.js");
14
- var $$splitComponentImporter = () => import("./cursor._workspaceKey-DPp5JSjy.js");
15
- var Route = createFileRoute("/cursor/$workspaceKey")({
16
- component: lazyRouteComponent($$splitComponentImporter, "component"),
17
- errorComponent: lazyRouteComponent($$splitErrorComponentImporter, "errorComponent"),
18
- loader: async ({ context, params }) => {
19
- findWorkspaceOrThrow(await context.queryClient.ensureQueryData(cursorWorkspacesQueryOptions()), params.workspaceKey);
20
- await context.queryClient.ensureQueryData(cursorThreadsQueryOptions(params.workspaceKey));
21
- },
22
- pendingComponent: () => /* @__PURE__ */ jsx(LoadingPanel, {
23
- description: "Loading Cursor threads and workspace metadata. Larger workspaces can take a moment.",
24
- title: "Loading workspace"
25
- })
26
- });
27
- //#endregion
28
- export { findWorkspaceOrThrow as n, Route as t };
@@ -1,401 +0,0 @@
1
- import { t as Button } from "./button-CmTDnzOn.js";
2
- import { a as deleteCursorWorkspaceFn, c as recoverCursorWorkspaceFn, i as deleteCursorThreadsFn, n as cursorThreadsQueryOptions, o as exportCursorThreadFn, r as cursorWorkspacesQueryOptions, s as exportCursorThreadsFn } from "./cursor-queries-NCIM0Nat.js";
3
- import { n as findWorkspaceOrThrow, t as Route } from "./cursor._workspaceKey-CZuohIUL.js";
4
- import { t as DataTable } from "./data-table-Cdct823O.js";
5
- import { t as PageHeader } from "./page-header-VNSaM3xd.js";
6
- import { n as formatBytes, o as formatNumber, r as formatDateTime } from "./formatters-FJaGZgJk.js";
7
- import { n as downloadUrlFile, t as downloadTextFile } from "./download-DMmiy1xf.js";
8
- import { i as DropdownMenuTrigger, n as DropdownMenuContent, r as DropdownMenuItem, t as DropdownMenu } from "./dropdown-menu-Dy_9t6TN.js";
9
- import { n as ListSearchInput, t as matchesTextQuery } from "./text-filter-CGKxMCKt.js";
10
- import { t as ExportDialog } from "./export-dialog-D88ze9Gy.js";
11
- import { t as DeleteConfirmDialog } from "./delete-confirm-dialog-BcBNCxWB.js";
12
- import { useDeferredValue, useMemo, useState } from "react";
13
- import { Link, useNavigate } from "@tanstack/react-router";
14
- import { jsx, jsxs } from "react/jsx-runtime";
15
- import { useMutation, useQueryClient, useSuspenseQuery } from "@tanstack/react-query";
16
- import { Download, MoreHorizontal, RefreshCcw, Trash2, X } from "lucide-react";
17
- import { createColumnHelper } from "@tanstack/react-table";
18
- //#region src/components/cursor-threads-table.tsx
19
- var columnHelper = createColumnHelper();
20
- var defaultSorting = [{
21
- desc: true,
22
- id: "updatedAt"
23
- }];
24
- var columns = (onDeleteThread, onExportThread) => [
25
- columnHelper.accessor("name", {
26
- cell: (info) => /* @__PURE__ */ jsxs(Link, {
27
- className: "block w-[16rem] max-w-[20rem] space-y-1 rounded-md outline-none transition hover:opacity-80 focus-visible:ring-2 focus-visible:ring-[var(--accent)] lg:w-auto",
28
- params: { composerId: info.row.original.composerId },
29
- to: "/cursor-threads/$composerId",
30
- children: [/* @__PURE__ */ jsx("p", {
31
- className: "truncate font-medium underline-offset-2 hover:underline",
32
- children: info.getValue()
33
- }), /* @__PURE__ */ jsxs("p", {
34
- className: "truncate text-[var(--muted-foreground)] text-xs",
35
- children: [info.row.original.mode ? `${info.row.original.mode} · ` : "", info.row.original.composerId]
36
- })]
37
- }),
38
- header: "Thread"
39
- }),
40
- columnHelper.accessor("lastUpdatedAtMs", {
41
- cell: (info) => /* @__PURE__ */ jsx("span", {
42
- className: "whitespace-nowrap text-sm",
43
- suppressHydrationWarning: true,
44
- children: formatDateTime(info.getValue())
45
- }),
46
- header: "Updated",
47
- id: "updatedAt"
48
- }),
49
- columnHelper.accessor("createdAtMs", {
50
- cell: (info) => /* @__PURE__ */ jsx("span", {
51
- className: "whitespace-nowrap text-sm",
52
- suppressHydrationWarning: true,
53
- children: formatDateTime(info.getValue())
54
- }),
55
- header: "Created",
56
- id: "createdAt"
57
- }),
58
- columnHelper.accessor("mode", {
59
- cell: (info) => /* @__PURE__ */ jsx("span", {
60
- className: "font-mono text-sm",
61
- children: info.getValue() ?? "unknown"
62
- }),
63
- header: "Mode"
64
- }),
65
- columnHelper.accessor("bubbleCount", {
66
- cell: (info) => /* @__PURE__ */ jsx("span", {
67
- className: "font-mono text-sm",
68
- children: formatNumber(info.getValue())
69
- }),
70
- header: "Messages"
71
- }),
72
- columnHelper.accessor("bubbleBytes", {
73
- cell: (info) => /* @__PURE__ */ jsx("span", {
74
- className: "font-mono text-sm",
75
- children: formatBytes(info.getValue())
76
- }),
77
- header: "Size"
78
- }),
79
- columnHelper.display({
80
- cell: (info) => /* @__PURE__ */ jsxs(DropdownMenu, { children: [/* @__PURE__ */ jsx(DropdownMenuTrigger, {
81
- asChild: true,
82
- children: /* @__PURE__ */ jsx(Button, {
83
- "aria-label": `Actions for ${info.row.original.name}`,
84
- className: "rounded-full",
85
- size: "icon",
86
- type: "button",
87
- variant: "ghost",
88
- onClick: (event) => event.stopPropagation(),
89
- children: /* @__PURE__ */ jsx(MoreHorizontal, { className: "size-4" })
90
- })
91
- }), /* @__PURE__ */ jsxs(DropdownMenuContent, {
92
- align: "end",
93
- children: [/* @__PURE__ */ jsxs(DropdownMenuItem, {
94
- disabled: info.row.original.bubbleCount === 0,
95
- onClick: () => onExportThread(info.row.original),
96
- children: [/* @__PURE__ */ jsx(Download, { className: "mr-2 size-4" }), "Export thread"]
97
- }), /* @__PURE__ */ jsxs(DropdownMenuItem, {
98
- className: "text-[var(--destructive)]",
99
- onClick: () => onDeleteThread(info.row.original),
100
- children: [/* @__PURE__ */ jsx(Trash2, { className: "mr-2 size-4" }), "Delete thread"]
101
- })]
102
- })] }),
103
- enableSorting: false,
104
- header: "",
105
- id: "actions"
106
- })
107
- ];
108
- var CursorThreadsTable = ({ onDeleteThread, onDeleteThreads, onExportThread, onExportThreads, threads }) => {
109
- return /* @__PURE__ */ jsx(DataTable, {
110
- columns: useMemo(() => columns(onDeleteThread, onExportThread), [onDeleteThread, onExportThread]),
111
- data: threads,
112
- emptyMessage: "No Cursor threads match the current workspace filter.",
113
- enableRowSelection: true,
114
- getRowId: (row) => row.composerId,
115
- initialSorting: defaultSorting,
116
- renderToolbar: ({ clearSelection, selectedRows }) => {
117
- if (selectedRows.length === 0) return /* @__PURE__ */ jsx("p", {
118
- className: "text-[var(--muted-foreground)] text-sm",
119
- children: "Select threads to export or delete them in a batch."
120
- });
121
- const selectedComposerIds = selectedRows.map((row) => row.composerId);
122
- const hasEmptySelection = selectedRows.some((row) => row.bubbleCount === 0);
123
- return /* @__PURE__ */ jsxs("div", {
124
- className: "flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",
125
- children: [/* @__PURE__ */ jsxs("p", {
126
- className: "text-sm",
127
- children: [
128
- selectedRows.length,
129
- " thread",
130
- selectedRows.length === 1 ? "" : "s",
131
- " selected"
132
- ]
133
- }), /* @__PURE__ */ jsxs("div", {
134
- className: "flex flex-wrap gap-2",
135
- children: [
136
- /* @__PURE__ */ jsxs(Button, {
137
- className: "rounded-full",
138
- disabled: hasEmptySelection,
139
- size: "sm",
140
- type: "button",
141
- variant: "outline",
142
- onClick: () => onExportThreads(selectedComposerIds),
143
- children: [/* @__PURE__ */ jsx(Download, { className: "mr-2 size-4" }), "Export selected threads"]
144
- }),
145
- /* @__PURE__ */ jsxs(Button, {
146
- className: "rounded-full border-[var(--destructive)]/20 text-[var(--destructive)]",
147
- size: "sm",
148
- type: "button",
149
- variant: "outline",
150
- onClick: () => onDeleteThreads(selectedComposerIds),
151
- children: [/* @__PURE__ */ jsx(Trash2, { className: "mr-2 size-4" }), "Delete selected threads"]
152
- }),
153
- /* @__PURE__ */ jsxs(Button, {
154
- className: "rounded-full",
155
- size: "sm",
156
- type: "button",
157
- variant: "ghost",
158
- onClick: clearSelection,
159
- children: [/* @__PURE__ */ jsx(X, { className: "mr-2 size-4" }), "Clear selection"]
160
- })
161
- ]
162
- })]
163
- });
164
- }
165
- });
166
- };
167
- //#endregion
168
- //#region src/routes/cursor.$workspaceKey.tsx?tsr-split=component
169
- var getSelectedThreads = (threads, composerIds) => {
170
- const composerIdSet = new Set(composerIds);
171
- return threads.filter((thread) => composerIdSet.has(thread.composerId));
172
- };
173
- var buildPendingCursorDelete = (threads) => {
174
- if (threads.length === 0) return null;
175
- return {
176
- kind: "threads",
177
- threads
178
- };
179
- };
180
- var buildPendingCursorExport = (threads) => {
181
- if (threads.length === 0) return null;
182
- return {
183
- composerIds: threads.map((thread) => thread.composerId),
184
- label: threads.length === 1 ? threads[0].name : `${threads.length} selected threads`
185
- };
186
- };
187
- var getCursorDeleteConfirmLabel = (pendingDelete, pending) => {
188
- if (pending) return "Deleting...";
189
- if (pendingDelete?.kind === "workspace") return "Delete workspace";
190
- return pendingDelete && pendingDelete.threads.length > 1 ? "Delete threads" : "Delete thread";
191
- };
192
- var getCursorDeleteDescription = (pendingDelete) => {
193
- if (!pendingDelete) return "";
194
- if (pendingDelete.kind === "workspace") return `Permanently delete every thread for "${pendingDelete.workspace.label}" from Cursor's database and remove any on-disk transcript directories. Quit Cursor first. This cannot be undone.`;
195
- if (pendingDelete.threads.length === 1) return `Permanently delete "${pendingDelete.threads[0].name}" from Cursor's database and remove any on-disk transcript directories. Quit Cursor first. This cannot be undone.`;
196
- return `Permanently delete ${pendingDelete.threads.length} selected Cursor threads and remove any on-disk transcript directories. Quit Cursor first. This cannot be undone.`;
197
- };
198
- var getCursorDeleteTitle = (pendingDelete) => {
199
- if (pendingDelete?.kind === "workspace") return "Delete Cursor workspace?";
200
- if (pendingDelete && pendingDelete.threads.length > 1) return `Delete ${pendingDelete.threads.length} Cursor threads?`;
201
- return "Delete Cursor thread?";
202
- };
203
- var CursorWorkspacePage = () => {
204
- const navigate = useNavigate();
205
- const params = Route.useParams();
206
- const queryClient = useQueryClient();
207
- const workspaces = useSuspenseQuery(cursorWorkspacesQueryOptions()).data;
208
- const workspace = findWorkspaceOrThrow(workspaces, params.workspaceKey);
209
- const threads = useSuspenseQuery(cursorThreadsQueryOptions(workspace.key)).data;
210
- const [searchInput, setSearchInput] = useState("");
211
- const [pendingDelete, setPendingDelete] = useState(null);
212
- const [pendingExport, setPendingExport] = useState(null);
213
- const deferredSearch = useDeferredValue(searchInput);
214
- const invalidateWorkspaceQueries = async () => {
215
- await Promise.all([queryClient.invalidateQueries({ queryKey: ["cursor-workspaces"] }), queryClient.invalidateQueries({ queryKey: ["cursor-threads", workspace.key] })]);
216
- };
217
- const recoverWorkspaceMutation = useMutation({
218
- mutationFn: () => recoverCursorWorkspaceFn({ data: {
219
- apply: true,
220
- workspaceKey: workspace.key
221
- } }),
222
- onSuccess: invalidateWorkspaceQueries
223
- });
224
- const deleteMutation = useMutation({
225
- mutationFn: (target) => target.kind === "workspace" ? deleteCursorWorkspaceFn({ data: { workspaceKey: target.workspace.key } }) : deleteCursorThreadsFn({ data: { composerIds: target.threads.map((thread) => thread.composerId) } }),
226
- onSuccess: async (_result, target) => {
227
- if (target.kind === "workspace") {
228
- await navigate({ to: "/cursor" });
229
- await queryClient.invalidateQueries({ queryKey: ["cursor-workspaces"] });
230
- setPendingDelete(null);
231
- return;
232
- }
233
- await invalidateWorkspaceQueries();
234
- setPendingDelete(null);
235
- }
236
- });
237
- const exportMutation = useMutation({
238
- mutationFn: async (options) => {
239
- if (!pendingExport) throw new Error("No thread selected for export");
240
- const download = pendingExport.composerIds.length === 1 ? await exportCursorThreadFn({ data: {
241
- ...options,
242
- composerId: pendingExport.composerIds[0]
243
- } }) : await exportCursorThreadsFn({ data: {
244
- ...options,
245
- composerIds: pendingExport.composerIds
246
- } });
247
- if (download.mode === "download") {
248
- downloadTextFile(download.fileName, download.content, download.mimeType);
249
- return;
250
- }
251
- await downloadUrlFile(download.fileName, download.downloadUrl);
252
- },
253
- onSuccess: () => {
254
- setPendingExport(null);
255
- }
256
- });
257
- const visibleThreads = threads.filter((thread) => matchesTextQuery(deferredSearch, [
258
- thread.name,
259
- thread.composerId,
260
- thread.mode,
261
- thread.workspaceLabel
262
- ]));
263
- const openDeleteForSelectedThreads = (composerIds) => {
264
- const nextPendingDelete = buildPendingCursorDelete(getSelectedThreads(visibleThreads, composerIds));
265
- if (nextPendingDelete) setPendingDelete(nextPendingDelete);
266
- };
267
- const openExportForSelectedThreads = (composerIds) => {
268
- const nextPendingExport = buildPendingCursorExport(getSelectedThreads(visibleThreads, composerIds));
269
- if (nextPendingExport) setPendingExport(nextPendingExport);
270
- };
271
- return /* @__PURE__ */ jsxs("div", {
272
- className: "space-y-6",
273
- children: [
274
- /* @__PURE__ */ jsx(PageHeader, {
275
- actions: /* @__PURE__ */ jsx(CursorWorkspaceHeaderActions, {
276
- deletePending: deleteMutation.isPending,
277
- recoverPending: recoverWorkspaceMutation.isPending,
278
- searchInput,
279
- workspace,
280
- onDeleteWorkspace: () => setPendingDelete({
281
- kind: "workspace",
282
- workspace
283
- }),
284
- onRecoverWorkspace: () => recoverWorkspaceMutation.mutate(),
285
- onSearchInputChange: setSearchInput
286
- }),
287
- eyebrow: "Cursor workspace",
288
- subtitle: "Sort by any column, export thread transcripts, delete stale records, or repair split storage buckets for this workspace.",
289
- title: workspace.label
290
- }),
291
- /* @__PURE__ */ jsx(CursorWorkspaceRecoveryNotice, { workspace }),
292
- /* @__PURE__ */ jsx(CursorThreadsTable, {
293
- onDeleteThread: (thread) => setPendingDelete({
294
- kind: "threads",
295
- threads: [thread]
296
- }),
297
- onDeleteThreads: openDeleteForSelectedThreads,
298
- onExportThread: (thread) => setPendingExport({
299
- composerIds: [thread.composerId],
300
- label: thread.name
301
- }),
302
- onExportThreads: openExportForSelectedThreads,
303
- threads: visibleThreads
304
- }),
305
- /* @__PURE__ */ jsx(CursorWorkspaceErrors, {
306
- deleteError: deleteMutation.isError ? deleteMutation.error : null,
307
- exportError: exportMutation.isError ? exportMutation.error : null,
308
- recoverError: recoverWorkspaceMutation.isError ? recoverWorkspaceMutation.error : null
309
- }),
310
- /* @__PURE__ */ jsx(CursorWorkspaceDeleteDialog, {
311
- pending: deleteMutation.isPending,
312
- pendingDelete,
313
- onConfirm: () => {
314
- if (!pendingDelete) return;
315
- deleteMutation.mutate(pendingDelete);
316
- },
317
- onOpenChange: (open) => {
318
- if (!open) setPendingDelete(null);
319
- }
320
- }),
321
- /* @__PURE__ */ jsx(ExportDialog, {
322
- forceZipArchive: pendingExport ? pendingExport.composerIds.length > 1 : false,
323
- open: pendingExport !== null,
324
- pending: exportMutation.isPending,
325
- title: pendingExport ? `Export ${pendingExport.label}` : "Export thread",
326
- onExport: (options) => exportMutation.mutate(options),
327
- onOpenChange: (open) => {
328
- if (!open) setPendingExport(null);
329
- }
330
- })
331
- ]
332
- });
333
- };
334
- var CursorWorkspaceHeaderActions = ({ deletePending, recoverPending, searchInput, workspace, onDeleteWorkspace, onRecoverWorkspace, onSearchInputChange }) => {
335
- return /* @__PURE__ */ jsxs("div", {
336
- className: "flex flex-col gap-2 sm:flex-row",
337
- children: [
338
- workspace.needsRecovery ? /* @__PURE__ */ jsxs(Button, {
339
- className: "rounded-full",
340
- disabled: recoverPending,
341
- type: "button",
342
- variant: "outline",
343
- onClick: onRecoverWorkspace,
344
- children: [/* @__PURE__ */ jsx(RefreshCcw, { className: "mr-2 size-4" }), recoverPending ? "Recovering..." : "Recover"]
345
- }) : null,
346
- /* @__PURE__ */ jsxs(Button, {
347
- className: "rounded-full",
348
- disabled: deletePending,
349
- type: "button",
350
- variant: "outline",
351
- onClick: onDeleteWorkspace,
352
- children: [/* @__PURE__ */ jsx(Trash2, { className: "mr-2 size-4" }), "Delete workspace"]
353
- }),
354
- /* @__PURE__ */ jsx(ListSearchInput, {
355
- placeholder: "Search thread name, id, or mode",
356
- value: searchInput,
357
- onValueChange: onSearchInputChange
358
- })
359
- ]
360
- });
361
- };
362
- var CursorWorkspaceRecoveryNotice = ({ workspace }) => {
363
- if (!workspace.needsRecovery) return null;
364
- return /* @__PURE__ */ jsxs("div", {
365
- className: "rounded-xl border border-[var(--border)] bg-[var(--panel)] px-4 py-4",
366
- children: [/* @__PURE__ */ jsx("p", {
367
- className: "font-medium text-sm",
368
- children: "This workspace has threads in an older storage bucket."
369
- }), /* @__PURE__ */ jsx("p", {
370
- className: "mt-1 text-[var(--muted-foreground)] text-xs",
371
- children: "Recover merges those threads into the active bucket Cursor reads now so they reappear in Chat History. Quit Cursor before running it."
372
- })]
373
- });
374
- };
375
- var CursorWorkspaceErrors = ({ deleteError, exportError, recoverError }) => {
376
- const entries = [
377
- recoverError ? recoverError.message : null,
378
- deleteError ? deleteError.message : null,
379
- exportError ? exportError.message : null
380
- ].filter(Boolean);
381
- if (entries.length === 0) return null;
382
- return /* @__PURE__ */ jsx("div", {
383
- className: "space-y-1",
384
- children: entries.map((message) => /* @__PURE__ */ jsx("p", {
385
- className: "text-[var(--destructive)] text-sm",
386
- children: message
387
- }, message))
388
- });
389
- };
390
- var CursorWorkspaceDeleteDialog = ({ pending, pendingDelete, onConfirm, onOpenChange }) => {
391
- return /* @__PURE__ */ jsx(DeleteConfirmDialog, {
392
- confirmLabel: getCursorDeleteConfirmLabel(pendingDelete, pending),
393
- description: getCursorDeleteDescription(pendingDelete),
394
- open: pendingDelete !== null,
395
- title: getCursorDeleteTitle(pendingDelete),
396
- onConfirm,
397
- onOpenChange
398
- });
399
- };
400
- //#endregion
401
- export { CursorWorkspacePage as component };
@@ -1,11 +0,0 @@
1
- import { t as ReloadErrorPanel } from "./reload-error-panel-BJMxY3U1.js";
2
- import { jsx } from "react/jsx-runtime";
3
- //#region src/routes/cursor.$workspaceKey.tsx?tsr-split=errorComponent
4
- var CursorWorkspaceErrorComponent = ({ error }) => {
5
- return /* @__PURE__ */ jsx(ReloadErrorPanel, {
6
- description: error.message,
7
- title: "Failed to load Cursor workspace"
8
- });
9
- };
10
- //#endregion
11
- export { CursorWorkspaceErrorComponent as errorComponent };
@@ -1,11 +0,0 @@
1
- import { t as ReloadErrorPanel } from "./reload-error-panel-BJMxY3U1.js";
2
- import { jsx } from "react/jsx-runtime";
3
- //#region src/routes/cursor.index.tsx?tsr-split=errorComponent
4
- var CursorErrorComponent = ({ error }) => {
5
- return /* @__PURE__ */ jsx(ReloadErrorPanel, {
6
- description: error.message,
7
- title: "Failed to load Cursor workspaces"
8
- });
9
- };
10
- //#endregion
11
- export { CursorErrorComponent as errorComponent };