spiracha 1.1.2 → 1.3.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 +57 -14
  2. package/README.md +122 -65
  3. package/apps/ui/AGENTS.md +18 -8
  4. package/apps/ui/README.md +30 -12
  5. package/apps/ui/dist/client/assets/{analytics-CqWZmyV6.js → analytics-B_hYz65v.js} +1 -1
  6. package/apps/ui/dist/client/assets/antigravity-conversations._conversationId-qiyygB7e.js +1 -0
  7. package/apps/ui/dist/client/assets/antigravity-conversations._conversationId-z1SQC2Kg.js +1 -0
  8. package/apps/ui/dist/client/assets/antigravity-keychain-panel-dYuRWtCf.js +1 -0
  9. package/apps/ui/dist/client/assets/antigravity._workspaceKey-CliqUr7o.js +1 -0
  10. package/apps/ui/dist/client/assets/antigravity._workspaceKey-CnoBzyX6.js +1 -0
  11. package/apps/ui/dist/client/assets/antigravity.index-CakfZz_E.js +1 -0
  12. package/apps/ui/dist/client/assets/antigravity.index-DY7M1KhG.js +1 -0
  13. package/apps/ui/dist/client/assets/badge-aHE9ETVe.js +1 -0
  14. package/apps/ui/dist/client/assets/checkbox-DN3XnJaA.js +1 -0
  15. package/apps/ui/dist/client/assets/cursor-threads._composerId-BMQyx8qG.js +1 -0
  16. package/apps/ui/dist/client/assets/cursor-threads._composerId-BTlaA-tV.js +1 -0
  17. package/apps/ui/dist/client/assets/cursor._workspaceKey-CrgrfevV.js +1 -0
  18. package/apps/ui/dist/client/assets/cursor._workspaceKey-bYS2syGL.js +1 -0
  19. package/apps/ui/dist/client/assets/cursor.index-CTqZMPYU.js +1 -0
  20. package/apps/ui/dist/client/assets/cursor.index-Clsz4E_e.js +2 -0
  21. package/apps/ui/dist/client/assets/{data-table-DnPYMPCD.js → data-table-Cj-v-uyB.js} +2 -2
  22. package/apps/ui/dist/client/assets/delete-confirm-dialog-DTpzBiNK.js +11 -0
  23. package/apps/ui/dist/client/assets/dist-BNAn99Pu.js +1 -0
  24. package/apps/ui/dist/client/assets/download-P3Rp23Ad.js +1 -0
  25. package/apps/ui/dist/client/assets/dropdown-menu-3qB5j9nt.js +1 -0
  26. package/apps/ui/dist/client/assets/es2015-Dwm_turD.js +41 -0
  27. package/apps/ui/dist/client/assets/export-dialog-CazdrASq.js +1 -0
  28. package/apps/ui/dist/client/assets/formatters-BdnWuM1z.js +1 -0
  29. package/apps/ui/dist/client/assets/index-BVFnfS78.js +22 -0
  30. package/apps/ui/dist/client/assets/json-panel-DLkS30sQ.js +1 -0
  31. package/apps/ui/dist/client/assets/metadata-section-jnIkB7dB.js +1 -0
  32. package/apps/ui/dist/client/assets/{metric-card-9jwBF7rG.js → metric-card-CBZuWLzQ.js} +1 -1
  33. package/apps/ui/dist/client/assets/page-header-CnD21cPn.js +1 -0
  34. package/apps/ui/dist/client/assets/projects._project-BLszwvYL.js +1 -0
  35. package/apps/ui/dist/client/assets/projects._project-DvLxYbvk.js +1 -0
  36. package/apps/ui/dist/client/assets/projects.index-COn8woBR.js +1 -0
  37. package/apps/ui/dist/client/assets/projects.index-DYs98skV.js +3 -0
  38. package/apps/ui/dist/client/assets/refresh-ccw-BDrYXjtD.js +1 -0
  39. package/apps/ui/dist/client/assets/reload-error-panel-DLAg0AW2.js +1 -0
  40. package/apps/ui/dist/client/assets/routes-BtF5-coe.js +1 -0
  41. package/apps/ui/dist/client/assets/scroll-text-CqaFm9by.js +1 -0
  42. package/apps/ui/dist/client/assets/select-DbnpwqL6.js +1 -0
  43. package/apps/ui/dist/client/assets/settings-CGX3VleN.js +1 -0
  44. package/apps/ui/dist/client/assets/styles-Ch0r3kMZ.css +1 -0
  45. package/apps/ui/dist/client/assets/text-document-panel-DPleOmmq.js +1 -0
  46. package/apps/ui/dist/client/assets/text-filter-7M6wRo-t.js +2 -0
  47. package/apps/ui/dist/client/assets/threads._threadId-D5w76IB-.js +7 -0
  48. package/apps/ui/dist/client/assets/{threads._threadId-DT75NiBa.js → threads._threadId-Dx85sI9P.js} +1 -1
  49. package/apps/ui/dist/client/assets/useMutation-MZ3Hr9h9.js +1 -0
  50. package/apps/ui/dist/client/assets/useQuery-Cb4V0AT0.js +1 -0
  51. package/apps/ui/dist/client/icon.svg +28 -0
  52. package/apps/ui/dist/client/manifest.json +6 -16
  53. package/apps/ui/dist/server/assets/_tanstack-start-manifest_v-CBbkUXw6.js +227 -0
  54. package/apps/ui/dist/server/assets/{analytics-BMxW_bZL.js → analytics-CBNOYZwJ.js} +2 -2
  55. package/apps/ui/dist/server/assets/antigravity-conversation-state-HgzS302O.js +16 -0
  56. package/apps/ui/dist/server/assets/antigravity-conversations._conversationId-B9Rm4EXh.js +212 -0
  57. package/apps/ui/dist/server/assets/antigravity-conversations._conversationId-BIdYNy68.js +20 -0
  58. package/apps/ui/dist/server/assets/antigravity-conversations._conversationId-D426O-64.js +11 -0
  59. package/apps/ui/dist/server/assets/antigravity-db-D9gW1D8G.js +576 -0
  60. package/apps/ui/dist/server/assets/antigravity-keychain-DOiuHDwK.js +126 -0
  61. package/apps/ui/dist/server/assets/antigravity-keychain-panel-DcLyBBwd.js +55 -0
  62. package/apps/ui/dist/server/assets/antigravity-queries-CgQhlQ7J.js +37 -0
  63. package/apps/ui/dist/server/assets/antigravity-server-DFUx4Khk.js +114 -0
  64. package/apps/ui/dist/server/assets/antigravity._workspaceKey-3m_MzNFA.js +11 -0
  65. package/apps/ui/dist/server/assets/antigravity._workspaceKey-D42ixtzp.js +210 -0
  66. package/apps/ui/dist/server/assets/antigravity._workspaceKey-DnSlSC-C.js +28 -0
  67. package/apps/ui/dist/server/assets/antigravity.index-DZVT-cac.js +104 -0
  68. package/apps/ui/dist/server/assets/antigravity.index-DudTB3Tq.js +11 -0
  69. package/apps/ui/dist/server/assets/badge-EvdhKK_Z.js +26 -0
  70. package/apps/ui/dist/server/assets/{codex-queries-CAF6HYiG.js → codex-queries-eOJGfHQj.js} +6 -18
  71. package/apps/ui/dist/server/assets/{codex-server-C01sv0JJ.js → codex-server-nrETIF--.js} +166 -226
  72. package/apps/ui/dist/server/assets/createServerRpc-BtXIw2iP.js +12 -0
  73. package/apps/ui/dist/server/assets/createSsrRpc-COf5Zuye.js +16 -0
  74. package/apps/ui/dist/server/assets/cursor-db-B7agkAvM.js +643 -0
  75. package/apps/ui/dist/server/assets/cursor-exporter-types-CI3goo-c.js +34 -0
  76. package/apps/ui/dist/server/assets/cursor-queries-BMhuJeUO.js +65 -0
  77. package/apps/ui/dist/server/assets/cursor-recovery-9bJLs7vG.js +361 -0
  78. package/apps/ui/dist/server/assets/cursor-server-BgylIFgn.js +184 -0
  79. package/apps/ui/dist/server/assets/cursor-threads._composerId-BB0Y_Mao.js +11 -0
  80. package/apps/ui/dist/server/assets/cursor-threads._composerId-BsxFKzoJ.js +218 -0
  81. package/apps/ui/dist/server/assets/cursor-threads._composerId-DXffY_CK.js +18 -0
  82. package/apps/ui/dist/server/assets/cursor-transcript-2iL3KFSK.js +125 -0
  83. package/apps/ui/dist/server/assets/cursor._workspaceKey-BP2J1x_x.js +28 -0
  84. package/apps/ui/dist/server/assets/cursor._workspaceKey-BQd0e-Pd.js +399 -0
  85. package/apps/ui/dist/server/assets/cursor._workspaceKey-nmg3YIOQ.js +11 -0
  86. package/apps/ui/dist/server/assets/cursor.index-CQVxtCm8.js +189 -0
  87. package/apps/ui/dist/server/assets/cursor.index-CcsX7DG0.js +11 -0
  88. package/apps/ui/dist/server/assets/{delete-confirm-dialog-CWqcTXTF.js → delete-confirm-dialog-PCD7S0_M.js} +5 -4
  89. package/apps/ui/dist/server/assets/download-DMmiy1xf.js +92 -0
  90. package/apps/ui/dist/server/assets/{input-B4tEzctc.js → dropdown-menu-Dy_9t6TN.js} +1 -11
  91. package/apps/ui/dist/server/assets/{download-C5rkk_Bo.js → export-dialog-DaPlOGFT.js} +8 -99
  92. package/apps/ui/dist/server/assets/json-panel-RYsxWFae.js +16 -0
  93. package/apps/ui/dist/server/assets/{loading-panel-DbLdvjtR.js → loading-panel-BGFnWseS.js} +1 -1
  94. package/apps/ui/dist/server/assets/metadata-section-D6Lbc7D6.js +54 -0
  95. package/apps/ui/dist/server/assets/page-header-VNSaM3xd.js +29 -0
  96. package/apps/ui/dist/server/assets/projects._project-Bshqk7JA.js +12 -0
  97. package/apps/ui/dist/server/assets/{projects._project-CJ7l0ynC.js → projects._project-DUN3iWfg.js} +4 -4
  98. package/apps/ui/dist/server/assets/{projects._project-CcJLp_A8.js → projects._project-Dim9Y0kD.js} +54 -26
  99. package/apps/ui/dist/server/assets/projects.index-BLXOx5eL.js +12 -0
  100. package/apps/ui/dist/server/assets/{projects.index-srtogpuF.js → projects.index-DjSQK5dm.js} +23 -27
  101. package/apps/ui/dist/server/assets/{projects.index-CaplpeMy.js → reload-error-panel-BJMxY3U1.js} +5 -6
  102. package/apps/ui/dist/server/assets/{router-C_w-haH6.js → router-DrDgc-LD.js} +131 -44
  103. package/apps/ui/dist/server/assets/{routes-CPe-ppmC.js → routes-B-GlEe2C.js} +54 -39
  104. package/apps/ui/dist/server/assets/{routes-BhbxvJE7.js → routes-CNHAUMwo.js} +2 -2
  105. package/apps/ui/dist/server/assets/{settings-MvWDgc1u.js → settings-OayxIYQQ.js} +1 -1
  106. package/apps/ui/dist/server/assets/shared-CPRNYIql.js +134 -0
  107. package/apps/ui/dist/server/assets/text-document-panel-D8JbQWAn.js +23 -0
  108. package/apps/ui/dist/server/assets/text-filter-CGKxMCKt.js +36 -0
  109. package/apps/ui/dist/server/assets/{threads._threadId-Ba7vv6-K.js → threads._threadId-CJzm4KrZ.js} +3 -3
  110. package/apps/ui/dist/server/assets/{threads._threadId-euyNckhj.js → threads._threadId-DODTYddm.js} +69 -76
  111. package/apps/ui/dist/server/server.js +83 -36
  112. package/bin/codex-chats-claude.js +5 -0
  113. package/bin/codex-chats.js +5 -0
  114. package/bin/spiracha.js +5 -0
  115. package/package.json +26 -13
  116. package/src/export-cursor.ts +244 -0
  117. package/src/lib/antigravity-db.ts +936 -0
  118. package/src/lib/antigravity-exporter-types.ts +70 -0
  119. package/src/lib/antigravity-keychain.ts +203 -0
  120. package/src/lib/codex-browser-db.ts +7 -1
  121. package/src/lib/codex-browser-export.ts +2 -2
  122. package/src/lib/codex-browser-types.ts +22 -1
  123. package/src/lib/codex-exporter-cli.ts +9 -9
  124. package/src/lib/codex-exporter-transcript.ts +16 -190
  125. package/src/lib/codex-exporter-types.ts +1 -1
  126. package/src/lib/codex-exporter.ts +0 -1
  127. package/src/lib/codex-thread-recovery.ts +202 -0
  128. package/src/lib/cursor-db.ts +1096 -0
  129. package/src/lib/cursor-exporter-types.ts +190 -0
  130. package/src/lib/cursor-exporter.ts +266 -0
  131. package/src/lib/cursor-recovery.ts +543 -0
  132. package/src/lib/cursor-transcript.ts +183 -0
  133. package/src/lib/interactive-cli.ts +2 -2
  134. package/src/mcp-server.ts +2 -2
  135. package/src/spiracha.ts +16 -3
  136. package/src/ui-cli.ts +2 -2
  137. package/apps/ui/dist/client/assets/checkbox-DXM4lkJq.js +0 -1
  138. package/apps/ui/dist/client/assets/delete-confirm-dialog-CcZaRX33.js +0 -11
  139. package/apps/ui/dist/client/assets/download-DOwxk-cG.js +0 -1
  140. package/apps/ui/dist/client/assets/es2015-Bm0kEzx2.js +0 -41
  141. package/apps/ui/dist/client/assets/formatters-C12LmYaa.js +0 -1
  142. package/apps/ui/dist/client/assets/index-DdJ7ahIt.js +0 -22
  143. package/apps/ui/dist/client/assets/input-CEsI7EpI.js +0 -1
  144. package/apps/ui/dist/client/assets/page-header-Dr_h1CVv.js +0 -1
  145. package/apps/ui/dist/client/assets/projects._project-uyNGnpjH.js +0 -1
  146. package/apps/ui/dist/client/assets/projects._project-zoM8d2nH.js +0 -1
  147. package/apps/ui/dist/client/assets/projects.index-D1CWVN-O.js +0 -1
  148. package/apps/ui/dist/client/assets/projects.index-DukMuny6.js +0 -1
  149. package/apps/ui/dist/client/assets/routes-Gr2Wwh83.js +0 -1
  150. package/apps/ui/dist/client/assets/select-CFim44gT.js +0 -1
  151. package/apps/ui/dist/client/assets/settings-DqhyDxo2.js +0 -1
  152. package/apps/ui/dist/client/assets/styles-CMrP9Jb4.css +0 -1
  153. package/apps/ui/dist/client/assets/threads._threadId-Df5VXIuZ.js +0 -7
  154. package/apps/ui/dist/client/favicon.ico +0 -0
  155. package/apps/ui/dist/client/logo192.png +0 -0
  156. package/apps/ui/dist/client/logo512.png +0 -0
  157. package/apps/ui/dist/server/assets/_tanstack-start-manifest_v-C0V305Nt.js +0 -99
  158. package/apps/ui/dist/server/assets/page-header-CxdZM86z.js +0 -25
  159. package/apps/ui/dist/server/assets/projects._project-CLSohrBp.js +0 -26
@@ -1,10 +1,10 @@
1
- import { a as threadSnapshotQueryOptions } from "./codex-queries-CAF6HYiG.js";
2
- import { t as LoadingPanel } from "./loading-panel-DbLdvjtR.js";
1
+ import { a as threadSnapshotQueryOptions } from "./codex-queries-eOJGfHQj.js";
2
+ import { t as LoadingPanel } from "./loading-panel-BGFnWseS.js";
3
3
  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-euyNckhj.js");
7
+ var $$splitComponentImporter = () => import("./threads._threadId-DODTYddm.js");
8
8
  var Route = createFileRoute("/threads/$threadId")({
9
9
  component: lazyRouteComponent($$splitComponentImporter, "component"),
10
10
  errorComponent: lazyRouteComponent($$splitErrorComponentImporter, "errorComponent"),
@@ -1,81 +1,27 @@
1
- import { t as applyPathTransforms$1 } from "./path-transforms-DL2IwtYd.js";
2
1
  import { t as cn } from "./utils-C_uf36nf.js";
3
2
  import { t as Button } from "./button-CmTDnzOn.js";
4
3
  import { n as useSettings } from "./settings-store-DpEJEQ7M.js";
5
- import { a as threadSnapshotQueryOptions, c as deleteThreadFn, o as threadTranscriptQueryOptions, u as exportThreadFn } from "./codex-queries-CAF6HYiG.js";
6
- import { t as Route } from "./threads._threadId-Ba7vv6-K.js";
4
+ import { a as threadSnapshotQueryOptions, c as deleteThreadFn, o as threadTranscriptQueryOptions, u as exportThreadFn } from "./codex-queries-eOJGfHQj.js";
5
+ import { t as Route } from "./threads._threadId-CJzm4KrZ.js";
6
+ import { t as applyPathTransforms$1 } from "./path-transforms-DL2IwtYd.js";
7
7
  import { t as Checkbox$1 } from "./checkbox-C0hovF41.js";
8
8
  import { t as MetricCard } from "./metric-card-ByEeLu0r.js";
9
- import { t as PageHeader } from "./page-header-CxdZM86z.js";
9
+ import { t as PageHeader } from "./page-header-VNSaM3xd.js";
10
10
  import { a as formatModelLabel, i as formatList, n as formatBytes, r as formatDateTime, s as formatTokens, t as formatBooleanLabel } from "./formatters-FJaGZgJk.js";
11
- import { t as DeleteConfirmDialog } from "./delete-confirm-dialog-CWqcTXTF.js";
12
- import { n as downloadUrlFile, r as ExportDialog, t as downloadTextFile } from "./download-C5rkk_Bo.js";
11
+ import { n as Breadcrumbs, t as MetadataSection } from "./metadata-section-D6Lbc7D6.js";
12
+ import { n as downloadUrlFile, t as downloadTextFile } from "./download-DMmiy1xf.js";
13
+ import { t as Badge } from "./badge-EvdhKK_Z.js";
14
+ import { t as DeleteConfirmDialog } from "./delete-confirm-dialog-PCD7S0_M.js";
15
+ import { t as ExportDialog } from "./export-dialog-DaPlOGFT.js";
16
+ import { t as JsonPanel } from "./json-panel-RYsxWFae.js";
13
17
  import { useEffect, useRef, useState } from "react";
14
18
  import { Link, useNavigate } from "@tanstack/react-router";
15
19
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
16
20
  import { useMutation, useQuery, useQueryClient, useSuspenseQuery } from "@tanstack/react-query";
17
21
  import { Check, Copy, Download, Trash2 } from "lucide-react";
18
22
  import { cva } from "class-variance-authority";
19
- import { Slot, Tabs } from "radix-ui";
23
+ import { Tabs } from "radix-ui";
20
24
  import { useVirtualizer } from "@tanstack/react-virtual";
21
- //#region src/components/json-panel.tsx
22
- function JsonPanel({ title, value }) {
23
- return /* @__PURE__ */ jsxs("section", {
24
- className: "rounded-[1.6rem] border border-[var(--border)] bg-[var(--panel)] p-5 shadow-[var(--panel-shadow)]",
25
- children: [/* @__PURE__ */ jsx("h3", {
26
- className: "font-semibold text-[var(--muted-foreground)] text-sm uppercase tracking-[0.18em]",
27
- children: title
28
- }), /* @__PURE__ */ jsx("pre", {
29
- className: "mt-4 overflow-x-auto rounded-2xl border border-[var(--border)] bg-[var(--code-background)] p-4 text-[var(--code-foreground)] text-xs leading-5",
30
- children: JSON.stringify(value, null, 2)
31
- })]
32
- });
33
- }
34
- //#endregion
35
- //#region src/components/metadata-section.tsx
36
- function MetadataSection({ items, title }) {
37
- return /* @__PURE__ */ jsxs("section", {
38
- className: "rounded-[1.6rem] border border-[var(--border)] bg-[var(--panel)] p-5 shadow-[var(--panel-shadow)]",
39
- children: [/* @__PURE__ */ jsx("h3", {
40
- className: "font-semibold text-[var(--muted-foreground)] text-sm uppercase tracking-[0.18em]",
41
- children: title
42
- }), /* @__PURE__ */ jsx("dl", {
43
- className: "mt-4 space-y-3",
44
- children: items.map((item) => /* @__PURE__ */ jsxs("div", {
45
- className: "grid gap-1 sm:grid-cols-[11rem_1fr] sm:items-start",
46
- children: [/* @__PURE__ */ jsx("dt", {
47
- className: "font-medium text-[var(--muted-foreground)] text-xs uppercase tracking-[0.14em]",
48
- children: item.label
49
- }), /* @__PURE__ */ jsx("dd", {
50
- className: "min-w-0 text-sm leading-6",
51
- children: item.value
52
- })]
53
- }, item.label))
54
- })]
55
- });
56
- }
57
- //#endregion
58
- //#region src/components/ui/badge.tsx
59
- var badgeVariants = cva("inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-full border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3", {
60
- defaultVariants: { variant: "default" },
61
- variants: { variant: {
62
- default: "bg-primary text-primary-foreground [a&]:hover:bg-primary/90",
63
- destructive: "bg-destructive text-white focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40 [a&]:hover:bg-destructive/90",
64
- ghost: "[a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
65
- link: "text-primary underline-offset-4 [a&]:hover:underline",
66
- outline: "border-border text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
67
- secondary: "bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90"
68
- } }
69
- });
70
- function Badge({ className, variant = "default", asChild = false, ...props }) {
71
- return /* @__PURE__ */ jsx(asChild ? Slot.Root : "span", {
72
- "data-slot": "badge",
73
- "data-variant": variant,
74
- className: cn(badgeVariants({ variant }), className),
75
- ...props
76
- });
77
- }
78
- //#endregion
79
25
  //#region src/lib/path-utils.ts
80
26
  var applyPathTransforms = (text, settings, projectPath) => {
81
27
  return applyPathTransforms$1(text, {
@@ -86,9 +32,12 @@ var applyPathTransforms = (text, settings, projectPath) => {
86
32
  //#endregion
87
33
  //#region src/components/transcript-view.tsx
88
34
  var isCommentaryMessage = (event) => event.kind === "message" && event.role === "assistant" && event.phase === "commentary";
89
- var shouldShowEvent = (event, showToolCalls, showExtraEvents, showCommentary) => {
35
+ var shouldShowEvent = (event, showToolCalls, showExtraEvents, showCommentary, showUserMessages) => {
90
36
  if (isCommentaryMessage(event) && !showCommentary) return false;
91
- if (event.kind === "message") return !event.isHiddenByDefault || showExtraEvents;
37
+ if (event.kind === "message") {
38
+ if (event.role === "user" && !showUserMessages) return false;
39
+ return !event.isHiddenByDefault || showExtraEvents;
40
+ }
92
41
  if (event.kind === "tool_call" || event.kind === "tool_output") return showToolCalls;
93
42
  return showExtraEvents;
94
43
  };
@@ -261,9 +210,9 @@ function TranscriptEventCard({ assistantModel, copied, event, isSelected, showRa
261
210
  ]
262
211
  });
263
212
  }
264
- function TranscriptView({ assistantModel, events, projectPath, showCommentary, showExtraEvents, showRawJson, showToolCalls }) {
213
+ function TranscriptView({ assistantModel, events, projectPath, showCommentary, showExtraEvents, showRawJson, showToolCalls, showUserMessages = true }) {
265
214
  const { settings } = useSettings();
266
- const visibleEvents = events.filter((event) => shouldShowEvent(event, showToolCalls, showExtraEvents, showCommentary));
215
+ const visibleEvents = events.filter((event) => shouldShowEvent(event, showToolCalls, showExtraEvents, showCommentary, showUserMessages));
267
216
  const [copiedEventKeys, setCopiedEventKeys] = useState([]);
268
217
  const [copiedSelection, setCopiedSelection] = useState(false);
269
218
  const [copyErrorMessage, setCopyErrorMessage] = useState(null);
@@ -701,7 +650,7 @@ var buildTranscriptStatsItems = (snapshot) => {
701
650
  }
702
651
  ];
703
652
  };
704
- function TranscriptControls({ rawJsonDisabled = false, showCommentary, showExtraEvents, showRawJson, showToolCalls, onShowCommentaryChange, onShowExtraEventsChange, onShowRawJsonChange, onShowToolCallsChange }) {
653
+ function TranscriptControls({ rawJsonDisabled = false, showCommentary, showExtraEvents, showRawJson, showToolCalls, showUserMessages, onShowCommentaryChange, onShowExtraEventsChange, onShowRawJsonChange, onShowToolCallsChange, onShowUserMessagesChange }) {
705
654
  return /* @__PURE__ */ jsxs("div", {
706
655
  className: "flex flex-wrap gap-4 rounded-xl border border-[var(--border)] bg-[var(--panel)] px-4 py-3 shadow-[var(--panel-shadow)]",
707
656
  children: [
@@ -709,30 +658,57 @@ function TranscriptControls({ rawJsonDisabled = false, showCommentary, showExtra
709
658
  className: "flex items-center gap-2 text-sm",
710
659
  children: [/* @__PURE__ */ jsx(Checkbox$1, {
711
660
  checked: showToolCalls,
661
+ id: "transcript-show-tool-calls",
712
662
  onCheckedChange: (checked) => onShowToolCallsChange(checked === true)
713
- }), /* @__PURE__ */ jsx("span", { children: "Show tool calls" })]
663
+ }), /* @__PURE__ */ jsx("label", {
664
+ htmlFor: "transcript-show-tool-calls",
665
+ children: "Show tool calls"
666
+ })]
714
667
  }),
715
668
  /* @__PURE__ */ jsxs("div", {
716
669
  className: "flex items-center gap-2 text-sm",
717
670
  children: [/* @__PURE__ */ jsx(Checkbox$1, {
718
671
  checked: showCommentary,
672
+ id: "transcript-show-commentary",
719
673
  onCheckedChange: (checked) => onShowCommentaryChange(checked === true)
720
- }), /* @__PURE__ */ jsx("span", { children: "Show commentary" })]
674
+ }), /* @__PURE__ */ jsx("label", {
675
+ htmlFor: "transcript-show-commentary",
676
+ children: "Show commentary"
677
+ })]
721
678
  }),
722
679
  /* @__PURE__ */ jsxs("div", {
723
680
  className: "flex items-center gap-2 text-sm",
724
681
  children: [/* @__PURE__ */ jsx(Checkbox$1, {
725
682
  checked: showExtraEvents,
683
+ id: "transcript-show-extra-events",
726
684
  onCheckedChange: (checked) => onShowExtraEventsChange(checked === true)
727
- }), /* @__PURE__ */ jsx("span", { children: "Show extra events" })]
685
+ }), /* @__PURE__ */ jsx("label", {
686
+ htmlFor: "transcript-show-extra-events",
687
+ children: "Show extra events"
688
+ })]
728
689
  }),
729
690
  /* @__PURE__ */ jsxs("div", {
730
691
  className: "flex items-center gap-2 text-sm",
731
692
  children: [/* @__PURE__ */ jsx(Checkbox$1, {
732
693
  checked: showRawJson,
733
694
  disabled: rawJsonDisabled,
695
+ id: "transcript-show-raw-json",
734
696
  onCheckedChange: (checked) => onShowRawJsonChange(checked === true)
735
- }), /* @__PURE__ */ jsx("span", { children: "Raw JSON" })]
697
+ }), /* @__PURE__ */ jsx("label", {
698
+ htmlFor: "transcript-show-raw-json",
699
+ children: "Raw JSON"
700
+ })]
701
+ }),
702
+ /* @__PURE__ */ jsxs("div", {
703
+ className: "flex items-center gap-2 text-sm",
704
+ children: [/* @__PURE__ */ jsx(Checkbox$1, {
705
+ checked: showUserMessages,
706
+ id: "transcript-show-user-messages",
707
+ onCheckedChange: (checked) => onShowUserMessagesChange(checked === true)
708
+ }), /* @__PURE__ */ jsx("label", {
709
+ htmlFor: "transcript-show-user-messages",
710
+ children: "User"
711
+ })]
736
712
  })
737
713
  ]
738
714
  });
@@ -854,6 +830,7 @@ function ThreadDetailPage() {
854
830
  const [showCommentary, setShowCommentary] = useState(false);
855
831
  const [showExtraEvents, setShowExtraEvents] = useState(false);
856
832
  const [showRawJson, setShowRawJson] = useState(false);
833
+ const [showUserMessages, setShowUserMessages] = useState(true);
857
834
  const [exportOpen, setExportOpen] = useState(false);
858
835
  const [deleteOpen, setDeleteOpen] = useState(false);
859
836
  const transcriptQuery = useQuery({
@@ -936,6 +913,18 @@ function ThreadDetailPage() {
936
913
  onClick: () => setDeleteOpen(true),
937
914
  children: [/* @__PURE__ */ jsx(Trash2, { className: "mr-2 size-4" }), "Delete"]
938
915
  })] }),
916
+ breadcrumb: /* @__PURE__ */ jsx(Breadcrumbs, { items: [
917
+ {
918
+ label: "Codex",
919
+ to: "/projects"
920
+ },
921
+ {
922
+ label: snapshot.project,
923
+ params: { project: snapshot.project },
924
+ to: "/projects/$project"
925
+ },
926
+ { label: snapshot.thread.title }
927
+ ] }),
939
928
  eyebrow: snapshot.project,
940
929
  subtitle: snapshot.thread.preview,
941
930
  title: snapshot.thread.title
@@ -998,10 +987,12 @@ function ThreadDetailPage() {
998
987
  showExtraEvents,
999
988
  showRawJson,
1000
989
  showToolCalls,
990
+ showUserMessages,
1001
991
  onShowCommentaryChange: setShowCommentary,
1002
992
  onShowExtraEventsChange: setShowExtraEvents,
1003
993
  onShowRawJsonChange: setShowRawJson,
1004
- onShowToolCallsChange: setShowToolCalls
994
+ onShowToolCallsChange: setShowToolCalls,
995
+ onShowUserMessagesChange: setShowUserMessages
1005
996
  }),
1006
997
  transcript ? /* @__PURE__ */ jsx(TranscriptView, {
1007
998
  assistantModel: snapshot.thread.model,
@@ -1010,7 +1001,8 @@ function ThreadDetailPage() {
1010
1001
  showCommentary,
1011
1002
  showExtraEvents,
1012
1003
  showRawJson: showRawJson && transcript.rawIncluded,
1013
- showToolCalls
1004
+ showToolCalls,
1005
+ showUserMessages
1014
1006
  }) : /* @__PURE__ */ jsx(DeferredTranscriptNotice, {
1015
1007
  fileSizeBytes: snapshot.rollout.fileSizeBytes,
1016
1008
  missing: snapshot.transcriptState === "missing",
@@ -1039,6 +1031,7 @@ function ThreadDetailPage() {
1039
1031
  }),
1040
1032
  /* @__PURE__ */ jsx(DeleteConfirmDialog, {
1041
1033
  confirmLabel: deleteThreadMutation.isPending ? "Deleting..." : "Delete thread",
1034
+ defaultDeleteSessionFiles: true,
1042
1035
  description: "Delete this thread from the Codex database. Enable Delete Session files if you also want to remove the rollout JSONL from disk.",
1043
1036
  open: deleteOpen,
1044
1037
  showDeleteSessionFilesOption: true,
@@ -23,7 +23,7 @@ var NullProtoObj = /* @__PURE__ */ (() => {
23
23
  return e.prototype = Object.create(null), Object.freeze(e.prototype), e;
24
24
  })();
25
25
  //#endregion
26
- //#region ../../node_modules/.bun/srvx@0.11.15/node_modules/srvx/dist/_chunks/_url.mjs
26
+ //#region ../../node_modules/.bun/srvx@0.11.16/node_modules/srvx/dist/_chunks/_url.mjs
27
27
  function lazyInherit(target, source, sourceKey) {
28
28
  for (const key of [...Object.getOwnPropertyNames(source), ...Object.getOwnPropertySymbols(source)]) {
29
29
  if (key === "constructor") continue;
@@ -52,20 +52,6 @@ function lazyInherit(target, source, sourceKey) {
52
52
  }
53
53
  }
54
54
  var _needsNormRE = /(?:(?:^|\/)(?:\.|\.\.|%2e|%2e\.|\.%2e|%2e%2e)(?:\/|$))|[\\^\x80-\uffff]/i;
55
- /**
56
- * URL wrapper with fast paths to access to the following props:
57
- *
58
- * - `url.pathname`
59
- * - `url.search`
60
- * - `url.searchParams`
61
- * - `url.protocol`
62
- *
63
- * **NOTES:**
64
- *
65
- * - It is assumed that the input URL is **already encoded** and formatted from an HTTP request and contains no hash.
66
- * - Triggering the setters or getters on other props will deoptimize to full URL parsing.
67
- * - Changes to `searchParams` will be discarded as we don't track them.
68
- */
69
55
  var FastURL = /* @__PURE__ */ (() => {
70
56
  const NativeURL = globalThis.URL;
71
57
  const FastURL = class URL {
@@ -113,10 +99,11 @@ var FastURL = /* @__PURE__ */ (() => {
113
99
  const url = this.href;
114
100
  const protoIndex = url.indexOf("://");
115
101
  const pathnameIndex = protoIndex === -1 ? -1 : url.indexOf("/", protoIndex + 4);
102
+ const qIndex = pathnameIndex === -1 ? -1 : url.indexOf("?", pathnameIndex);
116
103
  this.#pos = [
117
104
  protoIndex,
118
105
  pathnameIndex,
119
- pathnameIndex === -1 ? -1 : url.indexOf("?", pathnameIndex)
106
+ qIndex
120
107
  ];
121
108
  }
122
109
  return this.#pos;
@@ -150,7 +137,8 @@ var FastURL = /* @__PURE__ */ (() => {
150
137
  if (this.#protocol === void 0) {
151
138
  const [protocolIndex] = this.#getPos();
152
139
  if (protocolIndex === -1) return this._url.protocol;
153
- this.#protocol = this.href.slice(0, protocolIndex + 1);
140
+ const url = this.href;
141
+ this.#protocol = url.slice(0, protocolIndex + 1);
154
142
  }
155
143
  return this.#protocol;
156
144
  }
@@ -167,12 +155,7 @@ var FastURL = /* @__PURE__ */ (() => {
167
155
  return FastURL;
168
156
  })();
169
157
  //#endregion
170
- //#region ../../node_modules/.bun/srvx@0.11.15/node_modules/srvx/dist/adapters/node.mjs
171
- /**
172
- * Fast Response for Node.js runtime
173
- *
174
- * It is faster because in most cases it doesn't create a full Response instance.
175
- */
158
+ //#region ../../node_modules/.bun/srvx@0.11.16/node_modules/srvx/dist/adapters/node.mjs
176
159
  var NodeResponse = /* @__PURE__ */ (() => {
177
160
  const NativeResponse = globalThis.Response;
178
161
  const STATUS_CODES = globalThis.process?.getBuiltinModule?.("node:http")?.STATUS_CODES || {};
@@ -3471,7 +3454,7 @@ var defaultSerovalPlugins = [
3471
3454
  * the dev styles URL for route-scoped CSS collection.
3472
3455
  */
3473
3456
  async function getStartManifest(matchedRoutes) {
3474
- const { tsrStartManifest } = await import("./assets/_tanstack-start-manifest_v-C0V305Nt.js");
3457
+ const { tsrStartManifest } = await import("./assets/_tanstack-start-manifest_v-CBbkUXw6.js");
3475
3458
  const startManifest = tsrStartManifest();
3476
3459
  let routes = startManifest.routes;
3477
3460
  routes[rootRouteId];
@@ -3496,49 +3479,113 @@ async function getStartManifest(matchedRoutes) {
3496
3479
  //#endregion
3497
3480
  //#region \0%23tanstack-start-server-fn-resolver
3498
3481
  var manifest = {
3482
+ "03050b86e5481024283bee890347a9da7b2493493044dcde6df989b3334d6b73": {
3483
+ functionName: "exportCursorThreadFn_createServerFn_handler",
3484
+ importer: () => import("./assets/cursor-server-BgylIFgn.js")
3485
+ },
3499
3486
  "0814663c3bdc58135f97d210d145ef0be5ca54ef9a5f1e3030be9b1bfc901e30": {
3500
3487
  functionName: "exportThreadFn_createServerFn_handler",
3501
- importer: () => import("./assets/codex-server-C01sv0JJ.js")
3488
+ importer: () => import("./assets/codex-server-nrETIF--.js")
3489
+ },
3490
+ "0c4c2059bb3a8a71939f93494402a63168932a544e55a462e42679647762f936": {
3491
+ functionName: "exportAntigravityArtifactsFn_createServerFn_handler",
3492
+ importer: () => import("./assets/antigravity-server-DFUx4Khk.js")
3502
3493
  },
3503
3494
  "164ee82cdd565ed96591a64312f0f7bd961040baf066a89d9f5636330d11360b": {
3504
3495
  functionName: "deleteProjectFn_createServerFn_handler",
3505
- importer: () => import("./assets/codex-server-C01sv0JJ.js")
3496
+ importer: () => import("./assets/codex-server-nrETIF--.js")
3497
+ },
3498
+ "17afb84da4a3d5022132756ead0adaf0323660f50fc58d7f14830b01fdd59a13": {
3499
+ functionName: "deleteCursorThreadsFn_createServerFn_handler",
3500
+ importer: () => import("./assets/cursor-server-BgylIFgn.js")
3501
+ },
3502
+ "229f5293a4eb8237ac97fc2c9a19c31740139aaed41a44d336d77f75584dbd90": {
3503
+ functionName: "getAntigravityConversationDetailFn_createServerFn_handler",
3504
+ importer: () => import("./assets/antigravity-server-DFUx4Khk.js")
3505
+ },
3506
+ "23fb197bac88fb9e4950ef7608cd311d67c0867e424136c8373071dc54746806": {
3507
+ functionName: "listCursorThreadsFn_createServerFn_handler",
3508
+ importer: () => import("./assets/cursor-server-BgylIFgn.js")
3506
3509
  },
3507
3510
  "29727b7ad5b8fe42e83817376653e064d9fe8888799f056b2e59296b3396568b": {
3508
3511
  functionName: "deleteThreadFn_createServerFn_handler",
3509
- importer: () => import("./assets/codex-server-C01sv0JJ.js")
3512
+ importer: () => import("./assets/codex-server-nrETIF--.js")
3513
+ },
3514
+ "37acb5a1f0915c7b996d6cf9682243d5a3446fe26a60f12bfacf60ce772b0f49": {
3515
+ functionName: "getAntigravityDecryptionStateFn_createServerFn_handler",
3516
+ importer: () => import("./assets/antigravity-server-DFUx4Khk.js")
3517
+ },
3518
+ "412c05e00aef3ad43905593fdfd2f566561259da7e1f5d6f1c03428ff33c6867": {
3519
+ functionName: "recoverProjectThreadsFn_createServerFn_handler",
3520
+ importer: () => import("./assets/codex-server-nrETIF--.js")
3510
3521
  },
3511
3522
  "4712520da0f07bbd1f0907e5a162fe518516ff4caca3fd23876cc65539d87d7a": {
3512
3523
  functionName: "getAnalyticsFn_createServerFn_handler",
3513
- importer: () => import("./assets/codex-server-C01sv0JJ.js")
3524
+ importer: () => import("./assets/codex-server-nrETIF--.js")
3525
+ },
3526
+ "50ab3a39f9880771d0d9b15931e46bcf0c4915077e38a7b6bf8605fde065256e": {
3527
+ functionName: "listAntigravityWorkspacesFn_createServerFn_handler",
3528
+ importer: () => import("./assets/antigravity-server-DFUx4Khk.js")
3514
3529
  },
3515
3530
  "59fb2cb4d60c8e7d47e0afcc914ee6f9d9f4bf076c8e66eab1693066753655b3": {
3516
3531
  functionName: "listProjectThreadsFn_createServerFn_handler",
3517
- importer: () => import("./assets/codex-server-C01sv0JJ.js")
3532
+ importer: () => import("./assets/codex-server-nrETIF--.js")
3518
3533
  },
3519
3534
  "5da27045f7e28ded6353bc16aace284af7ef1b4010ef04d0186a6feadb466497": {
3520
3535
  functionName: "getThreadTranscriptFn_createServerFn_handler",
3521
- importer: () => import("./assets/codex-server-C01sv0JJ.js")
3536
+ importer: () => import("./assets/codex-server-nrETIF--.js")
3537
+ },
3538
+ "6a3fe93f3095ec985bb39f45eacb221bd1b77a5d53cbb96fda99caa0fcce7e4e": {
3539
+ functionName: "listAntigravityConversationsFn_createServerFn_handler",
3540
+ importer: () => import("./assets/antigravity-server-DFUx4Khk.js")
3541
+ },
3542
+ "6e893e740c05aad65a8eb32901b4c39277ebf718f0ba14b04d8df989bed2f32b": {
3543
+ functionName: "getCursorThreadDetailFn_createServerFn_handler",
3544
+ importer: () => import("./assets/cursor-server-BgylIFgn.js")
3522
3545
  },
3523
3546
  "72991e2b6e0adbf8d63bb8b139dad88a00b77b7030ec28ceac36c3cce7846b4c": {
3524
3547
  functionName: "getThreadSnapshotFn_createServerFn_handler",
3525
- importer: () => import("./assets/codex-server-C01sv0JJ.js")
3548
+ importer: () => import("./assets/codex-server-nrETIF--.js")
3526
3549
  },
3527
3550
  "792690638a3b10035a5b7368c3d98bdc70cbfe1e36a4aa5f45b1c49b8b1025b0": {
3528
3551
  functionName: "getDashboardSummaryFn_createServerFn_handler",
3529
- importer: () => import("./assets/codex-server-C01sv0JJ.js")
3552
+ importer: () => import("./assets/codex-server-nrETIF--.js")
3553
+ },
3554
+ "8fcf452a4587a4d4dc0c2f6439255e98123f23d863ca0e861403ae2a687272f2": {
3555
+ functionName: "listCursorWorkspacesFn_createServerFn_handler",
3556
+ importer: () => import("./assets/cursor-server-BgylIFgn.js")
3530
3557
  },
3531
3558
  "96aa60bf7dd9b5bde415bcf3ad6f6955a975eecd9aa0516cf401cc39bebebe6c": {
3532
3559
  functionName: "deleteThreadsFn_createServerFn_handler",
3533
- importer: () => import("./assets/codex-server-C01sv0JJ.js")
3560
+ importer: () => import("./assets/codex-server-nrETIF--.js")
3561
+ },
3562
+ "a6261a774fd8e76a6be777fcbb951977db16f33922519ed880097cea035e9034": {
3563
+ functionName: "exportAntigravityConversationFn_createServerFn_handler",
3564
+ importer: () => import("./assets/antigravity-server-DFUx4Khk.js")
3565
+ },
3566
+ "a9bd5d510f2d1173d2ef610dda4d59a795af17e7c2a4affaba7e1f99822b2c40": {
3567
+ functionName: "recoverCursorWorkspaceFn_createServerFn_handler",
3568
+ importer: () => import("./assets/cursor-server-BgylIFgn.js")
3534
3569
  },
3535
3570
  "b4e15c006e9a277470958bb008f89b5b0acc7256109581de44cf17d587d174a5": {
3536
3571
  functionName: "exportThreadsFn_createServerFn_handler",
3537
- importer: () => import("./assets/codex-server-C01sv0JJ.js")
3572
+ importer: () => import("./assets/codex-server-nrETIF--.js")
3538
3573
  },
3539
3574
  "ccefccb816ba13508f23db4e31067b3403e750225257592d3ae11071ffc3fd6f": {
3540
3575
  functionName: "listProjectsFn_createServerFn_handler",
3541
- importer: () => import("./assets/codex-server-C01sv0JJ.js")
3576
+ importer: () => import("./assets/codex-server-nrETIF--.js")
3577
+ },
3578
+ "e266948869e9a4ae03c84b8a7db1bfa945fdb440c5e1c64ae826b1302e441885": {
3579
+ functionName: "unlockAntigravityDecryptionFn_createServerFn_handler",
3580
+ importer: () => import("./assets/antigravity-server-DFUx4Khk.js")
3581
+ },
3582
+ "e9609d5ab12ea0bc4dbd3289fad95417dd01a0a719c8ee588c0b8c8a9dc80c99": {
3583
+ functionName: "exportCursorThreadsFn_createServerFn_handler",
3584
+ importer: () => import("./assets/cursor-server-BgylIFgn.js")
3585
+ },
3586
+ "fc72eb7835fc18130f6d7c20e15e560320521cd01c93e08667b340bfe6b90930": {
3587
+ functionName: "deleteCursorWorkspaceFn_createServerFn_handler",
3588
+ importer: () => import("./assets/cursor-server-BgylIFgn.js")
3542
3589
  }
3543
3590
  };
3544
3591
  async function getServerFnById(id, access) {
@@ -5328,7 +5375,7 @@ var getBaseManifest = getProdBaseManifest;
5328
5375
  var createEarlyHintsForRequest = createEarlyHintsCollector;
5329
5376
  async function loadEntries() {
5330
5377
  const [routerEntry, startEntry, pluginAdapters] = await Promise.all([
5331
- import("./assets/router-C_w-haH6.js"),
5378
+ import("./assets/router-DrDgc-LD.js"),
5332
5379
  import("./assets/start-HeKLHD9b.js"),
5333
5380
  import("./assets/__23tanstack-start-plugin-adapters-BzCA6dXo.js")
5334
5381
  ]);
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env bun
2
+
3
+ import { runExportClaudeCli } from '../src/export-claude.ts';
4
+
5
+ await runExportClaudeCli();
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env bun
2
+
3
+ import { runExportChatsCli } from '../src/export-chats.ts';
4
+
5
+ await runExportChatsCli();
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env bun
2
+
3
+ import { runSpirachaCli } from '../src/spiracha.ts';
4
+
5
+ await runSpirachaCli();
package/package.json CHANGED
@@ -4,32 +4,32 @@
4
4
  "url": "https://github.com/ragaeeb"
5
5
  },
6
6
  "bin": {
7
- "codex-chats": "./src/export-chats.ts",
8
- "codex-chats-claude": "./src/export-claude.ts",
9
- "spiracha": "./src/spiracha.ts"
7
+ "codex-chats": "./bin/codex-chats.js",
8
+ "codex-chats-claude": "./bin/codex-chats-claude.js",
9
+ "spiracha": "./bin/spiracha.js"
10
10
  },
11
11
  "bugs": {
12
12
  "url": "https://github.com/ragaeeb/spiracha/issues"
13
13
  },
14
14
  "dependencies": {
15
- "@inquirer/prompts": "^8.4.3",
15
+ "@inquirer/prompts": "^8.5.2",
16
16
  "@modelcontextprotocol/sdk": "^1.29.0",
17
17
  "@tanstack/react-query": "5.100.14",
18
- "@tanstack/react-router": "1.170.8",
19
- "@tanstack/react-router-ssr-query": "1.167.0",
18
+ "@tanstack/react-router": "1.170.10",
19
+ "@tanstack/react-router-ssr-query": "1.167.1",
20
20
  "@tanstack/react-table": "8.21.3",
21
- "@tanstack/react-virtual": "3.13.25",
21
+ "@tanstack/react-virtual": "3.13.26",
22
22
  "class-variance-authority": "0.7.1",
23
23
  "clsx": "2.1.1",
24
24
  "iconv-lite": "^0.7.2",
25
- "lucide-react": "1.16.0",
25
+ "lucide-react": "1.17.0",
26
26
  "radix-ui": "1.4.3",
27
27
  "react": "19.2.6",
28
28
  "react-dom": "19.2.6",
29
29
  "tailwind-merge": "3.6.0",
30
30
  "zod": "^4.4.3"
31
31
  },
32
- "description": "Export local Codex chats and Claude Code transcripts to Markdown or plain text.",
32
+ "description": "Export local Codex, Claude Code, and Cursor transcripts, and browse Codex, Cursor, and Antigravity history through a local UI.",
33
33
  "devDependencies": {
34
34
  "@types/bun": "^1.3.14",
35
35
  "@types/node": "^25.9.1",
@@ -39,12 +39,24 @@
39
39
  "bun": ">=1.3.13"
40
40
  },
41
41
  "files": [
42
+ "bin/codex-chats.js",
43
+ "bin/codex-chats-claude.js",
44
+ "bin/spiracha.js",
42
45
  "src/export-chats.ts",
43
46
  "src/export-claude.ts",
47
+ "src/export-cursor.ts",
44
48
  "src/mcp-server.ts",
45
49
  "src/spiracha.ts",
46
50
  "src/ui-cli.ts",
51
+ "src/lib/antigravity-db.ts",
52
+ "src/lib/antigravity-exporter-types.ts",
53
+ "src/lib/antigravity-keychain.ts",
47
54
  "src/lib/claude-exporter.ts",
55
+ "src/lib/cursor-db.ts",
56
+ "src/lib/cursor-exporter.ts",
57
+ "src/lib/cursor-exporter-types.ts",
58
+ "src/lib/cursor-recovery.ts",
59
+ "src/lib/cursor-transcript.ts",
48
60
  "src/lib/codex-exporter-cli.ts",
49
61
  "src/lib/codex-exporter-db.ts",
50
62
  "src/lib/codex-exporter-transcript.ts",
@@ -53,6 +65,7 @@
53
65
  "src/lib/codex-browser-db.ts",
54
66
  "src/lib/codex-browser-export.ts",
55
67
  "src/lib/codex-browser-types.ts",
68
+ "src/lib/codex-thread-recovery.ts",
56
69
  "src/lib/codex-thread-cache.ts",
57
70
  "src/lib/codex-thread-parser.ts",
58
71
  "src/lib/codex-analytics.ts",
@@ -66,9 +79,7 @@
66
79
  "src/lib/native-open.ts",
67
80
  "src/lib/shared.ts",
68
81
  "apps/ui/dist/client/assets/**/*",
69
- "apps/ui/dist/client/favicon.ico",
70
- "apps/ui/dist/client/logo192.png",
71
- "apps/ui/dist/client/logo512.png",
82
+ "apps/ui/dist/client/icon.svg",
72
83
  "apps/ui/dist/client/manifest.json",
73
84
  "apps/ui/dist/client/robots.txt",
74
85
  "apps/ui/dist/server/**/*",
@@ -79,6 +90,8 @@
79
90
  "keywords": [
80
91
  "codex",
81
92
  "claude",
93
+ "cursor",
94
+ "antigravity",
82
95
  "transcripts",
83
96
  "export",
84
97
  "markdown",
@@ -109,7 +122,7 @@
109
122
  "ui:preview": "bun run --cwd apps/ui preview"
110
123
  },
111
124
  "type": "module",
112
- "version": "1.1.2",
125
+ "version": "1.3.0",
113
126
  "workspaces": [
114
127
  "apps/*"
115
128
  ]