mirror of
https://github.com/siteboon/claudecodeui.git
synced 2026-07-02 02:22:55 +08:00
refactor(cursor): lazy-load better-sqlite3 and remove unused type definitions
This commit is contained in:
11
package-lock.json
generated
11
package-lock.json
generated
@@ -74,6 +74,7 @@
|
|||||||
"@commitlint/config-conventional": "^20.5.0",
|
"@commitlint/config-conventional": "^20.5.0",
|
||||||
"@eslint/js": "^9.39.3",
|
"@eslint/js": "^9.39.3",
|
||||||
"@release-it/conventional-changelog": "^10.0.5",
|
"@release-it/conventional-changelog": "^10.0.5",
|
||||||
|
"@types/better-sqlite3": "^7.6.13",
|
||||||
"@types/cross-spawn": "^6.0.6",
|
"@types/cross-spawn": "^6.0.6",
|
||||||
"@types/express": "^5.0.6",
|
"@types/express": "^5.0.6",
|
||||||
"@types/node": "^22.19.7",
|
"@types/node": "^22.19.7",
|
||||||
@@ -3707,6 +3708,16 @@
|
|||||||
"@babel/types": "^7.20.7"
|
"@babel/types": "^7.20.7"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@types/better-sqlite3": {
|
||||||
|
"version": "7.6.13",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.13.tgz",
|
||||||
|
"integrity": "sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@types/node": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@types/body-parser": {
|
"node_modules/@types/body-parser": {
|
||||||
"version": "1.19.6",
|
"version": "1.19.6",
|
||||||
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz",
|
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz",
|
||||||
|
|||||||
@@ -126,6 +126,7 @@
|
|||||||
"@commitlint/config-conventional": "^20.5.0",
|
"@commitlint/config-conventional": "^20.5.0",
|
||||||
"@eslint/js": "^9.39.3",
|
"@eslint/js": "^9.39.3",
|
||||||
"@release-it/conventional-changelog": "^10.0.5",
|
"@release-it/conventional-changelog": "^10.0.5",
|
||||||
|
"@types/better-sqlite3": "^7.6.13",
|
||||||
"@types/cross-spawn": "^6.0.6",
|
"@types/cross-spawn": "^6.0.6",
|
||||||
"@types/express": "^5.0.6",
|
"@types/express": "^5.0.6",
|
||||||
"@types/node": "^22.19.7",
|
"@types/node": "^22.19.7",
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import crypto from 'node:crypto';
|
import crypto from 'node:crypto';
|
||||||
import { createRequire } from 'node:module';
|
|
||||||
import os from 'node:os';
|
import os from 'node:os';
|
||||||
import path from 'node:path';
|
import path from 'node:path';
|
||||||
|
|
||||||
@@ -11,22 +10,9 @@ import type { FetchHistoryOptions, FetchHistoryResult, NormalizedMessage } from
|
|||||||
import { createNormalizedMessage, generateMessageId, readObjectRecord } from '@/shared/utils.js';
|
import { createNormalizedMessage, generateMessageId, readObjectRecord } from '@/shared/utils.js';
|
||||||
|
|
||||||
const PROVIDER = 'cursor';
|
const PROVIDER = 'cursor';
|
||||||
const nodeRequire = createRequire(import.meta.url);
|
|
||||||
|
|
||||||
type RawProviderMessage = Record<string, any>;
|
type RawProviderMessage = Record<string, any>;
|
||||||
|
|
||||||
type BetterSqliteDatabase = {
|
|
||||||
prepare(sql: string): {
|
|
||||||
all(): CursorDbBlob[];
|
|
||||||
};
|
|
||||||
close(): void;
|
|
||||||
};
|
|
||||||
|
|
||||||
type BetterSqliteConstructor = new (
|
|
||||||
filename: string,
|
|
||||||
options: { readonly: boolean; fileMustExist: boolean },
|
|
||||||
) => BetterSqliteDatabase;
|
|
||||||
|
|
||||||
type CursorDbBlob = {
|
type CursorDbBlob = {
|
||||||
rowid: number;
|
rowid: number;
|
||||||
id: string;
|
id: string;
|
||||||
@@ -61,7 +47,8 @@ export class CursorProvider extends AbstractProvider {
|
|||||||
* order. Cursor history is stored as content-addressed blobs rather than JSONL.
|
* order. Cursor history is stored as content-addressed blobs rather than JSONL.
|
||||||
*/
|
*/
|
||||||
private async loadCursorBlobs(sessionId: string, projectPath: string): Promise<CursorMessageBlob[]> {
|
private async loadCursorBlobs(sessionId: string, projectPath: string): Promise<CursorMessageBlob[]> {
|
||||||
const Database = nodeRequire('better-sqlite3') as BetterSqliteConstructor;
|
// Lazy-import better-sqlite3 so the module doesn't fail if it's unavailable
|
||||||
|
const { default: Database } = await import('better-sqlite3');
|
||||||
|
|
||||||
const cwdId = crypto.createHash('md5').update(projectPath || process.cwd()).digest('hex');
|
const cwdId = crypto.createHash('md5').update(projectPath || process.cwd()).digest('hex');
|
||||||
const storeDbPath = path.join(os.homedir(), '.cursor', 'chats', cwdId, sessionId, 'store.db');
|
const storeDbPath = path.join(os.homedir(), '.cursor', 'chats', cwdId, sessionId, 'store.db');
|
||||||
@@ -69,7 +56,7 @@ export class CursorProvider extends AbstractProvider {
|
|||||||
const db = new Database(storeDbPath, { readonly: true, fileMustExist: true });
|
const db = new Database(storeDbPath, { readonly: true, fileMustExist: true });
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const allBlobs = db.prepare('SELECT rowid, id, data FROM blobs').all();
|
const allBlobs = db.prepare<[], CursorDbBlob>('SELECT rowid, id, data FROM blobs').all();
|
||||||
|
|
||||||
const blobMap = new Map<string, CursorDbBlob>();
|
const blobMap = new Map<string, CursorDbBlob>();
|
||||||
const parentRefs = new Map<string, string[]>();
|
const parentRefs = new Map<string, string[]>();
|
||||||
|
|||||||
Reference in New Issue
Block a user