spiracha 1.3.3 → 1.5.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 (242) hide show
  1. package/AGENTS.md +55 -6
  2. package/README.md +46 -5
  3. package/apps/ui/AGENTS.md +31 -4
  4. package/apps/ui/README.md +59 -5
  5. package/apps/ui/dist/client/assets/analytics-DOy1b6Sh.js +1 -0
  6. package/apps/ui/dist/client/assets/antigravity-conversations._conversationId-DqySVO2K.js +7 -0
  7. package/apps/ui/dist/client/assets/antigravity-conversations._conversationId-KAcXtNxI.js +1 -0
  8. package/apps/ui/dist/client/assets/antigravity-keychain-panel-B77qJz6f.js +1 -0
  9. package/apps/ui/dist/client/assets/antigravity._workspaceKey-B3NM6gRH.js +1 -0
  10. package/apps/ui/dist/client/assets/antigravity._workspaceKey-ByitGWki.js +1 -0
  11. package/apps/ui/dist/client/assets/antigravity.index-DP9JC2P9.js +1 -0
  12. package/apps/ui/dist/client/assets/antigravity.index-DgW25FEV.js +1 -0
  13. package/apps/ui/dist/client/assets/badge-C3i4OKs8.js +1 -0
  14. package/apps/ui/dist/client/assets/checkbox-CdHitXWQ.js +1 -0
  15. package/apps/ui/dist/client/assets/claude-code-sessions._sessionId-8pQ55ci2.js +1 -0
  16. package/apps/ui/dist/client/assets/claude-code-sessions._sessionId-DVz5UmtU.js +1 -0
  17. package/apps/ui/dist/client/assets/claude-code._workspaceKey-BBKskSum.js +1 -0
  18. package/apps/ui/dist/client/assets/claude-code._workspaceKey-OkikMUFs.js +1 -0
  19. package/apps/ui/dist/client/assets/claude-code.index-Cwu76dbb.js +1 -0
  20. package/apps/ui/dist/client/assets/claude-code.index-D6eMd08t.js +1 -0
  21. package/apps/ui/dist/client/assets/createServerFn-B-KkwmHU.js +3 -0
  22. package/apps/ui/dist/client/assets/cursor-threads._composerId-CmBFclK8.js +1 -0
  23. package/apps/ui/dist/client/assets/cursor-threads._composerId-hBWlP1D-.js +1 -0
  24. package/apps/ui/dist/client/assets/cursor._workspaceKey-BFPkIRi-.js +1 -0
  25. package/apps/ui/dist/client/assets/cursor._workspaceKey-CaAZjGmm.js +1 -0
  26. package/apps/ui/dist/client/assets/cursor.index-8y4o20kb.js +2 -0
  27. package/apps/ui/dist/client/assets/cursor.index-CrnMwDCi.js +1 -0
  28. package/apps/ui/dist/client/assets/{data-table-DeQq8xdt.js → data-table-Br78_dk3.js} +2 -2
  29. package/apps/ui/dist/client/assets/delete-confirm-dialog-Bxs07u-j.js +7 -0
  30. package/apps/ui/dist/client/assets/dist-B9pyYCVU.js +1 -0
  31. package/apps/ui/dist/client/assets/dist-BrJhN2A0.js +5 -0
  32. package/apps/ui/dist/client/assets/dist-Cmd3AIfD.js +1 -0
  33. package/apps/ui/dist/client/assets/dist-DvMS2965.js +1 -0
  34. package/apps/ui/dist/client/assets/download-Bf0QJKD3.js +1 -0
  35. package/apps/ui/dist/client/assets/dropdown-menu-D5cvPaZt.js +1 -0
  36. package/apps/ui/dist/client/assets/es2015-ad6040dw.js +41 -0
  37. package/apps/ui/dist/client/assets/export-dialog-Dr8d2MqD.js +1 -0
  38. package/apps/ui/dist/client/assets/formatters-BtqyrX_c.js +1 -0
  39. package/apps/ui/dist/client/assets/index-C-STgIH4.js +166 -0
  40. package/apps/ui/dist/client/assets/jsx-runtime-DGeXAQPT.js +1 -0
  41. package/apps/ui/dist/client/assets/kiro-sessions._sessionId-CKgfJ7GR.js +1 -0
  42. package/apps/ui/dist/client/assets/kiro-sessions._sessionId-zvIJHtQF.js +1 -0
  43. package/apps/ui/dist/client/assets/kiro._workspaceKey-DhVuJuZB.js +1 -0
  44. package/apps/ui/dist/client/assets/kiro._workspaceKey-QArsjkTY.js +1 -0
  45. package/apps/ui/dist/client/assets/kiro.index-C-fr4m7i.js +1 -0
  46. package/apps/ui/dist/client/assets/kiro.index-OYgAdtZd.js +1 -0
  47. package/apps/ui/dist/client/assets/metric-card-Dplm0ZiM.js +1 -0
  48. package/apps/ui/dist/client/assets/opencode-sessions._sessionId-DLjiTst-.js +1 -0
  49. package/apps/ui/dist/client/assets/opencode-sessions._sessionId-biBwrRbt.js +8 -0
  50. package/apps/ui/dist/client/assets/opencode._workspaceKey-C7OIzMOJ.js +1 -0
  51. package/apps/ui/dist/client/assets/opencode._workspaceKey-sBakX0oI.js +1 -0
  52. package/apps/ui/dist/client/assets/opencode.index-Bl_kNs9N.js +1 -0
  53. package/apps/ui/dist/client/assets/opencode.index-CN53bVmb.js +1 -0
  54. package/apps/ui/dist/client/assets/page-header-Cwa3p6Tl.js +1 -0
  55. package/apps/ui/dist/client/assets/preload-helper-B8fFrdxC.js +1 -0
  56. package/apps/ui/dist/client/assets/projects._project-D8WloxQN.js +1 -0
  57. package/apps/ui/dist/client/assets/projects._project-DSDwH4NF.js +1 -0
  58. package/apps/ui/dist/client/assets/projects.index-5xRtuJdX.js +3 -0
  59. package/apps/ui/dist/client/assets/projects.index-DEfhWqa8.js +1 -0
  60. package/apps/ui/dist/client/assets/react-dom-DL96Jor4.js +1 -0
  61. package/apps/ui/dist/client/assets/refresh-ccw-BgKjOiA6.js +1 -0
  62. package/apps/ui/dist/client/assets/reload-error-panel-AHqu0akK.js +1 -0
  63. package/apps/ui/dist/client/assets/routes-DnzF_9CX.js +1 -0
  64. package/apps/ui/dist/client/assets/scroll-text-fM0sMOB3.js +1 -0
  65. package/apps/ui/dist/client/assets/select-CYF6pF37.js +1 -0
  66. package/apps/ui/dist/client/assets/settings-Dx70jgP_.js +1 -0
  67. package/apps/ui/dist/client/assets/sqlite-error-B6uZjUe8.js +1 -0
  68. package/apps/ui/dist/client/assets/styles-B7Zi9EFA.css +1 -0
  69. package/apps/ui/dist/client/assets/tabs-CmuhkT-c.js +7 -0
  70. package/apps/ui/dist/client/assets/text-filter-DVAZySUS.js +2 -0
  71. package/apps/ui/dist/client/assets/thread-transcript-stats-BUNz6u7F.js +1 -0
  72. package/apps/ui/dist/client/assets/threads._threadId-BB9tTsV4.js +1 -0
  73. package/apps/ui/dist/client/assets/threads._threadId-BMRSFow3.js +1 -0
  74. package/apps/ui/dist/client/assets/useMutation-BSFult2i.js +1 -0
  75. package/apps/ui/dist/client/assets/useQuery-CjINKZf1.js +1 -0
  76. package/apps/ui/dist/client/icon.svg +2 -1
  77. package/apps/ui/dist/server/assets/_tanstack-start-manifest_v-CQ8Jjs3B.js +387 -0
  78. package/apps/ui/dist/server/assets/analytics-CYP_LT5Y.js +16 -0
  79. package/apps/ui/dist/server/assets/{analytics-Dc_QDZZC.js → analytics-CtpOMVMO.js} +13 -6
  80. package/apps/ui/dist/server/assets/antigravity-conversations._conversationId-BKOyL2T6.js +613 -0
  81. package/apps/ui/dist/server/assets/{antigravity-conversations._conversationId-C9z4AeN-.js → antigravity-conversations._conversationId-eS87Dx7g.js} +2 -2
  82. package/apps/ui/dist/server/assets/{antigravity-db-D9gW1D8G.js → antigravity-db-Bh8_U9uw.js} +11 -7
  83. package/apps/ui/dist/server/assets/{antigravity-keychain-panel-bpPoxhyp.js → antigravity-keychain-panel-CC7FLmAK.js} +1 -1
  84. package/apps/ui/dist/server/assets/{antigravity-queries-DVIKyOXi.js → antigravity-queries-CGrJO9Vr.js} +5 -5
  85. package/apps/ui/dist/server/assets/{antigravity-server-Cp1lc8fp.js → antigravity-server-CHRjVFqN.js} +11 -11
  86. package/apps/ui/dist/server/assets/{antigravity._workspaceKey-Dl8o1ptg.js → antigravity._workspaceKey-B0QeYUOh.js} +2 -2
  87. package/apps/ui/dist/server/assets/{antigravity._workspaceKey-BAoa4izU.js → antigravity._workspaceKey-C3kP-qyN.js} +4 -4
  88. package/apps/ui/dist/server/assets/{antigravity.index-BOlrJasZ.js → antigravity.index-CPCYkqCi.js} +2 -2
  89. package/apps/ui/dist/server/assets/claude-code-db-Ik3VStKZ.js +361 -0
  90. package/apps/ui/dist/server/assets/claude-code-queries-Cgzi4K-e.js +37 -0
  91. package/apps/ui/dist/server/assets/claude-code-server-PfraClXS.js +72 -0
  92. package/apps/ui/dist/server/assets/claude-code-sessions._sessionId-C55oe6zj.js +18 -0
  93. package/apps/ui/dist/server/assets/claude-code-sessions._sessionId-D1RYYi3j.js +473 -0
  94. package/apps/ui/dist/server/assets/claude-code-sessions._sessionId-DSvPLEUL.js +11 -0
  95. package/apps/ui/dist/server/assets/claude-code-transcript-C-bxh3cS.js +139 -0
  96. package/apps/ui/dist/server/assets/claude-code-transcript-phase-DmUMc8VU.js +10 -0
  97. package/apps/ui/dist/server/assets/claude-code._workspaceKey-B5Xg_-tE.js +28 -0
  98. package/apps/ui/dist/server/assets/claude-code._workspaceKey-BPlzyXPa.js +11 -0
  99. package/apps/ui/dist/server/assets/claude-code._workspaceKey-DqDve2wl.js +191 -0
  100. package/apps/ui/dist/server/assets/claude-code.index-B7yYR7dD.js +92 -0
  101. package/apps/ui/dist/server/assets/claude-code.index-BUHThG1W.js +11 -0
  102. package/apps/ui/dist/server/assets/{codex-queries-ev_mRUzr.js → codex-queries-CtgeZ7VL.js} +15 -13
  103. package/apps/ui/dist/server/assets/{codex-server-DIYFLozB.js → codex-server-CGXU4H8-.js} +421 -146
  104. package/apps/ui/dist/server/assets/concurrency-VXtYvlGh.js +18 -0
  105. package/apps/ui/dist/server/assets/{createServerRpc-Cg-Zr1rq.js → createServerRpc-CF_DEwnm.js} +1 -1
  106. package/apps/ui/dist/server/assets/{createSsrRpc-DVnVQhGx.js → createSsrRpc-C754NPki.js} +1 -1
  107. package/apps/ui/dist/server/assets/{cursor-db-B7agkAvM.js → cursor-db-CZnYy7aT.js} +196 -9
  108. package/apps/ui/dist/server/assets/{cursor-queries-f7DjBKSD.js → cursor-queries-NCIM0Nat.js} +12 -10
  109. package/apps/ui/dist/server/assets/{cursor-recovery-9bJLs7vG.js → cursor-recovery-CXpO8KcD.js} +2 -2
  110. package/apps/ui/dist/server/assets/{cursor-server-nPzojHN3.js → cursor-server-DNu52A3K.js} +71 -42
  111. package/apps/ui/dist/server/assets/cursor-threads._composerId-Ckn6ItHI.js +582 -0
  112. package/apps/ui/dist/server/assets/{cursor-threads._composerId-B3qcsh9C.js → cursor-threads._composerId-p9-ARAzc.js} +2 -2
  113. package/apps/ui/dist/server/assets/{cursor-transcript-2iL3KFSK.js → cursor-transcript-B7tGnqtn.js} +1 -1
  114. package/apps/ui/dist/server/assets/{cursor._workspaceKey-BL_CQyHQ.js → cursor._workspaceKey-CZuohIUL.js} +2 -2
  115. package/apps/ui/dist/server/assets/{cursor._workspaceKey-BhQeepXB.js → cursor._workspaceKey-DPp5JSjy.js} +11 -9
  116. package/apps/ui/dist/server/assets/{cursor.index-CsrdckZD.js → cursor.index-DkWT-mxw.js} +2 -2
  117. package/apps/ui/dist/server/assets/{delete-confirm-dialog-PCD7S0_M.js → delete-confirm-dialog-BcBNCxWB.js} +5 -1
  118. package/apps/ui/dist/server/assets/{empty-plugin-adapters-D3qLMPfC.js → empty-plugin-adapters-B3lHh1La.js} +1 -1
  119. package/apps/ui/dist/server/assets/{export-dialog-DaPlOGFT.js → export-dialog-D88ze9Gy.js} +54 -12
  120. package/apps/ui/dist/server/assets/kiro-db--fXrED_-.js +552 -0
  121. package/apps/ui/dist/server/assets/kiro-queries-CzNlM2ok.js +37 -0
  122. package/apps/ui/dist/server/assets/kiro-server-9WRxg2Au.js +72 -0
  123. package/apps/ui/dist/server/assets/kiro-sessions._sessionId-CRY2c7YO.js +11 -0
  124. package/apps/ui/dist/server/assets/kiro-sessions._sessionId-F1UlwxmR.js +449 -0
  125. package/apps/ui/dist/server/assets/kiro-sessions._sessionId-bvTulT7C.js +18 -0
  126. package/apps/ui/dist/server/assets/kiro-transcript-DoekQBaH.js +112 -0
  127. package/apps/ui/dist/server/assets/kiro-transcript-phase-CJG40nQg.js +27 -0
  128. package/apps/ui/dist/server/assets/kiro._workspaceKey-BDe9sQwo.js +11 -0
  129. package/apps/ui/dist/server/assets/kiro._workspaceKey-CJsjgNwO.js +28 -0
  130. package/apps/ui/dist/server/assets/kiro._workspaceKey-D_-4Qb7y.js +193 -0
  131. package/apps/ui/dist/server/assets/kiro.index-C__-UROk.js +11 -0
  132. package/apps/ui/dist/server/assets/kiro.index-CmTbqeYj.js +93 -0
  133. package/apps/ui/dist/server/assets/opencode-db-BM7KjOzc.js +397 -0
  134. package/apps/ui/dist/server/assets/opencode-queries-BeNYXnQv.js +50 -0
  135. package/apps/ui/dist/server/assets/opencode-server-BpQ_kRze.js +72 -0
  136. package/apps/ui/dist/server/assets/opencode-sessions._sessionId-CGQ-t0vD.js +518 -0
  137. package/apps/ui/dist/server/assets/opencode-sessions._sessionId-D8Q7in_Z.js +18 -0
  138. package/apps/ui/dist/server/assets/opencode-sessions._sessionId-DKOvi0lV.js +11 -0
  139. package/apps/ui/dist/server/assets/opencode-think-tags-CAoD-EcZ.js +87 -0
  140. package/apps/ui/dist/server/assets/opencode-transcript-BNTcGNym.js +141 -0
  141. package/apps/ui/dist/server/assets/opencode-transcript-phase-OqLkiQD0.js +32 -0
  142. package/apps/ui/dist/server/assets/opencode._workspaceKey-BdqcWHw1.js +11 -0
  143. package/apps/ui/dist/server/assets/opencode._workspaceKey-CfH96HTT.js +28 -0
  144. package/apps/ui/dist/server/assets/opencode._workspaceKey-DdbHPDrO.js +207 -0
  145. package/apps/ui/dist/server/assets/opencode.index-BbVzkJXP.js +11 -0
  146. package/apps/ui/dist/server/assets/opencode.index-Vh_Gq_1L.js +93 -0
  147. package/apps/ui/dist/server/assets/{projects._project-CqqUFr4l.js → projects._project-4io5LO0E.js} +5 -3
  148. package/apps/ui/dist/server/assets/{projects._project-DahGqNYS.js → projects._project-D6ZoGhJ8.js} +42 -12
  149. package/apps/ui/dist/server/assets/{projects.index-CkTeFWNU.js → projects.index-BkLiF2FF.js} +21 -7
  150. package/apps/ui/dist/server/assets/projects.index-DesYXwfi.js +14 -0
  151. package/apps/ui/dist/server/assets/route-search-ts4W9MJ9.js +38 -0
  152. package/apps/ui/dist/server/assets/router-Sac2DGk6.js +518 -0
  153. package/apps/ui/dist/server/assets/{routes-Xix3ZeSo.js → routes-Bsact1uB.js} +2 -2
  154. package/apps/ui/dist/server/assets/{routes-0x1U0IHq.js → routes-BzkJgq4W.js} +2 -2
  155. package/apps/ui/dist/server/assets/{shared-CPRNYIql.js → shared-DyhChtHf.js} +4 -1
  156. package/apps/ui/dist/server/assets/source-session-export-server-DNutCawb.js +38 -0
  157. package/apps/ui/dist/server/assets/start-B_HFwkkk.js +4 -0
  158. package/apps/ui/dist/server/assets/tabs-DkaChNVg.js +501 -0
  159. package/apps/ui/dist/server/assets/thread-transcript-stats-Dh34mt2u.js +45 -0
  160. package/apps/ui/dist/server/assets/threads._threadId-BeXEc4Lo.js +648 -0
  161. package/apps/ui/dist/server/assets/{threads._threadId-BLCkGW--.js → threads._threadId-Ci0S4mKU.js} +2 -2
  162. package/apps/ui/dist/server/assets/ui-export-files-BHLX9bhN.js +83 -0
  163. package/apps/ui/dist/server/server.js +141 -83
  164. package/package.json +28 -11
  165. package/src/lib/antigravity-db.ts +20 -13
  166. package/src/lib/claude-code-db.ts +655 -0
  167. package/src/lib/claude-code-exporter-types.ts +110 -0
  168. package/src/lib/claude-code-transcript-phase.ts +25 -0
  169. package/src/lib/claude-code-transcript.ts +180 -0
  170. package/src/lib/codex-analytics.ts +118 -18
  171. package/src/lib/codex-browser-db.ts +491 -56
  172. package/src/lib/codex-browser-export.ts +27 -71
  173. package/src/lib/codex-thread-cache.ts +17 -1
  174. package/src/lib/concurrency.ts +25 -0
  175. package/src/lib/cursor-db.ts +318 -7
  176. package/src/lib/cursor-exporter.ts +2 -2
  177. package/src/lib/kiro-db.ts +949 -0
  178. package/src/lib/kiro-exporter-types.ts +100 -0
  179. package/src/lib/kiro-transcript-phase.ts +41 -0
  180. package/src/lib/kiro-transcript.ts +115 -0
  181. package/src/lib/opencode-db.ts +610 -0
  182. package/src/lib/opencode-exporter-types.ts +129 -0
  183. package/src/lib/opencode-think-tags.ts +126 -0
  184. package/src/lib/opencode-transcript-phase.ts +50 -0
  185. package/src/lib/opencode-transcript.ts +194 -0
  186. package/src/lib/shared.ts +25 -0
  187. package/src/lib/ui-cache.ts +14 -1
  188. package/src/lib/ui-export-archive.ts +61 -0
  189. package/apps/ui/dist/client/assets/analytics-C83LcWNb.js +0 -1
  190. package/apps/ui/dist/client/assets/antigravity-conversations._conversationId-DkY8EEpK.js +0 -1
  191. package/apps/ui/dist/client/assets/antigravity-conversations._conversationId-OraHuz8j.js +0 -1
  192. package/apps/ui/dist/client/assets/antigravity-keychain-panel-DnDcq1ge.js +0 -1
  193. package/apps/ui/dist/client/assets/antigravity._workspaceKey-CQaZscA5.js +0 -1
  194. package/apps/ui/dist/client/assets/antigravity._workspaceKey-DTs99obU.js +0 -1
  195. package/apps/ui/dist/client/assets/antigravity.index-DbJa715k.js +0 -1
  196. package/apps/ui/dist/client/assets/antigravity.index-P-rs6w5X.js +0 -1
  197. package/apps/ui/dist/client/assets/badge-wgTVp-aq.js +0 -1
  198. package/apps/ui/dist/client/assets/checkbox-BUx0Gkuf.js +0 -1
  199. package/apps/ui/dist/client/assets/cursor-threads._composerId-D0DFXt8t.js +0 -1
  200. package/apps/ui/dist/client/assets/cursor-threads._composerId-tFa6Cf6A.js +0 -1
  201. package/apps/ui/dist/client/assets/cursor._workspaceKey-Df4PfA2k.js +0 -1
  202. package/apps/ui/dist/client/assets/cursor._workspaceKey-DwrzEtnV.js +0 -1
  203. package/apps/ui/dist/client/assets/cursor.index-CNBf4ZiR.js +0 -1
  204. package/apps/ui/dist/client/assets/cursor.index-DP9Hy8X6.js +0 -2
  205. package/apps/ui/dist/client/assets/delete-confirm-dialog-CPlNsLhM.js +0 -11
  206. package/apps/ui/dist/client/assets/dist-Ds3kS91l.js +0 -1
  207. package/apps/ui/dist/client/assets/download-DLuPnxpV.js +0 -1
  208. package/apps/ui/dist/client/assets/dropdown-menu-lFk6zjoL.js +0 -1
  209. package/apps/ui/dist/client/assets/es2015-D-H_iZF6.js +0 -41
  210. package/apps/ui/dist/client/assets/export-dialog-CyqyvwiP.js +0 -1
  211. package/apps/ui/dist/client/assets/formatters-DbCKP02D.js +0 -1
  212. package/apps/ui/dist/client/assets/index-C-ZPpKJ0.js +0 -22
  213. package/apps/ui/dist/client/assets/json-panel-BsngvucB.js +0 -1
  214. package/apps/ui/dist/client/assets/metadata-section-Dtl8dNag.js +0 -1
  215. package/apps/ui/dist/client/assets/metric-card-DNzR1Rne.js +0 -1
  216. package/apps/ui/dist/client/assets/page-header-dha_O7ZL.js +0 -1
  217. package/apps/ui/dist/client/assets/projects._project-B7HBhbXv.js +0 -1
  218. package/apps/ui/dist/client/assets/projects._project-DHVvuT7A.js +0 -1
  219. package/apps/ui/dist/client/assets/projects.index-BUUtx2AZ.js +0 -1
  220. package/apps/ui/dist/client/assets/projects.index-BojAe1Y4.js +0 -3
  221. package/apps/ui/dist/client/assets/refresh-ccw-B-ASKHtx.js +0 -1
  222. package/apps/ui/dist/client/assets/reload-error-panel-DD8M1BIY.js +0 -1
  223. package/apps/ui/dist/client/assets/routes-q7bzFp35.js +0 -1
  224. package/apps/ui/dist/client/assets/scroll-text-TvHyiJ_N.js +0 -1
  225. package/apps/ui/dist/client/assets/select-BFv1HMiT.js +0 -1
  226. package/apps/ui/dist/client/assets/settings-CvegTo4F.js +0 -1
  227. package/apps/ui/dist/client/assets/styles-Ch0r3kMZ.css +0 -1
  228. package/apps/ui/dist/client/assets/text-document-panel-D7Rws41o.js +0 -1
  229. package/apps/ui/dist/client/assets/text-filter-2q5pEoZh.js +0 -2
  230. package/apps/ui/dist/client/assets/threads._threadId-LpZVUlPq.js +0 -7
  231. package/apps/ui/dist/client/assets/threads._threadId-MSmNIBkq.js +0 -1
  232. package/apps/ui/dist/client/assets/useMutation-BOPJU9e0.js +0 -1
  233. package/apps/ui/dist/client/assets/useQuery-CbxZiVGF.js +0 -1
  234. package/apps/ui/dist/server/assets/_tanstack-start-manifest_v-zvGzK-Yx.js +0 -229
  235. package/apps/ui/dist/server/assets/antigravity-conversations._conversationId-JEhx-f2R.js +0 -212
  236. package/apps/ui/dist/server/assets/cursor-threads._composerId-BK3iW-3e.js +0 -218
  237. package/apps/ui/dist/server/assets/json-panel-RYsxWFae.js +0 -16
  238. package/apps/ui/dist/server/assets/metadata-section-D6Lbc7D6.js +0 -54
  239. package/apps/ui/dist/server/assets/router-K0m7dK4T.js +0 -394
  240. package/apps/ui/dist/server/assets/start-bX7bXjzw.js +0 -4
  241. package/apps/ui/dist/server/assets/text-document-panel-D8JbQWAn.js +0 -23
  242. package/apps/ui/dist/server/assets/threads._threadId-LjgsGUh-.js +0 -1052
@@ -1,1052 +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 { a as threadSnapshotQueryOptions, c as deleteThreadFn, o as threadTranscriptQueryOptions, u as exportThreadFn } from "./codex-queries-ev_mRUzr.js";
6
- import { t as Route } from "./threads._threadId-BLCkGW--.js";
7
- import { t as Checkbox$1 } from "./checkbox-C0hovF41.js";
8
- import { t as MetricCard } from "./metric-card-ByEeLu0r.js";
9
- import { t as PageHeader } from "./page-header-VNSaM3xd.js";
10
- import { a as formatModelLabel, i as formatList, n as formatBytes, r as formatDateTime, s as formatTokens, t as formatBooleanLabel } from "./formatters-FJaGZgJk.js";
11
- import { n as Breadcrumbs, t as MetadataSection } from "./metadata-section-D6Lbc7D6.js";
12
- import { n as downloadUrlFile, t as downloadTextFile } from "./download-DMmiy1xf.js";
13
- import { t as Badge } from "./badge-EvdhKK_Z.js";
14
- import { t as DeleteConfirmDialog } from "./delete-confirm-dialog-PCD7S0_M.js";
15
- import { t as ExportDialog } from "./export-dialog-DaPlOGFT.js";
16
- import { t as JsonPanel } from "./json-panel-RYsxWFae.js";
17
- import { useEffect, useRef, useState } from "react";
18
- import { Link, useNavigate } from "@tanstack/react-router";
19
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
20
- import { useMutation, useQuery, useQueryClient, useSuspenseQuery } from "@tanstack/react-query";
21
- import { Check, Copy, Download, Trash2 } from "lucide-react";
22
- import { cva } from "class-variance-authority";
23
- import { Tabs } from "radix-ui";
24
- import { useVirtualizer } from "@tanstack/react-virtual";
25
- //#region src/lib/path-utils.ts
26
- var applyPathTransforms = (text, settings, projectPath) => {
27
- return applyPathTransforms$1(text, {
28
- ...settings,
29
- projectPath
30
- });
31
- };
32
- //#endregion
33
- //#region src/components/transcript-view.tsx
34
- var isCommentaryMessage = (event) => event.kind === "message" && event.role === "assistant" && event.phase === "commentary";
35
- var shouldShowEvent = (event, showToolCalls, showExtraEvents, showCommentary, showUserMessages) => {
36
- if (isCommentaryMessage(event) && !showCommentary) return false;
37
- if (event.kind === "message") {
38
- if (event.role === "user" && !showUserMessages) return false;
39
- return !event.isHiddenByDefault || showExtraEvents;
40
- }
41
- if (event.kind === "tool_call" || event.kind === "tool_output") return showToolCalls;
42
- return showExtraEvents;
43
- };
44
- var getEventTone = (event) => {
45
- if (event.kind === "message" && event.role === "assistant") return "border-[var(--accent)]/40 bg-[var(--panel)]";
46
- if (event.kind === "message" && event.role === "user") return "border-[var(--border)] bg-[var(--panel-secondary)]";
47
- if (event.kind === "tool_call" || event.kind === "tool_output") return "border-[var(--border)] bg-[var(--code-background)]";
48
- return "border-[var(--border)] bg-[var(--panel-secondary)]/80";
49
- };
50
- var getMessageTitle = (event, assistantModel) => {
51
- const modelLabel = formatModelLabel(event.model ?? assistantModel);
52
- if (event.variant === "agent_message") return event.role === "assistant" ? modelLabel : "Assistant update";
53
- return event.role === "assistant" ? modelLabel : "User";
54
- };
55
- var getNonMessageTitle = (event) => {
56
- switch (event.kind) {
57
- case "tool_call": return `Tool call: ${event.name}`;
58
- case "tool_output": return "Tool output";
59
- case "task_started": return "Task started";
60
- case "task_complete": return "Task complete";
61
- case "token_count": return "Token update";
62
- case "reasoning": return "Reasoning";
63
- case "web_search": return "Web search";
64
- }
65
- };
66
- var getEventTitle = (event, assistantModel) => event.kind === "message" ? getMessageTitle(event, assistantModel) : getNonMessageTitle(event);
67
- var copyToClipboard = async (text) => {
68
- if (typeof navigator !== "undefined" && navigator.clipboard) try {
69
- await navigator.clipboard.writeText(text);
70
- return true;
71
- } catch {}
72
- return false;
73
- };
74
- var getEventMarkdownBody = (event, transform) => {
75
- switch (event.kind) {
76
- case "message": return transform(event.text || "No text content");
77
- case "tool_call": return [event.command ?? event.name, event.workdir].filter((value) => Boolean(value)).map(transform).join("\n\n");
78
- case "tool_output": return transform(event.summary || event.outputText || "");
79
- case "task_started": return `Context window: ${event.modelContextWindow ?? "n/a"}\n\nCollaboration mode: ${event.collaborationModeKind ?? "n/a"}`;
80
- case "task_complete": return `Duration: ${event.durationMs ?? "n/a"} ms\n\nFirst token: ${event.timeToFirstTokenMs ?? "n/a"} ms`;
81
- case "token_count": return JSON.stringify(event.rateLimits, null, 2);
82
- case "reasoning": return event.summary.join(" ") || "Reasoning content is not directly available.";
83
- case "web_search": return [`Phase: ${event.phase}${event.status ? ` · ${event.status}` : ""}`, event.query ? transform(event.query) : null].filter(Boolean).join("\n\n");
84
- }
85
- };
86
- var getEventMarkdown = (event, assistantModel, transform) => `## ${getEventTitle(event, assistantModel)}\n\n${getEventMarkdownBody(event, transform)}`;
87
- var renderMessageBody = (event, t) => /* @__PURE__ */ jsx("p", {
88
- className: "min-w-0 whitespace-pre-wrap break-words text-sm leading-6 [overflow-wrap:anywhere]",
89
- children: t(event.text || "No text content")
90
- });
91
- var renderToolCallBody = (event, t) => /* @__PURE__ */ jsxs("div", {
92
- className: "space-y-2 text-sm",
93
- children: [/* @__PURE__ */ jsx("p", {
94
- className: "min-w-0 break-words font-medium [overflow-wrap:anywhere]",
95
- children: t(event.command ?? event.name)
96
- }), event.workdir ? /* @__PURE__ */ jsx("p", {
97
- className: "font-mono text-[var(--muted-foreground)] text-xs",
98
- children: t(event.workdir)
99
- }) : null]
100
- });
101
- var renderToolOutputBody = (event, t) => /* @__PURE__ */ jsx("p", {
102
- className: "min-w-0 whitespace-pre-wrap break-words text-sm leading-6 [overflow-wrap:anywhere]",
103
- children: t(event.summary || event.outputText || "")
104
- });
105
- var renderTaskStartedBody = (event) => /* @__PURE__ */ jsxs("div", {
106
- className: "text-[var(--muted-foreground)] text-sm",
107
- children: [
108
- "Context window: ",
109
- event.modelContextWindow ?? "n/a",
110
- " · Collaboration mode: ",
111
- event.collaborationModeKind ?? "n/a"
112
- ]
113
- });
114
- var renderTaskCompleteBody = (event) => /* @__PURE__ */ jsxs("div", {
115
- className: "text-[var(--muted-foreground)] text-sm",
116
- children: [
117
- "Duration: ",
118
- event.durationMs ?? "n/a",
119
- " ms · First token: ",
120
- event.timeToFirstTokenMs ?? "n/a",
121
- " ms"
122
- ]
123
- });
124
- var renderTokenCountBody = (event) => /* @__PURE__ */ jsx("pre", {
125
- className: "overflow-x-auto text-xs leading-5",
126
- children: JSON.stringify(event.rateLimits, null, 2)
127
- });
128
- var renderReasoningBody = (event) => /* @__PURE__ */ jsxs("div", {
129
- className: "space-y-2 text-sm",
130
- children: [/* @__PURE__ */ jsx("p", { children: event.summary.join(" ") || "Reasoning content is not directly available." }), event.hasEncryptedContent ? /* @__PURE__ */ jsx("p", {
131
- className: "text-[var(--muted-foreground)] text-xs",
132
- children: "Encrypted reasoning payload captured."
133
- }) : null]
134
- });
135
- var renderWebSearchBody = (event) => /* @__PURE__ */ jsxs("div", {
136
- className: "space-y-2 text-sm",
137
- children: [/* @__PURE__ */ jsxs("p", { children: [
138
- "Phase: ",
139
- event.phase,
140
- event.status ? ` · ${event.status}` : ""
141
- ] }), event.query ? /* @__PURE__ */ jsx("p", {
142
- className: "text-[var(--muted-foreground)]",
143
- children: event.query
144
- }) : null]
145
- });
146
- var renderEventBody = (event, t) => {
147
- switch (event.kind) {
148
- case "message": return renderMessageBody(event, t);
149
- case "tool_call": return renderToolCallBody(event, t);
150
- case "tool_output": return renderToolOutputBody(event, t);
151
- case "task_started": return renderTaskStartedBody(event);
152
- case "task_complete": return renderTaskCompleteBody(event);
153
- case "token_count": return renderTokenCountBody(event);
154
- case "reasoning": return renderReasoningBody(event);
155
- case "web_search": return renderWebSearchBody(event);
156
- }
157
- };
158
- function TranscriptEventCard({ assistantModel, copied, event, isSelected, showRawJson, transform, onCopy, onSelectionChange }) {
159
- return /* @__PURE__ */ jsxs("article", {
160
- 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)),
161
- children: [
162
- /* @__PURE__ */ jsxs("div", {
163
- className: "flex flex-wrap items-start justify-between gap-2",
164
- children: [/* @__PURE__ */ jsxs("div", {
165
- className: "flex min-w-0 flex-1 flex-wrap items-center gap-2",
166
- children: [
167
- /* @__PURE__ */ jsx(Checkbox$1, {
168
- "aria-label": `Select ${getEventTitle(event, assistantModel)}`,
169
- checked: isSelected,
170
- onCheckedChange: (checked) => onSelectionChange(event, checked === true)
171
- }),
172
- /* @__PURE__ */ jsx("h3", {
173
- className: "min-w-0 break-words font-semibold text-sm [overflow-wrap:anywhere]",
174
- children: getEventTitle(event, assistantModel)
175
- }),
176
- event.kind === "message" && event.phase ? /* @__PURE__ */ jsx(Badge, {
177
- variant: "outline",
178
- children: event.phase
179
- }) : null,
180
- event.kind !== "message" ? /* @__PURE__ */ jsx(Badge, {
181
- variant: "outline",
182
- children: event.kind.replaceAll("_", " ")
183
- }) : null
184
- ]
185
- }), event.timestamp ? /* @__PURE__ */ jsx("p", {
186
- className: "shrink-0 text-[var(--muted-foreground)] text-xs",
187
- suppressHydrationWarning: true,
188
- children: formatDateTime(event.timestamp)
189
- }) : null]
190
- }),
191
- /* @__PURE__ */ jsx("div", {
192
- className: "mt-2.5 min-w-0",
193
- children: renderEventBody(event, transform)
194
- }),
195
- /* @__PURE__ */ jsx("div", {
196
- className: "mt-3 flex justify-end",
197
- children: /* @__PURE__ */ jsx(Button, {
198
- "aria-label": "Copy message",
199
- className: "text-[var(--muted-foreground)] hover:bg-[var(--panel-secondary)] hover:text-[var(--foreground)]",
200
- size: "icon-xs",
201
- variant: "ghost",
202
- onClick: () => onCopy(event),
203
- children: copied ? /* @__PURE__ */ jsx(Check, { className: "text-[var(--accent)]" }) : /* @__PURE__ */ jsx(Copy, {})
204
- })
205
- }),
206
- showRawJson ? /* @__PURE__ */ jsx("pre", {
207
- 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",
208
- children: JSON.stringify(event.raw, null, 2)
209
- }) : null
210
- ]
211
- });
212
- }
213
- function TranscriptView({ assistantModel, events, projectPath, showCommentary, showExtraEvents, showRawJson, showToolCalls, showUserMessages = true }) {
214
- const { settings } = useSettings();
215
- const visibleEvents = events.filter((event) => shouldShowEvent(event, showToolCalls, showExtraEvents, showCommentary, showUserMessages));
216
- const [copiedEventKeys, setCopiedEventKeys] = useState([]);
217
- const [copiedSelection, setCopiedSelection] = useState(false);
218
- const [copyErrorMessage, setCopyErrorMessage] = useState(null);
219
- const [selectedEventKeys, setSelectedEventKeys] = useState([]);
220
- const parentRef = useRef(null);
221
- const timeoutIdsRef = useRef([]);
222
- const useVirtualList = visibleEvents.length > 40;
223
- const getEventKey = (event) => {
224
- if (event.kind === "tool_call") return `${event.kind}-${event.sequence}-${event.callId ?? event.timestamp ?? event.name}`;
225
- if (event.kind === "tool_output") return `${event.kind}-${event.sequence}-${event.callId ?? event.timestamp ?? "output"}`;
226
- if (event.kind === "message") return `${event.kind}-${event.sequence}-${event.variant}-${event.timestamp ?? event.role}`;
227
- return `${event.kind}-${event.sequence}-${event.timestamp ?? "event"}`;
228
- };
229
- const transform = (text) => applyPathTransforms(text, settings, projectPath);
230
- const visibleEventKeys = visibleEvents.map(getEventKey);
231
- const visibleEventKeySet = new Set(visibleEventKeys);
232
- const selectedEventKeySet = new Set(selectedEventKeys);
233
- const virtualizer = useVirtualizer({
234
- count: useVirtualList ? visibleEvents.length : 0,
235
- estimateSize: () => 160,
236
- getItemKey: (index) => getEventKey(visibleEvents[index]) ?? `event-${index}`,
237
- getScrollElement: () => parentRef.current,
238
- measureElement: (element) => element.getBoundingClientRect().height,
239
- overscan: 8
240
- });
241
- useEffect(() => {
242
- return () => {
243
- for (const timeoutId of timeoutIdsRef.current) window.clearTimeout(timeoutId);
244
- timeoutIdsRef.current = [];
245
- };
246
- }, []);
247
- useEffect(() => {
248
- setSelectedEventKeys((current) => {
249
- const next = current.filter((key) => visibleEventKeySet.has(key));
250
- return next.length === current.length ? current : next;
251
- });
252
- }, [visibleEventKeySet]);
253
- const scheduleTimeout = (callback, delayMs) => {
254
- const timeoutId = window.setTimeout(() => {
255
- timeoutIdsRef.current = timeoutIdsRef.current.filter((entry) => entry !== timeoutId);
256
- callback();
257
- }, delayMs);
258
- timeoutIdsRef.current.push(timeoutId);
259
- };
260
- const showCopyFailure = () => {
261
- setCopyErrorMessage("Copy failed");
262
- scheduleTimeout(() => {
263
- setCopyErrorMessage((current) => current === "Copy failed" ? null : current);
264
- }, 1500);
265
- };
266
- const visibleSelectedKeys = selectedEventKeys.filter((key) => visibleEventKeySet.has(key));
267
- const allVisibleSelected = visibleEvents.length > 0 && visibleSelectedKeys.length === visibleEvents.length;
268
- const handleSelectionChange = (event, checked) => {
269
- const key = getEventKey(event);
270
- setSelectedEventKeys((current) => checked ? current.includes(key) ? current : [...current, key] : current.filter((entry) => entry !== key));
271
- };
272
- const handleToggleAllVisible = (checked) => {
273
- setSelectedEventKeys((current) => checked ? [...new Set([...current.filter((key) => !visibleEventKeySet.has(key)), ...visibleEventKeys])] : current.filter((key) => !visibleEventKeySet.has(key)));
274
- };
275
- const handleCopyEvent = async (event) => {
276
- if (!await copyToClipboard(getEventMarkdown(event, assistantModel, transform))) {
277
- showCopyFailure();
278
- return;
279
- }
280
- const key = getEventKey(event);
281
- setCopiedEventKeys((current) => [...new Set([...current, key])]);
282
- scheduleTimeout(() => {
283
- setCopiedEventKeys((current) => current.filter((entry) => entry !== key));
284
- }, 1500);
285
- };
286
- const handleCopySelected = async () => {
287
- const selectedEvents = visibleEvents.filter((event) => visibleSelectedKeys.includes(getEventKey(event)));
288
- if (selectedEvents.length === 0) return;
289
- if (!await copyToClipboard(selectedEvents.map((event) => getEventMarkdown(event, assistantModel, transform)).join("\n\n"))) {
290
- showCopyFailure();
291
- return;
292
- }
293
- setCopiedSelection(true);
294
- scheduleTimeout(() => {
295
- setCopiedSelection(false);
296
- }, 1500);
297
- };
298
- if (useVirtualList) return /* @__PURE__ */ jsxs("div", {
299
- ref: parentRef,
300
- className: "h-[70vh] overflow-auto rounded-xl border border-[var(--border)] bg-[var(--panel)] p-3",
301
- children: [/* @__PURE__ */ jsxs("div", {
302
- 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",
303
- children: [/* @__PURE__ */ jsxs("div", {
304
- className: "flex items-center gap-2",
305
- children: [
306
- /* @__PURE__ */ jsx(Checkbox$1, {
307
- "aria-label": "Select visible messages",
308
- checked: allVisibleSelected,
309
- onCheckedChange: (checked) => handleToggleAllVisible(checked === true)
310
- }),
311
- /* @__PURE__ */ jsxs("span", {
312
- className: "text-[var(--muted-foreground)] text-sm",
313
- children: [visibleSelectedKeys.length, " selected"]
314
- }),
315
- copyErrorMessage ? /* @__PURE__ */ jsx("span", {
316
- className: "text-[var(--destructive)] text-sm",
317
- children: copyErrorMessage
318
- }) : null
319
- ]
320
- }), /* @__PURE__ */ jsxs(Button, {
321
- "aria-label": "Copy selected messages",
322
- className: "hover:bg-[var(--panel-secondary)] hover:text-[var(--foreground)]",
323
- disabled: visibleSelectedKeys.length === 0,
324
- size: "sm",
325
- variant: "outline",
326
- onClick: () => void handleCopySelected(),
327
- children: [copiedSelection ? /* @__PURE__ */ jsx(Check, { className: "text-[var(--accent)]" }) : /* @__PURE__ */ jsx(Copy, {}), copiedSelection ? "Copied" : "Copy"]
328
- })]
329
- }), /* @__PURE__ */ jsx("div", {
330
- className: "relative w-full",
331
- style: { height: `${virtualizer.getTotalSize()}px` },
332
- children: virtualizer.getVirtualItems().map((item) => /* @__PURE__ */ jsx("div", {
333
- ref: virtualizer.measureElement,
334
- "data-index": item.index,
335
- className: "absolute top-0 left-0 w-full pb-3.5",
336
- style: { transform: `translateY(${item.start}px)` },
337
- children: /* @__PURE__ */ jsx(TranscriptEventCard, {
338
- assistantModel,
339
- copied: copiedEventKeys.includes(getEventKey(visibleEvents[item.index])),
340
- event: visibleEvents[item.index],
341
- isSelected: selectedEventKeySet.has(getEventKey(visibleEvents[item.index])),
342
- showRawJson,
343
- transform,
344
- onCopy: (event) => void handleCopyEvent(event),
345
- onSelectionChange: handleSelectionChange
346
- })
347
- }, item.key))
348
- })]
349
- });
350
- return /* @__PURE__ */ jsxs("div", {
351
- className: "space-y-3.5",
352
- children: [/* @__PURE__ */ jsxs("div", {
353
- 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",
354
- children: [/* @__PURE__ */ jsxs("div", {
355
- className: "flex items-center gap-2",
356
- children: [
357
- /* @__PURE__ */ jsx(Checkbox$1, {
358
- "aria-label": "Select visible messages",
359
- checked: allVisibleSelected,
360
- onCheckedChange: (checked) => handleToggleAllVisible(checked === true)
361
- }),
362
- /* @__PURE__ */ jsxs("span", {
363
- className: "text-[var(--muted-foreground)] text-sm",
364
- children: [visibleSelectedKeys.length, " selected"]
365
- }),
366
- copyErrorMessage ? /* @__PURE__ */ jsx("span", {
367
- className: "text-[var(--destructive)] text-sm",
368
- children: copyErrorMessage
369
- }) : null
370
- ]
371
- }), /* @__PURE__ */ jsxs(Button, {
372
- "aria-label": "Copy selected messages",
373
- className: "hover:bg-[var(--panel-secondary)] hover:text-[var(--foreground)]",
374
- disabled: visibleSelectedKeys.length === 0,
375
- size: "sm",
376
- variant: "outline",
377
- onClick: () => void handleCopySelected(),
378
- children: [copiedSelection ? /* @__PURE__ */ jsx(Check, { className: "text-[var(--accent)]" }) : /* @__PURE__ */ jsx(Copy, {}), copiedSelection ? "Copied" : "Copy"]
379
- })]
380
- }), visibleEvents.map((event) => /* @__PURE__ */ jsx(TranscriptEventCard, {
381
- assistantModel,
382
- copied: copiedEventKeys.includes(getEventKey(event)),
383
- event,
384
- isSelected: selectedEventKeySet.has(getEventKey(event)),
385
- showRawJson,
386
- transform,
387
- onCopy: (selectedEvent) => void handleCopyEvent(selectedEvent),
388
- onSelectionChange: handleSelectionChange
389
- }, getEventKey(event)))]
390
- });
391
- }
392
- //#endregion
393
- //#region src/components/ui/tabs.tsx
394
- function Tabs$1({ className, orientation = "horizontal", ...props }) {
395
- return /* @__PURE__ */ jsx(Tabs.Root, {
396
- "data-slot": "tabs",
397
- "data-orientation": orientation,
398
- orientation,
399
- className: cn("group/tabs flex gap-2 data-[orientation=horizontal]:flex-col", className),
400
- ...props
401
- });
402
- }
403
- 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", {
404
- defaultVariants: { variant: "default" },
405
- variants: { variant: {
406
- default: "bg-muted",
407
- line: "gap-1 bg-transparent"
408
- } }
409
- });
410
- function TabsList({ className, variant = "default", ...props }) {
411
- return /* @__PURE__ */ jsx(Tabs.List, {
412
- "data-slot": "tabs-list",
413
- "data-variant": variant,
414
- className: cn(tabsListVariants({ variant }), className),
415
- ...props
416
- });
417
- }
418
- function TabsTrigger({ className, ...props }) {
419
- return /* @__PURE__ */ jsx(Tabs.Trigger, {
420
- "data-slot": "tabs-trigger",
421
- 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),
422
- ...props
423
- });
424
- }
425
- function TabsContent({ className, ...props }) {
426
- return /* @__PURE__ */ jsx(Tabs.Content, {
427
- "data-slot": "tabs-content",
428
- className: cn("flex-1 outline-none", className),
429
- ...props
430
- });
431
- }
432
- //#endregion
433
- //#region src/routes/threads.$threadId.tsx?tsr-split=component
434
- var buildThreadItems = (snapshot) => {
435
- return [
436
- {
437
- label: "Thread ID",
438
- value: /* @__PURE__ */ jsx("span", {
439
- "data-mono": "true",
440
- children: snapshot.thread.id
441
- })
442
- },
443
- {
444
- label: "Project",
445
- value: snapshot.project
446
- },
447
- {
448
- label: "CWD",
449
- value: /* @__PURE__ */ jsx("span", {
450
- "data-mono": "true",
451
- children: snapshot.thread.cwd
452
- })
453
- },
454
- {
455
- label: "Created",
456
- value: /* @__PURE__ */ jsx("span", {
457
- suppressHydrationWarning: true,
458
- children: formatDateTime(snapshot.thread.created_at_ms ?? snapshot.thread.created_at * 1e3)
459
- })
460
- },
461
- {
462
- label: "Updated",
463
- value: /* @__PURE__ */ jsx("span", {
464
- suppressHydrationWarning: true,
465
- children: formatDateTime(snapshot.thread.updated_at_ms ?? snapshot.thread.updated_at * 1e3)
466
- })
467
- },
468
- {
469
- label: "Session started",
470
- value: /* @__PURE__ */ jsx("span", {
471
- suppressHydrationWarning: true,
472
- children: formatDateTime(snapshot.transcript?.sessionMeta.timestamp ?? null)
473
- })
474
- },
475
- {
476
- label: "Rollout size",
477
- value: formatBytes(snapshot.rollout.fileSizeBytes)
478
- },
479
- {
480
- label: "Archived",
481
- value: formatBooleanLabel(Boolean(snapshot.thread.archived))
482
- },
483
- {
484
- label: "Archived at",
485
- value: /* @__PURE__ */ jsx("span", {
486
- suppressHydrationWarning: true,
487
- children: formatDateTime(snapshot.thread.archived_at ? snapshot.thread.archived_at * 1e3 : null)
488
- })
489
- }
490
- ];
491
- };
492
- var buildRuntimeItems = (snapshot) => {
493
- return [
494
- {
495
- label: "Source",
496
- value: snapshot.thread.source
497
- },
498
- {
499
- label: "Originator",
500
- value: snapshot.transcript?.sessionMeta.originator ?? "n/a"
501
- },
502
- {
503
- label: "Model provider",
504
- value: snapshot.thread.model_provider
505
- },
506
- {
507
- label: "Reasoning effort",
508
- value: snapshot.thread.reasoning_effort ?? "n/a"
509
- },
510
- {
511
- label: "CLI version",
512
- value: snapshot.thread.cli_version
513
- },
514
- {
515
- label: "Approval mode",
516
- value: snapshot.thread.approval_mode
517
- },
518
- {
519
- label: "Memory mode",
520
- value: snapshot.thread.memory_mode
521
- },
522
- {
523
- label: "Has user event",
524
- value: formatBooleanLabel(Boolean(snapshot.thread.has_user_event))
525
- }
526
- ];
527
- };
528
- var buildGitItems = (snapshot) => {
529
- return [
530
- {
531
- label: "Git branch",
532
- value: snapshot.thread.git_branch ?? "n/a"
533
- },
534
- {
535
- label: "Git SHA",
536
- value: snapshot.thread.git_sha ?? "n/a"
537
- },
538
- {
539
- label: "Git remote",
540
- value: snapshot.thread.git_origin_url ?? "n/a"
541
- },
542
- {
543
- label: "Agent nickname",
544
- value: snapshot.thread.agent_nickname ?? "n/a"
545
- },
546
- {
547
- label: "Agent role",
548
- value: snapshot.thread.agent_role ?? "n/a"
549
- },
550
- {
551
- label: "Agent path",
552
- value: snapshot.thread.agent_path ?? "n/a"
553
- }
554
- ];
555
- };
556
- var buildRelationItems = (snapshot) => {
557
- const parentThreadValue = snapshot.relations.parentThreadId ? /* @__PURE__ */ jsx(Link, {
558
- className: "text-[var(--accent)]",
559
- params: { threadId: snapshot.relations.parentThreadId },
560
- to: "/threads/$threadId",
561
- children: snapshot.relations.parentThreadId
562
- }) : "n/a";
563
- const childThreadValue = snapshot.relations.childEdges.length > 0 ? /* @__PURE__ */ jsx("div", {
564
- className: "flex flex-wrap gap-2",
565
- children: snapshot.relations.childEdges.map((edge) => /* @__PURE__ */ jsx(Link, {
566
- className: "rounded-full border border-[var(--border)] px-3 py-1 text-[var(--accent)] text-xs",
567
- params: { threadId: edge.child_thread_id },
568
- to: "/threads/$threadId",
569
- children: edge.child_thread_id
570
- }, edge.child_thread_id))
571
- }) : "n/a";
572
- return [
573
- {
574
- label: "Parent thread",
575
- value: parentThreadValue
576
- },
577
- {
578
- label: "Child threads",
579
- value: childThreadValue
580
- },
581
- {
582
- label: "First user message",
583
- value: snapshot.thread.first_user_message || "n/a"
584
- },
585
- {
586
- label: "Preview",
587
- value: snapshot.thread.preview || "n/a"
588
- }
589
- ];
590
- };
591
- var buildTranscriptStatsItems = (snapshot) => {
592
- if (!snapshot.transcript) {
593
- if (snapshot.transcriptState === "missing") return [
594
- {
595
- label: "Transcript load",
596
- value: "Transcript file missing from disk"
597
- },
598
- {
599
- label: "Rollout path",
600
- value: snapshot.thread.rollout_path
601
- },
602
- {
603
- label: "Preview mode",
604
- value: "Export and transcript browsing are unavailable until the file exists again."
605
- }
606
- ];
607
- return [
608
- {
609
- label: "Transcript load",
610
- value: "Deferred for oversized rollout"
611
- },
612
- {
613
- label: "Rollout size",
614
- value: formatBytes(snapshot.rollout.fileSizeBytes)
615
- },
616
- {
617
- label: "Preview mode",
618
- value: "Load the transcript manually to inspect it."
619
- }
620
- ];
621
- }
622
- return [
623
- {
624
- label: "Event kinds",
625
- value: formatList([...new Set(snapshot.transcript.events.map((event) => event.kind))])
626
- },
627
- {
628
- label: "Stats scope",
629
- value: snapshot.transcript.statsArePartial ? "Preview only" : "Full transcript"
630
- },
631
- {
632
- label: "Tool calls",
633
- value: String(snapshot.transcript.stats.toolCallCount)
634
- },
635
- {
636
- label: "Exec calls",
637
- value: String(snapshot.transcript.stats.execCommandCount)
638
- },
639
- {
640
- label: "Web search events",
641
- value: String(snapshot.transcript.stats.webSearchEventCount)
642
- },
643
- {
644
- label: "Assistant messages",
645
- value: String(snapshot.transcript.stats.assistantMessageCount)
646
- },
647
- {
648
- label: "Commentary updates",
649
- value: String(snapshot.transcript.stats.commentaryCount)
650
- }
651
- ];
652
- };
653
- function TranscriptControls({ rawJsonDisabled = false, showCommentary, showExtraEvents, showRawJson, showToolCalls, showUserMessages, onShowCommentaryChange, onShowExtraEventsChange, onShowRawJsonChange, onShowToolCallsChange, onShowUserMessagesChange }) {
654
- return /* @__PURE__ */ jsxs("div", {
655
- className: "flex flex-wrap gap-4 rounded-xl border border-[var(--border)] bg-[var(--panel)] px-4 py-3 shadow-[var(--panel-shadow)]",
656
- children: [
657
- /* @__PURE__ */ jsxs("div", {
658
- className: "flex items-center gap-2 text-sm",
659
- children: [/* @__PURE__ */ jsx(Checkbox$1, {
660
- checked: showToolCalls,
661
- id: "transcript-show-tool-calls",
662
- onCheckedChange: (checked) => onShowToolCallsChange(checked === true)
663
- }), /* @__PURE__ */ jsx("label", {
664
- htmlFor: "transcript-show-tool-calls",
665
- children: "Show tool calls"
666
- })]
667
- }),
668
- /* @__PURE__ */ jsxs("div", {
669
- className: "flex items-center gap-2 text-sm",
670
- children: [/* @__PURE__ */ jsx(Checkbox$1, {
671
- checked: showCommentary,
672
- id: "transcript-show-commentary",
673
- onCheckedChange: (checked) => onShowCommentaryChange(checked === true)
674
- }), /* @__PURE__ */ jsx("label", {
675
- htmlFor: "transcript-show-commentary",
676
- children: "Show commentary"
677
- })]
678
- }),
679
- /* @__PURE__ */ jsxs("div", {
680
- className: "flex items-center gap-2 text-sm",
681
- children: [/* @__PURE__ */ jsx(Checkbox$1, {
682
- checked: showExtraEvents,
683
- id: "transcript-show-extra-events",
684
- onCheckedChange: (checked) => onShowExtraEventsChange(checked === true)
685
- }), /* @__PURE__ */ jsx("label", {
686
- htmlFor: "transcript-show-extra-events",
687
- children: "Show extra events"
688
- })]
689
- }),
690
- /* @__PURE__ */ jsxs("div", {
691
- className: "flex items-center gap-2 text-sm",
692
- children: [/* @__PURE__ */ jsx(Checkbox$1, {
693
- checked: showRawJson,
694
- disabled: rawJsonDisabled,
695
- id: "transcript-show-raw-json",
696
- onCheckedChange: (checked) => onShowRawJsonChange(checked === true)
697
- }), /* @__PURE__ */ jsx("label", {
698
- htmlFor: "transcript-show-raw-json",
699
- children: "Raw JSON"
700
- })]
701
- }),
702
- /* @__PURE__ */ jsxs("div", {
703
- className: "flex items-center gap-2 text-sm",
704
- children: [/* @__PURE__ */ jsx(Checkbox$1, {
705
- checked: showUserMessages,
706
- id: "transcript-show-user-messages",
707
- onCheckedChange: (checked) => onShowUserMessagesChange(checked === true)
708
- }), /* @__PURE__ */ jsx("label", {
709
- htmlFor: "transcript-show-user-messages",
710
- children: "User"
711
- })]
712
- })
713
- ]
714
- });
715
- }
716
- function ThreadMetadataPanels({ snapshot }) {
717
- return /* @__PURE__ */ jsxs("div", {
718
- className: "grid gap-4 xl:grid-cols-[1.1fr_0.9fr]",
719
- children: [/* @__PURE__ */ jsxs("div", {
720
- className: "space-y-4",
721
- children: [
722
- /* @__PURE__ */ jsx(MetadataSection, {
723
- items: buildThreadItems(snapshot),
724
- title: "Thread"
725
- }),
726
- /* @__PURE__ */ jsx(MetadataSection, {
727
- items: buildRuntimeItems(snapshot),
728
- title: "Runtime"
729
- }),
730
- /* @__PURE__ */ jsx(MetadataSection, {
731
- items: buildGitItems(snapshot),
732
- title: "Git and agent"
733
- })
734
- ]
735
- }), /* @__PURE__ */ jsxs("div", {
736
- className: "space-y-4",
737
- children: [
738
- /* @__PURE__ */ jsx(MetadataSection, {
739
- items: buildRelationItems(snapshot),
740
- title: "Relations and summary"
741
- }),
742
- /* @__PURE__ */ jsxs("section", {
743
- className: "rounded-[1.6rem] border border-[var(--border)] bg-[var(--panel)] p-5 shadow-[var(--panel-shadow)]",
744
- children: [/* @__PURE__ */ jsx("h3", {
745
- className: "font-semibold text-[var(--muted-foreground)] text-sm uppercase tracking-[0.18em]",
746
- children: "Available tools"
747
- }), /* @__PURE__ */ jsx("div", {
748
- className: "mt-4 space-y-3",
749
- children: snapshot.availableTools.map((tool) => /* @__PURE__ */ jsxs("div", {
750
- className: "rounded-xl border border-[var(--border)] bg-[var(--panel-secondary)] p-3.5",
751
- children: [/* @__PURE__ */ jsxs("div", {
752
- className: "flex flex-wrap items-center gap-2",
753
- children: [/* @__PURE__ */ jsx("p", {
754
- className: "font-medium font-mono text-sm",
755
- children: tool.name
756
- }), tool.namespace ? /* @__PURE__ */ jsx(Badge, {
757
- variant: "outline",
758
- children: tool.namespace
759
- }) : null]
760
- }), /* @__PURE__ */ jsx("p", {
761
- className: "mt-1.5 text-[var(--muted-foreground)] text-sm",
762
- children: tool.description || "No description."
763
- })]
764
- }, `${tool.name}-${tool.namespace ?? "global"}`))
765
- })]
766
- }),
767
- /* @__PURE__ */ jsx(MetadataSection, {
768
- items: buildTranscriptStatsItems(snapshot),
769
- title: "Transcript stats"
770
- })
771
- ]
772
- })]
773
- });
774
- }
775
- function ThreadRawPanels({ snapshot }) {
776
- if (!snapshot.transcript) return /* @__PURE__ */ jsx("div", {
777
- className: "rounded-xl border border-[var(--border)] bg-[var(--panel)] px-5 py-4 text-sm",
778
- children: snapshot.transcriptState === "missing" ? "The rollout JSONL file is missing from disk, so raw transcript payloads are unavailable." : "Raw transcript payloads are deferred for oversized rollouts. Use Export if you only need the full thread contents, or load the transcript manually from the Transcript tab."
779
- });
780
- return /* @__PURE__ */ jsxs("div", {
781
- className: "space-y-4",
782
- children: [
783
- /* @__PURE__ */ jsx(JsonPanel, {
784
- title: "Session meta",
785
- value: snapshot.transcript.sessionMeta
786
- }),
787
- /* @__PURE__ */ jsx(JsonPanel, {
788
- title: "Turn contexts",
789
- value: snapshot.transcript.turnContexts
790
- }),
791
- /* @__PURE__ */ jsx(JsonPanel, {
792
- title: "Sandbox policy",
793
- value: snapshot.thread.sandbox_policy
794
- })
795
- ]
796
- });
797
- }
798
- function DeferredTranscriptNotice({ fileSizeBytes, missing, pending, onLoad }) {
799
- return /* @__PURE__ */ jsxs("section", {
800
- className: "rounded-[1.6rem] border border-[var(--border)] bg-[var(--panel)] p-5 shadow-[var(--panel-shadow)]",
801
- children: [
802
- /* @__PURE__ */ jsx("h3", {
803
- className: "font-semibold text-base",
804
- children: missing ? "Transcript file missing" : "This is a very big thread"
805
- }),
806
- /* @__PURE__ */ jsx("p", {
807
- className: "mt-2 text-[var(--muted-foreground)] text-sm leading-6",
808
- children: missing ? "The rollout JSONL referenced by this thread is no longer present on disk. Export may still work if the file is restored, but transcript browsing is unavailable right now." : `Spiracha skipped loading the transcript automatically because the rollout file is ${formatBytes(fileSizeBytes)}. Export still works immediately. If you need to inspect the thread here, load a bounded preview manually.`
809
- }),
810
- missing ? null : /* @__PURE__ */ jsx("div", {
811
- className: "mt-4",
812
- children: /* @__PURE__ */ jsx(Button, {
813
- disabled: pending,
814
- variant: "outline",
815
- onClick: onLoad,
816
- children: pending ? "Loading preview..." : "Load transcript preview"
817
- })
818
- })
819
- ]
820
- });
821
- }
822
- function ThreadDetailPage() {
823
- const navigate = useNavigate();
824
- const queryClient = useQueryClient();
825
- const params = Route.useParams();
826
- const snapshot = useSuspenseQuery(threadSnapshotQueryOptions(params.threadId)).data;
827
- const { settings } = useSettings();
828
- const [shouldLoadTranscript, setShouldLoadTranscript] = useState(!snapshot.rollout.shouldDeferTranscriptLoad);
829
- const [showToolCalls, setShowToolCalls] = useState(false);
830
- const [showCommentary, setShowCommentary] = useState(false);
831
- const [showExtraEvents, setShowExtraEvents] = useState(false);
832
- const [showRawJson, setShowRawJson] = useState(false);
833
- const [showUserMessages, setShowUserMessages] = useState(true);
834
- const [exportOpen, setExportOpen] = useState(false);
835
- const [deleteOpen, setDeleteOpen] = useState(false);
836
- const transcriptQuery = useQuery({
837
- ...threadTranscriptQueryOptions(params.threadId),
838
- enabled: shouldLoadTranscript && snapshot.transcript === null
839
- });
840
- const transcript = snapshot.transcript ?? transcriptQuery.data ?? null;
841
- const viewSnapshot = {
842
- ...snapshot,
843
- transcript
844
- };
845
- const exportThreadMutation = useMutation({
846
- mutationFn: async (options) => {
847
- console.info("[spiracha:export-ui] request", {
848
- outputFormat: options.outputFormat,
849
- project: snapshot.project,
850
- selectedThreadCount: 1,
851
- selectedThreadIds: [snapshot.thread.id]
852
- });
853
- const download = await exportThreadFn({ data: {
854
- ...options,
855
- ...settings,
856
- threadId: snapshot.thread.id
857
- } });
858
- console.info("[spiracha:export-ui] response", {
859
- downloadUrl: download.mode === "download_url" ? download.downloadUrl : null,
860
- fileName: download.fileName,
861
- mode: download.mode,
862
- project: snapshot.project,
863
- selectedThreadCount: 1
864
- });
865
- if (download.mode === "download") {
866
- downloadTextFile(download.fileName, download.content, download.mimeType);
867
- return;
868
- }
869
- await downloadUrlFile(download.fileName, download.downloadUrl);
870
- },
871
- onError: (error) => {
872
- console.error("[spiracha:export-ui] failed", {
873
- error: error instanceof Error ? error.message : String(error),
874
- project: snapshot.project,
875
- selectedThreadCount: 1,
876
- selectedThreadIds: [snapshot.thread.id]
877
- });
878
- },
879
- onSuccess: async () => {
880
- setExportOpen(false);
881
- }
882
- });
883
- const deleteThreadMutation = useMutation({
884
- mutationFn: (input) => deleteThreadFn({ data: {
885
- deleteSessionFiles: input.deleteSessionFiles,
886
- threadId: snapshot.thread.id
887
- } }),
888
- onSuccess: async () => {
889
- await Promise.all([
890
- queryClient.invalidateQueries({ queryKey: ["analytics"] }),
891
- queryClient.invalidateQueries({ queryKey: ["dashboard"] }),
892
- queryClient.invalidateQueries({ queryKey: ["project-threads", snapshot.project] }),
893
- queryClient.invalidateQueries({ queryKey: ["projects"] })
894
- ]);
895
- navigate({
896
- params: { project: snapshot.project },
897
- to: "/projects/$project"
898
- });
899
- }
900
- });
901
- return /* @__PURE__ */ jsxs("div", {
902
- className: "space-y-5",
903
- children: [
904
- /* @__PURE__ */ jsx(PageHeader, {
905
- actions: /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs(Button, {
906
- className: "rounded-full",
907
- variant: "outline",
908
- onClick: () => setExportOpen(true),
909
- children: [/* @__PURE__ */ jsx(Download, { className: "mr-2 size-4" }), "Export"]
910
- }), /* @__PURE__ */ jsxs(Button, {
911
- className: "rounded-full border-[var(--destructive)]/20 text-[var(--destructive)]",
912
- variant: "outline",
913
- onClick: () => setDeleteOpen(true),
914
- children: [/* @__PURE__ */ jsx(Trash2, { className: "mr-2 size-4" }), "Delete"]
915
- })] }),
916
- breadcrumb: /* @__PURE__ */ jsx(Breadcrumbs, { items: [
917
- {
918
- label: "Codex",
919
- to: "/projects"
920
- },
921
- {
922
- label: snapshot.project,
923
- params: { project: snapshot.project },
924
- to: "/projects/$project"
925
- },
926
- { label: snapshot.thread.title }
927
- ] }),
928
- eyebrow: snapshot.project,
929
- subtitle: snapshot.thread.preview,
930
- title: snapshot.thread.title
931
- }),
932
- /* @__PURE__ */ jsxs("div", {
933
- className: "grid gap-3 md:grid-cols-2 xl:grid-cols-4",
934
- children: [
935
- /* @__PURE__ */ jsx(MetricCard, {
936
- label: "Model",
937
- value: snapshot.thread.model ?? "unknown"
938
- }),
939
- /* @__PURE__ */ jsx(MetricCard, {
940
- label: "Tokens",
941
- value: formatTokens(snapshot.thread.tokens_used)
942
- }),
943
- /* @__PURE__ */ jsx(MetricCard, {
944
- label: "Updated",
945
- value: /* @__PURE__ */ jsx("span", {
946
- suppressHydrationWarning: true,
947
- children: formatDateTime(snapshot.thread.updated_at_ms ?? snapshot.thread.updated_at * 1e3)
948
- })
949
- }),
950
- /* @__PURE__ */ jsx(MetricCard, {
951
- label: "Thread source",
952
- value: snapshot.thread.thread_source ?? transcript?.sessionMeta.threadSource ?? "n/a"
953
- })
954
- ]
955
- }),
956
- /* @__PURE__ */ jsxs(Tabs$1, {
957
- className: "space-y-4",
958
- defaultValue: "transcript",
959
- children: [
960
- /* @__PURE__ */ jsxs(TabsList, {
961
- className: "grid w-fit min-w-[24rem] grid-cols-3 rounded-full border border-[var(--border)] bg-[var(--panel)] p-1",
962
- children: [
963
- /* @__PURE__ */ jsx(TabsTrigger, {
964
- className: "rounded-full px-5 text-sm",
965
- value: "transcript",
966
- children: "Transcript"
967
- }),
968
- /* @__PURE__ */ jsx(TabsTrigger, {
969
- className: "rounded-full px-5 text-sm",
970
- value: "metadata",
971
- children: "Metadata"
972
- }),
973
- /* @__PURE__ */ jsx(TabsTrigger, {
974
- className: "rounded-full px-5 text-sm",
975
- value: "raw",
976
- children: "Raw"
977
- })
978
- ]
979
- }),
980
- /* @__PURE__ */ jsxs(TabsContent, {
981
- className: "space-y-3",
982
- value: "transcript",
983
- children: [
984
- /* @__PURE__ */ jsx(TranscriptControls, {
985
- rawJsonDisabled: !transcript?.rawIncluded,
986
- showCommentary,
987
- showExtraEvents,
988
- showRawJson,
989
- showToolCalls,
990
- showUserMessages,
991
- onShowCommentaryChange: setShowCommentary,
992
- onShowExtraEventsChange: setShowExtraEvents,
993
- onShowRawJsonChange: setShowRawJson,
994
- onShowToolCallsChange: setShowToolCalls,
995
- onShowUserMessagesChange: setShowUserMessages
996
- }),
997
- transcript ? /* @__PURE__ */ jsx(TranscriptView, {
998
- assistantModel: snapshot.thread.model,
999
- events: transcript.events,
1000
- projectPath: snapshot.thread.cwd,
1001
- showCommentary,
1002
- showExtraEvents,
1003
- showRawJson: showRawJson && transcript.rawIncluded,
1004
- showToolCalls,
1005
- showUserMessages
1006
- }) : /* @__PURE__ */ jsx(DeferredTranscriptNotice, {
1007
- fileSizeBytes: snapshot.rollout.fileSizeBytes,
1008
- missing: snapshot.transcriptState === "missing",
1009
- pending: transcriptQuery.isFetching,
1010
- onLoad: () => setShouldLoadTranscript(true)
1011
- }),
1012
- transcriptQuery.isError ? /* @__PURE__ */ jsxs("p", {
1013
- className: "text-[var(--destructive)] text-sm",
1014
- children: [
1015
- "Failed to load transcript preview:",
1016
- " ",
1017
- transcriptQuery.error instanceof Error ? transcriptQuery.error.message : "Unknown error"
1018
- ]
1019
- }) : null
1020
- ]
1021
- }),
1022
- /* @__PURE__ */ jsx(TabsContent, {
1023
- value: "metadata",
1024
- children: /* @__PURE__ */ jsx(ThreadMetadataPanels, { snapshot: viewSnapshot })
1025
- }),
1026
- /* @__PURE__ */ jsx(TabsContent, {
1027
- value: "raw",
1028
- children: /* @__PURE__ */ jsx(ThreadRawPanels, { snapshot: viewSnapshot })
1029
- })
1030
- ]
1031
- }),
1032
- /* @__PURE__ */ jsx(DeleteConfirmDialog, {
1033
- confirmLabel: deleteThreadMutation.isPending ? "Deleting..." : "Delete thread",
1034
- defaultDeleteSessionFiles: true,
1035
- description: "Delete this thread from the Codex database. Enable Delete Session files if you also want to remove the rollout JSONL from disk.",
1036
- open: deleteOpen,
1037
- showDeleteSessionFilesOption: true,
1038
- title: "Delete this thread from Codex DB?",
1039
- onConfirm: ({ deleteSessionFiles }) => deleteThreadMutation.mutate({ deleteSessionFiles }),
1040
- onOpenChange: setDeleteOpen
1041
- }),
1042
- /* @__PURE__ */ jsx(ExportDialog, {
1043
- open: exportOpen,
1044
- pending: exportThreadMutation.isPending,
1045
- onExport: (options) => exportThreadMutation.mutate(options),
1046
- onOpenChange: setExportOpen
1047
- })
1048
- ]
1049
- });
1050
- }
1051
- //#endregion
1052
- export { ThreadDetailPage as component };