@aicqtools/provenance 1.0.0-alpha.10
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/LICENSE +21 -0
- package/dist/ai-bom/cyclonedx.d.ts +31 -0
- package/dist/ai-bom/cyclonedx.d.ts.map +1 -0
- package/dist/ai-bom/cyclonedx.js +29 -0
- package/dist/ai-bom/cyclonedx.js.map +1 -0
- package/dist/ai-bom/index.d.ts +2 -0
- package/dist/ai-bom/index.d.ts.map +1 -0
- package/dist/ai-bom/index.js +2 -0
- package/dist/ai-bom/index.js.map +1 -0
- package/dist/git-hook/capture.d.ts +14 -0
- package/dist/git-hook/capture.d.ts.map +1 -0
- package/dist/git-hook/capture.js +20 -0
- package/dist/git-hook/capture.js.map +1 -0
- package/dist/git-hook/git.d.ts +9 -0
- package/dist/git-hook/git.d.ts.map +1 -0
- package/dist/git-hook/git.js +54 -0
- package/dist/git-hook/git.js.map +1 -0
- package/dist/git-hook/index.d.ts +7 -0
- package/dist/git-hook/index.d.ts.map +1 -0
- package/dist/git-hook/index.js +5 -0
- package/dist/git-hook/index.js.map +1 -0
- package/dist/git-hook/persist.d.ts +4 -0
- package/dist/git-hook/persist.d.ts.map +1 -0
- package/dist/git-hook/persist.js +16 -0
- package/dist/git-hook/persist.js.map +1 -0
- package/dist/git-hook/session-source.d.ts +7 -0
- package/dist/git-hook/session-source.d.ts.map +1 -0
- package/dist/git-hook/session-source.js +39 -0
- package/dist/git-hook/session-source.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/reporter/article-50-html.d.ts +6 -0
- package/dist/reporter/article-50-html.d.ts.map +1 -0
- package/dist/reporter/article-50-html.js +143 -0
- package/dist/reporter/article-50-html.js.map +1 -0
- package/dist/reporter/article-50-pdf.d.ts +28 -0
- package/dist/reporter/article-50-pdf.d.ts.map +1 -0
- package/dist/reporter/article-50-pdf.js +36 -0
- package/dist/reporter/article-50-pdf.js.map +1 -0
- package/dist/reporter/article-50.d.ts +25 -0
- package/dist/reporter/article-50.d.ts.map +1 -0
- package/dist/reporter/article-50.js +29 -0
- package/dist/reporter/article-50.js.map +1 -0
- package/dist/reporter/index.d.ts +7 -0
- package/dist/reporter/index.d.ts.map +1 -0
- package/dist/reporter/index.js +4 -0
- package/dist/reporter/index.js.map +1 -0
- package/dist/session-readers/claude-code.d.ts +14 -0
- package/dist/session-readers/claude-code.d.ts.map +1 -0
- package/dist/session-readers/claude-code.js +105 -0
- package/dist/session-readers/claude-code.js.map +1 -0
- package/dist/session-readers/composite.d.ts +8 -0
- package/dist/session-readers/composite.d.ts.map +1 -0
- package/dist/session-readers/composite.js +16 -0
- package/dist/session-readers/composite.js.map +1 -0
- package/dist/session-readers/cursor.d.ts +49 -0
- package/dist/session-readers/cursor.d.ts.map +1 -0
- package/dist/session-readers/cursor.js +419 -0
- package/dist/session-readers/cursor.js.map +1 -0
- package/dist/session-readers/factory.d.ts +4 -0
- package/dist/session-readers/factory.d.ts.map +1 -0
- package/dist/session-readers/factory.js +17 -0
- package/dist/session-readers/factory.js.map +1 -0
- package/dist/session-readers/index.d.ts +10 -0
- package/dist/session-readers/index.d.ts.map +1 -0
- package/dist/session-readers/index.js +6 -0
- package/dist/session-readers/index.js.map +1 -0
- package/dist/session-readers/manual.d.ts +6 -0
- package/dist/session-readers/manual.d.ts.map +1 -0
- package/dist/session-readers/manual.js +8 -0
- package/dist/session-readers/manual.js.map +1 -0
- package/dist/session-readers/types.d.ts +10 -0
- package/dist/session-readers/types.d.ts.map +1 -0
- package/dist/session-readers/types.js +2 -0
- package/dist/session-readers/types.js.map +1 -0
- package/dist/types.d.ts +39 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ProvenanceRecord } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* EU AI Act Article 50 compliance report (skeleton).
|
|
4
|
+
*
|
|
5
|
+
* Article 50 requires disclosure of:
|
|
6
|
+
* - AI system identity (model + provider)
|
|
7
|
+
* - Generation timestamps
|
|
8
|
+
* - Human oversight points
|
|
9
|
+
* - Training data summary (where applicable)
|
|
10
|
+
*
|
|
11
|
+
* Phase 1a will produce both JSON (machine-readable) and PDF (auditor-friendly).
|
|
12
|
+
*/
|
|
13
|
+
export interface Article50Report {
|
|
14
|
+
readonly format: 'aicq-article50/0.1';
|
|
15
|
+
readonly generatedAt: string;
|
|
16
|
+
readonly aiSystems: ReadonlyArray<{
|
|
17
|
+
readonly tool: string;
|
|
18
|
+
readonly model: string;
|
|
19
|
+
readonly modelVersion: string | null;
|
|
20
|
+
readonly sessionCount: number;
|
|
21
|
+
}>;
|
|
22
|
+
readonly attributedFiles: readonly string[];
|
|
23
|
+
}
|
|
24
|
+
export declare function buildArticle50Report(record: ProvenanceRecord): Article50Report;
|
|
25
|
+
//# sourceMappingURL=article-50.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"article-50.d.ts","sourceRoot":"","sources":["../../src/reporter/article-50.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;IACtC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;QAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;QACrC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;KAC/B,CAAC,CAAC;IACH,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7C;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,GAAG,eAAe,CA0B9E"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export function buildArticle50Report(record) {
|
|
2
|
+
const systems = new Map();
|
|
3
|
+
for (const s of record.sessions) {
|
|
4
|
+
const key = `${s.tool}|${s.model}|${s.modelVersion ?? ''}`;
|
|
5
|
+
const existing = systems.get(key);
|
|
6
|
+
if (existing)
|
|
7
|
+
existing.count += 1;
|
|
8
|
+
else
|
|
9
|
+
systems.set(key, {
|
|
10
|
+
tool: s.tool,
|
|
11
|
+
model: s.model,
|
|
12
|
+
modelVersion: s.modelVersion ?? null,
|
|
13
|
+
count: 1,
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
const files = new Set(record.attributions.map((a) => a.filePath));
|
|
17
|
+
return {
|
|
18
|
+
format: 'aicq-article50/0.1',
|
|
19
|
+
generatedAt: new Date().toISOString(),
|
|
20
|
+
aiSystems: [...systems.values()].map((s) => ({
|
|
21
|
+
tool: s.tool,
|
|
22
|
+
model: s.model,
|
|
23
|
+
modelVersion: s.modelVersion,
|
|
24
|
+
sessionCount: s.count,
|
|
25
|
+
})),
|
|
26
|
+
attributedFiles: [...files],
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=article-50.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"article-50.js","sourceRoot":"","sources":["../../src/reporter/article-50.ts"],"names":[],"mappings":"AA0BA,MAAM,UAAU,oBAAoB,CAAC,MAAwB;IAC3D,MAAM,OAAO,GAAG,IAAI,GAAG,EAAuF,CAAC;IAC/G,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,YAAY,IAAI,EAAE,EAAE,CAAC;QAC3D,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,QAAQ;YAAE,QAAQ,CAAC,KAAK,IAAI,CAAC,CAAC;;YAEhC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE;gBACf,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,YAAY,EAAE,CAAC,CAAC,YAAY,IAAI,IAAI;gBACpC,KAAK,EAAE,CAAC;aACT,CAAC,CAAC;IACP,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClE,OAAO;QACL,MAAM,EAAE,oBAAoB;QAC5B,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,SAAS,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3C,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,YAAY,EAAE,CAAC,CAAC,YAAY;YAC5B,YAAY,EAAE,CAAC,CAAC,KAAK;SACtB,CAAC,CAAC;QACH,eAAe,EAAE,CAAC,GAAG,KAAK,CAAC;KAC5B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { buildArticle50Report } from './article-50.js';
|
|
2
|
+
export type { Article50Report } from './article-50.js';
|
|
3
|
+
export { renderArticle50Html } from './article-50-html.js';
|
|
4
|
+
export type { RenderHtmlOptions } from './article-50-html.js';
|
|
5
|
+
export { renderArticle50Pdf, loadPuppeteer } from './article-50-pdf.js';
|
|
6
|
+
export type { RenderPdfOptions } from './article-50-pdf.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/reporter/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,YAAY,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACxE,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/reporter/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { SessionReader, SessionReaderResult } from './types.js';
|
|
2
|
+
export declare function encodeClaudeProjectId(cwd: string): string;
|
|
3
|
+
export interface ClaudeCodeReaderOptions {
|
|
4
|
+
readonly homeDir?: string;
|
|
5
|
+
readonly maxSessions?: number;
|
|
6
|
+
}
|
|
7
|
+
export declare class ClaudeCodeSessionReader implements SessionReader {
|
|
8
|
+
readonly id = "claude-code";
|
|
9
|
+
private readonly homeDir;
|
|
10
|
+
private readonly maxSessions;
|
|
11
|
+
constructor(opts?: ClaudeCodeReaderOptions);
|
|
12
|
+
read(cwd: string): Promise<SessionReaderResult>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=claude-code.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../src/session-readers/claude-code.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAErE,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEzD;AAcD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,qBAAa,uBAAwB,YAAW,aAAa;IAC3D,QAAQ,CAAC,EAAE,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,IAAI,GAAE,uBAA4B;IAKxC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAsBtD"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { readFile, readdir, stat } from 'node:fs/promises';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { join, resolve } from 'node:path';
|
|
5
|
+
export function encodeClaudeProjectId(cwd) {
|
|
6
|
+
return resolve(cwd).replace(/[\\/:\s]/g, '-');
|
|
7
|
+
}
|
|
8
|
+
export class ClaudeCodeSessionReader {
|
|
9
|
+
id = 'claude-code';
|
|
10
|
+
homeDir;
|
|
11
|
+
maxSessions;
|
|
12
|
+
constructor(opts = {}) {
|
|
13
|
+
this.homeDir = opts.homeDir ?? homedir();
|
|
14
|
+
this.maxSessions = opts.maxSessions ?? 10;
|
|
15
|
+
}
|
|
16
|
+
async read(cwd) {
|
|
17
|
+
const projectsDir = join(this.homeDir, '.claude', 'projects');
|
|
18
|
+
const projectDir = join(projectsDir, encodeClaudeProjectId(cwd));
|
|
19
|
+
if (!existsSync(projectDir))
|
|
20
|
+
return { sessions: [], prompts: [] };
|
|
21
|
+
const entries = await readdir(projectDir);
|
|
22
|
+
const jsonlPaths = entries.filter((f) => f.endsWith('.jsonl')).map((f) => join(projectDir, f));
|
|
23
|
+
if (jsonlPaths.length === 0)
|
|
24
|
+
return { sessions: [], prompts: [] };
|
|
25
|
+
const withMtime = await Promise.all(jsonlPaths.map(async (path) => ({ path, mtime: (await stat(path)).mtimeMs })));
|
|
26
|
+
withMtime.sort((a, b) => b.mtime - a.mtime);
|
|
27
|
+
const sessions = [];
|
|
28
|
+
const prompts = [];
|
|
29
|
+
for (const { path } of withMtime.slice(0, this.maxSessions)) {
|
|
30
|
+
const session = await parseJsonlSession(path, prompts);
|
|
31
|
+
if (session)
|
|
32
|
+
sessions.push(session);
|
|
33
|
+
}
|
|
34
|
+
return { sessions, prompts };
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
async function parseJsonlSession(path, promptsOut) {
|
|
38
|
+
const raw = await readFile(path, 'utf-8');
|
|
39
|
+
const lines = raw.split('\n').filter((l) => l.length > 0);
|
|
40
|
+
if (lines.length === 0)
|
|
41
|
+
return null;
|
|
42
|
+
let sessionId = null;
|
|
43
|
+
let firstTimestamp = null;
|
|
44
|
+
let lastTimestamp = null;
|
|
45
|
+
let version = null;
|
|
46
|
+
let model = null;
|
|
47
|
+
let promptIndex = 0;
|
|
48
|
+
for (const line of lines) {
|
|
49
|
+
let entry;
|
|
50
|
+
try {
|
|
51
|
+
entry = JSON.parse(line);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
if (entry.sessionId && !sessionId)
|
|
57
|
+
sessionId = entry.sessionId;
|
|
58
|
+
if (entry.version && !version)
|
|
59
|
+
version = entry.version;
|
|
60
|
+
if (entry.timestamp) {
|
|
61
|
+
if (!firstTimestamp)
|
|
62
|
+
firstTimestamp = entry.timestamp;
|
|
63
|
+
lastTimestamp = entry.timestamp;
|
|
64
|
+
}
|
|
65
|
+
if (entry.type === 'assistant' && entry.message?.model && !model) {
|
|
66
|
+
model = entry.message.model;
|
|
67
|
+
}
|
|
68
|
+
if (entry.type === 'user' && entry.message?.role === 'user') {
|
|
69
|
+
const text = extractUserText(entry.message.content);
|
|
70
|
+
if (text && sessionId && entry.timestamp) {
|
|
71
|
+
promptsOut.push({
|
|
72
|
+
sessionId,
|
|
73
|
+
index: promptIndex++,
|
|
74
|
+
prompt: text,
|
|
75
|
+
timestamp: entry.timestamp,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (!sessionId || !firstTimestamp)
|
|
81
|
+
return null;
|
|
82
|
+
return {
|
|
83
|
+
sessionId,
|
|
84
|
+
tool: 'claude-code',
|
|
85
|
+
model: model ?? 'unknown',
|
|
86
|
+
...(version ? { modelVersion: version } : {}),
|
|
87
|
+
startedAt: firstTimestamp,
|
|
88
|
+
...(lastTimestamp && lastTimestamp !== firstTimestamp ? { endedAt: lastTimestamp } : {}),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
function extractUserText(content) {
|
|
92
|
+
if (!content || !Array.isArray(content))
|
|
93
|
+
return null;
|
|
94
|
+
const parts = [];
|
|
95
|
+
for (const c of content) {
|
|
96
|
+
if (c.type === 'text' && typeof c.text === 'string') {
|
|
97
|
+
const text = c.text;
|
|
98
|
+
if (text.startsWith('<ide_') || text.startsWith('<system-'))
|
|
99
|
+
continue;
|
|
100
|
+
parts.push(text);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return parts.length > 0 ? parts.join('\n') : null;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=claude-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/session-readers/claude-code.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { SessionReader, SessionReaderResult } from './types.js';
|
|
2
|
+
export declare class CompositeSessionReader implements SessionReader {
|
|
3
|
+
readonly id: string;
|
|
4
|
+
private readonly readers;
|
|
5
|
+
constructor(readers: readonly SessionReader[], id?: string);
|
|
6
|
+
read(cwd: string): Promise<SessionReaderResult>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=composite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composite.d.ts","sourceRoot":"","sources":["../../src/session-readers/composite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAErE,qBAAa,sBAAuB,YAAW,aAAa;IAC1D,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;gBAEvC,OAAO,EAAE,SAAS,aAAa,EAAE,EAAE,EAAE,SAAc;IAKzD,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAWtD"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export class CompositeSessionReader {
|
|
2
|
+
id;
|
|
3
|
+
readers;
|
|
4
|
+
constructor(readers, id = 'composite') {
|
|
5
|
+
this.readers = readers;
|
|
6
|
+
this.id = id;
|
|
7
|
+
}
|
|
8
|
+
async read(cwd) {
|
|
9
|
+
const results = await Promise.all(this.readers.map((r) => r.read(cwd).catch(() => ({ sessions: [], prompts: [] }))));
|
|
10
|
+
return {
|
|
11
|
+
sessions: results.flatMap((r) => r.sessions),
|
|
12
|
+
prompts: results.flatMap((r) => r.prompts),
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=composite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composite.js","sourceRoot":"","sources":["../../src/session-readers/composite.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,sBAAsB;IACxB,EAAE,CAAS;IACH,OAAO,CAA2B;IAEnD,YAAY,OAAiC,EAAE,EAAE,GAAG,WAAW;QAC7D,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW;QACpB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACrB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAwB,CAAC,CAChF,CACF,CAAC;QACF,OAAO;YACL,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;YAC5C,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;SAC3C,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { AiPromptRecord, AiSession } from '../types.js';
|
|
2
|
+
import type { SessionReader, SessionReaderResult } from './types.js';
|
|
3
|
+
export interface CursorReaderOptions {
|
|
4
|
+
readonly home?: string;
|
|
5
|
+
readonly platformOverride?: NodeJS.Platform;
|
|
6
|
+
readonly appDataOverride?: string;
|
|
7
|
+
readonly maxWorkspaces?: number;
|
|
8
|
+
readonly maxDatabases?: number;
|
|
9
|
+
}
|
|
10
|
+
export declare function getCursorWorkspaceStorageDir(opts: {
|
|
11
|
+
home: string;
|
|
12
|
+
platform: NodeJS.Platform;
|
|
13
|
+
appData?: string;
|
|
14
|
+
}): string | null;
|
|
15
|
+
export declare function getCursorGlobalStorageDir(opts: {
|
|
16
|
+
home: string;
|
|
17
|
+
platform: NodeJS.Platform;
|
|
18
|
+
appData?: string;
|
|
19
|
+
}): string | null;
|
|
20
|
+
/**
|
|
21
|
+
* Reads Cursor AI-chat history from `state.vscdb` (SQLite) — workspace storage
|
|
22
|
+
* (`ItemTable`) and global storage (`ItemTable` + `cursorDiskKV`). Best-effort:
|
|
23
|
+
* Cursor's schema shifts between versions, so unrecognized/changed shapes degrade
|
|
24
|
+
* to detection-only (a single `cursor-detected-*` session, no prompts) and the
|
|
25
|
+
* reader never throws (per-file isolation policy).
|
|
26
|
+
*/
|
|
27
|
+
export declare class CursorSessionReader implements SessionReader {
|
|
28
|
+
readonly id = "cursor";
|
|
29
|
+
private readonly home;
|
|
30
|
+
private readonly platform;
|
|
31
|
+
private readonly appData;
|
|
32
|
+
private readonly maxWorkspaces;
|
|
33
|
+
private readonly maxDatabases;
|
|
34
|
+
constructor(opts?: CursorReaderOptions);
|
|
35
|
+
read(_cwd: string): Promise<SessionReaderResult>;
|
|
36
|
+
private collectVscdbCandidates;
|
|
37
|
+
}
|
|
38
|
+
interface NormalizeResult {
|
|
39
|
+
readonly sessions: AiSession[];
|
|
40
|
+
readonly prompts: AiPromptRecord[];
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Probes known Cursor chat-payload shapes in order; the first probe yielding at
|
|
44
|
+
* least one non-empty prompt wins. Loose type-guards only — never assume a key
|
|
45
|
+
* exists, ignore unknown fields, never throw.
|
|
46
|
+
*/
|
|
47
|
+
export declare function normalizeCursorChat(raw: unknown, dbMtimeMs: number): NormalizeResult;
|
|
48
|
+
export {};
|
|
49
|
+
//# sourceMappingURL=cursor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/session-readers/cursor.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAErE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC5C,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAcD,wBAAgB,4BAA4B,CAAC,IAAI,EAAE;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,MAAM,GAAG,IAAI,CAShB;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,MAAM,GAAG,IAAI,CAShB;AAOD;;;;;;GAMG;AACH,qBAAa,mBAAoB,YAAW,aAAa;IACvD,QAAQ,CAAC,EAAE,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAE1B,IAAI,GAAE,mBAAwB;IAQpC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;YAqBxC,sBAAsB;CA0CrC;AAED,UAAU,eAAe;IACvB,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,cAAc,EAAE,CAAC;CACpC;AA8GD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,eAAe,CAyBpF"}
|