@logsesh/core 0.1.1
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/README.md +69 -0
- package/dist/adapters/claude-code.d.ts +3 -0
- package/dist/adapters/claude-code.d.ts.map +1 -0
- package/dist/adapters/claude-code.js +307 -0
- package/dist/adapters/claude-code.js.map +1 -0
- package/dist/adapters/codex-schemas.d.ts +59 -0
- package/dist/adapters/codex-schemas.d.ts.map +1 -0
- package/dist/adapters/codex-schemas.js +70 -0
- package/dist/adapters/codex-schemas.js.map +1 -0
- package/dist/adapters/codex.d.ts +3 -0
- package/dist/adapters/codex.d.ts.map +1 -0
- package/dist/adapters/codex.js +293 -0
- package/dist/adapters/codex.js.map +1 -0
- package/dist/adapters/gemini.d.ts +3 -0
- package/dist/adapters/gemini.d.ts.map +1 -0
- package/dist/adapters/gemini.js +193 -0
- package/dist/adapters/gemini.js.map +1 -0
- package/dist/adapters/index.d.ts +14 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +64 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/discovery.d.ts +20 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +115 -0
- package/dist/discovery.js.map +1 -0
- package/dist/doctor.d.ts +32 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +68 -0
- package/dist/doctor.js.map +1 -0
- package/dist/export-safety.d.ts +6 -0
- package/dist/export-safety.d.ts.map +1 -0
- package/dist/export-safety.js +36 -0
- package/dist/export-safety.js.map +1 -0
- package/dist/exporters/csv.d.ts +4 -0
- package/dist/exporters/csv.d.ts.map +1 -0
- package/dist/exporters/csv.js +38 -0
- package/dist/exporters/csv.js.map +1 -0
- package/dist/exporters/json.d.ts +4 -0
- package/dist/exporters/json.d.ts.map +1 -0
- package/dist/exporters/json.js +14 -0
- package/dist/exporters/json.js.map +1 -0
- package/dist/exporters/jsonl.d.ts +4 -0
- package/dist/exporters/jsonl.d.ts.map +1 -0
- package/dist/exporters/jsonl.js +13 -0
- package/dist/exporters/jsonl.js.map +1 -0
- package/dist/exporters/markdown.d.ts +4 -0
- package/dist/exporters/markdown.d.ts.map +1 -0
- package/dist/exporters/markdown.js +29 -0
- package/dist/exporters/markdown.js.map +1 -0
- package/dist/exporters/stream.d.ts +13 -0
- package/dist/exporters/stream.d.ts.map +1 -0
- package/dist/exporters/stream.js +33 -0
- package/dist/exporters/stream.js.map +1 -0
- package/dist/filters.d.ts +3 -0
- package/dist/filters.d.ts.map +1 -0
- package/dist/filters.js +38 -0
- package/dist/filters.js.map +1 -0
- package/dist/fs-walk.d.ts +7 -0
- package/dist/fs-walk.d.ts.map +1 -0
- package/dist/fs-walk.js +64 -0
- package/dist/fs-walk.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/infer-tool.d.ts +8 -0
- package/dist/infer-tool.d.ts.map +1 -0
- package/dist/infer-tool.js +85 -0
- package/dist/infer-tool.js.map +1 -0
- package/dist/model-resolution.d.ts +13 -0
- package/dist/model-resolution.d.ts.map +1 -0
- package/dist/model-resolution.js +57 -0
- package/dist/model-resolution.js.map +1 -0
- package/dist/pipeline.d.ts +9 -0
- package/dist/pipeline.d.ts.map +1 -0
- package/dist/pipeline.js +152 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/pricing.d.ts +8 -0
- package/dist/pricing.d.ts.map +1 -0
- package/dist/pricing.js +139 -0
- package/dist/pricing.js.map +1 -0
- package/dist/query.d.ts +15 -0
- package/dist/query.d.ts.map +1 -0
- package/dist/query.js +63 -0
- package/dist/query.js.map +1 -0
- package/dist/redact.d.ts +9 -0
- package/dist/redact.d.ts.map +1 -0
- package/dist/redact.js +57 -0
- package/dist/redact.js.map +1 -0
- package/dist/sanitize.d.ts +15 -0
- package/dist/sanitize.d.ts.map +1 -0
- package/dist/sanitize.js +72 -0
- package/dist/sanitize.js.map +1 -0
- package/dist/schemas.d.ts +701 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +266 -0
- package/dist/schemas.js.map +1 -0
- package/dist/search.d.ts +11 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +87 -0
- package/dist/search.js.map +1 -0
- package/dist/session-builder.d.ts +23 -0
- package/dist/session-builder.d.ts.map +1 -0
- package/dist/session-builder.js +296 -0
- package/dist/session-builder.js.map +1 -0
- package/dist/stats.d.ts +22 -0
- package/dist/stats.d.ts.map +1 -0
- package/dist/stats.js +82 -0
- package/dist/stats.js.map +1 -0
- package/dist/types.d.ts +292 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/util.d.ts +26 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +70 -0
- package/dist/util.js.map +1 -0
- package/dist/warnings.d.ts +13 -0
- package/dist/warnings.d.ts.map +1 -0
- package/dist/warnings.js +38 -0
- package/dist/warnings.js.map +1 -0
- package/package.json +62 -0
- package/pricing/models.json +600 -0
- package/schemas/debug-envelope.json +494 -0
- package/schemas/doctor-envelope.json +234 -0
- package/schemas/json-export-envelope.json +79 -0
- package/schemas/jsonl-record.json +68 -0
- package/schemas/list-envelope.json +217 -0
- package/schemas/public-session.json +404 -0
- package/schemas/search-envelope.json +108 -0
- package/schemas/session.json +428 -0
- package/schemas/stats-envelope.json +203 -0
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { getEnabledAdapters } from "./adapters/index.js";
|
|
2
|
+
import { hasTextQuery, matchesQuery, parseQuery } from "./query.js";
|
|
3
|
+
export async function* discoverFiles(opts, adapters, onError) {
|
|
4
|
+
for (const adapter of adapters) {
|
|
5
|
+
try {
|
|
6
|
+
for await (const file of adapter.discover(opts)) {
|
|
7
|
+
yield file;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
catch (err) {
|
|
11
|
+
if (onError) {
|
|
12
|
+
onError(adapter.tool, err);
|
|
13
|
+
continue;
|
|
14
|
+
}
|
|
15
|
+
throw new DiscoveryError(adapter.tool, err);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export class DiscoveryError extends Error {
|
|
20
|
+
tool;
|
|
21
|
+
causeMessage;
|
|
22
|
+
constructor(tool, cause) {
|
|
23
|
+
const causeMessage = cause instanceof Error ? cause.message : String(cause);
|
|
24
|
+
super(`Failed to discover ${tool} logs: ${causeMessage}`);
|
|
25
|
+
this.name = "DiscoveryError";
|
|
26
|
+
this.tool = tool;
|
|
27
|
+
this.causeMessage = causeMessage;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export async function* discover(opts = {}, adapters) {
|
|
31
|
+
const warnings = [];
|
|
32
|
+
const enabled = adapters ?? (await getEnabledAdapters(opts.toolFilter, warnings, opts));
|
|
33
|
+
for await (const file of discoverFiles(opts, enabled)) {
|
|
34
|
+
yield { file, warnings: [...warnings] };
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export function parseDateFilter(value) {
|
|
38
|
+
if (!value)
|
|
39
|
+
return undefined;
|
|
40
|
+
const relative = value.match(/^(\d+)([dhm])$/);
|
|
41
|
+
if (relative) {
|
|
42
|
+
const amount = Number(relative[1]);
|
|
43
|
+
const unit = relative[2];
|
|
44
|
+
const ms = unit === "d" ? amount * 86400000 : unit === "h" ? amount * 3600000 : amount * 60000;
|
|
45
|
+
return new Date(Date.now() - ms);
|
|
46
|
+
}
|
|
47
|
+
const parsed = new Date(value);
|
|
48
|
+
return Number.isNaN(parsed.getTime()) ? undefined : parsed;
|
|
49
|
+
}
|
|
50
|
+
function looksLikeProjectPath(filter) {
|
|
51
|
+
return filter.includes("/") || filter.startsWith("~") || filter.startsWith(".");
|
|
52
|
+
}
|
|
53
|
+
export function matchesProject(sessionPath, filter) {
|
|
54
|
+
if (!filter)
|
|
55
|
+
return true;
|
|
56
|
+
if (!sessionPath)
|
|
57
|
+
return false;
|
|
58
|
+
const normalizedSession = sessionPath.replace(/\\/g, "/").replace(/\/$/, "");
|
|
59
|
+
const normalizedFilter = filter.replace(/\\/g, "/").replace(/\/$/, "");
|
|
60
|
+
if (looksLikeProjectPath(normalizedFilter)) {
|
|
61
|
+
return (normalizedSession === normalizedFilter || normalizedSession.startsWith(`${normalizedFilter}/`));
|
|
62
|
+
}
|
|
63
|
+
const needle = normalizedFilter.toLowerCase();
|
|
64
|
+
const segments = normalizedSession.split("/").filter(Boolean);
|
|
65
|
+
if (segments.some((segment) => segment.toLowerCase() === needle))
|
|
66
|
+
return true;
|
|
67
|
+
const basename = segments[segments.length - 1] ?? "";
|
|
68
|
+
return basename.toLowerCase() === needle;
|
|
69
|
+
}
|
|
70
|
+
export function matchesTool(tool, filter) {
|
|
71
|
+
if (!filter || filter.length === 0)
|
|
72
|
+
return true;
|
|
73
|
+
return filter.includes(tool);
|
|
74
|
+
}
|
|
75
|
+
export function matchesDateRange(startedAt, endedAt, since, until) {
|
|
76
|
+
const ts = endedAt ?? startedAt;
|
|
77
|
+
if (!ts)
|
|
78
|
+
return !since && !until;
|
|
79
|
+
const date = new Date(ts);
|
|
80
|
+
if (since && date < since)
|
|
81
|
+
return false;
|
|
82
|
+
if (until && date > until)
|
|
83
|
+
return false;
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
function sessionTranscriptHaystack(session) {
|
|
87
|
+
return session.turns
|
|
88
|
+
.filter((t) => t.role === "user" || t.role === "assistant")
|
|
89
|
+
.flatMap((t) => t.content)
|
|
90
|
+
.filter((b) => b.kind === "text")
|
|
91
|
+
.map((b) => (b.kind === "text" ? b.text : ""))
|
|
92
|
+
.join("\n");
|
|
93
|
+
}
|
|
94
|
+
export function matchesSessionFilters(session, parsed, projectFilter) {
|
|
95
|
+
if (projectFilter && !matchesProject(session.projectPath, projectFilter))
|
|
96
|
+
return false;
|
|
97
|
+
if (parsed.fields.project?.length) {
|
|
98
|
+
const matchesProjectField = parsed.fields.project.some((value) => matchesProject(session.projectPath, value));
|
|
99
|
+
if (!matchesProjectField)
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
export function matchesSessionTextQuery(session, parsed) {
|
|
105
|
+
if (!hasTextQuery(parsed))
|
|
106
|
+
return true;
|
|
107
|
+
return matchesQuery(sessionTranscriptHaystack(session), parsed);
|
|
108
|
+
}
|
|
109
|
+
export function matchesSessionQuery(session, query, projectFilter) {
|
|
110
|
+
const parsed = parseQuery(query ?? "");
|
|
111
|
+
if (!matchesSessionFilters(session, parsed, projectFilter))
|
|
112
|
+
return false;
|
|
113
|
+
return matchesSessionTextQuery(session, parsed);
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"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"}
|
package/dist/doctor.d.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { AdapterCapabilities, DiscoverOptions, ToolName } from "./types.js";
|
|
2
|
+
import { toPublicWarnings } from "./pipeline.js";
|
|
3
|
+
export interface DoctorToolReport {
|
|
4
|
+
tool: ToolName;
|
|
5
|
+
detected: boolean;
|
|
6
|
+
root: string;
|
|
7
|
+
rootAccessible: boolean;
|
|
8
|
+
candidateFiles: number;
|
|
9
|
+
candidateFilesCapped?: boolean;
|
|
10
|
+
adapterVersion: string;
|
|
11
|
+
capabilities: AdapterCapabilities;
|
|
12
|
+
permissionIssue?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface DoctorReport {
|
|
15
|
+
format: "logsesh.doctor.v1";
|
|
16
|
+
generatedAt: string;
|
|
17
|
+
tools: DoctorToolReport[];
|
|
18
|
+
pricing: {
|
|
19
|
+
version: string;
|
|
20
|
+
asOf: string;
|
|
21
|
+
sourceUrl: string;
|
|
22
|
+
modelCount: number;
|
|
23
|
+
};
|
|
24
|
+
exportDefaults: {
|
|
25
|
+
transcriptRedactDefault: true;
|
|
26
|
+
summaryCsvRedactRequired: false;
|
|
27
|
+
anonymizePathsDefault: true;
|
|
28
|
+
};
|
|
29
|
+
warnings: ReturnType<typeof toPublicWarnings>;
|
|
30
|
+
}
|
|
31
|
+
export declare function runDoctor(opts?: DiscoverOptions): Promise<DoctorReport>;
|
|
32
|
+
//# sourceMappingURL=doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,mBAAmB,EAAE,eAAe,EAAE,QAAQ,EAAW,MAAM,YAAY,CAAC;AAC1F,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAIjD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,mBAAmB,CAAC;IAClC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,mBAAmB,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,OAAO,EAAE;QACP,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,cAAc,EAAE;QACd,uBAAuB,EAAE,IAAI,CAAC;QAC9B,wBAAwB,EAAE,KAAK,CAAC;QAChC,qBAAqB,EAAE,IAAI,CAAC;KAC7B,CAAC;IACF,QAAQ,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;CAC/C;AAED,wBAAsB,SAAS,CAAC,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,YAAY,CAAC,CA8DjF"}
|
package/dist/doctor.js
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { getAdapterRoot, getAllAdapters } from "./adapters/index.js";
|
|
2
|
+
import { detectRootAccess } from "./fs-walk.js";
|
|
3
|
+
import { PRICING_AS_OF, PRICING_MODEL_COUNT, PRICING_SOURCE_URL, PRICING_VERSION, } from "./pricing.js";
|
|
4
|
+
import { generatedAt } from "./schemas.js";
|
|
5
|
+
import { toPublicWarnings } from "./pipeline.js";
|
|
6
|
+
const DOCTOR_CANDIDATE_SCAN_LIMIT = 1000;
|
|
7
|
+
export async function runDoctor(opts = {}) {
|
|
8
|
+
const warnings = [];
|
|
9
|
+
const tools = [];
|
|
10
|
+
for (const adapter of getAllAdapters()) {
|
|
11
|
+
const root = getAdapterRoot(adapter.tool, opts);
|
|
12
|
+
const { accessible, warning } = await detectRootAccess(root, adapter.tool);
|
|
13
|
+
if (warning)
|
|
14
|
+
warnings.push(warning);
|
|
15
|
+
let candidateFiles = 0;
|
|
16
|
+
let candidateFilesCapped = false;
|
|
17
|
+
if (accessible) {
|
|
18
|
+
try {
|
|
19
|
+
for await (const _file of adapter.discover({ ...opts, toolFilter: [adapter.tool] })) {
|
|
20
|
+
candidateFiles++;
|
|
21
|
+
if (candidateFiles >= DOCTOR_CANDIDATE_SCAN_LIMIT) {
|
|
22
|
+
candidateFilesCapped = true;
|
|
23
|
+
break;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
warnings.push({
|
|
29
|
+
code: "discovery_error",
|
|
30
|
+
message: `Failed to discover ${adapter.tool} logs: ${err instanceof Error ? err.message : String(err)}`,
|
|
31
|
+
severity: "warn",
|
|
32
|
+
scope: "discovery",
|
|
33
|
+
sourcePath: root,
|
|
34
|
+
cause: err instanceof Error ? err.name : undefined,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
tools.push({
|
|
39
|
+
tool: adapter.tool,
|
|
40
|
+
detected: accessible && candidateFiles > 0,
|
|
41
|
+
root,
|
|
42
|
+
rootAccessible: accessible,
|
|
43
|
+
candidateFiles,
|
|
44
|
+
candidateFilesCapped: candidateFilesCapped || undefined,
|
|
45
|
+
adapterVersion: adapter.adapterVersion,
|
|
46
|
+
capabilities: adapter.capabilities,
|
|
47
|
+
permissionIssue: warning?.cause,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
format: "logsesh.doctor.v1",
|
|
52
|
+
generatedAt: generatedAt(),
|
|
53
|
+
tools,
|
|
54
|
+
pricing: {
|
|
55
|
+
version: PRICING_VERSION,
|
|
56
|
+
asOf: PRICING_AS_OF,
|
|
57
|
+
sourceUrl: PRICING_SOURCE_URL,
|
|
58
|
+
modelCount: PRICING_MODEL_COUNT,
|
|
59
|
+
},
|
|
60
|
+
exportDefaults: {
|
|
61
|
+
transcriptRedactDefault: true,
|
|
62
|
+
summaryCsvRedactRequired: false,
|
|
63
|
+
anonymizePathsDefault: true,
|
|
64
|
+
},
|
|
65
|
+
warnings: toPublicWarnings(warnings),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function escapeCsvCell(value: string): string;
|
|
2
|
+
export declare function neutralizeMarkdown(text: string, unsafeRaw?: boolean): string;
|
|
3
|
+
export declare function writeExportFile(path: string, content: string, opts?: {
|
|
4
|
+
force?: boolean;
|
|
5
|
+
}): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=export-safety.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export-safety.d.ts","sourceRoot":"","sources":["../src/export-safety.ts"],"names":[],"mappings":"AAAA,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CASnD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,UAAQ,GAAG,MAAM,CAM1E;AAED,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAC7B,OAAO,CAAC,IAAI,CAAC,CAef"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export function escapeCsvCell(value) {
|
|
2
|
+
let cell = value;
|
|
3
|
+
if (/^[=+\-@\t\r]/.test(cell)) {
|
|
4
|
+
cell = `'${cell}`;
|
|
5
|
+
}
|
|
6
|
+
if (/[",\n\r]/.test(cell)) {
|
|
7
|
+
return `"${cell.replace(/"/g, '""')}"`;
|
|
8
|
+
}
|
|
9
|
+
return cell;
|
|
10
|
+
}
|
|
11
|
+
export function neutralizeMarkdown(text, unsafeRaw = false) {
|
|
12
|
+
if (unsafeRaw)
|
|
13
|
+
return text;
|
|
14
|
+
let result = text.replace(/</g, "<").replace(/>/g, ">");
|
|
15
|
+
result = result.replace(/\[([^\]]+)\]\(\s*javascript:[^)]+\)/gi, "[$1](#)");
|
|
16
|
+
result = result.replace(/\[([^\]]+)\]\(\s*data:[^)]+\)/gi, "[$1](#)");
|
|
17
|
+
return result;
|
|
18
|
+
}
|
|
19
|
+
export async function writeExportFile(path, content, opts = {}) {
|
|
20
|
+
const { writeFile } = await import("node:fs/promises");
|
|
21
|
+
try {
|
|
22
|
+
await writeFile(path, content, {
|
|
23
|
+
mode: 0o600,
|
|
24
|
+
encoding: "utf8",
|
|
25
|
+
flag: opts.force ? "w" : "wx",
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
const code = err instanceof Error && "code" in err ? String(err.code) : "";
|
|
30
|
+
if (!opts.force && code === "EEXIST") {
|
|
31
|
+
throw new Error(`Refusing to overwrite existing file: ${path}. Use --force to overwrite.`);
|
|
32
|
+
}
|
|
33
|
+
throw err;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=export-safety.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export-safety.js","sourceRoot":"","sources":["../src/export-safety.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;IACpB,CAAC;IACD,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;IACzC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,SAAS,GAAG,KAAK;IAChE,IAAI,SAAS;QAAE,OAAO,IAAI,CAAC;IAC3B,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC9D,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,uCAAuC,EAAE,SAAS,CAAC,CAAC;IAC5E,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,iCAAiC,EAAE,SAAS,CAAC,CAAC;IACtE,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAY,EACZ,OAAe,EACf,IAAI,GAAwB,EAAE;IAE9B,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IACvD,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE;YAC7B,IAAI,EAAE,KAAK;YACX,QAAQ,EAAE,MAAM;YAChB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI;SAC9B,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,GAAG,GAAG,YAAY,KAAK,IAAI,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,wCAAwC,IAAI,6BAA6B,CAAC,CAAC;QAC7F,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"csv.d.ts","sourceRoot":"","sources":["../../src/exporters/csv.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGjE,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,MAAM,CAmBnE;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,MAAM,CAiBnE"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { escapeCsvCell } from "../export-safety.js";
|
|
2
|
+
export function exportSummaryCsv(sessions) {
|
|
3
|
+
const header = ["date", "tool", "project", "turns", "tokens", "cost"].join(",");
|
|
4
|
+
const rows = sessions.map((s) => {
|
|
5
|
+
const cost = typeof s.estimate?.costUsd === "number"
|
|
6
|
+
? `~$${s.estimate.costUsd.toFixed(2)} est`
|
|
7
|
+
: s.costUsd === null
|
|
8
|
+
? "unknown"
|
|
9
|
+
: String(s.costUsd);
|
|
10
|
+
return [
|
|
11
|
+
escapeCsvCell(s.startedAt ?? ""),
|
|
12
|
+
escapeCsvCell(s.tool),
|
|
13
|
+
escapeCsvCell(s.projectPath ?? ""),
|
|
14
|
+
escapeCsvCell(String(s.turnCount)),
|
|
15
|
+
escapeCsvCell(String(s.totalTokens ?? "")),
|
|
16
|
+
escapeCsvCell(cost),
|
|
17
|
+
].join(",");
|
|
18
|
+
});
|
|
19
|
+
return [header, ...rows].join("\n") + "\n";
|
|
20
|
+
}
|
|
21
|
+
export function exportSessionsCsv(sessions) {
|
|
22
|
+
const header = ["session_id", "tool", "project", "turns", "tokens", "cost"].join(",");
|
|
23
|
+
const rows = sessions.map((s) => {
|
|
24
|
+
const tokens = s.usage?.totalTokens ??
|
|
25
|
+
(s.usage ? (s.usage.inputTokens ?? 0) + (s.usage.outputTokens ?? 0) : undefined);
|
|
26
|
+
const cost = s.costUsd === null ? "unknown" : String(s.costUsd);
|
|
27
|
+
return [
|
|
28
|
+
escapeCsvCell(s.id),
|
|
29
|
+
escapeCsvCell(s.tool),
|
|
30
|
+
escapeCsvCell(s.projectPath ?? ""),
|
|
31
|
+
escapeCsvCell(String(s.turns.length)),
|
|
32
|
+
escapeCsvCell(tokens !== undefined ? String(tokens) : ""),
|
|
33
|
+
escapeCsvCell(cost),
|
|
34
|
+
].join(",");
|
|
35
|
+
});
|
|
36
|
+
return [header, ...rows].join("\n") + "\n";
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=csv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"csv.js","sourceRoot":"","sources":["../../src/exporters/csv.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,UAAU,gBAAgB,CAAC,QAA0B;IACzD,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChF,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC9B,MAAM,IAAI,GACR,OAAO,CAAC,CAAC,QAAQ,EAAE,OAAO,KAAK,QAAQ;YACrC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;YAC1C,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,IAAI;gBAClB,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC1B,OAAO;YACL,aAAa,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC;YAChC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC;YACrB,aAAa,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC;YAClC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAClC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;YAC1C,aAAa,CAAC,IAAI,CAAC;SACpB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACd,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,QAAyB;IACzD,MAAM,MAAM,GAAG,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtF,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC9B,MAAM,MAAM,GACV,CAAC,CAAC,KAAK,EAAE,WAAW;YACpB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACnF,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAChE,OAAO;YACL,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;YACnB,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC;YACrB,aAAa,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC;YAClC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACrC,aAAa,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,aAAa,CAAC,IAAI,CAAC;SACpB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACd,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ExportSession, ExportTurn, JsonExportEnvelope, PublicWarning } from "../types.js";
|
|
2
|
+
export declare function exportJsonEnvelope(records: Array<ExportSession | ExportTurn>, granularity: "session" | "turn", warnings?: PublicWarning[]): JsonExportEnvelope<ExportSession | ExportTurn>;
|
|
3
|
+
export declare function serializeJsonEnvelope(envelope: JsonExportEnvelope<ExportSession | ExportTurn>): string;
|
|
4
|
+
//# sourceMappingURL=json.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/exporters/json.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGhG,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,KAAK,CAAC,aAAa,GAAG,UAAU,CAAC,EAC1C,WAAW,EAAE,SAAS,GAAG,MAAM,EAC/B,QAAQ,CAAC,EAAE,aAAa,EAAE,GACzB,kBAAkB,CAAC,aAAa,GAAG,UAAU,CAAC,CAQhD;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,kBAAkB,CAAC,aAAa,GAAG,UAAU,CAAC,GACvD,MAAM,CAER"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { generatedAt } from "../schemas.js";
|
|
2
|
+
export function exportJsonEnvelope(records, granularity, warnings) {
|
|
3
|
+
return {
|
|
4
|
+
format: "logsesh.export.v1",
|
|
5
|
+
generatedAt: generatedAt(),
|
|
6
|
+
granularity,
|
|
7
|
+
records,
|
|
8
|
+
warnings,
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export function serializeJsonEnvelope(envelope) {
|
|
12
|
+
return JSON.stringify(envelope, null, 2);
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/exporters/json.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,UAAU,kBAAkB,CAChC,OAA0C,EAC1C,WAA+B,EAC/B,QAA0B;IAE1B,OAAO;QACL,MAAM,EAAE,mBAAmB;QAC3B,WAAW,EAAE,WAAW,EAAE;QAC1B,WAAW;QACX,OAAO;QACP,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,QAAwD;IAExD,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ExportSession, ExportTurn, JsonlRecord, PublicWarning } from "../types.js";
|
|
2
|
+
export declare function exportJsonlRecord(record: ExportSession | ExportTurn, warnings?: PublicWarning[]): JsonlRecord<ExportSession | ExportTurn>;
|
|
3
|
+
export declare function serializeJsonlRecord(record: JsonlRecord<ExportSession | ExportTurn>): string;
|
|
4
|
+
//# sourceMappingURL=jsonl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonl.d.ts","sourceRoot":"","sources":["../../src/exporters/jsonl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGzF,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,aAAa,GAAG,UAAU,EAClC,QAAQ,CAAC,EAAE,aAAa,EAAE,GACzB,WAAW,CAAC,aAAa,GAAG,UAAU,CAAC,CAOzC;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,CAAC,aAAa,GAAG,UAAU,CAAC,GAAG,MAAM,CAE5F"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { generatedAt } from "../schemas.js";
|
|
2
|
+
export function exportJsonlRecord(record, warnings) {
|
|
3
|
+
return {
|
|
4
|
+
format: "logsesh.jsonl.v1",
|
|
5
|
+
generatedAt: generatedAt(),
|
|
6
|
+
record,
|
|
7
|
+
warnings,
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
export function serializeJsonlRecord(record) {
|
|
11
|
+
return JSON.stringify(record);
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=jsonl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonl.js","sourceRoot":"","sources":["../../src/exporters/jsonl.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,UAAU,iBAAiB,CAC/B,MAAkC,EAClC,QAA0B;IAE1B,OAAO;QACL,MAAM,EAAE,kBAAkB;QAC1B,WAAW,EAAE,WAAW,EAAE;QAC1B,MAAM;QACN,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAA+C;IAClF,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ExportSession, ExportTurn } from "../types.js";
|
|
2
|
+
export declare function exportSessionMarkdown(session: ExportSession, unsafeRaw?: boolean): string;
|
|
3
|
+
export declare function exportTurnMarkdown(turn: ExportTurn, session: ExportSession, unsafeRaw?: boolean): string;
|
|
4
|
+
//# sourceMappingURL=markdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/exporters/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAoB7D,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,aAAa,EAAE,SAAS,UAAQ,GAAG,MAAM,CAIvF;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,aAAa,EACtB,SAAS,UAAQ,GAChB,MAAM,CAER"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { neutralizeMarkdown } from "../export-safety.js";
|
|
2
|
+
function turnMarkdown(turn, unsafeRaw) {
|
|
3
|
+
const role = turn.role.toUpperCase();
|
|
4
|
+
const lines = turn.content.map((block) => {
|
|
5
|
+
if (block.kind === "text")
|
|
6
|
+
return neutralizeMarkdown(block.text, unsafeRaw);
|
|
7
|
+
if (block.kind === "thinking")
|
|
8
|
+
return neutralizeMarkdown(`[thinking] ${block.text}`, unsafeRaw);
|
|
9
|
+
if (block.kind === "image")
|
|
10
|
+
return `[image: ${block.note ?? "omitted"}]`;
|
|
11
|
+
if (block.kind === "tool_use")
|
|
12
|
+
return `[tool ${block.name}]`;
|
|
13
|
+
if (block.kind === "tool_result") {
|
|
14
|
+
const out = typeof block.output === "string" ? block.output : JSON.stringify(block.output ?? "");
|
|
15
|
+
return neutralizeMarkdown(`[tool result ${block.status ?? "success"}] ${out}`, unsafeRaw);
|
|
16
|
+
}
|
|
17
|
+
return "";
|
|
18
|
+
});
|
|
19
|
+
return `### ${role}\n\n${lines.join("\n\n")}\n`;
|
|
20
|
+
}
|
|
21
|
+
export function exportSessionMarkdown(session, unsafeRaw = false) {
|
|
22
|
+
const header = `# Session ${session.id}\n\n- Tool: ${session.tool}\n- Project: ${session.projectPath ?? "unknown"}\n\n`;
|
|
23
|
+
const body = session.turns.map((t) => turnMarkdown(t, unsafeRaw)).join("\n");
|
|
24
|
+
return header + body;
|
|
25
|
+
}
|
|
26
|
+
export function exportTurnMarkdown(turn, session, unsafeRaw = false) {
|
|
27
|
+
return `# ${session.id} / turn ${turn.index}\n\n${turnMarkdown(turn, unsafeRaw)}`;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/exporters/markdown.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,SAAS,YAAY,CAAC,IAAgB,EAAE,SAAkB;IACxD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACvC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,kBAAkB,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC5E,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU;YAAE,OAAO,kBAAkB,CAAC,cAAc,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC;QAChG,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;YAAE,OAAO,WAAW,KAAK,CAAC,IAAI,IAAI,SAAS,GAAG,CAAC;QACzE,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU;YAAE,OAAO,SAAS,KAAK,CAAC,IAAI,GAAG,CAAC;QAC7D,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACjC,MAAM,GAAG,GACP,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;YACvF,OAAO,kBAAkB,CAAC,gBAAgB,KAAK,CAAC,MAAM,IAAI,SAAS,KAAK,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC;QAC5F,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IACH,OAAO,OAAO,IAAI,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAsB,EAAE,SAAS,GAAG,KAAK;IAC7E,MAAM,MAAM,GAAG,aAAa,OAAO,CAAC,EAAE,eAAe,OAAO,CAAC,IAAI,gBAAgB,OAAO,CAAC,WAAW,IAAI,SAAS,MAAM,CAAC;IACxH,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7E,OAAO,MAAM,GAAG,IAAI,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,IAAgB,EAChB,OAAsB,EACtB,SAAS,GAAG,KAAK;IAEjB,OAAO,KAAK,OAAO,CAAC,EAAE,WAAW,IAAI,CAAC,KAAK,OAAO,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC;AACpF,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Writable } from "node:stream";
|
|
2
|
+
import type { ExportSession, ExportTurn, PublicWarning } from "../types.js";
|
|
3
|
+
export interface JsonExportStreamOptions {
|
|
4
|
+
granularity: "session" | "turn";
|
|
5
|
+
getWarnings?: () => PublicWarning[];
|
|
6
|
+
pretty?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function beginJsonExportStream(out: Writable, opts: JsonExportStreamOptions): {
|
|
9
|
+
writeRecord: (record: ExportSession | ExportTurn) => void;
|
|
10
|
+
end: () => void;
|
|
11
|
+
};
|
|
12
|
+
export declare function writeJsonExportStream(out: Writable, records: AsyncIterable<ExportSession | ExportTurn>, opts: JsonExportStreamOptions): Promise<void>;
|
|
13
|
+
//# sourceMappingURL=stream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/exporters/stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5E,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,SAAS,GAAG,MAAM,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,aAAa,EAAE,CAAC;IACpC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,uBAAuB,GAC5B;IAAE,WAAW,EAAE,CAAC,MAAM,EAAE,aAAa,GAAG,UAAU,KAAK,IAAI,CAAC;IAAC,GAAG,EAAE,MAAM,IAAI,CAAA;CAAE,CAuBhF;AAED,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,QAAQ,EACb,OAAO,EAAE,aAAa,CAAC,aAAa,GAAG,UAAU,CAAC,EAClD,IAAI,EAAE,uBAAuB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAMf"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { generatedAt } from "../schemas.js";
|
|
2
|
+
export function beginJsonExportStream(out, opts) {
|
|
3
|
+
const pretty = opts.pretty ?? false;
|
|
4
|
+
const spacer = pretty ? 2 : undefined;
|
|
5
|
+
const header = {
|
|
6
|
+
format: "logsesh.export.v1",
|
|
7
|
+
generatedAt: generatedAt(),
|
|
8
|
+
granularity: opts.granularity,
|
|
9
|
+
};
|
|
10
|
+
out.write(JSON.stringify(header, null, spacer).replace(/\}\s*$/, "") + ',"records":[');
|
|
11
|
+
let first = true;
|
|
12
|
+
return {
|
|
13
|
+
writeRecord(record) {
|
|
14
|
+
if (!first)
|
|
15
|
+
out.write(",");
|
|
16
|
+
out.write(JSON.stringify(record, null, spacer));
|
|
17
|
+
first = false;
|
|
18
|
+
},
|
|
19
|
+
end() {
|
|
20
|
+
const warnings = opts.getWarnings?.() ?? [];
|
|
21
|
+
const footer = `],"warnings":${JSON.stringify(warnings, null, spacer)}}\n`;
|
|
22
|
+
out.write(footer);
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export async function writeJsonExportStream(out, records, opts) {
|
|
27
|
+
const stream = beginJsonExportStream(out, opts);
|
|
28
|
+
for await (const record of records) {
|
|
29
|
+
stream.writeRecord(record);
|
|
30
|
+
}
|
|
31
|
+
stream.end();
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/exporters/stream.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAQ5C,MAAM,UAAU,qBAAqB,CACnC,GAAa,EACb,IAA6B;IAE7B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;IACpC,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACtC,MAAM,MAAM,GAAG;QACb,MAAM,EAAE,mBAA4B;QACpC,WAAW,EAAE,WAAW,EAAE;QAC1B,WAAW,EAAE,IAAI,CAAC,WAAW;KAC9B,CAAC;IACF,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC;IACvF,IAAI,KAAK,GAAG,IAAI,CAAC;IAEjB,OAAO;QACL,WAAW,CAAC,MAAM;YAChB,IAAI,CAAC,KAAK;gBAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC3B,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;YAChD,KAAK,GAAG,KAAK,CAAC;QAChB,CAAC;QACD,GAAG;YACD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,CAAC;YAC5C,MAAM,MAAM,GAAG,gBAAgB,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC;YAC3E,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACpB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,GAAa,EACb,OAAkD,EAClD,IAA6B;IAE7B,MAAM,MAAM,GAAG,qBAAqB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAChD,IAAI,KAAK,EAAE,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QACnC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IACD,MAAM,CAAC,GAAG,EAAE,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../src/filters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG3E,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,cAAc,CAwBzF"}
|
package/dist/filters.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { anonymizePath } from "./util.js";
|
|
2
|
+
export function sessionToSummary(session, opts) {
|
|
3
|
+
const rawPaths = opts?.rawPaths ?? false;
|
|
4
|
+
const home = process.env.HOME ?? "";
|
|
5
|
+
const projectPath = session.projectPath
|
|
6
|
+
? rawPaths
|
|
7
|
+
? session.projectPath
|
|
8
|
+
: anonymizePath(session.projectPath, home)
|
|
9
|
+
: session.projectPath;
|
|
10
|
+
const sourcePath = rawPaths
|
|
11
|
+
? session.source.sourcePath
|
|
12
|
+
: anonymizePath(session.source.sourcePath, home);
|
|
13
|
+
return {
|
|
14
|
+
id: session.id,
|
|
15
|
+
tool: session.tool,
|
|
16
|
+
startedAt: session.startedAt,
|
|
17
|
+
endedAt: session.endedAt,
|
|
18
|
+
projectPath,
|
|
19
|
+
turnCount: session.turns.length,
|
|
20
|
+
totalTokens: session.usage?.totalTokens ?? sumUsage(session.usage),
|
|
21
|
+
costUsd: session.costUsd,
|
|
22
|
+
estimate: session.estimate,
|
|
23
|
+
sourcePath,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function sumUsage(usage) {
|
|
27
|
+
if (!usage)
|
|
28
|
+
return undefined;
|
|
29
|
+
if (usage.totalTokens !== undefined)
|
|
30
|
+
return usage.totalTokens;
|
|
31
|
+
const sum = (usage.inputTokens ?? 0) +
|
|
32
|
+
(usage.outputTokens ?? 0) +
|
|
33
|
+
(usage.cacheReadTokens ?? 0) +
|
|
34
|
+
(usage.cacheWriteTokens ?? 0) +
|
|
35
|
+
(usage.reasoningTokens ?? 0);
|
|
36
|
+
return sum > 0 ? sum : undefined;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=filters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filters.js","sourceRoot":"","sources":["../src/filters.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,UAAU,gBAAgB,CAAC,OAAgB,EAAE,IAAsB;IACvE,MAAM,QAAQ,GAAG,IAAI,EAAE,QAAQ,IAAI,KAAK,CAAC;IACzC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;IACpC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW;QACrC,CAAC,CAAC,QAAQ;YACR,CAAC,CAAC,OAAO,CAAC,WAAW;YACrB,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC;QAC5C,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;IACxB,MAAM,UAAU,GAAG,QAAQ;QACzB,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU;QAC3B,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAEnD,OAAO;QACL,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,WAAW;QACX,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM;QAC/B,WAAW,EAAE,OAAO,CAAC,KAAK,EAAE,WAAW,IAAI,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC;QAClE,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,UAAU;KACX,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,KAAuB;IACvC,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC,WAAW,CAAC;IAC9D,MAAM,GAAG,GACP,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC;QACxB,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC;QACzB,CAAC,KAAK,CAAC,eAAe,IAAI,CAAC,CAAC;QAC5B,CAAC,KAAK,CAAC,gBAAgB,IAAI,CAAC,CAAC;QAC7B,CAAC,KAAK,CAAC,eAAe,IAAI,CAAC,CAAC,CAAC;IAC/B,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ToolName, Warning } from "./types.js";
|
|
2
|
+
export declare function walkFiles(dir: string, match: (path: string, name: string, isDirectory: boolean) => boolean, visited?: Set<string>): AsyncGenerator<string>;
|
|
3
|
+
export declare function detectRootAccess(root: string, tool: ToolName): Promise<{
|
|
4
|
+
accessible: boolean;
|
|
5
|
+
warning?: Warning;
|
|
6
|
+
}>;
|
|
7
|
+
//# sourceMappingURL=fs-walk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs-walk.d.ts","sourceRoot":"","sources":["../src/fs-walk.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAEpD,wBAAuB,SAAS,CAC9B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,KAAK,OAAO,EACpE,OAAO,GAAE,GAAG,CAAC,MAAM,CAAa,GAC/B,cAAc,CAAC,MAAM,CAAC,CAiCxB;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,QAAQ,GACb,OAAO,CAAC;IAAE,UAAU,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAuBrD"}
|