cursor-history 0.5.1 → 0.6.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/README.md +81 -1
- package/dist/cli/commands/export.js +1 -1
- package/dist/cli/commands/export.js.map +1 -1
- package/dist/cli/commands/search.js +1 -1
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/show.js +1 -1
- package/dist/cli/commands/show.js.map +1 -1
- package/dist/cli/errors.d.ts +56 -0
- package/dist/cli/errors.d.ts.map +1 -0
- package/dist/cli/errors.js +90 -0
- package/dist/cli/errors.js.map +1 -0
- package/dist/cli/index.js +1 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/core/storage.js +22 -21
- package/dist/core/storage.js.map +1 -1
- package/dist/core/types.d.ts +28 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/lib/config.d.ts +32 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +80 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/errors.d.ts +37 -39
- package/dist/lib/errors.d.ts.map +1 -1
- package/dist/lib/errors.js +55 -66
- package/dist/lib/errors.js.map +1 -1
- package/dist/lib/index.d.ts +142 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +401 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/types.d.ts +119 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +9 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/lib/utils.d.ts +17 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +20 -0
- package/dist/lib/utils.js.map +1 -0
- package/package.json +11 -3
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration handling and validation for library API
|
|
3
|
+
*
|
|
4
|
+
* IMPORTANT: This is a library interface for direct import and use in TypeScript/JavaScript
|
|
5
|
+
* projects, NOT a network/REST API.
|
|
6
|
+
*/
|
|
7
|
+
import type { LibraryConfig } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Merged configuration with all defaults applied
|
|
10
|
+
*/
|
|
11
|
+
export interface ResolvedConfig {
|
|
12
|
+
dataPath: string;
|
|
13
|
+
workspace?: string;
|
|
14
|
+
limit: number;
|
|
15
|
+
offset: number;
|
|
16
|
+
context: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Validate configuration parameters
|
|
20
|
+
* @throws {InvalidConfigError} If any parameter is invalid
|
|
21
|
+
*/
|
|
22
|
+
export declare function validateConfig(config?: LibraryConfig): void;
|
|
23
|
+
/**
|
|
24
|
+
* Merge user configuration with defaults
|
|
25
|
+
*/
|
|
26
|
+
export declare function mergeWithDefaults(config?: LibraryConfig): ResolvedConfig;
|
|
27
|
+
/**
|
|
28
|
+
* Resolve database path with symlink handling
|
|
29
|
+
* @throws {DatabaseNotFoundError} If path does not exist
|
|
30
|
+
*/
|
|
31
|
+
export declare function resolveDatabasePath(configPath?: string): string;
|
|
32
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIhD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,IAAI,CAsC3D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,cAAc,CAYxE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAW/D"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration handling and validation for library API
|
|
3
|
+
*
|
|
4
|
+
* IMPORTANT: This is a library interface for direct import and use in TypeScript/JavaScript
|
|
5
|
+
* projects, NOT a network/REST API.
|
|
6
|
+
*/
|
|
7
|
+
import { realpathSync } from 'node:fs';
|
|
8
|
+
import { resolve, normalize, isAbsolute } from 'node:path';
|
|
9
|
+
import { InvalidConfigError, DatabaseNotFoundError } from './errors.js';
|
|
10
|
+
import { getCursorDataPath } from '../lib/platform.js';
|
|
11
|
+
/**
|
|
12
|
+
* Validate configuration parameters
|
|
13
|
+
* @throws {InvalidConfigError} If any parameter is invalid
|
|
14
|
+
*/
|
|
15
|
+
export function validateConfig(config) {
|
|
16
|
+
if (!config)
|
|
17
|
+
return;
|
|
18
|
+
// Validate limit
|
|
19
|
+
if (config.limit !== undefined) {
|
|
20
|
+
if (typeof config.limit !== 'number' || config.limit < 1 || !Number.isInteger(config.limit)) {
|
|
21
|
+
throw new InvalidConfigError('limit', config.limit, 'must be a positive integer greater than 0');
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
// Validate offset
|
|
25
|
+
if (config.offset !== undefined) {
|
|
26
|
+
if (typeof config.offset !== 'number' || config.offset < 0 || !Number.isInteger(config.offset)) {
|
|
27
|
+
throw new InvalidConfigError('offset', config.offset, 'must be a non-negative integer');
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// Validate context
|
|
31
|
+
if (config.context !== undefined) {
|
|
32
|
+
if (typeof config.context !== 'number' || config.context < 0 || !Number.isInteger(config.context)) {
|
|
33
|
+
throw new InvalidConfigError('context', config.context, 'must be a non-negative integer');
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// Validate workspace path
|
|
37
|
+
if (config.workspace !== undefined) {
|
|
38
|
+
if (typeof config.workspace !== 'string') {
|
|
39
|
+
throw new InvalidConfigError('workspace', config.workspace, 'must be a string');
|
|
40
|
+
}
|
|
41
|
+
if (!isAbsolute(config.workspace)) {
|
|
42
|
+
throw new InvalidConfigError('workspace', config.workspace, 'must be an absolute path');
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// Validate dataPath
|
|
46
|
+
if (config.dataPath !== undefined && typeof config.dataPath !== 'string') {
|
|
47
|
+
throw new InvalidConfigError('dataPath', config.dataPath, 'must be a string');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Merge user configuration with defaults
|
|
52
|
+
*/
|
|
53
|
+
export function mergeWithDefaults(config) {
|
|
54
|
+
validateConfig(config);
|
|
55
|
+
const dataPath = config?.dataPath ?? getCursorDataPath();
|
|
56
|
+
return {
|
|
57
|
+
dataPath,
|
|
58
|
+
workspace: config?.workspace,
|
|
59
|
+
limit: config?.limit ?? Number.MAX_SAFE_INTEGER,
|
|
60
|
+
offset: config?.offset ?? 0,
|
|
61
|
+
context: config?.context ?? 0,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Resolve database path with symlink handling
|
|
66
|
+
* @throws {DatabaseNotFoundError} If path does not exist
|
|
67
|
+
*/
|
|
68
|
+
export function resolveDatabasePath(configPath) {
|
|
69
|
+
const basePath = configPath ?? getCursorDataPath();
|
|
70
|
+
const normalized = normalize(basePath);
|
|
71
|
+
const resolved = resolve(normalized);
|
|
72
|
+
try {
|
|
73
|
+
// Resolve symlinks and verify path exists
|
|
74
|
+
return realpathSync(resolved);
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
throw new DatabaseNotFoundError(resolved);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/errors.d.ts
CHANGED
|
@@ -1,56 +1,54 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Custom error classes for library API
|
|
3
|
+
*
|
|
4
|
+
* IMPORTANT: This is a library interface for direct import and use in TypeScript/JavaScript
|
|
5
|
+
* projects, NOT a network/REST API.
|
|
3
6
|
*/
|
|
4
7
|
/**
|
|
5
|
-
*
|
|
8
|
+
* Thrown when database is locked by Cursor or another process.
|
|
9
|
+
*
|
|
10
|
+
* Recovery: Close Cursor IDE and retry, or implement custom retry logic.
|
|
6
11
|
*/
|
|
7
|
-
export declare
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
readonly IO_ERROR: 4;
|
|
13
|
-
};
|
|
14
|
-
export type ExitCode = (typeof ExitCode)[keyof typeof ExitCode];
|
|
15
|
-
/**
|
|
16
|
-
* Custom error class for CLI errors with exit codes
|
|
17
|
-
*/
|
|
18
|
-
export declare class CliError extends Error {
|
|
19
|
-
readonly exitCode: ExitCode;
|
|
20
|
-
constructor(message: string, exitCode?: ExitCode);
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Error for when no Cursor installation is found
|
|
24
|
-
*/
|
|
25
|
-
export declare class CursorNotFoundError extends CliError {
|
|
26
|
-
constructor(searchPath: string);
|
|
12
|
+
export declare class DatabaseLockedError extends Error {
|
|
13
|
+
name: "DatabaseLockedError";
|
|
14
|
+
/** Path to locked database file */
|
|
15
|
+
path: string;
|
|
16
|
+
constructor(path: string);
|
|
27
17
|
}
|
|
28
18
|
/**
|
|
29
|
-
*
|
|
19
|
+
* Thrown when database file or directory does not exist.
|
|
20
|
+
*
|
|
21
|
+
* Recovery: Verify Cursor is installed, check dataPath configuration.
|
|
30
22
|
*/
|
|
31
|
-
export declare class
|
|
32
|
-
|
|
23
|
+
export declare class DatabaseNotFoundError extends Error {
|
|
24
|
+
name: "DatabaseNotFoundError";
|
|
25
|
+
/** Path that was not found */
|
|
26
|
+
path: string;
|
|
27
|
+
constructor(path: string);
|
|
33
28
|
}
|
|
34
29
|
/**
|
|
35
|
-
*
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
30
|
+
* Thrown when configuration parameters are invalid.
|
|
31
|
+
*
|
|
32
|
+
* Recovery: Fix configuration values per LibraryConfig validation rules.
|
|
33
|
+
*/
|
|
34
|
+
export declare class InvalidConfigError extends Error {
|
|
35
|
+
name: "InvalidConfigError";
|
|
36
|
+
/** Name of invalid config field */
|
|
37
|
+
field: string;
|
|
38
|
+
/** Invalid value provided */
|
|
39
|
+
value: unknown;
|
|
40
|
+
constructor(field: string, value: unknown, reason: string);
|
|
39
41
|
}
|
|
40
42
|
/**
|
|
41
|
-
*
|
|
43
|
+
* Type guard to check if an error is a DatabaseLockedError.
|
|
42
44
|
*/
|
|
43
|
-
export declare
|
|
44
|
-
constructor(path: string);
|
|
45
|
-
}
|
|
45
|
+
export declare function isDatabaseLockedError(error: unknown): error is DatabaseLockedError;
|
|
46
46
|
/**
|
|
47
|
-
*
|
|
47
|
+
* Type guard to check if an error is a DatabaseNotFoundError.
|
|
48
48
|
*/
|
|
49
|
-
export declare
|
|
50
|
-
constructor(query: string);
|
|
51
|
-
}
|
|
49
|
+
export declare function isDatabaseNotFoundError(error: unknown): error is DatabaseNotFoundError;
|
|
52
50
|
/**
|
|
53
|
-
*
|
|
51
|
+
* Type guard to check if an error is an InvalidConfigError.
|
|
54
52
|
*/
|
|
55
|
-
export declare function
|
|
53
|
+
export declare function isInvalidConfigError(error: unknown): error is InvalidConfigError;
|
|
56
54
|
//# sourceMappingURL=errors.d.ts.map
|
package/dist/lib/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;GAIG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,IAAI,EAAG,qBAAqB,CAAU;IAEtC,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAC;gBAED,IAAI,EAAE,MAAM;CAOzB;AAED;;;;GAIG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,IAAI,EAAG,uBAAuB,CAAU;IAExC,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;gBAED,IAAI,EAAE,MAAM;CAOzB;AAED;;;;GAIG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,IAAI,EAAG,oBAAoB,CAAU;IAErC,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IAEd,6BAA6B;IAC7B,KAAK,EAAE,OAAO,CAAC;gBAEH,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM;CAQ1D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,mBAAmB,CAElF;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,qBAAqB,CAEtF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CAEhF"}
|
package/dist/lib/errors.js
CHANGED
|
@@ -1,90 +1,79 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Custom error classes for library API
|
|
3
|
+
*
|
|
4
|
+
* IMPORTANT: This is a library interface for direct import and use in TypeScript/JavaScript
|
|
5
|
+
* projects, NOT a network/REST API.
|
|
3
6
|
*/
|
|
4
7
|
/**
|
|
5
|
-
*
|
|
8
|
+
* Thrown when database is locked by Cursor or another process.
|
|
9
|
+
*
|
|
10
|
+
* Recovery: Close Cursor IDE and retry, or implement custom retry logic.
|
|
6
11
|
*/
|
|
7
|
-
export
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
export class CliError extends Error {
|
|
18
|
-
exitCode;
|
|
19
|
-
constructor(message, exitCode = ExitCode.GENERAL_ERROR) {
|
|
20
|
-
super(message);
|
|
21
|
-
this.exitCode = exitCode;
|
|
22
|
-
this.name = 'CliError';
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Error for when no Cursor installation is found
|
|
27
|
-
*/
|
|
28
|
-
export class CursorNotFoundError extends CliError {
|
|
29
|
-
constructor(searchPath) {
|
|
30
|
-
super(`Cursor data not found at: ${searchPath}\n` +
|
|
31
|
-
'Make sure Cursor is installed and has been used at least once.\n' +
|
|
32
|
-
'You can specify a custom path with --data-path or CURSOR_DATA_PATH env var.', ExitCode.NOT_FOUND);
|
|
33
|
-
this.name = 'CursorNotFoundError';
|
|
12
|
+
export class DatabaseLockedError extends Error {
|
|
13
|
+
name = 'DatabaseLockedError';
|
|
14
|
+
/** Path to locked database file */
|
|
15
|
+
path;
|
|
16
|
+
constructor(path) {
|
|
17
|
+
super(`Database is locked: ${path}. Close Cursor or retry later.`);
|
|
18
|
+
this.path = path;
|
|
19
|
+
if (Error.captureStackTrace) {
|
|
20
|
+
Error.captureStackTrace(this, DatabaseLockedError);
|
|
21
|
+
}
|
|
34
22
|
}
|
|
35
23
|
}
|
|
36
24
|
/**
|
|
37
|
-
*
|
|
25
|
+
* Thrown when database file or directory does not exist.
|
|
26
|
+
*
|
|
27
|
+
* Recovery: Verify Cursor is installed, check dataPath configuration.
|
|
38
28
|
*/
|
|
39
|
-
export class
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
29
|
+
export class DatabaseNotFoundError extends Error {
|
|
30
|
+
name = 'DatabaseNotFoundError';
|
|
31
|
+
/** Path that was not found */
|
|
32
|
+
path;
|
|
33
|
+
constructor(path) {
|
|
34
|
+
super(`Database not found: ${path}. Check dataPath configuration.`);
|
|
35
|
+
this.path = path;
|
|
36
|
+
if (Error.captureStackTrace) {
|
|
37
|
+
Error.captureStackTrace(this, DatabaseNotFoundError);
|
|
38
|
+
}
|
|
43
39
|
}
|
|
44
40
|
}
|
|
45
41
|
/**
|
|
46
|
-
*
|
|
42
|
+
* Thrown when configuration parameters are invalid.
|
|
43
|
+
*
|
|
44
|
+
* Recovery: Fix configuration values per LibraryConfig validation rules.
|
|
47
45
|
*/
|
|
48
|
-
export class
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
46
|
+
export class InvalidConfigError extends Error {
|
|
47
|
+
name = 'InvalidConfigError';
|
|
48
|
+
/** Name of invalid config field */
|
|
49
|
+
field;
|
|
50
|
+
/** Invalid value provided */
|
|
51
|
+
value;
|
|
52
|
+
constructor(field, value, reason) {
|
|
53
|
+
super(`Invalid config.${field}: ${reason} (got: ${JSON.stringify(value)})`);
|
|
54
|
+
this.field = field;
|
|
55
|
+
this.value = value;
|
|
56
|
+
if (Error.captureStackTrace) {
|
|
57
|
+
Error.captureStackTrace(this, InvalidConfigError);
|
|
58
|
+
}
|
|
55
59
|
}
|
|
56
60
|
}
|
|
57
61
|
/**
|
|
58
|
-
*
|
|
62
|
+
* Type guard to check if an error is a DatabaseLockedError.
|
|
59
63
|
*/
|
|
60
|
-
export
|
|
61
|
-
|
|
62
|
-
super(`File already exists: ${path}\nUse --force to overwrite.`, ExitCode.IO_ERROR);
|
|
63
|
-
this.name = 'FileExistsError';
|
|
64
|
-
}
|
|
64
|
+
export function isDatabaseLockedError(error) {
|
|
65
|
+
return error instanceof DatabaseLockedError;
|
|
65
66
|
}
|
|
66
67
|
/**
|
|
67
|
-
*
|
|
68
|
+
* Type guard to check if an error is a DatabaseNotFoundError.
|
|
68
69
|
*/
|
|
69
|
-
export
|
|
70
|
-
|
|
71
|
-
super(`No results found for: "${query}"`, ExitCode.NOT_FOUND);
|
|
72
|
-
this.name = 'NoSearchResultsError';
|
|
73
|
-
}
|
|
70
|
+
export function isDatabaseNotFoundError(error) {
|
|
71
|
+
return error instanceof DatabaseNotFoundError;
|
|
74
72
|
}
|
|
75
73
|
/**
|
|
76
|
-
*
|
|
74
|
+
* Type guard to check if an error is an InvalidConfigError.
|
|
77
75
|
*/
|
|
78
|
-
export function
|
|
79
|
-
|
|
80
|
-
console.error(error.message);
|
|
81
|
-
process.exit(error.exitCode);
|
|
82
|
-
}
|
|
83
|
-
if (error instanceof Error) {
|
|
84
|
-
console.error(`Error: ${error.message}`);
|
|
85
|
-
process.exit(ExitCode.GENERAL_ERROR);
|
|
86
|
-
}
|
|
87
|
-
console.error('An unexpected error occurred');
|
|
88
|
-
process.exit(ExitCode.GENERAL_ERROR);
|
|
76
|
+
export function isInvalidConfigError(error) {
|
|
77
|
+
return error instanceof InvalidConfigError;
|
|
89
78
|
}
|
|
90
79
|
//# sourceMappingURL=errors.js.map
|
package/dist/lib/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;GAIG;AACH,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5C,IAAI,GAAG,qBAA8B,CAAC;IAEtC,mCAAmC;IACnC,IAAI,CAAS;IAEb,YAAY,IAAY;QACtB,KAAK,CAAC,uBAAuB,IAAI,gCAAgC,CAAC,CAAC;QACnE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAC5B,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAC9C,IAAI,GAAG,uBAAgC,CAAC;IAExC,8BAA8B;IAC9B,IAAI,CAAS;IAEb,YAAY,IAAY;QACtB,KAAK,CAAC,uBAAuB,IAAI,iCAAiC,CAAC,CAAC;QACpE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAC5B,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAC3C,IAAI,GAAG,oBAA6B,CAAC;IAErC,mCAAmC;IACnC,KAAK,CAAS;IAEd,6BAA6B;IAC7B,KAAK,CAAU;IAEf,YAAY,KAAa,EAAE,KAAc,EAAE,MAAc;QACvD,KAAK,CAAC,kBAAkB,KAAK,KAAK,MAAM,UAAU,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5E,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAC5B,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,OAAO,KAAK,YAAY,mBAAmB,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACpD,OAAO,KAAK,YAAY,qBAAqB,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,OAAO,KAAK,YAAY,kBAAkB,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cursor-history Library API
|
|
3
|
+
*
|
|
4
|
+
* IMPORTANT: This is a library interface for direct import and use in TypeScript/JavaScript
|
|
5
|
+
* projects, NOT a network/REST API. Functions are imported directly:
|
|
6
|
+
* `import { listSessions, getSession, searchSessions } from 'cursor-history'`
|
|
7
|
+
*/
|
|
8
|
+
export type { Session, Message, ToolCall, SearchResult, LibraryConfig, PaginatedResult, } from './types.js';
|
|
9
|
+
export { DatabaseLockedError, DatabaseNotFoundError, InvalidConfigError, isDatabaseLockedError, isDatabaseNotFoundError, isInvalidConfigError, } from './errors.js';
|
|
10
|
+
export { getDefaultDataPath } from './utils.js';
|
|
11
|
+
import type { LibraryConfig, PaginatedResult, Session, SearchResult } from './types.js';
|
|
12
|
+
/**
|
|
13
|
+
* List all chat sessions, optionally filtered and paginated.
|
|
14
|
+
*
|
|
15
|
+
* @param config - Optional configuration (dataPath, workspace filter, pagination)
|
|
16
|
+
* @returns Paginated result with sessions and metadata
|
|
17
|
+
* @throws {DatabaseLockedError} If database is locked by Cursor
|
|
18
|
+
* @throws {DatabaseNotFoundError} If database path does not exist
|
|
19
|
+
* @throws {InvalidConfigError} If config parameters are invalid
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* // List all sessions
|
|
23
|
+
* const result = listSessions();
|
|
24
|
+
* console.log(result.data); // Session[]
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* // List sessions with pagination
|
|
28
|
+
* const page1 = listSessions({ limit: 10, offset: 0 });
|
|
29
|
+
* const page2 = listSessions({ limit: 10, offset: 10 });
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* // List sessions for specific workspace
|
|
33
|
+
* const result = listSessions({ workspace: '/path/to/project' });
|
|
34
|
+
*/
|
|
35
|
+
export declare function listSessions(config?: LibraryConfig): PaginatedResult<Session>;
|
|
36
|
+
/**
|
|
37
|
+
* Get a specific session by index.
|
|
38
|
+
*
|
|
39
|
+
* @param index - Zero-based session index (from listSessions result)
|
|
40
|
+
* @param config - Optional configuration (dataPath)
|
|
41
|
+
* @returns Complete session with all messages
|
|
42
|
+
* @throws {DatabaseLockedError} If database is locked by Cursor
|
|
43
|
+
* @throws {DatabaseNotFoundError} If database path does not exist
|
|
44
|
+
* @throws {InvalidConfigError} If index is out of bounds
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* const session = getSession(0);
|
|
48
|
+
* console.log(session.messages); // Message[]
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* // Get session from custom data path
|
|
52
|
+
* const session = getSession(5, { dataPath: '/custom/cursor/data' });
|
|
53
|
+
*/
|
|
54
|
+
export declare function getSession(index: number, config?: LibraryConfig): Session;
|
|
55
|
+
/**
|
|
56
|
+
* Search across all sessions for matching content.
|
|
57
|
+
*
|
|
58
|
+
* @param query - Search query string (case-insensitive substring match)
|
|
59
|
+
* @param config - Optional configuration (dataPath, workspace filter, context lines)
|
|
60
|
+
* @returns Array of search results with context
|
|
61
|
+
* @throws {DatabaseLockedError} If database is locked by Cursor
|
|
62
|
+
* @throws {DatabaseNotFoundError} If database path does not exist
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* // Basic search
|
|
66
|
+
* const results = searchSessions('authentication');
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* // Search with context lines
|
|
70
|
+
* const results = searchSessions('error', { context: 2 });
|
|
71
|
+
* results.forEach(r => {
|
|
72
|
+
* console.log(r.contextBefore); // 2 lines before match
|
|
73
|
+
* console.log(r.match); // matched line
|
|
74
|
+
* console.log(r.contextAfter); // 2 lines after match
|
|
75
|
+
* });
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* // Search within specific workspace
|
|
79
|
+
* const results = searchSessions('bug', { workspace: '/path/to/project' });
|
|
80
|
+
*/
|
|
81
|
+
export declare function searchSessions(query: string, config?: LibraryConfig): SearchResult[];
|
|
82
|
+
/**
|
|
83
|
+
* Export a session to JSON format.
|
|
84
|
+
*
|
|
85
|
+
* @param index - Zero-based session index (from listSessions result)
|
|
86
|
+
* @param config - Optional configuration (dataPath)
|
|
87
|
+
* @returns JSON string representation of session
|
|
88
|
+
* @throws {DatabaseLockedError} If database is locked by Cursor
|
|
89
|
+
* @throws {DatabaseNotFoundError} If database path does not exist
|
|
90
|
+
* @throws {InvalidConfigError} If index is out of bounds
|
|
91
|
+
*
|
|
92
|
+
* @example
|
|
93
|
+
* const json = exportSessionToJson(0);
|
|
94
|
+
* fs.writeFileSync('session.json', json);
|
|
95
|
+
*/
|
|
96
|
+
export declare function exportSessionToJson(index: number, config?: LibraryConfig): string;
|
|
97
|
+
/**
|
|
98
|
+
* Export a session to Markdown format.
|
|
99
|
+
*
|
|
100
|
+
* @param index - Zero-based session index (from listSessions result)
|
|
101
|
+
* @param config - Optional configuration (dataPath)
|
|
102
|
+
* @returns Markdown formatted string
|
|
103
|
+
* @throws {DatabaseLockedError} If database is locked by Cursor
|
|
104
|
+
* @throws {DatabaseNotFoundError} If database path does not exist
|
|
105
|
+
* @throws {InvalidConfigError} If index is out of bounds
|
|
106
|
+
*
|
|
107
|
+
* @example
|
|
108
|
+
* const markdown = exportSessionToMarkdown(0);
|
|
109
|
+
* fs.writeFileSync('session.md', markdown);
|
|
110
|
+
*/
|
|
111
|
+
export declare function exportSessionToMarkdown(index: number, config?: LibraryConfig): string;
|
|
112
|
+
/**
|
|
113
|
+
* Export all sessions to JSON format.
|
|
114
|
+
*
|
|
115
|
+
* @param config - Optional configuration (dataPath, workspace filter)
|
|
116
|
+
* @returns JSON string with array of all sessions
|
|
117
|
+
* @throws {DatabaseLockedError} If database is locked by Cursor
|
|
118
|
+
* @throws {DatabaseNotFoundError} If database path does not exist
|
|
119
|
+
*
|
|
120
|
+
* @example
|
|
121
|
+
* const json = exportAllSessionsToJson();
|
|
122
|
+
* fs.writeFileSync('all-sessions.json', json);
|
|
123
|
+
*
|
|
124
|
+
* @example
|
|
125
|
+
* // Export sessions from specific workspace
|
|
126
|
+
* const json = exportAllSessionsToJson({ workspace: '/path/to/project' });
|
|
127
|
+
*/
|
|
128
|
+
export declare function exportAllSessionsToJson(config?: LibraryConfig): string;
|
|
129
|
+
/**
|
|
130
|
+
* Export all sessions to Markdown format.
|
|
131
|
+
*
|
|
132
|
+
* @param config - Optional configuration (dataPath, workspace filter)
|
|
133
|
+
* @returns Markdown formatted string with all sessions
|
|
134
|
+
* @throws {DatabaseLockedError} If database is locked by Cursor
|
|
135
|
+
* @throws {DatabaseNotFoundError} If database path does not exist
|
|
136
|
+
*
|
|
137
|
+
* @example
|
|
138
|
+
* const markdown = exportAllSessionsToMarkdown();
|
|
139
|
+
* fs.writeFileSync('all-sessions.md', markdown);
|
|
140
|
+
*/
|
|
141
|
+
export declare function exportAllSessionsToMarkdown(config?: LibraryConfig): string;
|
|
142
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,YAAY,EACV,OAAO,EACP,OAAO,EACP,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,eAAe,GAChB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EAClB,qBAAqB,EACrB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAGhD,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA8BxF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,eAAe,CAAC,OAAO,CAAC,CAyD7E;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CA6BzE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,YAAY,EAAE,CAmFpF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,MAAM,CAiBjF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,MAAM,CAiBrF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,MAAM,CA4BtE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,MAAM,CAgC1E"}
|