spiracha 1.5.0 → 2.1.0

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