spiracha 1.4.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 (319) hide show
  1. package/AGENTS.md +116 -164
  2. package/README.md +92 -237
  3. package/apps/ui/AGENTS.md +36 -7
  4. package/apps/ui/README.md +79 -6
  5. package/apps/ui/components.json +21 -0
  6. package/apps/ui/package.json +65 -0
  7. package/apps/ui/{dist/client → public}/icon.svg +2 -1
  8. package/apps/ui/src/components/antigravity-conversations-table.tsx +206 -0
  9. package/apps/ui/src/components/antigravity-keychain-panel.tsx +76 -0
  10. package/apps/ui/src/components/antigravity-workspaces-table.tsx +63 -0
  11. package/apps/ui/src/components/app-shell.tsx +124 -0
  12. package/apps/ui/src/components/breadcrumbs.tsx +53 -0
  13. package/apps/ui/src/components/claude-code-sessions-table.tsx +114 -0
  14. package/apps/ui/src/components/claude-code-workspaces-table.tsx +55 -0
  15. package/apps/ui/src/components/cursor-threads-table.tsx +189 -0
  16. package/apps/ui/src/components/cursor-workspaces-table.tsx +140 -0
  17. package/apps/ui/src/components/data-table.tsx +241 -0
  18. package/apps/ui/src/components/delete-confirm-dialog.tsx +88 -0
  19. package/apps/ui/src/components/export-dialog.tsx +184 -0
  20. package/apps/ui/src/components/json-panel.tsx +17 -0
  21. package/apps/ui/src/components/kiro-sessions-table.tsx +112 -0
  22. package/apps/ui/src/components/kiro-workspaces-table.tsx +53 -0
  23. package/apps/ui/src/components/list-search-input.tsx +18 -0
  24. package/apps/ui/src/components/loading-panel.tsx +23 -0
  25. package/apps/ui/src/components/metadata-section.tsx +31 -0
  26. package/apps/ui/src/components/metric-card.tsx +19 -0
  27. package/apps/ui/src/components/opencode-sessions-table.tsx +128 -0
  28. package/apps/ui/src/components/opencode-workspaces-table.tsx +57 -0
  29. package/apps/ui/src/components/page-header.tsx +33 -0
  30. package/apps/ui/src/components/projects-loading-state.tsx +74 -0
  31. package/apps/ui/src/components/projects-table.tsx +108 -0
  32. package/apps/ui/src/components/qoder-sessions-table.tsx +112 -0
  33. package/apps/ui/src/components/qoder-workspaces-table.tsx +53 -0
  34. package/apps/ui/src/components/recent-threads-list.tsx +52 -0
  35. package/apps/ui/src/components/reload-error-panel.tsx +20 -0
  36. package/apps/ui/src/components/text-document-panel.tsx +19 -0
  37. package/apps/ui/src/components/theme-toggle.tsx +48 -0
  38. package/apps/ui/src/components/threads-table.tsx +202 -0
  39. package/apps/ui/src/components/transcript-view.tsx +552 -0
  40. package/apps/ui/src/components/ui/alert-dialog.tsx +160 -0
  41. package/apps/ui/src/components/ui/badge.tsx +45 -0
  42. package/apps/ui/src/components/ui/button.tsx +62 -0
  43. package/apps/ui/src/components/ui/checkbox.tsx +29 -0
  44. package/apps/ui/src/components/ui/dialog.tsx +137 -0
  45. package/apps/ui/src/components/ui/dropdown-menu.tsx +217 -0
  46. package/apps/ui/src/components/ui/input.tsx +21 -0
  47. package/apps/ui/src/components/ui/scroll-area.tsx +46 -0
  48. package/apps/ui/src/components/ui/select.tsx +163 -0
  49. package/apps/ui/src/components/ui/separator.tsx +28 -0
  50. package/apps/ui/src/components/ui/sheet.tsx +107 -0
  51. package/apps/ui/src/components/ui/skeleton.tsx +7 -0
  52. package/apps/ui/src/components/ui/table.tsx +76 -0
  53. package/apps/ui/src/components/ui/tabs.tsx +71 -0
  54. package/apps/ui/src/components/ui/tooltip.tsx +44 -0
  55. package/apps/ui/src/integrations/tanstack-query/devtools.tsx +6 -0
  56. package/apps/ui/src/integrations/tanstack-query/root-provider.tsx +10 -0
  57. package/apps/ui/src/lib/antigravity-conversation-state.ts +28 -0
  58. package/apps/ui/src/lib/antigravity-queries.ts +33 -0
  59. package/apps/ui/src/lib/antigravity-server.ts +128 -0
  60. package/apps/ui/src/lib/antigravity-transcript-events.ts +335 -0
  61. package/apps/ui/src/lib/claude-code-queries.ts +26 -0
  62. package/apps/ui/src/lib/claude-code-server.ts +75 -0
  63. package/apps/ui/src/lib/claude-code-transcript-events.ts +154 -0
  64. package/apps/ui/src/lib/codex-queries.ts +66 -0
  65. package/apps/ui/src/lib/codex-server.ts +209 -0
  66. package/apps/ui/src/lib/cursor-queries.ts +37 -0
  67. package/apps/ui/src/lib/cursor-server.ts +272 -0
  68. package/apps/ui/src/lib/cursor-transcript-events.ts +229 -0
  69. package/apps/ui/src/lib/download.ts +166 -0
  70. package/apps/ui/src/lib/formatters.ts +149 -0
  71. package/apps/ui/src/lib/kiro-queries.ts +22 -0
  72. package/apps/ui/src/lib/kiro-server.ts +73 -0
  73. package/apps/ui/src/lib/kiro-transcript-events.ts +113 -0
  74. package/apps/ui/src/lib/opencode-queries.ts +37 -0
  75. package/apps/ui/src/lib/opencode-server.ts +73 -0
  76. package/apps/ui/src/lib/opencode-transcript-events.ts +221 -0
  77. package/apps/ui/src/lib/package-metadata.ts +16 -0
  78. package/apps/ui/src/lib/path-utils.ts +13 -0
  79. package/apps/ui/src/lib/qoder-queries.ts +22 -0
  80. package/apps/ui/src/lib/qoder-server.ts +79 -0
  81. package/apps/ui/src/lib/qoder-transcript-events.ts +139 -0
  82. package/apps/ui/src/lib/route-search.ts +68 -0
  83. package/apps/ui/src/lib/settings-store.tsx +59 -0
  84. package/apps/ui/src/lib/source-session-export-server.ts +56 -0
  85. package/apps/ui/src/lib/text-filter.ts +22 -0
  86. package/apps/ui/src/lib/thread-id.ts +3 -0
  87. package/apps/ui/src/lib/thread-transcript-stats.ts +57 -0
  88. package/apps/ui/src/lib/utils.ts +7 -0
  89. package/apps/ui/src/routeTree.gen.ts +730 -0
  90. package/apps/ui/src/router.tsx +20 -0
  91. package/apps/ui/src/routes/$threadId.tsx +22 -0
  92. package/apps/ui/src/routes/__root.tsx +127 -0
  93. package/apps/ui/src/routes/analytics.tsx +143 -0
  94. package/apps/ui/src/routes/antigravity-conversations.$conversationId.tsx +438 -0
  95. package/apps/ui/src/routes/antigravity.$workspaceKey.tsx +127 -0
  96. package/apps/ui/src/routes/antigravity.index.tsx +51 -0
  97. package/apps/ui/src/routes/api.v1.conversation-query.ts +12 -0
  98. package/apps/ui/src/routes/api.v1.conversations.$source.$id.export.ts +12 -0
  99. package/apps/ui/src/routes/api.v1.conversations.$source.$id.ts +12 -0
  100. package/apps/ui/src/routes/api.v1.conversations.ts +12 -0
  101. package/apps/ui/src/routes/api.v1.resolve.ts +12 -0
  102. package/apps/ui/src/routes/api.v1.sources.ts +12 -0
  103. package/apps/ui/src/routes/claude-code-sessions.$sessionId.tsx +342 -0
  104. package/apps/ui/src/routes/claude-code.$workspaceKey.tsx +135 -0
  105. package/apps/ui/src/routes/claude-code.index.tsx +48 -0
  106. package/apps/ui/src/routes/codex.$project.tsx +390 -0
  107. package/apps/ui/src/routes/codex.index.tsx +116 -0
  108. package/apps/ui/src/routes/cursor-threads.$composerId.tsx +435 -0
  109. package/apps/ui/src/routes/cursor.$workspaceKey.tsx +416 -0
  110. package/apps/ui/src/routes/cursor.index.tsx +120 -0
  111. package/apps/ui/src/routes/index.tsx +124 -0
  112. package/apps/ui/src/routes/kiro-sessions.$sessionId.tsx +345 -0
  113. package/apps/ui/src/routes/kiro.$workspaceKey.tsx +136 -0
  114. package/apps/ui/src/routes/kiro.index.tsx +48 -0
  115. package/apps/ui/src/routes/opencode-sessions.$sessionId.tsx +334 -0
  116. package/apps/ui/src/routes/opencode.$workspaceKey.tsx +135 -0
  117. package/apps/ui/src/routes/opencode.index.tsx +48 -0
  118. package/apps/ui/src/routes/qoder-sessions.$sessionId.tsx +341 -0
  119. package/apps/ui/src/routes/qoder.$workspaceKey.tsx +139 -0
  120. package/apps/ui/src/routes/qoder.index.tsx +48 -0
  121. package/apps/ui/src/routes/settings.tsx +91 -0
  122. package/apps/ui/src/routes/threads.$threadId.tsx +619 -0
  123. package/apps/ui/src/styles.css +122 -0
  124. package/apps/ui/tsconfig.json +29 -0
  125. package/apps/ui/vite.config.ts +84 -0
  126. package/bin/spiracha.ts +32 -0
  127. package/package.json +50 -60
  128. package/src/client.ts +290 -0
  129. package/src/lib/antigravity-db.ts +213 -19
  130. package/src/lib/antigravity-exporter-types.ts +1 -0
  131. package/src/lib/claude-code-db.ts +655 -0
  132. package/src/lib/claude-code-exporter-types.ts +110 -0
  133. package/src/lib/claude-code-transcript-phase.ts +25 -0
  134. package/src/lib/claude-code-transcript.ts +180 -0
  135. package/src/lib/codex-analytics.ts +1 -1
  136. package/src/lib/codex-browser-db.ts +856 -61
  137. package/src/lib/codex-browser-export.ts +24 -16
  138. package/src/lib/codex-browser-types.ts +1 -1
  139. package/src/lib/codex-thread-cache.ts +17 -1
  140. package/src/lib/{codex-exporter-types.ts → codex-thread-types.ts} +2 -30
  141. package/src/lib/{codex-exporter-transcript.ts → codex-transcript-renderer.ts} +64 -28
  142. package/src/lib/concurrency.ts +25 -0
  143. package/src/lib/conversation-api.ts +792 -0
  144. package/src/lib/conversation-data/adapter-helpers.ts +110 -0
  145. package/src/lib/conversation-data/antigravity-adapter.ts +148 -0
  146. package/src/lib/conversation-data/claude-code-adapter.ts +175 -0
  147. package/src/lib/conversation-data/codex-adapter.ts +245 -0
  148. package/src/lib/conversation-data/cursor-adapter.ts +171 -0
  149. package/src/lib/conversation-data/index.ts +311 -0
  150. package/src/lib/conversation-data/kiro-adapter.ts +140 -0
  151. package/src/lib/conversation-data/message-selector.ts +37 -0
  152. package/src/lib/conversation-data/opencode-adapter.ts +180 -0
  153. package/src/lib/conversation-data/path-match.ts +79 -0
  154. package/src/lib/conversation-data/qoder-adapter.ts +230 -0
  155. package/src/lib/conversation-data/types.ts +116 -0
  156. package/src/lib/cursor-db.ts +67 -21
  157. package/src/lib/cursor-exporter-types.ts +0 -19
  158. package/src/lib/kiro-db.ts +949 -0
  159. package/src/lib/kiro-exporter-types.ts +100 -0
  160. package/src/lib/kiro-transcript-phase.ts +41 -0
  161. package/src/lib/kiro-transcript.ts +115 -0
  162. package/src/lib/opencode-db.ts +610 -0
  163. package/src/lib/opencode-exporter-types.ts +129 -0
  164. package/src/lib/opencode-think-tags.ts +126 -0
  165. package/src/lib/opencode-transcript-phase.ts +50 -0
  166. package/src/lib/opencode-transcript.ts +194 -0
  167. package/src/lib/qoder-acp-client.ts +268 -0
  168. package/src/lib/qoder-db.ts +1601 -0
  169. package/src/lib/qoder-exporter-types.ts +114 -0
  170. package/src/lib/qoder-transcript-phase.ts +41 -0
  171. package/src/lib/qoder-transcript.ts +112 -0
  172. package/src/lib/shared.ts +25 -0
  173. package/src/lib/ui-export-archive.ts +61 -0
  174. package/apps/ui/dist/client/assets/_threadId-CAIeH5mq.js +0 -1
  175. package/apps/ui/dist/client/assets/analytics-DK2jdvmI.js +0 -1
  176. package/apps/ui/dist/client/assets/antigravity-conversations._conversationId-DmD0sN8X.js +0 -7
  177. package/apps/ui/dist/client/assets/antigravity-conversations._conversationId-KAcXtNxI.js +0 -1
  178. package/apps/ui/dist/client/assets/antigravity-keychain-panel-BRHVjFAM.js +0 -1
  179. package/apps/ui/dist/client/assets/antigravity._workspaceKey-ByitGWki.js +0 -1
  180. package/apps/ui/dist/client/assets/antigravity._workspaceKey-CGV7amas.js +0 -1
  181. package/apps/ui/dist/client/assets/antigravity.index-DEEkjlZa.js +0 -1
  182. package/apps/ui/dist/client/assets/antigravity.index-DgW25FEV.js +0 -1
  183. package/apps/ui/dist/client/assets/badge-DfWvPfKF.js +0 -1
  184. package/apps/ui/dist/client/assets/checkbox-CdHitXWQ.js +0 -1
  185. package/apps/ui/dist/client/assets/createServerFn-CgRRVpBH.js +0 -3
  186. package/apps/ui/dist/client/assets/cursor-threads._composerId-CmBFclK8.js +0 -1
  187. package/apps/ui/dist/client/assets/cursor-threads._composerId-Ti2gTm63.js +0 -1
  188. package/apps/ui/dist/client/assets/cursor._workspaceKey-CaAZjGmm.js +0 -1
  189. package/apps/ui/dist/client/assets/cursor._workspaceKey-DzD_c6j9.js +0 -1
  190. package/apps/ui/dist/client/assets/cursor.index-CrnMwDCi.js +0 -1
  191. package/apps/ui/dist/client/assets/cursor.index-PkCFVcl4.js +0 -2
  192. package/apps/ui/dist/client/assets/data-table-Br78_dk3.js +0 -4
  193. package/apps/ui/dist/client/assets/delete-confirm-dialog-BHRmyLHr.js +0 -11
  194. package/apps/ui/dist/client/assets/dist-B9pyYCVU.js +0 -1
  195. package/apps/ui/dist/client/assets/dist-BhZOxAPP.js +0 -1
  196. package/apps/ui/dist/client/assets/dist-DvMS2965.js +0 -1
  197. package/apps/ui/dist/client/assets/download-Bf0QJKD3.js +0 -1
  198. package/apps/ui/dist/client/assets/dropdown-menu-Dy5cLzTy.js +0 -1
  199. package/apps/ui/dist/client/assets/es2015-BkCWttyM.js +0 -41
  200. package/apps/ui/dist/client/assets/export-dialog-C86SYHJn.js +0 -1
  201. package/apps/ui/dist/client/assets/formatters-BM9kB7ed.js +0 -1
  202. package/apps/ui/dist/client/assets/index-CPvAP-jk.js +0 -149
  203. package/apps/ui/dist/client/assets/jsx-runtime-DGeXAQPT.js +0 -1
  204. package/apps/ui/dist/client/assets/metric-card-Dplm0ZiM.js +0 -1
  205. package/apps/ui/dist/client/assets/page-header-Cwa3p6Tl.js +0 -1
  206. package/apps/ui/dist/client/assets/projects._project-Ckf6muWZ.js +0 -1
  207. package/apps/ui/dist/client/assets/projects._project-DSDwH4NF.js +0 -1
  208. package/apps/ui/dist/client/assets/projects.index-DEfhWqa8.js +0 -1
  209. package/apps/ui/dist/client/assets/projects.index-V5ibNZII.js +0 -3
  210. package/apps/ui/dist/client/assets/react-dom-DL96Jor4.js +0 -1
  211. package/apps/ui/dist/client/assets/refresh-ccw-BgKjOiA6.js +0 -1
  212. package/apps/ui/dist/client/assets/reload-error-panel-AHqu0akK.js +0 -1
  213. package/apps/ui/dist/client/assets/routes-Df2tgpyd.js +0 -1
  214. package/apps/ui/dist/client/assets/scroll-text-fM0sMOB3.js +0 -1
  215. package/apps/ui/dist/client/assets/select-Bf2GwfPR.js +0 -1
  216. package/apps/ui/dist/client/assets/settings-5VQIzME0.js +0 -1
  217. package/apps/ui/dist/client/assets/sqlite-error-B6uZjUe8.js +0 -1
  218. package/apps/ui/dist/client/assets/styles-BhRkXgwB.css +0 -1
  219. package/apps/ui/dist/client/assets/tabs-OO4VU5KR.js +0 -7
  220. package/apps/ui/dist/client/assets/text-filter-DVAZySUS.js +0 -2
  221. package/apps/ui/dist/client/assets/threads._threadId-BB9tTsV4.js +0 -1
  222. package/apps/ui/dist/client/assets/threads._threadId-BgDhFj2I.js +0 -1
  223. package/apps/ui/dist/client/assets/useMutation-CC_B7uy5.js +0 -1
  224. package/apps/ui/dist/client/assets/useQuery-C5By6WKU.js +0 -1
  225. package/apps/ui/dist/server/assets/_tanstack-start-manifest_v-CRW2kqj0.js +0 -232
  226. package/apps/ui/dist/server/assets/_threadId-B6SrBR9E.js +0 -6
  227. package/apps/ui/dist/server/assets/analytics-CYP_LT5Y.js +0 -16
  228. package/apps/ui/dist/server/assets/analytics-CtpOMVMO.js +0 -146
  229. package/apps/ui/dist/server/assets/antigravity-conversation-state-HgzS302O.js +0 -16
  230. package/apps/ui/dist/server/assets/antigravity-conversations._conversationId-BtexWY-K.js +0 -613
  231. package/apps/ui/dist/server/assets/antigravity-conversations._conversationId-D426O-64.js +0 -11
  232. package/apps/ui/dist/server/assets/antigravity-conversations._conversationId-zMrR6v6R.js +0 -20
  233. package/apps/ui/dist/server/assets/antigravity-db-Bh8_U9uw.js +0 -580
  234. package/apps/ui/dist/server/assets/antigravity-keychain-DOiuHDwK.js +0 -126
  235. package/apps/ui/dist/server/assets/antigravity-keychain-panel-CC7FLmAK.js +0 -55
  236. package/apps/ui/dist/server/assets/antigravity-queries-CGrJO9Vr.js +0 -37
  237. package/apps/ui/dist/server/assets/antigravity-server-CHRjVFqN.js +0 -114
  238. package/apps/ui/dist/server/assets/antigravity._workspaceKey-3m_MzNFA.js +0 -11
  239. package/apps/ui/dist/server/assets/antigravity._workspaceKey-B0QeYUOh.js +0 -28
  240. package/apps/ui/dist/server/assets/antigravity._workspaceKey-C3kP-qyN.js +0 -210
  241. package/apps/ui/dist/server/assets/antigravity.index-CPCYkqCi.js +0 -104
  242. package/apps/ui/dist/server/assets/antigravity.index-DudTB3Tq.js +0 -11
  243. package/apps/ui/dist/server/assets/badge-EvdhKK_Z.js +0 -26
  244. package/apps/ui/dist/server/assets/button-CmTDnzOn.js +0 -46
  245. package/apps/ui/dist/server/assets/checkbox-C0hovF41.js +0 -19
  246. package/apps/ui/dist/server/assets/codex-queries-CtgeZ7VL.js +0 -99
  247. package/apps/ui/dist/server/assets/codex-server-CNXSJuc2.js +0 -2004
  248. package/apps/ui/dist/server/assets/concurrency-VXtYvlGh.js +0 -18
  249. package/apps/ui/dist/server/assets/createServerRpc-CF_DEwnm.js +0 -12
  250. package/apps/ui/dist/server/assets/createSsrRpc-C754NPki.js +0 -16
  251. package/apps/ui/dist/server/assets/cursor-db-cYZEU3WQ.js +0 -830
  252. package/apps/ui/dist/server/assets/cursor-exporter-types-CI3goo-c.js +0 -34
  253. package/apps/ui/dist/server/assets/cursor-queries-NCIM0Nat.js +0 -67
  254. package/apps/ui/dist/server/assets/cursor-recovery-nq-kR62j.js +0 -361
  255. package/apps/ui/dist/server/assets/cursor-server-C3q7hrp-.js +0 -213
  256. package/apps/ui/dist/server/assets/cursor-threads._composerId-BB0Y_Mao.js +0 -11
  257. package/apps/ui/dist/server/assets/cursor-threads._composerId-BPJFWfJj.js +0 -18
  258. package/apps/ui/dist/server/assets/cursor-threads._composerId-BkMMTQ3v.js +0 -582
  259. package/apps/ui/dist/server/assets/cursor-transcript-2iL3KFSK.js +0 -125
  260. package/apps/ui/dist/server/assets/cursor._workspaceKey-C5PdTaKB.js +0 -28
  261. package/apps/ui/dist/server/assets/cursor._workspaceKey-Ckj7apKI.js +0 -401
  262. package/apps/ui/dist/server/assets/cursor._workspaceKey-nmg3YIOQ.js +0 -11
  263. package/apps/ui/dist/server/assets/cursor.index-CcsX7DG0.js +0 -11
  264. package/apps/ui/dist/server/assets/cursor.index-DkWT-mxw.js +0 -189
  265. package/apps/ui/dist/server/assets/data-table-Cdct823O.js +0 -189
  266. package/apps/ui/dist/server/assets/delete-confirm-dialog-BcBNCxWB.js +0 -144
  267. package/apps/ui/dist/server/assets/download-DMmiy1xf.js +0 -92
  268. package/apps/ui/dist/server/assets/dropdown-menu-Dy_9t6TN.js +0 -36
  269. package/apps/ui/dist/server/assets/empty-plugin-adapters-B3lHh1La.js +0 -5
  270. package/apps/ui/dist/server/assets/export-dialog-BItjWgkZ.js +0 -240
  271. package/apps/ui/dist/server/assets/formatters-FJaGZgJk.js +0 -91
  272. package/apps/ui/dist/server/assets/loading-panel-BGFnWseS.js +0 -27
  273. package/apps/ui/dist/server/assets/metric-card-ByEeLu0r.js +0 -23
  274. package/apps/ui/dist/server/assets/model-label-B1NWGc65.js +0 -13
  275. package/apps/ui/dist/server/assets/page-header-VNSaM3xd.js +0 -29
  276. package/apps/ui/dist/server/assets/path-transforms-DL2IwtYd.js +0 -31
  277. package/apps/ui/dist/server/assets/projects._project-Bpbc3C-L.js +0 -20
  278. package/apps/ui/dist/server/assets/projects._project-Bshqk7JA.js +0 -12
  279. package/apps/ui/dist/server/assets/projects._project-CvZho6EQ.js +0 -395
  280. package/apps/ui/dist/server/assets/projects.index-BLXOx5eL.js +0 -12
  281. package/apps/ui/dist/server/assets/projects.index-BkLiF2FF.js +0 -182
  282. package/apps/ui/dist/server/assets/projects.index-DesYXwfi.js +0 -14
  283. package/apps/ui/dist/server/assets/reload-error-panel-BJMxY3U1.js +0 -25
  284. package/apps/ui/dist/server/assets/route-search-ts4W9MJ9.js +0 -38
  285. package/apps/ui/dist/server/assets/router-6m-ihwqA.js +0 -410
  286. package/apps/ui/dist/server/assets/routes-Bsact1uB.js +0 -184
  287. package/apps/ui/dist/server/assets/routes-BzkJgq4W.js +0 -34
  288. package/apps/ui/dist/server/assets/select-GW76p-ld.js +0 -76
  289. package/apps/ui/dist/server/assets/settings-OayxIYQQ.js +0 -100
  290. package/apps/ui/dist/server/assets/settings-store-DpEJEQ7M.js +0 -52
  291. package/apps/ui/dist/server/assets/shared-CPRNYIql.js +0 -134
  292. package/apps/ui/dist/server/assets/sqlite-error-LZDrnxdd.js +0 -13
  293. package/apps/ui/dist/server/assets/start-CI_0bSiY.js +0 -4
  294. package/apps/ui/dist/server/assets/tabs-CGA13IZM.js +0 -502
  295. package/apps/ui/dist/server/assets/text-filter-CGKxMCKt.js +0 -36
  296. package/apps/ui/dist/server/assets/threads._threadId-BSSK4nkI.js +0 -26
  297. package/apps/ui/dist/server/assets/threads._threadId-Bs0yuqO9.js +0 -18
  298. package/apps/ui/dist/server/assets/threads._threadId-D2GYkVn6.js +0 -639
  299. package/apps/ui/dist/server/assets/ui-export-files-BHLX9bhN.js +0 -83
  300. package/apps/ui/dist/server/assets/utils-C_uf36nf.js +0 -8
  301. package/apps/ui/dist/server/server.js +0 -5847
  302. package/bin/codex-chats-claude.js +0 -5
  303. package/bin/codex-chats.js +0 -5
  304. package/bin/spiracha.js +0 -5
  305. package/src/export-chats.ts +0 -120
  306. package/src/export-claude.ts +0 -36
  307. package/src/export-cursor.ts +0 -244
  308. package/src/lib/claude-exporter.ts +0 -864
  309. package/src/lib/codex-exporter-cli.ts +0 -277
  310. package/src/lib/codex-exporter-db.ts +0 -319
  311. package/src/lib/codex-exporter.ts +0 -115
  312. package/src/lib/cursor-exporter.ts +0 -266
  313. package/src/lib/interactive-cli.ts +0 -433
  314. package/src/lib/native-open.ts +0 -54
  315. package/src/mcp-server.ts +0 -137
  316. package/src/spiracha.ts +0 -116
  317. package/src/ui-cli.ts +0 -310
  318. /package/apps/ui/{dist/client → public}/manifest.json +0 -0
  319. /package/apps/ui/{dist/client → public}/robots.txt +0 -0
@@ -1,5 +0,0 @@
1
- #!/usr/bin/env bun
2
-
3
- import { runExportClaudeCli } from '../src/export-claude.ts';
4
-
5
- await runExportClaudeCli();
@@ -1,5 +0,0 @@
1
- #!/usr/bin/env bun
2
-
3
- import { runExportChatsCli } from '../src/export-chats.ts';
4
-
5
- await runExportChatsCli();
package/bin/spiracha.js DELETED
@@ -1,5 +0,0 @@
1
- #!/usr/bin/env bun
2
-
3
- import { runSpirachaCli } from '../src/spiracha.ts';
4
-
5
- await runSpirachaCli();
@@ -1,120 +0,0 @@
1
- #!/usr/bin/env bun
2
-
3
- import { lstat } from 'node:fs/promises';
4
- import path from 'node:path';
5
- import { stdin as input, stdout as output } from 'node:process';
6
- import { createInterface } from 'node:readline/promises';
7
- import { getCodexHelpText, parseCodexCliArgs, runCodexExport } from './lib/codex-exporter';
8
- import type { InteractiveExportResult } from './lib/interactive-cli';
9
- import { openPathNatively } from './lib/native-open';
10
- import { CliUsageError } from './lib/shared';
11
-
12
- export const runExportChatsCli = async (argv = process.argv.slice(2)): Promise<void> => {
13
- if (argv.includes('--help') || argv.includes('-h')) {
14
- console.log(getCodexHelpText());
15
- return;
16
- }
17
-
18
- try {
19
- if (shouldRunInteractive(argv)) {
20
- await runInteractiveCliFlow();
21
- return;
22
- }
23
-
24
- await runCodexCliFlow(argv);
25
- } catch (error) {
26
- if (error instanceof CliUsageError) {
27
- console.error(error.message);
28
- console.error('');
29
- console.error(getCodexHelpText());
30
- process.exit(1);
31
- }
32
-
33
- if (error instanceof Error) {
34
- console.error(error.message);
35
- process.exit(1);
36
- }
37
-
38
- throw error;
39
- }
40
- };
41
-
42
- const shouldRunInteractive = (argv: string[]): boolean => {
43
- return argv.length === 0 || argv.includes('--interactive');
44
- };
45
-
46
- const runInteractiveCliFlow = async (): Promise<void> => {
47
- const { runInteractiveExport } = await import('./lib/interactive-cli');
48
- const result = await runInteractiveExport();
49
- const targetFolder = await printInteractiveExportResult(result);
50
- await maybeOpenExportFolder(targetFolder);
51
- };
52
-
53
- const runCodexCliFlow = async (argv: string[]): Promise<void> => {
54
- const options = parseCodexCliArgs(argv);
55
- const result = await runCodexExport(options);
56
- printCodexExportResult(result);
57
- };
58
-
59
- const printInteractiveExportResult = async (result: InteractiveExportResult): Promise<string> => {
60
- if (result.mode === 'claude') {
61
- console.log(`Exported ${result.sourcePath} -> ${result.outputPath}`);
62
- return resolveExportFolder(result.outputPath);
63
- }
64
-
65
- printCodexExportFiles(result.files);
66
- printMissingThreadWarnings(result.missingThreadIds);
67
- console.log(`Done. Exported ${result.exportedCount} chat(s) to ${result.outputDir}`);
68
- return result.outputDir;
69
- };
70
-
71
- const printCodexExportResult = (result: Awaited<ReturnType<typeof runCodexExport>>): void => {
72
- printCodexExportFiles(result.files);
73
- printMissingThreadWarnings(result.missingThreadIds);
74
- console.log(`Done. Exported ${result.exportedCount} chat(s) to ${result.outputDir}`);
75
- };
76
-
77
- const printCodexExportFiles = (files: Awaited<ReturnType<typeof runCodexExport>>['files']): void => {
78
- for (const file of files) {
79
- console.log(`Exported ${file.sourcePath} -> ${file.outputPath}`);
80
- }
81
- };
82
-
83
- const printMissingThreadWarnings = (missingThreadIds: string[]): void => {
84
- if (missingThreadIds.length > 0) {
85
- console.warn(
86
- `Warning: ${missingThreadIds.length} requested thread(s) were not found: ${missingThreadIds.join(', ')}`,
87
- );
88
- }
89
- };
90
-
91
- const maybeOpenExportFolder = async (targetFolder: string): Promise<void> => {
92
- const rl = createInterface({ input, output });
93
- try {
94
- while (true) {
95
- const answer = (await rl.question('Open the exported folder now? [y/N]: ')).trim().toLowerCase();
96
- if (!answer || answer === 'n' || answer === 'no') {
97
- return;
98
- }
99
- if (answer === 'y' || answer === 'yes') {
100
- await openPathNatively(targetFolder);
101
- return;
102
- }
103
- console.log('Please answer y or n.');
104
- }
105
- } finally {
106
- rl.close();
107
- }
108
- };
109
-
110
- const resolveExportFolder = async (targetPath: string): Promise<string> => {
111
- const stats = await lstat(targetPath).catch(() => null);
112
- if (stats?.isDirectory()) {
113
- return targetPath;
114
- }
115
- return path.dirname(targetPath);
116
- };
117
-
118
- if (import.meta.main) {
119
- await runExportChatsCli();
120
- }
@@ -1,36 +0,0 @@
1
- #!/usr/bin/env bun
2
-
3
- import { getClaudeHelpText, parseClaudeCliArgs, runClaudeExport } from './lib/claude-exporter';
4
- import { CliUsageError } from './lib/shared';
5
-
6
- export const runExportClaudeCli = async (argv = process.argv.slice(2)): Promise<void> => {
7
- if (argv.includes('--help') || argv.includes('-h')) {
8
- console.log(getClaudeHelpText());
9
- return;
10
- }
11
-
12
- try {
13
- const options = parseClaudeCliArgs(argv);
14
- const result = await runClaudeExport(options);
15
-
16
- console.log(`Exported ${result.sourcePath} -> ${result.outputPath}`);
17
- } catch (error) {
18
- if (error instanceof CliUsageError) {
19
- console.error(error.message);
20
- console.error('');
21
- console.error(getClaudeHelpText());
22
- process.exit(1);
23
- }
24
-
25
- if (error instanceof Error) {
26
- console.error(error.message);
27
- process.exit(1);
28
- }
29
-
30
- throw error;
31
- }
32
- };
33
-
34
- if (import.meta.main) {
35
- await runExportClaudeCli();
36
- }
@@ -1,244 +0,0 @@
1
- #!/usr/bin/env bun
2
-
3
- import { stdin as input, stdout as output } from 'node:process';
4
- import { createInterface } from 'node:readline/promises';
5
- import { findCursorWorkspaceGroups, listCursorThreadsForGroup, listCursorWorkspaceGroups } from './lib/cursor-db';
6
- import { getCursorHelpText, parseCursorCliArgs, runCursorExport } from './lib/cursor-exporter';
7
- import { type CursorThreadSummary, type CursorWorkspaceGroup, resolveCursorUserDir } from './lib/cursor-exporter-types';
8
- import { isCursorRunning, pruneCursorThreads, recoverCursorWorkspaceGroup } from './lib/cursor-recovery';
9
- import { CliUsageError } from './lib/shared';
10
-
11
- type CursorSubcommand = 'list' | 'export' | 'recover' | 'prune';
12
-
13
- const PRUNE_CONFIRM_PHRASE = 'delete permanently';
14
-
15
- const resolveSubcommand = (argv: string[]): { subcommand: CursorSubcommand; rest: string[] } => {
16
- const [first, ...rest] = argv;
17
- if (first === 'list' || first === 'export' || first === 'recover' || first === 'prune') {
18
- return { rest, subcommand: first };
19
- }
20
-
21
- // Default to export so `spiracha cursor <workspace>` behaves like the other exporters.
22
- return { rest: argv, subcommand: 'export' };
23
- };
24
-
25
- const promptLine = async (question: string): Promise<string> => {
26
- const rl = createInterface({ input, output });
27
- try {
28
- return (await rl.question(question)).trim();
29
- } finally {
30
- rl.close();
31
- }
32
- };
33
-
34
- const ensureCursorClosed = async (): Promise<void> => {
35
- if (await isCursorRunning()) {
36
- throw new Error('Cursor is still running. Quit Cursor completely, then run again with --apply.');
37
- }
38
- };
39
-
40
- const runCursorList = async (argv: string[]): Promise<void> => {
41
- const query = argv.find((arg) => !arg.startsWith('-')) ?? null;
42
- const groups = await listCursorWorkspaceGroups();
43
- const filtered = query ? findCursorWorkspaceGroups(groups, query) : groups;
44
-
45
- if (filtered.length === 0) {
46
- console.log('No Cursor workspaces found.');
47
- return;
48
- }
49
-
50
- console.log(`Found ${filtered.length} Cursor workspace(s):\n`);
51
- for (const group of filtered) {
52
- const recover = group.needsRecovery ? ' [needs recovery]' : '';
53
- console.log(`${group.label}${recover}`);
54
- console.log(` key: ${group.key}`);
55
- console.log(` threads: ~${group.threadCount} buckets: ${group.buckets.length}`);
56
- }
57
- console.log('\nExport with: spiracha cursor export --workspace <name> --tools --commentary');
58
- };
59
-
60
- const runCursorExportCommand = async (argv: string[]): Promise<void> => {
61
- const options = parseCursorCliArgs(argv);
62
- const result = await runCursorExport(options);
63
-
64
- if (result.exportedCount === 0) {
65
- console.log('No threads were exported.');
66
- } else {
67
- console.log(`Exported ${result.exportedCount} thread(s) to ${result.outputDir}`);
68
- for (const file of result.files) {
69
- console.log(` ${file.composerId} -> ${file.outputPath}`);
70
- }
71
- }
72
-
73
- if (result.missingThreadIds.length > 0) {
74
- console.log(`Skipped ${result.missingThreadIds.length} thread(s) with no exportable content.`);
75
- }
76
- };
77
-
78
- const resolveSingleGroupOrThrow = (groups: CursorWorkspaceGroup[], query: string): CursorWorkspaceGroup => {
79
- const matched = findCursorWorkspaceGroups(groups, query);
80
- if (matched.length === 0) {
81
- throw new Error(`No Cursor workspace matched query: ${query}`);
82
- }
83
-
84
- if (matched.length > 1) {
85
- const keys = matched.map((group) => ` - ${group.key}`).join('\n');
86
- throw new Error(`Query "${query}" matched multiple workspaces. Refine it:\n${keys}`);
87
- }
88
-
89
- return matched[0]!;
90
- };
91
-
92
- const runCursorRecover = async (argv: string[]): Promise<void> => {
93
- const apply = argv.includes('--apply');
94
- const query = argv.find((arg) => !arg.startsWith('-'));
95
- if (!query) {
96
- throw new CliUsageError('recover requires a workspace name or path.');
97
- }
98
-
99
- if (apply) {
100
- await ensureCursorClosed();
101
- }
102
-
103
- const group = resolveSingleGroupOrThrow(await listCursorWorkspaceGroups(), query);
104
- const result = await recoverCursorWorkspaceGroup(group, apply);
105
-
106
- console.log(`[${group.label}] merges ${result.mergedThreadCount} thread(s) into bucket ${result.activeBucketId}`);
107
- for (const thread of result.threads) {
108
- console.log(` - ${thread.name} [${thread.composerId.slice(0, 8)}] bubbles=${thread.bubbleCount}`);
109
- }
110
-
111
- if (!apply) {
112
- console.log('\nDry run only. Re-run with --apply after quitting Cursor.');
113
- return;
114
- }
115
-
116
- console.log(
117
- `\nRecovery complete: relinked ${result.relinkedHeaderCount}, added ${result.addedHeaderCount} header(s).`,
118
- );
119
- console.log('Reopen the project in Cursor and check Chat History.');
120
- };
121
-
122
- const selectPruneThreads = async (argv: string[]): Promise<CursorThreadSummary[]> => {
123
- const threadIds = collectFlagValues(argv, ['--thread', '-t']);
124
- const query = collectFlagValues(argv, ['--workspace', '-w'])[0] ?? argv.find((arg) => !arg.startsWith('-'));
125
- const groups = await listCursorWorkspaceGroups();
126
-
127
- if (threadIds.length > 0) {
128
- const all = (await Promise.all(groups.map((group) => listCursorThreadsForGroup(group)))).flat();
129
- return all.filter(
130
- (thread) =>
131
- threadIds.includes(thread.composerId) || threadIds.some((id) => thread.composerId.startsWith(id)),
132
- );
133
- }
134
-
135
- if (!query) {
136
- throw new CliUsageError('prune requires a --workspace or one or more --thread ids.');
137
- }
138
-
139
- const group = resolveSingleGroupOrThrow(groups, query);
140
- return listCursorThreadsForGroup(group);
141
- };
142
-
143
- const collectFlagValues = (argv: string[], flags: string[]): string[] => {
144
- const values: string[] = [];
145
- for (let index = 0; index < argv.length; index += 1) {
146
- if (flags.includes(argv[index] as string)) {
147
- const value = argv[index + 1];
148
- if (value && !value.startsWith('-')) {
149
- values.push(value);
150
- }
151
- }
152
- }
153
-
154
- return values;
155
- };
156
-
157
- const runCursorPrune = async (argv: string[]): Promise<void> => {
158
- const apply = argv.includes('--apply');
159
- const threads = await selectPruneThreads(argv);
160
-
161
- if (threads.length === 0) {
162
- console.log('No matching threads to prune.');
163
- return;
164
- }
165
-
166
- console.log(`Prune target: ${threads.length} thread(s)`);
167
- for (const thread of threads) {
168
- console.log(` - ${thread.name} [${thread.composerId.slice(0, 8)}] bubbles=${thread.bubbleCount}`);
169
- }
170
-
171
- if (!apply) {
172
- const preview = await pruneCursorThreads(threads, false);
173
- console.log(`\nDry run: would delete ${preview.bubblesDeleted} bubble(s) across ${threads.length} thread(s).`);
174
- console.log('Re-run with --apply after quitting Cursor.');
175
- return;
176
- }
177
-
178
- await ensureCursorClosed();
179
- console.log(`\nThis permanently deletes ${threads.length} thread(s) and their on-disk transcripts.`);
180
- const typed = await promptLine(`Type "${PRUNE_CONFIRM_PHRASE}" to confirm: `);
181
- if (typed !== PRUNE_CONFIRM_PHRASE) {
182
- console.log('Confirmation failed. Nothing was deleted.');
183
- return;
184
- }
185
-
186
- const result = await pruneCursorThreads(threads, true);
187
- console.log(
188
- `Deleted ${result.bubblesDeleted} bubble(s), ${result.headersRemoved} header(s), ` +
189
- `${result.transcriptDirsRemoved} transcript dir(s) across ${result.composerIds.length} thread(s).`,
190
- );
191
- };
192
-
193
- export const runExportCursorCli = async (argv = process.argv.slice(2)): Promise<void> => {
194
- if (argv.includes('--help') || argv.includes('-h') || argv.length === 0) {
195
- console.log(getCursorHelpText());
196
- return;
197
- }
198
-
199
- const { subcommand, rest } = resolveSubcommand(argv);
200
-
201
- try {
202
- await dispatchCursorSubcommand(subcommand, rest);
203
- } catch (error) {
204
- if (error instanceof CliUsageError) {
205
- console.error(error.message);
206
- console.error('');
207
- console.error(getCursorHelpText());
208
- process.exit(1);
209
- }
210
-
211
- if (error instanceof Error) {
212
- console.error(error.message);
213
- process.exit(1);
214
- }
215
-
216
- throw error;
217
- }
218
- };
219
-
220
- const dispatchCursorSubcommand = async (subcommand: CursorSubcommand, rest: string[]): Promise<void> => {
221
- if (subcommand === 'list') {
222
- await runCursorList(rest);
223
- return;
224
- }
225
-
226
- if (subcommand === 'recover') {
227
- await runCursorRecover(rest);
228
- return;
229
- }
230
-
231
- if (subcommand === 'prune') {
232
- await runCursorPrune(rest);
233
- return;
234
- }
235
-
236
- await runCursorExportCommand(rest);
237
- };
238
-
239
- // Surfaces the resolved Cursor data dir for diagnostics in error messages.
240
- export const getResolvedCursorUserDir = (): string => resolveCursorUserDir();
241
-
242
- if (import.meta.main) {
243
- await runExportCursorCli();
244
- }