spiracha 1.5.0 → 2.1.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.
- package/AGENTS.md +114 -205
- package/README.md +94 -269
- package/apps/ui/AGENTS.md +17 -7
- package/apps/ui/README.md +52 -8
- package/apps/ui/components.json +21 -0
- package/apps/ui/package.json +65 -0
- package/apps/ui/src/components/antigravity-conversations-table.tsx +245 -0
- package/apps/ui/src/components/antigravity-keychain-panel.tsx +76 -0
- package/apps/ui/src/components/antigravity-workspaces-table.tsx +63 -0
- package/apps/ui/src/components/app-shell.tsx +125 -0
- package/apps/ui/src/components/breadcrumbs.tsx +71 -0
- package/apps/ui/src/components/claude-code-sessions-table.tsx +150 -0
- package/apps/ui/src/components/claude-code-workspaces-table.tsx +57 -0
- package/apps/ui/src/components/cursor-threads-table.tsx +152 -0
- package/apps/ui/src/components/cursor-workspaces-table.tsx +140 -0
- package/apps/ui/src/components/data-table.tsx +243 -0
- package/apps/ui/src/components/delete-confirm-dialog.tsx +88 -0
- package/apps/ui/src/components/export-dialog.tsx +174 -0
- package/apps/ui/src/components/grok-sessions-table.tsx +146 -0
- package/apps/ui/src/components/grok-workspaces-table.tsx +53 -0
- package/apps/ui/src/components/json-panel.tsx +17 -0
- package/apps/ui/src/components/kiro-sessions-table.tsx +148 -0
- package/apps/ui/src/components/kiro-workspaces-table.tsx +53 -0
- package/apps/ui/src/components/list-search-input.tsx +18 -0
- package/apps/ui/src/components/loading-panel.tsx +23 -0
- package/apps/ui/src/components/metadata-section.tsx +31 -0
- package/apps/ui/src/components/metric-card.tsx +19 -0
- package/apps/ui/src/components/opencode-sessions-table.tsx +164 -0
- package/apps/ui/src/components/opencode-workspaces-table.tsx +57 -0
- package/apps/ui/src/components/page-header.tsx +39 -0
- package/apps/ui/src/components/projects-loading-state.tsx +74 -0
- package/apps/ui/src/components/projects-table.tsx +108 -0
- package/apps/ui/src/components/qoder-sessions-table.tsx +133 -0
- package/apps/ui/src/components/qoder-workspaces-table.tsx +57 -0
- package/apps/ui/src/components/recent-threads-list.tsx +52 -0
- package/apps/ui/src/components/reload-error-panel.tsx +20 -0
- package/apps/ui/src/components/selection-actions-toolbar.tsx +80 -0
- package/apps/ui/src/components/text-document-panel.tsx +19 -0
- package/apps/ui/src/components/theme-toggle.tsx +48 -0
- package/apps/ui/src/components/threads-table.tsx +165 -0
- package/apps/ui/src/components/transcript-view.tsx +648 -0
- package/apps/ui/src/components/ui/alert-dialog.tsx +160 -0
- package/apps/ui/src/components/ui/badge.tsx +45 -0
- package/apps/ui/src/components/ui/button.tsx +62 -0
- package/apps/ui/src/components/ui/checkbox.tsx +29 -0
- package/apps/ui/src/components/ui/dialog.tsx +137 -0
- package/apps/ui/src/components/ui/dropdown-menu.tsx +217 -0
- package/apps/ui/src/components/ui/input.tsx +21 -0
- package/apps/ui/src/components/ui/scroll-area.tsx +46 -0
- package/apps/ui/src/components/ui/select.tsx +163 -0
- package/apps/ui/src/components/ui/separator.tsx +28 -0
- package/apps/ui/src/components/ui/sheet.tsx +107 -0
- package/apps/ui/src/components/ui/skeleton.tsx +7 -0
- package/apps/ui/src/components/ui/table.tsx +76 -0
- package/apps/ui/src/components/ui/tabs.tsx +71 -0
- package/apps/ui/src/components/ui/tooltip.tsx +44 -0
- package/apps/ui/src/integrations/tanstack-query/devtools.tsx +6 -0
- package/apps/ui/src/integrations/tanstack-query/root-provider.tsx +10 -0
- package/apps/ui/src/lib/antigravity-conversation-state.ts +41 -0
- package/apps/ui/src/lib/antigravity-queries.ts +33 -0
- package/apps/ui/src/lib/antigravity-server.ts +273 -0
- package/apps/ui/src/lib/antigravity-transcript-events.ts +343 -0
- package/apps/ui/src/lib/claude-code-queries.ts +34 -0
- package/apps/ui/src/lib/claude-code-server.ts +243 -0
- package/apps/ui/src/lib/claude-code-transcript-events.ts +161 -0
- package/apps/ui/src/lib/codex-queries.ts +82 -0
- package/apps/ui/src/lib/codex-server.ts +291 -0
- package/apps/ui/src/lib/cursor-queries.ts +37 -0
- package/apps/ui/src/lib/cursor-server.ts +315 -0
- package/apps/ui/src/lib/cursor-transcript-events.ts +229 -0
- package/apps/ui/src/lib/download.ts +166 -0
- package/apps/ui/src/lib/formatters.ts +147 -0
- package/apps/ui/src/lib/grok-queries.ts +22 -0
- package/apps/ui/src/lib/grok-server.ts +169 -0
- package/apps/ui/src/lib/grok-transcript-events.ts +149 -0
- package/apps/ui/src/lib/kiro-queries.ts +22 -0
- package/apps/ui/src/lib/kiro-server.ts +151 -0
- package/apps/ui/src/lib/kiro-transcript-events.ts +113 -0
- package/apps/ui/src/lib/opencode-queries.ts +37 -0
- package/apps/ui/src/lib/opencode-server.ts +151 -0
- package/apps/ui/src/lib/opencode-transcript-events.ts +221 -0
- package/apps/ui/src/lib/package-metadata.ts +16 -0
- package/apps/ui/src/lib/path-utils.ts +13 -0
- package/apps/ui/src/lib/qoder-queries.ts +22 -0
- package/apps/ui/src/lib/qoder-server.ts +135 -0
- package/apps/ui/src/lib/qoder-transcript-events.ts +139 -0
- package/apps/ui/src/lib/route-search.ts +182 -0
- package/apps/ui/src/lib/settings-store.tsx +59 -0
- package/apps/ui/src/lib/source-session-export-server.ts +139 -0
- package/apps/ui/src/lib/text-filter.ts +22 -0
- package/apps/ui/src/lib/thread-id.ts +3 -0
- package/apps/ui/src/lib/thread-transcript-load.ts +15 -0
- package/apps/ui/src/lib/thread-transcript-stats.ts +57 -0
- package/apps/ui/src/lib/utils.ts +7 -0
- package/apps/ui/src/lib/workspace-delete-navigation.ts +12 -0
- package/apps/ui/src/routeTree.gen.ts +837 -0
- package/apps/ui/src/router.tsx +20 -0
- package/apps/ui/src/routes/$threadId.tsx +22 -0
- package/apps/ui/src/routes/__root.tsx +127 -0
- package/apps/ui/src/routes/analytics.tsx +143 -0
- package/apps/ui/src/routes/antigravity-conversations.$conversationId.tsx +504 -0
- package/apps/ui/src/routes/antigravity.$workspaceKey.tsx +365 -0
- package/apps/ui/src/routes/antigravity.index.tsx +51 -0
- package/apps/ui/src/routes/api.v1.conversation-query.ts +12 -0
- package/apps/ui/src/routes/api.v1.conversations.$source.$id.export.ts +12 -0
- package/apps/ui/src/routes/api.v1.conversations.$source.$id.ts +16 -0
- package/apps/ui/src/routes/api.v1.conversations.delete.ts +12 -0
- package/apps/ui/src/routes/api.v1.conversations.export.ts +12 -0
- package/apps/ui/src/routes/api.v1.conversations.ts +12 -0
- package/apps/ui/src/routes/api.v1.resolve.ts +12 -0
- package/apps/ui/src/routes/api.v1.sources.ts +12 -0
- package/apps/ui/src/routes/claude-code-sessions.$sessionId.tsx +468 -0
- package/apps/ui/src/routes/claude-code.$workspaceKey.tsx +274 -0
- package/apps/ui/src/routes/claude-code.index.tsx +48 -0
- package/apps/ui/src/routes/codex.$project.tsx +390 -0
- package/apps/ui/src/routes/codex.index.tsx +116 -0
- package/apps/ui/src/routes/cursor-threads.$composerId.tsx +435 -0
- package/apps/ui/src/routes/cursor.$workspaceKey.tsx +426 -0
- package/apps/ui/src/routes/cursor.index.tsx +120 -0
- package/apps/ui/src/routes/grok-sessions.$sessionId.tsx +388 -0
- package/apps/ui/src/routes/grok.$workspaceKey.tsx +301 -0
- package/apps/ui/src/routes/grok.index.tsx +48 -0
- package/apps/ui/src/routes/index.tsx +124 -0
- package/apps/ui/src/routes/kiro-sessions.$sessionId.tsx +396 -0
- package/apps/ui/src/routes/kiro.$workspaceKey.tsx +303 -0
- package/apps/ui/src/routes/kiro.index.tsx +48 -0
- package/apps/ui/src/routes/opencode-sessions.$sessionId.tsx +420 -0
- package/apps/ui/src/routes/opencode.$workspaceKey.tsx +327 -0
- package/apps/ui/src/routes/opencode.index.tsx +61 -0
- package/apps/ui/src/routes/qoder-sessions.$sessionId.tsx +344 -0
- package/apps/ui/src/routes/qoder.$workspaceKey.tsx +186 -0
- package/apps/ui/src/routes/qoder.index.tsx +48 -0
- package/apps/ui/src/routes/settings.tsx +91 -0
- package/apps/ui/src/routes/threads.$threadId.tsx +1103 -0
- package/apps/ui/src/styles.css +122 -0
- package/apps/ui/tsconfig.json +29 -0
- package/apps/ui/vite.config.ts +84 -0
- package/bin/spiracha.ts +32 -0
- package/package.json +54 -80
- package/src/client.ts +423 -0
- package/src/lib/antigravity-db.ts +414 -44
- package/src/lib/antigravity-exporter-types.ts +4 -0
- package/src/lib/antigravity-projects.ts +201 -0
- package/src/lib/claude-code-db.ts +498 -32
- package/src/lib/claude-code-exporter-types.ts +5 -0
- package/src/lib/claude-code-transcript-phase.ts +60 -1
- package/src/lib/claude-code-transcript.ts +8 -5
- package/src/lib/codex-analytics.ts +1 -1
- package/src/lib/codex-browser-db.ts +410 -74
- package/src/lib/codex-browser-export.ts +29 -41
- package/src/lib/codex-browser-types.ts +1 -1
- package/src/lib/codex-thread-cache.ts +41 -13
- package/src/lib/codex-thread-parser.ts +86 -35
- package/src/lib/{codex-exporter-types.ts → codex-thread-types.ts} +2 -30
- package/src/lib/codex-transcript-filter.ts +31 -0
- package/src/lib/{codex-exporter-transcript.ts → codex-transcript-renderer.ts} +104 -48
- package/src/lib/concurrency.ts +41 -0
- package/src/lib/conversation-api.ts +1172 -0
- package/src/lib/conversation-data/adapter-helpers.ts +110 -0
- package/src/lib/conversation-data/antigravity-adapter.ts +167 -0
- package/src/lib/conversation-data/claude-code-adapter.ts +206 -0
- package/src/lib/conversation-data/codex-adapter.ts +269 -0
- package/src/lib/conversation-data/cursor-adapter.ts +205 -0
- package/src/lib/conversation-data/grok-adapter.ts +210 -0
- package/src/lib/conversation-data/index.ts +386 -0
- package/src/lib/conversation-data/kiro-adapter.ts +174 -0
- package/src/lib/conversation-data/message-selector.ts +37 -0
- package/src/lib/conversation-data/opencode-adapter.ts +202 -0
- package/src/lib/conversation-data/path-match.ts +79 -0
- package/src/lib/conversation-data/qoder-adapter.ts +255 -0
- package/src/lib/conversation-data/types.ts +159 -0
- package/src/lib/conversation-zip-export.ts +57 -0
- package/src/lib/cursor-db.ts +100 -25
- package/src/lib/cursor-exporter-types.ts +0 -19
- package/src/lib/grok-db.ts +1026 -0
- package/src/lib/grok-exporter-types.ts +110 -0
- package/src/lib/grok-transcript-phase.ts +52 -0
- package/src/lib/grok-transcript.ts +154 -0
- package/src/lib/kiro-db.ts +52 -1
- package/src/lib/model-label.ts +11 -3
- package/src/lib/opencode-db.ts +598 -55
- package/src/lib/opencode-transcript.ts +8 -5
- package/src/lib/qoder-acp-client.ts +268 -0
- package/src/lib/qoder-db.ts +1601 -0
- package/src/lib/qoder-exporter-types.ts +114 -0
- package/src/lib/qoder-transcript-phase.ts +41 -0
- package/src/lib/qoder-transcript.ts +112 -0
- package/src/lib/shared.ts +12 -0
- package/src/lib/transcript-load-limiter.ts +82 -0
- package/src/lib/ui-cache.ts +43 -17
- package/src/lib/ui-export-archive.ts +60 -0
- package/apps/ui/dist/client/assets/_threadId-CAIeH5mq.js +0 -1
- package/apps/ui/dist/client/assets/analytics-DOy1b6Sh.js +0 -1
- package/apps/ui/dist/client/assets/antigravity-conversations._conversationId-DqySVO2K.js +0 -7
- package/apps/ui/dist/client/assets/antigravity-conversations._conversationId-KAcXtNxI.js +0 -1
- package/apps/ui/dist/client/assets/antigravity-keychain-panel-B77qJz6f.js +0 -1
- package/apps/ui/dist/client/assets/antigravity._workspaceKey-B3NM6gRH.js +0 -1
- package/apps/ui/dist/client/assets/antigravity._workspaceKey-ByitGWki.js +0 -1
- package/apps/ui/dist/client/assets/antigravity.index-DP9JC2P9.js +0 -1
- package/apps/ui/dist/client/assets/antigravity.index-DgW25FEV.js +0 -1
- package/apps/ui/dist/client/assets/badge-C3i4OKs8.js +0 -1
- package/apps/ui/dist/client/assets/checkbox-CdHitXWQ.js +0 -1
- package/apps/ui/dist/client/assets/claude-code-sessions._sessionId-8pQ55ci2.js +0 -1
- package/apps/ui/dist/client/assets/claude-code-sessions._sessionId-DVz5UmtU.js +0 -1
- package/apps/ui/dist/client/assets/claude-code._workspaceKey-BBKskSum.js +0 -1
- package/apps/ui/dist/client/assets/claude-code._workspaceKey-OkikMUFs.js +0 -1
- package/apps/ui/dist/client/assets/claude-code.index-Cwu76dbb.js +0 -1
- package/apps/ui/dist/client/assets/claude-code.index-D6eMd08t.js +0 -1
- package/apps/ui/dist/client/assets/createServerFn-B-KkwmHU.js +0 -3
- package/apps/ui/dist/client/assets/cursor-threads._composerId-CmBFclK8.js +0 -1
- package/apps/ui/dist/client/assets/cursor-threads._composerId-hBWlP1D-.js +0 -1
- package/apps/ui/dist/client/assets/cursor._workspaceKey-BFPkIRi-.js +0 -1
- package/apps/ui/dist/client/assets/cursor._workspaceKey-CaAZjGmm.js +0 -1
- package/apps/ui/dist/client/assets/cursor.index-8y4o20kb.js +0 -2
- package/apps/ui/dist/client/assets/cursor.index-CrnMwDCi.js +0 -1
- package/apps/ui/dist/client/assets/data-table-Br78_dk3.js +0 -4
- package/apps/ui/dist/client/assets/delete-confirm-dialog-Bxs07u-j.js +0 -7
- package/apps/ui/dist/client/assets/dist-B9pyYCVU.js +0 -1
- package/apps/ui/dist/client/assets/dist-BrJhN2A0.js +0 -5
- package/apps/ui/dist/client/assets/dist-Cmd3AIfD.js +0 -1
- package/apps/ui/dist/client/assets/dist-DvMS2965.js +0 -1
- package/apps/ui/dist/client/assets/download-Bf0QJKD3.js +0 -1
- package/apps/ui/dist/client/assets/dropdown-menu-D5cvPaZt.js +0 -1
- package/apps/ui/dist/client/assets/es2015-ad6040dw.js +0 -41
- package/apps/ui/dist/client/assets/export-dialog-Dr8d2MqD.js +0 -1
- package/apps/ui/dist/client/assets/formatters-BtqyrX_c.js +0 -1
- package/apps/ui/dist/client/assets/index-C-STgIH4.js +0 -166
- package/apps/ui/dist/client/assets/jsx-runtime-DGeXAQPT.js +0 -1
- package/apps/ui/dist/client/assets/kiro-sessions._sessionId-CKgfJ7GR.js +0 -1
- package/apps/ui/dist/client/assets/kiro-sessions._sessionId-zvIJHtQF.js +0 -1
- package/apps/ui/dist/client/assets/kiro._workspaceKey-DhVuJuZB.js +0 -1
- package/apps/ui/dist/client/assets/kiro._workspaceKey-QArsjkTY.js +0 -1
- package/apps/ui/dist/client/assets/kiro.index-C-fr4m7i.js +0 -1
- package/apps/ui/dist/client/assets/kiro.index-OYgAdtZd.js +0 -1
- package/apps/ui/dist/client/assets/metric-card-Dplm0ZiM.js +0 -1
- package/apps/ui/dist/client/assets/opencode-sessions._sessionId-DLjiTst-.js +0 -1
- package/apps/ui/dist/client/assets/opencode-sessions._sessionId-biBwrRbt.js +0 -8
- package/apps/ui/dist/client/assets/opencode._workspaceKey-C7OIzMOJ.js +0 -1
- package/apps/ui/dist/client/assets/opencode._workspaceKey-sBakX0oI.js +0 -1
- package/apps/ui/dist/client/assets/opencode.index-Bl_kNs9N.js +0 -1
- package/apps/ui/dist/client/assets/opencode.index-CN53bVmb.js +0 -1
- package/apps/ui/dist/client/assets/page-header-Cwa3p6Tl.js +0 -1
- package/apps/ui/dist/client/assets/preload-helper-B8fFrdxC.js +0 -1
- package/apps/ui/dist/client/assets/projects._project-D8WloxQN.js +0 -1
- package/apps/ui/dist/client/assets/projects._project-DSDwH4NF.js +0 -1
- package/apps/ui/dist/client/assets/projects.index-5xRtuJdX.js +0 -3
- package/apps/ui/dist/client/assets/projects.index-DEfhWqa8.js +0 -1
- package/apps/ui/dist/client/assets/react-dom-DL96Jor4.js +0 -1
- package/apps/ui/dist/client/assets/refresh-ccw-BgKjOiA6.js +0 -1
- package/apps/ui/dist/client/assets/reload-error-panel-AHqu0akK.js +0 -1
- package/apps/ui/dist/client/assets/routes-DnzF_9CX.js +0 -1
- package/apps/ui/dist/client/assets/scroll-text-fM0sMOB3.js +0 -1
- package/apps/ui/dist/client/assets/select-CYF6pF37.js +0 -1
- package/apps/ui/dist/client/assets/settings-Dx70jgP_.js +0 -1
- package/apps/ui/dist/client/assets/sqlite-error-B6uZjUe8.js +0 -1
- package/apps/ui/dist/client/assets/styles-B7Zi9EFA.css +0 -1
- package/apps/ui/dist/client/assets/tabs-CmuhkT-c.js +0 -7
- package/apps/ui/dist/client/assets/text-filter-DVAZySUS.js +0 -2
- package/apps/ui/dist/client/assets/thread-transcript-stats-BUNz6u7F.js +0 -1
- package/apps/ui/dist/client/assets/threads._threadId-BB9tTsV4.js +0 -1
- package/apps/ui/dist/client/assets/threads._threadId-BMRSFow3.js +0 -1
- package/apps/ui/dist/client/assets/useMutation-BSFult2i.js +0 -1
- package/apps/ui/dist/client/assets/useQuery-CjINKZf1.js +0 -1
- package/apps/ui/dist/server/assets/_tanstack-start-manifest_v-CQ8Jjs3B.js +0 -387
- package/apps/ui/dist/server/assets/_threadId-B6SrBR9E.js +0 -6
- package/apps/ui/dist/server/assets/analytics-CYP_LT5Y.js +0 -16
- package/apps/ui/dist/server/assets/analytics-CtpOMVMO.js +0 -146
- package/apps/ui/dist/server/assets/antigravity-conversation-state-HgzS302O.js +0 -16
- package/apps/ui/dist/server/assets/antigravity-conversations._conversationId-BKOyL2T6.js +0 -613
- package/apps/ui/dist/server/assets/antigravity-conversations._conversationId-D426O-64.js +0 -11
- package/apps/ui/dist/server/assets/antigravity-conversations._conversationId-eS87Dx7g.js +0 -20
- package/apps/ui/dist/server/assets/antigravity-db-Bh8_U9uw.js +0 -580
- package/apps/ui/dist/server/assets/antigravity-keychain-DOiuHDwK.js +0 -126
- package/apps/ui/dist/server/assets/antigravity-keychain-panel-CC7FLmAK.js +0 -55
- package/apps/ui/dist/server/assets/antigravity-queries-CGrJO9Vr.js +0 -37
- package/apps/ui/dist/server/assets/antigravity-server-CHRjVFqN.js +0 -114
- package/apps/ui/dist/server/assets/antigravity._workspaceKey-3m_MzNFA.js +0 -11
- package/apps/ui/dist/server/assets/antigravity._workspaceKey-B0QeYUOh.js +0 -28
- package/apps/ui/dist/server/assets/antigravity._workspaceKey-C3kP-qyN.js +0 -210
- package/apps/ui/dist/server/assets/antigravity.index-CPCYkqCi.js +0 -104
- package/apps/ui/dist/server/assets/antigravity.index-DudTB3Tq.js +0 -11
- package/apps/ui/dist/server/assets/badge-EvdhKK_Z.js +0 -26
- package/apps/ui/dist/server/assets/button-CmTDnzOn.js +0 -46
- package/apps/ui/dist/server/assets/checkbox-C0hovF41.js +0 -19
- package/apps/ui/dist/server/assets/claude-code-db-Ik3VStKZ.js +0 -361
- package/apps/ui/dist/server/assets/claude-code-queries-Cgzi4K-e.js +0 -37
- package/apps/ui/dist/server/assets/claude-code-server-PfraClXS.js +0 -72
- package/apps/ui/dist/server/assets/claude-code-sessions._sessionId-C55oe6zj.js +0 -18
- package/apps/ui/dist/server/assets/claude-code-sessions._sessionId-D1RYYi3j.js +0 -473
- package/apps/ui/dist/server/assets/claude-code-sessions._sessionId-DSvPLEUL.js +0 -11
- package/apps/ui/dist/server/assets/claude-code-transcript-C-bxh3cS.js +0 -139
- package/apps/ui/dist/server/assets/claude-code-transcript-phase-DmUMc8VU.js +0 -10
- package/apps/ui/dist/server/assets/claude-code._workspaceKey-B5Xg_-tE.js +0 -28
- package/apps/ui/dist/server/assets/claude-code._workspaceKey-BPlzyXPa.js +0 -11
- package/apps/ui/dist/server/assets/claude-code._workspaceKey-DqDve2wl.js +0 -191
- package/apps/ui/dist/server/assets/claude-code.index-B7yYR7dD.js +0 -92
- package/apps/ui/dist/server/assets/claude-code.index-BUHThG1W.js +0 -11
- package/apps/ui/dist/server/assets/codex-queries-CtgeZ7VL.js +0 -99
- package/apps/ui/dist/server/assets/codex-server-CGXU4H8-.js +0 -2294
- package/apps/ui/dist/server/assets/concurrency-VXtYvlGh.js +0 -18
- package/apps/ui/dist/server/assets/createServerRpc-CF_DEwnm.js +0 -12
- package/apps/ui/dist/server/assets/createSsrRpc-C754NPki.js +0 -16
- package/apps/ui/dist/server/assets/cursor-db-CZnYy7aT.js +0 -830
- package/apps/ui/dist/server/assets/cursor-exporter-types-CI3goo-c.js +0 -34
- package/apps/ui/dist/server/assets/cursor-queries-NCIM0Nat.js +0 -67
- package/apps/ui/dist/server/assets/cursor-recovery-CXpO8KcD.js +0 -361
- package/apps/ui/dist/server/assets/cursor-server-DNu52A3K.js +0 -213
- package/apps/ui/dist/server/assets/cursor-threads._composerId-BB0Y_Mao.js +0 -11
- package/apps/ui/dist/server/assets/cursor-threads._composerId-Ckn6ItHI.js +0 -582
- package/apps/ui/dist/server/assets/cursor-threads._composerId-p9-ARAzc.js +0 -18
- package/apps/ui/dist/server/assets/cursor-transcript-B7tGnqtn.js +0 -125
- package/apps/ui/dist/server/assets/cursor._workspaceKey-CZuohIUL.js +0 -28
- package/apps/ui/dist/server/assets/cursor._workspaceKey-DPp5JSjy.js +0 -401
- package/apps/ui/dist/server/assets/cursor._workspaceKey-nmg3YIOQ.js +0 -11
- package/apps/ui/dist/server/assets/cursor.index-CcsX7DG0.js +0 -11
- package/apps/ui/dist/server/assets/cursor.index-DkWT-mxw.js +0 -189
- package/apps/ui/dist/server/assets/data-table-Cdct823O.js +0 -189
- package/apps/ui/dist/server/assets/delete-confirm-dialog-BcBNCxWB.js +0 -144
- package/apps/ui/dist/server/assets/download-DMmiy1xf.js +0 -92
- package/apps/ui/dist/server/assets/dropdown-menu-Dy_9t6TN.js +0 -36
- package/apps/ui/dist/server/assets/empty-plugin-adapters-B3lHh1La.js +0 -5
- package/apps/ui/dist/server/assets/export-dialog-D88ze9Gy.js +0 -240
- package/apps/ui/dist/server/assets/formatters-FJaGZgJk.js +0 -91
- package/apps/ui/dist/server/assets/kiro-db--fXrED_-.js +0 -552
- package/apps/ui/dist/server/assets/kiro-queries-CzNlM2ok.js +0 -37
- package/apps/ui/dist/server/assets/kiro-server-9WRxg2Au.js +0 -72
- package/apps/ui/dist/server/assets/kiro-sessions._sessionId-CRY2c7YO.js +0 -11
- package/apps/ui/dist/server/assets/kiro-sessions._sessionId-F1UlwxmR.js +0 -449
- package/apps/ui/dist/server/assets/kiro-sessions._sessionId-bvTulT7C.js +0 -18
- package/apps/ui/dist/server/assets/kiro-transcript-DoekQBaH.js +0 -112
- package/apps/ui/dist/server/assets/kiro-transcript-phase-CJG40nQg.js +0 -27
- package/apps/ui/dist/server/assets/kiro._workspaceKey-BDe9sQwo.js +0 -11
- package/apps/ui/dist/server/assets/kiro._workspaceKey-CJsjgNwO.js +0 -28
- package/apps/ui/dist/server/assets/kiro._workspaceKey-D_-4Qb7y.js +0 -193
- package/apps/ui/dist/server/assets/kiro.index-C__-UROk.js +0 -11
- package/apps/ui/dist/server/assets/kiro.index-CmTbqeYj.js +0 -93
- package/apps/ui/dist/server/assets/loading-panel-BGFnWseS.js +0 -27
- package/apps/ui/dist/server/assets/metric-card-ByEeLu0r.js +0 -23
- package/apps/ui/dist/server/assets/model-label-B1NWGc65.js +0 -13
- package/apps/ui/dist/server/assets/opencode-db-BM7KjOzc.js +0 -397
- package/apps/ui/dist/server/assets/opencode-queries-BeNYXnQv.js +0 -50
- package/apps/ui/dist/server/assets/opencode-server-BpQ_kRze.js +0 -72
- package/apps/ui/dist/server/assets/opencode-sessions._sessionId-CGQ-t0vD.js +0 -518
- package/apps/ui/dist/server/assets/opencode-sessions._sessionId-D8Q7in_Z.js +0 -18
- package/apps/ui/dist/server/assets/opencode-sessions._sessionId-DKOvi0lV.js +0 -11
- package/apps/ui/dist/server/assets/opencode-think-tags-CAoD-EcZ.js +0 -87
- package/apps/ui/dist/server/assets/opencode-transcript-BNTcGNym.js +0 -141
- package/apps/ui/dist/server/assets/opencode-transcript-phase-OqLkiQD0.js +0 -32
- package/apps/ui/dist/server/assets/opencode._workspaceKey-BdqcWHw1.js +0 -11
- package/apps/ui/dist/server/assets/opencode._workspaceKey-CfH96HTT.js +0 -28
- package/apps/ui/dist/server/assets/opencode._workspaceKey-DdbHPDrO.js +0 -207
- package/apps/ui/dist/server/assets/opencode.index-BbVzkJXP.js +0 -11
- package/apps/ui/dist/server/assets/opencode.index-Vh_Gq_1L.js +0 -93
- package/apps/ui/dist/server/assets/page-header-VNSaM3xd.js +0 -29
- package/apps/ui/dist/server/assets/path-transforms-DL2IwtYd.js +0 -31
- package/apps/ui/dist/server/assets/projects._project-4io5LO0E.js +0 -20
- package/apps/ui/dist/server/assets/projects._project-Bshqk7JA.js +0 -12
- package/apps/ui/dist/server/assets/projects._project-D6ZoGhJ8.js +0 -395
- package/apps/ui/dist/server/assets/projects.index-BLXOx5eL.js +0 -12
- package/apps/ui/dist/server/assets/projects.index-BkLiF2FF.js +0 -182
- package/apps/ui/dist/server/assets/projects.index-DesYXwfi.js +0 -14
- package/apps/ui/dist/server/assets/reload-error-panel-BJMxY3U1.js +0 -25
- package/apps/ui/dist/server/assets/route-search-ts4W9MJ9.js +0 -38
- package/apps/ui/dist/server/assets/router-Sac2DGk6.js +0 -518
- package/apps/ui/dist/server/assets/routes-Bsact1uB.js +0 -184
- package/apps/ui/dist/server/assets/routes-BzkJgq4W.js +0 -34
- package/apps/ui/dist/server/assets/select-GW76p-ld.js +0 -76
- package/apps/ui/dist/server/assets/settings-OayxIYQQ.js +0 -100
- package/apps/ui/dist/server/assets/settings-store-DpEJEQ7M.js +0 -52
- package/apps/ui/dist/server/assets/shared-DyhChtHf.js +0 -137
- package/apps/ui/dist/server/assets/source-session-export-server-DNutCawb.js +0 -38
- package/apps/ui/dist/server/assets/sqlite-error-LZDrnxdd.js +0 -13
- package/apps/ui/dist/server/assets/start-B_HFwkkk.js +0 -4
- package/apps/ui/dist/server/assets/tabs-DkaChNVg.js +0 -501
- package/apps/ui/dist/server/assets/text-filter-CGKxMCKt.js +0 -36
- package/apps/ui/dist/server/assets/thread-transcript-stats-Dh34mt2u.js +0 -45
- package/apps/ui/dist/server/assets/threads._threadId-BSSK4nkI.js +0 -26
- package/apps/ui/dist/server/assets/threads._threadId-BeXEc4Lo.js +0 -648
- package/apps/ui/dist/server/assets/threads._threadId-Ci0S4mKU.js +0 -18
- package/apps/ui/dist/server/assets/ui-export-files-BHLX9bhN.js +0 -83
- package/apps/ui/dist/server/assets/utils-C_uf36nf.js +0 -8
- package/apps/ui/dist/server/server.js +0 -5895
- package/bin/codex-chats-claude.js +0 -5
- package/bin/codex-chats.js +0 -5
- package/bin/spiracha.js +0 -5
- package/src/export-chats.ts +0 -120
- package/src/export-claude.ts +0 -36
- package/src/export-cursor.ts +0 -244
- package/src/lib/claude-exporter.ts +0 -864
- package/src/lib/codex-exporter-cli.ts +0 -277
- package/src/lib/codex-exporter-db.ts +0 -319
- package/src/lib/codex-exporter.ts +0 -115
- package/src/lib/cursor-exporter.ts +0 -266
- package/src/lib/interactive-cli.ts +0 -433
- package/src/lib/native-open.ts +0 -54
- package/src/mcp-server.ts +0 -137
- package/src/spiracha.ts +0 -116
- package/src/ui-cli.ts +0 -310
- /package/apps/ui/{dist/client → public}/icon.svg +0 -0
- /package/apps/ui/{dist/client → public}/manifest.json +0 -0
- /package/apps/ui/{dist/client → public}/robots.txt +0 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { mkdtemp, rm } from 'node:fs/promises';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { resolveUniqueExportFileBaseName, sanitizeExportFileName, zipExportDirectory } from './ui-export-archive';
|
|
6
|
+
|
|
7
|
+
type ConversationMarkdownZipEntry = {
|
|
8
|
+
fallbackBaseName: string;
|
|
9
|
+
markdown: string;
|
|
10
|
+
title: string | null;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
type ConversationMarkdownZipOptions = {
|
|
14
|
+
entries: ConversationMarkdownZipEntry[];
|
|
15
|
+
fileBaseName: string;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export type ConversationMarkdownZip = {
|
|
19
|
+
blob: Blob;
|
|
20
|
+
fileName: string;
|
|
21
|
+
mimeType: 'application/zip';
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const toSafeFileBaseName = (value: string | null, fallback: string) => {
|
|
25
|
+
return sanitizeExportFileName(value?.trim() || '') || sanitizeExportFileName(fallback) || 'conversation';
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export const createConversationMarkdownZip = async ({
|
|
29
|
+
entries,
|
|
30
|
+
fileBaseName,
|
|
31
|
+
}: ConversationMarkdownZipOptions): Promise<ConversationMarkdownZip> => {
|
|
32
|
+
if (entries.length === 0) {
|
|
33
|
+
throw new Error('No conversations selected for export');
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const safeBaseName = toSafeFileBaseName(fileBaseName, 'conversations');
|
|
37
|
+
const workspaceDir = await mkdtemp(path.join(os.tmpdir(), `${safeBaseName}-`));
|
|
38
|
+
const zipPath = path.join(os.tmpdir(), `${safeBaseName}-${randomUUID()}.zip`);
|
|
39
|
+
const usedBaseNames = new Map<string, number>();
|
|
40
|
+
|
|
41
|
+
try {
|
|
42
|
+
for (const entry of entries) {
|
|
43
|
+
const entryBaseName = toSafeFileBaseName(entry.title, entry.fallbackBaseName);
|
|
44
|
+
const fileBaseNameForEntry = resolveUniqueExportFileBaseName(entryBaseName, usedBaseNames);
|
|
45
|
+
await Bun.write(path.join(workspaceDir, `${fileBaseNameForEntry}.md`), entry.markdown);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
await zipExportDirectory(workspaceDir, zipPath);
|
|
49
|
+
return {
|
|
50
|
+
blob: new Blob([await Bun.file(zipPath).arrayBuffer()], { type: 'application/zip' }),
|
|
51
|
+
fileName: `${safeBaseName}.zip`,
|
|
52
|
+
mimeType: 'application/zip',
|
|
53
|
+
};
|
|
54
|
+
} finally {
|
|
55
|
+
await Promise.all([rm(workspaceDir, { force: true, recursive: true }), rm(zipPath, { force: true })]);
|
|
56
|
+
}
|
|
57
|
+
};
|
package/src/lib/cursor-db.ts
CHANGED
|
@@ -126,6 +126,11 @@ const parseCodeWorkspaceJson = (text: string): { folders?: Array<{ path?: string
|
|
|
126
126
|
}
|
|
127
127
|
};
|
|
128
128
|
|
|
129
|
+
const isMissingCodeWorkspaceFileError = (error: unknown): boolean => {
|
|
130
|
+
const code = (error as { code?: unknown }).code;
|
|
131
|
+
return code === 'ENOENT' || code === 'ENOTDIR';
|
|
132
|
+
};
|
|
133
|
+
|
|
129
134
|
const parseCodeWorkspaceFolders = async (workspaceFilePath: string): Promise<string[]> => {
|
|
130
135
|
if (!workspaceFilePath.endsWith('.code-workspace')) {
|
|
131
136
|
return [];
|
|
@@ -149,6 +154,10 @@ const parseCodeWorkspaceFolders = async (workspaceFilePath: string): Promise<str
|
|
|
149
154
|
|
|
150
155
|
return folders;
|
|
151
156
|
} catch (error) {
|
|
157
|
+
if (isMissingCodeWorkspaceFileError(error)) {
|
|
158
|
+
return [];
|
|
159
|
+
}
|
|
160
|
+
|
|
152
161
|
warnCursorDataIssue('invalid_code_workspace_json', {
|
|
153
162
|
error: error instanceof Error ? error.message : String(error),
|
|
154
163
|
workspaceFilePath,
|
|
@@ -360,8 +369,11 @@ export const groupCursorBuckets = (buckets: CursorWorkspaceBucket[]): CursorWork
|
|
|
360
369
|
return groups.sort((a, b) => b.lastActiveMs - a.lastActiveMs);
|
|
361
370
|
};
|
|
362
371
|
|
|
363
|
-
export const listCursorWorkspaceGroups = async (
|
|
364
|
-
|
|
372
|
+
export const listCursorWorkspaceGroups = async (
|
|
373
|
+
userDir = resolveCursorUserDir(),
|
|
374
|
+
options: CursorDiscoveryOptions = {},
|
|
375
|
+
): Promise<CursorWorkspaceGroup[]> => {
|
|
376
|
+
return (await discoverCursorWorkspaces(userDir, options)).groups;
|
|
365
377
|
};
|
|
366
378
|
|
|
367
379
|
export const cursorBucketMatchesQuery = (bucket: CursorWorkspaceBucket, query: string): boolean => {
|
|
@@ -462,6 +474,7 @@ export const findCursorTranscriptDirs = async (
|
|
|
462
474
|
|
|
463
475
|
export type ListCursorThreadsOptions = {
|
|
464
476
|
includeTranscriptDirs?: boolean;
|
|
477
|
+
updatedAfterMs?: number;
|
|
465
478
|
};
|
|
466
479
|
|
|
467
480
|
export const listCursorThreadsForGroup = async (
|
|
@@ -469,7 +482,7 @@ export const listCursorThreadsForGroup = async (
|
|
|
469
482
|
userDir = resolveCursorUserDir(),
|
|
470
483
|
options: ListCursorThreadsOptions = {},
|
|
471
484
|
): Promise<CursorThreadSummary[]> => {
|
|
472
|
-
const discovery = await discoverCursorWorkspaces(userDir);
|
|
485
|
+
const discovery = await discoverCursorWorkspaces(userDir, options);
|
|
473
486
|
const threads = discovery.threadsByKey.get(group.key) ?? [];
|
|
474
487
|
|
|
475
488
|
if (options.includeTranscriptDirs === false) {
|
|
@@ -505,6 +518,10 @@ type CursorDiscovery = {
|
|
|
505
518
|
threadsByKey: Map<string, CursorThreadSummary[]>;
|
|
506
519
|
};
|
|
507
520
|
|
|
521
|
+
type CursorDiscoveryOptions = {
|
|
522
|
+
updatedAfterMs?: number;
|
|
523
|
+
};
|
|
524
|
+
|
|
508
525
|
// Discovery does a full scan of the (potentially multi-GB) global DB, so cache it briefly. Writes
|
|
509
526
|
// (recover/prune/delete) call invalidateCursorDiscoveryCache() so the UI never shows stale results.
|
|
510
527
|
const DISCOVERY_TTL_MS = 60_000;
|
|
@@ -662,18 +679,41 @@ const inferFolderFromBubbles = (db: Database, composerId: string): string | null
|
|
|
662
679
|
return inferFolderFromPaths(paths);
|
|
663
680
|
};
|
|
664
681
|
|
|
665
|
-
const readAllHeads = (db: Database): Map<string, GlobalHead> => {
|
|
682
|
+
const readAllHeads = (db: Database, options: CursorDiscoveryOptions = {}): Map<string, GlobalHead> => {
|
|
683
|
+
if (options.updatedAfterMs !== undefined) {
|
|
684
|
+
const rows = db
|
|
685
|
+
.query(
|
|
686
|
+
`SELECT substr(key, 14) AS id, value
|
|
687
|
+
FROM cursorDiskKV
|
|
688
|
+
WHERE key LIKE 'composerData:%'
|
|
689
|
+
AND COALESCE(json_extract(value, '$.lastUpdatedAt'), 0) >= ?`,
|
|
690
|
+
)
|
|
691
|
+
.all(options.updatedAfterMs) as Array<{ id: string; value: string | null }>;
|
|
692
|
+
|
|
693
|
+
return new Map(rows.map((row) => [row.id, parseGlobalHead(row.value)]));
|
|
694
|
+
}
|
|
695
|
+
|
|
666
696
|
const rows = db
|
|
667
697
|
.query(`SELECT substr(key, 14) AS id, value FROM cursorDiskKV WHERE key LIKE 'composerData:%'`)
|
|
668
|
-
.all() as Array<{ id: string; value: string }>;
|
|
698
|
+
.all() as Array<{ id: string; value: string | null }>;
|
|
669
699
|
|
|
670
700
|
return new Map(rows.map((row) => [row.id, parseGlobalHead(row.value)]));
|
|
671
701
|
};
|
|
672
702
|
|
|
673
|
-
const parseGlobalHead = (value: string): GlobalHead => {
|
|
674
|
-
let parsed: Record<string, JsonValue> = {};
|
|
703
|
+
const parseGlobalHead = (value: string | null): GlobalHead => {
|
|
704
|
+
let parsed: Record<string, JsonValue> | null = {};
|
|
705
|
+
if (value === null) {
|
|
706
|
+
return {
|
|
707
|
+
createdAtMs: null,
|
|
708
|
+
lastUpdatedAtMs: null,
|
|
709
|
+
mode: null,
|
|
710
|
+
name: null,
|
|
711
|
+
pathHint: null,
|
|
712
|
+
};
|
|
713
|
+
}
|
|
714
|
+
|
|
675
715
|
try {
|
|
676
|
-
parsed = JSON.parse(value) as
|
|
716
|
+
parsed = asObject(JSON.parse(value) as JsonValue);
|
|
677
717
|
} catch {
|
|
678
718
|
return {
|
|
679
719
|
createdAtMs: null,
|
|
@@ -684,6 +724,16 @@ const parseGlobalHead = (value: string): GlobalHead => {
|
|
|
684
724
|
};
|
|
685
725
|
}
|
|
686
726
|
|
|
727
|
+
if (!parsed) {
|
|
728
|
+
return {
|
|
729
|
+
createdAtMs: null,
|
|
730
|
+
lastUpdatedAtMs: null,
|
|
731
|
+
mode: null,
|
|
732
|
+
name: null,
|
|
733
|
+
pathHint: inferFolderFromBlob(value),
|
|
734
|
+
};
|
|
735
|
+
}
|
|
736
|
+
|
|
687
737
|
return {
|
|
688
738
|
createdAtMs: asNumber(parsed.createdAt ?? null),
|
|
689
739
|
lastUpdatedAtMs: asNumber(parsed.lastUpdatedAt ?? null),
|
|
@@ -693,17 +743,28 @@ const parseGlobalHead = (value: string): GlobalHead => {
|
|
|
693
743
|
};
|
|
694
744
|
};
|
|
695
745
|
|
|
696
|
-
const readBubbleStats = (db: Database): Map<string, BubbleStat> => {
|
|
746
|
+
const readBubbleStats = (db: Database, composerIds?: Iterable<string>): Map<string, BubbleStat> => {
|
|
747
|
+
const ids = composerIds ? [...composerIds] : null;
|
|
748
|
+
if (ids?.length === 0) {
|
|
749
|
+
return new Map();
|
|
750
|
+
}
|
|
751
|
+
|
|
697
752
|
// Keys are `bubbleId:<composerId>:<bubbleId>`; composer ids contain no colon, so slice up to the
|
|
698
753
|
// next ':' rather than assuming a fixed UUID length (keeps tests and any id format working).
|
|
699
|
-
const
|
|
700
|
-
|
|
701
|
-
`SELECT substr(key, 10, instr(substr(key, 10), ':') - 1) AS id,
|
|
754
|
+
const query =
|
|
755
|
+
ids === null
|
|
756
|
+
? `SELECT substr(key, 10, instr(substr(key, 10), ':') - 1) AS id,
|
|
702
757
|
COUNT(*) AS count,
|
|
703
758
|
COALESCE(SUM(length(value)), 0) AS bytes
|
|
704
|
-
FROM cursorDiskKV WHERE key GLOB 'bubbleId:*:*' GROUP BY id
|
|
705
|
-
|
|
706
|
-
|
|
759
|
+
FROM cursorDiskKV WHERE key GLOB 'bubbleId:*:*' GROUP BY id`
|
|
760
|
+
: `SELECT substr(key, 10, instr(substr(key, 10), ':') - 1) AS id,
|
|
761
|
+
COUNT(*) AS count,
|
|
762
|
+
COALESCE(SUM(length(value)), 0) AS bytes
|
|
763
|
+
FROM cursorDiskKV
|
|
764
|
+
WHERE key GLOB 'bubbleId:*:*'
|
|
765
|
+
AND substr(key, 10, instr(substr(key, 10), ':') - 1) IN (${ids.map(() => '?').join(',')})
|
|
766
|
+
GROUP BY id`;
|
|
767
|
+
const rows = db.query(query).all(...(ids ?? [])) as Array<{ id: string; count: number; bytes: number }>;
|
|
707
768
|
|
|
708
769
|
return new Map(rows.map((row) => [row.id, { bytes: row.bytes, count: row.count }]));
|
|
709
770
|
};
|
|
@@ -936,14 +997,13 @@ const buildDiscoveryGroups = (
|
|
|
936
997
|
return groups.sort((a, b) => b.lastActiveMs - a.lastActiveMs);
|
|
937
998
|
};
|
|
938
999
|
|
|
939
|
-
const buildDiscovery = async (userDir: string): Promise<CursorDiscovery> => {
|
|
1000
|
+
const buildDiscovery = async (userDir: string, options: CursorDiscoveryOptions = {}): Promise<CursorDiscovery> => {
|
|
940
1001
|
const buckets = await loadCursorBuckets(userDir);
|
|
941
1002
|
const bucketGroups = groupCursorBuckets(buckets);
|
|
942
|
-
const fileHistoryActivity = await readCursorFileHistoryProjectActivity(userDir);
|
|
943
1003
|
const globalDbPath = getCursorGlobalDbPath(userDir);
|
|
944
1004
|
|
|
945
1005
|
if (!(await pathExists(globalDbPath))) {
|
|
946
|
-
return assembleDiscovery([], bucketGroups,
|
|
1006
|
+
return assembleDiscovery([], bucketGroups, new Map());
|
|
947
1007
|
}
|
|
948
1008
|
|
|
949
1009
|
const bucketIdToGroupKey = new Map<string, string>();
|
|
@@ -955,14 +1015,20 @@ const buildDiscovery = async (userDir: string): Promise<CursorDiscovery> => {
|
|
|
955
1015
|
}
|
|
956
1016
|
}
|
|
957
1017
|
|
|
958
|
-
const headerInfo = readHeaderInfo(globalDbPath);
|
|
959
|
-
const bucketComposerIds = collectBucketComposerIds(buckets);
|
|
960
|
-
|
|
961
1018
|
const db = openCursorReadonlyDb(globalDbPath);
|
|
962
1019
|
try {
|
|
963
|
-
const heads = readAllHeads(db);
|
|
964
|
-
|
|
965
|
-
|
|
1020
|
+
const heads = readAllHeads(db, options);
|
|
1021
|
+
if (options.updatedAfterMs !== undefined && heads.size === 0) {
|
|
1022
|
+
return assembleDiscovery([], bucketGroups, new Map());
|
|
1023
|
+
}
|
|
1024
|
+
|
|
1025
|
+
const headerInfo = readHeaderInfo(globalDbPath);
|
|
1026
|
+
const bucketComposerIds = options.updatedAfterMs === undefined ? collectBucketComposerIds(buckets) : new Map();
|
|
1027
|
+
const stats = readBubbleStats(db, options.updatedAfterMs === undefined ? undefined : heads.keys());
|
|
1028
|
+
const universe =
|
|
1029
|
+
options.updatedAfterMs === undefined
|
|
1030
|
+
? new Set<string>([...heads.keys(), ...headerInfo.keys(), ...bucketComposerIds.keys()])
|
|
1031
|
+
: new Set<string>(heads.keys());
|
|
966
1032
|
const resolved: ResolvedThread[] = [];
|
|
967
1033
|
|
|
968
1034
|
for (const composerId of universe) {
|
|
@@ -980,13 +1046,22 @@ const buildDiscovery = async (userDir: string): Promise<CursorDiscovery> => {
|
|
|
980
1046
|
);
|
|
981
1047
|
}
|
|
982
1048
|
|
|
1049
|
+
const fileHistoryActivity =
|
|
1050
|
+
options.updatedAfterMs === undefined ? await readCursorFileHistoryProjectActivity(userDir) : new Map();
|
|
983
1051
|
return assembleDiscovery(resolved, bucketGroups, fileHistoryActivity);
|
|
984
1052
|
} finally {
|
|
985
1053
|
db.close();
|
|
986
1054
|
}
|
|
987
1055
|
};
|
|
988
1056
|
|
|
989
|
-
const discoverCursorWorkspaces = async (
|
|
1057
|
+
const discoverCursorWorkspaces = async (
|
|
1058
|
+
userDir: string,
|
|
1059
|
+
options: CursorDiscoveryOptions = {},
|
|
1060
|
+
): Promise<CursorDiscovery> => {
|
|
1061
|
+
if (options.updatedAfterMs !== undefined) {
|
|
1062
|
+
return await buildDiscovery(userDir, options);
|
|
1063
|
+
}
|
|
1064
|
+
|
|
990
1065
|
const now = Date.now();
|
|
991
1066
|
if (discoveryCache && discoveryCache.userDir === userDir && now - discoveryCache.at < DISCOVERY_TTL_MS) {
|
|
992
1067
|
return discoveryCache.value;
|
|
@@ -152,25 +152,6 @@ export type CursorExportOptions = {
|
|
|
152
152
|
outputFormat: ExportFormat;
|
|
153
153
|
};
|
|
154
154
|
|
|
155
|
-
export type CursorCliOptions = CursorExportOptions & {
|
|
156
|
-
userDir: string;
|
|
157
|
-
workspaceQuery: string | null;
|
|
158
|
-
threadIds: string[];
|
|
159
|
-
outputDir: string | null;
|
|
160
|
-
};
|
|
161
|
-
|
|
162
|
-
export type CursorExportedFile = {
|
|
163
|
-
composerId: string;
|
|
164
|
-
outputPath: string;
|
|
165
|
-
};
|
|
166
|
-
|
|
167
|
-
export type CursorExportRunResult = {
|
|
168
|
-
outputDir: string;
|
|
169
|
-
exportedCount: number;
|
|
170
|
-
files: CursorExportedFile[];
|
|
171
|
-
missingThreadIds: string[];
|
|
172
|
-
};
|
|
173
|
-
|
|
174
155
|
export type CursorRecoverResult = {
|
|
175
156
|
workspaceKey: string;
|
|
176
157
|
activeBucketId: string;
|