@aicqtools/provenance 1.0.0-alpha.2
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 +27 -0
- package/dist/session-readers/cursor.d.ts.map +1 -0
- package/dist/session-readers/cursor.js +74 -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 +61 -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":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAI1C,MAAM,UAAU,qBAAqB,CAAC,GAAW;IAC/C,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;AAChD,CAAC;AAmBD,MAAM,OAAO,uBAAuB;IACzB,EAAE,GAAG,aAAa,CAAC;IACX,OAAO,CAAS;IAChB,WAAW,CAAS;IAErC,YAAY,OAAgC,EAAE;QAC5C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,OAAO,EAAE,CAAC;QACzC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW;QACpB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QAC9D,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC;QACjE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QAElE,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/F,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QAElE,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CACjC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAC9E,CAAC;QACF,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QAE5C,MAAM,QAAQ,GAAgB,EAAE,CAAC;QACjC,MAAM,OAAO,GAAqB,EAAE,CAAC;QACrC,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5D,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACvD,IAAI,OAAO;gBAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IAC/B,CAAC;CACF;AAED,KAAK,UAAU,iBAAiB,CAC9B,IAAY,EACZ,UAA4B;IAE5B,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC1D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEpC,IAAI,SAAS,GAAkB,IAAI,CAAC;IACpC,IAAI,cAAc,GAAkB,IAAI,CAAC;IACzC,IAAI,aAAa,GAAkB,IAAI,CAAC;IACxC,IAAI,OAAO,GAAkB,IAAI,CAAC;IAClC,IAAI,KAAK,GAAkB,IAAI,CAAC;IAChC,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,KAAiB,CAAC;QACtB,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAe,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QAED,IAAI,KAAK,CAAC,SAAS,IAAI,CAAC,SAAS;YAAE,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QAC/D,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,OAAO;YAAE,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QACvD,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,cAAc;gBAAE,cAAc,GAAG,KAAK,CAAC,SAAS,CAAC;YACtD,aAAa,GAAG,KAAK,CAAC,SAAS,CAAC;QAClC,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;YACjE,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAC9B,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC;YAC5D,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACpD,IAAI,IAAI,IAAI,SAAS,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACzC,UAAU,CAAC,IAAI,CAAC;oBACd,SAAS;oBACT,KAAK,EAAE,WAAW,EAAE;oBACpB,MAAM,EAAE,IAAI;oBACZ,SAAS,EAAE,KAAK,CAAC,SAAS;iBAC3B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,SAAS,IAAI,CAAC,cAAc;QAAE,OAAO,IAAI,CAAC;IAE/C,OAAO;QACL,SAAS;QACT,IAAI,EAAE,aAAa;QACnB,KAAK,EAAE,KAAK,IAAI,SAAS;QACzB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,SAAS,EAAE,cAAc;QACzB,GAAG,CAAC,aAAa,IAAI,aAAa,KAAK,cAAc,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzF,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,OAAgD;IACvE,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IACrD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACpD,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;YACpB,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;gBAAE,SAAS;YACtE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACpD,CAAC"}
|
|
@@ -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,27 @@
|
|
|
1
|
+
import type { SessionReader, SessionReaderResult } from './types.js';
|
|
2
|
+
export interface CursorReaderOptions {
|
|
3
|
+
readonly home?: string;
|
|
4
|
+
readonly platformOverride?: NodeJS.Platform;
|
|
5
|
+
readonly appDataOverride?: string;
|
|
6
|
+
readonly maxWorkspaces?: number;
|
|
7
|
+
}
|
|
8
|
+
export declare function getCursorWorkspaceStorageDir(opts: {
|
|
9
|
+
home: string;
|
|
10
|
+
platform: NodeJS.Platform;
|
|
11
|
+
appData?: string;
|
|
12
|
+
}): string | null;
|
|
13
|
+
/**
|
|
14
|
+
* Detects Cursor usage by scanning workspaceStorage for `state.vscdb`.
|
|
15
|
+
* Beta-lite scope: detection only — prompt extraction lands in v1.0 stable
|
|
16
|
+
* when the SQLite schema stabilizes across Cursor versions.
|
|
17
|
+
*/
|
|
18
|
+
export declare class CursorSessionReader implements SessionReader {
|
|
19
|
+
readonly id = "cursor";
|
|
20
|
+
private readonly home;
|
|
21
|
+
private readonly platform;
|
|
22
|
+
private readonly appData;
|
|
23
|
+
private readonly maxWorkspaces;
|
|
24
|
+
constructor(opts?: CursorReaderOptions);
|
|
25
|
+
read(_cwd: string): Promise<SessionReaderResult>;
|
|
26
|
+
}
|
|
27
|
+
//# 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,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;CACjC;AAED,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;;;;GAIG;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;gBAE3B,IAAI,GAAE,mBAAwB;IAOpC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAsCvD"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { readdir, stat } from 'node:fs/promises';
|
|
3
|
+
import { homedir, platform } from 'node:os';
|
|
4
|
+
import { join, posix, win32 } from 'node:path';
|
|
5
|
+
export function getCursorWorkspaceStorageDir(opts) {
|
|
6
|
+
if (opts.platform === 'win32') {
|
|
7
|
+
if (!opts.appData)
|
|
8
|
+
return null;
|
|
9
|
+
return win32.join(opts.appData, 'Cursor', 'User', 'workspaceStorage');
|
|
10
|
+
}
|
|
11
|
+
if (opts.platform === 'darwin') {
|
|
12
|
+
return posix.join(opts.home, 'Library', 'Application Support', 'Cursor', 'User', 'workspaceStorage');
|
|
13
|
+
}
|
|
14
|
+
return posix.join(opts.home, '.config', 'Cursor', 'User', 'workspaceStorage');
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Detects Cursor usage by scanning workspaceStorage for `state.vscdb`.
|
|
18
|
+
* Beta-lite scope: detection only — prompt extraction lands in v1.0 stable
|
|
19
|
+
* when the SQLite schema stabilizes across Cursor versions.
|
|
20
|
+
*/
|
|
21
|
+
export class CursorSessionReader {
|
|
22
|
+
id = 'cursor';
|
|
23
|
+
home;
|
|
24
|
+
platform;
|
|
25
|
+
appData;
|
|
26
|
+
maxWorkspaces;
|
|
27
|
+
constructor(opts = {}) {
|
|
28
|
+
this.home = opts.home ?? homedir();
|
|
29
|
+
this.platform = opts.platformOverride ?? platform();
|
|
30
|
+
this.appData = opts.appDataOverride ?? process.env['APPDATA'];
|
|
31
|
+
this.maxWorkspaces = opts.maxWorkspaces ?? 50;
|
|
32
|
+
}
|
|
33
|
+
async read(_cwd) {
|
|
34
|
+
const dir = getCursorWorkspaceStorageDir({
|
|
35
|
+
home: this.home,
|
|
36
|
+
platform: this.platform,
|
|
37
|
+
...(this.appData ? { appData: this.appData } : {}),
|
|
38
|
+
});
|
|
39
|
+
if (!dir || !existsSync(dir))
|
|
40
|
+
return { sessions: [], prompts: [] };
|
|
41
|
+
let workspaces;
|
|
42
|
+
try {
|
|
43
|
+
workspaces = (await readdir(dir)).slice(0, this.maxWorkspaces);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return { sessions: [], prompts: [] };
|
|
47
|
+
}
|
|
48
|
+
let mostRecent = 0;
|
|
49
|
+
for (const ws of workspaces) {
|
|
50
|
+
const dbPath = join(dir, ws, 'state.vscdb');
|
|
51
|
+
if (!existsSync(dbPath))
|
|
52
|
+
continue;
|
|
53
|
+
try {
|
|
54
|
+
const m = await stat(dbPath);
|
|
55
|
+
if (m.mtimeMs > mostRecent)
|
|
56
|
+
mostRecent = m.mtimeMs;
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (mostRecent === 0)
|
|
63
|
+
return { sessions: [], prompts: [] };
|
|
64
|
+
const startedAt = new Date(mostRecent).toISOString();
|
|
65
|
+
const session = {
|
|
66
|
+
sessionId: `cursor-detected-${mostRecent}`,
|
|
67
|
+
tool: 'cursor',
|
|
68
|
+
model: 'unknown',
|
|
69
|
+
startedAt,
|
|
70
|
+
};
|
|
71
|
+
return { sessions: [session], prompts: [] };
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=cursor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/session-readers/cursor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/session-readers/factory.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,aAAa,GAAG,QAAQ,GAAG,KAAK,CAAC;AAErE,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,aAAa,CAc5D"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ClaudeCodeSessionReader } from './claude-code.js';
|
|
2
|
+
import { CompositeSessionReader } from './composite.js';
|
|
3
|
+
import { CursorSessionReader } from './cursor.js';
|
|
4
|
+
import { ManualSessionReader } from './manual.js';
|
|
5
|
+
export function createReader(name) {
|
|
6
|
+
switch (name) {
|
|
7
|
+
case 'manual':
|
|
8
|
+
return new ManualSessionReader();
|
|
9
|
+
case 'claude-code':
|
|
10
|
+
return new ClaudeCodeSessionReader();
|
|
11
|
+
case 'cursor':
|
|
12
|
+
return new CursorSessionReader();
|
|
13
|
+
case 'all':
|
|
14
|
+
return new CompositeSessionReader([new ManualSessionReader(), new ClaudeCodeSessionReader(), new CursorSessionReader()], 'all');
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/session-readers/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAKlD,MAAM,UAAU,YAAY,CAAC,IAAgB;IAC3C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ;YACX,OAAO,IAAI,mBAAmB,EAAE,CAAC;QACnC,KAAK,aAAa;YAChB,OAAO,IAAI,uBAAuB,EAAE,CAAC;QACvC,KAAK,QAAQ;YACX,OAAO,IAAI,mBAAmB,EAAE,CAAC;QACnC,KAAK,KAAK;YACR,OAAO,IAAI,sBAAsB,CAC/B,CAAC,IAAI,mBAAmB,EAAE,EAAE,IAAI,uBAAuB,EAAE,EAAE,IAAI,mBAAmB,EAAE,CAAC,EACrF,KAAK,CACN,CAAC;IACN,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type { SessionReader, SessionReaderResult } from './types.js';
|
|
2
|
+
export { ManualSessionReader } from './manual.js';
|
|
3
|
+
export { ClaudeCodeSessionReader, encodeClaudeProjectId } from './claude-code.js';
|
|
4
|
+
export type { ClaudeCodeReaderOptions } from './claude-code.js';
|
|
5
|
+
export { CursorSessionReader, getCursorWorkspaceStorageDir } from './cursor.js';
|
|
6
|
+
export type { CursorReaderOptions } from './cursor.js';
|
|
7
|
+
export { CompositeSessionReader } from './composite.js';
|
|
8
|
+
export { createReader } from './factory.js';
|
|
9
|
+
export type { ReaderName } from './factory.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/session-readers/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAClF,YAAY,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAC;AAChF,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { ManualSessionReader } from './manual.js';
|
|
2
|
+
export { ClaudeCodeSessionReader, encodeClaudeProjectId } from './claude-code.js';
|
|
3
|
+
export { CursorSessionReader, getCursorWorkspaceStorageDir } from './cursor.js';
|
|
4
|
+
export { CompositeSessionReader } from './composite.js';
|
|
5
|
+
export { createReader } from './factory.js';
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/session-readers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAElF,OAAO,EAAE,mBAAmB,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAC;AAEhF,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manual.d.ts","sourceRoot":"","sources":["../../src/session-readers/manual.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAErE,qBAAa,mBAAoB,YAAW,aAAa;IACvD,QAAQ,CAAC,EAAE,YAAY;IAEjB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAGtD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manual.js","sourceRoot":"","sources":["../../src/session-readers/manual.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAGnE,MAAM,OAAO,mBAAmB;IACrB,EAAE,GAAG,QAAQ,CAAC;IAEvB,KAAK,CAAC,IAAI,CAAC,GAAW;QACpB,OAAO,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AiSession, AiPromptRecord } from '../types.js';
|
|
2
|
+
export interface SessionReaderResult {
|
|
3
|
+
readonly sessions: readonly AiSession[];
|
|
4
|
+
readonly prompts: readonly AiPromptRecord[];
|
|
5
|
+
}
|
|
6
|
+
export interface SessionReader {
|
|
7
|
+
readonly id: string;
|
|
8
|
+
read(cwd: string): Promise<SessionReaderResult>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/session-readers/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7D,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,SAAS,SAAS,EAAE,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,CAAC;CAC7C;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACjD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/session-readers/types.ts"],"names":[],"mappings":""}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI code provenance types.
|
|
3
|
+
*
|
|
4
|
+
* Aligned with EU AI Act Article 50 (transparency obligations) and
|
|
5
|
+
* CycloneDX AI-BOM spec. Phase 0 freezes the type surface so Phase 1a
|
|
6
|
+
* implementation can populate it.
|
|
7
|
+
*/
|
|
8
|
+
export type AiTool = 'claude-code' | 'cursor' | 'copilot' | 'chatgpt' | 'unknown';
|
|
9
|
+
export interface AiSession {
|
|
10
|
+
readonly sessionId: string;
|
|
11
|
+
readonly tool: AiTool;
|
|
12
|
+
readonly model: string;
|
|
13
|
+
readonly modelVersion?: string;
|
|
14
|
+
readonly startedAt: string;
|
|
15
|
+
readonly endedAt?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface AiPromptRecord {
|
|
18
|
+
readonly sessionId: string;
|
|
19
|
+
readonly index: number;
|
|
20
|
+
readonly prompt: string;
|
|
21
|
+
readonly response?: string;
|
|
22
|
+
readonly timestamp: string;
|
|
23
|
+
}
|
|
24
|
+
export interface CodeAttribution {
|
|
25
|
+
readonly filePath: string;
|
|
26
|
+
readonly startLine: number;
|
|
27
|
+
readonly endLine: number;
|
|
28
|
+
readonly sessionId: string;
|
|
29
|
+
readonly promptIndex?: number;
|
|
30
|
+
readonly humanEdited: boolean;
|
|
31
|
+
}
|
|
32
|
+
export interface ProvenanceRecord {
|
|
33
|
+
readonly version: '0.1';
|
|
34
|
+
readonly sessions: readonly AiSession[];
|
|
35
|
+
readonly prompts: readonly AiPromptRecord[];
|
|
36
|
+
readonly attributions: readonly CodeAttribution[];
|
|
37
|
+
readonly capturedAt: string;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,MAAM,GAAG,aAAa,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAElF,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,SAAS,SAAS,EAAE,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,CAAC;IAC5C,QAAQ,CAAC,YAAY,EAAE,SAAS,eAAe,EAAE,CAAC;IAClD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI code provenance types.
|
|
3
|
+
*
|
|
4
|
+
* Aligned with EU AI Act Article 50 (transparency obligations) and
|
|
5
|
+
* CycloneDX AI-BOM spec. Phase 0 freezes the type surface so Phase 1a
|
|
6
|
+
* implementation can populate it.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
package/package.json
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@aicqtools/provenance",
|
|
3
|
+
"version": "1.0.0-alpha.2",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "AI code provenance tracker — Git pre-commit capture, CycloneDX 1.6 AI-BOM emitter, EU AI Act Article 50 reporter.",
|
|
6
|
+
"keywords": [
|
|
7
|
+
"aicq",
|
|
8
|
+
"aicqtools",
|
|
9
|
+
"ai-provenance",
|
|
10
|
+
"eu-ai-act",
|
|
11
|
+
"cyclonedx",
|
|
12
|
+
"ai-bom",
|
|
13
|
+
"compliance"
|
|
14
|
+
],
|
|
15
|
+
"homepage": "https://github.com/aicqtools/aicqtools/tree/main/modules/provenance",
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "https://github.com/aicqtools/aicqtools.git",
|
|
19
|
+
"directory": "modules/provenance"
|
|
20
|
+
},
|
|
21
|
+
"bugs": "https://github.com/aicqtools/aicqtools/issues",
|
|
22
|
+
"author": "Eom Sik <neuralflux3@gmail.com>",
|
|
23
|
+
"license": "MIT",
|
|
24
|
+
"main": "./dist/index.js",
|
|
25
|
+
"types": "./dist/index.d.ts",
|
|
26
|
+
"exports": {
|
|
27
|
+
".": "./dist/index.js",
|
|
28
|
+
"./ai-bom": "./dist/ai-bom/index.js",
|
|
29
|
+
"./git-hook": "./dist/git-hook/index.js",
|
|
30
|
+
"./reporter": "./dist/reporter/index.js"
|
|
31
|
+
},
|
|
32
|
+
"files": [
|
|
33
|
+
"dist/",
|
|
34
|
+
"README.md"
|
|
35
|
+
],
|
|
36
|
+
"publishConfig": {
|
|
37
|
+
"access": "public"
|
|
38
|
+
},
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"@aicqtools/core": "1.0.0-alpha.2"
|
|
41
|
+
},
|
|
42
|
+
"peerDependencies": {
|
|
43
|
+
"puppeteer": ">=22.0.0"
|
|
44
|
+
},
|
|
45
|
+
"peerDependenciesMeta": {
|
|
46
|
+
"puppeteer": {
|
|
47
|
+
"optional": true
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@types/node": "^22.10.0",
|
|
52
|
+
"typescript": "^5.7.2",
|
|
53
|
+
"vitest": "^2.1.8"
|
|
54
|
+
},
|
|
55
|
+
"scripts": {
|
|
56
|
+
"build": "tsc",
|
|
57
|
+
"test": "vitest run --passWithNoTests",
|
|
58
|
+
"typecheck": "tsc --noEmit",
|
|
59
|
+
"clean": "rm -rf dist .turbo"
|
|
60
|
+
}
|
|
61
|
+
}
|