spiracha 1.4.0 → 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 (159) hide show
  1. package/AGENTS.md +48 -5
  2. package/README.md +40 -5
  3. package/apps/ui/AGENTS.md +23 -4
  4. package/apps/ui/README.md +49 -2
  5. package/apps/ui/dist/client/assets/analytics-DOy1b6Sh.js +1 -0
  6. package/apps/ui/dist/client/assets/{antigravity-conversations._conversationId-DmD0sN8X.js → antigravity-conversations._conversationId-DqySVO2K.js} +2 -2
  7. package/apps/ui/dist/client/assets/antigravity-keychain-panel-B77qJz6f.js +1 -0
  8. package/apps/ui/dist/client/assets/antigravity._workspaceKey-B3NM6gRH.js +1 -0
  9. package/apps/ui/dist/client/assets/{antigravity.index-DEEkjlZa.js → antigravity.index-DP9JC2P9.js} +1 -1
  10. package/apps/ui/dist/client/assets/{badge-DfWvPfKF.js → badge-C3i4OKs8.js} +1 -1
  11. package/apps/ui/dist/client/assets/claude-code-sessions._sessionId-8pQ55ci2.js +1 -0
  12. package/apps/ui/dist/client/assets/claude-code-sessions._sessionId-DVz5UmtU.js +1 -0
  13. package/apps/ui/dist/client/assets/claude-code._workspaceKey-BBKskSum.js +1 -0
  14. package/apps/ui/dist/client/assets/claude-code._workspaceKey-OkikMUFs.js +1 -0
  15. package/apps/ui/dist/client/assets/claude-code.index-Cwu76dbb.js +1 -0
  16. package/apps/ui/dist/client/assets/claude-code.index-D6eMd08t.js +1 -0
  17. package/apps/ui/dist/client/assets/createServerFn-B-KkwmHU.js +3 -0
  18. package/apps/ui/dist/client/assets/cursor-threads._composerId-hBWlP1D-.js +1 -0
  19. package/apps/ui/dist/client/assets/cursor._workspaceKey-BFPkIRi-.js +1 -0
  20. package/apps/ui/dist/client/assets/cursor.index-8y4o20kb.js +2 -0
  21. package/apps/ui/dist/client/assets/delete-confirm-dialog-Bxs07u-j.js +7 -0
  22. package/apps/ui/dist/client/assets/dist-BrJhN2A0.js +5 -0
  23. package/apps/ui/dist/client/assets/{dist-BhZOxAPP.js → dist-Cmd3AIfD.js} +1 -1
  24. package/apps/ui/dist/client/assets/dropdown-menu-D5cvPaZt.js +1 -0
  25. package/apps/ui/dist/client/assets/{es2015-BkCWttyM.js → es2015-ad6040dw.js} +1 -1
  26. package/apps/ui/dist/client/assets/export-dialog-Dr8d2MqD.js +1 -0
  27. package/apps/ui/dist/client/assets/{formatters-BM9kB7ed.js → formatters-BtqyrX_c.js} +1 -1
  28. package/apps/ui/dist/client/assets/index-C-STgIH4.js +166 -0
  29. package/apps/ui/dist/client/assets/kiro-sessions._sessionId-CKgfJ7GR.js +1 -0
  30. package/apps/ui/dist/client/assets/kiro-sessions._sessionId-zvIJHtQF.js +1 -0
  31. package/apps/ui/dist/client/assets/kiro._workspaceKey-DhVuJuZB.js +1 -0
  32. package/apps/ui/dist/client/assets/kiro._workspaceKey-QArsjkTY.js +1 -0
  33. package/apps/ui/dist/client/assets/kiro.index-C-fr4m7i.js +1 -0
  34. package/apps/ui/dist/client/assets/kiro.index-OYgAdtZd.js +1 -0
  35. package/apps/ui/dist/client/assets/opencode-sessions._sessionId-DLjiTst-.js +1 -0
  36. package/apps/ui/dist/client/assets/opencode-sessions._sessionId-biBwrRbt.js +8 -0
  37. package/apps/ui/dist/client/assets/opencode._workspaceKey-C7OIzMOJ.js +1 -0
  38. package/apps/ui/dist/client/assets/opencode._workspaceKey-sBakX0oI.js +1 -0
  39. package/apps/ui/dist/client/assets/opencode.index-Bl_kNs9N.js +1 -0
  40. package/apps/ui/dist/client/assets/opencode.index-CN53bVmb.js +1 -0
  41. package/apps/ui/dist/client/assets/preload-helper-B8fFrdxC.js +1 -0
  42. package/apps/ui/dist/client/assets/projects._project-D8WloxQN.js +1 -0
  43. package/apps/ui/dist/client/assets/projects.index-5xRtuJdX.js +3 -0
  44. package/apps/ui/dist/client/assets/routes-DnzF_9CX.js +1 -0
  45. package/apps/ui/dist/client/assets/select-CYF6pF37.js +1 -0
  46. package/apps/ui/dist/client/assets/settings-Dx70jgP_.js +1 -0
  47. package/apps/ui/dist/client/assets/styles-B7Zi9EFA.css +1 -0
  48. package/apps/ui/dist/client/assets/tabs-CmuhkT-c.js +7 -0
  49. package/apps/ui/dist/client/assets/thread-transcript-stats-BUNz6u7F.js +1 -0
  50. package/apps/ui/dist/client/assets/threads._threadId-BMRSFow3.js +1 -0
  51. package/apps/ui/dist/client/assets/useMutation-BSFult2i.js +1 -0
  52. package/apps/ui/dist/client/assets/useQuery-CjINKZf1.js +1 -0
  53. package/apps/ui/dist/client/icon.svg +2 -1
  54. package/apps/ui/dist/server/assets/_tanstack-start-manifest_v-CQ8Jjs3B.js +387 -0
  55. package/apps/ui/dist/server/assets/{antigravity-conversations._conversationId-BtexWY-K.js → antigravity-conversations._conversationId-BKOyL2T6.js} +2 -2
  56. package/apps/ui/dist/server/assets/{antigravity-conversations._conversationId-zMrR6v6R.js → antigravity-conversations._conversationId-eS87Dx7g.js} +1 -1
  57. package/apps/ui/dist/server/assets/claude-code-db-Ik3VStKZ.js +361 -0
  58. package/apps/ui/dist/server/assets/claude-code-queries-Cgzi4K-e.js +37 -0
  59. package/apps/ui/dist/server/assets/claude-code-server-PfraClXS.js +72 -0
  60. package/apps/ui/dist/server/assets/claude-code-sessions._sessionId-C55oe6zj.js +18 -0
  61. package/apps/ui/dist/server/assets/claude-code-sessions._sessionId-D1RYYi3j.js +473 -0
  62. package/apps/ui/dist/server/assets/claude-code-sessions._sessionId-DSvPLEUL.js +11 -0
  63. package/apps/ui/dist/server/assets/claude-code-transcript-C-bxh3cS.js +139 -0
  64. package/apps/ui/dist/server/assets/claude-code-transcript-phase-DmUMc8VU.js +10 -0
  65. package/apps/ui/dist/server/assets/claude-code._workspaceKey-B5Xg_-tE.js +28 -0
  66. package/apps/ui/dist/server/assets/claude-code._workspaceKey-BPlzyXPa.js +11 -0
  67. package/apps/ui/dist/server/assets/claude-code._workspaceKey-DqDve2wl.js +191 -0
  68. package/apps/ui/dist/server/assets/claude-code.index-B7yYR7dD.js +92 -0
  69. package/apps/ui/dist/server/assets/claude-code.index-BUHThG1W.js +11 -0
  70. package/apps/ui/dist/server/assets/{codex-server-CNXSJuc2.js → codex-server-CGXU4H8-.js} +319 -29
  71. package/apps/ui/dist/server/assets/{cursor-db-cYZEU3WQ.js → cursor-db-CZnYy7aT.js} +3 -3
  72. package/apps/ui/dist/server/assets/{cursor-recovery-nq-kR62j.js → cursor-recovery-CXpO8KcD.js} +2 -2
  73. package/apps/ui/dist/server/assets/{cursor-server-C3q7hrp-.js → cursor-server-DNu52A3K.js} +13 -13
  74. package/apps/ui/dist/server/assets/{cursor-threads._composerId-BkMMTQ3v.js → cursor-threads._composerId-Ckn6ItHI.js} +3 -3
  75. package/apps/ui/dist/server/assets/{cursor-threads._composerId-BPJFWfJj.js → cursor-threads._composerId-p9-ARAzc.js} +1 -1
  76. package/apps/ui/dist/server/assets/{cursor-transcript-2iL3KFSK.js → cursor-transcript-B7tGnqtn.js} +1 -1
  77. package/apps/ui/dist/server/assets/{cursor._workspaceKey-C5PdTaKB.js → cursor._workspaceKey-CZuohIUL.js} +1 -1
  78. package/apps/ui/dist/server/assets/{cursor._workspaceKey-Ckj7apKI.js → cursor._workspaceKey-DPp5JSjy.js} +2 -2
  79. package/apps/ui/dist/server/assets/{export-dialog-BItjWgkZ.js → export-dialog-D88ze9Gy.js} +2 -2
  80. package/apps/ui/dist/server/assets/kiro-db--fXrED_-.js +552 -0
  81. package/apps/ui/dist/server/assets/kiro-queries-CzNlM2ok.js +37 -0
  82. package/apps/ui/dist/server/assets/kiro-server-9WRxg2Au.js +72 -0
  83. package/apps/ui/dist/server/assets/kiro-sessions._sessionId-CRY2c7YO.js +11 -0
  84. package/apps/ui/dist/server/assets/kiro-sessions._sessionId-F1UlwxmR.js +449 -0
  85. package/apps/ui/dist/server/assets/kiro-sessions._sessionId-bvTulT7C.js +18 -0
  86. package/apps/ui/dist/server/assets/kiro-transcript-DoekQBaH.js +112 -0
  87. package/apps/ui/dist/server/assets/kiro-transcript-phase-CJG40nQg.js +27 -0
  88. package/apps/ui/dist/server/assets/kiro._workspaceKey-BDe9sQwo.js +11 -0
  89. package/apps/ui/dist/server/assets/kiro._workspaceKey-CJsjgNwO.js +28 -0
  90. package/apps/ui/dist/server/assets/kiro._workspaceKey-D_-4Qb7y.js +193 -0
  91. package/apps/ui/dist/server/assets/kiro.index-C__-UROk.js +11 -0
  92. package/apps/ui/dist/server/assets/kiro.index-CmTbqeYj.js +93 -0
  93. package/apps/ui/dist/server/assets/opencode-db-BM7KjOzc.js +397 -0
  94. package/apps/ui/dist/server/assets/opencode-queries-BeNYXnQv.js +50 -0
  95. package/apps/ui/dist/server/assets/opencode-server-BpQ_kRze.js +72 -0
  96. package/apps/ui/dist/server/assets/opencode-sessions._sessionId-CGQ-t0vD.js +518 -0
  97. package/apps/ui/dist/server/assets/opencode-sessions._sessionId-D8Q7in_Z.js +18 -0
  98. package/apps/ui/dist/server/assets/opencode-sessions._sessionId-DKOvi0lV.js +11 -0
  99. package/apps/ui/dist/server/assets/opencode-think-tags-CAoD-EcZ.js +87 -0
  100. package/apps/ui/dist/server/assets/opencode-transcript-BNTcGNym.js +141 -0
  101. package/apps/ui/dist/server/assets/opencode-transcript-phase-OqLkiQD0.js +32 -0
  102. package/apps/ui/dist/server/assets/opencode._workspaceKey-BdqcWHw1.js +11 -0
  103. package/apps/ui/dist/server/assets/opencode._workspaceKey-CfH96HTT.js +28 -0
  104. package/apps/ui/dist/server/assets/opencode._workspaceKey-DdbHPDrO.js +207 -0
  105. package/apps/ui/dist/server/assets/opencode.index-BbVzkJXP.js +11 -0
  106. package/apps/ui/dist/server/assets/opencode.index-Vh_Gq_1L.js +93 -0
  107. package/apps/ui/dist/server/assets/{projects._project-Bpbc3C-L.js → projects._project-4io5LO0E.js} +1 -1
  108. package/apps/ui/dist/server/assets/{projects._project-CvZho6EQ.js → projects._project-D6ZoGhJ8.js} +2 -2
  109. package/apps/ui/dist/server/assets/{router-6m-ihwqA.js → router-Sac2DGk6.js} +157 -49
  110. package/apps/ui/dist/server/assets/{shared-CPRNYIql.js → shared-DyhChtHf.js} +4 -1
  111. package/apps/ui/dist/server/assets/source-session-export-server-DNutCawb.js +38 -0
  112. package/apps/ui/dist/server/assets/{start-CI_0bSiY.js → start-B_HFwkkk.js} +1 -1
  113. package/apps/ui/dist/server/assets/{tabs-CGA13IZM.js → tabs-DkaChNVg.js} +0 -1
  114. package/apps/ui/dist/server/assets/thread-transcript-stats-Dh34mt2u.js +45 -0
  115. package/apps/ui/dist/server/assets/{threads._threadId-D2GYkVn6.js → threads._threadId-BeXEc4Lo.js} +15 -6
  116. package/apps/ui/dist/server/assets/{threads._threadId-Bs0yuqO9.js → threads._threadId-Ci0S4mKU.js} +1 -1
  117. package/apps/ui/dist/server/server.js +72 -24
  118. package/package.json +21 -4
  119. package/src/lib/claude-code-db.ts +655 -0
  120. package/src/lib/claude-code-exporter-types.ts +110 -0
  121. package/src/lib/claude-code-transcript-phase.ts +25 -0
  122. package/src/lib/claude-code-transcript.ts +180 -0
  123. package/src/lib/codex-browser-db.ts +490 -31
  124. package/src/lib/codex-browser-export.ts +18 -2
  125. package/src/lib/codex-thread-cache.ts +17 -1
  126. package/src/lib/concurrency.ts +25 -0
  127. package/src/lib/kiro-db.ts +949 -0
  128. package/src/lib/kiro-exporter-types.ts +100 -0
  129. package/src/lib/kiro-transcript-phase.ts +41 -0
  130. package/src/lib/kiro-transcript.ts +115 -0
  131. package/src/lib/opencode-db.ts +610 -0
  132. package/src/lib/opencode-exporter-types.ts +129 -0
  133. package/src/lib/opencode-think-tags.ts +126 -0
  134. package/src/lib/opencode-transcript-phase.ts +50 -0
  135. package/src/lib/opencode-transcript.ts +194 -0
  136. package/src/lib/shared.ts +25 -0
  137. package/src/lib/ui-export-archive.ts +61 -0
  138. package/apps/ui/dist/client/assets/analytics-DK2jdvmI.js +0 -1
  139. package/apps/ui/dist/client/assets/antigravity-keychain-panel-BRHVjFAM.js +0 -1
  140. package/apps/ui/dist/client/assets/antigravity._workspaceKey-CGV7amas.js +0 -1
  141. package/apps/ui/dist/client/assets/createServerFn-CgRRVpBH.js +0 -3
  142. package/apps/ui/dist/client/assets/cursor-threads._composerId-Ti2gTm63.js +0 -1
  143. package/apps/ui/dist/client/assets/cursor._workspaceKey-DzD_c6j9.js +0 -1
  144. package/apps/ui/dist/client/assets/cursor.index-PkCFVcl4.js +0 -2
  145. package/apps/ui/dist/client/assets/delete-confirm-dialog-BHRmyLHr.js +0 -11
  146. package/apps/ui/dist/client/assets/dropdown-menu-Dy5cLzTy.js +0 -1
  147. package/apps/ui/dist/client/assets/export-dialog-C86SYHJn.js +0 -1
  148. package/apps/ui/dist/client/assets/index-CPvAP-jk.js +0 -149
  149. package/apps/ui/dist/client/assets/projects._project-Ckf6muWZ.js +0 -1
  150. package/apps/ui/dist/client/assets/projects.index-V5ibNZII.js +0 -3
  151. package/apps/ui/dist/client/assets/routes-Df2tgpyd.js +0 -1
  152. package/apps/ui/dist/client/assets/select-Bf2GwfPR.js +0 -1
  153. package/apps/ui/dist/client/assets/settings-5VQIzME0.js +0 -1
  154. package/apps/ui/dist/client/assets/styles-BhRkXgwB.css +0 -1
  155. package/apps/ui/dist/client/assets/tabs-OO4VU5KR.js +0 -7
  156. package/apps/ui/dist/client/assets/threads._threadId-BgDhFj2I.js +0 -1
  157. package/apps/ui/dist/client/assets/useMutation-CC_B7uy5.js +0 -1
  158. package/apps/ui/dist/client/assets/useQuery-C5By6WKU.js +0 -1
  159. package/apps/ui/dist/server/assets/_tanstack-start-manifest_v-CRW2kqj0.js +0 -232
@@ -1,23 +1,32 @@
1
1
  import { t as cn } from "./utils-C_uf36nf.js";
2
2
  import { t as Button } from "./button-CmTDnzOn.js";
3
3
  import { t as SettingsProvider } from "./settings-store-DpEJEQ7M.js";
4
- import { t as Route$5 } from "./analytics-CYP_LT5Y.js";
5
- import { t as Route$6 } from "./routes-BzkJgq4W.js";
6
- import { t as Route$7 } from "./projects.index-DesYXwfi.js";
4
+ import { t as Route$8 } from "./analytics-CYP_LT5Y.js";
5
+ import { t as Route$9 } from "./routes-BzkJgq4W.js";
6
+ import { t as Route$10 } from "./projects.index-DesYXwfi.js";
7
+ import { r as openCodeWorkspacesQueryOptions } from "./opencode-queries-BeNYXnQv.js";
8
+ import { r as kiroWorkspacesQueryOptions } from "./kiro-queries-CzNlM2ok.js";
7
9
  import { r as cursorWorkspacesQueryOptions } from "./cursor-queries-NCIM0Nat.js";
10
+ import { r as claudeCodeWorkspacesQueryOptions } from "./claude-code-queries-Cgzi4K-e.js";
8
11
  import { i as antigravityWorkspacesQueryOptions } from "./antigravity-queries-CGrJO9Vr.js";
9
- import { t as Route$8 } from "./threads._threadId-Bs0yuqO9.js";
10
- import { t as Route$9 } from "./projects._project-Bpbc3C-L.js";
11
- import { t as Route$10 } from "./cursor._workspaceKey-C5PdTaKB.js";
12
- import { t as Route$11 } from "./cursor-threads._composerId-BPJFWfJj.js";
13
- import { t as Route$12 } from "./antigravity._workspaceKey-B0QeYUOh.js";
14
- import { t as Route$13 } from "./antigravity-conversations._conversationId-zMrR6v6R.js";
12
+ import { t as Route$11 } from "./threads._threadId-Ci0S4mKU.js";
13
+ import { t as Route$12 } from "./projects._project-4io5LO0E.js";
14
+ import { t as Route$13 } from "./opencode._workspaceKey-CfH96HTT.js";
15
+ import { t as Route$14 } from "./opencode-sessions._sessionId-D8Q7in_Z.js";
16
+ import { t as Route$15 } from "./kiro._workspaceKey-CJsjgNwO.js";
17
+ import { t as Route$16 } from "./kiro-sessions._sessionId-bvTulT7C.js";
18
+ import { t as Route$17 } from "./cursor._workspaceKey-CZuohIUL.js";
19
+ import { t as Route$18 } from "./cursor-threads._composerId-p9-ARAzc.js";
20
+ import { t as Route$19 } from "./claude-code._workspaceKey-B5Xg_-tE.js";
21
+ import { t as Route$20 } from "./claude-code-sessions._sessionId-C55oe6zj.js";
22
+ import { t as Route$21 } from "./antigravity._workspaceKey-B0QeYUOh.js";
23
+ import { t as Route$22 } from "./antigravity-conversations._conversationId-eS87Dx7g.js";
15
24
  import { useEffect, useState } from "react";
16
25
  import { HeadContent, Link, Outlet, Scripts, createFileRoute, createRootRouteWithContext, createRouter, lazyRouteComponent, notFound, redirect, useRouterState } from "@tanstack/react-router";
17
26
  import { jsx, jsxs } from "react/jsx-runtime";
18
27
  import { setupRouterSsrQueryIntegration } from "@tanstack/react-router-ssr-query";
19
28
  import { QueryClient } from "@tanstack/react-query";
20
- import { BarChart3, FolderOpen, LayoutDashboard, Moon, Settings2, Sparkles, SquareTerminal, Sun } from "lucide-react";
29
+ import { BarChart3, Bot, BrainCircuit, Code2, FolderOpen, LayoutDashboard, Moon, Settings2, Sparkles, SquareTerminal, Sun } from "lucide-react";
21
30
  import { Tooltip } from "radix-ui";
22
31
  //#region src/integrations/tanstack-query/root-provider.tsx
23
32
  function getContext() {
@@ -25,7 +34,7 @@ function getContext() {
25
34
  }
26
35
  //#endregion
27
36
  //#region ../../package.json?raw
28
- var package_default = "{\n \"author\": {\n \"name\": \"Ragaeeb Haq\",\n \"url\": \"https://github.com/ragaeeb\"\n },\n \"bin\": {\n \"codex-chats\": \"./bin/codex-chats.js\",\n \"codex-chats-claude\": \"./bin/codex-chats-claude.js\",\n \"spiracha\": \"./bin/spiracha.js\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/ragaeeb/spiracha/issues\"\n },\n \"dependencies\": {\n \"@inquirer/prompts\": \"^8.5.2\",\n \"@modelcontextprotocol/sdk\": \"^1.29.0\",\n \"@tanstack/react-query\": \"5.101.0\",\n \"@tanstack/react-router\": \"1.170.15\",\n \"@tanstack/react-router-ssr-query\": \"1.167.1\",\n \"@tanstack/react-table\": \"8.21.3\",\n \"@tanstack/react-virtual\": \"3.14.2\",\n \"class-variance-authority\": \"0.7.1\",\n \"clsx\": \"2.1.1\",\n \"iconv-lite\": \"^0.7.2\",\n \"lucide-react\": \"1.17.0\",\n \"radix-ui\": \"1.5.0\",\n \"react\": \"19.2.7\",\n \"react-dom\": \"19.2.7\",\n \"tailwind-merge\": \"3.6.0\",\n \"zod\": \"4.4.3\"\n },\n \"description\": \"Export local Codex, Claude Code, and Cursor transcripts, and browse Codex, Cursor, and Antigravity history through a local UI.\",\n \"devDependencies\": {\n \"@types/bun\": \"^1.3.14\",\n \"@types/node\": \"^25.9.2\",\n \"typescript\": \"^6.0.3\"\n },\n \"engines\": {\n \"bun\": \">=1.3.14\"\n },\n \"files\": [\n \"bin/codex-chats.js\",\n \"bin/codex-chats-claude.js\",\n \"bin/spiracha.js\",\n \"src/export-chats.ts\",\n \"src/export-claude.ts\",\n \"src/export-cursor.ts\",\n \"src/mcp-server.ts\",\n \"src/spiracha.ts\",\n \"src/ui-cli.ts\",\n \"src/lib/antigravity-db.ts\",\n \"src/lib/antigravity-exporter-types.ts\",\n \"src/lib/antigravity-keychain.ts\",\n \"src/lib/claude-exporter.ts\",\n \"src/lib/cursor-db.ts\",\n \"src/lib/cursor-exporter.ts\",\n \"src/lib/cursor-exporter-types.ts\",\n \"src/lib/cursor-recovery.ts\",\n \"src/lib/cursor-transcript.ts\",\n \"src/lib/codex-exporter-cli.ts\",\n \"src/lib/codex-exporter-db.ts\",\n \"src/lib/codex-exporter-transcript.ts\",\n \"src/lib/codex-exporter-types.ts\",\n \"src/lib/codex-exporter.ts\",\n \"src/lib/codex-browser-db.ts\",\n \"src/lib/codex-browser-export.ts\",\n \"src/lib/codex-browser-types.ts\",\n \"src/lib/codex-thread-recovery.ts\",\n \"src/lib/codex-thread-cache.ts\",\n \"src/lib/codex-thread-parser.ts\",\n \"src/lib/codex-analytics.ts\",\n \"src/lib/path-transforms.ts\",\n \"src/lib/sqlite-error.ts\",\n \"src/lib/sqlite-retry.ts\",\n \"src/lib/ui-export-files.ts\",\n \"src/lib/ui-cache.ts\",\n \"src/lib/interactive-cli.ts\",\n \"src/lib/model-label.ts\",\n \"src/lib/native-open.ts\",\n \"src/lib/shared.ts\",\n \"apps/ui/dist/client/assets/**/*\",\n \"apps/ui/dist/client/icon.svg\",\n \"apps/ui/dist/client/manifest.json\",\n \"apps/ui/dist/client/robots.txt\",\n \"apps/ui/dist/server/**/*\",\n \"README.md\",\n \"AGENTS.md\"\n ],\n \"homepage\": \"https://github.com/ragaeeb/spiracha\",\n \"keywords\": [\n \"codex\",\n \"claude\",\n \"cursor\",\n \"antigravity\",\n \"transcripts\",\n \"export\",\n \"markdown\",\n \"bun\"\n ],\n \"license\": \"MIT\",\n \"name\": \"spiracha\",\n \"packageManager\": \"bun@1.3.14\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/ragaeeb/spiracha.git\"\n },\n \"scripts\": {\n \"build\": \"bun run typecheck && bun run --cwd apps/ui build\",\n \"coverage\": \"bun run coverage:root && bun run coverage:ui\",\n \"coverage:root\": \"bun test --coverage --coverage-reporter=lcov --coverage-dir coverage && bun run ./src/coverage-check.ts root\",\n \"coverage:ui\": \"bun run --cwd apps/ui coverage && bun run ./src/coverage-check.ts ui\",\n \"export:claude\": \"bun run ./src/export-claude.ts\",\n \"format\": \"biome check . --write && biome lint . --write\",\n \"lint\": \"biome check .\",\n \"mcp\": \"bun run ./src/mcp-server.ts\",\n \"smoke:package-ui\": \"bun run ./src/package-ui-smoke.ts\",\n \"start\": \"bun run ./src/export-chats.ts\",\n \"typecheck\": \"bun run typecheck:root && bun run typecheck:ui\",\n \"typecheck:root\": \"bunx tsc --noEmit\",\n \"typecheck:ui\": \"bun run --cwd apps/ui typecheck\",\n \"ui:dev\": \"bun run --cwd apps/ui dev\",\n \"ui:preview\": \"bun run --cwd apps/ui preview\"\n },\n \"type\": \"module\",\n \"version\": \"1.4.0\",\n \"workspaces\": [\n \"apps/*\"\n ]\n}\n";
37
+ var package_default = "{\n \"author\": {\n \"name\": \"Ragaeeb Haq\",\n \"url\": \"https://github.com/ragaeeb\"\n },\n \"bin\": {\n \"codex-chats\": \"./bin/codex-chats.js\",\n \"codex-chats-claude\": \"./bin/codex-chats-claude.js\",\n \"spiracha\": \"./bin/spiracha.js\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/ragaeeb/spiracha/issues\"\n },\n \"dependencies\": {\n \"@inquirer/prompts\": \"^8.5.2\",\n \"@modelcontextprotocol/sdk\": \"^1.29.0\",\n \"@tanstack/react-query\": \"5.101.0\",\n \"@tanstack/react-router\": \"1.170.15\",\n \"@tanstack/react-router-ssr-query\": \"1.167.1\",\n \"@tanstack/react-table\": \"8.21.3\",\n \"@tanstack/react-virtual\": \"3.14.2\",\n \"class-variance-authority\": \"0.7.1\",\n \"clsx\": \"2.1.1\",\n \"iconv-lite\": \"^0.7.2\",\n \"lucide-react\": \"1.18.0\",\n \"radix-ui\": \"1.5.0\",\n \"react\": \"19.2.7\",\n \"react-dom\": \"19.2.7\",\n \"tailwind-merge\": \"3.6.0\",\n \"zod\": \"4.4.3\"\n },\n \"description\": \"Export local Codex, Claude Code, and Cursor transcripts, and browse Codex, Claude Code, Kiro, Cursor, Antigravity, and OpenCode history through a local UI.\",\n \"devDependencies\": {\n \"@types/bun\": \"^1.3.14\",\n \"@types/node\": \"^25.9.3\",\n \"typescript\": \"^6.0.3\"\n },\n \"engines\": {\n \"bun\": \">=1.3.14\"\n },\n \"files\": [\n \"bin/codex-chats.js\",\n \"bin/codex-chats-claude.js\",\n \"bin/spiracha.js\",\n \"src/export-chats.ts\",\n \"src/export-claude.ts\",\n \"src/export-cursor.ts\",\n \"src/mcp-server.ts\",\n \"src/spiracha.ts\",\n \"src/ui-cli.ts\",\n \"src/lib/antigravity-db.ts\",\n \"src/lib/antigravity-exporter-types.ts\",\n \"src/lib/antigravity-keychain.ts\",\n \"src/lib/claude-code-db.ts\",\n \"src/lib/claude-code-exporter-types.ts\",\n \"src/lib/claude-code-transcript-phase.ts\",\n \"src/lib/claude-code-transcript.ts\",\n \"src/lib/claude-exporter.ts\",\n \"src/lib/cursor-db.ts\",\n \"src/lib/cursor-exporter.ts\",\n \"src/lib/cursor-exporter-types.ts\",\n \"src/lib/cursor-recovery.ts\",\n \"src/lib/cursor-transcript.ts\",\n \"src/lib/kiro-db.ts\",\n \"src/lib/kiro-exporter-types.ts\",\n \"src/lib/kiro-transcript-phase.ts\",\n \"src/lib/kiro-transcript.ts\",\n \"src/lib/opencode-db.ts\",\n \"src/lib/opencode-exporter-types.ts\",\n \"src/lib/opencode-transcript-phase.ts\",\n \"src/lib/opencode-think-tags.ts\",\n \"src/lib/opencode-transcript.ts\",\n \"src/lib/codex-exporter-cli.ts\",\n \"src/lib/codex-exporter-db.ts\",\n \"src/lib/codex-exporter-transcript.ts\",\n \"src/lib/codex-exporter-types.ts\",\n \"src/lib/codex-exporter.ts\",\n \"src/lib/codex-browser-db.ts\",\n \"src/lib/codex-browser-export.ts\",\n \"src/lib/codex-browser-types.ts\",\n \"src/lib/codex-thread-recovery.ts\",\n \"src/lib/codex-thread-cache.ts\",\n \"src/lib/codex-thread-parser.ts\",\n \"src/lib/codex-analytics.ts\",\n \"src/lib/concurrency.ts\",\n \"src/lib/path-transforms.ts\",\n \"src/lib/sqlite-error.ts\",\n \"src/lib/sqlite-retry.ts\",\n \"src/lib/ui-export-archive.ts\",\n \"src/lib/ui-export-files.ts\",\n \"src/lib/ui-cache.ts\",\n \"src/lib/interactive-cli.ts\",\n \"src/lib/model-label.ts\",\n \"src/lib/native-open.ts\",\n \"src/lib/shared.ts\",\n \"apps/ui/dist/client/assets/**/*\",\n \"apps/ui/dist/client/icon.svg\",\n \"apps/ui/dist/client/manifest.json\",\n \"apps/ui/dist/client/robots.txt\",\n \"apps/ui/dist/server/**/*\",\n \"README.md\",\n \"AGENTS.md\"\n ],\n \"homepage\": \"https://github.com/ragaeeb/spiracha\",\n \"keywords\": [\n \"codex\",\n \"claude\",\n \"kiro\",\n \"cursor\",\n \"antigravity\",\n \"opencode\",\n \"transcripts\",\n \"export\",\n \"markdown\",\n \"bun\"\n ],\n \"license\": \"MIT\",\n \"name\": \"spiracha\",\n \"packageManager\": \"bun@1.3.14\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/ragaeeb/spiracha.git\"\n },\n \"scripts\": {\n \"build\": \"bun run typecheck && bun run --cwd apps/ui build\",\n \"coverage\": \"bun run coverage:root && bun run coverage:ui\",\n \"coverage:root\": \"bun test --coverage --coverage-reporter=lcov --coverage-dir coverage && bun run ./src/coverage-check.ts root\",\n \"coverage:ui\": \"bun run --cwd apps/ui coverage && bun run ./src/coverage-check.ts ui\",\n \"export:claude\": \"bun run ./src/export-claude.ts\",\n \"format\": \"biome check . --write && biome lint . --write\",\n \"lint\": \"biome check .\",\n \"mcp\": \"bun run ./src/mcp-server.ts\",\n \"smoke:package-ui\": \"bun run ./src/package-ui-smoke.ts\",\n \"start\": \"bun run ./src/export-chats.ts\",\n \"typecheck\": \"bun run typecheck:root && bun run typecheck:ui\",\n \"typecheck:root\": \"bunx tsc --noEmit\",\n \"typecheck:ui\": \"bun run --cwd apps/ui typecheck\",\n \"ui:dev\": \"bun run --cwd apps/ui dev\",\n \"ui:preview\": \"bun run --cwd apps/ui preview\"\n },\n \"type\": \"module\",\n \"version\": \"1.5.0\",\n \"workspaces\": [\n \"apps/*\"\n ]\n}\n";
29
38
  //#endregion
30
39
  //#region src/lib/package-metadata.ts
31
40
  var parsePackageMetadata = () => {
@@ -84,6 +93,18 @@ var navItems = [
84
93
  label: "Codex",
85
94
  to: "/projects"
86
95
  },
96
+ {
97
+ activePrefixes: ["/claude-code", "/claude-code-sessions"],
98
+ icon: Bot,
99
+ label: "Claude Code",
100
+ to: "/claude-code"
101
+ },
102
+ {
103
+ activePrefixes: ["/kiro", "/kiro-sessions"],
104
+ icon: BrainCircuit,
105
+ label: "Kiro",
106
+ to: "/kiro"
107
+ },
87
108
  {
88
109
  activePrefixes: ["/antigravity", "/antigravity-conversations"],
89
110
  icon: Sparkles,
@@ -96,6 +117,12 @@ var navItems = [
96
117
  label: "Cursor",
97
118
  to: "/cursor"
98
119
  },
120
+ {
121
+ activePrefixes: ["/opencode", "/opencode-sessions"],
122
+ icon: Code2,
123
+ label: "OpenCode",
124
+ to: "/opencode"
125
+ },
99
126
  {
100
127
  icon: BarChart3,
101
128
  label: "Analytics",
@@ -180,7 +207,7 @@ function TooltipProvider({ delayDuration = 0, ...props }) {
180
207
  }
181
208
  //#endregion
182
209
  //#region src/styles.css?url
183
- var styles_default = "/assets/styles-BhRkXgwB.css";
210
+ var styles_default = "/assets/styles-B7Zi9EFA.css";
184
211
  //#endregion
185
212
  //#region src/routes/__root.tsx
186
213
  var themeInitScript = `
@@ -225,7 +252,7 @@ function RootErrorComponent({ error }) {
225
252
  })
226
253
  });
227
254
  }
228
- var Route$4 = createRootRouteWithContext()({
255
+ var Route$7 = createRootRouteWithContext()({
229
256
  component: RootComponent,
230
257
  errorComponent: RootErrorComponent,
231
258
  head: () => ({
@@ -251,7 +278,7 @@ var Route$4 = createRootRouteWithContext()({
251
278
  name: "viewport"
252
279
  },
253
280
  {
254
- content: "Browse local Codex, Cursor, and Antigravity history through a compact workspace UI.",
281
+ content: "Browse local Codex, Claude Code, Kiro, Cursor, Antigravity, and OpenCode history through a compact workspace UI.",
255
282
  name: "description"
256
283
  },
257
284
  { title: "Spiracha UI" }
@@ -270,16 +297,16 @@ function RootDocument({ children }) {
270
297
  }
271
298
  //#endregion
272
299
  //#region src/routes/settings.tsx
273
- var $$splitComponentImporter$3 = () => import("./settings-OayxIYQQ.js");
274
- var Route$3 = createFileRoute("/settings")({ component: lazyRouteComponent($$splitComponentImporter$3, "component") });
300
+ var $$splitComponentImporter$6 = () => import("./settings-OayxIYQQ.js");
301
+ var Route$6 = createFileRoute("/settings")({ component: lazyRouteComponent($$splitComponentImporter$6, "component") });
275
302
  //#endregion
276
303
  //#region src/lib/thread-id.ts
277
304
  var THREAD_ID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/iu;
278
305
  var isCodexThreadId = (value) => THREAD_ID_PATTERN.test(value);
279
306
  //#endregion
280
307
  //#region src/routes/$threadId.tsx
281
- var $$splitComponentImporter$2 = () => import("./_threadId-B6SrBR9E.js");
282
- var Route$2 = createFileRoute("/$threadId")({
308
+ var $$splitComponentImporter$5 = () => import("./_threadId-B6SrBR9E.js");
309
+ var Route$5 = createFileRoute("/$threadId")({
283
310
  beforeLoad: ({ params }) => {
284
311
  if (!isCodexThreadId(params.threadId)) throw notFound();
285
312
  throw redirect({
@@ -287,16 +314,43 @@ var Route$2 = createFileRoute("/$threadId")({
287
314
  to: "/threads/$threadId"
288
315
  });
289
316
  },
290
- component: lazyRouteComponent($$splitComponentImporter$2, "component")
317
+ component: lazyRouteComponent($$splitComponentImporter$5, "component")
318
+ });
319
+ //#endregion
320
+ //#region src/routes/opencode.index.tsx
321
+ var $$splitErrorComponentImporter$4 = () => import("./opencode.index-BbVzkJXP.js");
322
+ var $$splitComponentImporter$4 = () => import("./opencode.index-Vh_Gq_1L.js");
323
+ var Route$4 = createFileRoute("/opencode/")({
324
+ component: lazyRouteComponent($$splitComponentImporter$4, "component"),
325
+ errorComponent: lazyRouteComponent($$splitErrorComponentImporter$4, "errorComponent"),
326
+ loader: ({ context }) => context.queryClient.ensureQueryData(openCodeWorkspacesQueryOptions())
327
+ });
328
+ //#endregion
329
+ //#region src/routes/kiro.index.tsx
330
+ var $$splitErrorComponentImporter$3 = () => import("./kiro.index-C__-UROk.js");
331
+ var $$splitComponentImporter$3 = () => import("./kiro.index-CmTbqeYj.js");
332
+ var Route$3 = createFileRoute("/kiro/")({
333
+ component: lazyRouteComponent($$splitComponentImporter$3, "component"),
334
+ errorComponent: lazyRouteComponent($$splitErrorComponentImporter$3, "errorComponent"),
335
+ loader: ({ context }) => context.queryClient.ensureQueryData(kiroWorkspacesQueryOptions())
291
336
  });
292
337
  //#endregion
293
338
  //#region src/routes/cursor.index.tsx
294
- var $$splitErrorComponentImporter$1 = () => import("./cursor.index-CcsX7DG0.js");
295
- var $$splitComponentImporter$1 = () => import("./cursor.index-DkWT-mxw.js");
296
- var Route$1 = createFileRoute("/cursor/")({
339
+ var $$splitErrorComponentImporter$2 = () => import("./cursor.index-CcsX7DG0.js");
340
+ var $$splitComponentImporter$2 = () => import("./cursor.index-DkWT-mxw.js");
341
+ var Route$2 = createFileRoute("/cursor/")({
342
+ component: lazyRouteComponent($$splitComponentImporter$2, "component"),
343
+ errorComponent: lazyRouteComponent($$splitErrorComponentImporter$2, "errorComponent"),
344
+ loader: ({ context }) => context.queryClient.ensureQueryData(cursorWorkspacesQueryOptions())
345
+ });
346
+ //#endregion
347
+ //#region src/routes/claude-code.index.tsx
348
+ var $$splitErrorComponentImporter$1 = () => import("./claude-code.index-BUHThG1W.js");
349
+ var $$splitComponentImporter$1 = () => import("./claude-code.index-B7yYR7dD.js");
350
+ var Route$1 = createFileRoute("/claude-code/")({
297
351
  component: lazyRouteComponent($$splitComponentImporter$1, "component"),
298
352
  errorComponent: lazyRouteComponent($$splitErrorComponentImporter$1, "errorComponent"),
299
- loader: ({ context }) => context.queryClient.ensureQueryData(cursorWorkspacesQueryOptions())
353
+ loader: ({ context }) => context.queryClient.ensureQueryData(claudeCodeWorkspacesQueryOptions())
300
354
  });
301
355
  //#endregion
302
356
  //#region src/routes/antigravity.index.tsx
@@ -309,86 +363,140 @@ var Route = createFileRoute("/antigravity/")({
309
363
  });
310
364
  //#endregion
311
365
  //#region src/routeTree.gen.ts
312
- var SettingsRoute = Route$3.update({
366
+ var SettingsRoute = Route$6.update({
313
367
  id: "/settings",
314
368
  path: "/settings",
315
- getParentRoute: () => Route$4
369
+ getParentRoute: () => Route$7
316
370
  });
317
- var AnalyticsRoute = Route$5.update({
371
+ var AnalyticsRoute = Route$8.update({
318
372
  id: "/analytics",
319
373
  path: "/analytics",
320
- getParentRoute: () => Route$4
374
+ getParentRoute: () => Route$7
321
375
  });
322
- var ThreadIdRoute = Route$2.update({
376
+ var ThreadIdRoute = Route$5.update({
323
377
  id: "/$threadId",
324
378
  path: "/$threadId",
325
- getParentRoute: () => Route$4
379
+ getParentRoute: () => Route$7
326
380
  });
327
- var IndexRoute = Route$6.update({
381
+ var IndexRoute = Route$9.update({
328
382
  id: "/",
329
383
  path: "/",
330
- getParentRoute: () => Route$4
384
+ getParentRoute: () => Route$7
331
385
  });
332
- var ProjectsIndexRoute = Route$7.update({
386
+ var ProjectsIndexRoute = Route$10.update({
333
387
  id: "/projects/",
334
388
  path: "/projects/",
335
- getParentRoute: () => Route$4
389
+ getParentRoute: () => Route$7
390
+ });
391
+ var OpencodeIndexRoute = Route$4.update({
392
+ id: "/opencode/",
393
+ path: "/opencode/",
394
+ getParentRoute: () => Route$7
336
395
  });
337
- var CursorIndexRoute = Route$1.update({
396
+ var KiroIndexRoute = Route$3.update({
397
+ id: "/kiro/",
398
+ path: "/kiro/",
399
+ getParentRoute: () => Route$7
400
+ });
401
+ var CursorIndexRoute = Route$2.update({
338
402
  id: "/cursor/",
339
403
  path: "/cursor/",
340
- getParentRoute: () => Route$4
404
+ getParentRoute: () => Route$7
405
+ });
406
+ var ClaudeCodeIndexRoute = Route$1.update({
407
+ id: "/claude-code/",
408
+ path: "/claude-code/",
409
+ getParentRoute: () => Route$7
341
410
  });
342
411
  var AntigravityIndexRoute = Route.update({
343
412
  id: "/antigravity/",
344
413
  path: "/antigravity/",
345
- getParentRoute: () => Route$4
414
+ getParentRoute: () => Route$7
346
415
  });
347
- var ThreadsThreadIdRoute = Route$8.update({
416
+ var ThreadsThreadIdRoute = Route$11.update({
348
417
  id: "/threads/$threadId",
349
418
  path: "/threads/$threadId",
350
- getParentRoute: () => Route$4
419
+ getParentRoute: () => Route$7
351
420
  });
352
- var ProjectsProjectRoute = Route$9.update({
421
+ var ProjectsProjectRoute = Route$12.update({
353
422
  id: "/projects/$project",
354
423
  path: "/projects/$project",
355
- getParentRoute: () => Route$4
424
+ getParentRoute: () => Route$7
425
+ });
426
+ var OpencodeWorkspaceKeyRoute = Route$13.update({
427
+ id: "/opencode/$workspaceKey",
428
+ path: "/opencode/$workspaceKey",
429
+ getParentRoute: () => Route$7
356
430
  });
357
- var CursorWorkspaceKeyRoute = Route$10.update({
431
+ var OpencodeSessionsSessionIdRoute = Route$14.update({
432
+ id: "/opencode-sessions/$sessionId",
433
+ path: "/opencode-sessions/$sessionId",
434
+ getParentRoute: () => Route$7
435
+ });
436
+ var KiroWorkspaceKeyRoute = Route$15.update({
437
+ id: "/kiro/$workspaceKey",
438
+ path: "/kiro/$workspaceKey",
439
+ getParentRoute: () => Route$7
440
+ });
441
+ var KiroSessionsSessionIdRoute = Route$16.update({
442
+ id: "/kiro-sessions/$sessionId",
443
+ path: "/kiro-sessions/$sessionId",
444
+ getParentRoute: () => Route$7
445
+ });
446
+ var CursorWorkspaceKeyRoute = Route$17.update({
358
447
  id: "/cursor/$workspaceKey",
359
448
  path: "/cursor/$workspaceKey",
360
- getParentRoute: () => Route$4
449
+ getParentRoute: () => Route$7
361
450
  });
362
- var CursorThreadsComposerIdRoute = Route$11.update({
451
+ var CursorThreadsComposerIdRoute = Route$18.update({
363
452
  id: "/cursor-threads/$composerId",
364
453
  path: "/cursor-threads/$composerId",
365
- getParentRoute: () => Route$4
454
+ getParentRoute: () => Route$7
455
+ });
456
+ var ClaudeCodeWorkspaceKeyRoute = Route$19.update({
457
+ id: "/claude-code/$workspaceKey",
458
+ path: "/claude-code/$workspaceKey",
459
+ getParentRoute: () => Route$7
460
+ });
461
+ var ClaudeCodeSessionsSessionIdRoute = Route$20.update({
462
+ id: "/claude-code-sessions/$sessionId",
463
+ path: "/claude-code-sessions/$sessionId",
464
+ getParentRoute: () => Route$7
366
465
  });
367
- var AntigravityWorkspaceKeyRoute = Route$12.update({
466
+ var AntigravityWorkspaceKeyRoute = Route$21.update({
368
467
  id: "/antigravity/$workspaceKey",
369
468
  path: "/antigravity/$workspaceKey",
370
- getParentRoute: () => Route$4
469
+ getParentRoute: () => Route$7
371
470
  });
372
471
  var rootRouteChildren = {
373
472
  IndexRoute,
374
473
  ThreadIdRoute,
375
474
  AnalyticsRoute,
376
475
  SettingsRoute,
377
- AntigravityConversationsConversationIdRoute: Route$13.update({
476
+ AntigravityConversationsConversationIdRoute: Route$22.update({
378
477
  id: "/antigravity-conversations/$conversationId",
379
478
  path: "/antigravity-conversations/$conversationId",
380
- getParentRoute: () => Route$4
479
+ getParentRoute: () => Route$7
381
480
  }),
382
481
  AntigravityWorkspaceKeyRoute,
482
+ ClaudeCodeSessionsSessionIdRoute,
483
+ ClaudeCodeWorkspaceKeyRoute,
383
484
  CursorThreadsComposerIdRoute,
384
485
  CursorWorkspaceKeyRoute,
486
+ KiroSessionsSessionIdRoute,
487
+ KiroWorkspaceKeyRoute,
488
+ OpencodeSessionsSessionIdRoute,
489
+ OpencodeWorkspaceKeyRoute,
385
490
  ProjectsProjectRoute,
386
491
  ThreadsThreadIdRoute,
387
492
  AntigravityIndexRoute,
493
+ ClaudeCodeIndexRoute,
388
494
  CursorIndexRoute,
495
+ KiroIndexRoute,
496
+ OpencodeIndexRoute,
389
497
  ProjectsIndexRoute
390
498
  };
391
- var routeTree = Route$4._addFileChildren(rootRouteChildren)._addFileTypes();
499
+ var routeTree = Route$7._addFileChildren(rootRouteChildren)._addFileTypes();
392
500
  //#endregion
393
501
  //#region src/router.tsx
394
502
  function getRouter() {
@@ -30,6 +30,9 @@ var asString = (value) => {
30
30
  var asNumber = (value) => {
31
31
  return typeof value === "number" ? value : null;
32
32
  };
33
+ var asBoolean = (value) => {
34
+ return value === true;
35
+ };
33
36
  var readJsonlObjects = (filePath) => {
34
37
  const stream = createReadStream(filePath, { encoding: "utf8" });
35
38
  const lines = createInterface({
@@ -131,4 +134,4 @@ var toMetadataValue = (value, format) => {
131
134
  return format === "md" ? JSON.stringify(String(value)) : String(value);
132
135
  };
133
136
  //#endregion
134
- export { cleanInlineTitle as a, formatInlineLiteral as c, readJsonlObjects as d, renderCodeBlock as f, renderSection as h, cleanExtractedText as i, formatModelLabel as l, renderMetadataBlock as m, asObject as n, createExportWriteStream as o, renderDocumentTitle as p, asString as r, finalizeExportWriteStream as s, asNumber as t, getPortablePathBasename as u };
137
+ export { cleanExtractedText as a, finalizeExportWriteStream as c, getPortablePathBasename as d, readJsonlObjects as f, renderSection as g, renderMetadataBlock as h, asString as i, formatInlineLiteral as l, renderDocumentTitle as m, asNumber as n, cleanInlineTitle as o, renderCodeBlock as p, asObject as r, createExportWriteStream as s, asBoolean as t, formatModelLabel as u };
@@ -0,0 +1,38 @@
1
+ import { a as sanitizeExportFileName, n as ensureUiExportDir, o as zipExportDirectory, r as getExportMimeType, t as buildUiExportDownloadUrl } from "./ui-export-files-BHLX9bhN.js";
2
+ import { randomUUID } from "node:crypto";
3
+ import { mkdtemp, rm } from "node:fs/promises";
4
+ import os from "node:os";
5
+ import path from "node:path";
6
+ //#region src/lib/source-session-export-server.ts
7
+ var toSafeSourceExportName = (value, fallback) => {
8
+ return sanitizeExportFileName(value) || fallback;
9
+ };
10
+ var renderSourceSessionDownload = async ({ content, fallbackBaseName, fileBaseName, outputFormat, zipArchive }) => {
11
+ const safeBaseName = toSafeSourceExportName(fileBaseName, fallbackBaseName);
12
+ if (!zipArchive) return {
13
+ content,
14
+ fileName: `${safeBaseName}.${outputFormat}`,
15
+ mimeType: getExportMimeType(outputFormat),
16
+ mode: "download"
17
+ };
18
+ const exportDir = await ensureUiExportDir();
19
+ const workspaceDir = await mkdtemp(path.join(os.tmpdir(), `${safeBaseName}-`));
20
+ const zipPath = path.join(exportDir, `${safeBaseName}-${randomUUID()}.zip`);
21
+ try {
22
+ await Bun.write(path.join(workspaceDir, `${safeBaseName}.${outputFormat}`), content);
23
+ await zipExportDirectory(workspaceDir, zipPath);
24
+ } finally {
25
+ await rm(workspaceDir, {
26
+ force: true,
27
+ recursive: true
28
+ });
29
+ }
30
+ return {
31
+ downloadUrl: buildUiExportDownloadUrl(zipPath),
32
+ fileName: `${safeBaseName}.zip`,
33
+ mimeType: "application/zip",
34
+ mode: "download_url"
35
+ };
36
+ };
37
+ //#endregion
38
+ export { renderSourceSessionDownload as t };
@@ -1,4 +1,4 @@
1
- //#region ../../node_modules/.bun/@tanstack+react-start@1.168.25+1e4c23dcb33f1092/node_modules/@tanstack/react-start/dist/plugin/default-entry/start.ts
1
+ //#region ../../node_modules/.bun/@tanstack+react-start@1.168.25+ef477cf6485321ca/node_modules/@tanstack/react-start/dist/plugin/default-entry/start.ts
2
2
  var startInstance = void 0;
3
3
  //#endregion
4
4
  export { startInstance };
@@ -102,7 +102,6 @@ var getEventTone = (event) => {
102
102
  return "border-[var(--border)] bg-[var(--panel-secondary)]/80";
103
103
  };
104
104
  var getMessageTitle = (event, assistantModel) => {
105
- if (event.role === "assistant" && event.phase === "final_answer") return "Final Answer";
106
105
  const modelLabel = formatModelLabel(event.model ?? assistantModel);
107
106
  if (event.variant === "agent_message") return event.role === "assistant" ? modelLabel : "Assistant update";
108
107
  if (event.role === "assistant") return modelLabel;
@@ -0,0 +1,45 @@
1
+ //#region src/lib/thread-transcript-stats.ts
2
+ var EXEC_TOOL_NAMES = new Set([
3
+ "bash",
4
+ "exec",
5
+ "execute",
6
+ "execute_command",
7
+ "run_command",
8
+ "shell",
9
+ "terminal"
10
+ ]);
11
+ var isExecToolName = (name) => {
12
+ return EXEC_TOOL_NAMES.has((name ?? "").trim().toLowerCase());
13
+ };
14
+ var updateMessageStats = (stats, event) => {
15
+ stats.messageCount += 1;
16
+ if (event.role === "assistant") stats.assistantMessageCount += 1;
17
+ if (event.role === "user") stats.userMessageCount += 1;
18
+ if (event.phase === "commentary") stats.commentaryCount += 1;
19
+ if (event.phase === "final_answer") stats.finalAnswerCount += 1;
20
+ };
21
+ var getThreadTranscriptStats = (events) => {
22
+ const stats = {
23
+ assistantMessageCount: 0,
24
+ commentaryCount: 0,
25
+ execCommandCount: 0,
26
+ finalAnswerCount: 0,
27
+ messageCount: 0,
28
+ toolCallCount: 0,
29
+ toolOutputCount: 0,
30
+ userMessageCount: 0,
31
+ webSearchEventCount: 0
32
+ };
33
+ for (const event of events) {
34
+ if (event.kind === "message") updateMessageStats(stats, event);
35
+ if (event.kind === "tool_call") {
36
+ stats.toolCallCount += 1;
37
+ if (isExecToolName(event.name)) stats.execCommandCount += 1;
38
+ }
39
+ if (event.kind === "tool_output") stats.toolOutputCount += 1;
40
+ if (event.kind === "web_search") stats.webSearchEventCount += 1;
41
+ }
42
+ return stats;
43
+ };
44
+ //#endregion
45
+ export { getThreadTranscriptStats as t };
@@ -1,16 +1,16 @@
1
1
  import { t as Button } from "./button-CmTDnzOn.js";
2
2
  import { n as useSettings } from "./settings-store-DpEJEQ7M.js";
3
3
  import { a as threadSnapshotQueryOptions, c as deleteThreadFn, o as threadTranscriptQueryOptions, u as exportThreadFn } from "./codex-queries-CtgeZ7VL.js";
4
- import { t as Route } from "./threads._threadId-Bs0yuqO9.js";
4
+ import { t as Route } from "./threads._threadId-Ci0S4mKU.js";
5
5
  import { t as Checkbox } from "./checkbox-C0hovF41.js";
6
6
  import { t as MetricCard } from "./metric-card-ByEeLu0r.js";
7
7
  import { t as PageHeader } from "./page-header-VNSaM3xd.js";
8
8
  import { i as formatList, n as formatBytes, r as formatDateTime, s as formatTokens, t as formatBooleanLabel } from "./formatters-FJaGZgJk.js";
9
- 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-CGA13IZM.js";
9
+ 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";
10
10
  import { t as Badge } from "./badge-EvdhKK_Z.js";
11
11
  import { n as downloadUrlFile, t as downloadTextFile } from "./download-DMmiy1xf.js";
12
+ import { t as ExportDialog } from "./export-dialog-D88ze9Gy.js";
12
13
  import { t as DeleteConfirmDialog } from "./delete-confirm-dialog-BcBNCxWB.js";
13
- import { t as ExportDialog } from "./export-dialog-BItjWgkZ.js";
14
14
  import { useState } from "react";
15
15
  import { Link, useNavigate } from "@tanstack/react-router";
16
16
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
@@ -405,13 +405,18 @@ function DeferredTranscriptNotice({ fileSizeBytes, missing, pending, onLoad }) {
405
405
  ]
406
406
  });
407
407
  }
408
+ var getThreadExportErrorMessage = (transcriptMissing, error) => {
409
+ if (transcriptMissing) return "The rollout JSONL file is missing from disk, so this thread cannot be exported right now.";
410
+ return error instanceof Error ? error.message : null;
411
+ };
408
412
  function ThreadDetailPage() {
409
413
  const navigate = useNavigate();
410
414
  const queryClient = useQueryClient();
411
415
  const params = Route.useParams();
412
416
  const snapshot = useSuspenseQuery(threadSnapshotQueryOptions(params.threadId)).data;
413
417
  const { settings } = useSettings();
414
- const [shouldLoadTranscript, setShouldLoadTranscript] = useState(!snapshot.rollout.shouldDeferTranscriptLoad);
418
+ const transcriptMissing = snapshot.transcriptState === "missing";
419
+ const [shouldLoadTranscript, setShouldLoadTranscript] = useState(!snapshot.rollout.shouldDeferTranscriptLoad && !transcriptMissing);
415
420
  const [showToolCalls, setShowToolCalls] = useState(false);
416
421
  const [showCommentary, setShowCommentary] = useState(false);
417
422
  const [showExtraEvents, setShowExtraEvents] = useState(false);
@@ -421,7 +426,7 @@ function ThreadDetailPage() {
421
426
  const [deleteOpen, setDeleteOpen] = useState(false);
422
427
  const transcriptQuery = useQuery({
423
428
  ...threadTranscriptQueryOptions(params.threadId),
424
- enabled: shouldLoadTranscript && snapshot.transcript === null
429
+ enabled: shouldLoadTranscript && snapshot.transcript === null && !transcriptMissing
425
430
  });
426
431
  const transcript = snapshot.transcript ?? transcriptQuery.data ?? null;
427
432
  const viewSnapshot = {
@@ -627,9 +632,13 @@ function ThreadDetailPage() {
627
632
  onOpenChange: setDeleteOpen
628
633
  }),
629
634
  /* @__PURE__ */ jsx(ExportDialog, {
635
+ disabled: transcriptMissing,
636
+ errorMessage: getThreadExportErrorMessage(transcriptMissing, exportThreadMutation.error),
630
637
  open: exportOpen,
631
638
  pending: exportThreadMutation.isPending,
632
- onExport: (options) => exportThreadMutation.mutate(options),
639
+ onExport: (options) => {
640
+ if (!transcriptMissing) exportThreadMutation.mutate(options);
641
+ },
633
642
  onOpenChange: setExportOpen
634
643
  })
635
644
  ]
@@ -4,7 +4,7 @@ import { createFileRoute, lazyRouteComponent } from "@tanstack/react-router";
4
4
  import { jsx } from "react/jsx-runtime";
5
5
  //#region src/routes/threads.$threadId.tsx
6
6
  var $$splitErrorComponentImporter = () => import("./threads._threadId-BSSK4nkI.js");
7
- var $$splitComponentImporter = () => import("./threads._threadId-D2GYkVn6.js");
7
+ var $$splitComponentImporter = () => import("./threads._threadId-BeXEc4Lo.js");
8
8
  var Route = createFileRoute("/threads/$threadId")({
9
9
  component: lazyRouteComponent($$splitComponentImporter, "component"),
10
10
  errorComponent: lazyRouteComponent($$splitErrorComponentImporter, "errorComponent"),