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,502 +0,0 @@
1
- import { t as applyPathTransforms$1 } from "./path-transforms-DL2IwtYd.js";
2
- import { t as cn } from "./utils-C_uf36nf.js";
3
- import { t as Button } from "./button-CmTDnzOn.js";
4
- import { n as useSettings } from "./settings-store-DpEJEQ7M.js";
5
- import { t as Checkbox$1 } from "./checkbox-C0hovF41.js";
6
- import { a as formatModelLabel, r as formatDateTime } from "./formatters-FJaGZgJk.js";
7
- import { t as Badge } from "./badge-EvdhKK_Z.js";
8
- import { useEffect, useMemo, useRef, useState } from "react";
9
- import { Link } from "@tanstack/react-router";
10
- import { jsx, jsxs } from "react/jsx-runtime";
11
- import { Check, ChevronRight, Copy } from "lucide-react";
12
- import { cva } from "class-variance-authority";
13
- import { Tabs } from "radix-ui";
14
- import { useVirtualizer } from "@tanstack/react-virtual";
15
- //#region src/components/breadcrumbs.tsx
16
- var isLinkItem = (item) => {
17
- return "to" in item;
18
- };
19
- var Breadcrumbs = ({ items }) => {
20
- return /* @__PURE__ */ jsx("nav", {
21
- "aria-label": "Breadcrumb",
22
- className: "flex flex-wrap items-center gap-1 text-sm",
23
- children: items.map((item, index) => {
24
- const content = isLinkItem(item) ? /* @__PURE__ */ jsx(Link, {
25
- className: "text-[var(--muted-foreground)] transition hover:text-[var(--foreground)]",
26
- params: item.params,
27
- to: item.to,
28
- children: item.label
29
- }) : /* @__PURE__ */ jsx("span", {
30
- "aria-current": "page",
31
- className: "font-medium text-[var(--foreground)]",
32
- children: item.label
33
- });
34
- return /* @__PURE__ */ jsxs("div", {
35
- className: "flex items-center gap-1",
36
- children: [index > 0 ? /* @__PURE__ */ jsx(ChevronRight, { className: "size-3.5 text-[var(--muted-foreground)]" }) : null, content]
37
- }, isLinkItem(item) ? `${item.label}-${item.to}-${index}` : `${item.label}-current-${index}`);
38
- })
39
- });
40
- };
41
- //#endregion
42
- //#region src/components/json-panel.tsx
43
- function JsonPanel({ title, value }) {
44
- return /* @__PURE__ */ jsxs("section", {
45
- className: "rounded-[1.6rem] border border-[var(--border)] bg-[var(--panel)] p-5 shadow-[var(--panel-shadow)]",
46
- children: [/* @__PURE__ */ jsx("h3", {
47
- className: "font-semibold text-[var(--muted-foreground)] text-sm uppercase tracking-[0.18em]",
48
- children: title
49
- }), /* @__PURE__ */ jsx("pre", {
50
- className: "mt-4 overflow-x-auto rounded-2xl border border-[var(--border)] bg-[var(--code-background)] p-4 text-[var(--code-foreground)] text-xs leading-5",
51
- children: JSON.stringify(value, null, 2)
52
- })]
53
- });
54
- }
55
- //#endregion
56
- //#region src/components/metadata-section.tsx
57
- function MetadataSection({ items, title }) {
58
- return /* @__PURE__ */ jsxs("section", {
59
- className: "rounded-[1.6rem] border border-[var(--border)] bg-[var(--panel)] p-5 shadow-[var(--panel-shadow)]",
60
- children: [/* @__PURE__ */ jsx("h3", {
61
- className: "font-semibold text-[var(--muted-foreground)] text-sm uppercase tracking-[0.18em]",
62
- children: title
63
- }), /* @__PURE__ */ jsx("dl", {
64
- className: "mt-4 space-y-3",
65
- children: items.map((item) => /* @__PURE__ */ jsxs("div", {
66
- className: "grid gap-1 sm:grid-cols-[11rem_1fr] sm:items-start",
67
- children: [/* @__PURE__ */ jsx("dt", {
68
- className: "font-medium text-[var(--muted-foreground)] text-xs uppercase tracking-[0.14em]",
69
- children: item.label
70
- }), /* @__PURE__ */ jsx("dd", {
71
- className: "min-w-0 text-sm leading-6",
72
- children: item.value
73
- })]
74
- }, item.label))
75
- })]
76
- });
77
- }
78
- //#endregion
79
- //#region src/lib/path-utils.ts
80
- var applyPathTransforms = (text, settings, projectPath) => {
81
- return applyPathTransforms$1(text, {
82
- ...settings,
83
- projectPath
84
- });
85
- };
86
- //#endregion
87
- //#region src/components/transcript-view.tsx
88
- var isCommentaryMessage = (event) => event.kind === "message" && event.role === "assistant" && event.phase === "commentary";
89
- var shouldShowEvent = (event, showToolCalls, showExtraEvents, showCommentary, showUserMessages) => {
90
- if (isCommentaryMessage(event) && !showCommentary) return false;
91
- if (event.kind === "message") {
92
- if (event.role === "user" && !showUserMessages) return false;
93
- return !event.isHiddenByDefault || showExtraEvents;
94
- }
95
- if (event.kind === "tool_call" || event.kind === "tool_output") return showToolCalls;
96
- return showExtraEvents;
97
- };
98
- var getEventTone = (event) => {
99
- if (event.kind === "message" && event.role === "assistant") return "border-[var(--accent)]/40 bg-[var(--panel)]";
100
- if (event.kind === "message" && event.role === "user") return "border-[var(--border)] bg-[var(--panel-secondary)]";
101
- if (event.kind === "tool_call" || event.kind === "tool_output") return "border-[var(--border)] bg-[var(--code-background)]";
102
- return "border-[var(--border)] bg-[var(--panel-secondary)]/80";
103
- };
104
- var getMessageTitle = (event, assistantModel) => {
105
- if (event.role === "assistant" && event.phase === "final_answer") return "Final Answer";
106
- const modelLabel = formatModelLabel(event.model ?? assistantModel);
107
- if (event.variant === "agent_message") return event.role === "assistant" ? modelLabel : "Assistant update";
108
- if (event.role === "assistant") return modelLabel;
109
- return event.role === "system" ? "System" : "User";
110
- };
111
- var assertNever = (value) => {
112
- throw new Error(`Unhandled transcript event kind: ${JSON.stringify(value)}`);
113
- };
114
- var getNonMessageTitle = (event) => {
115
- switch (event.kind) {
116
- case "tool_call": return `Tool call: ${event.name}`;
117
- case "tool_output": return "Tool output";
118
- case "task_started": return "Task started";
119
- case "task_complete": return "Task complete";
120
- case "token_count": return "Token update";
121
- case "reasoning": return "Reasoning";
122
- case "web_search": return "Web search";
123
- default: return assertNever(event);
124
- }
125
- };
126
- var getEventTitle = (event, assistantModel) => event.kind === "message" ? getMessageTitle(event, assistantModel) : getNonMessageTitle(event);
127
- var copyToClipboard = async (text) => {
128
- if (typeof navigator !== "undefined" && navigator.clipboard) try {
129
- await navigator.clipboard.writeText(text);
130
- return true;
131
- } catch {}
132
- return false;
133
- };
134
- var getEventMarkdownBody = (event, transform) => {
135
- switch (event.kind) {
136
- case "message": return transform(event.text || "No text content");
137
- case "tool_call": return [event.command ?? event.name, event.workdir].filter((value) => Boolean(value)).map(transform).join("\n\n");
138
- case "tool_output": return transform(event.summary || event.outputText || "");
139
- case "task_started": return `Context window: ${event.modelContextWindow ?? "n/a"}\n\nCollaboration mode: ${event.collaborationModeKind ?? "n/a"}`;
140
- case "task_complete": return `Duration: ${event.durationMs ?? "n/a"} ms\n\nFirst token: ${event.timeToFirstTokenMs ?? "n/a"} ms`;
141
- case "token_count": return JSON.stringify(event.rateLimits, null, 2);
142
- case "reasoning": return event.summary.join(" ") || "Reasoning content is not directly available.";
143
- case "web_search": return [`Phase: ${event.phase}${event.status ? ` · ${event.status}` : ""}`, event.query ? transform(event.query) : null].filter(Boolean).join("\n\n");
144
- }
145
- };
146
- var getEventMarkdown = (event, assistantModel, transform) => `## ${getEventTitle(event, assistantModel)}\n\n${getEventMarkdownBody(event, transform)}`;
147
- var buildEventKey = (event, index) => {
148
- if (event.kind === "tool_call") return `${event.kind}-${event.sequence}-${event.callId ?? event.timestamp ?? event.name}-${index}`;
149
- if (event.kind === "tool_output") return `${event.kind}-${event.sequence}-${event.callId ?? event.timestamp ?? "output"}-${index}`;
150
- if (event.kind === "message") return `${event.kind}-${event.sequence}-${event.variant}-${event.timestamp ?? event.role}-${index}`;
151
- return `${event.kind}-${event.sequence}-${event.timestamp ?? "event"}-${index}`;
152
- };
153
- var renderMessageBody = (event, t) => /* @__PURE__ */ jsx("p", {
154
- className: "min-w-0 whitespace-pre-wrap break-words text-sm leading-6 [overflow-wrap:anywhere]",
155
- children: t(event.text || "No text content")
156
- });
157
- var renderToolCallBody = (event, t) => /* @__PURE__ */ jsxs("div", {
158
- className: "space-y-2 text-sm",
159
- children: [/* @__PURE__ */ jsx("p", {
160
- className: "min-w-0 break-words font-medium [overflow-wrap:anywhere]",
161
- children: t(event.command ?? event.name)
162
- }), event.workdir ? /* @__PURE__ */ jsx("p", {
163
- className: "font-mono text-[var(--muted-foreground)] text-xs",
164
- children: t(event.workdir)
165
- }) : null]
166
- });
167
- var renderToolOutputBody = (event, t) => /* @__PURE__ */ jsx("p", {
168
- className: "min-w-0 whitespace-pre-wrap break-words text-sm leading-6 [overflow-wrap:anywhere]",
169
- children: t(event.summary || event.outputText || "")
170
- });
171
- var renderTaskStartedBody = (event) => /* @__PURE__ */ jsxs("div", {
172
- className: "text-[var(--muted-foreground)] text-sm",
173
- children: [
174
- "Context window: ",
175
- event.modelContextWindow ?? "n/a",
176
- " · Collaboration mode: ",
177
- event.collaborationModeKind ?? "n/a"
178
- ]
179
- });
180
- var renderTaskCompleteBody = (event) => /* @__PURE__ */ jsxs("div", {
181
- className: "text-[var(--muted-foreground)] text-sm",
182
- children: [
183
- "Duration: ",
184
- event.durationMs ?? "n/a",
185
- " ms · First token: ",
186
- event.timeToFirstTokenMs ?? "n/a",
187
- " ms"
188
- ]
189
- });
190
- var renderTokenCountBody = (event) => /* @__PURE__ */ jsx("pre", {
191
- className: "overflow-x-auto text-xs leading-5",
192
- children: JSON.stringify(event.rateLimits, null, 2)
193
- });
194
- var renderReasoningBody = (event) => /* @__PURE__ */ jsxs("div", {
195
- className: "space-y-2 text-sm",
196
- children: [/* @__PURE__ */ jsx("p", { children: event.summary.join(" ") || "Reasoning content is not directly available." }), event.hasEncryptedContent ? /* @__PURE__ */ jsx("p", {
197
- className: "text-[var(--muted-foreground)] text-xs",
198
- children: "Encrypted reasoning payload captured."
199
- }) : null]
200
- });
201
- var renderWebSearchBody = (event) => /* @__PURE__ */ jsxs("div", {
202
- className: "space-y-2 text-sm",
203
- children: [/* @__PURE__ */ jsxs("p", { children: [
204
- "Phase: ",
205
- event.phase,
206
- event.status ? ` · ${event.status}` : ""
207
- ] }), event.query ? /* @__PURE__ */ jsx("p", {
208
- className: "text-[var(--muted-foreground)]",
209
- children: event.query
210
- }) : null]
211
- });
212
- var renderEventBody = (event, t) => {
213
- switch (event.kind) {
214
- case "message": return renderMessageBody(event, t);
215
- case "tool_call": return renderToolCallBody(event, t);
216
- case "tool_output": return renderToolOutputBody(event, t);
217
- case "task_started": return renderTaskStartedBody(event);
218
- case "task_complete": return renderTaskCompleteBody(event);
219
- case "token_count": return renderTokenCountBody(event);
220
- case "reasoning": return renderReasoningBody(event);
221
- case "web_search": return renderWebSearchBody(event);
222
- }
223
- };
224
- function TranscriptEventCard({ assistantModel, copied, event, isSelected, showRawJson, transform, onCopy, onSelectionChange }) {
225
- return /* @__PURE__ */ jsxs("article", {
226
- className: cn("min-w-0 overflow-hidden rounded-xl border p-3.5 shadow-[var(--panel-shadow)]", isSelected && "ring-2 ring-[var(--accent)]/35", getEventTone(event)),
227
- children: [
228
- /* @__PURE__ */ jsxs("div", {
229
- className: "flex flex-wrap items-start justify-between gap-2",
230
- children: [/* @__PURE__ */ jsxs("div", {
231
- className: "flex min-w-0 flex-1 flex-wrap items-center gap-2",
232
- children: [
233
- /* @__PURE__ */ jsx(Checkbox$1, {
234
- "aria-label": `Select ${getEventTitle(event, assistantModel)}`,
235
- checked: isSelected,
236
- onCheckedChange: (checked) => onSelectionChange(event, checked === true)
237
- }),
238
- /* @__PURE__ */ jsx("h3", {
239
- className: "min-w-0 break-words font-semibold text-sm [overflow-wrap:anywhere]",
240
- children: getEventTitle(event, assistantModel)
241
- }),
242
- event.kind === "message" && event.phase ? /* @__PURE__ */ jsx(Badge, {
243
- variant: "outline",
244
- children: event.phase
245
- }) : null,
246
- event.kind !== "message" ? /* @__PURE__ */ jsx(Badge, {
247
- variant: "outline",
248
- children: event.kind.replaceAll("_", " ")
249
- }) : null
250
- ]
251
- }), event.timestamp ? /* @__PURE__ */ jsx("p", {
252
- className: "shrink-0 text-[var(--muted-foreground)] text-xs",
253
- suppressHydrationWarning: true,
254
- children: formatDateTime(event.timestamp)
255
- }) : null]
256
- }),
257
- /* @__PURE__ */ jsx("div", {
258
- className: "mt-2.5 min-w-0",
259
- children: renderEventBody(event, transform)
260
- }),
261
- /* @__PURE__ */ jsx("div", {
262
- className: "mt-3 flex justify-end",
263
- children: /* @__PURE__ */ jsx(Button, {
264
- "aria-label": "Copy message",
265
- className: "text-[var(--muted-foreground)] hover:bg-[var(--panel-secondary)] hover:text-[var(--foreground)]",
266
- size: "icon-xs",
267
- variant: "ghost",
268
- onClick: () => onCopy(event),
269
- children: copied ? /* @__PURE__ */ jsx(Check, { className: "text-[var(--accent)]" }) : /* @__PURE__ */ jsx(Copy, {})
270
- })
271
- }),
272
- showRawJson ? /* @__PURE__ */ jsx("pre", {
273
- className: "mt-3 overflow-x-auto rounded-lg border border-[var(--border)] bg-[var(--code-background)] p-3 text-[var(--code-foreground)] text-xs leading-5",
274
- children: JSON.stringify(event.raw, null, 2)
275
- }) : null
276
- ]
277
- });
278
- }
279
- function TranscriptView({ assistantModel, events, projectPath, showCommentary, showExtraEvents, showRawJson, showToolCalls, showUserMessages = true }) {
280
- const { settings } = useSettings();
281
- const visibleEvents = useMemo(() => events.filter((event) => shouldShowEvent(event, showToolCalls, showExtraEvents, showCommentary, showUserMessages)), [
282
- events,
283
- showCommentary,
284
- showExtraEvents,
285
- showToolCalls,
286
- showUserMessages
287
- ]);
288
- const [copiedEventKeys, setCopiedEventKeys] = useState([]);
289
- const [copiedSelection, setCopiedSelection] = useState(false);
290
- const [copyErrorMessage, setCopyErrorMessage] = useState(null);
291
- const [selectedEventKeys, setSelectedEventKeys] = useState([]);
292
- const parentRef = useRef(null);
293
- const timeoutIdsRef = useRef([]);
294
- const useVirtualList = visibleEvents.length > 40;
295
- const eventKeyByEvent = useMemo(() => new Map(events.map((event, index) => [event, buildEventKey(event, index)])), [events]);
296
- const getEventKey = (event) => eventKeyByEvent.get(event) ?? buildEventKey(event, -1);
297
- const transform = (text) => applyPathTransforms(text, settings, projectPath);
298
- const visibleEventKeys = useMemo(() => visibleEvents.map((event) => eventKeyByEvent.get(event) ?? buildEventKey(event, -1)), [visibleEvents, eventKeyByEvent]);
299
- const visibleEventKeySet = useMemo(() => new Set(visibleEventKeys), [visibleEventKeys]);
300
- const selectedEventKeySet = useMemo(() => new Set(selectedEventKeys), [selectedEventKeys]);
301
- const virtualizer = useVirtualizer({
302
- count: useVirtualList ? visibleEvents.length : 0,
303
- estimateSize: () => 160,
304
- getItemKey: (index) => getEventKey(visibleEvents[index]) ?? `event-${index}`,
305
- getScrollElement: () => parentRef.current,
306
- measureElement: (element) => element.getBoundingClientRect().height,
307
- overscan: 8
308
- });
309
- useEffect(() => {
310
- return () => {
311
- for (const timeoutId of timeoutIdsRef.current) window.clearTimeout(timeoutId);
312
- timeoutIdsRef.current = [];
313
- };
314
- }, []);
315
- useEffect(() => {
316
- setSelectedEventKeys((current) => {
317
- const next = current.filter((key) => visibleEventKeySet.has(key));
318
- return next.length === current.length ? current : next;
319
- });
320
- }, [visibleEventKeySet]);
321
- const scheduleTimeout = (callback, delayMs) => {
322
- const timeoutId = window.setTimeout(() => {
323
- timeoutIdsRef.current = timeoutIdsRef.current.filter((entry) => entry !== timeoutId);
324
- callback();
325
- }, delayMs);
326
- timeoutIdsRef.current.push(timeoutId);
327
- };
328
- const showCopyFailure = () => {
329
- setCopyErrorMessage("Copy failed");
330
- scheduleTimeout(() => {
331
- setCopyErrorMessage((current) => current === "Copy failed" ? null : current);
332
- }, 1500);
333
- };
334
- const visibleSelectedKeys = useMemo(() => selectedEventKeys.filter((key) => visibleEventKeySet.has(key)), [selectedEventKeys, visibleEventKeySet]);
335
- const visibleSelectedKeySet = useMemo(() => new Set(visibleSelectedKeys), [visibleSelectedKeys]);
336
- const allVisibleSelected = visibleEvents.length > 0 && visibleSelectedKeys.length === visibleEvents.length;
337
- const handleSelectionChange = (event, checked) => {
338
- const key = getEventKey(event);
339
- setSelectedEventKeys((current) => checked ? current.includes(key) ? current : [...current, key] : current.filter((entry) => entry !== key));
340
- };
341
- const handleToggleAllVisible = (checked) => {
342
- setSelectedEventKeys((current) => checked ? [...new Set([...current.filter((key) => !visibleEventKeySet.has(key)), ...visibleEventKeys])] : current.filter((key) => !visibleEventKeySet.has(key)));
343
- };
344
- const handleCopyEvent = async (event) => {
345
- if (!await copyToClipboard(getEventMarkdown(event, assistantModel, transform))) {
346
- showCopyFailure();
347
- return;
348
- }
349
- const key = getEventKey(event);
350
- setCopiedEventKeys((current) => [...new Set([...current, key])]);
351
- scheduleTimeout(() => {
352
- setCopiedEventKeys((current) => current.filter((entry) => entry !== key));
353
- }, 1500);
354
- };
355
- const handleCopySelected = async () => {
356
- const selectedEvents = visibleEvents.filter((event) => visibleSelectedKeySet.has(getEventKey(event)));
357
- if (selectedEvents.length === 0) return;
358
- if (!await copyToClipboard(selectedEvents.map((event) => getEventMarkdown(event, assistantModel, transform)).join("\n\n"))) {
359
- showCopyFailure();
360
- return;
361
- }
362
- setCopiedSelection(true);
363
- scheduleTimeout(() => {
364
- setCopiedSelection(false);
365
- }, 1500);
366
- };
367
- if (useVirtualList) return /* @__PURE__ */ jsxs("div", {
368
- ref: parentRef,
369
- className: "h-[70vh] overflow-auto rounded-xl border border-[var(--border)] bg-[var(--panel)] p-3",
370
- children: [/* @__PURE__ */ jsxs("div", {
371
- className: "sticky top-0 z-10 mb-3 flex items-center justify-between rounded-xl border border-[var(--border)] bg-[var(--panel)]/95 px-3 py-2 backdrop-blur",
372
- children: [/* @__PURE__ */ jsxs("div", {
373
- className: "flex items-center gap-2",
374
- children: [
375
- /* @__PURE__ */ jsx(Checkbox$1, {
376
- "aria-label": "Select visible messages",
377
- checked: allVisibleSelected,
378
- onCheckedChange: (checked) => handleToggleAllVisible(checked === true)
379
- }),
380
- /* @__PURE__ */ jsxs("span", {
381
- className: "text-[var(--muted-foreground)] text-sm",
382
- children: [visibleSelectedKeys.length, " selected"]
383
- }),
384
- copyErrorMessage ? /* @__PURE__ */ jsx("span", {
385
- className: "text-[var(--destructive)] text-sm",
386
- children: copyErrorMessage
387
- }) : null
388
- ]
389
- }), /* @__PURE__ */ jsxs(Button, {
390
- "aria-label": "Copy selected messages",
391
- className: "hover:bg-[var(--panel-secondary)] hover:text-[var(--foreground)]",
392
- disabled: visibleSelectedKeys.length === 0,
393
- size: "sm",
394
- variant: "outline",
395
- onClick: () => void handleCopySelected(),
396
- children: [copiedSelection ? /* @__PURE__ */ jsx(Check, { className: "text-[var(--accent)]" }) : /* @__PURE__ */ jsx(Copy, {}), copiedSelection ? "Copied" : "Copy"]
397
- })]
398
- }), /* @__PURE__ */ jsx("div", {
399
- className: "relative w-full",
400
- style: { height: `${virtualizer.getTotalSize()}px` },
401
- children: virtualizer.getVirtualItems().map((item) => /* @__PURE__ */ jsx("div", {
402
- ref: virtualizer.measureElement,
403
- "data-index": item.index,
404
- className: "absolute top-0 left-0 w-full pb-3.5",
405
- style: { transform: `translateY(${item.start}px)` },
406
- children: /* @__PURE__ */ jsx(TranscriptEventCard, {
407
- assistantModel,
408
- copied: copiedEventKeys.includes(getEventKey(visibleEvents[item.index])),
409
- event: visibleEvents[item.index],
410
- isSelected: selectedEventKeySet.has(getEventKey(visibleEvents[item.index])),
411
- showRawJson,
412
- transform,
413
- onCopy: (event) => void handleCopyEvent(event),
414
- onSelectionChange: handleSelectionChange
415
- })
416
- }, item.key))
417
- })]
418
- });
419
- return /* @__PURE__ */ jsxs("div", {
420
- className: "space-y-3.5",
421
- children: [/* @__PURE__ */ jsxs("div", {
422
- className: "sticky top-0 z-10 flex items-center justify-between rounded-xl border border-[var(--border)] bg-[var(--panel)]/95 px-3 py-2 backdrop-blur",
423
- children: [/* @__PURE__ */ jsxs("div", {
424
- className: "flex items-center gap-2",
425
- children: [
426
- /* @__PURE__ */ jsx(Checkbox$1, {
427
- "aria-label": "Select visible messages",
428
- checked: allVisibleSelected,
429
- onCheckedChange: (checked) => handleToggleAllVisible(checked === true)
430
- }),
431
- /* @__PURE__ */ jsxs("span", {
432
- className: "text-[var(--muted-foreground)] text-sm",
433
- children: [visibleSelectedKeys.length, " selected"]
434
- }),
435
- copyErrorMessage ? /* @__PURE__ */ jsx("span", {
436
- className: "text-[var(--destructive)] text-sm",
437
- children: copyErrorMessage
438
- }) : null
439
- ]
440
- }), /* @__PURE__ */ jsxs(Button, {
441
- "aria-label": "Copy selected messages",
442
- className: "hover:bg-[var(--panel-secondary)] hover:text-[var(--foreground)]",
443
- disabled: visibleSelectedKeys.length === 0,
444
- size: "sm",
445
- variant: "outline",
446
- onClick: () => void handleCopySelected(),
447
- children: [copiedSelection ? /* @__PURE__ */ jsx(Check, { className: "text-[var(--accent)]" }) : /* @__PURE__ */ jsx(Copy, {}), copiedSelection ? "Copied" : "Copy"]
448
- })]
449
- }), visibleEvents.map((event) => /* @__PURE__ */ jsx(TranscriptEventCard, {
450
- assistantModel,
451
- copied: copiedEventKeys.includes(getEventKey(event)),
452
- event,
453
- isSelected: selectedEventKeySet.has(getEventKey(event)),
454
- showRawJson,
455
- transform,
456
- onCopy: (selectedEvent) => void handleCopyEvent(selectedEvent),
457
- onSelectionChange: handleSelectionChange
458
- }, getEventKey(event)))]
459
- });
460
- }
461
- //#endregion
462
- //#region src/components/ui/tabs.tsx
463
- function Tabs$1({ className, orientation = "horizontal", ...props }) {
464
- return /* @__PURE__ */ jsx(Tabs.Root, {
465
- "data-slot": "tabs",
466
- "data-orientation": orientation,
467
- orientation,
468
- className: cn("group/tabs flex gap-2 data-[orientation=horizontal]:flex-col", className),
469
- ...props
470
- });
471
- }
472
- var tabsListVariants = cva("group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] text-muted-foreground group-data-[orientation=horizontal]/tabs:min-h-11 group-data-[orientation=vertical]/tabs:h-fit group-data-[orientation=vertical]/tabs:flex-col data-[variant=line]:rounded-none", {
473
- defaultVariants: { variant: "default" },
474
- variants: { variant: {
475
- default: "bg-muted",
476
- line: "gap-1 bg-transparent"
477
- } }
478
- });
479
- function TabsList({ className, variant = "default", ...props }) {
480
- return /* @__PURE__ */ jsx(Tabs.List, {
481
- "data-slot": "tabs-list",
482
- "data-variant": variant,
483
- className: cn(tabsListVariants({ variant }), className),
484
- ...props
485
- });
486
- }
487
- function TabsTrigger({ className, ...props }) {
488
- return /* @__PURE__ */ jsx(Tabs.Trigger, {
489
- "data-slot": "tabs-trigger",
490
- className: cn("relative inline-flex h-auto min-h-9 min-w-0 flex-1 items-center justify-center gap-1.5 whitespace-nowrap rounded-md border border-transparent px-3 py-2 font-medium text-foreground/60 text-sm transition-all hover:text-foreground focus-visible:border-ring focus-visible:outline-1 focus-visible:outline-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 group-data-[orientation=vertical]/tabs:w-full group-data-[orientation=vertical]/tabs:justify-start group-data-[variant=default]/tabs-list:data-[state=active]:shadow-sm group-data-[variant=line]/tabs-list:data-[state=active]:shadow-none dark:text-muted-foreground dark:hover:text-foreground [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0", "group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent dark:group-data-[variant=line]/tabs-list:data-[state=active]:border-transparent dark:group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent", "data-[state=active]:bg-background data-[state=active]:text-foreground dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 dark:data-[state=active]:text-foreground", "after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-[orientation=horizontal]/tabs:after:inset-x-0 group-data-[orientation=vertical]/tabs:after:inset-y-0 group-data-[orientation=vertical]/tabs:after:-right-1 group-data-[orientation=horizontal]/tabs:after:bottom-[-3px] group-data-[orientation=horizontal]/tabs:after:h-0.5 group-data-[orientation=vertical]/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-[state=active]:after:opacity-100", className),
491
- ...props
492
- });
493
- }
494
- function TabsContent({ className, ...props }) {
495
- return /* @__PURE__ */ jsx(Tabs.Content, {
496
- "data-slot": "tabs-content",
497
- className: cn("flex-1 outline-none", className),
498
- ...props
499
- });
500
- }
501
- //#endregion
502
- export { TranscriptView as a, Breadcrumbs as c, TabsTrigger as i, TabsContent as n, MetadataSection as o, TabsList as r, JsonPanel as s, Tabs$1 as t };
@@ -1,36 +0,0 @@
1
- import { t as cn } from "./utils-C_uf36nf.js";
2
- import { jsx } from "react/jsx-runtime";
3
- //#region src/components/ui/input.tsx
4
- function Input({ className, type, ...props }) {
5
- return /* @__PURE__ */ jsx("input", {
6
- type,
7
- "data-slot": "input",
8
- className: cn("h-9 w-full min-w-0 rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-xs outline-none transition-[color,box-shadow] selection:bg-primary selection:text-primary-foreground file:inline-flex file:h-7 file:border-0 file:bg-transparent file:font-medium file:text-foreground file:text-sm placeholder:text-muted-foreground disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm dark:bg-input/30", "focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50", "aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40", className),
9
- ...props
10
- });
11
- }
12
- //#endregion
13
- //#region src/components/list-search-input.tsx
14
- function ListSearchInput({ placeholder, value, onValueChange }) {
15
- return /* @__PURE__ */ jsx(Input, {
16
- className: "h-10 w-full rounded-full border-[var(--border)] bg-[var(--panel)] px-4 sm:w-[20rem]",
17
- placeholder,
18
- value,
19
- onChange: (event) => onValueChange(event.target.value)
20
- });
21
- }
22
- //#endregion
23
- //#region src/lib/text-filter.ts
24
- var normalizeSearchToken = (value) => value.trim().toLowerCase();
25
- var tokenizeSearchQuery = (query) => {
26
- const normalized = normalizeSearchToken(query);
27
- return normalized ? normalized.split(/\s+/u).filter(Boolean) : [];
28
- };
29
- var matchesTextQuery = (query, values) => {
30
- const tokens = tokenizeSearchQuery(query);
31
- if (tokens.length === 0) return true;
32
- const haystack = values.filter((value) => value !== null && value !== void 0).map((value) => String(value).toLowerCase()).join("\n");
33
- return tokens.every((token) => haystack.includes(token));
34
- };
35
- //#endregion
36
- export { ListSearchInput as n, matchesTextQuery as t };
@@ -1,26 +0,0 @@
1
- import { jsx, jsxs } from "react/jsx-runtime";
2
- //#region src/routes/threads.$threadId.tsx?tsr-split=errorComponent
3
- function ThreadErrorComponent({ error }) {
4
- const isSqlite = error.message.includes("unable to open database") || error.message.includes("database is locked");
5
- return /* @__PURE__ */ jsxs("div", {
6
- className: "rounded-xl border border-[var(--border)] bg-[var(--panel)] px-6 py-10 text-center",
7
- children: [
8
- /* @__PURE__ */ jsx("p", {
9
- className: "font-medium text-[var(--destructive)] text-sm",
10
- children: isSqlite ? "Database unavailable" : "Failed to load thread"
11
- }),
12
- /* @__PURE__ */ jsx("p", {
13
- className: "mt-2 text-[var(--muted-foreground)] text-sm",
14
- children: isSqlite ? "Codex may have an exclusive lock on the database. Reload to retry." : error.message
15
- }),
16
- /* @__PURE__ */ jsx("button", {
17
- className: "mt-4 text-[var(--accent)] text-sm underline-offset-2 hover:underline",
18
- type: "button",
19
- onClick: () => window.location.reload(),
20
- children: "Reload"
21
- })
22
- ]
23
- });
24
- }
25
- //#endregion
26
- export { ThreadErrorComponent as errorComponent };
@@ -1,18 +0,0 @@
1
- import { a as threadSnapshotQueryOptions } from "./codex-queries-CtgeZ7VL.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/threads.$threadId.tsx
6
- var $$splitErrorComponentImporter = () => import("./threads._threadId-BSSK4nkI.js");
7
- var $$splitComponentImporter = () => import("./threads._threadId-D2GYkVn6.js");
8
- var Route = createFileRoute("/threads/$threadId")({
9
- component: lazyRouteComponent($$splitComponentImporter, "component"),
10
- errorComponent: lazyRouteComponent($$splitErrorComponentImporter, "errorComponent"),
11
- loader: ({ context, params }) => context.queryClient.ensureQueryData(threadSnapshotQueryOptions(params.threadId)),
12
- pendingComponent: () => /* @__PURE__ */ jsx(LoadingPanel, {
13
- description: "Loading the transcript, metadata, and parsed event stream for this thread.",
14
- title: "Loading thread"
15
- })
16
- });
17
- //#endregion
18
- export { Route as t };