spiracha 1.3.2 → 1.4.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 (160) hide show
  1. package/AGENTS.md +7 -1
  2. package/README.md +6 -0
  3. package/apps/ui/AGENTS.md +8 -0
  4. package/apps/ui/README.md +10 -3
  5. package/apps/ui/dist/client/assets/analytics-DK2jdvmI.js +1 -0
  6. package/apps/ui/dist/client/assets/antigravity-conversations._conversationId-DmD0sN8X.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-BRHVjFAM.js +1 -0
  9. package/apps/ui/dist/client/assets/antigravity._workspaceKey-ByitGWki.js +1 -0
  10. package/apps/ui/dist/client/assets/antigravity._workspaceKey-CGV7amas.js +1 -0
  11. package/apps/ui/dist/client/assets/antigravity.index-DEEkjlZa.js +1 -0
  12. package/apps/ui/dist/client/assets/antigravity.index-DgW25FEV.js +1 -0
  13. package/apps/ui/dist/client/assets/badge-DfWvPfKF.js +1 -0
  14. package/apps/ui/dist/client/assets/checkbox-CdHitXWQ.js +1 -0
  15. package/apps/ui/dist/client/assets/createServerFn-CgRRVpBH.js +3 -0
  16. package/apps/ui/dist/client/assets/cursor-threads._composerId-CmBFclK8.js +1 -0
  17. package/apps/ui/dist/client/assets/cursor-threads._composerId-Ti2gTm63.js +1 -0
  18. package/apps/ui/dist/client/assets/cursor._workspaceKey-CaAZjGmm.js +1 -0
  19. package/apps/ui/dist/client/assets/cursor._workspaceKey-DzD_c6j9.js +1 -0
  20. package/apps/ui/dist/client/assets/cursor.index-CrnMwDCi.js +1 -0
  21. package/apps/ui/dist/client/assets/cursor.index-PkCFVcl4.js +2 -0
  22. package/apps/ui/dist/client/assets/{data-table-Cj-v-uyB.js → data-table-Br78_dk3.js} +2 -2
  23. package/apps/ui/dist/client/assets/delete-confirm-dialog-BHRmyLHr.js +11 -0
  24. package/apps/ui/dist/client/assets/dist-B9pyYCVU.js +1 -0
  25. package/apps/ui/dist/client/assets/dist-BhZOxAPP.js +1 -0
  26. package/apps/ui/dist/client/assets/dist-DvMS2965.js +1 -0
  27. package/apps/ui/dist/client/assets/download-Bf0QJKD3.js +1 -0
  28. package/apps/ui/dist/client/assets/dropdown-menu-Dy5cLzTy.js +1 -0
  29. package/apps/ui/dist/client/assets/es2015-BkCWttyM.js +41 -0
  30. package/apps/ui/dist/client/assets/export-dialog-C86SYHJn.js +1 -0
  31. package/apps/ui/dist/client/assets/formatters-BM9kB7ed.js +1 -0
  32. package/apps/ui/dist/client/assets/index-CPvAP-jk.js +149 -0
  33. package/apps/ui/dist/client/assets/jsx-runtime-DGeXAQPT.js +1 -0
  34. package/apps/ui/dist/client/assets/metric-card-Dplm0ZiM.js +1 -0
  35. package/apps/ui/dist/client/assets/page-header-Cwa3p6Tl.js +1 -0
  36. package/apps/ui/dist/client/assets/projects._project-Ckf6muWZ.js +1 -0
  37. package/apps/ui/dist/client/assets/projects._project-DSDwH4NF.js +1 -0
  38. package/apps/ui/dist/client/assets/projects.index-DEfhWqa8.js +1 -0
  39. package/apps/ui/dist/client/assets/projects.index-V5ibNZII.js +3 -0
  40. package/apps/ui/dist/client/assets/react-dom-DL96Jor4.js +1 -0
  41. package/apps/ui/dist/client/assets/refresh-ccw-BgKjOiA6.js +1 -0
  42. package/apps/ui/dist/client/assets/reload-error-panel-AHqu0akK.js +1 -0
  43. package/apps/ui/dist/client/assets/routes-Df2tgpyd.js +1 -0
  44. package/apps/ui/dist/client/assets/scroll-text-fM0sMOB3.js +1 -0
  45. package/apps/ui/dist/client/assets/select-Bf2GwfPR.js +1 -0
  46. package/apps/ui/dist/client/assets/settings-5VQIzME0.js +1 -0
  47. package/apps/ui/dist/client/assets/sqlite-error-B6uZjUe8.js +1 -0
  48. package/apps/ui/dist/client/assets/styles-BhRkXgwB.css +1 -0
  49. package/apps/ui/dist/client/assets/tabs-OO4VU5KR.js +7 -0
  50. package/apps/ui/dist/client/assets/text-filter-DVAZySUS.js +2 -0
  51. package/apps/ui/dist/client/assets/threads._threadId-BB9tTsV4.js +1 -0
  52. package/apps/ui/dist/client/assets/threads._threadId-BgDhFj2I.js +1 -0
  53. package/apps/ui/dist/client/assets/useMutation-CC_B7uy5.js +1 -0
  54. package/apps/ui/dist/client/assets/useQuery-C5By6WKU.js +1 -0
  55. package/apps/ui/dist/server/assets/_tanstack-start-manifest_v-CRW2kqj0.js +232 -0
  56. package/apps/ui/dist/server/assets/analytics-CYP_LT5Y.js +16 -0
  57. package/apps/ui/dist/server/assets/{analytics-CBNOYZwJ.js → analytics-CtpOMVMO.js} +13 -6
  58. package/apps/ui/dist/server/assets/antigravity-conversations._conversationId-BtexWY-K.js +613 -0
  59. package/apps/ui/dist/server/assets/{antigravity-conversations._conversationId-BIdYNy68.js → antigravity-conversations._conversationId-zMrR6v6R.js} +2 -2
  60. package/apps/ui/dist/server/assets/{antigravity-db-D9gW1D8G.js → antigravity-db-Bh8_U9uw.js} +11 -7
  61. package/apps/ui/dist/server/assets/{antigravity-keychain-panel-DcLyBBwd.js → antigravity-keychain-panel-CC7FLmAK.js} +1 -1
  62. package/apps/ui/dist/server/assets/{antigravity-queries-CgQhlQ7J.js → antigravity-queries-CGrJO9Vr.js} +6 -6
  63. package/apps/ui/dist/server/assets/{antigravity-server-DFUx4Khk.js → antigravity-server-CHRjVFqN.js} +11 -11
  64. package/apps/ui/dist/server/assets/{antigravity._workspaceKey-DnSlSC-C.js → antigravity._workspaceKey-B0QeYUOh.js} +2 -2
  65. package/apps/ui/dist/server/assets/{antigravity._workspaceKey-D42ixtzp.js → antigravity._workspaceKey-C3kP-qyN.js} +5 -5
  66. package/apps/ui/dist/server/assets/{antigravity.index-DZVT-cac.js → antigravity.index-CPCYkqCi.js} +2 -2
  67. package/apps/ui/dist/server/assets/{codex-queries-eOJGfHQj.js → codex-queries-CtgeZ7VL.js} +16 -14
  68. package/apps/ui/dist/server/assets/{codex-server-nrETIF--.js → codex-server-CNXSJuc2.js} +105 -120
  69. package/apps/ui/dist/server/assets/concurrency-VXtYvlGh.js +18 -0
  70. package/apps/ui/dist/server/assets/{createServerRpc-BtXIw2iP.js → createServerRpc-CF_DEwnm.js} +1 -1
  71. package/apps/ui/dist/server/assets/{createSsrRpc-COf5Zuye.js → createSsrRpc-C754NPki.js} +1 -1
  72. package/apps/ui/dist/server/assets/{cursor-db-B7agkAvM.js → cursor-db-cYZEU3WQ.js} +194 -7
  73. package/apps/ui/dist/server/assets/{cursor-queries-BMhuJeUO.js → cursor-queries-NCIM0Nat.js} +13 -11
  74. package/apps/ui/dist/server/assets/{cursor-recovery-9bJLs7vG.js → cursor-recovery-nq-kR62j.js} +1 -1
  75. package/apps/ui/dist/server/assets/{cursor-server-BgylIFgn.js → cursor-server-C3q7hrp-.js} +70 -41
  76. package/apps/ui/dist/server/assets/{cursor-threads._composerId-DXffY_CK.js → cursor-threads._composerId-BPJFWfJj.js} +2 -2
  77. package/apps/ui/dist/server/assets/cursor-threads._composerId-BkMMTQ3v.js +582 -0
  78. package/apps/ui/dist/server/assets/{cursor._workspaceKey-BP2J1x_x.js → cursor._workspaceKey-C5PdTaKB.js} +2 -2
  79. package/apps/ui/dist/server/assets/{cursor._workspaceKey-BQd0e-Pd.js → cursor._workspaceKey-Ckj7apKI.js} +11 -9
  80. package/apps/ui/dist/server/assets/{cursor.index-CQVxtCm8.js → cursor.index-DkWT-mxw.js} +2 -2
  81. package/apps/ui/dist/server/assets/{delete-confirm-dialog-PCD7S0_M.js → delete-confirm-dialog-BcBNCxWB.js} +5 -1
  82. package/apps/ui/dist/server/assets/empty-plugin-adapters-B3lHh1La.js +5 -0
  83. package/apps/ui/dist/server/assets/{export-dialog-DaPlOGFT.js → export-dialog-BItjWgkZ.js} +53 -11
  84. package/apps/ui/dist/server/assets/{projects._project-DUN3iWfg.js → projects._project-Bpbc3C-L.js} +5 -3
  85. package/apps/ui/dist/server/assets/{projects._project-Dim9Y0kD.js → projects._project-CvZho6EQ.js} +42 -12
  86. package/apps/ui/dist/server/assets/{projects.index-DjSQK5dm.js → projects.index-BkLiF2FF.js} +21 -7
  87. package/apps/ui/dist/server/assets/projects.index-DesYXwfi.js +14 -0
  88. package/apps/ui/dist/server/assets/route-search-ts4W9MJ9.js +38 -0
  89. package/apps/ui/dist/server/assets/{router-DrDgc-LD.js → router-6m-ihwqA.js} +78 -62
  90. package/apps/ui/dist/server/assets/{routes-B-GlEe2C.js → routes-Bsact1uB.js} +2 -2
  91. package/apps/ui/dist/server/assets/{routes-CNHAUMwo.js → routes-BzkJgq4W.js} +2 -2
  92. package/apps/ui/dist/server/assets/start-CI_0bSiY.js +4 -0
  93. package/apps/ui/dist/server/assets/tabs-CGA13IZM.js +502 -0
  94. package/apps/ui/dist/server/assets/{threads._threadId-CJzm4KrZ.js → threads._threadId-Bs0yuqO9.js} +2 -2
  95. package/apps/ui/dist/server/assets/threads._threadId-D2GYkVn6.js +639 -0
  96. package/apps/ui/dist/server/assets/ui-export-files-BHLX9bhN.js +83 -0
  97. package/apps/ui/dist/server/server.js +340 -218
  98. package/package.json +9 -9
  99. package/src/lib/antigravity-db.ts +20 -13
  100. package/src/lib/codex-analytics.ts +118 -18
  101. package/src/lib/codex-browser-db.ts +1 -25
  102. package/src/lib/codex-browser-export.ts +9 -69
  103. package/src/lib/cursor-db.ts +318 -7
  104. package/src/lib/cursor-exporter.ts +2 -2
  105. package/src/lib/ui-cache.ts +14 -1
  106. package/src/spiracha.ts +20 -1
  107. package/apps/ui/dist/client/assets/analytics-B_hYz65v.js +0 -1
  108. package/apps/ui/dist/client/assets/antigravity-conversations._conversationId-qiyygB7e.js +0 -1
  109. package/apps/ui/dist/client/assets/antigravity-conversations._conversationId-z1SQC2Kg.js +0 -1
  110. package/apps/ui/dist/client/assets/antigravity-keychain-panel-dYuRWtCf.js +0 -1
  111. package/apps/ui/dist/client/assets/antigravity._workspaceKey-CliqUr7o.js +0 -1
  112. package/apps/ui/dist/client/assets/antigravity._workspaceKey-CnoBzyX6.js +0 -1
  113. package/apps/ui/dist/client/assets/antigravity.index-CakfZz_E.js +0 -1
  114. package/apps/ui/dist/client/assets/antigravity.index-DY7M1KhG.js +0 -1
  115. package/apps/ui/dist/client/assets/badge-aHE9ETVe.js +0 -1
  116. package/apps/ui/dist/client/assets/checkbox-DN3XnJaA.js +0 -1
  117. package/apps/ui/dist/client/assets/cursor-threads._composerId-BMQyx8qG.js +0 -1
  118. package/apps/ui/dist/client/assets/cursor-threads._composerId-BTlaA-tV.js +0 -1
  119. package/apps/ui/dist/client/assets/cursor._workspaceKey-CrgrfevV.js +0 -1
  120. package/apps/ui/dist/client/assets/cursor._workspaceKey-bYS2syGL.js +0 -1
  121. package/apps/ui/dist/client/assets/cursor.index-CTqZMPYU.js +0 -1
  122. package/apps/ui/dist/client/assets/cursor.index-Clsz4E_e.js +0 -2
  123. package/apps/ui/dist/client/assets/delete-confirm-dialog-DTpzBiNK.js +0 -11
  124. package/apps/ui/dist/client/assets/dist-BNAn99Pu.js +0 -1
  125. package/apps/ui/dist/client/assets/download-P3Rp23Ad.js +0 -1
  126. package/apps/ui/dist/client/assets/dropdown-menu-3qB5j9nt.js +0 -1
  127. package/apps/ui/dist/client/assets/es2015-Dwm_turD.js +0 -41
  128. package/apps/ui/dist/client/assets/export-dialog-CazdrASq.js +0 -1
  129. package/apps/ui/dist/client/assets/formatters-BdnWuM1z.js +0 -1
  130. package/apps/ui/dist/client/assets/index-BVFnfS78.js +0 -22
  131. package/apps/ui/dist/client/assets/json-panel-DLkS30sQ.js +0 -1
  132. package/apps/ui/dist/client/assets/metadata-section-jnIkB7dB.js +0 -1
  133. package/apps/ui/dist/client/assets/metric-card-CBZuWLzQ.js +0 -1
  134. package/apps/ui/dist/client/assets/page-header-CnD21cPn.js +0 -1
  135. package/apps/ui/dist/client/assets/projects._project-BLszwvYL.js +0 -1
  136. package/apps/ui/dist/client/assets/projects._project-DvLxYbvk.js +0 -1
  137. package/apps/ui/dist/client/assets/projects.index-COn8woBR.js +0 -1
  138. package/apps/ui/dist/client/assets/projects.index-DYs98skV.js +0 -3
  139. package/apps/ui/dist/client/assets/refresh-ccw-BDrYXjtD.js +0 -1
  140. package/apps/ui/dist/client/assets/reload-error-panel-DLAg0AW2.js +0 -1
  141. package/apps/ui/dist/client/assets/routes-BtF5-coe.js +0 -1
  142. package/apps/ui/dist/client/assets/scroll-text-CqaFm9by.js +0 -1
  143. package/apps/ui/dist/client/assets/select-DbnpwqL6.js +0 -1
  144. package/apps/ui/dist/client/assets/settings-CGX3VleN.js +0 -1
  145. package/apps/ui/dist/client/assets/styles-Ch0r3kMZ.css +0 -1
  146. package/apps/ui/dist/client/assets/text-document-panel-DPleOmmq.js +0 -1
  147. package/apps/ui/dist/client/assets/text-filter-7M6wRo-t.js +0 -2
  148. package/apps/ui/dist/client/assets/threads._threadId-D5w76IB-.js +0 -7
  149. package/apps/ui/dist/client/assets/threads._threadId-Dx85sI9P.js +0 -1
  150. package/apps/ui/dist/client/assets/useMutation-MZ3Hr9h9.js +0 -1
  151. package/apps/ui/dist/client/assets/useQuery-Cb4V0AT0.js +0 -1
  152. package/apps/ui/dist/server/assets/__23tanstack-start-plugin-adapters-BzCA6dXo.js +0 -5
  153. package/apps/ui/dist/server/assets/_tanstack-start-manifest_v-CBbkUXw6.js +0 -227
  154. package/apps/ui/dist/server/assets/antigravity-conversations._conversationId-B9Rm4EXh.js +0 -212
  155. package/apps/ui/dist/server/assets/cursor-threads._composerId-BsxFKzoJ.js +0 -218
  156. package/apps/ui/dist/server/assets/json-panel-RYsxWFae.js +0 -16
  157. package/apps/ui/dist/server/assets/metadata-section-D6Lbc7D6.js +0 -54
  158. package/apps/ui/dist/server/assets/start-HeKLHD9b.js +0 -4
  159. package/apps/ui/dist/server/assets/text-document-panel-D8JbQWAn.js +0 -23
  160. package/apps/ui/dist/server/assets/threads._threadId-DODTYddm.js +0 -1052
@@ -0,0 +1,639 @@
1
+ import { t as Button } from "./button-CmTDnzOn.js";
2
+ import { n as useSettings } from "./settings-store-DpEJEQ7M.js";
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";
5
+ import { t as Checkbox } from "./checkbox-C0hovF41.js";
6
+ import { t as MetricCard } from "./metric-card-ByEeLu0r.js";
7
+ import { t as PageHeader } from "./page-header-VNSaM3xd.js";
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";
10
+ import { t as Badge } from "./badge-EvdhKK_Z.js";
11
+ import { n as downloadUrlFile, t as downloadTextFile } from "./download-DMmiy1xf.js";
12
+ import { t as DeleteConfirmDialog } from "./delete-confirm-dialog-BcBNCxWB.js";
13
+ import { t as ExportDialog } from "./export-dialog-BItjWgkZ.js";
14
+ import { useState } from "react";
15
+ import { Link, useNavigate } from "@tanstack/react-router";
16
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
17
+ import { useMutation, useQuery, useQueryClient, useSuspenseQuery } from "@tanstack/react-query";
18
+ import { Download, Trash2 } from "lucide-react";
19
+ //#region src/routes/threads.$threadId.tsx?tsr-split=component
20
+ var buildThreadItems = (snapshot) => {
21
+ return [
22
+ {
23
+ label: "Thread ID",
24
+ value: /* @__PURE__ */ jsx("span", {
25
+ "data-mono": "true",
26
+ children: snapshot.thread.id
27
+ })
28
+ },
29
+ {
30
+ label: "Project",
31
+ value: snapshot.project
32
+ },
33
+ {
34
+ label: "CWD",
35
+ value: /* @__PURE__ */ jsx("span", {
36
+ "data-mono": "true",
37
+ children: snapshot.thread.cwd
38
+ })
39
+ },
40
+ {
41
+ label: "Created",
42
+ value: /* @__PURE__ */ jsx("span", {
43
+ suppressHydrationWarning: true,
44
+ children: formatDateTime(snapshot.thread.created_at_ms ?? snapshot.thread.created_at * 1e3)
45
+ })
46
+ },
47
+ {
48
+ label: "Updated",
49
+ value: /* @__PURE__ */ jsx("span", {
50
+ suppressHydrationWarning: true,
51
+ children: formatDateTime(snapshot.thread.updated_at_ms ?? snapshot.thread.updated_at * 1e3)
52
+ })
53
+ },
54
+ {
55
+ label: "Session started",
56
+ value: /* @__PURE__ */ jsx("span", {
57
+ suppressHydrationWarning: true,
58
+ children: formatDateTime(snapshot.transcript?.sessionMeta.timestamp ?? null)
59
+ })
60
+ },
61
+ {
62
+ label: "Rollout size",
63
+ value: formatBytes(snapshot.rollout.fileSizeBytes)
64
+ },
65
+ {
66
+ label: "Archived",
67
+ value: formatBooleanLabel(Boolean(snapshot.thread.archived))
68
+ },
69
+ {
70
+ label: "Archived at",
71
+ value: /* @__PURE__ */ jsx("span", {
72
+ suppressHydrationWarning: true,
73
+ children: formatDateTime(snapshot.thread.archived_at ? snapshot.thread.archived_at * 1e3 : null)
74
+ })
75
+ }
76
+ ];
77
+ };
78
+ var buildRuntimeItems = (snapshot) => {
79
+ return [
80
+ {
81
+ label: "Source",
82
+ value: snapshot.thread.source
83
+ },
84
+ {
85
+ label: "Originator",
86
+ value: snapshot.transcript?.sessionMeta.originator ?? "n/a"
87
+ },
88
+ {
89
+ label: "Model provider",
90
+ value: snapshot.thread.model_provider
91
+ },
92
+ {
93
+ label: "Reasoning effort",
94
+ value: snapshot.thread.reasoning_effort ?? "n/a"
95
+ },
96
+ {
97
+ label: "CLI version",
98
+ value: snapshot.thread.cli_version
99
+ },
100
+ {
101
+ label: "Approval mode",
102
+ value: snapshot.thread.approval_mode
103
+ },
104
+ {
105
+ label: "Memory mode",
106
+ value: snapshot.thread.memory_mode
107
+ },
108
+ {
109
+ label: "Has user event",
110
+ value: formatBooleanLabel(Boolean(snapshot.thread.has_user_event))
111
+ }
112
+ ];
113
+ };
114
+ var buildGitItems = (snapshot) => {
115
+ return [
116
+ {
117
+ label: "Git branch",
118
+ value: snapshot.thread.git_branch ?? "n/a"
119
+ },
120
+ {
121
+ label: "Git SHA",
122
+ value: snapshot.thread.git_sha ?? "n/a"
123
+ },
124
+ {
125
+ label: "Git remote",
126
+ value: snapshot.thread.git_origin_url ?? "n/a"
127
+ },
128
+ {
129
+ label: "Agent nickname",
130
+ value: snapshot.thread.agent_nickname ?? "n/a"
131
+ },
132
+ {
133
+ label: "Agent role",
134
+ value: snapshot.thread.agent_role ?? "n/a"
135
+ },
136
+ {
137
+ label: "Agent path",
138
+ value: snapshot.thread.agent_path ?? "n/a"
139
+ }
140
+ ];
141
+ };
142
+ var buildRelationItems = (snapshot) => {
143
+ const parentThreadValue = snapshot.relations.parentThreadId ? /* @__PURE__ */ jsx(Link, {
144
+ className: "text-[var(--accent)]",
145
+ params: { threadId: snapshot.relations.parentThreadId },
146
+ to: "/threads/$threadId",
147
+ children: snapshot.relations.parentThreadId
148
+ }) : "n/a";
149
+ const childThreadValue = snapshot.relations.childEdges.length > 0 ? /* @__PURE__ */ jsx("div", {
150
+ className: "flex flex-wrap gap-2",
151
+ children: snapshot.relations.childEdges.map((edge) => /* @__PURE__ */ jsx(Link, {
152
+ className: "rounded-full border border-[var(--border)] px-3 py-1 text-[var(--accent)] text-xs",
153
+ params: { threadId: edge.child_thread_id },
154
+ to: "/threads/$threadId",
155
+ children: edge.child_thread_id
156
+ }, edge.child_thread_id))
157
+ }) : "n/a";
158
+ return [
159
+ {
160
+ label: "Parent thread",
161
+ value: parentThreadValue
162
+ },
163
+ {
164
+ label: "Child threads",
165
+ value: childThreadValue
166
+ },
167
+ {
168
+ label: "First user message",
169
+ value: snapshot.thread.first_user_message || "n/a"
170
+ },
171
+ {
172
+ label: "Preview",
173
+ value: snapshot.thread.preview || "n/a"
174
+ }
175
+ ];
176
+ };
177
+ var buildTranscriptStatsItems = (snapshot) => {
178
+ if (!snapshot.transcript) {
179
+ if (snapshot.transcriptState === "missing") return [
180
+ {
181
+ label: "Transcript load",
182
+ value: "Transcript file missing from disk"
183
+ },
184
+ {
185
+ label: "Rollout path",
186
+ value: snapshot.thread.rollout_path
187
+ },
188
+ {
189
+ label: "Preview mode",
190
+ value: "Export and transcript browsing are unavailable until the file exists again."
191
+ }
192
+ ];
193
+ return [
194
+ {
195
+ label: "Transcript load",
196
+ value: "Deferred for oversized rollout"
197
+ },
198
+ {
199
+ label: "Rollout size",
200
+ value: formatBytes(snapshot.rollout.fileSizeBytes)
201
+ },
202
+ {
203
+ label: "Preview mode",
204
+ value: "Load the transcript manually to inspect it."
205
+ }
206
+ ];
207
+ }
208
+ return [
209
+ {
210
+ label: "Event kinds",
211
+ value: formatList([...new Set(snapshot.transcript.events.map((event) => event.kind))])
212
+ },
213
+ {
214
+ label: "Stats scope",
215
+ value: snapshot.transcript.statsArePartial ? "Preview only" : "Full transcript"
216
+ },
217
+ {
218
+ label: "Tool calls",
219
+ value: String(snapshot.transcript.stats.toolCallCount)
220
+ },
221
+ {
222
+ label: "Exec calls",
223
+ value: String(snapshot.transcript.stats.execCommandCount)
224
+ },
225
+ {
226
+ label: "Web search events",
227
+ value: String(snapshot.transcript.stats.webSearchEventCount)
228
+ },
229
+ {
230
+ label: "Assistant messages",
231
+ value: String(snapshot.transcript.stats.assistantMessageCount)
232
+ },
233
+ {
234
+ label: "Commentary updates",
235
+ value: String(snapshot.transcript.stats.commentaryCount)
236
+ }
237
+ ];
238
+ };
239
+ function TranscriptControls({ rawJsonDisabled = false, showCommentary, showExtraEvents, showRawJson, showToolCalls, showUserMessages, onShowCommentaryChange, onShowExtraEventsChange, onShowRawJsonChange, onShowToolCallsChange, onShowUserMessagesChange }) {
240
+ return /* @__PURE__ */ jsxs("div", {
241
+ className: "flex flex-wrap gap-4 rounded-xl border border-[var(--border)] bg-[var(--panel)] px-4 py-3 shadow-[var(--panel-shadow)]",
242
+ children: [
243
+ /* @__PURE__ */ jsxs("div", {
244
+ className: "flex items-center gap-2 text-sm",
245
+ children: [/* @__PURE__ */ jsx(Checkbox, {
246
+ checked: showToolCalls,
247
+ id: "transcript-show-tool-calls",
248
+ onCheckedChange: (checked) => onShowToolCallsChange(checked === true)
249
+ }), /* @__PURE__ */ jsx("label", {
250
+ htmlFor: "transcript-show-tool-calls",
251
+ children: "Show tool calls"
252
+ })]
253
+ }),
254
+ /* @__PURE__ */ jsxs("div", {
255
+ className: "flex items-center gap-2 text-sm",
256
+ children: [/* @__PURE__ */ jsx(Checkbox, {
257
+ checked: showCommentary,
258
+ id: "transcript-show-commentary",
259
+ onCheckedChange: (checked) => onShowCommentaryChange(checked === true)
260
+ }), /* @__PURE__ */ jsx("label", {
261
+ htmlFor: "transcript-show-commentary",
262
+ children: "Show commentary"
263
+ })]
264
+ }),
265
+ /* @__PURE__ */ jsxs("div", {
266
+ className: "flex items-center gap-2 text-sm",
267
+ children: [/* @__PURE__ */ jsx(Checkbox, {
268
+ checked: showExtraEvents,
269
+ id: "transcript-show-extra-events",
270
+ onCheckedChange: (checked) => onShowExtraEventsChange(checked === true)
271
+ }), /* @__PURE__ */ jsx("label", {
272
+ htmlFor: "transcript-show-extra-events",
273
+ children: "Show extra events"
274
+ })]
275
+ }),
276
+ /* @__PURE__ */ jsxs("div", {
277
+ className: "flex items-center gap-2 text-sm",
278
+ children: [/* @__PURE__ */ jsx(Checkbox, {
279
+ checked: showRawJson,
280
+ disabled: rawJsonDisabled,
281
+ id: "transcript-show-raw-json",
282
+ onCheckedChange: (checked) => onShowRawJsonChange(checked === true)
283
+ }), /* @__PURE__ */ jsx("label", {
284
+ htmlFor: "transcript-show-raw-json",
285
+ children: "Raw JSON"
286
+ })]
287
+ }),
288
+ /* @__PURE__ */ jsxs("div", {
289
+ className: "flex items-center gap-2 text-sm",
290
+ children: [/* @__PURE__ */ jsx(Checkbox, {
291
+ checked: showUserMessages,
292
+ id: "transcript-show-user-messages",
293
+ onCheckedChange: (checked) => onShowUserMessagesChange(checked === true)
294
+ }), /* @__PURE__ */ jsx("label", {
295
+ htmlFor: "transcript-show-user-messages",
296
+ children: "User"
297
+ })]
298
+ })
299
+ ]
300
+ });
301
+ }
302
+ function ThreadMetadataPanels({ snapshot }) {
303
+ return /* @__PURE__ */ jsxs("div", {
304
+ className: "grid gap-4 xl:grid-cols-[1.1fr_0.9fr]",
305
+ children: [/* @__PURE__ */ jsxs("div", {
306
+ className: "space-y-4",
307
+ children: [
308
+ /* @__PURE__ */ jsx(MetadataSection, {
309
+ items: buildThreadItems(snapshot),
310
+ title: "Thread"
311
+ }),
312
+ /* @__PURE__ */ jsx(MetadataSection, {
313
+ items: buildRuntimeItems(snapshot),
314
+ title: "Runtime"
315
+ }),
316
+ /* @__PURE__ */ jsx(MetadataSection, {
317
+ items: buildGitItems(snapshot),
318
+ title: "Git and agent"
319
+ })
320
+ ]
321
+ }), /* @__PURE__ */ jsxs("div", {
322
+ className: "space-y-4",
323
+ children: [
324
+ /* @__PURE__ */ jsx(MetadataSection, {
325
+ items: buildRelationItems(snapshot),
326
+ title: "Relations and summary"
327
+ }),
328
+ /* @__PURE__ */ jsxs("section", {
329
+ className: "rounded-[1.6rem] border border-[var(--border)] bg-[var(--panel)] p-5 shadow-[var(--panel-shadow)]",
330
+ children: [/* @__PURE__ */ jsx("h3", {
331
+ className: "font-semibold text-[var(--muted-foreground)] text-sm uppercase tracking-[0.18em]",
332
+ children: "Available tools"
333
+ }), /* @__PURE__ */ jsx("div", {
334
+ className: "mt-4 space-y-3",
335
+ children: snapshot.availableTools.map((tool) => /* @__PURE__ */ jsxs("div", {
336
+ className: "rounded-xl border border-[var(--border)] bg-[var(--panel-secondary)] p-3.5",
337
+ children: [/* @__PURE__ */ jsxs("div", {
338
+ className: "flex flex-wrap items-center gap-2",
339
+ children: [/* @__PURE__ */ jsx("p", {
340
+ className: "font-medium font-mono text-sm",
341
+ children: tool.name
342
+ }), tool.namespace ? /* @__PURE__ */ jsx(Badge, {
343
+ variant: "outline",
344
+ children: tool.namespace
345
+ }) : null]
346
+ }), /* @__PURE__ */ jsx("p", {
347
+ className: "mt-1.5 text-[var(--muted-foreground)] text-sm",
348
+ children: tool.description || "No description."
349
+ })]
350
+ }, `${tool.name}-${tool.namespace ?? "global"}`))
351
+ })]
352
+ }),
353
+ /* @__PURE__ */ jsx(MetadataSection, {
354
+ items: buildTranscriptStatsItems(snapshot),
355
+ title: "Transcript stats"
356
+ })
357
+ ]
358
+ })]
359
+ });
360
+ }
361
+ function ThreadRawPanels({ snapshot }) {
362
+ if (!snapshot.transcript) return /* @__PURE__ */ jsx("div", {
363
+ className: "rounded-xl border border-[var(--border)] bg-[var(--panel)] px-5 py-4 text-sm",
364
+ children: snapshot.transcriptState === "missing" ? "The rollout JSONL file is missing from disk, so raw transcript payloads are unavailable." : "Raw transcript payloads are deferred for oversized rollouts. Use Export if you only need the full thread contents, or load the transcript manually from the Transcript tab."
365
+ });
366
+ return /* @__PURE__ */ jsxs("div", {
367
+ className: "space-y-4",
368
+ children: [
369
+ /* @__PURE__ */ jsx(JsonPanel, {
370
+ title: "Session meta",
371
+ value: snapshot.transcript.sessionMeta
372
+ }),
373
+ /* @__PURE__ */ jsx(JsonPanel, {
374
+ title: "Turn contexts",
375
+ value: snapshot.transcript.turnContexts
376
+ }),
377
+ /* @__PURE__ */ jsx(JsonPanel, {
378
+ title: "Sandbox policy",
379
+ value: snapshot.thread.sandbox_policy
380
+ })
381
+ ]
382
+ });
383
+ }
384
+ function DeferredTranscriptNotice({ fileSizeBytes, missing, pending, onLoad }) {
385
+ return /* @__PURE__ */ jsxs("section", {
386
+ className: "rounded-[1.6rem] border border-[var(--border)] bg-[var(--panel)] p-5 shadow-[var(--panel-shadow)]",
387
+ children: [
388
+ /* @__PURE__ */ jsx("h3", {
389
+ className: "font-semibold text-base",
390
+ children: missing ? "Transcript file missing" : "This is a very big thread"
391
+ }),
392
+ /* @__PURE__ */ jsx("p", {
393
+ className: "mt-2 text-[var(--muted-foreground)] text-sm leading-6",
394
+ children: missing ? "The rollout JSONL referenced by this thread is no longer present on disk. Export may still work if the file is restored, but transcript browsing is unavailable right now." : `Spiracha skipped loading the transcript automatically because the rollout file is ${formatBytes(fileSizeBytes)}. Export still works immediately. If you need to inspect the thread here, load a bounded preview manually.`
395
+ }),
396
+ missing ? null : /* @__PURE__ */ jsx("div", {
397
+ className: "mt-4",
398
+ children: /* @__PURE__ */ jsx(Button, {
399
+ disabled: pending,
400
+ variant: "outline",
401
+ onClick: onLoad,
402
+ children: pending ? "Loading preview..." : "Load transcript preview"
403
+ })
404
+ })
405
+ ]
406
+ });
407
+ }
408
+ function ThreadDetailPage() {
409
+ const navigate = useNavigate();
410
+ const queryClient = useQueryClient();
411
+ const params = Route.useParams();
412
+ const snapshot = useSuspenseQuery(threadSnapshotQueryOptions(params.threadId)).data;
413
+ const { settings } = useSettings();
414
+ const [shouldLoadTranscript, setShouldLoadTranscript] = useState(!snapshot.rollout.shouldDeferTranscriptLoad);
415
+ const [showToolCalls, setShowToolCalls] = useState(false);
416
+ const [showCommentary, setShowCommentary] = useState(false);
417
+ const [showExtraEvents, setShowExtraEvents] = useState(false);
418
+ const [showRawJson, setShowRawJson] = useState(false);
419
+ const [showUserMessages, setShowUserMessages] = useState(true);
420
+ const [exportOpen, setExportOpen] = useState(false);
421
+ const [deleteOpen, setDeleteOpen] = useState(false);
422
+ const transcriptQuery = useQuery({
423
+ ...threadTranscriptQueryOptions(params.threadId),
424
+ enabled: shouldLoadTranscript && snapshot.transcript === null
425
+ });
426
+ const transcript = snapshot.transcript ?? transcriptQuery.data ?? null;
427
+ const viewSnapshot = {
428
+ ...snapshot,
429
+ transcript
430
+ };
431
+ const exportThreadMutation = useMutation({
432
+ mutationFn: async (options) => {
433
+ console.info("[spiracha:export-ui] request", {
434
+ outputFormat: options.outputFormat,
435
+ project: snapshot.project,
436
+ selectedThreadCount: 1,
437
+ selectedThreadIds: [snapshot.thread.id],
438
+ zipArchive: options.zipArchive
439
+ });
440
+ const download = await exportThreadFn({ data: {
441
+ ...options,
442
+ ...settings,
443
+ threadId: snapshot.thread.id
444
+ } });
445
+ console.info("[spiracha:export-ui] response", {
446
+ downloadUrl: download.mode === "download_url" ? download.downloadUrl : null,
447
+ fileName: download.fileName,
448
+ mode: download.mode,
449
+ project: snapshot.project,
450
+ selectedThreadCount: 1
451
+ });
452
+ if (download.mode === "download") {
453
+ downloadTextFile(download.fileName, download.content, download.mimeType);
454
+ return;
455
+ }
456
+ await downloadUrlFile(download.fileName, download.downloadUrl);
457
+ },
458
+ onError: (error) => {
459
+ console.error("[spiracha:export-ui] failed", {
460
+ error: error instanceof Error ? error.message : String(error),
461
+ project: snapshot.project,
462
+ selectedThreadCount: 1,
463
+ selectedThreadIds: [snapshot.thread.id]
464
+ });
465
+ },
466
+ onSuccess: async () => {
467
+ setExportOpen(false);
468
+ }
469
+ });
470
+ const deleteThreadMutation = useMutation({
471
+ mutationFn: (input) => deleteThreadFn({ data: {
472
+ deleteSessionFiles: input.deleteSessionFiles,
473
+ threadId: snapshot.thread.id
474
+ } }),
475
+ onSuccess: async () => {
476
+ await Promise.all([
477
+ queryClient.invalidateQueries({ queryKey: ["analytics"] }),
478
+ queryClient.invalidateQueries({ queryKey: ["dashboard"] }),
479
+ queryClient.invalidateQueries({ queryKey: ["project-threads", snapshot.project] }),
480
+ queryClient.invalidateQueries({ queryKey: ["projects"] })
481
+ ]);
482
+ navigate({
483
+ params: { project: snapshot.project },
484
+ to: "/projects/$project"
485
+ });
486
+ }
487
+ });
488
+ return /* @__PURE__ */ jsxs("div", {
489
+ className: "space-y-5",
490
+ children: [
491
+ /* @__PURE__ */ jsx(PageHeader, {
492
+ actions: /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs(Button, {
493
+ className: "rounded-full",
494
+ variant: "outline",
495
+ onClick: () => setExportOpen(true),
496
+ children: [/* @__PURE__ */ jsx(Download, { className: "mr-2 size-4" }), "Export"]
497
+ }), /* @__PURE__ */ jsxs(Button, {
498
+ className: "rounded-full border-[var(--destructive)]/20 text-[var(--destructive)]",
499
+ variant: "outline",
500
+ onClick: () => setDeleteOpen(true),
501
+ children: [/* @__PURE__ */ jsx(Trash2, { className: "mr-2 size-4" }), "Delete"]
502
+ })] }),
503
+ breadcrumb: /* @__PURE__ */ jsx(Breadcrumbs, { items: [
504
+ {
505
+ label: "Codex",
506
+ to: "/projects"
507
+ },
508
+ {
509
+ label: snapshot.project,
510
+ params: { project: snapshot.project },
511
+ to: "/projects/$project"
512
+ },
513
+ { label: snapshot.thread.title }
514
+ ] }),
515
+ eyebrow: snapshot.project,
516
+ subtitle: snapshot.thread.preview,
517
+ title: snapshot.thread.title
518
+ }),
519
+ /* @__PURE__ */ jsxs("div", {
520
+ className: "grid gap-3 md:grid-cols-2 xl:grid-cols-4",
521
+ children: [
522
+ /* @__PURE__ */ jsx(MetricCard, {
523
+ label: "Model",
524
+ value: snapshot.thread.model ?? "unknown"
525
+ }),
526
+ /* @__PURE__ */ jsx(MetricCard, {
527
+ label: "Tokens",
528
+ value: formatTokens(snapshot.thread.tokens_used)
529
+ }),
530
+ /* @__PURE__ */ jsx(MetricCard, {
531
+ label: "Updated",
532
+ value: /* @__PURE__ */ jsx("span", {
533
+ suppressHydrationWarning: true,
534
+ children: formatDateTime(snapshot.thread.updated_at_ms ?? snapshot.thread.updated_at * 1e3)
535
+ })
536
+ }),
537
+ /* @__PURE__ */ jsx(MetricCard, {
538
+ label: "Thread source",
539
+ value: snapshot.thread.thread_source ?? transcript?.sessionMeta.threadSource ?? "n/a"
540
+ })
541
+ ]
542
+ }),
543
+ /* @__PURE__ */ jsxs(Tabs, {
544
+ className: "space-y-4",
545
+ defaultValue: "transcript",
546
+ children: [
547
+ /* @__PURE__ */ jsxs(TabsList, {
548
+ className: "grid w-fit min-w-[24rem] grid-cols-3 rounded-full border border-[var(--border)] bg-[var(--panel)] p-1",
549
+ children: [
550
+ /* @__PURE__ */ jsx(TabsTrigger, {
551
+ className: "rounded-full px-5 text-sm",
552
+ value: "transcript",
553
+ children: "Transcript"
554
+ }),
555
+ /* @__PURE__ */ jsx(TabsTrigger, {
556
+ className: "rounded-full px-5 text-sm",
557
+ value: "metadata",
558
+ children: "Metadata"
559
+ }),
560
+ /* @__PURE__ */ jsx(TabsTrigger, {
561
+ className: "rounded-full px-5 text-sm",
562
+ value: "raw",
563
+ children: "Raw"
564
+ })
565
+ ]
566
+ }),
567
+ /* @__PURE__ */ jsxs(TabsContent, {
568
+ className: "space-y-3",
569
+ value: "transcript",
570
+ children: [
571
+ /* @__PURE__ */ jsx(TranscriptControls, {
572
+ rawJsonDisabled: !transcript?.rawIncluded,
573
+ showCommentary,
574
+ showExtraEvents,
575
+ showRawJson,
576
+ showToolCalls,
577
+ showUserMessages,
578
+ onShowCommentaryChange: setShowCommentary,
579
+ onShowExtraEventsChange: setShowExtraEvents,
580
+ onShowRawJsonChange: setShowRawJson,
581
+ onShowToolCallsChange: setShowToolCalls,
582
+ onShowUserMessagesChange: setShowUserMessages
583
+ }),
584
+ transcript ? /* @__PURE__ */ jsx(TranscriptView, {
585
+ assistantModel: snapshot.thread.model,
586
+ events: transcript.events,
587
+ projectPath: snapshot.thread.cwd,
588
+ showCommentary,
589
+ showExtraEvents,
590
+ showRawJson: showRawJson && transcript.rawIncluded,
591
+ showToolCalls,
592
+ showUserMessages
593
+ }) : /* @__PURE__ */ jsx(DeferredTranscriptNotice, {
594
+ fileSizeBytes: snapshot.rollout.fileSizeBytes,
595
+ missing: snapshot.transcriptState === "missing",
596
+ pending: transcriptQuery.isFetching,
597
+ onLoad: () => setShouldLoadTranscript(true)
598
+ }),
599
+ transcriptQuery.isError ? /* @__PURE__ */ jsxs("p", {
600
+ className: "text-[var(--destructive)] text-sm",
601
+ children: [
602
+ "Failed to load transcript preview:",
603
+ " ",
604
+ transcriptQuery.error instanceof Error ? transcriptQuery.error.message : "Unknown error"
605
+ ]
606
+ }) : null
607
+ ]
608
+ }),
609
+ /* @__PURE__ */ jsx(TabsContent, {
610
+ value: "metadata",
611
+ children: /* @__PURE__ */ jsx(ThreadMetadataPanels, { snapshot: viewSnapshot })
612
+ }),
613
+ /* @__PURE__ */ jsx(TabsContent, {
614
+ value: "raw",
615
+ children: /* @__PURE__ */ jsx(ThreadRawPanels, { snapshot: viewSnapshot })
616
+ })
617
+ ]
618
+ }),
619
+ /* @__PURE__ */ jsx(DeleteConfirmDialog, {
620
+ confirmLabel: deleteThreadMutation.isPending ? "Deleting..." : "Delete thread",
621
+ defaultDeleteSessionFiles: true,
622
+ description: "Delete this thread from the Codex database. Enable Delete Session files if you also want to remove the rollout JSONL from disk.",
623
+ open: deleteOpen,
624
+ showDeleteSessionFilesOption: true,
625
+ title: "Delete this thread from Codex DB?",
626
+ onConfirm: ({ deleteSessionFiles }) => deleteThreadMutation.mutate({ deleteSessionFiles }),
627
+ onOpenChange: setDeleteOpen
628
+ }),
629
+ /* @__PURE__ */ jsx(ExportDialog, {
630
+ open: exportOpen,
631
+ pending: exportThreadMutation.isPending,
632
+ onExport: (options) => exportThreadMutation.mutate(options),
633
+ onOpenChange: setExportOpen
634
+ })
635
+ ]
636
+ });
637
+ }
638
+ //#endregion
639
+ export { ThreadDetailPage as component };