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
@@ -0,0 +1,50 @@
1
+ import { t as createServerFn } from "../server.js";
2
+ import { t as isRetryableSqliteError } from "./sqlite-error-LZDrnxdd.js";
3
+ import { t as createSsrRpc } from "./createSsrRpc-C754NPki.js";
4
+ import { z } from "zod";
5
+ import { queryOptions } from "@tanstack/react-query";
6
+ //#region src/lib/opencode-server.ts
7
+ var workspaceSchema = z.object({ workspaceKey: z.string().min(1) });
8
+ var sessionSchema = z.object({ sessionId: z.string().min(1) });
9
+ var exportSessionSchema = z.object({
10
+ includeCommentary: z.boolean().default(true),
11
+ includeMetadata: z.boolean().default(true),
12
+ includeTools: z.boolean().default(true),
13
+ outputFormat: z.enum(["md", "txt"]).default("md"),
14
+ sessionId: z.string().min(1),
15
+ zipArchive: z.boolean().default(false)
16
+ });
17
+ var listOpenCodeWorkspacesFn = createServerFn({ method: "GET" }).handler(createSsrRpc("1579290293aa3c05864abeb16b20e7fbe85fe73b2518d8ba75dbc536dfc02b88"));
18
+ var listOpenCodeSessionsFn = createServerFn({ method: "GET" }).validator(workspaceSchema).handler(createSsrRpc("1d8e6aec1907ff012d654cbfaa89e559078a0c2d80a02f4b257d9a179a002e36"));
19
+ var getOpenCodeSessionDetailFn = createServerFn({ method: "GET" }).validator(sessionSchema).handler(createSsrRpc("0fdecc913045cc27ae7462cd3c143af926650dece043ca1a111e0e83a3cd327b"));
20
+ var exportOpenCodeSessionFn = createServerFn({ method: "POST" }).validator(exportSessionSchema).handler(createSsrRpc("c051a060ff7f4d39e308fd586d9f81f576b53e96f37bdc56dd80112679f01218"));
21
+ //#endregion
22
+ //#region src/lib/opencode-queries.ts
23
+ var retrySqliteQuery = (failureCount, error) => {
24
+ return failureCount < 3 && isRetryableSqliteError(error);
25
+ };
26
+ var retryDelay = (attemptIndex) => {
27
+ return [150, 400][attemptIndex] ?? 800;
28
+ };
29
+ var openCodeWorkspacesQueryOptions = () => queryOptions({
30
+ queryFn: () => listOpenCodeWorkspacesFn(),
31
+ queryKey: ["opencode-workspaces"],
32
+ retry: retrySqliteQuery,
33
+ retryDelay
34
+ });
35
+ var openCodeSessionsQueryOptions = (workspaceKey) => queryOptions({
36
+ enabled: workspaceKey !== null,
37
+ queryFn: () => listOpenCodeSessionsFn({ data: { workspaceKey: workspaceKey ?? "" } }),
38
+ queryKey: ["opencode-sessions", workspaceKey ?? "none"],
39
+ retry: retrySqliteQuery,
40
+ retryDelay
41
+ });
42
+ var openCodeSessionDetailQueryOptions = (sessionId) => queryOptions({
43
+ enabled: sessionId !== null,
44
+ queryFn: () => getOpenCodeSessionDetailFn({ data: { sessionId: sessionId ?? "" } }),
45
+ queryKey: ["opencode-session", sessionId ?? "none"],
46
+ retry: retrySqliteQuery,
47
+ retryDelay
48
+ });
49
+ //#endregion
50
+ export { exportOpenCodeSessionFn as i, openCodeSessionsQueryOptions as n, openCodeWorkspacesQueryOptions as r, openCodeSessionDetailQueryOptions as t };
@@ -0,0 +1,72 @@
1
+ import { t as createServerFn } from "../server.js";
2
+ import { t as createServerRpc } from "./createServerRpc-CF_DEwnm.js";
3
+ import { t as renderSourceSessionDownload } from "./source-session-export-server-DNutCawb.js";
4
+ import { z } from "zod";
5
+ //#region src/lib/opencode-server.ts?tss-serverfn-split
6
+ var workspaceSchema = z.object({ workspaceKey: z.string().min(1) });
7
+ var sessionSchema = z.object({ sessionId: z.string().min(1) });
8
+ var exportSessionSchema = z.object({
9
+ includeCommentary: z.boolean().default(true),
10
+ includeMetadata: z.boolean().default(true),
11
+ includeTools: z.boolean().default(true),
12
+ outputFormat: z.enum(["md", "txt"]).default("md"),
13
+ sessionId: z.string().min(1),
14
+ zipArchive: z.boolean().default(false)
15
+ });
16
+ var listOpenCodeWorkspacesFn_createServerFn_handler = createServerRpc({
17
+ id: "1579290293aa3c05864abeb16b20e7fbe85fe73b2518d8ba75dbc536dfc02b88",
18
+ name: "listOpenCodeWorkspacesFn",
19
+ filename: "src/lib/opencode-server.ts"
20
+ }, (opts) => listOpenCodeWorkspacesFn.__executeServer(opts));
21
+ var listOpenCodeWorkspacesFn = createServerFn({ method: "GET" }).handler(listOpenCodeWorkspacesFn_createServerFn_handler, async () => {
22
+ const { listOpenCodeWorkspaceGroups } = await import("./opencode-db-BM7KjOzc.js");
23
+ return listOpenCodeWorkspaceGroups();
24
+ });
25
+ var listOpenCodeSessionsFn_createServerFn_handler = createServerRpc({
26
+ id: "1d8e6aec1907ff012d654cbfaa89e559078a0c2d80a02f4b257d9a179a002e36",
27
+ name: "listOpenCodeSessionsFn",
28
+ filename: "src/lib/opencode-server.ts"
29
+ }, (opts) => listOpenCodeSessionsFn.__executeServer(opts));
30
+ var listOpenCodeSessionsFn = createServerFn({ method: "GET" }).validator(workspaceSchema).handler(listOpenCodeSessionsFn_createServerFn_handler, async ({ data }) => {
31
+ const { listOpenCodeSessionsForGroup } = await import("./opencode-db-BM7KjOzc.js");
32
+ return listOpenCodeSessionsForGroup(data.workspaceKey);
33
+ });
34
+ var loadOpenCodeSessionTranscript = async (sessionId) => {
35
+ const { readOpenCodeSessionTranscript, resolveOpenCodeDbPath } = await import("./opencode-db-BM7KjOzc.js");
36
+ const transcript = await readOpenCodeSessionTranscript(resolveOpenCodeDbPath(), sessionId);
37
+ if (!transcript) throw new Error(`OpenCode session not found: ${sessionId}`);
38
+ return transcript;
39
+ };
40
+ var getOpenCodeSessionDetailFn_createServerFn_handler = createServerRpc({
41
+ id: "0fdecc913045cc27ae7462cd3c143af926650dece043ca1a111e0e83a3cd327b",
42
+ name: "getOpenCodeSessionDetailFn",
43
+ filename: "src/lib/opencode-server.ts"
44
+ }, (opts) => getOpenCodeSessionDetailFn.__executeServer(opts));
45
+ var getOpenCodeSessionDetailFn = createServerFn({ method: "GET" }).validator(sessionSchema).handler(getOpenCodeSessionDetailFn_createServerFn_handler, async ({ data }) => {
46
+ return loadOpenCodeSessionTranscript(data.sessionId);
47
+ });
48
+ var exportOpenCodeSessionFn_createServerFn_handler = createServerRpc({
49
+ id: "c051a060ff7f4d39e308fd586d9f81f576b53e96f37bdc56dd80112679f01218",
50
+ name: "exportOpenCodeSessionFn",
51
+ filename: "src/lib/opencode-server.ts"
52
+ }, (opts) => exportOpenCodeSessionFn.__executeServer(opts));
53
+ var exportOpenCodeSessionFn = createServerFn({ method: "POST" }).validator(exportSessionSchema).handler(exportOpenCodeSessionFn_createServerFn_handler, async ({ data }) => {
54
+ const { renderOpenCodeTranscript } = await import("./opencode-transcript-BNTcGNym.js");
55
+ const transcript = await loadOpenCodeSessionTranscript(data.sessionId);
56
+ const content = renderOpenCodeTranscript(transcript, {
57
+ includeCommentary: data.includeCommentary,
58
+ includeMetadata: data.includeMetadata,
59
+ includeTools: data.includeTools,
60
+ outputFormat: data.outputFormat
61
+ });
62
+ if (!content) throw new Error(`OpenCode session has no exportable content: ${data.sessionId}`);
63
+ return renderSourceSessionDownload({
64
+ content,
65
+ fallbackBaseName: "opencode-session",
66
+ fileBaseName: transcript.session.title || transcript.session.slug || transcript.session.sessionId,
67
+ outputFormat: data.outputFormat,
68
+ zipArchive: data.zipArchive
69
+ });
70
+ });
71
+ //#endregion
72
+ export { exportOpenCodeSessionFn_createServerFn_handler, getOpenCodeSessionDetailFn_createServerFn_handler, listOpenCodeSessionsFn_createServerFn_handler, listOpenCodeWorkspacesFn_createServerFn_handler };
@@ -0,0 +1,518 @@
1
+ import { t as Button } from "./button-CmTDnzOn.js";
2
+ import { i as exportOpenCodeSessionFn, t as openCodeSessionDetailQueryOptions } from "./opencode-queries-BeNYXnQv.js";
3
+ import { t as Route } from "./opencode-sessions._sessionId-D8Q7in_Z.js";
4
+ import { t as Checkbox } from "./checkbox-C0hovF41.js";
5
+ import { t as MetricCard } from "./metric-card-ByEeLu0r.js";
6
+ import { t as PageHeader } from "./page-header-VNSaM3xd.js";
7
+ import { i as formatList, o as formatNumber, r as formatDateTime, s as formatTokens } from "./formatters-FJaGZgJk.js";
8
+ import { a as TranscriptView, c as Breadcrumbs, i as TabsTrigger, n as TabsContent, o as MetadataSection, r as TabsList, s as JsonPanel, t as Tabs } from "./tabs-DkaChNVg.js";
9
+ import { n as downloadUrlFile, t as downloadTextFile } from "./download-DMmiy1xf.js";
10
+ import { t as ExportDialog } from "./export-dialog-D88ze9Gy.js";
11
+ import { t as getThreadTranscriptStats } from "./thread-transcript-stats-Dh34mt2u.js";
12
+ import { t as splitOpenCodeThinkTaggedText } from "./opencode-think-tags-CAoD-EcZ.js";
13
+ import { n as getOpenCodeTextPartPhase, t as getFinalOpenCodeAssistantTextPartIds } from "./opencode-transcript-phase-OqLkiQD0.js";
14
+ import { useMemo, useState } from "react";
15
+ import { Link } from "@tanstack/react-router";
16
+ import { jsx, jsxs } from "react/jsx-runtime";
17
+ import { useMutation, useSuspenseQuery } from "@tanstack/react-query";
18
+ import { Download } from "lucide-react";
19
+ //#region src/lib/opencode-transcript-events.ts
20
+ var toTimestamp = (value) => {
21
+ if (value === null || value === void 0 || !Number.isFinite(value)) return null;
22
+ return new Date(value).toISOString();
23
+ };
24
+ var buildRaw = (part, eventType) => ({
25
+ eventType,
26
+ messageId: part.messageId,
27
+ partId: part.partId,
28
+ role: part.role,
29
+ source: "opencode_part",
30
+ type: part.type,
31
+ ...part.raw
32
+ });
33
+ var buildMessageEvent = (part, sequence, text, phase) => ({
34
+ isHiddenByDefault: part.role !== "assistant" && part.role !== "user",
35
+ kind: "message",
36
+ memoryCitation: null,
37
+ model: null,
38
+ phase,
39
+ raw: buildRaw(part, "message"),
40
+ role: part.role,
41
+ sequence,
42
+ text,
43
+ timestamp: toTimestamp(part.createdAtMs),
44
+ variant: part.role === "user" ? "user_message" : part.role === "assistant" ? "agent_message" : "message"
45
+ });
46
+ var buildReasoningEventFromText = (part, sequence, textValue) => {
47
+ const text = textValue?.trim();
48
+ if (!text) return null;
49
+ return {
50
+ content: text,
51
+ hasEncryptedContent: false,
52
+ kind: "reasoning",
53
+ raw: buildRaw(part, "reasoning"),
54
+ sequence,
55
+ summary: [text],
56
+ timestamp: toTimestamp(part.createdAtMs)
57
+ };
58
+ };
59
+ var buildReasoningEvent = (part, sequence) => {
60
+ const { reasoningBlocks, visibleText } = splitOpenCodeThinkTaggedText(part.text ?? "");
61
+ return buildReasoningEventFromText(part, sequence, [...reasoningBlocks, visibleText].filter(Boolean).join("\n\n"));
62
+ };
63
+ var buildToolCallCommand = (part) => {
64
+ const toolName = part.toolName ?? "unknown";
65
+ if (!part.argumentsText?.trim()) return toolName;
66
+ return `${toolName}\n${part.argumentsText}`;
67
+ };
68
+ var buildToolCallEvent = (part, sequence) => ({
69
+ argumentsParseFailed: false,
70
+ argumentsText: part.argumentsText ?? null,
71
+ callId: part.callId ?? null,
72
+ command: buildToolCallCommand(part),
73
+ kind: "tool_call",
74
+ name: part.toolName ?? "unknown",
75
+ raw: buildRaw(part, "tool_call"),
76
+ sequence,
77
+ timestamp: toTimestamp(part.createdAtMs),
78
+ workdir: null
79
+ });
80
+ var buildToolOutputEvent = (part, sequence) => {
81
+ const outputText = part.outputText?.trim();
82
+ if (!outputText) return null;
83
+ return {
84
+ callId: part.callId ?? null,
85
+ exitCode: null,
86
+ kind: "tool_output",
87
+ outputText,
88
+ raw: buildRaw(part, "tool_output"),
89
+ sequence,
90
+ summary: outputText,
91
+ timestamp: toTimestamp(part.createdAtMs),
92
+ wallTime: null
93
+ };
94
+ };
95
+ var buildStepStartedEvent = (part, sequence) => ({
96
+ collaborationModeKind: null,
97
+ kind: "task_started",
98
+ modelContextWindow: null,
99
+ raw: buildRaw(part, "step_start"),
100
+ sequence,
101
+ startedAt: part.startTimeMs ?? part.createdAtMs,
102
+ timestamp: toTimestamp(part.createdAtMs),
103
+ turnId: part.messageId
104
+ });
105
+ var buildStepCompleteEvent = (part, sequence) => ({
106
+ completedAt: part.endTimeMs ?? part.updatedAtMs,
107
+ durationMs: part.startTimeMs && part.endTimeMs ? part.endTimeMs - part.startTimeMs : null,
108
+ kind: "task_complete",
109
+ lastAgentMessage: part.reason ?? null,
110
+ raw: buildRaw(part, "step_finish"),
111
+ sequence,
112
+ timestamp: toTimestamp(part.updatedAtMs),
113
+ timeToFirstTokenMs: null,
114
+ turnId: part.messageId
115
+ });
116
+ var flattenParts = (transcript) => {
117
+ return transcript.messages.flatMap((message) => message.parts);
118
+ };
119
+ var textPartToEvents = (part, sequence, finalAssistantTextPartIds) => {
120
+ const { reasoningBlocks, visibleText } = part.role === "assistant" ? splitOpenCodeThinkTaggedText(part.text ?? "") : {
121
+ reasoningBlocks: [],
122
+ visibleText: part.text ?? ""
123
+ };
124
+ const events = [];
125
+ if (part.role === "assistant") events.push(...reasoningBlocks.map((block, index) => buildReasoningEventFromText(part, sequence + index, block)).filter((event) => event !== null));
126
+ const text = visibleText.trim();
127
+ if (!text) return events;
128
+ const messageSequence = sequence + events.length;
129
+ const phase = getOpenCodeTextPartPhase(part, finalAssistantTextPartIds);
130
+ events.push(buildMessageEvent(part, messageSequence, text, phase));
131
+ return events;
132
+ };
133
+ var toolPartToEvents = (part, sequence) => {
134
+ const output = buildToolOutputEvent(part, sequence + 1);
135
+ return [buildToolCallEvent(part, sequence), output].filter((event) => event !== null);
136
+ };
137
+ var partToEvents = (part, sequence, finalAssistantTextPartIds) => {
138
+ if (part.type === "text") return textPartToEvents(part, sequence, finalAssistantTextPartIds);
139
+ if (part.type === "reasoning") {
140
+ const event = buildReasoningEvent(part, sequence);
141
+ return event ? [event] : [];
142
+ }
143
+ if (part.type === "tool") return toolPartToEvents(part, sequence);
144
+ if (part.type === "step-start") return [buildStepStartedEvent(part, sequence)];
145
+ if (part.type === "step-finish") return [buildStepCompleteEvent(part, sequence)];
146
+ return [];
147
+ };
148
+ var openCodeTranscriptToThreadEvents = (transcript) => {
149
+ const parts = flattenParts(transcript);
150
+ const finalAssistantTextPartIds = getFinalOpenCodeAssistantTextPartIds(parts);
151
+ const events = [];
152
+ let sequence = 0;
153
+ for (const part of parts) {
154
+ const partEvents = partToEvents(part, sequence, finalAssistantTextPartIds);
155
+ events.push(...partEvents);
156
+ sequence += Math.max(partEvents.length, 1);
157
+ }
158
+ return events;
159
+ };
160
+ var getOpenCodeThreadTranscriptStats = (events) => {
161
+ return getThreadTranscriptStats(events);
162
+ };
163
+ //#endregion
164
+ //#region src/routes/opencode-sessions.$sessionId.tsx?tsr-split=component
165
+ var buildSessionMetadata = (detail) => [
166
+ {
167
+ label: "Session ID",
168
+ value: /* @__PURE__ */ jsx("span", {
169
+ "data-mono": "true",
170
+ children: detail.session.sessionId
171
+ })
172
+ },
173
+ {
174
+ label: "Workspace",
175
+ value: /* @__PURE__ */ jsx(Link, {
176
+ className: "text-[var(--accent)]",
177
+ params: { workspaceKey: detail.session.workspaceKey },
178
+ to: "/opencode/$workspaceKey",
179
+ children: detail.session.workspaceLabel
180
+ })
181
+ },
182
+ {
183
+ label: "Worktree",
184
+ value: detail.session.worktree
185
+ },
186
+ {
187
+ label: "Directory",
188
+ value: detail.session.directory
189
+ },
190
+ {
191
+ label: "Slug",
192
+ value: detail.session.slug
193
+ },
194
+ {
195
+ label: "Agent",
196
+ value: detail.session.agent ?? "unknown"
197
+ },
198
+ {
199
+ label: "Model",
200
+ value: detail.session.modelLabel ?? "unknown"
201
+ },
202
+ {
203
+ label: "Created",
204
+ value: /* @__PURE__ */ jsx("span", {
205
+ suppressHydrationWarning: true,
206
+ children: formatDateTime(detail.session.createdAtMs)
207
+ })
208
+ },
209
+ {
210
+ label: "Updated",
211
+ value: /* @__PURE__ */ jsx("span", {
212
+ suppressHydrationWarning: true,
213
+ children: formatDateTime(detail.session.lastUpdatedAtMs)
214
+ })
215
+ },
216
+ {
217
+ label: "Archived",
218
+ value: /* @__PURE__ */ jsx("span", {
219
+ suppressHydrationWarning: true,
220
+ children: formatDateTime(detail.session.archivedAtMs)
221
+ })
222
+ }
223
+ ];
224
+ var buildTranscriptStatsItems = (detail, events, stats) => [
225
+ {
226
+ label: "Event kinds",
227
+ value: formatList([...new Set(events.map((event) => event.kind))])
228
+ },
229
+ {
230
+ label: "Messages",
231
+ value: formatNumber(stats.messageCount)
232
+ },
233
+ {
234
+ label: "User messages",
235
+ value: formatNumber(stats.userMessageCount)
236
+ },
237
+ {
238
+ label: "Assistant messages",
239
+ value: formatNumber(stats.assistantMessageCount)
240
+ },
241
+ {
242
+ label: "Reasoning events",
243
+ value: formatNumber(events.filter((event) => event.kind === "reasoning").length)
244
+ },
245
+ {
246
+ label: "Final answers",
247
+ value: formatNumber(stats.finalAnswerCount)
248
+ },
249
+ {
250
+ label: "Tool calls",
251
+ value: formatNumber(stats.toolCallCount)
252
+ },
253
+ {
254
+ label: "Tool outputs",
255
+ value: formatNumber(stats.toolOutputCount)
256
+ },
257
+ {
258
+ label: "Renderable parts",
259
+ value: formatNumber(detail.renderablePartCount)
260
+ }
261
+ ];
262
+ var OpenCodeTranscriptControls = ({ rawJsonDisabled = false, showCommentary, showExtraEvents, showRawJson, showToolCalls, showUserMessages, onShowCommentaryChange, onShowExtraEventsChange, onShowRawJsonChange, onShowToolCallsChange, onShowUserMessagesChange }) => {
263
+ return /* @__PURE__ */ jsxs("div", {
264
+ className: "flex flex-wrap gap-4 rounded-xl border border-[var(--border)] bg-[var(--panel)] px-4 py-3 shadow-[var(--panel-shadow)]",
265
+ children: [
266
+ /* @__PURE__ */ jsxs("div", {
267
+ className: "flex items-center gap-2 text-sm",
268
+ children: [/* @__PURE__ */ jsx(Checkbox, {
269
+ checked: showToolCalls,
270
+ id: "opencode-transcript-show-tool-calls",
271
+ onCheckedChange: (checked) => onShowToolCallsChange(checked === true)
272
+ }), /* @__PURE__ */ jsx("label", {
273
+ htmlFor: "opencode-transcript-show-tool-calls",
274
+ children: "Show tool calls"
275
+ })]
276
+ }),
277
+ /* @__PURE__ */ jsxs("div", {
278
+ className: "flex items-center gap-2 text-sm",
279
+ children: [/* @__PURE__ */ jsx(Checkbox, {
280
+ checked: showCommentary,
281
+ id: "opencode-transcript-show-commentary",
282
+ onCheckedChange: (checked) => onShowCommentaryChange(checked === true)
283
+ }), /* @__PURE__ */ jsx("label", {
284
+ htmlFor: "opencode-transcript-show-commentary",
285
+ children: "Show commentary"
286
+ })]
287
+ }),
288
+ /* @__PURE__ */ jsxs("div", {
289
+ className: "flex items-center gap-2 text-sm",
290
+ children: [/* @__PURE__ */ jsx(Checkbox, {
291
+ checked: showExtraEvents,
292
+ id: "opencode-transcript-show-extra-events",
293
+ onCheckedChange: (checked) => onShowExtraEventsChange(checked === true)
294
+ }), /* @__PURE__ */ jsx("label", {
295
+ htmlFor: "opencode-transcript-show-extra-events",
296
+ children: "Show extra events"
297
+ })]
298
+ }),
299
+ /* @__PURE__ */ jsxs("div", {
300
+ className: "flex items-center gap-2 text-sm",
301
+ children: [/* @__PURE__ */ jsx(Checkbox, {
302
+ checked: showRawJson,
303
+ disabled: rawJsonDisabled,
304
+ id: "opencode-transcript-show-raw-json",
305
+ onCheckedChange: (checked) => onShowRawJsonChange(checked === true)
306
+ }), /* @__PURE__ */ jsx("label", {
307
+ htmlFor: "opencode-transcript-show-raw-json",
308
+ children: "Raw JSON"
309
+ })]
310
+ }),
311
+ /* @__PURE__ */ jsxs("div", {
312
+ className: "flex items-center gap-2 text-sm",
313
+ children: [/* @__PURE__ */ jsx(Checkbox, {
314
+ checked: showUserMessages,
315
+ id: "opencode-transcript-show-user-messages",
316
+ onCheckedChange: (checked) => onShowUserMessagesChange(checked === true)
317
+ }), /* @__PURE__ */ jsx("label", {
318
+ htmlFor: "opencode-transcript-show-user-messages",
319
+ children: "User"
320
+ })]
321
+ })
322
+ ]
323
+ });
324
+ };
325
+ var OpenCodeRawPanels = ({ detail, events }) => {
326
+ return /* @__PURE__ */ jsxs("div", {
327
+ className: "space-y-4",
328
+ children: [
329
+ /* @__PURE__ */ jsx(JsonPanel, {
330
+ title: "Session summary",
331
+ value: detail.session
332
+ }),
333
+ /* @__PURE__ */ jsx(JsonPanel, {
334
+ title: "OpenCode messages",
335
+ value: detail.messages
336
+ }),
337
+ /* @__PURE__ */ jsx(JsonPanel, {
338
+ title: "Transcript events",
339
+ value: events
340
+ })
341
+ ]
342
+ });
343
+ };
344
+ var OpenCodeSessionDetailPage = () => {
345
+ const detail = useSuspenseQuery(openCodeSessionDetailQueryOptions(Route.useParams().sessionId)).data;
346
+ const [pendingExport, setPendingExport] = useState(false);
347
+ const [showToolCalls, setShowToolCalls] = useState(false);
348
+ const [showCommentary, setShowCommentary] = useState(false);
349
+ const [showExtraEvents, setShowExtraEvents] = useState(false);
350
+ const [showRawJson, setShowRawJson] = useState(false);
351
+ const [showUserMessages, setShowUserMessages] = useState(true);
352
+ const transcriptEvents = useMemo(() => openCodeTranscriptToThreadEvents(detail), [detail]);
353
+ const transcriptStats = useMemo(() => getOpenCodeThreadTranscriptStats(transcriptEvents), [transcriptEvents]);
354
+ const exportSessionMutation = useMutation({
355
+ mutationFn: async (options) => {
356
+ const download = await exportOpenCodeSessionFn({ data: {
357
+ includeCommentary: options.includeCommentary,
358
+ includeMetadata: options.includeMetadata,
359
+ includeTools: options.includeTools,
360
+ outputFormat: options.outputFormat,
361
+ sessionId: detail.session.sessionId,
362
+ zipArchive: options.zipArchive
363
+ } });
364
+ if (download.mode === "download") {
365
+ downloadTextFile(download.fileName, download.content, download.mimeType);
366
+ return;
367
+ }
368
+ await downloadUrlFile(download.fileName, download.downloadUrl);
369
+ },
370
+ onSuccess: () => {
371
+ setPendingExport(false);
372
+ }
373
+ });
374
+ return /* @__PURE__ */ jsxs("div", {
375
+ className: "space-y-6",
376
+ children: [
377
+ /* @__PURE__ */ jsx(PageHeader, {
378
+ actions: /* @__PURE__ */ jsxs(Button, {
379
+ className: "rounded-full",
380
+ type: "button",
381
+ variant: "outline",
382
+ onClick: () => setPendingExport(true),
383
+ children: [/* @__PURE__ */ jsx(Download, { className: "mr-2 size-4" }), "Export"]
384
+ }),
385
+ breadcrumb: /* @__PURE__ */ jsx(Breadcrumbs, { items: [
386
+ {
387
+ label: "OpenCode",
388
+ to: "/opencode"
389
+ },
390
+ {
391
+ label: detail.session.workspaceLabel,
392
+ params: { workspaceKey: detail.session.workspaceKey },
393
+ to: "/opencode/$workspaceKey"
394
+ },
395
+ { label: detail.session.title }
396
+ ] }),
397
+ eyebrow: "OpenCode session",
398
+ subtitle: "Session detail for the selected OpenCode project conversation.",
399
+ title: detail.session.title
400
+ }),
401
+ /* @__PURE__ */ jsxs("div", {
402
+ className: "grid gap-3 md:grid-cols-2 xl:grid-cols-4",
403
+ children: [
404
+ /* @__PURE__ */ jsx(MetricCard, {
405
+ label: "Messages",
406
+ value: formatNumber(detail.session.messageCount)
407
+ }),
408
+ /* @__PURE__ */ jsx(MetricCard, {
409
+ label: "Parts",
410
+ value: formatNumber(detail.partCount)
411
+ }),
412
+ /* @__PURE__ */ jsx(MetricCard, {
413
+ label: "Tool calls",
414
+ value: formatNumber(detail.session.toolPartCount)
415
+ }),
416
+ /* @__PURE__ */ jsx(MetricCard, {
417
+ label: "Tokens",
418
+ value: formatTokens(detail.session.totalTokens)
419
+ })
420
+ ]
421
+ }),
422
+ /* @__PURE__ */ jsxs(Tabs, {
423
+ className: "space-y-4",
424
+ defaultValue: "transcript",
425
+ children: [
426
+ /* @__PURE__ */ jsxs(TabsList, {
427
+ className: "grid w-fit min-w-[24rem] grid-cols-3 rounded-full border border-[var(--border)] bg-[var(--panel)] p-1",
428
+ children: [
429
+ /* @__PURE__ */ jsx(TabsTrigger, {
430
+ className: "rounded-full px-5 text-sm",
431
+ value: "transcript",
432
+ children: "Transcript"
433
+ }),
434
+ /* @__PURE__ */ jsx(TabsTrigger, {
435
+ className: "rounded-full px-5 text-sm",
436
+ value: "metadata",
437
+ children: "Metadata"
438
+ }),
439
+ /* @__PURE__ */ jsx(TabsTrigger, {
440
+ className: "rounded-full px-5 text-sm",
441
+ value: "raw",
442
+ children: "Raw"
443
+ })
444
+ ]
445
+ }),
446
+ /* @__PURE__ */ jsxs(TabsContent, {
447
+ className: "space-y-3",
448
+ value: "transcript",
449
+ children: [/* @__PURE__ */ jsx(OpenCodeTranscriptControls, {
450
+ rawJsonDisabled: transcriptEvents.length === 0,
451
+ showCommentary,
452
+ showExtraEvents,
453
+ showRawJson,
454
+ showToolCalls,
455
+ showUserMessages,
456
+ onShowCommentaryChange: setShowCommentary,
457
+ onShowExtraEventsChange: setShowExtraEvents,
458
+ onShowRawJsonChange: setShowRawJson,
459
+ onShowToolCallsChange: setShowToolCalls,
460
+ onShowUserMessagesChange: setShowUserMessages
461
+ }), transcriptEvents.length > 0 ? /* @__PURE__ */ jsx(TranscriptView, {
462
+ assistantModel: detail.session.modelLabel,
463
+ events: transcriptEvents,
464
+ projectPath: detail.session.worktree,
465
+ showCommentary,
466
+ showExtraEvents,
467
+ showRawJson,
468
+ showToolCalls,
469
+ showUserMessages
470
+ }) : /* @__PURE__ */ jsxs("section", {
471
+ className: "rounded-[1.6rem] border border-[var(--border)] bg-[var(--panel)] p-5 shadow-[var(--panel-shadow)]",
472
+ children: [/* @__PURE__ */ jsx("h3", {
473
+ className: "font-semibold text-[var(--muted-foreground)] text-sm uppercase tracking-[0.18em]",
474
+ children: "Transcript"
475
+ }), /* @__PURE__ */ jsx("p", {
476
+ className: "mt-4 text-[var(--muted-foreground)] text-sm",
477
+ children: "No renderable OpenCode transcript content was found for this session."
478
+ })]
479
+ })]
480
+ }),
481
+ /* @__PURE__ */ jsx(TabsContent, {
482
+ value: "metadata",
483
+ children: /* @__PURE__ */ jsxs("div", {
484
+ className: "grid gap-4 xl:grid-cols-[0.95fr_1.05fr]",
485
+ children: [/* @__PURE__ */ jsx(MetadataSection, {
486
+ items: buildSessionMetadata(detail),
487
+ title: "Session metadata"
488
+ }), /* @__PURE__ */ jsx(MetadataSection, {
489
+ items: buildTranscriptStatsItems(detail, transcriptEvents, transcriptStats),
490
+ title: "Transcript stats"
491
+ })]
492
+ })
493
+ }),
494
+ /* @__PURE__ */ jsx(TabsContent, {
495
+ value: "raw",
496
+ children: /* @__PURE__ */ jsx(OpenCodeRawPanels, {
497
+ detail,
498
+ events: transcriptEvents
499
+ })
500
+ })
501
+ ]
502
+ }),
503
+ /* @__PURE__ */ jsx(ExportDialog, {
504
+ errorMessage: exportSessionMutation.isError ? exportSessionMutation.error instanceof Error ? exportSessionMutation.error.message : "Export failed" : null,
505
+ open: pendingExport,
506
+ pending: exportSessionMutation.isPending,
507
+ title: `Export ${detail.session.title}`,
508
+ onExport: (options) => exportSessionMutation.mutate(options),
509
+ onOpenChange: (open) => {
510
+ setPendingExport(open);
511
+ if (!open) exportSessionMutation.reset();
512
+ }
513
+ })
514
+ ]
515
+ });
516
+ };
517
+ //#endregion
518
+ export { OpenCodeSessionDetailPage as component };
@@ -0,0 +1,18 @@
1
+ import { t as openCodeSessionDetailQueryOptions } from "./opencode-queries-BeNYXnQv.js";
2
+ import { t as LoadingPanel } from "./loading-panel-BGFnWseS.js";
3
+ import { createFileRoute, lazyRouteComponent } from "@tanstack/react-router";
4
+ import { jsx } from "react/jsx-runtime";
5
+ //#region src/routes/opencode-sessions.$sessionId.tsx
6
+ var $$splitErrorComponentImporter = () => import("./opencode-sessions._sessionId-DKOvi0lV.js");
7
+ var $$splitComponentImporter = () => import("./opencode-sessions._sessionId-CGQ-t0vD.js");
8
+ var Route = createFileRoute("/opencode-sessions/$sessionId")({
9
+ component: lazyRouteComponent($$splitComponentImporter, "component"),
10
+ errorComponent: lazyRouteComponent($$splitErrorComponentImporter, "errorComponent"),
11
+ loader: ({ context, params }) => context.queryClient.ensureQueryData(openCodeSessionDetailQueryOptions(params.sessionId)),
12
+ pendingComponent: () => /* @__PURE__ */ jsx(LoadingPanel, {
13
+ description: "Loading the OpenCode transcript, parts, and session metadata.",
14
+ title: "Loading session"
15
+ })
16
+ });
17
+ //#endregion
18
+ export { Route as t };
@@ -0,0 +1,11 @@
1
+ import { t as ReloadErrorPanel } from "./reload-error-panel-BJMxY3U1.js";
2
+ import { jsx } from "react/jsx-runtime";
3
+ //#region src/routes/opencode-sessions.$sessionId.tsx?tsr-split=errorComponent
4
+ var OpenCodeSessionDetailErrorComponent = ({ error }) => {
5
+ return /* @__PURE__ */ jsx(ReloadErrorPanel, {
6
+ description: error.message,
7
+ title: "Failed to load OpenCode session"
8
+ });
9
+ };
10
+ //#endregion
11
+ export { OpenCodeSessionDetailErrorComponent as errorComponent };